Funktionsaufrufe nutzen, um intelligentere LLM-Anwendungen zu erstellen
Large Language Models (LLMs) sind nicht länger auf die Textgenerierung beschränkt; sie bewältigen inzwischen komplexere, kontextgesteuerte Aufgaben. Ein zentraler Fortschritt in diesem Bereich ist Function Calling, das es LLMs ermöglicht, mit externen Tools, Datenbanken und APIs zu interagieren, um dynamische Operationen auszuführen. Dadurch können sie über die Textgenerierung hinausgehen und mit realen Daten und Diensten arbeiten.
Bei einem kürzlich von Zilliz veranstalteten Berlin Unstructured Data Meetup erläuterte Nikolai Danylchyk, Customer Engineer bei Google, wie Gemini, ein modernes LLM, Function Calling nutzt, um seine Fähigkeiten zu erweitern. Dieser Blog fasst seine Erkenntnisse zusammen und zeigt, wie Sie diese leistungsstarke Funktion nutzen können, um fortschrittliche LLM-Anwendungen zu entwickeln. Wenn Sie mehr Details erfahren möchten, empfehlen wir Ihnen, die Aufzeichnung von Nikolais Vortrag auf YouTube anzusehen.
Advanced Function Calling in LLMs verstehen
LLMs haben sich erheblich weiterentwickelt, doch ihr wahres Potenzial zeigt sich, wenn sie über Funktionsaufrufe mit externen Systemen interagieren. Diese Fähigkeit ermöglicht es LLMs, über die Grenzen ihrer statischen Trainingsdaten hinauszugehen, indem sie Live-Datenbanken abfragen, Befehle ausführen oder Echtzeitberechnungen durchführen. Durch die Integration von Function Calling können sich LLMs nahtlos mit anderen Systemen verbinden, um genauere, aktuellere und dynamischere Antworten zu liefern. Schauen wir uns anhand von Gemini als Beispiel an, wie Function Calling funktioniert.
Abbildung 1- Schritte des Function Calling und zur Laufzeit verwendete Komponenten
Abbildung 1: Schritte des Function Calling und zur Laufzeit verwendete Komponenten.
Der Prozess beginnt, wenn ein Nutzer eine Anfrage an die Gemini API sendet. Zu diesem Zeitpunkt hat der Entwickler bereits eine oder mehrere Funktionsdeklarationen innerhalb des Tools definiert und Gemini damit über die verfügbaren Funktionen und deren Ausführung informiert. Sobald die Nutzereingabe empfangen wurde, analysiert die Gemini API den Inhalt und den Prompt und gibt eine „Function Call“-Antwort zurück. Diese Antwort enthält strukturierte Daten, etwa den Namen der aufzurufenden Funktion und die relevanten Parameter.
Der nächste Schritt erfolgt außerhalb des Gemini-Systems: Die Anwendung verwendet den Funktionsnamen und die Parameter aus Geminis Antwort, um eine API-Anfrage an einen externen Dienst zu stellen. Hier kommt der Entwickler ins Spiel und nutzt Tools wie die
requests-Bibliothek in Python, um eine REST API oder eine andere Client-Bibliothek aufzurufen, die zu den jeweiligen Anforderungen passt.Nachdem das externe System seine Antwort zurückgegeben hat, sendet die Anwendung diese Daten zurück an Gemini. Das Modell verwendet diese neuen Informationen anschließend, um eine abschließende Antwort für den Nutzer zu generieren. Wenn zusätzliche Daten erforderlich sind, kann Gemini einen weiteren Funktionsaufruf ausgeben und den Zyklus nach Bedarf fortsetzen.
Um die Bedeutung dieser fortschrittlichen Fähigkeit zu verstehen, betrachten Sie ein traditionelles LLM ohne Function-Calling-Funktion. Seine Antworten werden auf Grundlage der Daten generiert, mit denen es trainiert wurde und die möglicherweise veraltet oder in ihrem Umfang begrenzt sind. Mit Funktionsaufrufen kann ein LLM jedoch Befehle ausgeben, um Echtzeitinformationen aus einer Datenbank abzurufen, einen Datensatz in einem Customer-Relationship-Management-System (CRM) zu aktualisieren oder sogar Aktionen wie das Buchen eines Tickets oder das Aufgeben einer Bestellung auszulösen. Dieser Ansatz erweitert die Nutzbarkeit des Modells von der bloßen Generierung von Antworten hin zur Ausführung von Aufgaben.
Aus technischer Sicht umfasst ein Funktionsaufruf in einem LLM eine strukturierte Interaktion zwischen dem Modell und einer externen API oder einem externen Dienst. Das Modell identifiziert ein geeignetes Szenario, in dem ein Funktionsaufruf erforderlich ist, formuliert die Parameter für den Aufruf und führt ihn aus.
Wenn ein Benutzer beispielsweise fragt: „Wie ist das Wetter in Berlin?” Der Funktionsaufruf würde eine Wetter-API auslösen, Echtzeitdaten abrufen und daraus die Antwort generieren. In diesem Fall fungiert das LLM als intelligenter Vermittler zwischen dem Benutzer und dem externen System und orchestriert eine genauere und nützlichere Interaktion.
Nachdem wir nun das grundlegende Konzept des Function Calling untersucht haben, sehen wir uns eine praktische Implementierung mit Gemini an, um mit einer realen API zu interagieren—dem Abrufen von Wechselkursen.
Beispiel: Verwendung von Function Calling zum Abrufen von Wechselkursen
Sehen wir uns an, wie wir eine Wechselkurs-API durch Gemini Function Calling nutzen können:
Installieren der erforderlichen Bibliotheken und Festlegen von Projektvariablen
Beginnen wir damit, die Bibliothek google-cloud-aiplatform zu aktualisieren und zu installieren, die für die Interaktion mit der Vertex AI-Plattform von Google Cloud benötigt wird. Geben Sie anschließend Ihre Projekt-ID und Ihren Standort als Variablen an.
!pip3 install --upgrade --user --quiet google-cloud-aiplatform
PROJECT_ID = "[your-project-id]" # @param {type:"string"}
LOCATION = "us-central1" # @param {type:"string"}
Dies sind Platzhalter, um zu identifizieren, mit welchem Projekt und welcher Region in Google Cloud Sie arbeiten.
Importieren erforderlicher Module und Definieren des generativen Modells
Importieren Sie dann die erforderlichen Module, um ein generatives Modell aus Vertex AI zu definieren und damit zu arbeiten. Die Bibliothek requests wird später verwendet, um Daten von einer externen API abzurufen.
import requests
from vertexai.generative_models import (
Content,
FunctionDeclaration,
GenerativeModel,
Part,
Tool,
)
model = GenerativeModel("gemini-1.5-pro-001")
Die letzte Zeile initialisiert ein generatives Modell, in diesem Fall gemini-1.5-pro-001. Sie werden das Modell später verwenden, um Antworten basierend auf dem Eingabe-Prompt zu generieren.
Definieren einer Funktion für Wechselkurse und Erstellen eines Tools
Erstellen Sie als Nächstes eine Funktion, die die Parameter beschreibt, die zum Abrufen eines Wechselkurses zwischen zwei Währungen benötigt werden, und verpacken Sie sie in ein Tool.
get_exchange_rate_func = FunctionDeclaration(
name="get_exchange_rate",
description="Get the exchange rate for currencies between countries",
parameters={
"type": "object",
"properties": {
"currency_date": {
"type": "string",
"description": "A date that must always be in YYYY-MM-DD format or the value 'latest' if a time period is not specified"
},
"currency_from": {
"type": "string",
"description": "The currency to convert from in ISO 4217 format"
},
"currency_to": {
"type": "string",
"description": "The currency to convert to in ISO 4217 format"
}
},
"required": [
"currency_from",
"currency_date",
]
},
)
exchange_rate_tool = Tool(
function_declarations=[get_exchange_rate_func],
)
Die Parameter umfassen currency_date (im Format YYYY-MM-DD oder das Schlüsselwort latest), currency_from (den ISO-4217-Code der Währung, aus der konvertiert werden soll) und currency_to (den ISO-4217-Code der Währung, in die konvertiert werden soll). Der Abschnitt required gibt an, dass currency_from und currency_date obligatorisch sind. Anschließend definieren wir ein Tool namens exchange_rate_tool, das die Funktionsdeklaration get_exchange_rate verpackt. Wir werden dieses Tool später an das Modell übergeben, um das Abrufen von Wechselkursen zu handhaben.
Generieren einer Antwort mit dem Modell und Extrahieren von Parametern aus der Antwort
Rufen wir nun eine Antwort ab, indem wir dem Modell einen Prompt übergeben. Wir erwarten, dass das Modell eine Antwort ausgibt, die einen Funktionsaufruf mit Parametern enthält.
prompt = """What is the exchange rate from Australian dollars to Swedish krona?
How much is 500 Australian dollars worth in Swedish krona?"""
response = model.generate_content(
prompt,
tools=[exchange_rate_tool],
)
response.candidates[0].content
params = {}
for key, value in response.candidates[0].content.parts[0].function_call.args.items():
params[key[9:]] = value
params
Der obige Code definiert einen Prompt, der nach dem Wechselkurs zwischen australischen Dollar und schwedischen Kronen fragt. Das Modell wird dann mit generate_content aufgerufen, wobei der Prompt zusammen mit dem exchange_rate_tool übergeben wird. Das Modell wird versuchen, eine Antwort zu generieren.
Die Antwort wird anschließend geparst. Das params-Dictionary wird befüllt, indem über die Schlüssel und Werte von function_call.args iteriert wird und die ersten 9 Zeichen des Schlüssels entfernt werden, um den erwarteten Parameternamen zu entsprechen.
Abrufen von Wechselkursen aus einer API und Geben einer Antwort an den Benutzer
Fordern wir nun die Frankfurter API (eine kostenlose API für Devisenkurse) mit den Parametern an, die aus der vorherigen Antwort extrahiert wurden, und generieren wir eine Antwort für den Benutzer.
import requests
url = f"https://api.frankfurter.app/{params['date']}"
api_response = requests.get(url, params=params)
api_response.text
response = model.generate_content(
[
Content(role="user", parts=[
Part.from_text(prompt + """Give your answer in steps with lots of detail
and context, including the exchange rate and date."""),
]),
Content(role="function", parts=[
Part.from_dict({
"function_call": {
"name": "get_exchange_rate",
}
})
]),
Content(role="function", parts=[
Part.from_function_response(
name="get_exchange_rate",
response={
"content": api_response.text,
}
)
]),
],
tools=[exchange_rate_tool],
)
response.candidates[0].content.parts[0].text
Im obigen Code rufen wir, sobald wir eine Antwort von der Wechselkurs-API erhalten haben, die Methode generate_content erneut auf, diesmal mit mehreren Inhalten: einem vom Benutzer (der detaillierte Schritte und Kontext anfordert), einem Funktionsaufruf an get_exchange_rate und der Antwort der Frankfurter API. Diese Kombination veranlasst das Modell, eine gründlichere, schrittweise Antwort zu geben. Schließlich geben wir den Textteil des vom Modell generierten Inhalts aus. Dies ist die Antwort, die wir an den Benutzer zurückgeben.
Hier ist eine Beispielantwort:
Abbildung 2- Ausgabe eines Programms, das den Wechselkurs von australischen Dollar zu schwedischen Kronen zeigt
Abbildung 2: Ausgabe eines Programms, das den Wechselkurs von australischen Dollar zu schwedischen Kronen zeigt
Die Antwort zeigt, dass der Funktionsaufruf funktioniert hat und uns den aktuellen Wechselkurs geliefert hat, wie er von der Frankfurter API aufgeführt wird.
Bisher haben wir Function Calling behandelt, die fortgeschrittene Funktion von Gemini und vielen anderen LLMs. Während Function Calling allein komplexe Aufgaben wie das Abrufen von Währungsdaten ausführen kann, wird sein wahres Potenzial erst in Kombination mit anderen leistungsstarken Techniken wie Retrieval Augmented Generation (RAG) ausgeschöpft.
Kombination von Function Calling mit Retrieval-Augmented Generation (RAG) für verbesserte Interaktivität
Retrieval Augmented Generation (RAG) ist zu einem der bedeutendsten Trends in der Verarbeitung natürlicher Sprache (NLP) geworden. RAG-Systeme kombinieren die generativen Fähigkeiten von LLMs mit der Effizienz von Retrieval-Systemen, die von Vektordatenbanken wie Milvus und Zilliz Cloud (dem verwalteten Milvus) unterstützt werden. Konkret ruft die Vektordatenbank in einem RAG-System Kontextinformationen für das LLM ab, und anschließend generiert das LLM auf Grundlage der abgerufenen Informationen eine genauere Antwort. Function Calling verbessert diesen Prozess, indem es eine dynamischere Interaktion zwischen dem LLM und externen Datenbanken oder Systemen ermöglicht. Durch die Ergänzung von Funktionsaufrufen können LLMs ihre Fähigkeiten erweitern, indem sie relevante Daten nicht nur abrufen, sondern sie auch in Echtzeit verarbeiten und mit ihnen interagieren.
Zum Beispiel bietet das LLM in einer Kundensupport-Anwendung, die sowohl RAG als auch Function Calling verwendet, eine reichhaltigere, stärker personalisierte Interaktion. Wenn ein Benutzer fragt: „Wo ist meine letzte Bestellung?” Das System setzt zunächst RAG ein, um allgemeine Informationen zur Bestellabwicklung aus der Milvus-Vektordatenbank abzurufen und Kontext bereitzustellen. Zum Beispiel lautet die abgerufene Information: „Bestellungen benötigen in der Regel 3–5 Werktage für die Lieferung.“ Gleichzeitig greift es durch Function Calling auf Echtzeitdaten zu, indem es das Kundenkonto abfragt. Die endgültige Antwort lautet: „Ihre Bestellung #12345 wurde am 10. September versandt und wird voraussichtlich am 15. September eintreffen.”
Diese Integration von RAG mit Function Calling schafft ein dynamisches System, das nicht nur relevante und informative Antworten generiert, sondern auch aktiv mit Live-Daten und Diensten interagiert und so eine interaktive Dimension hinzufügt. Diese Kombination macht von LLMs angetriebene intelligente Agenten fähig, komplexe Interaktionen in der realen Welt durchzuführen.
- Lesen Sie dieses Tutorial für eine Schritt-für-Schritt-Anleitung, wie Sie die Function-Calling-Fähigkeiten von LLMs nutzen können, um RAG-Systeme zu verbessern.
Anwendungsfälle der Kombination von RAG und Function Calling
Werfen wir einen Blick auf mehrere dieser Interaktionen in der realen Welt.
Gesundheitswesen: Abruf medizinischer Akten und Terminplanung
Im Gesundheitswesen ermöglicht RAG in Kombination mit Function Calling LLMs, sowohl Patienten als auch Gesundheitsdienstleistern hochgradig personalisierte, datengestützte Unterstützung zu bieten. Ein Arzt könnte das System nach historischen Daten eines Patienten fragen, während das System mithilfe von RAG relevante medizinische Akten aus einer Vektordatenbank wie Milvus abruft. Gleichzeitig kann das LLM durch Function Calling mit externen Krankenhaussystemen interagieren, um Folgetermine zu planen oder diagnostische Echtzeitdaten abzurufen.
Beispiel: Ein Arzt fragt: „Was ist das neueste Testergebnis für Patient X, und können Sie für nächste Woche einen Folgetermin buchen?” Das System fragt zunächst Milvus ab, um zugehörige Dokumente aus der Krankengeschichte des Patienten abzurufen und Einblicke in Trends und Erkrankungen bereitzustellen. Anschließend verwendet es Function Calling, um auf die Terminplanungs-API des Krankenhauses zuzugreifen und einen Termin für den Patienten zu buchen.
Finanzwesen: Personalisierte Anlageeinblicke und Echtzeittransaktionen
Im Finanzsektor wird RAG eingesetzt, um relevante Marktinformationen und historische Finanzdaten abzurufen, die in Vektordatenbanken wie Milvus gespeichert sind. Durch die Kopplung mit Function Calling kann ein LLM auch Echtzeitaktionen ausführen, wie etwa Aktien kaufen oder verkaufen, Geldmittel übertragen oder auf Basis von Live-Daten individuelle Portfolioempfehlungen erstellen.
Beispiel: Ein Nutzer fragt: „Wie hat sich mein Portfolio in den letzten sechs Monaten entwickelt, und kannst du Apple-Aktien im Wert von 1000 $ kaufen?” Das System verwendet zunächst RAG, um die Portfolio-Historie des Nutzers aus Milvus abzurufen, und liefert eine Zusammenfassung der bisherigen Performance. Anschließend interagiert es mithilfe von Function Calling mit einer Trading-API, um den Aktienkauf auszuführen und dem Nutzer die Transaktion zu bestätigen.
E-Commerce: Produktempfehlungen und Echtzeit-Bestellverfolgung
Im E-Commerce kann RAG dabei helfen, Produktinformationen, Bewertungen oder die Kundenhistorie aus Milvus abzurufen, um ein Einkaufserlebnis zu personalisieren. In Kombination mit Function Calling kann das System mit Live-Inventarsystemen interagieren, um Lagerverfügbarkeit bereitzustellen, Bestellungen in Echtzeit zu verfolgen oder sogar Zahlungen abzuwickeln.
Beispiel: Ein Kunde fragt: Kannst du mir einen Laptop empfehlen, der meinem letzten Kauf ähnelt, und mir sagen, wann meine aktuelle Bestellung ankommt? Das LLM ruft Informationen zu den früheren Käufen des Kunden aus Milvus ab und empfiehlt ein ähnliches Produkt. Anschließend wird Function Calling verwendet, um die API zur Bestellverfolgung abzufragen und Echtzeit-Updates zum Lieferstatus der aktuellen Bestellung zu liefern.
Reisen: Reiseplanvorschläge und Buchungsmanagement
Im Reise- und Gastgewerbe kann RAG Details zu Reisezielen, Hotels und Reiseplänen abrufen, die in einer Vektordatenbank wie Milvus gespeichert sind. In Kombination mit Function Calling kann das System Buchungen verwalten, personalisierte Reisepläne vorschlagen oder Echtzeit-Updates zu Flügen und Reservierungen anbieten.
Beispiel: Ein Reisender fragt: Kannst du einen 5-tägigen Reiseplan für Italien vorschlagen und meine Hotelbuchung auf ein früheres Datum verschieben? Das System ruft zunächst auf Grundlage der Präferenzen und früheren Reisen des Reisenden Reiseplanvorschläge aus Milvus ab. Anschließend verwendet es Function Calling, um mit dem Buchungssystem des Hotels zu interagieren, die Reservierung zu ändern und dem Nutzer die Änderung zu bestätigen.
Da wir sehen, wie Function Calling Systeme wie RAG verbessert, ist es wichtig, die praktischen Herausforderungen und Vorteile bei der Bereitstellung solcher Technologien in realen Anwendungen zu erkennen.
Herausforderungen und Vorteile von Function Calling in realen Anwendungsfällen
Obwohl das Potenzial von Function Calling enorm ist, bringt es eigene Herausforderungen mit sich. Eines der Hauptanliegen besteht darin, die Sicherheit und den Datenschutz der Interaktionen zu gewährleisten. Wenn ein LLM Function Calls ausführt, kann es Zugriff auf sensible Daten benötigen, etwa Nutzerkonten oder Finanzinformationen. Es ist entscheidend sicherzustellen, dass diese Transaktionen sicher sind und den Datenschutzbestimmungen entsprechen.
Darüber hinaus kann die Komplexität der Verwaltung mehrerer Function Calls in einem einzigen Workflow zu Latenzproblemen führen. Wenn ein LLM beispielsweise mehrere Function Calls an verschiedene Systeme ausführt, kann sich die Antwortzeit erhöhen, was sich potenziell auf die Nutzererfahrung auswirkt. Dies ist besonders wichtig in Echtzeitanwendungen, in denen Geschwindigkeit entscheidend ist.
Positiv ist, dass Function Calling mehrere Vorteile bietet, darunter verbesserte Aufgabenautomatisierung, präzisere Echtzeitantworten und eine verbesserte Nutzerinteraktion. In Branchen wie Gesundheitswesen, Finanzwesen und Kundenservice kann Function Calling Abläufe optimieren, indem Routineaufgaben automatisiert werden. Im Gesundheitswesen könnte ein LLM beispielsweise Patientenakten abrufen, Termine planen und Erinnerungen über Function Calls senden, wodurch medizinisches Fachpersonal mehr Zeit hat, sich auf komplexere Fälle zu konzentrieren.
Über die praktischen Vorteile und Herausforderungen hinaus gibt es ethische und technische Überlegungen, die nicht übersehen werden dürfen, insbesondere im Hinblick auf Datensicherheit und Systemzuverlässigkeit.
Ethische und technische Überlegungen
Aus technischer Sicht müssen wir als Entwickler sorgfältig steuern, wie Funktionsaufrufe implementiert werden, um potenzielle Fallstricke zu vermeiden. Ein häufiges Problem ist die übermäßige Abhängigkeit von externen Systemen. Wenn ein LLM ständig Funktionsaufrufe an Drittanbieterdienste ausgibt, wird die Zuverlässigkeit des Systems von der Verfügbarkeit und Leistung dieser Dienste abhängig. Geeignete Fehlerbehandlung und Fallback-Mechanismen müssen vorhanden sein, um sicherzustellen, dass das System weiterhin reibungslos funktioniert, selbst wenn externe Dienste nicht verfügbar sind.
Aus ethischer Sicht wirft Function Calling Bedenken hinsichtlich Transparenz und Nutzereinwilligung auf. Wenn ein LLM Entscheidungen trifft oder Handlungen im Namen eines Nutzers ausführt, ist es unerlässlich, dass der Nutzer vollständig darüber informiert ist, was das System tut. Beispielsweise sollten Nutzer bei Finanzdienstleistungen darüber informiert werden, welche Aktionen ausgeführt werden, wenn ein LLM Trades ausführt oder Gelder überweist, und sie sollten bei Bedarf eingreifen können. Klare Dokumentation und Mechanismen zur Nutzereinwilligung sind entscheidend, um das Vertrauen in solche Systeme aufrechtzuerhalten.
Ein weiteres ethisches Anliegen betrifft die Datennutzung. Wenn Funktionsaufrufe auf persönliche oder sensible Daten zugreifen, müssen strenge Maßnahmen zum Schutz der Privatsphäre der Nutzer vorhanden sein. Entwickler müssen sicherstellen, dass Daten verantwortungsvoll gehandhabt werden und dass Funktionsaufrufe Datenschutzvorschriften wie der DSGVO oder HIPAA entsprechen.
Fazit
Nikolai hat hervorragende Arbeit geleistet, indem er beleuchtet hat, wie Function Calling eine entscheidende Erweiterung für große Sprachmodelle bietet und es ihnen ermöglicht, reale Aufgaben durch Interaktion mit externen Systemen und Daten auszuführen. Ob es darum geht, Wechselkurse abzurufen oder komplexere Interaktionen durch Retrieval-Augmented Generation (RAG) zu ermöglichen: Function Calling erweitert die Horizonte dessen, was LLMs erreichen können.
Weiterführende Literatur
Weiterlesen

Introducing Business Critical Plan: Enterprise-Grade Security and Compliance for Mission-Critical AI Applications
Discover Zilliz Cloud’s Business Critical Plan—offering advanced security, compliance, and uptime for mission-critical AI and vector database workloads.

The Great AI Agent Protocol Race: Function Calling vs. MCP vs. A2A
Compare Function Calling, MCP, and A2A protocols for AI agents. Learn which standard best fits your development needs and future-proof your applications.

Building RAG Pipelines for Real-Time Data with Cloudera and Milvus
explore how Cloudera can be integrated with Milvus to effectively implement some of the key functionalities of RAG pipelines.


