Start KI-Lösungen Fertige Lösungen Peers & Simulation RAG & Retrieval Use Cases Frameworks Blog English Kontakt
Zurück zum Blog

Function Calling: Von freiem Text zu strukturierten Werkzeugaufrufen

OpenAI hat GPT-4 und GPT-3.5 am 13. Juni 2023 um Function Calling erweitert. Wir erklären, was der neue functions-Parameter ermöglicht — Werkzeuge, strukturierte Extraktion, erste Agenten-Schleifen —, wie der Aufrufzyklus funktioniert und wo er scheitert: halluzinierte Argumente, nicht erzwungene Schemata, Prompt Injection. Mit Validierungsmustern für den Produktionsbetrieb.

Die Lücke zwischen Text und Struktur

Sprachmodelle erzeugen Text. Anwendungen brauchen Struktur. Bis vor einem Monat überbrückte jede produktive Integration von GPT-4 oder GPT-3.5 diese Lücke mit Prompt Engineering: Man wies das Modell an, ausschließlich mit JSON zu antworten, und hat dann geparst, repariert und wiederholt. Die Fehlerbilder waren konstant: Markdown-Zäune um die Nutzlast, überzählige Kommata, erklärende Prosa vor dem Objekt, ein umbenanntes Feld bei jedem zwanzigsten Aufruf. Robuste Parser und Retry-Schleifen halfen, doch die Schnittstelle selbst blieb eine informelle Konvention.

Für Werkzeugnutzung galt dieselbe Lücke. ReAct (Yao et al., Oktober 2022) zeigte, dass ein Modell Denkschritte mit Aktionen verschränken kann. Toolformer (Schick et al., Februar 2023) zeigte, dass Modelle lernen können, API-Aufrufe in Text einzufügen. In der Praxis extrahierten Entwickler Zeilen wie `Action: search[...]` per regulärem Ausdruck aus freien Completions. Dieser Ansatz ist konstruktionsbedingt fragil.

Aufgabeziel Agentplanen · entscheiden Toolapi · mcp Ergebnisgeprüft
Eine Aufgabe kommt an — der Agent plant den nächsten Schritt. 1/4

Was OpenAI am 13. Juni 2023 auslieferte

Am 13. Juni 2023 hat OpenAI Function Calling in die Chat-Completions-API aufgenommen. Es gibt zwei neue Request-Parameter: `functions`, eine Liste von Funktionsdefinitionen als JSON Schema, und `function_call`, mit dem sich der Aufruf einer bestimmten Funktion erzwingen lässt. Zwei neue Modell-Snapshots verstehen sie: `gpt-4-0613` und `gpt-3.5-turbo-0613`. Beide sind auf zwei Aufgaben feinjustiert: zu erkennen, wann eine Funktion aufgerufen werden sollte, und ein JSON-Objekt mit den zugehörigen Argumenten auszugeben.

Dieselbe Ankündigung brachte `gpt-3.5-turbo-16k` mit einem Kontextfenster von 16.384 Tokens, senkte die Preise für Eingabe-Tokens von `gpt-3.5-turbo` um 25 Prozent und den Preis des Embedding-Modells `text-embedding-ada-002` um 75 Prozent. Die stabilen Aliasse `gpt-4` und `gpt-3.5-turbo` zeigen seit dem 27. Juni auf die 0613-Snapshots.

ModellKontextfensterEingabe je 1K TokensAusgabe je 1K Tokens
gpt-3.5-turbo-06134.096 Tokens0,0015 USD0,002 USD
gpt-3.5-turbo-16k16.384 Tokens0,003 USD0,004 USD
gpt-4-06138.192 Tokens0,03 USD0,06 USD

Der Ablauf eines Function Calls

Die Mechanik ist eine Schleife. Schritt eins: Sie senden die Konversation samt Funktionsdefinitionen. Entscheidet sich das Modell für einen Aufruf, kommt die Antwort mit `finish_reason: "function_call"`; die Nachricht enthält den Funktionsnamen und die Argumente als JSON-String, `content` ist null. Schritt zwei: Ihr Code führt die Funktion aus. Schritt drei: Sie hängen das Ergebnis als Nachricht mit der Rolle `function` an und rufen die API erneut auf. Das Modell antwortet dann dem Nutzer oder fordert den nächsten Aufruf an.

Diese Arbeitsteilung ist der Kern. Das Modell führt nichts aus. Es schlägt einen Aufruf vor; die Anwendung entscheidet, ob er ausgeführt wird. Autorisierung, Rate Limits, Timeouts und Fehlerbehandlung bleiben in gewöhnlichem Code, den Sie testen, reviewen und protokollieren können.

