1. Einführung in die Funktionsaufrufe

Im GPT-Modell bezieht sich die Funktion "Funktionsaufruf" darauf, dem Modell über eine API beschreibende Funktionen bereitzustellen, die es intelligent auswählen und ein JSON-Objekt mit Parametern für den Aufruf einer oder mehrerer Funktionen ausgeben lassen können. Es ist wichtig zu beachten, dass die Chat-Vervollständigungs-API keine Funktionen direkt ausführt, sondern JSON generiert, das zum Ausführen von Funktionen im Code verwendet werden kann.

Kurz gesagt beinhaltet die Funktion "Funktionsaufruf" das Bereitstellen einer Reihe von Funktionsdefinitionen (einschließlich Funktionsbeschreibungen und Parameterbeschreibungen) für das GPT-Modell. Das Modell entscheidet dann basierend auf der Anfrage des Benutzers, welche Funktion aufgerufen werden soll. Da das Modell keine externen Funktionen ausführen kann, kann es nur mit einer Anfrage antworten, welche Funktion aufgerufen werden soll (einschließlich der Funktionsaufrufparameter). Nachdem das Ergebnis der Anfrage des Modells erhalten wurde, führt unser Programm den Funktionsaufruf lokal aus. Das Ergebnis des Funktionsaufrufs wird dann mit der Eingabeaufforderung verbunden und zur weiteren Verarbeitung zurück an das Modell gesendet, bevor das endgültige Ergebnis an den Benutzer zurückgegeben wird.

2. Anwendungsszenarien des Funktionsaufrufs

Hier sind einige Beispiele für seine praktischen Anwendungen:

  • Erstellung eines Assistenten, der Fragen beantwortet, indem externe APIs aufgerufen werden, z.B. durch Definition von Funktionen wie send_email(to: string, body: string) oder get_current_weather(location: string, unit: 'celsius' | 'fahrenheit').
  • Umwandlung von natürlicher Sprache in API-Aufrufe, indem beispielsweise "Wer sind meine besten Kunden?" in get_customers(min_revenue: int, created_before: string, limit: int) übersetzt und dann ein interner API-Aufruf getätigt wird.
  • Extrahieren strukturierter Daten aus Text, wie z.B. die Definition von Funktionen wie extract_data(name: string, birthday: string) oder sql_query(query: string).

Durch die Nutzung der Funktion "Funktionsaufruf" können wir KI-Agenten implementieren, die mit unseren lokalen Systemen und Datenbanken interagieren, z.B. indem die KI das aktuelle Wetter abfragt, Aktienkurse überprüft, Essen bestellt oder Flüge bucht.

3. Modelle, die den Funktionsaufruf unterstützen

Nicht alle Versionen des Modells wurden mit Funktionsaufrufdaten trainiert. Derzeit unterstützen die Modelle gpt-4, gpt-4-turbo-preview, gpt-4-0125-preview, gpt-4-1106-preview, gpt-4-0613, gpt-3.5-turbo, gpt-3.5-turbo-1106 und gpt-3.5-turbo-0613 den Funktionsaufruf.

Des Weiteren unterstützen die Modelle gpt-4-turbo-preview, gpt-4-0125-preview, gpt-4-1106-preview und gpt-3.5-turbo-1106 parallele Funktionsaufrufe, die es ermöglichen, mehrere Funktionsaufrufe gleichzeitig auszuführen und diese Funktionsaufrufe gleichzeitig zu verarbeiten, um effektive und effiziente Ergebnisse zu erzielen.

Hinweis: Das potenzielle Risiko im Zusammenhang mit der Funktion "Funktionsaufruf" besteht darin, dass das Modell fehlerhafte Parameter (d.h. Phantomparameter) produzieren kann. Daher ist es ratsam, bevor Maßnahmen ergriffen werden, die sich auf die reale Welt auswirken (wie das Versenden von E-Mails, die Online-Veröffentlichung, den Einkauf usw.), auf Produktseite einen Benutzerbestätigungsprozess zu integrieren, um sicherzustellen, dass Funktionen nur nach Benutzerbestätigung ausgeführt werden.

