スキルを使用して RMI ADK エージェントをドメインの専門知識にグラウンディングする

概要

大規模言語モデルは幅広い一般的な知識を持っていますが、ドメイン固有の指標、データベース スキーマ、計算式は知りません。このコンテキストがないと、モデルは推測を行い、不正確な SQL と欠陥のある分析につながります。

RMI ADK エージェントは、スキルを通じてこの制限に対処します。「昨日の Storrow Drive の混雑状況はどうでしたか?」とユーザーが質問した場合を考えてみましょう。回答するには、エージェントは、RMI が渋滞を historical_travel_time テーブルのリアルタイムの duration_in_seconds とフリーフローの static_duration_in_seconds の比率である移動時間指数(TTI)として表していることを知っておく必要があります。スキルがないエージェントは、代わりに average_speed 列(RMI レポートはカテゴリ別の速度のみで、km/h は含まれません)を作成したり、間違った数式を適用したりして、自信を持って間違った回答を生成する可能性があります。

エージェントにはこのドメイン知識が必要ですが、すべての指標の定義、テーブル スキーマ、SQL の注意点を 1 つのシステム プロンプトに含めるのは非効率的です。

大規模なシステム プロンプトの制限事項

すべてのドメインルールとスキーマを 1 つのシステム プロンプトに含めると、次のような問題が発生します。

  • コストの増加と応答の遅延: ターンごとに大きなプロンプトを送信すると、これらのルールを必要としない質問であっても、トークンが無駄になり、レイテンシが増加します。
  • 指示の実行の低下: エッジケースによってプロンプトが長くなると、モデルが特定のルールを無視したり忘れたりする可能性が高くなります。
  • メンテナンスが困難になる: すべてを 1 つのプロンプトにまとめるため、他のルールを壊すことなく個々のルールを更新したりテストしたりすることが困難になります。

スキル

エージェントのスキルは、ドメイン知識をモジュール式のフォルダに整理し、エージェントは必要なときにのみ読み込みます。各スキルは、Markdown の手順と YAML ヘッダーを含む SKILL.md ファイルを含むディレクトリです。

エージェントは、すべてを事前に読み込むのではなく、各スキルの短い description のみをベース プロンプトに保持します。ユーザーがスキルに関連する質問をすると、エージェントはそのターンの完全な手順を読み込みます。これにより、プロンプトが小さくなり、実際の会話履歴のコンテキスト スペースが節約されます。

スキルは、関心の分離を明確に実現します。無関係なドメインに意図しない副作用が発生するリスクを冒すことなく、個々の機能を分離して記述、テスト、更新できます。通常、本番環境のエージェントは、1 つの巨大なプロンプトではなく、複数の特定のスキルを使用します。

スキルの構造

SKILL.md ファイルには、ルーティング用の YAML ヘッダーと、手順用の Markdown 本文の 2 つの部分があります。

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. マークダウンの本文

本文には、モデルが読み込まれた後に従うドメイン固有のガイダンスが記載されています。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 に対して比率を計算します。

スキルの本文はクエリで必要になった場合にのみ取得されるため、エージェントが使用しないスキルはコンテキストに入らず、ベース システム プロンプトが小さく保たれます。

重要なポイント

  • ドメイン ガイダンスでグラウンディングする: 一般的なモデルの仮定に依存するのではなく、明示的な指示、制約、ビジネス ロジックを提供します。
  • モジュール型のスキルを使用する: 1 つの巨大なシステム プロンプトではなく、知識を焦点を絞ったスキルに分割して、トークンを節約し、レイテンシを短縮し、精度を向上させます。
  • 明確な説明文を作成する: エージェントが確実にスキルを読み込めるように、各スキルの説明文に特定のトリガー フレーズとキーワードを含めます。
  • 具体的な例を含める: 検証済みの例と参照ワークフローをスキル本文に追加して、出力の一貫性と正確性を維持します。
  • 決定論のためのツールをバンドルする: 実行可能なツールをスキルに添付して、厳格な検証と実行を処理しながら、基本ツールセットをスリムに保ちます。

次のステップ

寄稿者

Nathaniel Thomas | Google Maps Platform、ソフトウェア エンジニアリング インターン