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 Twojej domeny. Bez tego kontekstu model zgaduje, co prowadzi do nieprawidłowego kodu SQL i wadliwej analizy.

Agent RMI ADK rozwiązuje to ograniczenie za pomocą umiejętności. Weźmy pod uwagę użytkownika, który pyta „Jak bardzo zatłoczona była wczoraj Storrow Drive?”. Aby odpowiedzieć, pracownik musi wiedzieć, że RMI wyraża natężenie ruchu za pomocą wskaźnika czasu przejazdu (TTI), czyli stosunku czasu przejazdu w aktualnych warunkach duration_in_seconds do czasu przejazdu w warunkach swobodnego ruchu static_duration_in_seconds w historical_travel_time tabeli. Agent bez umiejętności może zamiast tego wymyślić kolumnęaverage_speed (raporty RMI podają tylko prędkość kategorialną, nigdy km/h) lub zastosować nieprawidłowy wzór, co da pewną, ale błędną odpowiedź.

Chociaż agent potrzebuje tej wiedzy o domenie, umieszczanie w jednym prompcie systemowym wszystkich definicji danych, schematów tabel i zastrzeżeń dotyczących SQL-a jest nieefektywne.

Ograniczenia dużych promptów systemowych

Umieszczenie wszystkich reguł i schematów domen w jednym prompcie systemowym powoduje kilka problemów:

  • Wyższe koszty i wolniejsze odpowiedzi: wysyłanie ogromnego promptu 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 częściej ignoruje lub zapomina o konkretnych regułach.
  • Trudniejsza konserwacja: połączenie wszystkiego w jednym promcie utrudnia aktualizowanie lub testowanie poszczególnych reguł bez naruszania innych.

Umiejętności

Umiejętności agenta porządkują wiedzę z danej dziedziny 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 ładować wszystko z góry, agent zachowuje w podstawowym promcie tylko krótkie description każdej umiejętności. Gdy użytkownik zada pytanie związane z umiejętnością, agent wczyta pełne instrukcje dotyczące tej tury. Dzięki temu prompty są krótkie, a miejsce na kontekst jest zarezerwowane dla historii rozmowy.

Umiejętności zapewniają też wyraźne rozdzielenie zadań: możesz pisać, testować i aktualizować poszczególne funkcje w izolacji, bez ryzyka niezamierzonych efektów ubocznych w niepowiązanych domenach. Agent produkcyjny zwykle używa wielu ukierunkowanych umiejętności, a nie jednego dużego prompta.

Anatomia umiejętności

SKILL.md składa się z 2 części: nagłówka YAML do routingu i treści w formacie 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 parametru description, aby zdecydować, czy wczytać umiejętność. Model widzi ten opis tylko przed podjęciem decyzji o załadowaniu umiejętności, więc upewnij się, że zawiera on jasną listę omawianych tematów, typowe sformułowania użytkowników i informacje o tym, kiedy należy ją wywołać.

2. Treść w formacie Markdown

Treść zawiera wskazówki dotyczące konkretnej domeny, których model przestrzega po wczytaniu. Zestaw umiejętności dotyczących wskaźników RMI zawiera dokładny wzór TTI (duration_in_seconds / static_duration_in_seconds), zweryfikowany szablon SQL BigQuery dla każdego wskaźnika oraz frazy wywołujące, które mapują intencje użytkownika na odpowiedni wskaźnik. Dostarczanie uporządkowanych, zweryfikowanych instrukcji sprawia, że model jest bardziej wiarygodny i nie musi zgadywać szczegółów schematu ani formuły.

Rejestrowanie umiejętności za pomocą pakietu 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

Umiejętności to instrukcje tekstowe, więc poleganie wyłącznie na modelu w zakresie interpretowania i wykonywania złożonej logiki może prowadzić do niespójności. Dołączanie narzędzi wykonywalnych do umiejętności 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ć.

Narzędzia do pakowania zapobiegają też nadmiernemu rozrostowi kontekstu globalnego. Zamiast od razu udostępniać wszystkie specjalistyczne narzędzia, są one ładowane tylko wtedy, gdy aktywna jest odpowiednia umiejętność w danej dziedzinie.

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 schemat narzędzia i instrukcje jego użycia w odpowiednim momencie, co pozwala utrzymać podstawowy zestaw narzędzi w niewielkim rozmiarze.

Przykład: uściślanie zapytania o korki

  1. Użytkownik pyta: „Jak bardzo zatłoczona jest droga Storrow Drive w godzinach szczytu wieczorem?”
  2. Podstawowy prompt systemowy zawiera tylko nazwę i opis każdej umiejętności, więc agent widzi, że rmi-traffic-metrics-grounding dotyczy „korków”, 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, obliczając współczynnik na podstawie historical_travel_time zamiast zgadywać formułę.

Treść skilla jest pobierana tylko wtedy, gdy jest potrzebna w zapytaniu, więc skille, których agent nigdy nie używa, nie są uwzględniane w kontekście, co sprawia, że podstawowy prompt systemowy jest krótki.

Najważniejsze punkty

  • Uziemienie z wytycznymi dotyczącymi domeny: podawaj 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 wyspecjalizowane umiejętności zamiast używać jednego dużego prompta systemowego, aby oszczędzać tokeny, zmniejszać czas oczekiwania i zwiększać dokładność.
  • Pisz jasne opisy: w opisie każdej umiejętności umieszczaj konkretne frazy wywołujące i słowa kluczowe, aby agent mógł ją niezawodnie wczytywać.
  • Podawaj konkretne przykłady: dodawaj do treści umiejętności zweryfikowane przykłady i odniesienia do przepływów pracy, aby zapewnić spójność i dokładność wyników.
  • Pakiet narzędzi do determinizmu: dołączaj do umiejętności narzędzia wykonywalne, aby obsługiwać ścisłą weryfikację i wykonywanie, zachowując jednocześnie niewielki rozmiar podstawowego zestawu narzędzi.

Dalsze kroki

Współtwórcy

Nathaniel Thomas | Praktykant w zespole inżynierów oprogramowania, Google Maps Platform