4. Beispiele für Funktionsaufrufe

4.1 Python Beispiel

Die Implementierung des Funktionsaufrufs auf der OpenAI-Plattform folgt in der Regel den unten aufgeführten grundlegenden Schritten. Im Folgenden wird der gesamte Prozess anhand eines Python-Codebeispiels detailliert beschrieben, das sich auf die Abfrage des Wetters konzentriert.

Schritt 1: Vorbereiten von aufrufbaren Funktionen und Funktionsdefinitionen für das Modell

Zunächst müssen wir eine Funktion definieren, die vom GPT-Modell aufgerufen werden kann. Dies bedeutet in der Regel, dass wir unsere eigene Funktion vorbereiten müssen, die bestimmte Operationen basierend auf den Eingabeparametern durchführen kann, wie z.B. die Kommunikation mit einer API eines Drittanbieters.

import json

def get_current_weather(location, unit="fahrenheit"):
    return json.dumps({
        "location": location, 
        "temperature": "18", 
        "unit": unit
    })

Schritt 2: Modell basierend auf Abfrage und Tools-Parameter aufrufen

Als nächstes müssen wir das GPT-Modell über die Chat-Completion-API aufrufen und die Benutzerabfrage (z. B. "Wie ist das aktuelle Wetter") sowie den tools-Parameter übergeben, der die Beschreibung der gerade definierten get_current_weather-Funktion enthält.

from openai import OpenAI

client = OpenAI()

tools = [{
    "type": "function",
    "function": {
        "name": "get_current_weather",
        "description": "Das aktuelle Wetter für einen bestimmten Ort abrufen",
        "parameters": {
            "type": "object",
            "properties": {
                "location": {
                    "type": "string",
                    "description": "Stadtname, zum Beispiel: 'San Francisco, CA'"
                },
                "unit": {
                    "type": "string",
                    "enum": ["celsius", "fahrenheit"]
                }
            },
            "required": ["location"]
        }
    }
}]

response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": "Wie ist das aktuelle Wetter in San Francisco?"}],
    tools=tools
)

Schritt 3: Die Funktion lokal ausführen

Das vom Modell zurückgegebene Ergebnis wird Informationen über den Funktionsaufruf enthalten, die typischerweise im tool_calls-Antwortparameter enthalten sind. Basierend auf den im tool_calls-Parameter beschriebenen Funktionsaufrufsinformationen können wir dann den entsprechenden Funktionsaufruf lokal ausführen.

tool_calls = response.choices[0].message.tool_calls

if tool_calls:
    arguments = json.loads(tool_calls[0].function.arguments)
    weather_info = get_current_weather(**arguments)
    print(weather_info) # Hier können wir die vom Funktionsaufruf abgefragten Wetterinformationen sehen

Schritt 4: Das Modell erneut mit dem Funktionsergebnis aufrufen

Nun können wir das Funktionsergebnis als neue Nachricht an das Modell senden, damit das Modell diese Ergebnisse verarbeiten und eine auf den Benutzer zugeschnittene Antwort generieren kann.

follow_up_response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "user", "content": "Wie ist das aktuelle Wetter in San Francisco?"},
        {"role": "function", "name": "get_current_weather", "content": weather_info}
    ],
    tools=tools
)

Erklärung: In obigem Beispiel wird der Inhalt des Funktionsrückgabewerts über die Funktionsnachricht wie folgt an das GPT-Modell gesendet:

{"role": "function", "name": "get_current_weather", "content": weather_info}

In der Praxis können Sie auch einfach den Rückgabewert der Funktion als Referenzinhalt in die Systemnachrichten-Prompts stellen, damit die KI diesen beim Beantworten von Fragen berücksichtigen kann.

Schritt 5: Die endgültige Antwort des Modells erhalten

