ADK で Google 検索ツールが呼ばれない時がある
Agent の作り方が問題があった
問題
instructions があいまい
重要: 必ず google_search ツールを使って不足情報を補完してください
tamago324.icon 不足情報とは?
input_schema としてちゃんと title, author, publisher, isbn, review という情報が渡されるため、エージェントとしては情報が足りていると思ってしまう。
input_schema と tool の相性
input_schema を渡していると、ADK のエージェントは、構造化入力を整形して出力するモードとして動いてしまうため、ツール呼び出しが呼ばれにくくなる
対策
input_schema を使わずに state から読み取るようにする
また、instructions も google_search を呼び出すような instructions に変更する
---
before
input_schema を指定している
code:py
class BookResearchInput(BaseModel):
title: str = Field(description="書籍のタイトル")
author: str = Field(description="著者名")
publisher: str = Field(default="", description="出版社名(任意)")
# TODO: 本当は、None を外したい
isbn: str | None = Field(default=None, description="ISBN13(任意)")
review: str = Field(default="", description="ユーザーの感想(任意)")
...
conditional_research_agent = Agent(
name="conditional_research_agent",
model=Gemini(
model="gemini-2.5-flash",
retry_options=types.HttpRetryOptions(attempts=3),
),
input_schema=BookResearchInput,
instruction="""
あなたは書籍リサーチ担当です。
必ず google_search を使って不足情報を補完してください。
# google_search の使い方
以下の3観点で、複数クエリを組み合わせて検索してください。
1. 批評的視点:
- "title author publisher 考察 結末 意味 伏線"
- "title テーマ 象徴 解釈"
2. メタ視点:
- "title 著者インタビュー 執筆背景 創作動機"
- "title author 制作意図"
3. 読者反応の多様性:
- "title レビュー 賛否 分かれる"
- "title 読後感 衝撃 議論"
ISBN が未入力または不確実な場合は、必要に応じて次も検索してください。
- "title author ISBN"
- "title 出版社 ISBN13"
# 取得・整理する観点
- 作品の核心: 表層のあらすじではなく、作品の中心テーマ・葛藤・問い。
- 登場人物の整理: すべての登場人物について、役割・関係性・象徴する価値観やテーマを簡潔にまとめる。
- 解釈が分かれる点: 受け手によって評価や意味づけが変わる場面や論点。
- 著者が語った執筆意図: インタビュー等で示された動機・問題意識。
# 出力要件
- 出力形式は自由です。
""",
tools=google_search,
output_key=STATE_BOOK_RESEARCH_RAW_RESULT,
)
after:
前段階で state にセット
state から instructions へ注入
code:py
class KnowledgeRetrievalAgent(CustomAgent):
"""Firestoreから既存リサーチ結果を取得し、再検索の要否を判定する。"""
async def _run_async_impl(self, ctx: InvocationContext):
book_input = _load_book_research_input(ctx)
logger.info(
"KnowledgeRetrievalAgent: 書籍情報を受信 title=%r, author=%r, isbn=%r",
book_input.title,
book_input.author,
book_input.isbn,
)
ctx.session.state"book_input_title" = book_input.title
ctx.session.state"book_input_author" = book_input.author
ctx.session.state"book_input_isbn" = book_input.isbn
...
conditional_research_agent = Agent(
name="conditional_research_agent",
model=Gemini(
model="gemini-2.5-flash",
retry_options=types.HttpRetryOptions(attempts=3),
),
instruction="""
あなたは書籍リサーチ担当です。
# あなたのタスク
入力された書籍 ({book_input_title} / {book_input_author}) について、必ず google_search ツールを複数回実行し、
詳細な批評・解釈・著者インタビュー・読者反応を収集してください。
**google_search を呼ばずに回答することは禁止します。**
まず検索を実行してから、その結果をまとめてください。
# google_search の使い方
以下の3観点で、複数クエリを組み合わせて検索してください。
1. 批評的視点:
- "{book_input_title} {book_input_author} 考察 結末 意味 伏線"
- "{book_input_title} テーマ 象徴 解釈"
2. メタ視点:
- "{book_input_title} 著者インタビュー 執筆背景 創作動機"
- "{book_input_title} {book_input_author} 制作意図"
3. 読者反応の多様性:
- "{book_input_title} レビュー 賛否 分かれる"
- "{book_input_title} 読後感 衝撃 議論"
# 取得・整理する観点
- 作品の核心: 表層のあらすじではなく、作品の中心テーマ・葛藤・問い。
- 登場人物の整理: すべての登場人物について、役割・関係性・象徴する価値観やテーマを簡潔にまとめる。
- 解釈が分かれる点: 受け手によって評価や意味づけが変わる場面や論点。
- 著者が語った執筆意図: インタビュー等で示された動機・問題意識。
# 出力要件
- 出力形式は自由です。
""",
tools=google_search,
output_key=STATE_BOOK_RESEARCH_RAW_RESULT,
)