RMI-ADK-Agenten mit Skills auf Domänenwissen stützen

Übersicht

Large Language Models verfügen über 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. Nehmen wir an, ein Nutzer fragt „Wie stark war die Überlastung auf dem Storrow Drive gestern?“. Um zu antworten, muss der Agent wissen, dass RMI die Überlastung als den Travel Time Index (TTI) ausdrückt, das Verhältnis von Echtzeit-duration_in_seconds zu Freifluss-static_duration_in_seconds in der historical_travel_time-Tabelle. Ein Agent ohne Skills könnte stattdessen eine Spalte average_speed erfinden (RMI meldet nur die kategorische Geschwindigkeit, nie km/h) oder die falsche Formel anwenden und eine selbstbewusste, aber falsche Antwort liefern.

Der Agent benötigt zwar dieses Domainwissen, aber jede Messwertdefinition, jedes Tabellenschema und jede SQL-Einschränkung in einen einzigen Systemprompt zu packen, ist ineffizient.

Einschränkungen großer Systemprompts

Wenn alle Domainregeln und -schemas in einen einzigen Systemprompt eingefügt werden, entstehen mehrere Probleme:

  • Höhere Kosten und langsamere Antworten: Wenn bei jeder Anfrage ein riesiger Prompt gesendet wird, werden Tokens verschwendet und die Latenz erhöht, auch bei Fragen, für die diese Regeln nicht erforderlich sind.
  • Schlechtere Befolgung von Anweisungen: Wenn ein Prompt mit Grenzfällen länger wird, ist es wahrscheinlicher, 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.

Skills

Skills für Agenten organisieren Domainwissen in modularen Ordnern, die der Agent nur bei Bedarf lädt. Jeder Skill ist ein Verzeichnis mit einer Datei SKILL.md mit Markdown-Anweisungen und einem YAML-Header.

Anstatt alles im Voraus zu laden, behält der Agent nur die kurze description jedes Skills in seinem Basisprompt. Wenn ein Nutzer eine Frage zu einem Skill stellt, lädt der Agent die vollständigen Anweisungen für diese Anfrage. So bleiben die Prompts klein und es wird Kontextraum für den tatsächlichen Unterhaltungsverlauf gespart.

Skills sorgen auch für eine klare Trennung der Zuständigkeiten: Sie können einzelne Funktionen isoliert schreiben, testen und aktualisieren, ohne unbeabsichtigte Nebenwirkungen in anderen Domains zu riskieren. Ein Produktionsagent verwendet in der Regel mehrere gezielte Skills anstelle eines riesigen Prompts.

Aufbau eines Skills

Eine SKILL.md-Datei besteht aus zwei Teilen: einem YAML-Header für das Routing und einem Markdown-Textkörper für Anweisungen.

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 die description, um zu entscheiden, ob der Skill geladen werden soll. Da das Modell diese Beschreibung nur sieht, bevor es sich für das Laden des Skills entscheidet, muss sie die behandelten Themen, die typische Formulierung der Nutzer und den Zeitpunkt der Auslösung klar auflisten.

2. Markdown-Textkörper

Der Textkörper enthält die domainspezifischen Anweisungen, die das Modell nach dem Laden befolgt. Der Textkörper des RMI-Messwert-Skills enthält die genaue TTI-Formel (duration_in_seconds / static_duration_in_seconds), eine verifizierte BigQuery-SQL-Vorlage für jeden Messwert und Auslöserphrasen, die die Nutzerabsicht dem richtigen Messwert zuordnen. Durch strukturierte, verifizierte Anweisungen bleibt das Modell auf dem Boden der Tatsachen und kann keine Details zu Schema oder Formel erraten.

Skills mit ADK registrieren

Gruppieren Sie Skills in einem SkillToolset und fügen Sie sie der Toolliste 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 hier auf das Verzeichnis mit dem Skill zur Verankerung von Verkehrsmesswerten.

Tools mit Skills bündeln

Da Skills textbasierte Anweisungen sind, kann es zu Inkonsistenzen kommen, wenn man sich ausschließlich auf das Modell verlässt, um komplexe Logik zu interpretieren und auszuführen. Durch das Anhängen ausführbarer Tools an einen Skill wird Determinismus erreicht: 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 Überlastung des globalen Kontexts vermieden. Anstatt jedes spezielle Tool im Voraus verfügbar zu machen, werden Tools so konfiguriert, dass sie nur geladen werden, wenn der entsprechende Domain-Skill aktiv ist.

Sie können bestimmte Tools direkt an einen Skill im YAML-Header anhängen:

metadata:
  adk_additional_tools:
    - calculate_custom_metric

So erhält das Modell sowohl das Toolschema als auch die Nutzungsanweisungen rechtzeitig, wodurch das Basis-Toolset schlank bleibt.

Beispiel: Verankerung einer Überlastungsabfrage

  1. Der Nutzer fragt „Wie stark ist die Überlastung auf dem Storrow Drive während des Abendverkehrs?“
  2. Der Basis-Systemprompt enthält nur den Namen und die Beschreibung jedes Skills. Der Agent sieht also, dass rmi-traffic-metrics-grounding „Überlastung“ abdeckt, und ruft load_skill auf, um die vollständigen Anweisungen für diese Abfrage abzurufen.
  3. Nachdem der Skill geladen wurde, wendet der Agent die TTI-Definition und die verifizierte SQL-Vorlage an, die er bereitstellt, und berechnet das Verhältnis zu historical_travel_time, anstatt eine Formel zu erraten.

Da der Textkörper eines Skills nur abgerufen wird, wenn er für eine Abfrage benötigt wird, werden Skills, die der Agent nie verwendet, nicht in den Kontext aufgenommen, wodurch der Basis-Systemprompt klein bleibt.

Wichtigste Ergebnisse

  • Verankerung mit Domainanleitung: Geben Sie explizite Anweisungen, Einschränkungen, und Geschäftslogik an, anstatt sich auf allgemeine Annahmen des Modells zu verlassen.
  • Modulare Skills verwenden: Teilen Sie Wissen in gezielte Skills auf, anstatt einen riesigen Systemprompt zu verwenden, um Tokens zu sparen, die Latenz zu verringern und die Genauigkeit zu verbessern.
  • Klare Beschreibungen verfassen: Fügen Sie spezifische Auslöserphrasen und Keywords in die Beschreibung jedes Skills ein, damit der Agent ihn zuverlässig lädt.
  • Konkrete Beispiele einfügen: Fügen Sie verifizierte Beispiele und Referenz workflows in die Textkörper von Skills ein, um konsistente und genaue Ausgaben zu erhalten.
  • Tools für Determinismus bündeln: Hängen Sie ausführbare Tools an Skills an, um strenge Validierung und Ausführung zu ermöglichen und gleichzeitig das Basis-Toolset schlank zu halten.

Nächste Schritte

Beitragende

Nathaniel Thomas | Software Engineering Intern, Google Maps Platform