Strukturierte Extraktion ohne Agenten

Eine Funktionsdefinition braucht keine Funktion dahinter. Definieren Sie eine einzelne Funktion wie `extract_contacts`, deren Parameter exakt dem gewünschten Schema entsprechen, und erzwingen Sie sie mit `function_call: {"name": "extract_contacts"}`. Das Modell antwortet mit Argumenten, die dem Schema folgen. Das macht GPT-3.5 zu einer brauchbaren Extraktions-Engine für Rechnungen, Support-Tickets und E-Mails — ohne reguläre Ausdrücke in der Nachverarbeitung.

Die Ausgabe bleibt eine Vorhersage, kein Parse. Felder können leer, falsch typisiert oder erfunden sein, und nichts garantiert syntaktisch gültiges JSON. Behandeln Sie jedes Ergebnis als nicht vertrauenswürdige Eingabe und validieren Sie es gegen das Schema, bevor es Ihre Pipeline erreicht — genau wie ein Webformular.

Halluzinierte Argumente und weitere Grenzen

OpenAIs API-Referenz benennt die zentrale Grenze selbst: Das Modell erzeugt "nicht immer gültiges JSON" und kann "Parameter halluzinieren, die nicht im Funktionsschema definiert sind". Das ist täglich beobachtbar. Hat der Nutzer ein Pflichtargument nicht genannt, erfindet `gpt-3.5-turbo-0613` häufig eines — den Beispielwert aus der Parameterbeschreibung oder einen plausiblen Platzhalternamen. Die `required`-Liste im Schema ist ein Hinweis an das Modell, keine von der API erzwungene Einschränkung.

Zwei weitere Grenzen verdienen einen Namen. Funktionsdefinitionen werden in die System-Nachricht injiziert und zählen gegen das Kontextfenster; große Schemata konkurrieren mit Ihrem eigentlichen Prompt. Und Werkzeugergebnisse sind nicht vertrauenswürdiger Inhalt: Liefert eine Funktion Text aus dem offenen Web, kann dieser Text das Modell steuern — Prompt Injection. OpenAI empfiehlt Nutzerbestätigungen vor Aktionen mit realer Wirkung. Für alles Schreibende halten wir sie für obligatorisch.

Muster für den Produktionsbetrieb

Validieren Sie jeden Aufruf gegen das JSON Schema, bevor Sie ihn ausführen. Brechen Sie bei Fehlern nicht ab: Hängen Sie eine Nachricht mit der Rolle `function` an, die den Fehler beschreibt, und lassen Sie das Modell seinen eigenen Aufruf reparieren; eine einzige Korrekturrunde behebt die meisten fehlerhaften Aufrufe. Für Extraktionsaufgaben setzen Sie die Temperatur auf 0.

Halten Sie die Werkzeugliste kurz und die Beschreibungen präzise; die Auswahlqualität sinkt mit wachsender Funktionszahl. Trennen Sie lesende von schreibenden Funktionen und sichern Sie jeden Schreibzugriff mit einer expliziten Bestätigung ab. Machen Sie Schreiboperationen idempotent, denn das Modell fordert denselben Aufruf gelegentlich doppelt an. Protokollieren Sie die vollständigen Argumente jedes Aufrufs. Nichts davon ist glamourös. Alles davon ist der Unterschied zwischen Demo und System.

Ausblick im Juli 2023

Function Calling ist eine native, feinjustierte Umsetzung der ReAct-Idee — und damit das erste stabile Substrat für agentenähnliche Systeme. Auto-GPT und LangChain-Agenten haben in diesem Frühjahr den Appetit gezeigt, aber auch die Fehlerrate langer autonomer Ketten. Wir erwarten, dass kurze, beaufsichtigte Schleifen — drei bis fünf Werkzeugaufrufe mit menschlichem Kontrollpunkt — die Produktion deutlich früher erreichen als offene Agenten.

Wir erwarten außerdem, dass sich die Schnittstelle selbst verbreitet. Schema-beschriebene Werkzeuge sind zu nützlich, um das Merkmal eines einzelnen Anbieters zu bleiben; andere Modellanbieter werden folgen, und Constrained Decoding dürfte schemakonforme Ausgaben irgendwann garantieren statt nur begünstigen. Das macht die Validierungsschicht günstiger. Die Bestätigungsschicht bleibt. Modelle schlagen vor; Systeme entscheiden.

Quellen