Freigeben über


Arbeiten mit Chatvervollständigungsmodellen

Chatmodelle sind Sprachmodelle, die für Unterhaltungsschnittstellen optimiert sind. Die Modelle verhalten sich anders als die älteren GPT-3-Modelle. Frühere Modelle basierten auf Textein- und -ausgabe. Das bedeutet, dass die Modelle eine Promptzeichenfolge akzeptierten und eine Vervollständigung zurückgaben, die an den Prompt angefügt werden konnte. Die neuesten Modelle basieren jedoch auf der Eingabe einer Unterhaltung und der Ausgabe einer Nachricht. Die Modelle erwarten Eingaben in einem bestimmten chatähnlichen Transkriptformat. Sie geben eine Vervollständigung zurück, die eine vom Modell geschriebene Nachricht im Chat darstellt. Dieses Format wurde speziell für mehrteilige Unterhaltungen entwickelt, kann aber auch gut für andere Szenarien als Chats verwendet werden.

Dieser Artikel führt Sie durch die ersten Schritte mit Chatvervollständigungsmodellen. Um die besten Ergebnisse zu erzielen, verwenden Sie die hier beschriebenen Verfahren. Versuchen Sie nicht, auf die gleiche Weise wie bei der älteren Modellreihe mit den Modellen zu interagieren, da die Antworten der Modelle oft ausführlich und weniger nützlich sind.

Arbeiten mit Chatvervollständigungsmodellen

Der folgende Codeschnipsel zeigt die einfachste Methode für die Interaktion mit Modellen, die die Chatvervollständigungs-API verwenden. Wenn Sie diese Modelle zum ersten Mal programmgesteuert verwenden, wird empfohlen, mit dem Schnellstart für die Chatvervollständigung zu beginnen.

import os
from openai import OpenAI

client = OpenAI(
  api_key = os.getenv("AZURE_OPENAI_API_KEY"),  
  base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/"
)

