Strands AgentsのAgentCore Memory Session ManagerがAgentCore Memoryと連携する際に便利

Strands AgentsのAgentCore Memory Session ManagerがAgentCore Memoryと連携する際に便利

2025.12.16

はじめに

こんにちは、ラ・ムーが大好きなコンサルティング部の神野です。
直近Episodic Memoryのブログを書きましたが、この記事でサラッとStrands AgentsのAgentCore Memory Session Managerを使いました。

https://dev.classmethod.jp/articles/amazon-bedrock-agentcore-episodic-memory-strategy/

これが実は便利で、AgentCore Memoryを組み合わせて使う時はだいぶ処理を簡略化して記載することが可能です。
今日はその便利さを共有できればと思い記事を書きました。

AgentCore Memory Session Manager

AgentCore Memoryとシームレスに連携できるStrands Agentsの1機能です。

https://strandsagents.com/latest/documentation/docs/community/session-managers/agentcore-memory/

何が嬉しいかというと、コードの量がかなり少ないです。
configとSession Managerを作ったらAgentの引数に渡すだけで短期記憶が活用できます。
下記のようにコードを書いて使用できます。

実装の例

import uuid
import boto3
from datetime import datetime
from strands import Agent
from bedrock_agentcore.memory.integrations.strands.config import AgentCoreMemoryConfig
from bedrock_agentcore.memory.integrations.strands.session_manager import AgentCoreMemorySessionManager

MEM_ID = os.environ.get("AGENTCORE_MEMORY_ID", "your-existing-memory-id")
ACTOR_ID = "test_actor_id_%s" % datetime.now().strftime("%Y%m%d%H%M%S")
SESSION_ID = "test_session_id_%s" % datetime.now().strftime("%Y%m%d%H%M%S")

# AgentCore Memoryの設定値
agentcore_memory_config = AgentCoreMemoryConfig(
    memory_id=MEM_ID,
    session_id=SESSION_ID,
    actor_id=ACTOR_ID
)

# セッションマネージャーを作成
session_manager = AgentCoreMemorySessionManager(
    agentcore_memory_config=agentcore_memory_config,
    region_name="us-east-1"
)

# Agentの引数にSessionManagerを設定
agent = Agent(
    system_prompt="You are a helpful assistant. Use all you know about the user to provide helpful responses.",
    session_manager=session_manager,
)

# エージェントと対話(短期記憶が反映されている)
agent("I like sushi with tuna")
agent("What should I buy for lunch today?")

Session Managerを使用することで実装がシンプルになります。Agentの引数にSessionManagerを設定するだけで、特に短期記憶を意識する必要はなく会話が記録されて参照できるのは嬉しいですね。

一方で長期記憶はどうでしょうか。

こちらもシンプルでconfigの設定に、retrieval_configに長期記憶の設定を追記するだけでOKです。
対象の長期記憶のnamespacesを指定します。namespaceを指定するだけなので、最新の長期戦略であるEpisodic Memoryも、もちろん指定できます。また複数の長期記憶も設定可能です。

実装の例

from datetime import datetime
from bedrock_agentcore.memory.integrations.strands.config import AgentCoreMemoryConfig, RetrievalConfig
from bedrock_agentcore.memory.integrations.strands.session_manager import AgentCoreMemorySessionManager
from strands import Agent

MEM_ID = os.environ.get("AGENTCORE_LTM_MEMORY_ID", "your-existing-ltm-memory-id")
ACTOR_ID = "test_actor_id_%s" % datetime.now().strftime("%Y%m%d%H%M%S")
SESSION_ID = "test_session_id_%s" % datetime.now().strftime("%Y%m%d%H%M%S")

# retrieval_configに長期記憶のnamespaceを設定する、複数設定も可能
config = AgentCoreMemoryConfig(
    memory_id=MEM_ID,
    session_id=SESSION_ID,
    actor_id=ACTOR_ID,
    retrieval_config={
        "/preferences/{actorId}": RetrievalConfig(
            top_k=5,
            relevance_score=0.7
        ),
      	"/facts/{actorId}": RetrievalConfig(
            top_k=10,
            relevance_score=0.3
        ),
        "/summaries/{actorId}/{sessionId}": RetrievalConfig(
            top_k=5,
            relevance_score=0.5
        )
    }
)

session_manager = AgentCoreMemorySessionManager(config, region_name='us-east-1')
ltm_agent = Agent(session_manager=session_manager)

