Arbeiten mit den GPT-3.5-Turbo- und GPT-4-Modellen

Die GPT-3.5-Turbo- und GPT-4-Modelle sind Sprachmodelle, die für Konversationsschnittstellen 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 GPT-3.5-Turbo- und GPT-4-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 den GPT-3.5-Turbo- und GPT-4-Modellen. 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 den GPT-3.5-Turbo- und GPT-4-Modellen

Der folgende Codeschnipsel zeigt die einfachste Möglichkeit zum Verwenden der GPT-3.5-Turbo- und GPT-4-Modelle mit der Chatvervollständigungs-API. Wenn Sie diese Modelle zum ersten Mal programmgesteuert verwenden, wird empfohlen, mit dem Schnellstart für GPT-3.5-Turbo und GPT-4 zu beginnen.

Hinweis

In der Azure OpenAI-Dokumentation werden GPT-3.5-Turbo und GPT-35-Turbo synonym verwendet. Der offizielle Name des Modells in OpenAI lautet gpt-3.5-turbo. Bei Azure OpenAI lautet der zugrunde liegende Modellname aufgrund von Azure-spezifischen Zeicheneinschränkungen gpt-35-turbo.

import os
from openai import AzureOpenAI

client = AzureOpenAI(
  api_key = os.getenv("AZURE_OPENAI_API_KEY"),  
  api_version = "2024-02-01",
  azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")
)

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

Hinweis

Die folgenden Parameter sind bei den neuen GPT-35-Turbo- und GPT-4-Modellen nicht verfügbar: logprobs, best_of und echo. Wenn Sie einen dieser Parameter festlegen, erhalten Sie eine Fehlermeldung.

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, einen etwas höheren als den üblichen Wert für max_tokens festzulegen, z. B. 300 oder 500. Durch einen höheren Wert wird sichergestellt, dass das Modell die Generierung von Text nicht beendet, bevor es das Ende der Nachricht erreicht.

Versionsverwaltung der Modelle

Hinweis

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

Im Gegensatz zu früheren GPT-3- und GPT-3.5-Modellen werden sowohl das gpt-35-turbo-Modell 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 der Seite Modelle finden Sie die Zeiten für die Einstellung der Unterstützung für diese Modelle.

Arbeiten mit der Chatvervollständigungs-API

OpenAI hat die GPT-35-Turbo- und GPT-4-Modelle dafür trainiert, als Unterhaltung formatierte Eingaben zu akzeptieren. 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.

Nachrichten

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

Im folgenden Abschnitt werden Beispiele für verschiedene Promptstile gezeigt, die Sie mit den GPT-35-Turbo- und GPT-4-Modellen 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 das GPT-35-Turbo-Modell ähnlich wie chat.openai.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 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."
},
{"role": "user", "content": "What is Azure OpenAI Service?"}

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 AzureOpenAI

client = AzureOpenAI(
  api_key = os.getenv("AZURE_OPENAI_API_KEY"),  
  api_version = "2024-02-01",
  azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")  # Your Azure OpenAI resource's endpoint value.
)

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-35-turbo", # 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. Mit jeder gestellten Frage und jeder empfangenen Antwort nimmt die messages-Liste an Größe zu. Der Tokengrenzwert für gpt-35-turbo beträgt 4.096 Token. Die Tokengrenzwerte für gpt-4 und gpt-4-32k betragen 8.192 bzw. 32.768 Token. Diese Grenzwerte umfassen die Tokenanzahl der gesendeten Nachrichtenliste und 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.

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.

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 AzureOpenAI

client = AzureOpenAI(
  api_key = os.getenv("AZURE_OPENAI_API_KEY"),  
  api_version = "2024-02-01",
  azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")  # Your Azure OpenAI resource's endpoint value.
)

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 zuvor gezeigte Teil des Codes, der die Token zählt, ist eine vereinfachte Version eines der OpenAI-Cookbookbeispiele.

Problembehandlung

Hier finden Sie einen Tipp zur Problembehandlung.

Verwenden Sie keine ChatML-Syntax oder spezielle Token mit dem Endpunkt für Chatvervollständigungen

Einige Kunden und Kundinnen versuchen, die ältere ChatML-Syntax mit den Endpunkten für die Chatvervollständigung und neueren Modellen zu verwenden. ChatML war eine Previewfunktion, die nur mit dem Legacy-Vervollständigungsendpunkt mit dem gpt-35-turbo-Modell Version 0301 funktionierte. Dieses Modell wurde eingestellt. Wenn Sie versuchen, ChatML-Syntax mit neueren Modellen und dem Endpunkt für die Chatvervollständigung zu verwenden, kann dies zu Fehlern und unerwartetem Modellantwortverhalten führen. Die Verwendung wird nicht empfohlen. Dieses Problem kann auch auftreten, wenn allgemeine spezielle Token verwendet werden.

Fehlercode Fehlermeldung Lösung
400 400: „Fehler beim Generieren der Ausgabe aufgrund spezieller Token in der Eingabe.“ Ihre Eingabeaufforderung enthält spezielle Token oder ältere ChatML-Token, die vom Modell/Endpunkt nicht erkannt oder unterstützt werden. Stellen Sie sicher, dass Ihr Eingabeaufforderungs-/Nachrichtenarray keine älteren ChatML-Token/spezielle Token enthält. Wenn Sie ein Upgrade von einem Legacymodell durchführen, schließen Sie alle speziellen Token aus, bevor Sie eine API-Anforderung an das Modell übermitteln.

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