response = client.chat.completions.create(
    model="gpt-4o", # 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.

Jede Antwort enthält einen finish_reason. Die möglichen Werte für finish_reason lauten wie folgt:

  • stop: Die API hat die vollständige Modellausgabe zurückgegeben.
  • length: unvollständige Modellausgabe aufgrund des max_tokens-Parameters oder des Tokengrenzwerts
  • content_filter: Aufgrund eines Flags aus den Inhaltsfiltern wurde Inhalt ausgelassen.
  • null: Die API-Antwort ist noch in Bearbeitung oder unvollständig.

Erwägen Sie die Einstellung max_tokens auf einen etwas höheren Wert als normal. Durch einen höheren Wert wird sichergestellt, dass das Modell die Generierung von Text nicht beendet, bevor es das Ende der Nachricht erreicht.

Arbeiten mit der Chatvervollständigungs-API

OpenAI trainierte Chatabschlussmodelle, um Eingaben zu akzeptieren, die als Unterhaltung formatiert sind. Der Nachrichtenparameter akzeptiert ein Array von Nachrichtenobjekten mit einer nach Rolle organisierten Unterhaltung. Bei Verwendung der Python-API wird eine Liste von Wörterbüchern verwendet.

Eine einfachen Chatvervollständigung weist folgendes Format auf:

{"role": "system", "content": "Provide some context and/or instructions to the model"},
{"role": "user", "content": "The users messages goes here"}

Eine Unterhaltung mit einer Beispielantwort gefolgt von einer Frage würde wie folgt aussehen:

{"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."}

Systemrolle

Die Systemrolle, die auch als Systemnachricht bezeichnet wird, ist am Anfang des Arrays enthalten. Diese Nachricht enthält die ersten Anweisungen für das Modell. Sie können verschiedene Informationen in der Systemrolle angeben, z. B.:

  • 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 den FAQ

Sie können die Systemrolle an Ihren Anwendungsfall anpassen oder lediglich grundlegende Anweisungen einschließen. Die Systemrolle bzw. -nachricht ist optional. Um die besten Ergebnisse zu erzielen, wird jedoch empfohlen, mindestens eine einfache Nachricht einzuschließen.

Meldungen

Nach der Systemrolle können Sie verschiedene Nachrichten zwischen user und assistant einschließen.

 {"role": "user", "content": "What is thermodynamics?"}

Um eine Antwort des Modells auszulösen, sollten Sie mit einer Benutzernachricht enden, die angibt, dass nun der Assistent antworten soll. Sie können auch verschiedene Beispielnachrichten zwischen Benutzer/Benutzerin und Assistent einschließen, um Few-Shot-Learning zu verwenden.

Beispiele für Nachrichteneingabeaufforderungen

Der folgende Abschnitt enthält Beispiele für verschiedene Formatvorlagen von Eingabeaufforderungen, die Sie mit Chatabschlussmodellen verwenden können. Diese Beispiele stellen lediglich einen Ausgangspunkt dar. Sie können mit verschiedenen Prompts experimentieren, um das Verhalten an Ihre eigenen Anwendungsfälle anzupassen.

Einfaches Beispiel

Wenn Sie möchten, dass sich Ihr Chatvervollständigungsmodell ähnlich wie chatgpt.com verhält, können Sie eine grundlegende Systemmeldung wie Assistant is a large language model trained by OpenAI. verwenden.

{"role": "system", "content": "Assistant is a large language model trained by OpenAI."},
{"role": "user", "content": "Who were the founders of Microsoft?"}

Beispiel mit Anweisungen

In einigen Szenarien möchten Sie dem Modell vielleicht weitere Anweisungen geben, um Schutzmaßnahmen für die Möglichkeiten des Modells festzulegen.

{"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?"}

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

{"role": "system", "content": "Assistant is an intelligent chatbot designed to help users answer technical questions about Azure OpenAI in Azure AI 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-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."
},
{"role": "user", "content": "What is Azure OpenAI?"}

Few-Shot-Learning mit Chatvervollständigung

Sie können dem Modell auch einige Few-Shot-Stichproben bereitstellen. Der Ansatz für Few-Shot-Learning hat sich aufgrund des neuen Promptformats geringfügig geändert. Sie können jetzt eine Reihe von Nachrichten als Few-Shot-Stichproben zwischen Benutzer/Benutzerin und Assistent in den Prompt einschließen. Diese Stichproben können Sie dazu verwende, Antworten auf häufige Fragen zu geben, das Modell vorzubereiten oder das Modell in bestimmten Verhaltensweisen zu trainieren.

In diesem Beispiel wird gezeigt, wie Sie Few-Shot-Learning mit GPT-35-Turbo und GPT-4 verwenden. Sie können mit verschiedenen Ansätzen experimentieren, um zu ermitteln, was für Ihren Anwendungsfall am besten funktioniert.

{"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"}

Verwenden der Chatvervollständigung in anderen Szenarien als Chats

Die Chatvervollständigungs-API ist für mehrteilige Unterhaltungen konzipiert, eignet sich aber auch gut in Nicht-Chat-Szenarien.

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

{"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?"}

Erstellen einer einfachen Unterhaltungsschleife

Die bisherigen Beispiele veranschaulichten die grundlegende Interaktion mit der Chatvervollständigungs-API. Dieses Beispiel zeigt, wie Sie eine Unterhaltungsschleife erstellen, die die folgenden Aktionen ausführt:

  • Sie akzeptiert kontinuierlich Konsoleneingaben und formatiert sie korrekt als Teil der Nachrichtenliste als Inhalt der Benutzerrolle.
  • Sie gibt Antworten aus, die an die Konsole ausgegeben, formatiert und der Nachrichtenliste als Inhalt der Assistentenrolle hinzugefügt werden.

Bei jeder neuen gestellten Frage wird ein fortlaufendes Transkript der bisherigen Unterhaltung zusammen mit der neuesten Frage gesendet. Da das Modell keinen Speicher hat, müssen Sie mit jeder neuen Frage ein aktualisiertes Transkript senden. Andernfalls verliert das Modell den Kontext der vorherigen Fragen und Antworten.

import os
from openai import OpenAI

client = OpenAI(
  api_key = os.getenv("AZURE_OPENAI_API_KEY"),  
  base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/"
)

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="gpt-4o", # model = "deployment_name".
        messages=conversation
    )

    conversation.append({"role": "assistant", "content": response.choices[0].message.content})
    print("\n" + response.choices[0].message.content + "\n")

Wenn Sie obigen Code ausführen, erhalten Sie ein leeres Konsolenfenster. Geben Sie Ihre erste Frage in das Fenster ein, und drücken Sie dann die Enter-Taste. Nachdem die Antwort zurückgegeben wurde, können Sie den Prozess wiederholen und weitere Fragen stellen.

Verwalten von Unterhaltungen

Das vorherige Beispiel wird ausgeführt, bis Sie den Tokengrenzwert des Modells erreichen. Bei jeder gestellten und empfangenen Frage wächst die Liste messages. Die Tokengrenze für Chatabschlussmodelle variiert je nach Modell und Version. Die Tokengrenzwerte für gpt-4 und gpt-4-32k sind 8.192 bzw. 32.768. Zu diesen Grenzwerten gehören die Tokenanzahl sowohl aus der gesendeten Nachrichtenliste als auch aus der Modellantwort. Die Anzahl der Token in der Nachrichtenliste muss zusammen mit dem Wert des max_tokens-Parameters unter diesen Grenzwerten bleiben. Andernfalls wird eine Fehlermeldung ausgegeben. Lesen Sie die Modellseite für die einzelnen Modelltokenbeschränkungen/Kontextfenster.

