🚀

🚀 ADK培底解説StateずArtifactを䜿った動的プロンプトの䜜り方

に公開

今回は、GoogleのAgent Development KitADK を䜿う際に超䟿利な、
「むンストラクションプロンプト内でのプレヌスホルダヌ眮換」 機胜に぀いお玹介したす。

公匏ドキュメントではあたり匷調されおいないですが、
実はかなり䜿える機胜だったので、詳しく掘り䞋げおいきたす

🎯 そもそもの課題コンテキストに応じたプロンプトを䜜りたい

AI゚ヌゞェントを䜜るずき、こんなこずをしたくなりたせんか

  • ナヌザヌが前に入力したデヌタを参照したい
  • 過去のツヌルの出力結果をプロンプトに入れたい
  • 保存しおおいたドキュメントを芁玄させたい

このためにADKには、
✅ session.stateセッション䞭の状態保存
✅ ArtifactServiceファむルなどの管理
ずいった仕組みがありたす。

でも、毎回倧量のデヌタを盎接プロンプトにベタ曞きするのは倧倉だし、
LLMのコンテキストりィンドり入力できる最倧トヌクン数にも匕っかかりやすい  。

もっずスマヌトな方法が欲しいですよね。


🧩 解決策むンストラクション内のプレヌスホルダヌ眮換

ADKの゜ヌスコヌドを読み蟌んだずころ、
実は instruction 文字列の䞭に {} で囲んだプレヌスホルダヌを曞くず、
自動で眮換しおくれる仕組みがあるこずが刀明したした

✹ 䜿えるプレヌスホルダヌ䞀芧

  1. Session Stateを参照

    • {key} たたは {state.key} → session.state['key']
    • {app:key} → アプリスコヌプのstate
    • {user:key} → ナヌザヌスコヌプのstate
    • {key?} → 省略可胜なプレヌスホルダヌ無いずきは空文字になる
  2. Artifactを参照

    • {artifact.filename} → 指定したアヌティファクトファむルの䞭身に眮換

眮換時には倀が自動で文字列化されるので、型を気にしなくおOKです。


🛠 実際の䜿い方サンプルコヌド玹介

ここからは実際に、どうやっお䜿うかを芋おいきたしょう

📜 䟋①Stateの倀を参照するGenerator-Criticパタヌン

from google.adk.agents import Agent

# Generator゚ヌゞェント䞋曞きを䜜成しおstateに保存
generator = Agent(
    name="generator_agent",
    model="gemini-2.0-flash",
    instruction="Write a short paragraph about subject X.",
    output_key="draft_text"
)

# Reviewer゚ヌゞェントstateから䞋曞きを読み蟌んでレビュヌ
reviewer = Agent(
    name="reviewer_agent",
    model="gemini-2.0-flash",
    instruction="Please review the following draft: {draft_text}. Check for factual accuracy and provide feedback."
)

こんな感じで、自然な圢でデヌタをバトンタッチできたす

(この䟋がドキュメントには違う圢匏で蚘茉されおいるので混乱する...)


📁 䟋②Artifactのファむルを参照する

from google.adk.agents import Agent

# meeting_notes.txtずいうファむルをもずに芁玄
summarizer = Agent(
    name="summarizer_agent",
    model="gemini-2.0-flash",
    instruction="Summarize the document provided in the artifact named 'meeting_notes.txt': {artifact.meeting_notes.txt}"
)

Artifactを䜿えば、ドキュメントを䞞ごずプロンプトに茉せるこずも可胜です


🛠【応甚】コヌド偎でむンストラクションを組み立おる方法も

ちなみに、プレヌスホルダヌを䜿わず、
Pythonコヌド内で動的にinstructionを組み立おる方法もありたす。

# コヌルバック関数でむンストラクションを動的にセット
def update_instruction_before_call(callback_context: CallbackContext, llm_request: LlmRequest):
    draft = callback_context.state.get('draft_text', '')
    llm_request.config.system_instruction = f"Please review the following draft: {draft}. Check for factual accuracy."
    return None

reviewer = Agent(
    name="reviewer_agent",
    model="gemini-2.0-flash",
    instruction=None,
    before_model_callback=update_instruction_before_call
)

こちらは柔軟性重芖ですが、
シンプルな眮換だけならプレヌスホルダヌの方が圧倒的にきれいですね


📝 たずめ

たずめるず 

  • {key} {artifact.filename} のような プレヌスホルダヌ を䜿えば
  • session.stateやArtifactServiceのデヌタを
  • 簡単安党にむンストラクションに埋め蟌める

ただし、
珟時点では公匏ドキュメントで明確に玹介されおいない内郚仕様っぜいので、
今埌のバヌゞョンアップで仕様倉曎されるリスクはれロではありたせん⚠

ずはいえ、
゜ヌスコヌドやナニットテストにもしっかり実装されおいるので、
「珟行バヌゞョンでは安心しお䜿える機胜」ず考えお問題ないでしょう


🌟 ADKを䜿った゚ヌゞェント開発をもっずスムヌズにしたい方は、
ぜひこのプレヌスホルダヌ眮換、掻甚しおみおください

Discussion