ADK、MCP、Memory Bank を使用してパーソナライズされたエージェントを構築する

1. はじめに

最新のエージェント スタック

本番環境グレードの AI エージェントを構築するには、大規模言語モデル(LLM)以上のものが必要です。LLM は推論機能を提供しますが、堅牢なエージェントは外部世界とやり取りし、会話の状態を管理し、ユーザーの好みを長期にわたって記憶する必要があります。

demo1demo2

このワークショップでは、次の 3 つの基盤となるテクノロジーを使用して、包括的なエージェント システムを設計して構築する方法を学びます。

  1. 接続(MCP): エージェントがローカル ツールとデータにアクセスできるようにします。
  2. オーケストレーション(ADK): エージェントの推論ループと状態を管理します。
  3. メモリ(Memory Bank): 長期的なパーソナライズされたコンテキストを提供します。

workshop_overview

基本概念

コンポーネント

関数

Model Context Protocol(MCP)

カスタム統合なしで AI モデルを外部システム(データベース、ファイル システム、API)に接続するユニバーサル標準。

Agent Development Kit(ADK)

エージェントのランタイム環境を提供し、イベント ループ、状態遷移、ツールの実行を管理するフレームワーク。

セッション サービス

短期記憶を処理します。直前の会話のコンテキスト((「お客様は何とおっしゃいましたか?」)が、セッションが終了するとクリアされます。

Vertex AI Memory Bank

長期記憶を処理します。ユーザー固有の事実や設定(「ユーザーは Python を好む」)を無期限に保存し、エージェントが今後のやり取りをパーソナライズできるようにします。

Vertex AI Agent Engine

エージェントのロジックとメモリ コンポーネントを大規模にホストするマネージド インフラストラクチャ サービス。

作成するアプリの概要

これらのコンセプトを実際に示すために、ホリデー デザイン アシスタントを作成します。このエージェントは、ユーザーの高度なリクエストを受け取り、ローカルの Python ツールを自律的にオーケストレートして、パーソナライズされたコードと画像を生成できます。

次の 3 つのステージを進みます。

  1. ツールレイヤ: MCP サーバーを作成して、ローカルの Python 関数を AI に公開します。
  2. エージェント レイヤ: ADK を使用して、複数ステップのワークフローを計画して実行するエージェントを構築します。
  3. Memory Layer: Memory Bank を統合して、エージェントがユーザーのスタイルの好みを学習して記憶できるようにします。

2. セットアップ

AI エージェントを強化するには、基盤となる Google Cloud プロジェクトが必要です。

パート 1: 請求先アカウントを有効にする

  • デプロイに必要な 5 ドルのクレジットで請求先アカウントを請求します。Gmail アカウントであることを確認します。

パート 2: オープン環境

  1. 👉 このリンクをクリックすると、Cloud Shell エディタに直接移動します。
  2. 👉 今日、どこかの時点で承認を求められた場合は、[承認] をクリックして続行します。Cloud Shell を承認する
  3. 👉 画面下部にターミナルが表示されない場合は、ターミナルを開きます。
    • [表示] をクリックします。
    • [ターミナル] をクリックします。Cloud Shell エディタで新しいターミナルを開く
  4. 👉💻 ターミナルで、次のコマンドを使用して、認証が完了しており、プロジェクトがプロジェクト ID に設定されていることを確認します。
    gcloud auth list
    
  5. 👉💻 GitHub からブートストラップ プロジェクトのクローンを作成します。
    git clone https://github.com/cuppibla/holiday_workshop
    
  6. 👉💻 プロジェクト ディレクトリから設定スクリプトを実行します。
    cd ~/holiday_workshop
    ./init.sh
    
    残りの設定プロセスはスクリプトによって自動的に処理されます。
  7. 👉💻 必要なプロジェクト ID を設定します。
    gcloud config set project $(cat ~/project_id.txt) --quiet
    

パート 3: 権限の設定

  1. 👉💻 次のコマンドを使用して、必要な API を有効にします。これには数分かかることがあります。
    gcloud services enable \
        cloudresourcemanager.googleapis.com \
        servicenetworking.googleapis.com \
        run.googleapis.com \
        aiplatform.googleapis.com \
        compute.googleapis.com
    
  2. 👉💻 ターミナルで次のコマンドを実行して、必要な権限を付与します。
    . ~/holiday_workshop/set_env.sh
    

.env ファイルが作成されていることに注目してください。プロジェクト情報が表示されます。

3. MCP でパワーアップ

AI の「USB-C」の瞬間

新しいマウスを購入するたびに、マザーボードにハンダ付けする必要があるとしたらどうでしょうか。これが、最近までの AI ツールの状態でした。デベロッパーは、LLM をデータベース、ファイル システム、API に接続するためにカスタムの「グルーコード」を記述する必要がありました。

Model Context Protocol(MCP)を入力します。MCP は、AI アプリケーション用の USB-C ポートのようなものです。AI モデルをデータソースやツールに接続するための標準化された方法を提供します。

ツール用の MCP サーバーを 1 回構築すると、コードを 1 行も変更することなく、Gemini CLI、IDE、その他の MCP 準拠のクライアントに接続できます。

作成するアプリの概要

mcp_server

この Codelab では、次の機能を備えたホリデー デザイン アシスタントを作成します。

  1. MCP を使用してローカル環境に接続します(スタジオ ツール)。
  2. Agent Development Kit(ADK)を使用して、会話コンテキストを確実に管理します。
  3. 設定を記憶する(例: 「Python コードが好きです」など)を Vertex AI Memory Bank を使用してさまざまなセッションで保持します。

サーバー ロジックの構築

環境は準備しましたが、サーバー ロジックが不完全です。エージェントが最終的にホリデー カードの作成に使用する 4 つのツールを実装する必要があります。

パート 1: サーバーのスケルトンを開く

01-MCP-Files-Testing/01-starter ディレクトリで作業します。

  1. Cloud Shell ターミナルで、正しいディレクトリにいることを確認します。
    cd ~/holiday_workshop/01-MCP-Files-Testing/01-starter/
    
  2. 次のコマンドを実行して、Cloud Shell エディタでファイルを開きます。
    cloudshell edit ~/holiday_workshop/01-MCP-Files-Testing/01-starter/mcp_server.py
    

ボイラープレート コード(MCP サーバーの設定、接続の処理、Vertex AI クライアントの初期化)はすでに完了しています。ただし、4 つのコア関数は現在空のプレースホルダです。

パート 2: ホリデー シーン ジェネレータを実装する

まず、ユーザーの興味(「鳥」)を、画像生成に最適化された詳細なプロンプトに変換します。

generate_holiday_scene 関数内のコメント #REPLACE_GENERATE_HOLIDAY_SCENE を見つけます。

この行全体を次のコードに置き換えます。

    prompt = (
        f"""
        Create a cozy, high-fidelity 3D render of a winter holiday scene.
        The scene should be warm and inviting with soft cinematic lighting.
        
        Seamlessly integrate the following specific theme/interest into the 
        holiday decor or landscape: {interest}.
        
        The style should be whimsical but detailed.
        Aspect Ratio: 16:9 Landscape.
        """
    )
    generate_image(prompt, "16:9", "static/generated_scene.png")
    return "Done! Saved at generated_scene.png"

パート 3: 最終的な写真の結果を実装する

最後に、照明とスタイルが写実的で祝祭的なものになるようにします。

コメント #REPLACE_GENERATE_FINAL_PHOTO を見つけます。

この行全体を次のコードに置き換えて、最終的なスタイル変換とレンダリングを行います。

    prompt = (
        """
        Generate a photorealistic close-up shot of a rustic wooden fireplace mantle.
        
        Lighting: Warm, glowing ambient light from a fire below (out of frame).
        Background: Softly blurred (bokeh) pine garland and twinkling lights.
        
        Foreground Composition:
        1. A wooden picture frame containing the [attached selfie image]. 
           The face in the photo must be clearly visible.
        2. A folded holiday greeting card standing upright next to the frame. 
           The front of the card displays the [attached holiday scene image] as a print.
           
        Ensure the perspective is grounded and realistic, as if taken with a 50mm lens.
        """
    )
    generate_image(prompt, "16:9", "static/generated_final_photo.png", ["static/generated_selfie.png", "static/generated_scene.png"])
    return "Done! Saved at generated_final_photo.png"

環境設定

コードが配置されたので、依存関係がインストールされていることを確認する必要があります。高速な Python パッケージおよびプロジェクト管理ツールである uv を使用します。

👉💻 ターミナルで次のコマンドを実行して、FastMCP をプロジェクトの依存関係として追加します。

cd ~/holiday_workshop/01-MCP-Files-Testing/01-starter/
uv add fastmcp

~/holiday_workshop/01-MCP-Files-Testing/01-starter/pyproject.toml ファイルに新しい依存関係 fastmcp>=2.13.3 が追加されます。

4. MCP サーバーの Gemini CLI を使用したテスト

サーバーコードが完成したので、テスト方法について説明します。

通常、バックエンド サーバーのテストには、フロントエンド UI の構築または複雑な curl リクエストの作成が必要です。ただし、ここでは Gemini CLI を使用できます。

これはロジックを分離するため、開発に非常に役立ちます。ウェブ インターフェースやエージェント フレームワークの構築を心配する前に、モデルがツールを理解し、正しく呼び出していることを確認できます。

Connect and Run

mcp add コマンドを使用して、Gemini CLI にサーバーの管理を指示します。

ターミナルで次のコマンドを実行します。

gemini mcp add holidays uv run ~/holiday_workshop/01-MCP-Files-Testing/01-starter/mcp_server.py
  • add holidays: サーバーにニックネーム(holidays)を付けました。
  • uv run ...: 先ほど変更した Python サーバーを起動する明示的なコマンドを指定しました。

魔法をかけよう!

チャット セッションを開始します。

gemini

次のプロンプトを試して、Gemini が新しいツールを「認識」できるかどうかをテストします。Gemini CLI で祝日ツールを使用できるようにする必要がある場合があります。

  • 👉 ユーザー:
    "I want to create a festive holiday photo. I like birds a lot."
    
  • Gemini:
    *Thinking...*
    *Calling tool: generate_holiday_scene(interest='birds')*
    
    Done! Saved at generated_scene.png
    
  • 👉 ユーザー:
    "Great! Now generate a knitting pattern for a sweater with reindeer on it."
    
  • Gemini:
    *Thinking...*
    *Calling tool: generate_sweater_pattern(motif='reindeer')*
    
    Done! Saved at generated_pattern.png
    
    MCP を使用したため、AI はリクエストを満たすために呼び出す Python 関数を正確に理解しました。

写真を確認する

  • Control+C を押して Gemini CLI を終了します。
  • 生成された画像がフォルダ(~/holiday_workshop/01-MCP-Files-Testing/01-starter/static)にあることを確認します。

写真を確認する:

まとめと次のステップ

おめでとうございます!動作する MCP サーバーが正常に構築されました。これで、パターンを生成したり、画像を合成したり、シーンを調整したりできる「AI ツール」の機能的なセットが完成しました。

ただし、上記のテストで何か気づいたことはありますか?プロセスを推進する必要がありました。シーンをリクエストし、次にパターンをリクエストし、次にそれらを組み合わせるようリクエストする必要がありました。

Gemini はスマートですが、複雑な本番環境ワークフロー(セーターにパターンを配置する前にパターンを生成し、画像生成が失敗した場合はエラーを処理する必要がある)では、より詳細な制御が必要になります。私たちは、すべてのステップで手助けをしなくても、計画を立て、自分の仕事を批判し、ホリデー カードの状態を管理できる専用のシステムを求めています。

次のセクションでは、この創造的なカオスを整理します。Agent Development Kit(ADK) を実装して、これらの MCP ツールを完璧な本番環境パイプラインにオーケストレートする構造化されたエージェントを構築します。

5. ADK エージェントのバイブ コーディング

ツール(MCP サーバー)の動作セットはありますが、現在、すべての重い処理は Google が行っています。つまり、どのツールをいつ呼び出すかを Gemini に正確に指示しています。

このセクションでは、推論、計画、複数ステップのタスクの自律的な実行を行うシステムである AI エージェントを構築します。これを行うには、Agent Development Kit(ADK)を使用します。

agent_mcp

エージェントとは

MCP ツールが「手」(作業を行う)だとすると、エージェントは「脳」です。エージェントは LLM を使用してユーザーの意図(「ホリデー カードを作成して」)を理解し、手順(「まずシーン、次にパターンが必要だ」)に分解して、目標を達成するために使用するツールを決定します。

ADK とは

エージェント開発キット(ADK)は、このようなエージェントの構築を容易にする Google のフレームワークです。チャット履歴の管理、ツールへの接続、さまざまなモデルの切り替えなど、複雑な「配管」を処理するため、アプリの個性とロジックに集中できます。

コンテキスト ベースのバイブ コーディング

単一の大きなプロンプトを使用してコードを生成するのは一般的なパターンです。ただし、複雑なアプリケーションを構築する場合は、AI を時間の経過とともにコンテキストを維持するパートナーとして扱う方がよいことがよくあります。

Gemini CLI のメモリ機能を使用して、コードを 1 行も記述する前にステージを設定します。

1. 環境を準備する

ターミナルを開き、スターター ディレクトリに移動します。

cd ~/holiday_workshop/02-Vibe-Coding-ADK-Agent/01-starter

Gemini CLI を起動します。

gemini

2. コンテキストとメモリの管理

バイブコーディングを行う場合、AI は自分がで、を知っているかを知る必要があります。Gemini CLI を使用すると、これを明示的に管理できます。

  • /memory show: これを入力すると、AI が現在プロジェクトとセッションについて把握している内容を確認できます。
  • /memory add: 会話全体で AI が記憶しておくべき基礎知識を挿入するために使用します。

まず、コーディング パートナーのペルソナを定義しましょう。Gemini CLI 内で次のコマンドを実行します。

/memory add "You are an expert Python developer specialized in the Google Agent Development Kit (ADK). You write clean, modular code and prefer using the latest ADK patterns."

Gemini は自分の役割を理解しています。このコンテキストは以降のすべてのレスポンスに影響し、高品質の ADK 準拠コードが保証されます。

3. ステップ 1: 基本エージェントのバイブ コーディング

システム全体を一度に生成しようとするのではなく、スケルトンから始めましょう。ファイル構造と基本的なエージェントの個性を確立します。

Gemini CLI に次のプロンプトを入力します。

Let's start by building the basic agent structure. 

Please create a file structure for a `root_agent`. 
1. Create `root_agent/__init__.py` that imports `agent`.
2. Create `root_agent/agent.py` by following exactly how this file is doing import and agent creation @~/holiday_workshop/02-Vibe-Coding-ADK-Agent/01-starter/agent_reference.py

In `agent.py`:
- Create an `Agent` named "root_agent" using the model "gemini-2.5-flash".
- The instruction string should define a "Holiday Magic Assistant". 
- The personality should be enthusiastic (`🎄✨`) and prefer "cute, kawaii, cartoon" styles for any visual tasks.

Gemini がファイル構造と初期 Python コードを生成します。プレビューを確認して、正しく表示されていることを確認してから、変更を適用または承認します。

4. ステップ 2: MCP サーバー(ツール)を追加する

基本的なエージェントができたので、それに「手」を付け加える必要があります。エージェントを、前のラボで構築した MCP サーバーに接続する必要があります。

Gemini CLI に次のプロンプトを入力します。

Now, let's give the agent access to tools. Update `agent.py` to include our local MCP server. By following exactly how this agent is connecting to mcp tool @~/holiday_workshop/02-Vibe-Coding-ADK-Agent/01-starter/agent_reference.py

In `agent.py`:
- Import `McpToolset` to define our STDIO MCP server. as @~/holiday_workshop/02-Vibe-Coding-ADK-Agent/01-starter/agent_reference.py
- Connect to the python file located at `../mcp_server.py` relative to agent.py.

Gemini は、既存の agent.py をリファクタリングして、ツール定義と接続ロジックを含めます。

注: 作業内容を確認する場合や、生成されたコードが想定どおりに動作しない場合は、~/holiday_workshop/02-Vibe-Coding-ADK-Agent/solution にあるリファレンス ソリューションとファイルを比較できます。

6. エージェント ウェブ インターフェースを実行する

ADK には、adk web という組み込みのテスト インターフェースが付属しています。これにより、軽量のチャット UI が起動し、エージェントとすぐに会話できます。

  1. GeminiCLI がまだ開いている場合は、control+C を押して閉じます。ターミナル(solution フォルダ内。starter フォルダに移動して uv run adk web を実行すると、コードをテストできます)で、次のコマンドを実行します。starter
    cd ~/holiday_workshop/02-Vibe-Coding-ADK-Agent/02-solution
    uv run adk web --port 8000
    
  2. Cloud Shell は、ポート 8000 でサービスが実行されていることを警告します。[ウェブでプレビュー] -> [ポート 8000 でプレビュー] をクリックします。

エージェントをテストする

チャット インターフェースが表示されます。エージェントが新しい手順に沿って MCP ツールに正しくアクセスできるかどうかを確認します。

次のプロンプトを試してみましょう。

  • 「お世話になっております。あなたは誰ですか?」
    • (お祝いの言葉や熱意のこもった返信を期待します)。
  • 「ホリデー カードの背景が必要です。雪の村にして。」
    • (エージェントは generate_holiday_scene に電話する必要があります。システム指示で定義された「かわいい/漫画風」のスタイルが自動的に適用されていることに注目してください。
  • 「小さなピザのスライスが描かれたセーターのパターンを生成して。」
    • (エージェントは generate_sweater_pattern に電話する必要があります)。

生成された画像は、こちらで確認できます。

テストが完了したら、Control+C を押して終了します。

まとめと次のステップ

これで、コンテキストアウェア アプローチを使用して Google ADK エージェントを「バイブコード化」できました。

  • コンテキストを確立しました: /memory add を使用して、エキスパート ペルソナを定義しました。
  • 反復的に構築: まずスケルトンを作成し、次にツール接続を追加しました。

組み込みの ADK ウェブ プレビューはテストには最適ですが、最終的なプロダクトでは、カスタムのブランド エクスペリエンスが必要です。次のセクションでは、このエージェントをカスタム ウェブ フロントエンドに統合します。

7. ADK と UI の接続

backend_architecture

エージェントの定義ができたので、実行する必要があります。ここで RunnerSession Service が登場します。

実装

  1. 👉 コマンドに次のように入力します。
    cloudshell edit ~/holiday_workshop/03-Connect-ADK-MCP-UI/01-starter/backend/main.py
    
    エディタで ~/holiday_workshop/03-Connect-ADK-MCP-UI/01-starter/backend/main.py が開きます。
  2. # TODO: Create Session Service を次のように置き換えます。
    from google.adk.sessions import InMemorySessionService
    from google.adk.memory import InMemoryMemoryService
    session_service = InMemorySessionService()
    memory_service = InMemoryMemoryService()
    
  3. # TODO: Initialize Runner を次のように置き換えます。
    runner = Runner(
        app_name="agents",
        agent=christmas_agent,
        session_service=session_service,
        memory_service=memory_service,
    )
    
  1. ~/holiday_workshop/03-Connect-ADK-MCP-UI/01-starter/backend/main.py対応は不要)の 158 行目を確認します。アプリケーションが最終レスポンスを取得する方法について疑問に思われるかもしれません。ランナーによって駆動されるイベント ループは次のとおりです。
    async for event in runner.run_async(
        user_id=user_id,
        session_id=session_id,
        new_message=content
    )
    

詳細: アーキテクチャとデプロイ

このエージェントの提供には FastAPI を使用しています。

  • FastAPI を使用する理由: エージェントは多くの場合、I/O バウンド(LLM を待機中)です。FastAPI の非同期の性質により、この処理は完璧に処理されます。
  • ステートレス: API エンドポイントはステートレスです。変数はグローバル スコープに保存されません。session_idSessionService を使用して、リクエストごとに状態を再構築します。つまり、これを Cloud Run(サーバーレス)にデプロイして、ゼロにスケーリングできます。

8. エージェント マジックでアプリケーションを試す

  1. 👉💻 コマンドに次のように入力します。
    cd ~/holiday_workshop/03-Connect-ADK-MCP-UI/01-starter
    ./start_app.sh
    
    エディタで ~/holiday_workshop/03-Connect-ADK-MCP-UI/01-starter/backend/main.py が開きます。
  2. 次のような結果が表示されます。portresult👉👉 http://localhost:5173/ をクリックするか、新しいウィンドウを開いて http://localhost:5173/ と入力してください。
  3. チャット インターフェースを備えたウェブサイトが表示されます。ウェブサイト
  4. 画像を 1 枚アップロードしてテストします(自分自身やペットの画像など)。upload
  5. 👉 次に質問します
    Can you generate a picture my cat wearing snowflake pattern sweater?
    
    生成された画像はここに表示されます。猫
  6. 👉💻 テストが完了したら、ターミナルで control+C キーを押してプロセスを終了します。

期待どおりに動作しない場合は、~/holiday_workshop/03-Connect-ADK-MCP-UI/02-solution に移動して ./start_app.sh を実行し、上記と同じ手順を行います。

9. Vertex AI Memory Bank

agent_memory

短期記憶と長期記憶

  • 短期的なコンテキスト: 「さっき何と言いましたか?」(セッション履歴)。これは、チャット ウィンドウを閉じると失われます。
  • 長期記憶: 「私のお気に入りのプログラミング言語は何ですか?」(ユーザー設定)。これは永続的に保持されます。

Vertex AI Memory Bank は、この長期保存を提供します。これにより、エージェントはユーザーに関するパーソナライズされた情報を保存して取得できます。

セッション数と Memory Bank

  • セッションVertexAiSessionService): ログです。すべてのメッセージ、ツール呼び出し、イベント(AppendEventListEvents)の未加工の時系列順のシーケンスを保存します。何が起こったかについてのグラウンド トゥルースを提供します。
  • Memory BankVertexAiMemoryBankService): これはナレッジです。合成された長期的なファクト(GenerateMemoriesRetrieveMemories)を保存します。特定の user_id にスコープ設定され、プライバシーと分離が確保されます。
  1. 👉💻 コマンドに次のように入力します。
    cloudshell edit ~/holiday_workshop/04-Adding-Memory-Bank/01-starter/backend/main.py
    
    エディタで ~/holiday_workshop/04-Adding-Memory-Bank/01-starter/backend/main.py が開きます。
  2. # TODO: Create Vertex AI Session Service & Memory Bank Service を検索し、行全体を次のように置き換えます。
        session_service = VertexAiSessionService(
            project=PROJECT_ID, location=LOCATION, agent_engine_id=AGENT_ENGINE_ID
        )
        memory_service = VertexAiMemoryBankService(
            project=PROJECT_ID, location=LOCATION, agent_engine_id=AGENT_ENGINE_ID
        )
    
    