Es liegt in Ihrer Verantwortung sicherzustellen, dass der Prompt und die Vervollständigung innerhalb des Tokengrenzwerts liegen. Dies bedeutet, dass Sie für längere Unterhaltungen die Tokenanzahl nachverfolgen müssen und nur einen Prompt, der innerhalb des Grenzwerts liegt, an das Modell senden dürfen. Alternativ können Sie mithilfe der Antwort-API das automatische Abschneiden oder Verwalten des Gesprächsverlaufs der API überlassen.

Hinweis

Es wird dringend empfohlen, den Grenzwert für dokumentierte Eingabetoken für alle Modelle einzuhalten, auch wenn Sie feststellen, dass Sie diesen Grenzwert überschreiten können.

Das folgende Codebeispiel zeigt eine einfache Chatschleife mit einer Technik zum Verarbeiten von 4.096 Token mithilfe der tiktoken-Bibliothek von OpenAI.

Der Code verwendet tiktoken 0.5.1. Falls Sie über eine ältere Version verfügen, führen Sie pip install tiktoken --upgrade aus.

import tiktoken
import os
from openai import OpenAI

client = OpenAI(
  api_key = os.getenv("AZURE_OPENAI_API_KEY"),  
  base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/"
)

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-3.5-turbo-0613"):
    """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 cl100k_base encoding.")
        encoding = tiktoken.get_encoding("cl100k_base")
    if model in {
        "gpt-3.5-turbo-0613",
        "gpt-3.5-turbo-16k-0613",
        "gpt-4-0314",
        "gpt-4-32k-0314",
        "gpt-4-0613",
        "gpt-4-32k-0613",
        }:
        tokens_per_message = 3
        tokens_per_name = 1
    elif model == "gpt-3.5-turbo-0301":
        tokens_per_message = 4  # every message follows <|start|>{role/name}\n{content}<|end|>\n
        tokens_per_name = -1  # if there's a name, the role is omitted
    elif "gpt-3.5-turbo" in model:
        print("Warning: gpt-3.5-turbo may update over time. Returning num tokens assuming gpt-3.5-turbo-0613.")
        return num_tokens_from_messages(messages, model="gpt-3.5-turbo-0613")
    elif "gpt-4" in model:
        print("Warning: gpt-4 may update over time. Returning num tokens assuming gpt-4-0613.")
        return num_tokens_from_messages(messages, model="gpt-4-0613")
    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  # every reply is primed with <|start|>assistant<|message|>
    return num_tokens
while True:
    user_input = input("Q:")      
    conversation.append({"role": "user", "content": user_input})
    conv_history_tokens = num_tokens_from_messages(conversation)

    while conv_history_tokens + max_response_tokens >= token_limit:
        del conversation[1] 
        conv_history_tokens = num_tokens_from_messages(conversation)

    response = client.chat.completions.create(
        model="gpt-35-turbo", # model = "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")

In diesem Beispiel werden nach dem Erreichen der Tokenanzahl die ältesten Nachrichten im Unterhaltungstranskript entfernt. Aus Gründen der Effizienz wird del anstelle von pop() verwendet. Sie beginnen mit Index 1, damit die Systemnachricht immer beibehalten wird und nur Benutzer- oder Assistentennachrichten entfernt werden. Im Lauf der Zeit kann diese Methode der Unterhaltungsverwaltung dazu führen, dass die Qualität der Unterhaltung abnimmt, da das Modell den Kontext der früheren Teile der Unterhaltung nach und nach verliert.

Ein alternativer Ansatz besteht darin, die Dauer der Unterhaltung auf die maximale Tokenlänge oder eine bestimmte Anzahl von Runden zu beschränken. Nachdem der maximale Tokengrenzwert erreicht wurde, verliert das Modell den Kontext, wenn Sie zulassen, dass die Unterhaltung fortgesetzt werden kann. Sie können die Benutzer oder Benutzerinnen auffordern, eine neue Unterhaltung zu beginnen und die Nachrichtenliste zu löschen, um eine neue Unterhaltung mit dem vollständigen verfügbaren Tokengrenzwert zu beginnen.

Der Tokenzählungsteil des zuvor gezeigten Codes ist eine vereinfachte Version eines der OpenAI-Cookbookbeispiele.

Problembehandlung

Fehler beim Erstellen des Abschlusses, da das Modell eine ungültige Unicode-Ausgabe generiert hat

Fehlercode Fehlermeldung Problemumgehung
500 500 - InternalServerError: Fehlercode: 500 - {'error': {'message': 'Fehler beim Erstellen des Abschlusses, da das Modell eine ungültige Unicode-Ausgabe generiert hat}}. Sie können das Auftreten dieser Fehler minimieren, indem Sie die Temperatur Ihrer Eingabeaufforderungen auf weniger als 1 reduzieren und sicherstellen, dass Sie einen Client mit Wiederholungslogik verwenden. Die erneute Aktualisierung der Anforderung führt häufig zu einer erfolgreichen Antwort.

Nächste Schritte