Einführung: Die Macht der Agenten-Plugins
Im sich schnell entwickelnden Bereich der künstlichen Intelligenz werden große Sprachmodelle (LLMs) zunehmend ausgefeilter. Doch selbst die fortschrittlichsten LLMs haben inhärente Einschränkungen: Sie arbeiten mit ihren Trainingsdaten, haben keinen Zugang zu Echtzeitinformationen und können nicht direkt mit externen Systemen interagieren oder spezifische Aktionen ausführen. Hier kommen Agenten-Plugins ins Spiel. Agenten-Plugins ermöglichen es LLMs, ihre Fähigkeiten zu erweitern und fungieren als Brücken zur Außenwelt. Sie erlauben einem KI-Agenten, Aufgaben auszuführen, für die er nicht explizit trainiert wurde, auf proprietäre Daten zuzugreifen, mit APIs zu interagieren und reale Aktionen durchzuführen.
Betrachten Sie ein LLM als einen brillanten Verstand mit umfassendem Wissen, jedoch ohne Hände oder Augen über seine internen Daten hinaus. Ein Plugin verleiht ihm diese Hände und Augen. Es verwandelt eine konversationale KI in eine handlungsfähige KI, die nicht nur verstehen, sondern auch tun kann. In diesem Artikel werden wir die praktischen Aspekte des Aufbaus von Agenten-Plugins erkunden und uns auf einen schnellen Einstieg mit konkreten Beispielen konzentrieren, um Ihnen den Einstieg zu erleichtern.
Das Grundkonzept verstehen: LLM, Agent und Plugin
Bevor wir mit dem Codieren beginnen, lassen Sie uns unser Verständnis der Schlüsselfaktoren festigen:
- Großes Sprachmodell (LLM): Die grundlegende KI, die menschliche Sprache versteht und generiert. Es ist das Gehirn unseres Agenten. Beispiele: GPT-4, Claude, Llama 2.
- Agent: Eine intelligente Entität, die ein LLM nutzt, um zu raisonnieren, zu planen und Aufgaben auszuführen. Die Rolle des Agenten besteht darin, zu entscheiden wann und wie die verfügbaren Werkzeuge (Plugins) eingesetzt werden, um das Ziel eines Benutzers zu erreichen. Oft beinhaltet dies einen Reflexions- und Denkvorgang.
- Plugin (oder Tool/Funktion): Ein Stück Code, das der Agent aufrufen kann, um eine spezifische Aktion auszuführen oder bestimmte Informationen abzurufen. Jedes Plugin hat einen klar definierten Zweck, Eingabeparameter und eine erwartete Ausgabe.
Der Interaktionsfluss sieht typischerweise folgendermaßen aus: Benutzer stellt eine Frage → Agent interpretiert die Anfrage → Agent entscheidet, ob ein Plugin benötigt wird → Agent ruft das Plugin mit den entsprechenden Parametern auf → Plugin führt die Aktion aus und gibt Ergebnisse zurück → Agent verarbeitet die Ergebnisse und antwortet dem Benutzer.
Die Anatomie eines Agenten-Plugins
Obwohl spezifische Frameworks und Plattformen ihre eigenen Konventionen haben können, sind die grundlegenden Komponenten eines Agenten-Plugins bemerkenswert ähnlich:
- Name: Ein einzigartiger, beschreibender Bezeichner für das Plugin (z.B.
getCurrentWeather,searchWikipedia,sendEmail). - Beschreibung: Eine klare, prägnante Erklärung, was das Plugin macht und wann es verwendet werden sollte. Dies ist entscheidend, damit das LLM seinen Zweck versteht und entscheiden kann, ob es aktiviert werden soll.
- Parameter (Schema): Eine Definition der Eingaben, die das Plugin erwartet. Dies wird oft mit einem JSON-Schema beschrieben, das Parameternamen, Typen, Beschreibungen und ob sie erforderlich sind, angibt.
- Implementierung (Code): Der tatsächliche Code, der die gewünscht Aktion ausführt, wenn das Plugin aufgerufen wird. Dies könnte das Aufrufen einer externen API, das Abfragen einer Datenbank, das Durchführen einer lokalen Berechnung oder die Interaktion mit einer Benutzeroberfläche sein.
- Ausgabe: Die Daten, die vom Plugin nach der Ausführung zurückgegeben werden.
Schnellstart: Erstellen eines einfachen Wetter-Plugins
Schauen wir uns ein praktisches Beispiel an. Wir werden ein Plugin erstellen, das das aktuelle Wetter für eine angegebene Stadt abruft. Zur Vereinfachung verwenden wir eine Mock-API, aber die Prinzipien lassen sich direkt auf reale APIs anwenden.
Schritt 1: Definieren Sie den Zweck und die Schnittstelle des Plugins
Name: get_current_weather
Beschreibung: „Erhält die aktuellen Wetterbedingungen für eine angegebene Stadt. Nützlich zur Beantwortung von Fragen zu Temperatur, Luftfeuchtigkeit und allgemeinem Wetterbericht an einem bestimmten Ort.“
Parameter: Wir benötigen die city. Gehen wir davon aus, dass es sich um eine Zeichenfolge handelt und erforderlich ist.
Schritt 2: Implementieren Sie die Plugin-Funktion
Wir verwenden Python für unsere Beispiele, da es in der KI-Community weit verbreitet ist. Sie können jede Sprache verwenden, aber die Konzepte bleiben gleich.
import json
def get_current_weather(city: str) -> dict:
"""
Erhält die aktuellen Wetterbedingungen für eine angegebene Stadt.
Args:
city (str): Der Name der Stadt, für die das Wetter abgefragt werden soll.
Returns:
dict: Ein Dictionary mit Wetterinformationen (z.B. Temperatur, Bedingungen, Luftfeuchtigkeit).
"""
# In einem realen Szenario würden Sie hier einen API-Call machen,
# z.B. using requests.get('https://api.weatherapi.com/v1/current.json?key=YOUR_KEY&q={city}')
# Für dieses Beispiel geben wir Mock-Daten zurück
mock_weather_data = {
"London": {"temperature": 15, "conditions": "Bewölkt", "humidity": 80},
"New York": {"temperature": 22, "conditions": "Sonnig", "humidity": 60},
"Tokyo": {"temperature": 28, "conditions": "Regnerisch", "humidity": 90},
"Paris": {"temperature": 18, "conditions": "Teilweise bewölkt", "humidity": 70},
}
weather = mock_weather_data.get(city, {"temperature": "N/A", "conditions": "Unbekannt", "humidity": "N/A"})
return {"city": city, **weather}
Schritt 3: Beschreiben Sie das Plugin für das LLM (Funktionsaufruf-Schema)
Dies ist arguably der kritischste Schritt. Das LLM führt den Python-Code nicht direkt aus; es benötigt eine strukturierte Beschreibung des Plugins, damit es den richtigen Funktionsaufruf generieren kann. Die meisten LLM-Anbieter (OpenAI, Google, Anthropic usw.) bieten eine „Funktionsaufruf“- oder „Werkzeugbenutzungs“-Funktion, bei der Sie ein JSON-Schema bereitstellen, das Ihre Funktionen beschreibt. So würde unser Wetter-Plugin beschrieben:
{
"type": "function",
"function": {
"name": "get_current_weather",
"description": "Erhält die aktuellen Wetterbedingungen für eine angegebene Stadt. Nützlich zur Beantwortung von Fragen zu Temperatur, Luftfeuchtigkeit und allgemeinem Wetterbericht an einem bestimmten Ort.",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "Der Name der Stadt (z.B. London, New York, Tokyo)"
}
},
"required": ["city"]
}
}
}
Wichtige Elemente im Schema:
type: "function": Gibt an, dass dies eine Funktionsdefinition ist.function.name: Entspricht genau unserem Python-Funktionsnamen.function.description: Das ist es, was das LLM liest! Machen Sie es klar und gründlich. Fügen Sie Anwendungsfälle und Beispiele hinzu, wenn es hilfreich ist.function.parameters: Ein Standard-JSON-Schema-Objekt, das die Eingaben definiert.properties: Definiert jeden Parameter (cityin unserem Fall).required: Listet die Parameter auf, die bereitgestellt werden müssen.
Integration mit einem LLM (OpenAI-Beispiel)
Jetzt wollen wir sehen, wie ein LLM-Agent dieses Plugin nutzen würde. Wir verwenden die API für das Funktionsaufruf von OpenAI als Beispiel, aber die Konzepte sind auf andere Anbieter übertragbar.
import openai
import os
# Angenommen, OPENAI_API_KEY ist in Ihren Umgebungsvariablen festgelegt
# openai.api_key = os.getenv("OPENAI_API_KEY")
# Unser definiertes Tool-Schema
tools = [
{
"type": "function",
"function": {
"name": "get_current_weather",
"description": "Erhält die aktuellen Wetterbedingungen für eine bestimmte Stadt. Nützlich zur Beantwortung von Fragen zu Temperatur, Luftfeuchtigkeit und allgemeinem Wetterausblick an einem bestimmten Ort.",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "Der Name der Stadt (z.B. London, New York, Tokio)"
}
},
"required": ["city"]
}
}
}
]
# Die tatsächliche Python-Funktion, die wir zuvor definiert haben
def get_current_weather(city: str) -> dict:
# ... (gleiche Implementierung wie oben) ...
mock_weather_data = {
"London": {"temperature": 15, "conditions": "Bewölkt", "humidity": 80},
"New York": {"temperature": 22, "conditions": "Sonnig", "humidity": 60},
"Tokyo": {"temperature": 28, "conditions": "Regnerisch", "humidity": 90},
"Paris": {"temperature": 18, "conditions": "Teilweise bewölkt", "humidity": 70},
}
weather = mock_weather_data.get(city, {"temperature": "N/A", "conditions": "Unbekannt", "humidity": "N/A"})
return {"city": city, **weather}
# Eine einfache Agentenschleife
def run_agent_with_tools(user_query: str):
messages = [{
"role": "user",
"content": user_query
}]
# Erster Aufruf an das LLM mit der Anfrage des Benutzers und verfügbaren Werkzeugen
response = openai.chat.completions.create(
model="gpt-4o", # Oder gpt-3.5-turbo, etc.
messages=messages,
tools=tools,
tool_choice="auto" # Erlaubt dem LLM zu entscheiden, ob es ein Werkzeug aufrufen möchte
)
response_message = response.choices[0].message
messages.append(response_message)
# Überprüfen, ob das LLM entschieden hat, ein Werkzeug aufzurufen
if response_message.tool_calls:
for tool_call in response_message.tool_calls:
function_name = tool_call.function.name
function_args = json.loads(tool_call.function.arguments)
if function_name == "get_current_weather":
# Werkzeug ausführen und das Ergebnis abrufen
tool_output = get_current_weather(city=function_args.get("city"))
# Das Werkzeugergebnis zur Gesprächshistorie hinzufügen
messages.append({
"tool_call_id": tool_call.id,
"role": "tool",
"name": function_name,
"content": json.dumps(tool_output)
})
# Zweiter Aufruf an das LLM mit dem Werkzeugergebnis
final_response = openai.chat.completions.create(
model="gpt-4o",
messages=messages
)
print(final_response.choices[0].message.content)
else:
print(f"Fehler: Unbekanntes Werkzeug aufgerufen: {function_name}")
else:
# Kein Werkzeugaufruf, nur direkte Antwort vom LLM
print(response_message.content)
# Testfälle
print("--- Anfrage 1: Wetter in London ---")
run_agent_with_tools("Wie ist das Wetter in London?")
print("\n--- Anfrage 2: Wetter in New York ---")
run_agent_with_tools("Nennen Sie mir die aktuelle Temperatur in New York.")
print("\n--- Anfrage 3: Allgemeine Frage ---")
run_agent_with_tools("Was ist die Hauptstadt von Frankreich?")
print("\n--- Anfrage 4: Wetter in einer unbekannten Stadt ---")
run_agent_with_tools("Wie ist das Wetter in Atlantis?")
Erklärung der Agentenschleife:
- Benutzeranfrage: Der Benutzer stellt eine Frage (z.B. „Wie ist das Wetter in London?“).
- Erster LLM-Aufruf: Die Anfrage des Benutzers und die Liste der verfügbaren Werkzeuge (unser
get_current_weatherSchema) werden an das LLM gesendet. Das LLM analysiert die Anfrage und die Werkzeugbeschreibungen. - LLM-Entscheidung: Das LLM entscheidet basierend auf seinem Verständnis, ob es ein Werkzeug aufruft.
- Wenn es sich entscheidet, ein Werkzeug aufzurufen, erstellt es ein
tool_callsObjekt, das den Namen des Werkzeugs und die Parameter angibt, die es übergeben möchte (z.B.{"name": "get_current_weather", "arguments": {"city": "London"}}). - Wenn kein Werkzeug relevant ist, wird eine direkte Textantwort generiert.
- Werkzeugausführung: Wenn das LLM einen Werkzeugaufruf generiert, übernimmt unser Agentencode dies, extrahiert den Funktionsnamen und die Argumente und führt dann die tatsächliche Python-Funktion (
get_current_weather("London")) aus. - Zweiter LLM-Aufruf (mit Werkzeugergebnis): Das Ergebnis der Werkzeugausführung wird dann zusammen mit der gesamten Gesprächshistorie an das LLM zurückgesendet. Das LLM hat jetzt die ursprüngliche Anfrage des Benutzers, seine eigene Entscheidung, ein Werkzeug aufzurufen, und das konkrete Ergebnis von diesem Werkzeug.
- Endgültige Antwort: Das LLM verwendet diese Informationen, um eine Antwort in natürlicher Sprache an den Benutzer zu formulieren, die das Ergebnis des Werkzeugs einbezieht.
Erweiterte Plugin-Konzepte und Best Practices
Fehlerbehandlung und Stabilität
Echtzeit-APIs können ausfallen. Ihre Plugins sollten Fehler (Netzwerkprobleme, ungültige Eingaben, API-Ratenlimits usw.) elegant behandeln. Geben Sie informative Fehlermeldungen von Ihrem Plugin zurück, und das LLM kann oft diese nutzen, um den Benutzer zu informieren oder sogar einen neuen Versuch mit korrigierten Parametern zu starten.
def get_current_weather_solid(city: str) -> dict:
try:
# Simuliere API-Aufruf mit potenziellen Fehlern
if city == "Error City":
raise ValueError("API-Aufruf für Error City fehlgeschlagen: Dienst nicht verfügbar.")
# ... Rest der erfolgreichen Mock-Datenlogik ...
return {"city": city, **weather}
except Exception as e:
return {"error": str(e), "city": city}
Mehrere Plugins und Werkzeugkoordination
Die wahre Stärke eines Agents liegt in der Verwendung mehrerer Plugins. Stellen Sie sich einen „Reiseplaner“-Agenten vor, der Plugins für:
search_flights(origin, destination, date)book_hotel(city, check_in, check_out)get_attractions(city)
Das LLM kann durch sein logisches Denken diese Werkzeuge verknüpfen. Wenn ein Benutzer zum Beispiel fragt: „Plane eine Reise nach Paris nächsten Monat und finde mir einige Aktivitäten“, könnte das LLM zuerst search_flights aufrufen, dann book_hotel (wenn vom Benutzer bestätigt) und schließlich get_attractions.
Wenn Sie mehrere Werkzeuge bereitstellen, fügen Sie einfach mehr JSON-Schemas zur tools Liste in Ihrem LLM-Aufruf hinzu.
Agenten Denken und Reflexion
Komplexe Agenten führen nicht nur Werkzeuge aus; sie denken über ihre Handlungen nach. Frameworks wie LangChain und LlamaIndex bieten Abstraktionen dafür, oft mit:
- Planung: Komplexe Ziele in Unteraufgaben zerlegen.
- Werkzeugauswahl: Das am besten geeignete Werkzeug für jede Unteraufgabe auswählen.
- Parametererzeugung: Notwendige Argumente aus dem Gesprächskontext extrahieren.
- Ausführung: Das Werkzeug ausführen.
- Beobachtung: Die Ausgabe des Werkzeugs interpretieren.
- Reflexion: Bewerten, ob das Ziel erreicht wurde oder ob weitere Maßnahmen/Korrekturen erforderlich sind.
Die Beschreibung Ihres Plugins durch das LLM ist zentral für dieses Denken. Eine vage Beschreibung führt zu einer schlechten Werkzeugauswahl.
Sicherheitsüberlegungen
- Eingabevalidierung: Validieren Sie stets Eingaben, die von Ihrem Plugin empfangen werden, auch wenn das LLM sie generiert hat. Schadhafte oder unerwartete Eingaben können zu Schwachstellen führen.
- Minimaler Zugriff: Stellen Sie sicher, dass Ihr Plugin nur Zugriff auf die Ressourcen hat, die es unbedingt benötigt.
- Vertrauliche Daten: Seien Sie äußerst vorsichtig im Umgang mit sensiblen Informationen. Vermeiden Sie es, Geheimnisse direkt in Plugin-Beschreibungen oder Protokollen offenzulegen.
- Ratenbegrenzung/Zugriffskontrolle: Schützen Sie Ihre Backend-Systeme vor Missbrauch, indem Sie geeignete Ratenlimits und Authentifizierung für die zugrunde liegenden APIs Ihres Plugins implementieren.
Asynchrone Operationen
Viele reale Plugin-Aktionen (z.B. E-Mails versenden, lang laufende Datenbankabfragen) sind asynchron. Ihr Agent muss dies möglicherweise behandeln, indem er eine Job-ID zurückgibt und ein anderes Plugin den Jobstatus überprüft oder indem Webhooks verwendet werden.
Fazit
Die Erstellung von Agenten-Plugins ist eine verwandlungsfähige Fähigkeit für jeden, der mit LLMs arbeitet. Es geht über bloße Gespräche hinaus und ermöglicht es KI-Systemen, wirklich interaktiv und umsetzbar zu werden. Durch das Befolgen der Schnellstartanleitung haben Sie die grundlegenden Komponenten kennengelernt: den Zweck des Plugins festzulegen, seine Logik zu implementieren und insbesondere, es effektiv mit einem JSON-Schema für das LLM zu beschreiben. Die Macht dieser Beschreibungen kann nicht überschätzt werden – sie sind die Brücke zwischen dem sprachlichen Verständnis eines LLM und seiner Fähigkeit, mit der realen Welt zu interagieren.
Wenn Sie weiter voranschreiten, denken Sie daran, sich auf klare Beschreibungen, eine solide Fehlerbehandlung und eine durchdachte Koordination mehrerer Werkzeuge zu konzentrieren. Die Zukunft der KI-Agenten liegt in ihrer Fähigkeit, nahtlos mit dem umfangreichen Ökosystem von Software und Daten zu interagieren, und Plugins sind der Schlüssel zur Freisetzung dieses Potenzials. Beginnen Sie mit Experimenten, erstellen Sie Ihre eigenen benutzerdefinierten Werkzeuge und beobachten Sie, wie Ihre KI-Agenten zum Leben erwachen!
🕒 Published: