概要
大規模言語モデルは幅広い一般的な知識を持っていますが、ドメイン固有の指標、データベース スキーマ、計算式は知りません。このコンテキストがないと、モデルは推測を行い、不正確な SQL と欠陥のある分析につながります。
RMI ADK エージェントは、スキルを通じてこの制限に対処します。「昨日のストロー ドライブの混雑状況はどうでしたか?」とユーザーが質問したとします。回答するには、エージェントは、RMI が渋滞を Travel Time Index(TTI)として表していること、つまり historical_travel_time テーブルのライブ duration_in_seconds とフリーフロー static_duration_in_seconds の比率として表していることを知っておく必要があります。スキルがないエージェントは、代わりに 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
これにより、モデルはツール スキーマとその使用手順をジャストインタイムで受け取り、ベースのツールセットをリーンに保つことができます。
例: 輻輳クエリのグラウンディング
- お客様が「夕方のラッシュ時の Storrow Drive の混雑状況は?」と尋ねています。
- 基本のシステム プロンプトでは、各スキルの名前と説明のみが通知されます。そのため、エージェントは
rmi-traffic-metrics-groundingが「渋滞」をカバーしていることを確認し、load_skillを呼び出してこのクエリの完全な手順を取得します。 - スキルが読み込まれると、エージェントは TTI 定義と、提供された検証済みの SQL テンプレートを適用し、数式を推測するのではなく、
historical_travel_timeに対して比率を計算します。
スキルの本文はクエリで必要になった場合にのみ取得されるため、エージェントが使用しないスキルはコンテキストに入らず、基本システムのプロンプトを小さく保つことができます。
重要なポイント
- ドメイン ガイダンスに基づくグラウンディング: 一般的なモデルの仮定に依存するのではなく、明示的な指示、制約、ビジネス ロジックを提供します。
- モジュール型のスキルを使用する: 1 つの巨大なシステム プロンプトではなく、知識を特定のスキルに分割して、トークンを節約し、レイテンシを短縮し、精度を向上させます。
- 明確な説明文を作成する: エージェントが確実にスキルを読み込めるように、各スキルの説明文に特定のトリガー フレーズとキーワードを含めます。
- 具体的な例を含める: 検証済みの例と参照ワークフローをスキル本文に追加して、出力を一貫性のある正確なものにします。
- 決定論のためのツールをバンドルする: 実行可能なツールをスキルに関連付けて、厳格な検証と実行を処理しながら、基本ツールセットをスリムに保ちます。
次のステップ
- 高度なスキルパターンを調べる: スキルを使用した ADK エージェントの構築に関するデベロッパー ガイドを読んで、ADK スキルについて学習します。
寄稿者
Nathaniel Thomas | Google Maps Platform、ソフトウェア エンジニアリング インターン