Abschließend können wir die endgültige Antwort des Modells abrufen und dem Benutzer zur Verfügung stellen. In diesem Schritt wird das Modell basierend auf den von uns bereitgestellten Wetterinformationen eine benutzerfreundliche Antwort ausgeben.

final_output = follow_up_response.choices[0].message.content
print(final_output) # Diese Ausgabe sind die Wetterinformationen, die wir dem Benutzer zeigen möchten

Durch die obigen Schritte haben wir ein vollständiges Beispiel zur Abfrage des Wetters mithilfe des GPT-Modells und von Funktionsaufrufen abgeschlossen.

4.2. Funktionsaufruferklärungsfunktion definieren

4.2.1 Bedeutung der Parameterfelder für "Tools"

Bei Aufruf einer Funktion musst du die relevanten Informationen der Funktion im tools-Parameter definieren. Der tools-Parameter ist ein Array, das mehrere Funktionsdefinitionen enthält. Jede Funktionsdefinition umfasst folgende Felder:

  1. type: Dieses Feld repräsentiert den Typ des Tools. Bei einem Funktionsaufruf sollte dieses Feld auf "function" gesetzt werden.
  2. function: Dieses Feld enthält detaillierte Informationen über die Funktion und ist ein Objekt mit den folgenden spezifischen Feldern:
    • name: Der Name der Funktion, der ein String ist.
    • description: Eine Beschreibung des Zwecks der Funktion, die dem Modell helfen kann, Parameter zu generieren, die den Benutzererwartungen entsprechen.
    • parameters: Beschreibt die Parameterdefinitionen der Funktion und ist ein Objekt, das die folgenden Unterfelder enthält:
      • type: Definiert den Typ des Parameters, der meistens auf "object" gesetzt werden sollte.

      • properties: Die spezifischen Definitionen jedes Funktionsparameters, wobei jede Parameterdefinition ein Objekt ist, das in der Regel die folgenden Unterfelder enthält:

        • type: Der Datentyp des Parameters (z. B. "string", "integer", "boolean", usw.).
        • description: Die Beschreibung des Parameters, um dem Modell seinen Zweck zu verdeutlichen.
        • enum (optional): Wenn type "string" ist, kann das Feld enum ein Array von Strings angeben, die die Menge gültiger Werte darstellen.
      • required: Ein Array von Strings, die die Namen der erforderlichen Parameter enthalten.

4.2.2 Beispiele für die Definition von Tools

Nun wollen wir einige Beispiele für tools-Definitionen bereitstellen, um zu verstehen, wie jedes Feld verwendet wird.

Beispiel 1: Aktuelle Wetterinformationen abrufen

{
    "type": "function",
    "function": {
        "name": "get_current_weather",
        "description": "Aktuelle Wetterinformationen für den angegebenen Ort abrufen",
        "parameters": {
            "type": "object",
            "properties": {
                "location": {
                    "type": "string",
                    "description": "Die Stadt, für die das Wetter abgefragt werden soll, z. B. 'San Francisco, CA'"
                },
                "unit": {
                    "type": "string",
                    "enum": ["celsius", "fahrenheit"],
                    "description": "Temperatureinheit, 'celsius' für Celsius, 'fahrenheit' für Fahrenheit"
                }
            },
            "required": ["location", "unit"]
        }
    }
}

In obigem Beispiel haben wir eine Funktion namens get_current_weather definiert, um das aktuelle Wetter an einem bestimmten Ort abzurufen. Die Parameter umfassen location und unit, wobei unit zwei gültige Werte hat: "celsius" (Celsius) und "fahrenheit" (Fahrenheit).

Beispiel 2: Alben eines bestimmten Künstlers finden

{
    "type": "function",
    "function": {
        "name": "find_artist_albums",
        "description": "Alle Alben für einen bestimmten Künstler finden",
        "parameters": {
            "type": "object",
            "properties": {
                "artist_name": {
                    "type": "string",
                    "description": "Der Name des Künstlers"
                }
            },
            "required": ["artist_name"]
        }
    }
}