memory_compare

  1. 👉💻 コマンドに次のように入力します。
    cloudshell edit ~/holiday_workshop/04-Adding-Memory-Bank/01-starter/backend/deploy_agent.py
    
    エディタで ~/holiday_workshop/04-Adding-Memory-Bank/01-starter/backend/deploy_agent.py が開きます。
  2. # TODO: Set Up Configuration を次のように置き換えます。
    # Basic configuration types
    MemoryBankConfig = types.ReasoningEngineContextSpecMemoryBankConfig
    SimilaritySearchConfig = (
        types.ReasoningEngineContextSpecMemoryBankConfigSimilaritySearchConfig
    )
    GenerationConfig = types.ReasoningEngineContextSpecMemoryBankConfigGenerationConfig
    
    # Advanced configuration types
    CustomizationConfig = types.MemoryBankCustomizationConfig
    MemoryTopic = types.MemoryBankCustomizationConfigMemoryTopic
    CustomMemoryTopic = types.MemoryBankCustomizationConfigMemoryTopicCustomMemoryTopic
    GenerateMemoriesExample = types.MemoryBankCustomizationConfigGenerateMemoriesExample
    ConversationSource = (
        types.MemoryBankCustomizationConfigGenerateMemoriesExampleConversationSource
    )
    ConversationSourceEvent = (
        types.MemoryBankCustomizationConfigGenerateMemoriesExampleConversationSourceEvent
    )
    ExampleGeneratedMemory = (
        types.MemoryBankCustomizationConfigGenerateMemoriesExampleGeneratedMemory
    )
    