少なくとも下記記事を書いたときは記憶を取得して会話履歴として設定して・・・みたいな工夫をしていました。
また長期記憶はツール化して工夫していましたが、AgentCore Memory Session Managerを使った方がシンプルですね。
https://dev.classmethod.jp/articles/amazon-bedrock-agentcore-memory-sample-agent/

早速試してみましょう!!

試してみる

前提

下記バージョンやモデルなどを使用しました。

  • Python 3.13
  • uv 0.6.12
  • strands-agents 1.19.0
  • strands-agents-tools 0.2.17
  • 使用したリージョン
    • us-west-2
  • 使用したモデル
    • us.anthropic.claude-sonnet-4-5-20250929-v1:0

Memory作成

まずはMemoryを作りましょう。

AWSコンソールからAmazon Bedrock AgentCoreのページに移動し、左メニューから Memory を選択します。
Create memory ボタンをクリックして、Memory作成画面に進みます。

CleanShot 2025-12-16 at 13.46.40@2x

Memory nameにsample_session_memoryと入力します。

長期記憶戦略はユーザーの好みを記憶するUser preferenceにチェックを入れます。
Namespaceはデフォルトの/strategies/{memoryStrategyId}/actors/{actorId}のままで問題ありません。
設定できたらCreate memoryをクリックします。

CleanShot 2025-12-16 at 13.47.31@2x

作成後、StatusがACTIVEになるまで少し待ちます。
ACTIVEになったらMemory IDStrategy IDをメモしておきましょう。

CleanShot 2025-12-16 at 13.56.26@2x

ローカル環境の準備

それでは、ローカルでStrands Agentsを動かしていきます。
まずは必要なパッケージをインストールします。

# プロジェクト初期化
uv init memory-session
# プロジェクトのパスに移動
cd memory-session

# ライブラリのインストール
uv add strands-agents 'bedrock-agentcore[strands-agents]'

短期記憶を試してみる

最初に短期記憶から試してみます。以下のコードをstm_test.pyとして保存してください。

MEMORY_STRATEGY_IDMEM_IDはコンソール上から取得した値を設定しておきましょう。

あくまで簡易的な検証なのでベタ書きしていますが本番などで使用する際は環境変数の利用を検討してください。

import os
from datetime import datetime

from bedrock_agentcore.memory.integrations.strands.config import AgentCoreMemoryConfig
from bedrock_agentcore.memory.integrations.strands.session_manager import (
    AgentCoreMemorySessionManager,
)
from strands import Agent
from strands.models import BedrockModel

# Memory IDとMemory Strategy IDを設定
MEM_ID = "sample_session_memory-XXXXXXXXXXXX"
MEMORY_STRATEGY_ID = "preference_builtin_XXXXXX-XXXXXXXXXX"
ACTOR_ID = "user_XXXXXX"
SESSION_ID = "session_%s" % datetime.now().strftime("%Y%m%d%H%M%S")

# AgentCore Memory Configを作成
agentcore_memory_config = AgentCoreMemoryConfig(
    memory_id=MEM_ID, session_id=SESSION_ID, actor_id=ACTOR_ID
)

# Session Managerを作成
session_manager = AgentCoreMemorySessionManager(
    agentcore_memory_config=agentcore_memory_config, region_name="us-west-2"
)

# Sonnet 4.5を使用
model = BedrockModel(
    model_id="us.anthropic.claude-sonnet-4-5-20250929-v1:0", region_name="us-west-2"
)

# Agentを作成
agent = Agent(
    model=model,
    system_prompt="あなたは親切なアシスタントです。ユーザーとの会話を覚えておいてください。",
    session_manager=session_manager,
)

# 会話してみる
print("=== 1回目の発言 ===")
response1 = agent("私の名前は神野です。よろしくお願いします!")

print("\n=== 2回目の発言 ===")
response2 = agent("私の趣味はスーパーマーケット巡りです")

print("\n=== 3回目の発言 ===")
response3 = agent("私の名前と趣味を教えてください")

実行してみましょう。

uv run stm_test.py

実行結果を見てみると、3回目の発言で私の名前と趣味をちゃんと覚えていることがわかります。

一連のセッションIDでやりとりして、これは短期記憶として会話履歴がAgentCore Memoryに保存されているから取得して記憶しているように見えますね。

=== 1回目の発言 ===
神野さん、はじめまして!よろしくお願いします!

お手伝いできることがあれば、何でもお気軽にお尋ねください。今日はどのようなことでお力になれますでしょうか?
=== 2回目の発言 ===
スーパーマーケット巡り、面白い趣味ですね!

