Chat Markup Language ChatML (préversion)

Important

L’utilisation de modèles GPT-3.5-Turbo avec le point de terminaison d’achèvement comme décrit dans cet article reste en préversion et n’est possible qu’avec la version gpt-35-turbo (0301) qui devrait être mise hors service dès le 1 août 2024. Nous vous recommandons vivement d’utiliser l’API/le point de terminaison de fin de conversation en disponibilité générale. L’API de fin de conversation est la méthode recommandée pour interagir avec les modèles GPT-3.5-Turbo. L’API d’achèvement de conversation est également la seule manière d’accéder aux modèles GPT-4.

L’extrait de code suivant présente la manière la plus élémentaire d’utiliser les modèles GPT-3.5-Turbo avec ChatML. S’il s’agit de votre première utilisation de ces modèles programmatiquement, nous vous recommandons de commencer par notre Démarrage rapide de GPT-35-Turbo et GPT-4.

Remarque

Dans la documentation Azure OpenAI, nous faisons référence à GPT-3.5-Turbo et à GPT-35-Turbo de façon interchangeable. Le nom officiel du modèle sur OpenAI est gpt-3.5-turbo, mais pour Azure OpenAI en raison de contraintes de caractères spécifiques à Azure, le nom du modèle sous-jacent est gpt-35-turbo.

import os
import openai
openai.api_type = "azure"
openai.api_base = "https://{your-resource-name}.openai.azure.com/"
openai.api_version = "2024-02-01"
openai.api_key = os.getenv("OPENAI_API_KEY")

response = openai.Completion.create(
  engine="gpt-35-turbo", # The deployment name you chose when you deployed the GPT-35-Turbo model
  prompt="<|im_start|>system\nAssistant is a large language model trained by OpenAI.\n<|im_end|>\n<|im_start|>user\nWho were the founders of Microsoft?\n<|im_end|>\n<|im_start|>assistant\n",
  temperature=0,
  max_tokens=500,
  top_p=0.5,
  stop=["<|im_end|>"])

print(response['choices'][0]['text'])

Remarque

Les paramètres suivants ne sont pas disponibles avec le modèle gpt-35-turbo : logprobs, best_ofet echo. Si vous définissez l’un de ces paramètres, vous déclencherez une erreur.

Le jeton <|im_end|> indique la fin d’un message. Lorsque vous utilisez ChatML, il est recommandé d’inclure le jeton <|im_end|> en tant que séquence d’arrêt pour vous assurer que le modèle cesse de générer du texte lorsqu’il atteint la fin du message.

Nous vous conseillons de définir max_tokens sur une valeur légèrement supérieure à la normale, par exemple 300 ou 500. Cela permet d’éviter que le modèle s’arrête de générer du texte d’avoir terminé sa réponse.

Gestion des versions des modèles

Notes

gpt-35-turbo équivaut au modèle gpt-3.5-turbo d’OpenAI.

Contrairement aux modèles GPT-3 et GPT-3.5 précédents, le modèle gpt-35-turbo, comme les modèles gpt-4 et gpt-4-32k, sera toujours mis à jour. Lors de la création d’un déploiement de ces modèles, vous devez également spécifier une version de modèle.

Vous trouverez les dates de mise hors service de ces modèles sur notre page Modèles.

Utilisation du Chat Markup Language (ChatML)

Notes

OpenAI continue d’améliorer GPT-35-Turbo et le Chat Markup Language utilisé avec les modèles continuera d’évoluer au fil du temps. Ce document sera mis à jour en conséquence.

OpenAI a entraîné GPT-35-Turbo sur des jetons spéciaux qui délimitent les différentes parties de l’invite. La prompt commence par un message système utilisé pour amorcer le modèle, suivi d’une série de messages entre l’utilisateur et l’assistant.

Le format d’une prompt de base en ChatML est le suivant :

<|im_start|>system 
Provide some context and/or instructions to the model.
<|im_end|> 
<|im_start|>user 
The user’s message goes here
<|im_end|> 
<|im_start|>assistant 

Message système

Le message système est inclus au début de la prompt entre les jetons <|im_start|>system et <|im_end|>. Ce message fournit les instructions initiales au modèle. Vous pouvez fournir différentes informations dans le message système, notamment :

  • Une brève description de l’assistant
  • Les traits de personnalité de l’assistant
  • Les instructions ou les règles à suivre par l’assistant
  • Les données ou les informations nécessaires au modèle telles que des questions pertinentes provenant d’une FAQ

