# ADKの便利で実践的な使い方
エージェントの「今の状態」を管理するState機能。動的プロンプトやスコープ付きデータ管理で、賢い対話を実現します🎯
📌 **タイトル**: State
🔗 **URL**:
## 🧩 概要
Stateは `session.state` としてアクセスできる、会話中の作業メモリです。ショッピングカートの中身や、予約フローで段階的に集めた情報など、「今この会話で必要なデータ」を保持します。
Stateの大きな特徴は**プレフィックスによるスコープ管理**です。
- `app:` - アプリ全体で共有されるデータ(全ユーザー共通設定など)
- `user:` - ユーザー単位で共有されるデータ(ユーザーの好み設定など、セッションをまたいで保持)
- `temp:` - 現在のセッション内でのみ有効な一時データ
- プレフィックスなし - 通常のセッションスコープ
さらに、`{state_var}` の形式でエージェントのインストラクションに埋め込むことで、動的プロンプトを実現できます。
## 🛠 使い方
`session.state` に辞書形式で値を設定します。例えば `session.state["booking_date"] = "2026-07-15"`、`session.state["party_size"] = 4`、`session.state["seat_type"] = "window"` のように通常のセッションスコープで保存します。スコープ付きステートとして、`"user:preferred_language"` のように `user:` プレフィックスでユーザー単位の永続データを、`"temp:search_results"` のように `temp:` プレフィックスでセッション終了時に消える一時データを、`"app:maintenance_mode"` のように `app:` プレフィックスで全ユーザー共通のデータを設定できます。さらに、`Agent` の `instruction` に `{booking_date}` や `{party_size}`、`{user:preferred_language}` のようにプレースホルダーを埋め込むことで、ステートの値を動的にインストラクションへ反映できます。
## 🏗 実践的な使い方
**レストラン予約フローでの活用:**
会話の中で段階的に情報を収集し、Stateに蓄積していきます。
1. 「明日の夜、4人で予約したいです」→ `booking_date`, `party_size` をStateに保存
2. 「窓際がいいです」→ `seat_type` を追加
3. 「アレルギーはナッツです」→ `allergies` を追加
4. 最終確認時、Stateから全情報を取り出して確認メッセージを生成
インストラクションに `{booking_date}` を埋め込んでおけば、エージェントは常に最新の予約状況を把握した上で応答できます。
**ユーザー設定の永続化:**
`user:` プレフィックスを使えば、セッションが変わっても「この人は日本語を好む」「この人はベジタリアン」といった情報を引き継げます。
## 💡 ユースケース
- 🛒 ECサイト: カートの中身をStateで管理。`temp:` で検索フィルタ、`user:` で配送先住所
- ✈️ 旅行予約: 日程・人数・座席タイプを段階的にState蓄積
- 🤖 パーソナライズ: `user:` スコープでユーザーの好みを学習・永続化
- 📊 ダッシュボード: `app:` でシステム全体のステータスを共有
## ⚠️ 注意点
- Stateに大量のデータを保存するとパフォーマンスが低下します。大きなデータはArtifactsの利用を検討してください
- `app:` スコープの変更は全ユーザーに影響します。慎重に使いましょう
- `{state_var}` でインストラクションに埋め込む場合、値が未設定だとプレースホルダーがそのまま表示されることがあります。デフォルト値を用意してください
- Stateのキー名は衝突しないよう、命名規則を決めておくことをお勧めします
✨ Stateのスコープ管理と動的プロンプトを活用すれば、文脈を理解した賢いエージェントが構築できます。予約フローやパーソナライズに最適です!
#
ADK# #
AIAgent#