第 9 章:用 Session Manager 实现持久记忆
第 9 章:用 Session Manager 实现持久记忆
关于本课
本课程的视频是当时的一个快照。Strands 一直在积极开发,所以本页展示的代码反映的是最新的写法,但视频里讲的概念依然成立。有疑问时,以代码为准。
本课代码:samples/09-persistent-memory
持久化对话历史
Session Manager 的作用是跨多次运行保存对话历史和 Agent 状态。没有它,进程一停,所有东西都归零。它们是按 hook provider 实现的,所以持久化只是又一种通过 Hook 层叠进 Harness 的行为。
Snapshot Session Manager(推荐)
新的单 Agent Session 推荐用这个。它把整个 Agent 状态当成一个原子 blob 保存,而不是一条条消息记录,并且支持不可变检查点,可以恢复到之前的任意时间点。
from strands import Agent
from strands.session import SnapshotSessionManager
from strands.storage import LocalFileStorage
session_manager = SnapshotSessionManager(
session_id="customer-session-001",
storage=LocalFileStorage("./sessions"),
)
agent = Agent(
tools=[lookup_customer, get_order_history, process_refund],
system_prompt=SYSTEM_PROMPT,
context_manager="auto",
session_manager=session_manager,
)持久化是自动发生的:默认每次调用之后保存 Agent 状态。想改成每处理一条消息就保存,用 save_latest_on="message"。
生产环境把 LocalFileStorage 换成 S3Storage:
from strands.storage import S3Storage
session_manager = SnapshotSessionManager(
session_id="customer-session-001",
storage=S3Storage(bucket="my-agent-sessions", prefix="production/"),
)
File Session Manager(基于记录)
基于记录的做法是逐条保存消息。已有的 Session 仍然支持它,Graph/Swarm 多 Agent 的持久化也必须用它。
from strands import Agent
from strands.session.file_session_manager import FileSessionManager
session_manager = FileSessionManager(
session_id="customer-session-001",
storage_dir="./sessions",
)
agent = Agent(
tools=[lookup_customer, get_order_history, process_refund],
system_prompt=SYSTEM_PROMPT,
context_manager="auto",
session_manager=session_manager,
)
S3 Session Manager(基于记录)
同样的基于记录的做法,只是后端从本地磁盘换成 S3:
from strands.session.s3_session_manager import S3SessionManager
session_manager = S3SessionManager(
session_id="customer-session-001",
bucket="my-agent-sessions",
prefix="customer-service/",
region_name="us-east-1",
)
agent = Agent(..., session_manager=session_manager)
什么时候用哪个
| Manager | 适用场景 |
|---|---|
SnapshotSessionManager |
新的单 Agent Session。更简单、原子保存、支持检查点。 |
FileSessionManager |
已有的基于记录的 Session,Graph/Swarm 多 Agent。 |
S3SessionManager |
和 File 一样,但用 S3 做跨机器访问。 |
Session、Memory 和 Storage
Session Manager 是三块相关拼图里的一块,把它们分清楚会很有帮助:
- Session manager:持久化对话,让 Agent 能从中断的地方接着跑。作用范围是单个 Session。
- Memory manager:跨 Session 的长期知识(用户偏好、事实、决策),不需要把旧对话重新播一遍。背后是一个或多个 memory store。
- Storage:两者底下的字节级后端。
LocalFileStorage、S3Storage和社区后端实现的是同一个Storage接口,所以一个 Session manager、一个 memory store、还有 Context Manager 的 stash 可以共用同一个后端。
Memory 是可选开启的,和 Session 相互独立。挂上一个带 store 的 MemoryManager,Agent 就获得了召回(一个用来搜索已知信息的 Tool)和注入(把相关 Memory 自动融进 prompt)两种能力:
from strands import Agent
from strands.memory import MemoryManager
from strands.vended_memory_stores.test_memory_store import TestMemoryStore
# Zero-setup store for prototyping; swap for a production store later
store = TestMemoryStore(name="customer-service")
agent = Agent(
session_manager=session_manager, # this conversation
memory_manager=MemoryManager(stores=[store]), # knowledge across conversations
)生产存储:DynamoDB
因为 Session、Memory 和卸载出去的上下文都落在 Storage 接口上,一个生产后端就能同时服务它们。Strands DynamoDB Storage 是 AWS 维护的后端,很适合 Agent 这类负载:serverless、个位数毫秒读取、原生 TTL 让过期 Session 自己消失,还能在同一张表上做向量搜索来实现语义 Memory。
在 Agent 这一层设置一次,每个要落字节的子系统都会在自己的 namespace 下继承它:
from strands import Agent
from strands.session import SnapshotSessionManager
from strands_dynamodb_storage import DynamoDBStorage
storage = DynamoDBStorage("agent-storage", region_name="us-east-1")
agent = Agent(
tools=[lookup_customer, get_order_history, process_refund],
system_prompt=SYSTEM_PROMPT,
context_manager="auto",
storage=storage, # shared backend
session_manager=SnapshotSessionManager("customer-session-001"), # inherits storage
)表由你自己拥有(只需要一个字符串类型的 pk 分区键和一个字符串类型的 sk 排序键),这个包也只会发出 PutItem、GetItem、DeleteItem 和 Query 这几种请求。
更多后端
集成目录里还列了其它 Session Manager、memory store 和存储后端。它们实现的是同一批接口,所以换进来不用改 Agent 代码。
| 集成 | 是什么 |
|---|---|
| Strands DynamoDB Storage | 跑在 Amazon DynamoDB 上的 Storage 后端,带 TTL、S3 卸载和向量搜索 |
| AgentCore Memory | 由 Amazon Bedrock AgentCore Memory 支撑的 Session manager,带长期召回 |
| Valkey Session Manager | 跑在 Valkey(兼容 Redis)上的 Session manager,用于快速的分布式存储 |
| Memory stores | 社区构建的 MemoryStore 后端,供 MemoryManager 使用 |
| Storage backends | 社区构建的 Storage 实现 |