2026年7月17日

【Memory Bank】ユーザーとのやり取りや知識、実績を蓄積し、「成長・継承」できるエージェントを作りたい


Content

こんにちは!teraです!!

早速ですが、AIエージェントを使っていて、こんな経験をしたことはないでしょうか?


「先週話した内容、覚えていてよ…」
「毎回同じことを説明するのが面倒だな」
「担当者が変わっても、これまでの経緯を引き継いでほしい」

通常のLLMベースのエージェントは、会話のたびに記憶がリセットされます。どれだけ丁寧に教えても、セッションが終わればゼロに戻る。これでは本当の意味での「パートナー」とは言えません。

この課題を解決するのが Memory Bank という考え方です。Memory Bank を導入することで:


  • ユーザーの好みや役職などを記憶し、パーソナライズした応答ができる
  • プロジェクトの状況や過去の議論を蓄積・引き継げる
  • エージェント自身が会話を重ねるたびに「成長」していく

本記事では、Memory Bank の仕組みの解説から、Python を使った実装・動作確認まで、実際のコードを交えて紹介します。

Memory Bank の詳しい説明

AIエージェントの「記憶」の3分類

AIエージェントの記憶は、Google ADK などの主要なエージェント SDK が採用している分類に沿うと整理しやすくなります。大きく State(短期記憶)/ Artifact(一時記憶)/ Memory(長期記憶) の3種類です。


State(短期記憶)

「セッション中のメモ帳」

State とは、1回の会話セッションの中でエージェントが保持する一時的な状態です。プログラムでいう「変数」に近い概念で、ユーザーとの会話の流れや操作の進捗をリアルタイムで記録します。

# Stateの典型的な実装イメージ(Google ADK)
session.state["user_name"] = "tera"
session.state["quiz_step"] = 3
session.state["score"]     = 80

# セッション終了(プロセス終了)と同時に消える

Google ADK では、状態を4つの名前空間で管理できます:

user:  や app: プレフィックスを使うと、セッションをまたいで一部の情報を引き継ぐこともできます。ただし、会話の文脈全体を保存するというより、設定値や進捗フラグなどシンプルなデータの管理に向いています。

✅ 向いているシーン
会話の途中の状態(クイズの進行状況、フォームの入力途中など) / 1セッション内で完結するタスクの文脈管理 / プロトタイプ・検証段階の開発

Artifact(一時記憶)

「作業の中で生み出した成果物の置き場」

Artifact とは、エージェントがタスクを実行する過程で外部に出力・保存するファイルや構造化データです。生成したコード、分析レポート、PDF や画像ファイルなどが該当します。

# Artifactの典型的な実装イメージ(Google ADK)
await tool_context.save_artifact(
    filename="report_2026-05.pdf",
    artifact=pdf_bytes   # バイナリデータとして保存
)

# 後続の処理で再利用 artifact = await tool_context.load_artifact("report_2026-05.pdf")
✅ 向いているシーン
コード生成・ドキュメント作成・データ分析の結果を保存したい場面 / 複数のツール(エージェント)間でファイルを受け渡したい場面 / 人間がレビュー・承認する成果物を作る用途

Memory(長期記憶)とそのバリエーション

「セッションをまたいで持続する記憶」

Memory とは、セッションが終わっても消えない永続的な記憶です。「このユーザーは〇〇が好き」「前回のクイズスコアは80点だった」といった情報をまたいで保持するために使います。

❓ 「アプリを再起動してもセッションが引き継がれる」のはなぜ?

ChatGPT や Claude.ai で「前の会話に戻れる」のは、会話ログをそのままデータベースに保存しているからです。これは「セッション永続化(Persistent Session)」と呼ばれる手法で、長期記憶の一形態です。

① ユーザーがメッセージを送信

② メッセージをDBに保存(会話ID紐づけ)

③ DBから過去ログを全件取得 → LLMに渡す

④ アプリ再起動後も同じ会話IDでDBから復元 → 続きから話せる

Google ADK ではDatabaseSessionServiceを使ってこれを実現できます:

# PostgreSQLにセッションデータを保存する例
uv run adk web --session_service_uri="postgresql://user:pass@localhost:5432/mydb"
ただし、この方法には課題があります。会話量が増えるにつれてログが膨大になり、LLM へ渡すトークン数が増大します。また「何を覚えておくべきか」の選別がなく、不要な情報も含めて全件保存してしまいます。
これが Memory Bank と本質的に異なる点です。

長期記憶の実装方法の比較

Memory Bank とは何か(核心)

「録音」ではなく「ノートにまとめる」ことが Memory Bank の本質

DB永続化(Persistent Session)が会話の「録音・録画」だとすれば、Memory Bank は自分でまとめたノートです。