memory_process

  1. 👉 同じファイル内: 04-Adding-Memory-Bank/01-starter/backend/deploy_agent.py# TODO: Set up topic を探し、行全体を次のように置き換えます。
        custom_topics = [
            # Topic 1: Sweater Preference
            MemoryTopic(
                custom_memory_topic=CustomMemoryTopic(
                    label="sweater_preference",
                    description="""Extract the user's preferences for sweater styles, patterns, and designs. Include:
                    - Specific patterns (snowflake, reindeer, geometric, fair isle, solid, etc.)
                    - Style preferences (chunky knit, cardigan, pullover, turtleneck, oversized, fitted)
                    - Color preferences (red, green, navy, pastel, etc.)
                    - Material preferences if mentioned (wool, cotton, cashmere, itchy/soft)
                    - Themes (retro, modern, ugly christmas sweater, elegant)
    
                    Example: "User wants a retro style sweater with a pixelated reindeer pattern."
                    Example: "User prefers dark blue colors and hates itchy wool."
                    """,
                )
            ),
            # Topic 2: Personal Context
            MemoryTopic(
                custom_memory_topic=CustomMemoryTopic(
                    label="personal_context",
                    description="""Extract the user's personal context including hobbies, pets, interests, job, and preferred scenes. Include:
                    - Hobbies and activities (skiing, reading, gaming, cooking, etc.)
                    - Pets (type, breed, name, color)
                    - Job or profession if relevant to their style
                    - General interests (sci-fi, nature, vintage, tech)
                    - Preferred scenes or vibes (cozy fireplace, snowy mountain, cyberpunk city, beach)
    
                    Example: "User has a golden retriever named Max."
                    Example: "User loves skiing and wants a snowy mountain background."
                    Example: "User is a software engineer who likes cyberpunk aesthetics."
                    """,
                )
            )
        ]
    
  2. 👉 同じファイル内: 04-Adding-Memory-Bank/01-starter/backend/deploy_agent.py# TODO: Create Agent Engine を探し、行全体を次のように置き換えます。
        agent_engine = client.agent_engines.create(
            config={
                "display_name": AGENT_DISPLAY_NAME,
                "context_spec": {
                    "memory_bank_config": {
                        "generation_config": {
                            "model": f"projects/{PROJECT_ID}/locations/{LOCATION}/publishers/google/models/gemini-2.5-flash"
                        },
                        "customization_configs": [customization_config]
                    }
                },
            }
        )
    

