Ugruntowywanie wiedzy agentów RMI ADK w zakresie domeny za pomocą umiejętności

Przegląd

Duże modele językowe mają szeroką wiedzę ogólną, ale nie znają konkretnych danych, schematów baz danych ani formuł obliczeniowych w Twojej dziedzinie. Bez tego kontekstu model zgaduje, co prowadzi do nieprawidłowego kodu SQL i błędnej analizy.

Agent RMI ADK rozwiązuje to ograniczenie za pomocą umiejętności. Załóżmy, że użytkownik pyta "jak duże były wczoraj korki na Storrow Drive?". Aby odpowiedzieć, agent musi wiedzieć, że RMI wyraża natężenie ruchu jako indeks czasu podróży (TTI), czyli stosunek rzeczywistego duration_in_seconds do static_duration_in_seconds w historical_travel_time tabeli. Agent bez umiejętności może zamiast tego wymyślić kolumnę average_speed (RMI raportuje tylko prędkość kategoryczną, nigdy w km/h) lub zastosować nieprawidłową formułę, co spowoduje, że odpowiedź będzie pewna, ale błędna.

Chociaż agent potrzebuje tej wiedzy o dziedzinie, umieszczanie każdej definicji danych, schematu tabeli i zastrzeżenia SQL w jednym promptcie systemowym jest nieefektywne.

Ograniczenia dużych promptów systemowych

Umieszczenie wszystkich reguł i schematów domeny w jednym promptcie systemowym powoduje kilka problemów:

  • Wyższe koszty i wolniejsze odpowiedzi: wysyłanie ogromnego prompta przy każdej turze marnuje tokeny i zwiększa opóźnienie, nawet w przypadku pytań, które nie wymagają tych reguł.
  • Gorsze wykonywanie instrukcji: gdy prompt staje się dłuższy z powodu przypadków brzegowych, model może ignorować lub zapominać określone reguły.
  • Trudniejsze utrzymanie: połączenie wszystkiego w jednym promptcie utrudnia aktualizowanie lub testowanie poszczególnych reguł bez naruszania innych.

Umiejętności

Umiejętności agenta porządkują wiedzę o dziedzinie w modułowych folderach, które agent wczytuje tylko wtedy, gdy są potrzebne. Każda umiejętność to katalog zawierający plik SKILL.md z instrukcjami w formacie Markdown i nagłówkiem YAML.

Zamiast wczytywać wszystko z góry, agent przechowuje w promptcie podstawowym tylko krótki description każdej umiejętności. Gdy użytkownik zada pytanie związane z umiejętnością, agent wczyta pełne instrukcje na tę turę. Dzięki temu prompty są małe, a miejsce na kontekst jest zarezerwowane na rzeczywistą historię rozmów.

Umiejętności zapewniają też wyraźne rozdzielenie obowiązków: możesz pisać, testować i aktualizować poszczególne funkcje w izolacji, bez ryzyka niepożądanych skutków ubocznych w niezwiązanych ze sobą dziedzinach. Agent produkcyjny zwykle używa wielu skoncentrowanych umiejętności, a nie jednego ogromnego prompta.

Anatomia umiejętności

Plik SKILL.md składa się z 2 części: nagłówka YAML do routingu i treści Markdown z instrukcjami.

1. Nagłówek YAML

---
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.
---

Model używa description, aby zdecydować, czy wczytać umiejętność. Ponieważ model widzi tylko ten opis przed podjęciem decyzji o wczytaniu umiejętności, upewnij się, że zawiera on wyraźną listę omawianych tematów, typowe sformułowania użytkowników i informacje o tym, kiedy należy ją aktywować.

2. Treść Markdown

Treść zawiera wskazówki dotyczące dziedziny, których model przestrzega po wczytaniu. Treść umiejętności dotyczącej danych RMI zawiera dokładną formułę TTI (duration_in_seconds / static_duration_in_seconds), zweryfikowany szablon SQL BigQuery dla każdej danej oraz frazy wyzwalające, które mapują intencje użytkownika na odpowiednią daną. Dzięki uporządkowanym i zweryfikowanym instrukcjom model nie będzie zgadywać szczegółów schematu ani formuły.

