Démarrage rapide : Détection de fondement (préversion)
Suivez ce guide pour utiliser la détection de fondement d’Azure AI Sécurité du Contenu afin de vérifier si les réponses textuelles des grands modèles de langage (LLM) sont fondées sur les documents sources fournis par les utilisateurs.
Prérequis
- Un abonnement Azure - En créer un gratuitement
- Une fois que vous avez votre abonnement Azure, créez une ressource Content Safety dans le portail Azure pour obtenir votre clé et votre point de terminaison. Entrez un nom unique pour votre ressource, sélectionnez votre abonnement, puis un groupe de ressources, une région prise en charge (USA Est 2, USA Ouest ou Suède Centre) et un niveau tarifaire pris en charge. Sélectionnez ensuite Créer.
- Le déploiement de la ressource prend quelques minutes. Une fois terminé, accédez à la nouvelle ressource. Dans le volet de gauche, sous Gestion des ressources, sélectionnez Clés d’API et points de terminaison. Copiez une des valeurs de clé et le point de terminaison de l’abonnement dans un emplacement temporaire pour les utiliser par la suite.
- (Facultatif) Si vous voulez utiliser la fonctionnalité de raisonnement, créez une ressource Azure OpenAI Service avec un modèle GPT déployé.
- cURL ou Python installé.
Vérifier le fondement sans raisonnement
Dans un cas simple sans la fonctionnalité de raisonnement, l’API de détection de fondement classifie l’absence de fondement du contenu envoyé comme true
ou false
.
Cette section décrit en détail un exemple de demande avec cURL. Collez la commande ci-dessous dans un éditeur de texte et effectuez les modifications suivantes :
Remplacez
<endpoint>
par l’URL de point de terminaison associée à votre ressource.Remplacez
<your_subscription_key>
par l’une des clés de votre ressource.Si vous le souhaitez, remplacez les champs
"query"
ou"text"
dans le corps par votre propre texte à analyser.curl --location --request POST '<endpoint>/contentsafety/text:detectGroundedness?api-version=2024-02-15-preview' \ --header 'Ocp-Apim-Subscription-Key: <your_subscription_key>' \ --header 'Content-Type: application/json' \ --data-raw '{ "domain": "Generic", "task": "QnA", "qna": { "query": "How much does she currently get paid per hour at the bank?" }, "text": "12/hour", "groundingSources": [ "I'm 21 years old and I need to make a decision about the next two years of my life. Within a week. I currently work for a bank that requires strict sales goals to meet. IF they aren't met three times (three months) you're canned. They pay me 10/hour and it's not unheard of to get a raise in 6ish months. The issue is, **I'm not a salesperson**. That's not my personality. I'm amazing at customer service, I have the most positive customer service \"reports\" done about me in the short time I've worked here. A coworker asked \"do you ask for people to fill these out? you have a ton\". That being said, I have a job opportunity at Chase Bank as a part time teller. What makes this decision so hard is that at my current job, I get 40 hours and Chase could only offer me 20 hours/week. Drive time to my current job is also 21 miles **one way** while Chase is literally 1.8 miles from my house, allowing me to go home for lunch. I do have an apartment and an awesome roommate that I know wont be late on his portion of rent, so paying bills with 20hours a week isn't the issue. It's the spending money and being broke all the time.\n\nI previously worked at Wal-Mart and took home just about 400 dollars every other week. So I know i can survive on this income. I just don't know whether I should go for Chase as I could definitely see myself having a career there. I'm a math major likely going to become an actuary, so Chase could provide excellent opportunities for me **eventually**." ], "reasoning": false }'
Ouvrez une invite de commandes et exécutez la commande cURL.
Pour tester une tâche de résumé au lieu d’une tâche de réponse aux questions (QnA), utilisez l’exemple de corps JSON suivant :
{
"domain": "Medical",
"task": "Summarization",
"text": "Ms Johnson has been in the hospital after experiencing a stroke.",
"groundingSources": ["Our patient, Ms. Johnson, presented with persistent fatigue, unexplained weight loss, and frequent night sweats. After a series of tests, she was diagnosed with Hodgkin’s lymphoma, a type of cancer that affects the lymphatic system. The diagnosis was confirmed through a lymph node biopsy revealing the presence of Reed-Sternberg cells, a characteristic of this disease. She was further staged using PET-CT scans. Her treatment plan includes chemotherapy and possibly radiation therapy, depending on her response to treatment. The medical team remains optimistic about her prognosis given the high cure rate of Hodgkin’s lymphoma."],
"reasoning": false
}
Les champs ci-dessous doivent être inclus dans l’URL :
Nom | Obligatoire | Description | Type |
---|---|---|---|
API Version | Requis | Il s’agit de la version d’API à utiliser. La version actuelle est : api-version=2024-02-15-preview. Exemple : <endpoint>/contentsafety/text:detectGroundedness?api-version=2024-02-15-preview |
String |
Les paramètres dans le corps de la requête sont définis dans ce tableau :
Nom | Description | Type |
---|---|---|
domain | (Facultatif) MEDICAL ou GENERIC . Valeur par défaut : GENERIC . |
Enum |
tâche | (Facultatif) Type de tâche : QnA , Summarization . Valeur par défaut : Summarization . |
Enum |
qna | (Facultatif) Contient les données QnA quand le type de tâche est QnA . |
Chaîne |
- query |
(Facultatif) Représente la question dans une tâche QnA. Limite de caractères : 7 500. | Chaîne |
texte | (Obligatoire) Texte de sortie du LLM à vérifier. Limite de caractères : 7 500. | Chaîne |
groundingSources | (Obligatoire) Utilise un tableau de sources de fondement pour valider le texte généré par l’IA. Jusqu’à 55 000 caractères de sources de fondement peuvent être analysés dans une seule demande. | Tableau de chaîne |
raisonnement | (Facultatif) Spécifie s’il faut utiliser la fonctionnalité de raisonnement. La valeur par défaut est false . Si true , vous devez apporter vos propres ressources Azure OpenAI GPT-4 Turbo pour fournir une explication. Attention : l’utilisation du raisonnement augmente le temps de traitement. |
Boolean |
Interpréter la réponse de l’API
Après avoir envoyé votre demande, vous recevez une réponse JSON reflétant l’analyse de fondement effectuée. La sortie type ressemble à :
{
"ungroundedDetected": true,
"ungroundedPercentage": 1,
"ungroundedDetails": [
{
"text": "12/hour."
}
]
}
Les objets JSON dans la sortie sont définis ici :
Nom | Description | Type |
---|---|---|
ungroundedDetected | Indique si le texte n’est pas fondé. | Boolean |
ungroundedPercentage | Spécifie la proportion du texte identifié comme non fondé, exprimé par un nombre compris entre 0 et 1, où 0 indique qu’il n’y a pas de contenu non fondé et 1 indique un contenu pas du tout fondé. | Float |
ungroundedDetails | Fournit des insights sur le contenu non fondé avec des exemples et des pourcentages spécifiques. | Tableau |
-text |
Texte spécifique qui n’est pas fondé. | Chaîne |
Vérifier le fondement avec le raisonnement
L’API de détection de fondement offre la possibilité d’inclure le raisonnement dans la réponse de l’API. Quand le raisonnement est activé, la réponse inclut un champ "reasoning"
qui détaille des instances et des explications spécifiques pour le texte non fondé détecté. Attention : l’utilisation du raisonnement augmente le temps de traitement et entraîne des frais supplémentaires.
Apportez votre propre déploiement GPT
Conseil
Pour le moment, nous prenons uniquement en charge les ressources Azure OpenAI GPT-4 Turbo et ne prenons pas en charge d’autres types de GPT. Vos ressources GPT-4 Turbo peuvent être déployées dans n’importe quelle région. Toutefois, nous vous recommandons de les localiser dans la même région que les ressources de sécurité du contenu afin de réduire la latence potentielle.
Pour utiliser votre ressource Azure OpenAI GPT-4 Turbo afin d’activer la fonctionnalité de raisonnement, utilisez une identité managée pour autoriser votre ressource Sécurité du Contenu à accéder à la ressource Azure OpenAI :
Activez une identité managée pour Azure AI Sécurité du Contenu.
Accédez à votre instance Azure AI Sécurité du Contenu dans le portail Azure. Recherchez la section Identité sous la catégorie Paramètres. Activez l’identité managée affectée par le système. Cette action accorde à votre instance Azure AI Sécurité du Contenu une identité qui peut être reconnue et utilisée dans Azure pour accéder à d’autres ressources.
Attribuez un rôle à l’identité managée.
Accédez à votre instance Azure OpenAI, sélectionnez Ajouter une attribution de rôle pour démarrer le processus d’attribution d’un rôle Azure OpenAI à l’identité Azure AI Sécurité du Contenu.
Choisissez le rôle Utilisateur ou Contributeur.
Effectuer la demande d’API
Dans votre demande à l’API de détection de fondement, définissez le paramètre de corps "reasoning"
sur true
et fournissez les autres paramètres nécessaires :
{
"reasoning": true,
"llmResource": {
"resourceType": "AzureOpenAI",
"azureOpenAIEndpoint": "<your_OpenAI_endpoint>",
"azureOpenAIDeploymentName": "<your_deployment_name>"
}
}
Cette section décrit en détail un exemple de demande avec cURL. Collez la commande ci-dessous dans un éditeur de texte et effectuez les modifications suivantes :
Remplacez
<endpoint>
par l’URL de point de terminaison associée à votre ressource.Remplacez
<your_subscription_key>
par l’une des clés de votre ressource.Si vous le souhaitez, remplacez les champs
"query"
ou"text"
dans le corps par votre propre texte à analyser.curl --location --request POST '<endpoint>/contentsafety/text:detectGroundedness?api-version=2024-02-15-preview' \ --header 'Ocp-Apim-Subscription-Key: <your_subscription_key>' \ --header 'Content-Type: application/json' \ --data-raw '{ "domain": "Generic", "task": "QnA", "qna": { "query": "How much does she currently get paid per hour at the bank?" }, "text": "12/hour", "groundingSources": [ "I'm 21 years old and I need to make a decision about the next two years of my life. Within a week. I currently work for a bank that requires strict sales goals to meet. IF they aren't met three times (three months) you're canned. They pay me 10/hour and it's not unheard of to get a raise in 6ish months. The issue is, **I'm not a salesperson**. That's not my personality. I'm amazing at customer service, I have the most positive customer service \"reports\" done about me in the short time I've worked here. A coworker asked \"do you ask for people to fill these out? you have a ton\". That being said, I have a job opportunity at Chase Bank as a part time teller. What makes this decision so hard is that at my current job, I get 40 hours and Chase could only offer me 20 hours/week. Drive time to my current job is also 21 miles **one way** while Chase is literally 1.8 miles from my house, allowing me to go home for lunch. I do have an apartment and an awesome roommate that I know wont be late on his portion of rent, so paying bills with 20hours a week isn't the issue. It's the spending money and being broke all the time.\n\nI previously worked at Wal-Mart and took home just about 400 dollars every other week. So I know i can survive on this income. I just don't know whether I should go for Chase as I could definitely see myself having a career there. I'm a math major likely going to become an actuary, so Chase could provide excellent opportunities for me **eventually**." ], "reasoning": true, "llmResource": { "resourceType": "AzureOpenAI", "azureOpenAIEndpoint": "<your_OpenAI_endpoint>", "azureOpenAIDeploymentName": "<your_deployment_name>" }'
Ouvrez une invite de commandes et exécutez la commande cURL.
Les paramètres dans le corps de la requête sont définis dans ce tableau :
Nom | Description | Type |
---|---|---|
domain | (Facultatif) MEDICAL ou GENERIC . Valeur par défaut : GENERIC . |
Enum |
tâche | (Facultatif) Type de tâche : QnA , Summarization . Valeur par défaut : Summarization . |
Enum |
qna | (Facultatif) Contient les données QnA quand le type de tâche est QnA . |
Chaîne |
- query |
(Facultatif) Représente la question dans une tâche QnA. Limite de caractères : 7 500. | Chaîne |
texte | (Obligatoire) Texte de sortie du LLM à vérifier. Limite de caractères : 7 500. | Chaîne |
groundingSources | (Obligatoire) Utilise un tableau de sources de fondement pour valider le texte généré par l’IA. Jusqu’à 55 000 caractères de sources de fondement peuvent être analysés dans une seule demande. | Tableau de chaîne |
raisonnement | (Facultatif) Défini sur true , le service utilise des ressources Azure OpenAI pour fournir une explication. Attention : l’utilisation du raisonnement augmente le temps de traitement et entraîne des frais supplémentaires. |
Boolean |
llmResource | (Obligatoire) Si vous souhaitez utiliser votre propre ressource Azure OpenAI GPT4-Turbo pour activer le raisonnement, ajoutez ce champ et incluez les sous-champs pour les ressources utilisées. | Chaîne |
- resourceType |
Spécifie le type de ressource utilisé. Actuellement, autorise uniquement AzureOpenAI . Nous prenons uniquement en charge les ressources Azure OpenAI GPT-4 Turbo et ne prenons pas en charge d’autres types de GPT. Vos ressources GPT-4 Turbo peuvent être déployées dans n’importe quelle région. Toutefois, nous vous recommandons de les localiser dans la même région que les ressources de sécurité du contenu afin de réduire la latence potentielle. |
Enum |
- azureOpenAIEndpoint |
URL de votre point de terminaison pour le service Azure OpenAI. | Chaîne |
- azureOpenAIDeploymentName |
Nom du déploiement GPT spécifique à utiliser. | Chaîne |
Interpréter la réponse de l’API
Après avoir envoyé votre demande, vous recevez une réponse JSON reflétant l’analyse de fondement effectuée. La sortie type ressemble à :
{
"ungroundedDetected": true,
"ungroundedPercentage": 1,
"ungroundedDetails": [
{
"text": "12/hour.",
"offset": {
"utf8": 0,
"utf16": 0,
"codePoint": 0
},
"length": {
"utf8": 8,
"utf16": 8,
"codePoint": 8
},
"reason": "None. The premise mentions a pay of \"10/hour\" but does not mention \"12/hour.\" It's neutral. "
}
]
}
Les objets JSON dans la sortie sont définis ici :
Nom | Description | Type |
---|---|---|
ungroundedDetected | Indique si le texte n’est pas fondé. | Boolean |
ungroundedPercentage | Spécifie la proportion du texte identifié comme non fondé, exprimé par un nombre compris entre 0 et 1, où 0 indique qu’il n’y a pas de contenu non fondé et 1 indique un contenu pas du tout fondé. | Float |
ungroundedDetails | Fournit des insights sur le contenu non fondé avec des exemples et des pourcentages spécifiques. | Tableau |
-text |
Texte spécifique qui n’est pas fondé. | Chaîne |
-offset |
Objet décrivant la position du texte non fondé dans différents encodages. | Chaîne |
- offset > utf8 |
Position de décalage du texte non fondé en encodage UTF-8. | Entier |
- offset > utf16 |
Position de décalage du texte non fondé en encodage UTF-16. | Entier |
- offset > codePoint |
Position de décalage du texte non fondé en termes de points de code Unicode. | Entier |
-length |
Objet décrivant la longueur du texte non fondé dans différents encodages. (utf8, utf16, codePoint), similaire au décalage. | Object |
- length > utf8 |
Longueur du texte non fondé en encodage UTF-8. | Entier |
- length > utf16 |
Longueur du texte non fondé en encodage UTF-16. | Entier |
- length > codePoint |
Longueur du texte non fondé en termes de points de code Unicode. | Entier |
-reason |
Offre des explications pour la détection d’absence de fondement. | Chaîne |
Nettoyer les ressources
Si vous souhaitez nettoyer et supprimer un abonnement Azure AI services, vous pouvez supprimer la ressource ou le groupe de ressources. La suppression du groupe de ressources efface également les autres ressources qui y sont associées.
Étapes suivantes
Combinez la détection de fondement avec d’autres fonctionnalités de sécurité LLM comme les boucliers de prompt.