プロンプトを使用するだけでよいのではないでしょうか?

「ユーザーの履歴をプロンプトに貼り付ければいいのではないか」と思われるかもしれません。

  • サイズの上限: コンテキスト ウィンドウは大きいですが、無限ではありません。5 年分の履歴を収めることはできません。
  • 費用: 「Hello」ごとに 100 万トークンを処理するのは費用がかかりすぎます。
  • 焦点: Memory Bank は、エージェントの検索エンジンとして機能します。関連性の高い事実のみを取得します。
  1. 👉💻 コマンドに次のように入力します。
    cloudshell edit ~/holiday_workshop/04-Adding-Memory-Bank/01-starter/backend/agent.py
    
    エディタで ~/holiday_workshop/04-Adding-Memory-Bank/01-starter/backend/agent.py が開きます。
  2. ファイル: ~/holiday_workshop/04-Adding-Memory-Bank/01-starter/backend/agent.py# TODO: Add PreloadMemoryTool を次のように置き換えます。
    if USE_MEMORY_BANK:
        agent_tools.append(PreloadMemoryTool())
    

PreloadMemoryTooladd_session_to_memory

agent.py には、次の 2 つの主要なコンポーネントがあります。

  • PreloadMemoryTool: エージェントが「Google 自身を検索」できるツールです。ユーザーが「いつものコーヒーをください」のような曖昧なリクエストをした場合、エージェントはこのツールを使用して、回答する前に Memory Bank に「コーヒーの好み」をクエリできます。
  • add_session_to_memory: これはバックグラウンド コールバックです。
    • 非同期処理のメリットメモリの保存には時間がかかります(チャットの要約、事実の抽出など)。ユーザーにこの処理を待っていただく必要はありません。after_agent_callback を使用してバックグラウンド(add_session_to_memory)で実行します。