In diesem Beispiel haben wir eine Funktion namens find_artist_albums erstellt, um alle Alben für einen bestimmten Künstler zu finden. Diese Funktion erfordert nur einen Parameter: artist_name (der Name des Künstlers).

4.3. Beispiel eines HTTP-Request Funktionsaufrufs

OpenAI bietet eine API, die über das HTTP-Protokoll zugänglich ist. Im Folgenden erklären wir, wie die Funktion Aufruffunktion über die HTTP-API genutzt wird. Entwickler anderer Programmiersprachen können sich an diesem Beispiel orientieren.

4.3.1. Schritt 1: Aufruf des Modells mit Benutzeranfrage und Funktionsdeklaration

Zunächst müssen wir die Benutzeranfrage und die Liste der von uns unterstützten Funktionen an das GPT-Modell senden, damit das Modell automatisch analysieren kann, welche Funktion basierend auf der Frage des Benutzers aufgerufen werden soll, um die Benutzeranfrage zu beantworten.

Im folgenden Beispiel teilen wir GPT mit, dass wir eine get_current_weather-Funktion haben, die verwendet werden kann, um Wetterinformationen für eine bestimmte Stadt abzufragen.

curl --location 'https://api.aiproxy.io/v1/chat/completions' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {OPENAI_KEY}' \
--data '{
    "model": "gpt-3.5-turbo",
    "messages": [
        {
            "role": "user",
            "content": "Wie ist das Wetter heute in Shanghai?"
        }
    ],
    "tools": [
        {
            "type": "function",
            "function": {
                "name": "get_current_weather",
                "description": "Aktuelle Wetterinformationen für den angegebenen Ort abrufen",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "location": {
                            "type": "string",
                            "description": "Die Stadt, für die das Wetter abgefragt werden soll, z.B. 'San Francisco, CA'"
                        },
                        "unit": {
                            "type": "string",
                            "enum": [
                                "celsius",
                                "fahrenheit"
                            ],
                            "description": "Temperatur-Einheit, 'celsius' für Celsius, 'fahrenheit' für Fahrenheit"
                        }
                    },
                    "required": [
                        "location",
                        "unit"
                    ]
                }
            }
        }
    ]
}'

Erklärung der Anfrageparameter:

{
    "model": "gpt-3.5-turbo", // Das aufzurufende GPT-Modell
    "messages": [ // Dies ist die Liste der Nachrichten für GPT, einschließlich der Benutzeranfrage
        {
            "role": "user",
            "content": "Wie ist das Wetter heute in Shanghai?"
        }
    ],
    "tools": [
	  // Hier ist Ihre Funktionsdefinition, die GPT über die verfügbaren Funktionen informiert
    ]
}

Siehe Abschnitt 4.2.2 zur Definition des tools-Parameters.

Bei der normalen Verarbeitung durch das GPT-Modell erhalten Sie eine API-Antwort ähnlich der folgenden:

{
    "model": "gpt-3.5-turbo-0613",
    "object": "chat.completion",
    "usage": {
        "prompt_tokens": 122,
        "completion_tokens": 27,
        "total_tokens": 149
    },
    "id": "chatcmpl-8mL4hS4zNMocyR2ajKyAvSTcbNaao",
    "created": 1706531447,
    "choices": [
        {
            "index": 0,
            "delta": null,
            "message": {
                "role": "assistant",
                "tool_calls": [ // Die `tool_calls`-Parameter repräsentieren die Liste der Funktionen, die GPT aufrufen möchte
                    {
                        "id": "call_1iF09ttX1R9ESR18Ul2nLe1R",
                        "type": "function",
                        "function": {
                            "name": "get_current_weather",  // Zeigt an, dass GPT die Benutzeranfrage beantworten möchte, indem die `get_current_weather`-Funktion aufgerufen wird
                            "arguments": "{\n  \"location\": \"Shanghai, China\",\n  \"unit\": \"celsius\"\n}" // Dies sind die Eingabeparameter für den Aufruf der `get_current_weather`-Funktion
                        }
                    }
                ]
            },
            "finish_reason": "tool_calls"
        }
    ]
}