Rejestrowanie umiejętności w pakiecie ADK

Pogrupuj umiejętności w SkillToolset i dodaj je do listy narzędzi agenta:

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])

W tym przypadku TRAFFIC_METRICS_SKILL_DIR wskazuje katalog zawierający umiejętność dotyczącą danych o ruchu.

Łączenie narzędzi z umiejętnościami

Ponieważ umiejętności to instrukcje tekstowe, poleganie wyłącznie na modelu w interpretowaniu i wykonywaniu złożonej logiki może prowadzić do niespójności. Dołączenie do umiejętności narzędzi wykonywalnych zapewnia determinizm: kod obsługuje ścisłe obliczenia, weryfikacje i interakcje z interfejsem API, a umiejętność instruuje model, kiedy i jak ich używać.

Łączenie narzędzi pozwala też uniknąć nadmiernego rozrostu kontekstu globalnego. Zamiast udostępniać z góry wszystkie specjalistyczne narzędzia, narzędzia są ograniczone do wczytywania tylko wtedy, gdy aktywna jest odpowiadająca im umiejętność.

Możesz dołączyć konkretne narzędzia bezpośrednio do umiejętności w jej nagłówku YAML:

metadata:
  adk_additional_tools:
    - calculate_custom_metric

Dzięki temu model otrzymuje zarówno schemat narzędzia, jak i instrukcje jego użycia w odpowiednim momencie, co pozwala utrzymać niewielki rozmiar podstawowego zestawu narzędzi.

Przykład: uściślanie zapytania o natężenie ruchu

  1. Użytkownik pyta „Jak duże są korki na Storrow Drive w godzinach szczytu?”
  2. Podstawowy prompt systemowy reklamuje tylko nazwę i opis każdej umiejętności, więc agent widzi, że rmi-traffic-metrics-grounding obejmuje „natężenie ruchu”, i wywołuje load_skill, aby pobrać pełne instrukcje dotyczące tego zapytania.
  3. Po wczytaniu umiejętności agent stosuje definicję TTI i zweryfikowany szablon SQL, który zawiera, obliczając stosunek do historical_travel_time zamiast zgadywać formułę.

Ponieważ treść umiejętności jest pobierana tylko wtedy, gdy jest potrzebna do zapytania, umiejętności, których agent nigdy nie używa, nie są uwzględniane w kontekście, co pozwala utrzymać niewielki rozmiar podstawowego prompta systemowego.

Najważniejsze punkty

  • Uściślij za pomocą wskazówek dotyczących dziedziny: podaj wyraźne instrukcje, ograniczenia, i logikę biznesową, zamiast polegać na ogólnych założeniach modelu.
  • Używaj modułowych umiejętności: podziel wiedzę na skoncentrowane umiejętności zamiast jednego ogromnego prompta systemowego, aby oszczędzać tokeny, zmniejszać opóźnienia i zwiększać dokładność.
  • Pisz jasne opisy: uwzględnij konkretne frazy wyzwalające i słowa kluczowe w opisie każdej umiejętności, aby agent mógł ją niezawodnie wczytywać.
  • Dodaj konkretne przykłady: dodaj do treści umiejętności zweryfikowane przykłady i przepływy pracy, aby zapewnić spójność i dokładność wyników.
  • Łącz narzędzia, aby zapewnić determinizm: dołącz do umiejętności narzędzia wykonywalne, aby obsługiwać ścisłą weryfikację i wykonywanie, a jednocześnie utrzymywać niewielki rozmiar podstawowego zestawu narzędzi.

Dalsze kroki

Współtwórcy

Nathaniel Thomas | Stażysta w dziale inżynierii oprogramowania, Google Maps Platform