Teilen über


Chat Markup Language – ChatML (Preview)

Wichtig

Die Verwendung von GPT-3.5-Turbo-Modellen mit dem Vervollständigungsendpunkt, wie in diesem Artikel beschrieben, bleibt in der Vorschau und ist nur mit der Version gpt-35-turbo (0301) möglich, die am 1. August 2024 eingestellt werden soll. Wir empfehlen dringend die Verwendung der GA Chatvervollständigungs-API/des -Endpunkts. Die Chatvervollständigungs-API ist die empfohlene Methode für die Interaktion mit den GPT-3.5-Turbo-Modellen. Die Chat Completion-API ist auch die einzige Möglichkeit, aus GPT-4-Modellen zuzugreifen.

Der folgende Codeschnipsel zeigt die einfachste Möglichkeit, das GPT-3.5-Turbo-Modell mit ChatML zu verwenden. Wenn Sie diese Modelle zum ersten Mal programmgesteuert verwenden, empfehlen wir Ihnen, mit Schnellstart: Erste Schritte mit GPT-35-Turbo und GPT-4 zu beginnen.

Hinweis

In der Azure OpenAI-Dokumentation werden GPT-3.5-Turbo und GPT-35-Turbo austauschbar verwendet. Der offizielle Name des Modells in OpenAI ist gpt-3.5-turbo, aber für Azure OpenAI ist aufgrund von Azure-spezifischen Zeicheneinschränkungen der zugrunde liegende Modellname 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'])

Hinweis

Die folgenden Parameter sind mit dem gpt-35-turbo-Modell nicht verfügbar: logprobs, best_ofund echo. Wenn Sie einen dieser Parameter festlegen, erhalten Sie eine Fehlermeldung.

Das Token <|im_end|> zeigt das Ende einer Nachricht an. Bei Verwendung von ChatML wird empfohlen, <|im_end|>-Token als Stoppsequenz einzuschließen, um sicherzustellen, dass das Modell die Generierung von Text beendet, wenn es das Ende der Nachricht erreicht.

Erwägen Sie, einen etwas höheren als den üblichen Wert für max_tokens festzulegen, z. B. 300 oder 500. Dadurch wird sichergestellt, dass das Modell die Generierung von Text nicht beendet, bevor es das Ende der Nachricht erreicht.

Versionsverwaltung der Modelle

Hinweis

gpt-35-turbo entspricht dem Modell gpt-3.5-turbo von OpenAI.

Im Gegensatz zu früheren GPT-3- und GPT-3.5-Modellen werden sowohl das Modell gpt-35-turbo als auch die Modelle gpt-4 und gpt-4-32k weiterhin aktualisiert. Beim Erstellen einer Bereitstellung dieser Modelle müssen Sie auch eine Modellversion angeben.

Auf unserer Seite Modelle finden Sie die Zeiten für die Einstellung der Unterstützung für diese Modelle.

Arbeiten mit der Chat Markup Language (ChatML)

Hinweis

OpenAI verbessert das GPT-35-Turbo-Modell weiterhin, und die mit dem Modell verwendete Chat Markup Language wird in Zukunft weiterentwickelt werden. Wir werden dieses Dokument mit den neuesten Informationen auf dem neuesten Stand halten.

OpenAI hat das GPT-35-Turbo-Modell für spezielle Token trainiert, die die verschiedenen Teile der Eingabeaufforderung voneinander abgrenzen. Die Eingabeaufforderung beginnt mit einer Systemnachricht, die zum Primen des Modells verwendet wird, gefolgt von einer Reihe von Nachrichten zwischen dem Benutzer und dem Assistenten.

Das Format einer einfachen ChatML-Eingabeaufforderung sieht wie folgt aus:

<|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 

Systemnachricht

Die Systemnachricht wird am Anfang der Eingabeaufforderung zwischen den Token <|im_start|>system und <|im_end|> eingeschlossen. Diese Nachricht enthält die ersten Anweisungen für das Modell. Sie können verschiedene Informationen in der Systemnachricht angeben, darunter:

  • Eine kurze Beschreibung des Assistenten
  • Persönlichkeitsmerkmale des Assistenten
  • Anweisungen oder Regeln, die der Assistent befolgen soll
  • Daten oder Informationen, die für das Modell benötigt werden, z. B. relevante Fragen aus FAQ

Sie können die Systemnachricht für Ihren Anwendungsfall anpassen oder lediglich eine einfache Systemnachricht einschließen. Die Systemnachricht ist optional, es wird jedoch empfohlen, mindestens eine einfache Nachricht einzuschließen, um die besten Ergebnisse zu erzielen.

Meldungen

Nach der Systemnachricht können Sie eine Reihe von Nachrichten zwischen dem Benutzer und dem Assistenten einschließen. Jede Nachricht sollte mit dem Token <|im_start|> beginnen, gefolgt von der Rolle (user oder assistant), und mit dem Token <|im_end|> enden.

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

Um eine Antwort aus dem Modell auszulösen, sollte die Eingabeaufforderung mit dem Token <|im_start|>assistant enden, das angibt, dass nun der Assistent reagieren muss. Sie können auch Nachrichten zwischen dem Benutzer und dem Assistenten in die Eingabeaufforderung einschließen, um Few-Shot-Learning zu verwenden.

Eingabeaufforderungsbeispiele

Im folgenden Abschnitt werden Beispiele für verschiedene Eingabeaufforderungsstile gezeigt, die Sie mit den GPT-35-Turbo- und GPT-4-Modellen verwenden können. Diese Beispiele sind nur ein Ausgangspunkt, und Sie können mit verschiedenen Eingabeaufforderungen experimentieren, um das Verhalten für Ihre eigenen Anwendungsfälle anzupassen.