4.3.2. Schritt 2: Lokaler Funktionsaufruf und Ausführung

Da das GPT-Modell selbst keine spezifischen Funktionsaufrufe ausführen kann und uns nur darüber informiert, welche Funktion es aufrufen möchte, muss unser lokales Programm den spezifischen Funktionsaufruf basierend auf dem vom Modell zurückgegebenen tool_calls-Parameter ausführen. Die Art der Ausführung lokaler Funktionen variiert in verschiedenen Programmiersprachen. In Python können Sie beispielsweise auf den vorherigen Abschnitt verweisen.

4.3.3. Schritt 3: Rufen Sie das Modell erneut mit dem Rückgabewert der Funktion auf

Da der Funktionsaufruf lokal ausgeführt wird, müssen wir das Ergebnis der Funktionsausführung und die Frage des Benutzers zurück an das GPT-Modell übergeben, um die endgültige Antwort zu erhalten.

curl --location 'https://api.aiproxy.io/v1/chat/completions' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer sk-Roc5MX1zEuVxiuaMaETV6wZ2jXcCehjUCzwP9AcNErUiwppQ' \
--data '{
    "model": "gpt-3.5-turbo",
    "messages": [
        {
            "role": "user",
            "content": "Wie ist das Wetter heute in Shanghai?"
        },
        {
            "role": "function",
            "name": "get_current_weather",
            "content": "{\"city\":\"Shanghai\", \"temperature\":\"25 Grad Celsius\"}"
        }
    ],
    "tools": [
        {
            "type": "function",
            "function": {
                "name": "get_current_weather",
                "description": "Holen Sie die aktuellen Wetterinformationen für den angegebenen Ort",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "location": {
                            "type": "string",
                            "description": "Die Stadt, für die das Wetter abgefragt werden soll, z.B. 'San Francisco, CA'"
                        },
                        "unit": {
                            "type": "string",
                            "enum": [
                                "celsius",
                                "fahrenheit"
                            ],
                            "description": "Die Einheit der Temperatur, 'celsius' für Celsius, 'fahrenheit' für Fahrenheit"
                        }
                    },
                    "required": [
                        "location",
                        "unit"
                    ]
                }
            }
        }
    ]
}'

Hinweis: Die obige Anfrage enthält eine zusätzliche Funktionsnachricht, um das GPT-Modell über den Rückgabewert der Funktion zu informieren. GPT beantwortet die Benutzerfrage direkt auf der Grundlage der Rückkehrinformationen der Funktion und ruft die Funktion nicht erneut auf.

Die Funktionsnachricht stellt den Rückgabewert der Funktion dar und folgt dem folgenden Format:

{
    "role": "function", // Nachrichtentyp ist Funktion, was darauf hinweist, dass es sich um den Rückgabewert der Funktion handelt
    "name": "get_current_weather", // Informiert GPT, dass die aktuelle Nachricht der Rückgabewert der Funktion get_current_weather ist
    "content": "{\"city\":\"Shanghai\", \"temperature\":\"25 Grad Celsius\"}" // Rückgabeinhalt der Funktion, kann im JSON-Format oder in anderem Textinhalt vorliegen.
}

Nachstehend die endgültige Antwort, die von GPT generiert wurde:

{
    "model": "gpt-3.5-turbo-0613",
    "object": "chat.completion",
    "usage": {
        "prompt_tokens": 144,
        "completion_tokens": 17,
        "total_tokens": 161
    },
    "id": "chatcmpl-8mLmvvKAjSql7rGF8fvQeddKhWYvr",
    "created": 1706534189,
    "choices": [
        {
            "index": 0,
            "delta": null,
            "message": {
                "role": "assistant",
                "content": "Das Wetter in Shanghai beträgt heute 25 Grad Celsius."
            },
            "finish_reason": "stop"
        }
    ]
}