Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Les modèles de conversation sont des modèles de langage optimisés pour les interfaces conversationnelles. Les modèles se comportent différemment des anciens modèles d’API d’achèvement. Les modèles précédents étaient text-in et text-out, ce qui signifie qu’ils acceptaient une chaîne d’invite et retournaient une complétion pour compléter l’invite. Toutefois, les derniers modèles fonctionnent avec une entrée sous forme de conversation et une sortie sous forme de message. Les modèles s’attendent à ce que l’entrée soit mise en forme dans un format de transcription spécifique similaire à un chat. Ils retournent une complétude qui représente un message généré par un modèle dans le chat. Ce format a été conçu spécifiquement pour les conversations multi-tours, mais il peut également bien fonctionner pour les scénarios hors communication instantanée.
Cet article vous guide tout au long de la prise en main des modèles d’achèvement de conversation. Pour obtenir les meilleurs résultats, utilisez les techniques décrites ici. N’essayez pas d’interagir avec les modèles de la même façon que vous l’avez fait avec l’ancienne série de modèles, car les modèles sont souvent détaillés et fournissent des réponses moins utiles.
Conditions préalables
- Un modèle d’achèvement de conversation OpenAI Azure déployé.
- Installez la bibliothèque openAI Python :
pip install openai. - Pour l’authentification Microsoft Entra ID, installez Azure Identity :
pip install azure-identity. - Pour l’exemple de comptage de jetons, installez tiktoken :
pip install tiktoken. - Si vous utilisez des clés API, définissez la variable d’environnement
AZURE_OPENAI_API_KEY.
- Le sdk .NET 8.0 ou version ultérieure.
- Pour l’authentification Microsoft Entra ID, installez le Azure CLI et attribuez le rôle
Cognitive Services Userà votre compte d’utilisateur. - Si vous utilisez des clés API, définissez la variable d’environnement
AZURE_OPENAI_API_KEY.
Utiliser des modèles d’achèvement de conversation
L’extrait de code suivant montre la manière la plus basique d’interagir avec les modèles qui utilisent l’API Chat Completion.
Note
L'API réponses utilise le même style d'interaction conversationnelle, mais prend en charge les fonctionnalités les plus récentes qui ne sont pas supportées par l'ancienne API de complétions de chat.
from openai import OpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider
token_provider = get_bearer_token_provider(
DefaultAzureCredential(), "https://ai.azure.com/.default"
)
client = OpenAI(
base_url = "https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
api_key=token_provider,
)
response = client.chat.completions.create(
model="YOUR-DEPLOYMENT-NAME", # Replace with your model deployment name.
messages=[
{"role": "system", "content": "Assistant is a large language model trained by OpenAI."},
{"role": "user", "content": "Who were the founders of Microsoft?"}
]
)
#print(response)
print(response.model_dump_json(indent=2))
print(response.choices[0].message.content)
{
"id": "chatcmpl-8GHoQAJ3zN2DJYqOFiVysrMQJfe1P",
"choices": [
{
"finish_reason": "stop",
"index": 0,
"message": {
"content": "Microsoft was founded by Bill Gates and Paul Allen. They established the company on April 4, 1975. Bill Gates served as the CEO of Microsoft until 2000 and later as Chairman and Chief Software Architect until his retirement in 2008, while Paul Allen left the company in 1983 but remained on the board of directors until 2000.",
"role": "assistant",
"function_call": null
},
"content_filter_results": {
"hate": {
"filtered": false,
"severity": "safe"
},
"self_harm": {
"filtered": false,
"severity": "safe"
},
"sexual": {
"filtered": false,
"severity": "safe"
},
"violence": {
"filtered": false,
"severity": "safe"
}
}
}
],
"created": 1698892410,
"model": "gpt-4o",
"object": "chat.completion",
"usage": {
"completion_tokens": 73,
"prompt_tokens": 29,
"total_tokens": 102
},
"prompt_filter_results": [
{
"prompt_index": 0,
"content_filter_results": {
"hate": {
"filtered": false,
"severity": "safe"
},
"self_harm": {
"filtered": false,
"severity": "safe"
},
"sexual": {
"filtered": false,
"severity": "safe"
},
"violence": {
"filtered": false,
"severity": "safe"
}
}
}
]
}
Microsoft was founded by Bill Gates and Paul Allen. They established the company on April 4, 1975. Bill Gates served as the CEO of Microsoft until 2000 and later as Chairman and Chief Software Architect until his retirement in 2008, while Paul Allen left the company in 1983 but remained on the board of directors until 2000.
Chaque réponse inclut finish_reason. Les valeurs possibles pour finish_reason sont :
- stop : l’API a retourné la sortie complète du modèle.
-
longueur : sortie de modèle incomplète en raison du paramètre
max_tokensou de la limite de tokens. - content_filter : contenu omis en raison d’un indicateur à partir de nos filtres de contenu.
- Null : réponse de l’API toujours en cours ou incomplète.
Envisagez de définir max_tokens une valeur légèrement plus élevée que la normale. Une valeur plus élevée garantit que le modèle n’arrête pas de générer du texte avant d’atteindre la fin du message.
Utiliser l'API de complétion de chat
Les modèles de complétion de chat d'OpenAI sont entraînés pour accepter une entrée formatée comme une conversation. Le paramètre « messages » reçoit un tableau d’objets message avec une conversation organisée par rôle. Lorsque vous utilisez l’API Python, une liste de dictionnaires est utilisée.
Le format d’une finalisation de conversation de base consiste en :
{"role": "system", "content": "Provide some context and/or instructions to the model"},
{"role": "user", "content": "The user's message goes here"}
Une conversation avec un exemple de réponse suivi d’une question ressemble à ceci :
{"role": "system", "content": "Provide some context and/or instructions to the model."},
{"role": "user", "content": "Example question goes here."},
{"role": "assistant", "content": "Example answer goes here."},
{"role": "user", "content": "First question/message for the model to actually respond to."}
Rôle système
Le rôle système, également appelé message système, est inclus au début du tableau. Ce message fournit les instructions initiales au modèle. Vous pouvez fournir diverses informations dans le rôle système, telles que :
- Brève description de l’assistant.
- Traits de personnalité de l’assistant.
- Instructions ou règles que vous souhaitez que l’assistant suive.
- Données ou informations nécessaires pour le modèle, telles que les questions pertinentes d’un FAQ.
Vous pouvez personnaliser le rôle système pour votre cas d’usage ou inclure des instructions de base. Le rôle système/message est facultatif, mais nous vous recommandons d’inclure au moins un rôle de base pour obtenir les meilleurs résultats.
Messages
Après le rôle système, vous pouvez inclure une série de messages entre le user et le assistant.
{"role": "user", "content": "What is thermodynamics?"}
Pour déclencher une réponse à partir du modèle, terminez par un message utilisateur pour indiquer qu’il s’agit du tour de l’Assistant de répondre. Vous pouvez également inclure une série d’exemples de messages entre l’utilisateur et l’Assistant comme moyen d’effectuer un apprentissage à quelques coups.
Exemples d'invitations de message
La section suivante présente des exemples de styles différents d’invites que vous pouvez utiliser avec des modèles de complétion de conversations. Ces exemples ne constituent qu’un point de départ. Vous pouvez expérimenter différentes invites pour personnaliser le comportement de vos propres cas d’usage.
Exemple de base
Si vous souhaitez que votre modèle de complétion de chat se comporte de façon similaire à chatgpt.com, vous pouvez utiliser un message système de base comme Assistant is a large language model trained by OpenAI.
{"role": "system", "content": "Assistant is a large language model trained by OpenAI."},
{"role": "user", "content": "Who were the founders of Microsoft?"}
Exemple avec des instructions
Pour certains scénarios, vous pouvez donner plus d’instructions au modèle pour définir des garde-fous pour ce que le modèle est en mesure de faire.
{"role": "system", "content": "Assistant is an intelligent chatbot designed to help users answer their tax related questions.
Instructions:
- Only answer questions related to taxes.
- If you're unsure of an answer, you can say "I don't know" or "I'm not sure" and recommend users go to the IRS website for more information. "},
{"role": "user", "content": "When are my taxes due?"}
Utiliser des données comme base
Vous pouvez également inclure des données ou des informations pertinentes dans le message système pour donner au modèle un contexte supplémentaire pour la conversation. Si vous devez inclure uniquement une petite quantité d’informations, vous pouvez le coder en dur dans le message système. Si vous avez une grande quantité de données dont le modèle doit être informé, vous pouvez utiliser embeddings ou un produit comme Recherche Azure AI pour récupérer les informations les plus pertinentes au moment de la requête.
{"role": "system", "content": "Assistant is an intelligent chatbot designed to help users answer technical questions about Azure OpenAI in Microsoft Foundry Models. Only answer questions using the context below and if you're not sure of an answer, you can say 'I don't know'.
Context:
- Azure OpenAI provides REST API access to OpenAI's powerful language models including the GPT-3, Codex and Embeddings model series.
- Azure OpenAI gives customers advanced language AI with OpenAI GPT-4o, GPT-image series, and Embeddings models with the security and enterprise promise of Azure. Azure OpenAI co-develops the APIs with OpenAI, ensuring compatibility and a smooth transition from one to the other.
- At Microsoft, we're committed to the advancement of AI driven by principles that put people first. Microsoft has made significant investments to help guard against abuse and unintended harm, which includes requiring applicants to show well-defined use cases, incorporating Microsoft’s principles for responsible AI use."
},
{"role": "user", "content": "What is Azure OpenAI?"}
Apprentissage à partir de peu d'exemples avec complétion de discussion
Vous pouvez également donner quelques exemples de capture au modèle. L'approche pour l'apprentissage par petits échantillons a changé un peu en raison du nouveau format d'instruction. Vous pouvez désormais inclure une série de messages entre l’utilisateur et l’Assistant dans l’invite à quelques exemples. En utilisant ces exemples, vous pouvez amorcer des réponses aux questions courantes pour préparer le modèle ou lui enseigner des comportements particuliers.
Cet exemple montre comment utiliser l’apprentissage à quelques coups avec GPT-35-Turbo et GPT-4. Vous pouvez expérimenter différentes approches pour voir ce qui fonctionne le mieux pour votre cas d’usage.
{"role": "system", "content": "Assistant is an intelligent chatbot designed to help users answer their tax related questions. "},
{"role": "user", "content": "When do I need to file my taxes by?"},
{"role": "assistant", "content": "In 2023, you will need to file your taxes by April 18th. The date falls after the usual April 15th deadline because April 15th falls on a Saturday in 2023. For more details, see https://www.irs.gov/filing/individuals/when-to-file."},
{"role": "user", "content": "How can I check the status of my tax refund?"},
{"role": "assistant", "content": "You can check the status of your tax refund by visiting https://www.irs.gov/refunds"}
Utiliser la complétion de chat pour les scénarios non-chat
L'API de complétion de chat est conçue pour fonctionner avec des conversations multitours, mais elle fonctionne également bien pour les scénarios non conversationnels.
Par exemple, pour un scénario d’extraction d’entité, vous pouvez utiliser l’invite suivante :
{"role": "system", "content": "You are an assistant designed to extract entities from text. Users will paste in a string of text and you will respond with entities you've extracted from the text as a JSON object. Here's an example of your output format:
{
"name": "",
"company": "",
"phone_number": ""
}"},
{"role": "user", "content": "Hello. My name is Robert Smith. I'm calling from Contoso Insurance, Delaware. My colleague mentioned that you are interested in learning about our comprehensive benefits policy. Could you give me a call back at (555) 346-9322 when you get a chance so we can go over the benefits?"}
Créer une boucle de conversation de base
Les exemples jusqu'à présent montrent la mécanique de base de l'interaction avec l'API de complétion de conversation. Cet exemple montre comment créer une boucle de conversation qui effectue les actions suivantes :
- Prend continuellement les entrées de la console et les formate correctement en tant que contenu lié au rôle de l'utilisateur dans la liste des messages.
- Génère des réponses imprimées dans la console et mises en forme et ajoutées à la liste des messages en tant que contenu du rôle Assistant.
Chaque fois qu’une nouvelle question est posée, une transcription en cours d’exécution de la conversation est envoyée avec la dernière question. Étant donné que le modèle n’a pas de mémoire, vous devez envoyer une transcription mise à jour avec chaque nouvelle question ou le modèle perd le contexte des questions et réponses précédentes.
from openai import OpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider
token_provider = get_bearer_token_provider(
DefaultAzureCredential(), "https://ai.azure.com/.default"
)
client = OpenAI(
base_url = "https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
api_key=token_provider,
)
conversation=[{"role": "system", "content": "You are a helpful assistant."}]
while True:
user_input = input("Q:")
conversation.append({"role": "user", "content": user_input})
response = client.chat.completions.create(
model="YOUR-DEPLOYMENT-NAME", # Replace with your model deployment name.
messages=conversation
)
conversation.append({"role": "assistant", "content": response.choices[0].message.content})
print("\n" + response.choices[0].message.content + "\n")
Lorsque vous exécutez le code précédent, vous obtenez une fenêtre de console vide. Entrez votre première question dans la fenêtre, puis sélectionnez la Enter clé. Une fois la réponse retournée, vous pouvez répéter le processus et continuer à poser des questions.
Gérer les conversations
L’exemple précédent s’exécute jusqu’à ce que vous atteignez la limite de jeton du modèle (fenêtre de contexte). Avec chaque question posée et réponse reçue, la messages liste augmente en taille. Le nombre de jetons combinés de votre messages plus les jetons de sortie demandés doit rester dans la limite du modèle, ou la requête échoue. Consultez la page modèles pour connaître les limites de jeton actuelles.
Il vous incombe de vous assurer que l'invite et la complétion respectent la limite de tokens. Pour les conversations plus longues, vous devez suivre le nombre de jetons et envoyer uniquement au modèle une invite respectant la limite. Vous pouvez également utiliser l’API réponses pour vous permettre de gérer la troncation/la gestion de l’historique des conversations.
L’exemple de code suivant montre un exemple de boucle de conversation simple avec une technique permettant de gérer un nombre de jetons de 4 096 à l’aide de la bibliothèque tiktoken d’OpenAI.
Vous devrez peut-être mettre à niveau votre version de tiktoken avec pip install tiktoken --upgrade.
import tiktoken
from openai import OpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider
token_provider = get_bearer_token_provider(
DefaultAzureCredential(), "https://ai.azure.com/.default"
)
client = OpenAI(
base_url = "https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",
api_key=token_provider,
)
system_message = {"role": "system", "content": "You are a helpful assistant."}
max_response_tokens = 250
token_limit = 4096
conversation = []
conversation.append(system_message)
def num_tokens_from_messages(messages, model="gpt-4o"):
"""Return the number of tokens used by a list of messages."""
try:
encoding = tiktoken.encoding_for_model(model)
except KeyError:
print("Warning: model not found. Using o200k_base encoding.")
encoding = tiktoken.get_encoding("o200k_base")
if model in {
"gpt-4o",
"gpt-4o-mini",
"gpt-5",
"gpt-4.1",
"o1",
"o1-mini",
"o3",
"o3-mini",
"o4-mini",
}:
tokens_per_message = 3
tokens_per_name = 1
elif any(model.startswith(prefix) for prefix in [
"gpt-4o-",
"gpt-5-",
"gpt-4.1-",
"o1-",
"o3-",
"o4-mini-",
]):
tokens_per_message = 3
tokens_per_name = 1
else:
raise NotImplementedError(
f"""num_tokens_from_messages() is not implemented for model {model}. """
)
num_tokens = 0
for message in messages:
num_tokens += tokens_per_message
for key, value in message.items():
num_tokens += len(encoding.encode(value))
if key == "name":
num_tokens += tokens_per_name
num_tokens += 3
return num_tokens
while True:
user_input = input("Q:")
conversation.append({"role": "user", "content": user_input})
conv_history_tokens = num_tokens_from_messages(conversation, model="gpt-4o")
while conv_history_tokens + max_response_tokens >= token_limit:
del conversation[1]
conv_history_tokens = num_tokens_from_messages(conversation, model="gpt-4o")
response = client.chat.completions.create(
model="YOUR-DEPLOYMENT-NAME",
messages=conversation,
temperature=0.7,
max_tokens=max_response_tokens
)
conversation.append({"role": "assistant", "content": response.choices[0].message.content})
print("\n" + response.choices[0].message.content + "\n")
Dans cet exemple, une fois le nombre de jetons atteint, les messages les plus anciens de la transcription de conversation sont supprimés. Pour l'efficacité, del est utilisé au lieu de pop(). Nous commençons à l’index 1 pour conserver toujours le message système et supprimer uniquement les messages utilisateur ou assistant. Au fil du temps, cette méthode de gestion de la conversation peut entraîner la dégradation de la qualité de la conversation, car le modèle perd progressivement le contexte des parties antérieures de la conversation.
Une autre approche consiste à limiter la durée de la conversation à la longueur maximale du jeton ou à un nombre spécifique de tours. Une fois la limite de jeton maximale atteinte, le modèle perdrait le contexte si vous deviez autoriser la conversation à continuer. Vous pouvez inviter l’utilisateur à commencer une nouvelle conversation et à effacer la liste des messages pour démarrer une nouvelle conversation avec la limite de jetons complète disponible.
La partie de comptage de jetons du code illustrée précédemment est une version simplifiée de l’un des exemples de livre de recettes d’OpenAI.
Dépannage
Échec de la création de la complétion en raison de sortie Unicode non valide générée par le modèle.
| Code d’erreur | Message d’erreur | Contournement |
|---|---|---|
| 500 | 500 - Erreur Interne du Serveur : Code d’erreur : 500 - {"erreur" : {"message" : "Échec de la création du résultat car le modèle a généré une sortie Unicode invalide"}} | Vous pouvez réduire l’occurrence de ces erreurs en réduisant la température de vos invites à moins de 1 et en vous assurant que vous utilisez un client avec une logique de nouvelle tentative. La réacheminement de la requête entraîne souvent une réponse réussie. |
Erreurs courantes
- 401/403 (authentification) : vérifiez votre clé API ou vérifiez que vous avez un accès Microsoft Entra ID à la ressource Azure OpenAI.
-
400/404 (déploiement introuvable) : vérifiez qu’il
modelcorrespond à votre nom de déploiement. -
URL non valide : vérifiez que cela
base_urlse termine par/openai/v1/.
Configurer
Créez une application console .NET :
dotnet new console -n chat-completions cd chat-completionsInstallez les packages NuGet requis :
dotnet add package OpenAI --prerelease dotnet add package Azure.IdentityPour l’authentification sans clé avec Microsoft Entra ID, connectez-vous à Azure :
az login
Utiliser des modèles d’achèvement de conversation
L’extrait de code suivant montre la manière la plus basique d’interagir avec les modèles qui utilisent l’API Chat Completion.
Note
L'API des réponses utilise le même style d’interaction de conversation, mais prend en charge les fonctionnalités les plus récentes qui ne sont pas prises en charge avec l'ancienne API des complétions de chat.
using Azure.Identity;
using OpenAI;
using OpenAI.Chat;
using System.ClientModel.Primitives;
#pragma warning disable OPENAI001
BearerTokenPolicy tokenPolicy = new(
new DefaultAzureCredential(),
"https://ai.azure.com/.default");
ChatClient client = new(
model: "YOUR-DEPLOYMENT-NAME",
authenticationPolicy: tokenPolicy,
options: new OpenAIClientOptions()
{
Endpoint = new Uri("https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/")
}
);
ChatCompletion completion = await client.CompleteChatAsync(
[
new SystemChatMessage("Assistant is a large language model trained by OpenAI."),
new UserChatMessage("Who were the founders of Microsoft?"),
]);
Console.WriteLine(completion.Content[0].Text);
Microsoft was founded by Bill Gates and Paul Allen. They established the company on April 4, 1975. Bill Gates served as the CEO of Microsoft until 2000 and later as Chairman and Chief Software Architect until his retirement in 2008, while Paul Allen left the company in 1983 but remained on the board of directors until 2000.
Chaque réponse inclut un FinishReason. Les valeurs possibles pour FinishReason sont :
- Arrêt : l’API a retourné la sortie complète du modèle.
-
Longueur : sortie de modèle incomplète en raison du
MaxOutputTokenCountparamètre ou de la limite de jetons. - ContentFilter : contenu omis en raison d’un indicateur de filtre de contenu.
- Null : réponse de l’API toujours en cours ou incomplète.
Envisagez de définir MaxOutputTokenCount une valeur légèrement plus élevée que la normale. Une valeur plus élevée garantit que le modèle n’arrête pas de générer du texte avant d’atteindre la fin du message.
Utiliser l'API de complétion de chat
Les modèles de complétion de chat d'OpenAI sont entraînés pour accepter une entrée formatée comme une conversation. Le paramètre « messages » reçoit un tableau d’objets message avec une conversation organisée par rôle. Lorsque vous utilisez le KIT de développement logiciel (SDK) .NET, vous utilisez des classes de message fortement typées pour chaque rôle.
Le format d’une finalisation de conversation de base consiste en :
new SystemChatMessage("Provide some context and/or instructions to the model"),
new UserChatMessage("The user's message goes here")
Une conversation avec un exemple de réponse suivi d’une question ressemble à ceci :
new SystemChatMessage("Provide some context and/or instructions to the model."),
new UserChatMessage("Example question goes here."),
new AssistantChatMessage("Example answer goes here."),
new UserChatMessage("First question/message for the model to actually respond to.")
Rôle système
Le rôle système, également appelé message système, est inclus au début du tableau. Ce message fournit les instructions initiales au modèle. Vous pouvez fournir diverses informations dans le rôle système, telles que :
- Brève description de l’assistant.
- Traits de personnalité de l’assistant.
- Instructions ou règles que vous souhaitez que l’assistant suive.
- Données ou informations nécessaires pour le modèle, telles que les questions pertinentes d’un FAQ.
Vous pouvez personnaliser le rôle système pour votre cas d’usage ou inclure des instructions de base. Le rôle système/message est facultatif, mais nous vous recommandons d’inclure au moins un rôle de base pour obtenir les meilleurs résultats.
Messages
Après le rôle système, vous pouvez inclure une série de messages entre le user et le assistant.
new UserChatMessage("What is thermodynamics?")
Pour déclencher une réponse à partir du modèle, terminez par un message utilisateur pour indiquer qu’il s’agit du tour de l’Assistant de répondre. Vous pouvez également inclure une série d’exemples de messages entre l’utilisateur et l’Assistant comme moyen d’effectuer un apprentissage à quelques coups.
Exemples d'invitations de message
La section suivante présente des exemples de styles différents d’invites que vous pouvez utiliser avec des modèles de complétion de conversations. Ces exemples ne constituent qu’un point de départ. Vous pouvez expérimenter différentes invites pour personnaliser le comportement de vos propres cas d’usage.
Exemple de base
Si vous souhaitez que votre modèle de complétion de chat se comporte de façon similaire à chatgpt.com, vous pouvez utiliser un message système de base comme Assistant is a large language model trained by OpenAI.
new SystemChatMessage("Assistant is a large language model trained by OpenAI."),
new UserChatMessage("Who were the founders of Microsoft?")
Exemple avec des instructions
Pour certains scénarios, vous pouvez donner plus d’instructions au modèle pour définir des garde-fous pour ce que le modèle est en mesure de faire.
new SystemChatMessage(@"Assistant is an intelligent chatbot designed to help users answer their tax related questions.
Instructions:
- Only answer questions related to taxes.
- If you're unsure of an answer, you can say ""I don't know"" or ""I'm not sure"" and recommend users go to the IRS website for more information."),
new UserChatMessage("When are my taxes due?")
Utiliser des données comme base
Vous pouvez également inclure des données ou des informations pertinentes dans le message système pour donner au modèle un contexte supplémentaire pour la conversation. Si vous devez inclure uniquement une petite quantité d’informations, vous pouvez le coder en dur dans le message système. Si vous avez une grande quantité de données dont le modèle doit être informé, vous pouvez utiliser embeddings ou un produit comme Recherche Azure AI pour récupérer les informations les plus pertinentes au moment de la requête.
new SystemChatMessage(@"Assistant is an intelligent chatbot designed to help users answer technical questions about Azure OpenAI in Microsoft Foundry Models. Only answer questions using the context below and if you're not sure of an answer, you can say 'I don't know'.
Context:
- Azure OpenAI provides REST API access to OpenAI's powerful language models including the GPT-3, Codex and Embeddings model series.
- Azure OpenAI gives customers advanced language AI with OpenAI GPT-4o, GPT-image series, and Embeddings models with the security and enterprise promise of Azure. Azure OpenAI co-develops the APIs with OpenAI, ensuring compatibility and a smooth transition from one to the other.
- At Microsoft, we're committed to the advancement of AI driven by principles that put people first. Microsoft has made significant investments to help guard against abuse and unintended harm, which includes requiring applicants to show well-defined use cases, incorporating Microsoft's principles for responsible AI use."),
new UserChatMessage("What is Azure OpenAI?")
Apprentissage à partir de peu d'exemples avec complétion de discussion
Vous pouvez également donner quelques exemples de capture au modèle. Vous pouvez inclure une série de messages entre l’utilisateur et l’Assistant dans l’invite à quelques exemples. En utilisant ces exemples, vous pouvez amorcer des réponses aux questions courantes pour préparer le modèle ou lui enseigner des comportements particuliers.
new SystemChatMessage("Assistant is an intelligent chatbot designed to help users answer their tax related questions."),
new UserChatMessage("When do I need to file my taxes by?"),
new AssistantChatMessage("In 2023, you will need to file your taxes by April 18th. The date falls after the usual April 15th deadline because April 15th falls on a Saturday in 2023. For more details, see https://www.irs.gov/filing/individuals/when-to-file."),
new UserChatMessage("How can I check the status of my tax refund?"),
new AssistantChatMessage("You can check the status of your tax refund by visiting https://www.irs.gov/refunds")
Utiliser la complétion de chat pour les scénarios non-chat
L'API de complétion de chat est conçue pour fonctionner avec des conversations multitours, mais elle fonctionne également bien pour les scénarios non conversationnels.
Par exemple, pour un scénario d’extraction d’entité, vous pouvez utiliser l’invite suivante :
new SystemChatMessage(@"You are an assistant designed to extract entities from text. Users will paste in a string of text and you will respond with entities you've extracted from the text as a JSON object. Here's an example of your output format:
{
""name"": """",
""company"": """",
""phone_number"": """"
}"),
new UserChatMessage("Hello. My name is Robert Smith. I'm calling from Contoso Insurance, Delaware. My colleague mentioned that you are interested in learning about our comprehensive benefits policy. Could you give me a call back at (555) 346-9322 when you get a chance so we can go over the benefits?")
Créer une boucle de conversation de base
Les exemples jusqu'à présent montrent la mécanique de base de l'interaction avec l'API de complétion de conversation. Cet exemple montre comment créer une boucle de conversation qui effectue les actions suivantes :
- Prend continuellement les entrées de la console et les formate correctement en tant que contenu lié au rôle de l'utilisateur dans la liste des messages.
- Génère des réponses imprimées dans la console et mises en forme et ajoutées à la liste des messages en tant que contenu du rôle Assistant.
Chaque fois qu’une nouvelle question est posée, une transcription en cours d’exécution de la conversation est envoyée avec la dernière question. Étant donné que le modèle n’a pas de mémoire, vous devez envoyer une transcription mise à jour avec chaque nouvelle question ou le modèle perd le contexte des questions et réponses précédentes.
using Azure.Identity;
using OpenAI;
using OpenAI.Chat;
using System.ClientModel.Primitives;
#pragma warning disable OPENAI001
BearerTokenPolicy tokenPolicy = new(
new DefaultAzureCredential(),
"https://ai.azure.com/.default");
ChatClient client = new(
model: "YOUR-DEPLOYMENT-NAME",
authenticationPolicy: tokenPolicy,
options: new OpenAIClientOptions()
{
Endpoint = new Uri("https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/")
}
);
List<ChatMessage> conversation =
[
new SystemChatMessage("You are a helpful assistant."),
];
while (true)
{
Console.Write("Q: ");
string? userInput = Console.ReadLine();
if (string.IsNullOrWhiteSpace(userInput)) break;
conversation.Add(new UserChatMessage(userInput));
ChatCompletion response = await client.CompleteChatAsync(conversation);
string assistantMessage = response.Content[0].Text;
conversation.Add(new AssistantChatMessage(assistantMessage));
Console.WriteLine($"\n{assistantMessage}\n");
}
Lorsque vous exécutez le code précédent, vous obtenez une fenêtre de console vide. Entrez votre première question dans la fenêtre, puis sélectionnez la Enter clé. Une fois la réponse retournée, vous pouvez répéter le processus et continuer à poser des questions.
Gérer les conversations
L’exemple précédent s’exécute jusqu’à ce que la limite de jeton du modèle (fenêtre de contexte) soit atteinte. Avec chaque question posée et réponse reçue, la conversation liste augmente en taille. Le nombre combiné de jetons de vos messages ainsi que les jetons de sortie demandés doivent rester dans la limite du modèle, ou la requête échoue. Consultez la page modèles pour connaître les limites de jeton actuelles.
Il vous incombe de vous assurer que l'invite et la complétion respectent la limite de tokens. Pour les conversations plus longues, vous devez suivre le nombre de jetons et envoyer uniquement au modèle une invite respectant la limite. Vous pouvez également utiliser l’API réponses pour vous permettre de gérer la troncation et la gestion de l’historique des conversations.
L’exemple de code suivant montre un exemple de boucle de conversation simple qui supprime l’historique des conversations lorsque le nombre de messages stockés approche d’une limite. Il supprime les messages non système les plus anciens pour conserver la conversation dans les limites.
Vous pouvez installer les Microsoft.ML.Tokenizers et Microsoft.ML.Tokenizers.Data.0200kBase pour le comptage de jetons précis :
dotnet add package Microsoft.ML.Tokenizers
dotnet add package Microsoft.ML.Tokenizers.Data.O200kBase
using Azure.Identity;
using Microsoft.ML.Tokenizers;
using OpenAI;
using OpenAI.Chat;
using System.ClientModel.Primitives;
#pragma warning disable OPENAI001
BearerTokenPolicy tokenPolicy = new(
new DefaultAzureCredential(),
"https://ai.azure.com/.default");
ChatClient client = new(
model: "YOUR-DEPLOYMENT-NAME",
authenticationPolicy: tokenPolicy,
options: new OpenAIClientOptions()
{
Endpoint = new Uri("https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/")
}
);
const int MaxResponseTokens = 250;
const int TokenLimit = 4096;
var tokenizer = TiktokenTokenizer.CreateForModel("gpt-4o");
List<ChatMessage> conversation =
[
new SystemChatMessage("You are a helpful assistant."),
];
static int CountTokens(TiktokenTokenizer tokenizer, IEnumerable<ChatMessage> messages)
{
int count = 3; // base overhead for reply priming
foreach (var message in messages)
{
count += 4; // per-message overhead
string content = message switch
{
SystemChatMessage s => s.Content[0].Text ?? string.Empty,
UserChatMessage u => u.Content[0].Text ?? string.Empty,
AssistantChatMessage a => a.Content[0].Text ?? string.Empty,
_ => string.Empty
};
count += tokenizer.CountTokens(content);
}
return count;
}
while (true)
{
Console.Write("Q: ");
string? userInput = Console.ReadLine();
if (string.IsNullOrWhiteSpace(userInput)) break;
conversation.Add(new UserChatMessage(userInput));
int historyTokens = CountTokens(tokenizer, conversation);
while (historyTokens + MaxResponseTokens >= TokenLimit && conversation.Count > 2)
{
conversation.RemoveAt(1); // remove oldest non-system message
historyTokens = CountTokens(tokenizer, conversation);
}
ChatCompletionOptions options = new() { MaxOutputTokenCount = MaxResponseTokens };
ChatCompletion response = await client.CompleteChatAsync(conversation, options);
string assistantMessage = response.Content[0].Text;
conversation.Add(new AssistantChatMessage(assistantMessage));
Console.WriteLine($"\n{assistantMessage}\n");
}
Dans cet exemple, une fois le nombre de jetons atteint, les messages les plus anciens de la transcription de conversation sont supprimés. Nous conservons toujours le message système et supprimons uniquement les messages utilisateur ou assistant. Au fil du temps, cette méthode de gestion de la conversation peut entraîner la dégradation de la qualité de la conversation, car le modèle perd progressivement le contexte des parties antérieures de la conversation.
Une autre approche consiste à limiter la durée de la conversation à la longueur maximale du jeton ou à un nombre spécifique de tours. Une fois la limite de jeton maximale atteinte, le modèle perdrait le contexte si vous deviez autoriser la conversation à continuer. Vous pouvez inviter l’utilisateur à commencer une nouvelle conversation et à effacer la liste des messages pour démarrer une nouvelle conversation avec la limite de jetons complète disponible.
Dépannage
Échec de la création de la complétion en raison de sortie Unicode non valide générée par le modèle.
| Code d’erreur | Message d’erreur | Contournement |
|---|---|---|
| 500 | 500 - Erreur Interne du Serveur : Code d’erreur : 500 - {"erreur" : {"message" : "Échec de la création du résultat car le modèle a généré une sortie Unicode invalide"}} | Vous pouvez réduire la fréquence de ces erreurs en abaissant votre Temperature dans votre ChatCompletionOptions à un chiffre inférieur à 1 et en vous assurant que vous utilisez un client doté d'une logique de réessai. La réacheminement de la requête entraîne souvent une réponse réussie. |
Erreurs courantes
- 401/403 (authentification) : vérifiez votre clé API ou vérifiez que vous avez Microsoft Entra ID accès à la ressource OpenAI Azure.
-
400/404 (déploiement introuvable) : vérifiez que le nom du modèle passé au constructeur correspond à
ChatClientvotre nom de déploiement. -
Point de terminaison non valide : vérifiez que l’URI
EndpointenOpenAIClientOptionspoints vershttps://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/.