10. Memory Bank の動作

  1. 👉💻 コマンドに次のように入力します。
    cd ~/holiday_workshop/04-Adding-Memory-Bank/01-starter
    ./use_memory_bank.sh
    
    結果は次のようになります。deploy_agent_result ~/holiday_workshop/.env ファイルを確認すると、(対応不要)と表示されます。
    USE_MEMORY_BANK=TRUE
    AGENT_ENGINE_ID={agent_engine_id}
    
  2. 👉💻 アプリケーション UI でメモリをテストします。コマンドに次のように入力します。
    cd ~/holiday_workshop/04-Adding-Memory-Bank/01-starter
    ./start_app.sh
    
    http://localhost:5173/ をクリックするか、新しいウィンドウを開いて http://localhost:5173/ と入力してください。Uvicorn running on http://0.0.0.0:8000 はバックエンド サーバーであり、クリックする実際のリンクではありません。これで、ウェブサイトのチャット インターフェースがパーソナライズされたエージェントになりました。ウェブサイト
  3. 👉メモリをテストします。UI で入力した場合:
    I want a sweater that matches my dog. He's a golden retriever.
    
    I'm a programmer, so I want something geeky. Maybe a matrix style?
    
    I like snowflake sweater pattern
    

エージェントはこれを好みとして認識し、メモリバンクに保存します。

