Übersicht
Large Language Models haben ein breites Allgemeinwissen, kennen aber nicht die spezifischen Messwerte, Datenbankschemas oder Berechnungsformeln Ihrer Domain. Ohne diesen Kontext rät das Modell, was zu falschem SQL und fehlerhaften Analysen führt.
Der RMI ADK-Agent behebt diese Einschränkung durch Skills. Ein Nutzer fragt: „Wie stark war der Verkehr auf dem Storrow Drive gestern?“ Um die Frage zu beantworten, muss der Agent wissen, dass RMI Staus als Travel Time Index (TTI) (Reisezeitindex) ausdrückt, dem Verhältnis von Live-duration_in_seconds zu Free-Flow-static_duration_in_seconds in der Tabelle historical_travel_time. Ein Agent ohne Skills könnte stattdessen eine average_speed-Spalte erfinden (RMI meldet nur die kategorische Geschwindigkeit, nie km/h) oder die falsche Formel anwenden, was zu einer selbstbewussten, aber falschen Antwort führt.
Der Agent benötigt zwar dieses Fachwissen, aber es ist ineffizient, jede Messwertdefinition, jedes Tabellenschema und jede SQL-Einschränkung in einen einzelnen Systemprompt zu schreiben.
Einschränkungen von großen Systemprompts
Wenn alle Domainregeln und ‑schemata in einem einzigen Systemprompt untergebracht werden, führt das zu mehreren Problemen:
- Höhere Kosten und langsamere Antworten: Wenn Sie bei jedem Zug einen riesigen Prompt senden, werden Tokens verschwendet und die Latenz erhöht, auch bei Fragen, für die diese Regeln nicht erforderlich sind.
- Schlechteres Befolgen von Anweisungen: Je länger ein Prompt mit Grenzbedingungen wird, desto wahrscheinlicher ist es, dass das Modell bestimmte Regeln ignoriert oder vergisst.
- Schwierigere Wartung: Wenn alles in einem Prompt kombiniert wird, ist es schwierig, einzelne Regeln zu aktualisieren oder zu testen, ohne andere zu beschädigen.
Fähigkeiten
Mit Skills für Agenten wird Domainwissen in modularen Ordnern organisiert, die der Agent nur bei Bedarf lädt. Jede Skill ist ein Verzeichnis mit einer SKILL.md-Datei mit Markdown-Anweisungen und einem YAML-Header.
Anstatt alles im Voraus zu laden, behält der KI-Agent nur die kurze description jedes Skills in seinem Basis-Prompt bei. Wenn ein Nutzer eine Frage zu einem Skill stellt, lädt der KI-Agent die vollständige Anleitung für diesen Schritt. So bleiben die Prompts kurz und es wird Kontextspeicherplatz für den eigentlichen Unterhaltungsverlauf gespart.
Skills bieten auch eine klare Trennung der Zuständigkeiten: Sie können einzelne Funktionen isoliert schreiben, testen und aktualisieren, ohne unbeabsichtigte Nebenwirkungen in nicht verwandten Bereichen zu riskieren. Ein Produktions-Agent verwendet in der Regel mehrere fokussierte Skills anstelle eines einzigen großen Prompts.
Aufbau eines Skills
Eine SKILL.md-Datei besteht aus zwei Teilen: einem YAML-Header für das Routing und einem Markdown-Body für Anleitungen.
1. YAML-Header
---
name: rmi-traffic-metrics-grounding
description: >
Standard traffic performance metrics computable from RMI BigQuery
tables. Covers congestion severity (TTI), delay, travel time
reliability (LOTTR, BTI, PTI, CoV), congestion frequency, speed
breakdowns, and network-wide congestion rates. Use when the user asks
about traffic conditions, congestion, reliability, delay, or network
health.
---
Das Modell verwendet description, um zu entscheiden, ob der Skill geladen werden soll. Da das Modell diese Beschreibung nur sieht, bevor es sich entscheidet, den Skill zu laden, muss sie die behandelten Themen, die typische Formulierung der Nutzer und die Auslösebedingungen klar auflisten.
2. Markdown-Body
Der Text enthält die domainspezifischen Anweisungen, die das Modell nach dem Laden befolgt.
Der Skill-Body für RMI-Messwerte enthält die genaue TTI-Formel (duration_in_seconds / static_duration_in_seconds), eine geprüfte BigQuery-SQL-Vorlage für jeden Messwert und Trigger-Formulierungen, die die Nutzerabsicht dem richtigen Messwert zuordnen. Durch die Bereitstellung strukturierter, überprüfter Anweisungen wird das Modell auf dem Boden der Tatsachen gehalten und es wird verhindert, dass es Schema- oder Formeldetails errät.
Skills mit dem ADK registrieren
Gruppieren Sie die Skills in einem SkillToolset und fügen Sie sie der Tool-Liste des Agenten hinzu:
from google.adk import skills
from google.adk.tools import skill_toolset
rmi_skill_toolset = skill_toolset.SkillToolset(
skills=[
# TRAFFIC_METRICS_SKILL_DIR points to the skill's SKILL.md folder.
skills.load_skill_from_dir(TRAFFIC_METRICS_SKILL_DIR),
],
)
# root_agent = llm_agent.Agent(..., tools=[*bq_tools, rmi_skill_toolset])
TRAFFIC_METRICS_SKILL_DIR verweist auf das Verzeichnis mit dem Skill für die Fundierung von Traffic-Messwerten.
Tools mit Skills bündeln
Da Skills textbasierte Anweisungen sind, kann es zu Inkonsistenzen kommen, wenn sich das Modell ausschließlich auf die Interpretation und Ausführung komplexer Logik verlässt. Durch das Anhängen ausführbarer Tools an einen Skill wird die Deterministik erhöht: Code übernimmt strenge Berechnungen, Validierungen und API-Interaktionen, während der Skill das Modell anweist, wann und wie es diese verwenden soll.
Durch das Bündeln von Tools wird auch eine übermäßige Ausweitung des globalen Kontexts vermieden. Anstatt alle Spezialtools von Anfang an zu präsentieren, werden sie nur geladen, wenn die entsprechende Fachkompetenz aktiv ist.
Sie können bestimmte Tools direkt an einen Skill anhängen, indem Sie sie im YAML-Header angeben:
metadata:
adk_additional_tools:
- calculate_custom_metric
So erhält das Modell sowohl das Tool-Schema als auch die zugehörigen Nutzungsanweisungen rechtzeitig, wodurch das Basis-Toolset schlank gehalten wird.
Beispiel: Grounding einer Abfrage zur Überlastung
- Der Nutzer fragt: „Wie stark ist der Verkehr auf dem Storrow Drive während des Feierabendverkehrs?“
- Im grundlegenden Systemprompt werden nur der Name und die Beschreibung der einzelnen Skills angegeben. Der Agent sieht also, dass
rmi-traffic-metrics-groundingsich auf „Stau“ bezieht, und ruftload_skillauf, um die vollständigen Anweisungen für diese Anfrage abzurufen. - Nachdem der Skill geladen wurde, wendet der KI-Agent die TTI-Definition und die bereitgestellte geprüfte SQL-Vorlage an und berechnet das Verhältnis anhand von
historical_travel_time, anstatt eine Formel zu schätzen.
Da der Text eines Skill nur abgerufen wird, wenn er für eine Anfrage benötigt wird, werden Skills, die der Agent nie verwendet, nicht in den Kontext aufgenommen. So bleibt der System-Basisprompt klein.
Wichtigste Ergebnisse
- Auf Domänenwissen stützen: Geben Sie explizite Anweisungen, Einschränkungen und Geschäftslogik an, anstatt sich auf allgemeine Modellannahmen zu verlassen.
- Modulare Skills verwenden: Teilen Sie Wissen in fokussierte Skills auf, anstatt einen riesigen Systemprompt zu verwenden. So sparen Sie Tokens, verringern die Latenz und verbessern die Genauigkeit.
- Eindeutige Beschreibungen verfassen: Fügen Sie in die Beschreibung jeder Skill-Datei bestimmte Triggerphrasen und ‑begriffe ein, damit der Agent sie zuverlässig lädt.
- Konkrete Beispiele einfügen: Fügen Sie überprüfte Beispiele und Referenz-Workflows in Skill-Bodies ein, um konsistente und genaue Ausgaben zu erhalten.
- Tools für Determinismus bündeln: Hängen Sie ausführbare Tools an Skills an, um eine strenge Validierung und Ausführung zu ermöglichen und gleichzeitig das Basis-Toolset schlank zu halten.
Nächste Schritte
- Erweiterte Skill-Muster kennenlernen: Im Entwicklerhandbuch zum Erstellen von ADK-Agenten mit Skills finden Sie Informationen zu ADK-Skills.
Beitragende
Nathaniel Thomas | Software Engineering Intern, Google Maps Platform