Google ADK (Agent Development Kit) を利用したエージェント開発中に、不可解な挙動に遭遇したことはありませんか? 例えば、Root AgentがSub Agentを呼び出す際、指示していないはずの default_api というコードが含まれ、エラーになるといった現象です。
「なぜAIはこんなコードを書いたのか?」 この一見小さなバグを深掘りしていくと、LLM(大規模言語モデル)の学習データの特性と、エージェント開発における本質的な教訓が見えてきました。
今回は、この「謎のdefault_api問題」をケーススタディとして、AIエージェント開発における重要な考え方を共有します。
1. 不具合の原因(仮説)
まず、問題の現象を振り返ります。Root AgentがSub Agentを呼び出す際、本来なら sub_agent_name() と生成すべきところを、モデルはdefault_api.sub_agent_name() と生成してしまうことがありました。
この default_api、実はAIが適当に作った言葉ではありません。我々は、これが Gemini等のモデルが学習したデータセットの偏り(バイアス) に起因している可能性が高いと考えています。
① 学習データの偏り
LLMは、GitHubやStack Overflowなどの公開コードを大量に学習しています。その中には、OpenAPI Generator や Swagger Codegen といったツールで自動生成されたコードが山のように存在します。
これらのコードジェネレータは、APIクライアントクラスのインスタンス名として、慣習的に DefaultApi や default_api を頻繁に使用します。
- 例:
default_api.create_user() - 例:
default_api.get_item()
② 過学習の影響
モデルは学習過程で、「APIのようなものを呼び出すときは、default_api.メソッド名() というパターンを使う」 ということを強く記憶(過学習)してしまっていると考えられます。
ADKにおける「Sub Agentの呼び出し」は、文脈的に「外部機能(API)の呼び出し」と非常に似ています。その結果、モデルの中で学習データのパターンが強く現れ、default_api.calculator_agent() のようなコードを生成してしまうのです。
2. 対策:Instructionでモデルを正しく導く
この問題に対処するには、学習データのバイアスに負けないよう、Instruction(システムプロンプト)でモデルを強く誘導する必要があります。
効果的なのは、曖昧な言葉を避け、モデルが誤解しない明確な用語を使うことです。
改善前(曖昧な表現)
Python
instruction = "calculator_agentサブエージェントに処理を委譲してください"
「サブエージェント」や「委譲」という言葉は抽象的で、モデルが「あ、これはAPI連携だな?じゃあ default_api かな?」と連想する余地を与えてしまいます。
改善後(明確な表現)
Python
instruction = "calculator_agentツールを使用してください"
ここで重要なのは 「ツール」 という言葉です。
- なぜ効果的か: GeminiやOpenAIなどの最新モデルは、Function Calling (Tool Use) のために特別な調整(ファインチューニング)を受けています。「ツール」と指示することで、モデルは単なる「続きの文章やコードを生成する(Completion)」確率パターンから、「定義された関数を正確に実行しようとする」推論モードへとスイッチしやすくなります。
- 結果: これにより、文脈的に類似している「一般的なWeb API呼び出し」の文脈から切り離され、学習データ内の強いバイアス(default_api 等)に引きずられるリスクが軽減されるのです。
3. 教訓:AIエージェント開発の本質
この事例から学べるのは、単なるプロンプトの書き方だけではありません。「モデルの学習データに思いを馳せることの重要性」 です。
LLMは学習データに支配されている
私たちが相手にしているのは、純粋な論理マシンではなく、過去に学習した膨大なデータの統計的パターンを再現する確率マシンです。 「5回に1回エラーが出る」といった確率的な不具合は、モデルの気まぐれではなく、学習データ内の特定のパターンの出現確率とバイアスが原因であることが多いのです。
機械が機械を学習する時代
GitHub上の大量の自動生成コード(機械が書いたコード)を、LLM(別の機械)が学習し、それが我々のエージェント開発に影響を与えているというのは非常に興味深い現象です。意図しない動作の原因が、数年前に誰かが自動生成したコードにあるかもしれないのです。
まとめ:開発のベストプラクティス
AIエージェント開発において、学習データのバイアスを回避するためのベストプラクティスは以下の通りです。
- ツール名やメソッド名は明示的に言及する モデルに推測させず、Instruction内で正確な名称を指定しましょう。
- 抽象語より具体語を使う 「サブエージェント」のような独自の抽象概念よりも、「ツール」「関数」といった、モデルが学習データ上で明確な定義として理解している用語を使用しましょう。
- 正しい形式を例示する モデルが混乱しそうな複雑な文脈では、「正しい呼び出し例」を提示して(Few-shot)、期待するパターンを固定しましょう。
エージェントが予期せぬ挙動をしたときは、ぜひ「モデルは過去にどんなデータを見て、これを『正しい』と思い込んでいるんだろう?」と想像してみてください。そこには必ず、解決のヒントが隠されています。