Vous pouvez personnaliser le message système selon votre cas d’usage ou simplement inclure un message système de base. Le message système est facultatif, mais il est recommandé d’inclure au moins un message système de base, pour obtenir les meilleurs résultats.

Messages

Après le message système, vous pouvez inclure une série de messages entre l’utilisateur et l’assistant. Chaque message doit commencer par le jeton <|im_start|> suivi du rôle (user ou assistant) et se terminer par le jeton <|im_end|>.

<|im_start|>user
What is thermodynamics?
<|im_end|>

Pour déclencher une réponse à partir du modèle, la prompt doit se terminer par un jeton <|im_start|>assistant indiquant que c’est au tour de l’assistant de répondre. Vous pouvez également inclure des messages entre l’utilisateur et l’assistant dans la prompt afin de réaliser un apprentissage en quelques essais.

Exemples de prompt

La section suivante présente des exemples de différents styles d’invites que vous pouvez utiliser avec les modèles GPT-35-Turbo et GPT-4. Ces exemples ne sont qu’un point de départ et vous pouvez expérimenter différentes prompts pour personnaliser le comportement selon vos propres cas d’usage.

Exemple de base

Si vous souhaitez que les modèles GPT-35-Turbo et GPT-4 se comportent de la même manière que chat.openai.com, vous pouvez utiliser un message système de base tel que « L’assistant est un modèle de langage étendu entraîné par OpenAI ».

<|im_start|>system
Assistant is a large language model trained by OpenAI.
<|im_end|>
<|im_start|>user
Who were the founders of Microsoft?
<|im_end|>
<|im_start|>assistant

Exemple avec des instructions

Pour certains scénarios, vous pouvez donner des instructions supplémentaires au modèle pour définir des critères de contrôle de ce que le modèle est capable de faire.

<|im_start|>system
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.
<|im_end|>
<|im_start|>user
When are my taxes due?
<|im_end|>
<|im_start|>assistant

Utilisation des données pour l’ancrage

Vous pouvez également inclure des données ou des informations pertinentes dans le message système afin de donner au modèle un contexte supplémentaire pour la conversation. Si vous ne devez inclure qu’une petite quantité d’informations, vous pouvez les coder manuellement dans le message du système. Si vous disposez d’une grande quantité de données dont le modèle doit avoir connaissance, vous pouvez utiliser des incorporations ou un produit comme Recherche Azure AI pour récupérer les informations les plus pertinentes au moment de la requête.

<|im_start|>system
Assistant is an intelligent chatbot designed to help users answer technical questions about Azure OpenAI Serivce. 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 Service provides REST API access to OpenAI's powerful language models including the GPT-3, Codex and Embeddings model series.
- Azure OpenAI Service gives customers advanced language AI with OpenAI GPT-3, Codex, and DALL-E 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
<|im_end|>
<|im_start|>user
What is Azure OpenAI Service?
<|im_end|>
<|im_start|>assistant

Apprentissage en quelques essais avec le ChatML

Vous pouvez également fournir quelques exemples d’essais au modèle. L’approche de l’apprentissage en quelques essais a été légèrement modifiée en raison du nouveau format de prompt. Vous pouvez désormais inclure une série de messages entre l’utilisateur et l’assistant dans la prompt, sous la forme de quelques exemples d’essais. Ces exemples peuvent être utilisés pour fournir des réponses à des questions courantes afin d’initier le modèle ou de lui enseigner des comportements particuliers.

Cela n’est qu’un exemple de la façon dont vous pouvez utiliser l’apprentissage en quelques essais avec GPT-35-Turbo. Vous pouvez expérimenter différentes approches afin de déterminer celle qui convient le mieux à votre cas d’usage.

<|im_start|>system
Assistant is an intelligent chatbot designed to help users answer their tax related questions. 
<|im_end|>
<|im_start|>user
When do I need to file my taxes by?
<|im_end|>
<|im_start|>assistant
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
<|im_end|>
<|im_start|>user
How can I check the status of my tax refund?
<|im_end|>
<|im_start|>assistant
You can check the status of your tax refund by visiting https://www.irs.gov/refunds
<|im_end|>

Application du Chat Markup Language à d’autres usages

Le ChatML est conçu pour faciliter la gestion des interactions conversationnelles, mais ce langage convient également à d’autres scénarios.

Par exemple, pour un scénario d’extraction d’entités, vous pouvez utiliser cette prompt :

<|im_start|>system
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": ""
}
<|im_end|>
<|im_start|>user
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?
<|im_end|>
<|im_start|>assistant