来週(または Control+C./start_app.sh でアプリケーションを再起動したとき)に、次のように尋ねると、

what is my preference on sweater pattern?

エージェントは Memory Bank にクエリを実行し、設定を確認して、ユーザーに尋ねることなくセーターのパターンを生成します。10 件の結果

  1. Google Cloud コンソールの Agent Engine に移動して、Vertex AI Agent Engine で確認します。
    • 左上のプロジェクト選択ツールでプロジェクトを選択します。プロジェクト セレクタ
    • 前のコマンドでデプロイしたエージェント エンジンを確認します。use_memory_bank.shエージェント エンジン作成したエージェント エンジンをクリックします。
  2. このデプロイされたエージェントの [Memories] タブをクリックすると、すべてのメモリを表示できます。思い出を表示する

おめでとうございます!これで、メモリバンクがエージェントにアタッチされました。

11. まとめ

概要

これで、完全なエージェント システムの設計と構築が完了しました。

  • 接続: MCP を使用して、エージェントがローカルツールにアクセスする方法を標準化しました。
  • オーケストレーション: ADK を使用して、マルチステップ タスクに必要な複雑な推論ループを管理しました。
  • パーソナライズ: Memory Bank を使用して、ユーザー コンテキストを記憶する永続的な学習レイヤを作成しました。

次のステップ

  • 独自の MCP サーバーを構築する: 内部 API またはデータベース用のサーバーを作成します。
  • ADK パターンについて調べる: ADK ドキュメントで「推論ループ」と「オーケストレーション」について学習します。
  • デプロイ: エージェントをローカル スクリプトから Cloud Run の本番環境サービスに移行します。