Google の Vertex AI(現Agent Platform) Memory Bank では、Gemini モデルが会話セッションを分析し、重要な情報だけを自動的に抽出・蒸留して保存します。次のセッションでは、膨大なログを全件渡すのではなく、厳選された記憶だけをコンテキストとして活用します。

【DB永続化(録音)】
会話ログ全体 → そのままDBへ → 次回も全部読み込む
→ 問題: トークン肥大化、不要情報も混入

【Memory Bank(ノート)】
会話ログ → LLMが重要情報を抽出・蒸留 → 構造化して保存
→ 次回はコンパクトな記憶だけ読み込む

Memory Bank が保存する記憶の種類は以下の通りです:


全体比較

※ user: / app: プレフィックスを使えばセッション間で一部引き継ぎ可能

Memory Bank を使うべきタイミング

3つの記憶は競合するものではなく、目的に応じて組み合わせるのが正解です。

【セッション中の状態管理】                    → State
【ツール間のファイル受け渡し・成果物の保存】 → Artifact
【会話の「続き」を再現したい(アプリ再起動対応)】 → DB永続化
【ユーザーの成長・知識の継承・パーソナライズ】 → Memory Bank

✅ Memory Bank を選ぶべき場面

  • 「このユーザーはどんな人か」を覚えておきたいとき
  • 「前回こういう指摘をもらった」という経験を次回に活かしたいとき
  • 「このプロジェクトの背景」を毎回説明させたくないとき
  • 複数セッションにまたがってエージェントを「育てていく」とき
  • 担当者が変わっても知識を引き継ぎたいとき

❌ Memory Bank でなくてよい場面

  • 1回限りのタスクで使い捨てのエージェントを作るとき → State で十分
  • 会話の「続き」機能だけが欲しいとき → DB永続化で十分
  • 大量ドキュメントを横断的に検索したいとき → RAG が適切
Memory Bank は「人間関係と同じで、付き合いを重ねるほど価値が増す」仕組みです。一度きりの利用より、継続的に使い続けるエージェントに組み込むことで真価を発揮します。

実際の使用方法(コーディング)

ここでは Google ADK を使って Memory Bank と連携するパーソナル業務アシスタントを構築します。ユーザーの名前・役職・好みなどを長期記憶として蓄積し、セッションをまたいでパーソナライズされた応答ができるエージェントです。

ディレクトリ構成

.
├── memory_bank_sample_agent
│ ├── agent.py # エージェント定義
│ ├── .env # 環境変数
│ └── __init__.py
├── pyproject.toml
└── uv.lock

プロジェクトの準備

# uv プロジェクトの初期化
uv init --no-readme

# ADK パッケージの追加 uv add "google-adk>=1.29.0"
# エージェントのパッケージディレクトリを作成 mkdir memory_bank_sample_agent

# ADK がパッケージとして認識できるよう __init__.py を配置 echo "from . import agent" > memory_bank_sample_agent/__init__.py

エージェントのソースコード(agent.py)

Memory Bank との連携には、以下の2つの仕組みを使います。



# memory_bank_sample_agent/agent.py
from google.adk.agents import Agent
from google.adk.tools import google_search
from google.adk.tools.agent_tool import AgentTool
from google.adk.agents.callback_context import CallbackContext
from google.adk.tools.preload_memory_tool import PreloadMemoryTool


# 会話終了後に直近のやり取りを Memory Bank に保存するコールバック async def save_to_memory_callback(callback_context: CallbackContext): # 末尾の最終イベントを除いた直近5件を Memory Bank へ送信 await callback_context.add_events_to_memory( events=callback_context.session.events[-5:-1] ) return None

# Web 検索用のサブエージェント search_agent = Agent( name="search_agent", model="gemini-2.5-flash", description="Google検索で最新情報を調べるエージェント", instruction="ユーザーの質問に対してGoogle検索を使って情報を収集し、日本語で回答してください。", tools=[google_search], )
# ルートエージェント(Memory Bank 連携あり) root_agent = Agent( name="my_agent", model="gemini-2.5-flash", description="ユーザーの情報や好みを記憶するパーソナル業務アシスタント", instruction="""あなたはユーザーに寄り添うパーソナル業務アシスタントです。

過去のやり取りから得たユーザーの情報(名前・役職・好み・プロジェクトの状況など)を
積極的に活用して、パーソナライズされた応答をしてください。

対応できることの例:
- 業務に関する調査・情報収集(search_agent を活用)
- 資料作成・文章のサポート
- プロジェクトの進捗整理や次のアクション提案
- ユーザーの好みに合わせた回答スタイルの維持