Prévention des entrées utilisateur risquées

Il est important d’ajouter des mesures d’atténuation des risques dans votre application pour garantir une utilisation sécurisée du Chat Markup Language.

Nous vous recommandons d’empêcher les utilisateurs finaux d’inclure des jetons spéciaux dans leur entrée, tels que <|im_start|> et <|im_end|>. Nous vous recommandons également d’inclure une validation supplémentaire pour vous assurer que les prompts que vous envoyez au modèle sont bien formées et qu’elles respectent le format du Chat Markup Language, comme décrit dans ce document.

Vous pouvez également fournir des instructions dans le message système pour guider le modèle sur la façon de répondre à certains types d’entrées utilisateur. Par exemple, vous pouvez demander au modèle de ne répondre qu’aux messages portant sur un sujet bien défini. Vous pouvez également renforcer ce comportement en fournissant quelques exemples d’essais.

Gestion des conversations

La limite de jeton pour gpt-35-turbo est de 4096 jetons. Cette limite inclut le nombre de jetons utilisés pour la prompt et la réponse à cette prompt. Le nombre de jetons dans la prompt combiné à la valeur du paramètre max_tokens doit rester inférieur à 4096, sinon cela provoquera une erreur.

Il vous incombe de veiller à ce que la quantité de jetons utilisés pour la prompt et la réponse ne dépasse pas la limite fixée. Cela signifie que pour les conversations plus longues, vous devez suivre attentivement le nombre de jetons et envoyer uniquement au modèle une prompt qui respecte la limite du nombre de jetons.

L’exemple de code suivant présente un exemple simple de la manière dont vous pouvez suivre les différents messages dans la conversation.

import os
import openai
openai.api_type = "azure"
openai.api_base = "https://{your-resource-name}.openai.azure.com/" #This corresponds to your Azure OpenAI resource's endpoint value
openai.api_version = "2024-02-01" 
openai.api_key = os.getenv("OPENAI_API_KEY")

# defining a function to create the prompt from the system message and the conversation messages
def create_prompt(system_message, messages):
    prompt = system_message
    for message in messages:
        prompt += f"\n<|im_start|>{message['sender']}\n{message['text']}\n<|im_end|>"
    prompt += "\n<|im_start|>assistant\n"
    return prompt

# defining the user input and the system message
user_input = "<your user input>" 
system_message = f"<|im_start|>system\n{'<your system message>'}\n<|im_end|>"

# creating a list of messages to track the conversation
messages = [{"sender": "user", "text": user_input}]

response = openai.Completion.create(
    engine="gpt-35-turbo", # The deployment name you chose when you deployed the GPT-35-Turbo model.
    prompt=create_prompt(system_message, messages),
    temperature=0.5,
    max_tokens=250,
    top_p=0.9,
    frequency_penalty=0,
    presence_penalty=0,
    stop=['<|im_end|>']
)

messages.append({"sender": "assistant", "text": response['choices'][0]['text']})
print(response['choices'][0]['text'])

Respecter la limite de jetons

L’approche la plus simple pour ne pas dépasser la limite de jetons consiste à supprimer les messages les plus anciens de la conversation lorsque vous atteignez la limite de jetons.

Vous pouvez choisir de toujours inclure autant de jetons que possible tout en restant sous la limite ou vous pouvez toujours inclure un nombre défini de messages précédents en supposant que ces messages restent dans la limite. Il est important de garder à l’esprit qu’une prompt longue entraîne une génération de réponse plus longue et plus coûteuse qu’une prompt courte.

Vous pouvez évaluer le nombre de jetons dans une chaîne en utilisant la bibliothèque Python tiktoken, comme indiqué ci-dessous.

import tiktoken 

cl100k_base = tiktoken.get_encoding("cl100k_base") 

enc = tiktoken.Encoding( 
    name="gpt-35-turbo",  
    pat_str=cl100k_base._pat_str, 
    mergeable_ranks=cl100k_base._mergeable_ranks, 
    special_tokens={ 
        **cl100k_base._special_tokens, 
        "<|im_start|>": 100264, 
        "<|im_end|>": 100265
    } 
) 

tokens = enc.encode( 
    "<|im_start|>user\nHello<|im_end|><|im_start|>assistant",  
    allowed_special={"<|im_start|>", "<|im_end|>"} 
) 

assert len(tokens) == 7 
assert tokens == [100264, 882, 198, 9906, 100265, 100264, 78191]

Étapes suivantes