各スーパーにはそれぞれ特色があって、見比べると色々な発見がありますよね。例えば:

- **品揃え**:店舗ごとの個性的な商品や地域限定商品
- **レイアウト**:動線の工夫や売り場づくり
- **価格戦略**:特売品やプライベートブランド
- **雰囲気**:高級志向、ディスカウント系など

神野さんは、スーパーマーケット巡りでどんなところに注目されていますか?お気に入りの店舗や、面白い発見などがあれば教えてください!
=== 3回目の発言 ===
もちろんです!

**お名前**:神野さん

**ご趣味**:スーパーマーケット巡り

しっかり覚えていますよ!スーパーマーケット巡りについて、もっと詳しくお話を聞かせていただけたら嬉しいです。%

お手軽に実装できて良きです。

長期記憶(User Preference)を試してみる

次に長期記憶を試してみます。User Preferenceストラテジーを設定したMemoryを使って、
ユーザーの好みが自動的に抽出されるか確認してみましょう。

以下のコードをltm_test.pyとして保存します。

実装のポイントとしては設定したnamespaceを組み立てて設定する必要があります。
MEMORY_STRATEGY_IDMEM_IDはコンソール上から取得した値を設定しておきましょう。

またACTOR_IDを先ほど短期記憶で使用した値と同じ値にします。
長期記憶はACTOR_ID単位で保存されるため、セッションが変わっても同じユーザーとして過去の記憶を参照できます。

こちらも、あくまで簡易的な検証なのでベタ書きしていますが本番などで使用する際は環境変数の利用を検討してください。

import logging
import os
from datetime import datetime

from bedrock_agentcore.memory.integrations.strands.config import (
    AgentCoreMemoryConfig,
    RetrievalConfig,
)
from bedrock_agentcore.memory.integrations.strands.session_manager import (
    AgentCoreMemorySessionManager,
)
from strands import Agent
from strands.models import BedrockModel

# Memory IDとMemory Strategy IDを設定
MEM_ID = "sample_session_memory-XXXXXXXXXXXX"
MEMORY_STRATEGY_ID = "preference_builtin_XXXXXX-XXXXXXXXXX"
ACTOR_ID = "user_XXXXXX"
SESSION_ID = "session_%s" % datetime.now().strftime("%Y%m%d%H%M%S")

# namespaceを構築: /strategies/{memoryStrategyId}/actors/{actorId}
NAMESPACE = f"/strategies/{MEMORY_STRATEGY_ID}/actors/{ACTOR_ID}"

agentcore_memory_config = AgentCoreMemoryConfig(
    memory_id=MEM_ID,
    session_id=SESSION_ID,
    actor_id=ACTOR_ID,
    retrieval_config={NAMESPACE: RetrievalConfig(top_k=5, relevance_score=0.5)},
)
session_manager = AgentCoreMemorySessionManager(
    agentcore_memory_config=agentcore_memory_config, region_name="us-west-2"
)

model = BedrockModel(
    model_id="us.anthropic.claude-sonnet-4-5-20250929-v1:0", region_name="us-west-2"
)

agent = Agent(
    model=model,
    system_prompt="あなたは親切なアシスタントです。ユーザーとの会話を覚えておいてください",
    session_manager=session_manager,
)
user_input = "私の好みを教えてください。"

response = agent(user_input)

こちらは先ほどのセッションID(タイムスタンプで生成される)とは別なので短期記憶は覚えていない状態で、
長期記憶だけが抽出して回答が生成されるイメージです。

uv run ltm_test.py

実行すると、新しいセッションにもかかわらず、過去に抽出したUser Preferenceから個人情報を提供してくれます!

これまでの会話から、あなたの好みについて以下のことがわかっています:

- **お名前**: 神野さん
- **趣味**: スーパーマーケット巡り

この2つの情報を記録しています。他にも何か好みや興味について教えていただければ、それも覚えておきますよ!

しっかりと覚えていますね!

短期記憶(会話履歴)と長期記憶(User Preference)の両方を、Agentの引数にSession Managerを渡すだけで簡単に活用できます。
AgentCore Memory Session Managerの便利なところですね。

おわりに

今回はStrands AgentsのAgentCore Memory Session Managerを試してみました。

短期記憶も長期記憶もSession Managerを定義するだけでサクッとAgentCore Memoryと連携できるのは嬉しいポイントです。

本記事が少しでも参考になりましたら幸いです。最後までご覧いただきありがとうございましたー!!

この記事をシェアする

FacebookHatena blogX

関連記事