Einfaches Beispiel

Wenn sich die GPT-35-Turbo- und GPT-4-Modelle ähnlich wie chat.openai.com verhalten sollen, können Sie eine einfache Systemnachricht wie „Der Assistent ist ein großes, von OpenAI trainiertes Sprachmodell.“ verwenden.

<|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

Beispiel mit Anweisungen

Für einige Szenarien möchten Sie dem Modell vielleicht zusätzliche Anweisungen geben, um Schutzmaßnahmen für die Möglichkeiten des Modells festzulegen.

<|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

Verwenden von Daten für die Schaffung einer gemeinsamen Basis

Sie können auch relevante Daten oder Informationen in die Systemnachricht einschließen, um dem Modell zusätzlichen Kontext für die Unterhaltung zu geben. Wenn Sie nur eine kleine Menge an Informationen einschließen müssen, können Sie sie in der Systemnachricht hart codieren. Wenn Sie über eine große Menge an Daten verfügen, die das Modell kennen sollte, können Sie Einbettungen oder ein Produkt wie Azure KI-Suche verwenden, um die relevantesten Informationen zur Abfragezeit abzurufen.

<|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

Few-Shot-Learning mit ChatML

Sie können dem Modell auch einige Few-Shot-Beispiele geben. Der Ansatz für Few-Shot-Learning hat sich aufgrund des neuen Eingabeaufforderungsformats geringfügig geändert. Sie können jetzt eine Reihe von Nachrichten als Few-Shot-Beispiele zwischen dem Benutzer und dem Assistenten in die Eingabeaufforderung einschließen. Diese Beispiele können verwendet werden, um Antworten auf häufige Fragen zu geben, um das Modell zu primen oder das Modell in bestimmten Verhaltensweisen zu trainieren.

Dies ist nur ein Beispiel dafür, wie Sie Few-Shot-Learning mit GPT-35-Turbo verwenden können. Sie können mit verschiedenen Ansätzen experimentieren, um zu ermitteln, was für Ihren Anwendungsfall am besten funktioniert.

<|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|>

Verwenden der Chat Markup Language für Nicht-Chat-Szenarien

ChatML wurde entwickelt, um die Verwaltung von mehrteiligen Unterhaltungen zu erleichtern, aber es eignet sich auch gut für Nicht-Chat-Szenarien.

Für ein Entitätsextraktionsszenario können Sie beispielsweise die folgende Eingabeaufforderung verwenden:

<|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

Verhindern unsicherer Benutzereingaben

Es ist wichtig, Entschärfungen in Ihrer Anwendung hinzuzufügen, um die sichere Verwendung der Chat Markup Language zu gewährleisten.

Wir empfehlen Ihnen, Endbenutzer daran zu hindern, spezielle Token in ihre Eingabe einschließen zu können, z. B. <|im_start|> und <|im_end|>. Wir empfehlen Ihnen außerdem, eine zusätzliche Validierung einzuschließen, um sicherzustellen, dass die Eingabeaufforderungen, die Sie an das Modell senden, ordnungsgemäß formatiert sind und dem in diesem Dokument beschriebene Chat Markup Language-Format entsprechen.

Sie können in der Systemnachricht dem Modell auch Anweisungen geben, wie es auf bestimmte Arten von Benutzereingaben reagieren soll. Beispielsweise können Sie das Modell anweisen, nur auf Nachrichten zu einem bestimmten Betreff zu antworten. Sie können dieses Verhalten auch mit Few-Shot-Beispielen verstärken.

Verwalten von Unterhaltungen

Das Tokenlimit für gpt-35-turbo beträgt 4096 Token. Dieses Limit umfasst die Tokenanzahl sowohl von der Eingabeaufforderung als auch von der Vervollständigung. Die Anzahl der Token in der Eingabeaufforderung in Kombination mit dem Wert des Parameters max_tokens muss unter 4096 bleiben, sonst erhalten Sie eine Fehlermeldung.

Es liegt in Ihrer Verantwortung, sicherzustellen, dass die Eingabeaufforderung und die Vervollständigung innerhalb des Tokenlimits liegen. Dies bedeutet, dass Sie für längere Unterhaltungen die Tokenanzahl nachverfolgen und dem Modell nur eine Eingabeaufforderung senden müssen, die innerhalb des Tokenlimits liegt.

Das folgende Codebeispiel zeigt ein einfaches Beispiel, wie Sie die separaten Nachrichten in der Unterhaltung nachverfolgen können.

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'])

Einhalten des Tokenlimits

Der einfachste Ansatz, um unter dem Tokenlimit zu bleiben, besteht darin, die ältesten Nachrichten in der Unterhaltung zu entfernen, wenn Sie das Tokenlimit erreichen.

Sie haben die Möglichkeit, immer so viele Token wie möglich einzuschließen, während sie unter dem Limit bleiben, oder immer eine festgelegte Anzahl früherer Nachrichten einzuschließen, vorausgesetzt, diese Nachrichten bleiben innerhalb des Limits. Es ist wichtig zu beachten, dass längere Eingabeaufforderungen länger dauern, um eine Antwort zu generieren, und höhere Kosten verursachen als kürzere Eingabeaufforderungen.

Sie können die Anzahl der Token in einer Zeichenfolge mithilfe der Python-Bibliothek tiktoken schätzen, wie unten gezeigt.

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]

Nächste Schritte