回答は日本語で、ユーザーの好みに合わせて丁寧に行ってください。"""
, tools=[ AgentTool(agent=search_agent), PreloadMemoryTool(), # Memory Bank から記憶を自動ロード ], after_agent_callback=save_to_memory_callback, # 応答後に記憶を保存 )

Google Cloud の認証と環境変数設定

# プロジェクト ID を環境変数にセット
export PROJECT_ID=<プロジェクトID>

# Google Cloud CLI での認証 gcloud auth login
gcloud auth application-default login
gcloud config set project $PROJECT_ID

memory_bank_sample_agent/.env を作成します:

cat <<EOF > memory_bank_sample_agent/.env
GOOGLE_GENAI_USE_VERTEXAI=1
GOOGLE_CLOUD_PROJECT=$PROJECT_ID GOOGLE_CLOUD_LOCATION=us-central1
EOF

Agent Runtime へのデプロイ

uv run adk deploy agent_engine \
    --project=$PROJECT_ID \
    --region=us-central1 \
    --display_name="Memory Bank Sample Agent" \
    memory_bank_sample_agent

デプロイが成功すると、Agent Runtime のリソース名が出力されます:

✅ Created agent engine: projects/<プロジェクト番号>/locations/us-central1/reasoningEngines/<ID>

このリソース名を環境変数に保存しておきます:

export RESOURCE_NAME=projects/<プロジェクト番号>/locations/us-central1/reasoningEngines/<ID>

⚠️ リージョンに注意

Memory Bank 機能は現在 us-central1 のみ対応しています。asia-northeast1(東京)では Permission denied on ‘locations/…’ エラーが発生するため、必ず us-central1 を指定してください。

実装のポイント解説

POINT 1 — PreloadMemoryTool が記憶を自動注入する

エージェントの実行開始時に、Memory Bank からそのユーザーの記憶を取得してプロンプトに挿入します。開発者がプロンプト管理をしなくても、エージェントが「覚えている」状態を自動的に作り出してくれます。

POINT 2 — after_agent_callback で記憶を蓄積する

callback_context.add_events_to_memory()呼ぶことで、会話の終わりに直近のやり取りを Memory Bank へ送信します。Memory Bank 側では Gemini が会話内容を分析し、保存すべき重要情報だけを抽出・蒸留して記憶として保存します。

POINT 3 — スライスで送信するイベントを絞る

events[-5:-1]のように直近のイベントだけを送ることで、毎回の会話で重複なく最新のやり取りを蓄積できます。末尾の最終イベント(コールバック自体の呼び出し)は除外しています。

動作確認

初回セッション:ユーザー情報を伝える

最初のセッションでは、名前・役職・好みなどをエージェントに伝えます。

この会話終了後、after_agent_callback  が呼ばれ、Memory Bank に記憶が保存されます。

Memory Bank への保存確認

Agent Platform のコンソールから Memory Bank の中身を確認できます。「 teraさんは AI 活用推進担当」「箇条書きを好む」「推進プロジェクトの内容」といった情報が記憶として抽出・保存されていることが確認できます。

新しいセッション:記憶の引き継ぎを確認

ADK Web UI で新しいセッションを開始し、再度話しかけてみます:

新しいセッションにもかかわらず名前を覚えており、前回伝えた箇条書きスタイルも維持され、プロジェクトの内容もしっかり引き継がれています。これが Memory Bank の力です。

まとめ

本記事では、AIエージェントの「記憶」の仕組みを State・Artifact・DB永続化・Memory Bank の4つで整理し、Google ADK を使って Memory Bank エージェントを実装しました。

今回のポイント

  • AIエージェントの記憶は State / Artifact / DB永続化 / Memory Bank の4種類で使い分けるのがベストプラクティス
  • Memory Bank は「生の会話ログを保存する」DB永続化とは異なり、LLM が重要情報を蒸留して保存するのが本質
  • ADK の PreloadMemoryTool と after_agent_callback を組み合わせることで、Memory Bank との連携をシンプルに実装できる
  • Agent Platform の Memory Bank はカスタマイズも可能で、保存するトピックや埋め込みモデルを用途に合わせて調整できる

Memory Bank が特に活きるシーン

システムサポートでは、Google Cloudの導入や活用を支援しております。

Google Cloudを導入したい・導入したけど使いこなせていない…という方は、お気軽にご相談ください!


Google Cloud 導入・活動支援に関するご相談はこちら

 

2026年7月17日 【Memory Bank】ユーザーとのやり取りや知識、実績を蓄積し、「成長・継承」できるエージェントを作りたい

Category Google Cloud

ご意見・ご相談・料金のお見積もりなど、
お気軽にお問い合わせください。

お問い合わせはこちら