運用技能,讓 RMI ADK 代理具備領域專業知識

總覽

大型語言模型具備廣泛的通用知識,但不知道您網域的特定指標、資料庫結構定義或計算公式。如果沒有這個背景資訊,模型就會猜測,導致 SQL 錯誤和分析有瑕疵。

RMI ADK 代理會透過技能解決這項限制。假設使用者詢問「昨天 Storrow Drive 的交通壅塞程度如何?」如要回答,服務專員必須知道 RMI 會以旅行時間指數 (TTI) 表示壅塞程度,也就是historical_travel_time 表格中即時 duration_in_seconds 與暢通 static_duration_in_seconds 的比率。如果代理程式沒有相關技能,可能會發明 average_speed 欄位 (RMI 報表只會提供類別速度,不會提供時速 (公里/小時)),或套用錯誤的公式,產生自信但錯誤的答案。

雖然代理程式需要這類領域知識,但將所有指標定義、資料表結構和 SQL 注意事項放入單一系統提示中,效率不彰。

大型系統提示的限制

將所有網域規則和結構定義放入單一系統提示會造成下列問題:

  • 成本較高且回應速度較慢:在每個回合中傳送大量提示會浪費權杖並增加延遲時間,即使是無需這些規則的問題也是如此。
  • 遵循指令的能力變差:隨著提示越來越長,包含的極端情況也越來越多,模型越有可能忽略或忘記特定規則。
  • 維護難度較高:將所有內容合併為一個提示後,更新或測試個別規則時,很容易影響其他規則。

技能

代理程式技能會將網域知識整理到模組化資料夾,代理程式只會在需要時載入。每個技能都是一個目錄,內含 SKILL.md 檔案,其中包含 Markdown 指令和 YAML 標頭。

代理不會預先載入所有內容,只會在基本提示中保留每個技能的簡短 description。當使用者提出與技能相關的問題時,代理程式會載入該回合的完整指令。這樣一來,提示就會變小,並為實際對話記錄保留背景資訊空間。

技能也能清楚劃分關注事項:您可以獨立撰寫、測試及更新個別功能,而不必擔心不相關網域會產生非預期的副作用。製作代理程式通常會使用多項專注技能,而不是一個巨大的提示。

技能剖析

SKILL.md 檔案包含兩個部分:用於路徑的 YAML 標頭,以及用於指令的 Markdown 內文。

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

模型會使用 description 判斷是否要載入技能。因為模型只會在決定載入技能前看到這段說明,請務必清楚列出涵蓋的主題、一般使用者用語,以及觸發技能的時機。

2. Markdown 內文

主體提供模型載入後遵循的特定領域指引。 RMI 指標技能主體包含確切的 TTI 公式 (duration_in_seconds / static_duration_in_seconds)、每個指標的已驗證 BigQuery SQL 範本,以及將使用者意圖對應至正確指標的觸發詞組。提供經過驗證的結構化指令,可讓模型保持在基礎狀態,並避免猜測結構定義或公式詳細資料。

使用 ADK 註冊技能

將技能分組為 SkillToolset,然後新增至代理的工具清單:

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 指向包含流量指標基礎技能的目錄。

將工具與技能組合

由於技能是文字指令,單靠模型解讀及執行複雜邏輯可能會導致不一致。將可執行的工具附加至技能可提供確定性:程式碼會處理嚴格的計算、驗證和 API 互動,而技能則會指示模型何時及如何使用這些工具。

此外,組合工具也能避免全域環境膨脹。系統不會預先公開所有專業工具,而是只在相應的領域技能啟用時,才載入工具。

您可以在技能的 YAML 標頭中,直接附加特定工具:

metadata:
  adk_additional_tools:
    - calculate_custom_metric

這可確保模型及時收到工具結構定義和使用說明,讓基本工具組保持精簡。

範例:根據擁塞查詢結果進行基礎處理

  1. 使用者詢問「晚間尖峰時段的 Storrow Drive 壅塞程度如何?」
  2. 基本系統提示只會宣傳各項技能的名稱和說明,因此代理程式會看到 rmi-traffic-metrics-grounding 涵蓋「壅塞」情況,並呼叫 load_skill 來提取這項查詢的完整指令。
  3. 載入技能後,代理程式會套用 TTI 定義和提供的已驗證 SQL 範本,並根據 historical_travel_time 計算比率,而不是猜測公式。

由於只有在查詢需要時才會擷取技能主體,因此代理程式從未使用過的技能不會進入脈絡,可讓基本系統提示保持簡潔。

重點整理

  • 根據網域指引進行訓練:提供明確的指令、限制和商業邏輯,而非依賴一般模型假設。
  • 使用模組化技能:將知識拆解成專注的技能,而非一個龐大的系統提示,以節省權杖、縮短延遲時間並提高準確度。
  • 撰寫清楚的說明:在每個技能的說明中加入特定觸發字詞和關鍵字,確保代理程式能可靠地載入技能。
  • 提供具體範例:在技能主體中加入經過驗證的範例和參考工作流程,確保輸出內容一致且準確。
  • 將工具與確定性綁定:將可執行的工具附加至技能,以便處理嚴格的驗證和執行作業,同時維持精簡的基礎工具集。

後續步驟

貢獻者

Nathaniel Thomas | Google Maps Platform 軟體工程實習生