核心摘要
- Amazon Bedrock AgentCore Memory提供完全托管的持久化记忆系统,支持短期记忆和长期记忆两种模式,开发者无需自建数据库或向量存储
- 内置四种记忆策略:SemanticMemoryStrategy、SummaryMemoryStrategy、UserPreferenceMemoryStrategy及CustomMemoryStrategy,可灵活组合使用
- 通过命名空间机制实现数据隔离与多Agent协作,支持跨会话的用户状态管理和个性化服务
- 提供完整的SDK和API接口,可与Strands Agents等框架无缝集成,实现记忆的自动读写与语义检索
Amazon Bedrock AgentCore Memory托管记忆系统完整指南
在构建智能AI Agent的过程中,记忆能力往往是决定用户体验的关键因素。一个能够”记住”用户偏好、理解对话上下文的Agent,与一个每次对话都从零开始的Agent,在实际应用中的表现差距是巨大的。亚马逊云科技针对这一核心需求,在其AI Agent构建平台Bedrock AgentCore中推出了Memory模块——一个开箱即用的托管记忆服务,帮助开发者快速为AI Agent赋能记忆功能。
Memory模块架构概述
Amazon Bedrock AgentCore的Memory模块是一个由亚马逊云科技托管的持久化记忆系统,专门用于存储和管理AI Agent的对话历史与知识积累。该模块提供两种核心记忆模式:
- 短期记忆(short-term memory):负责在单次会话中记录最近几轮对话,确保Agent能够”记住”当前对话的上下文,维持对话的连贯性
- 长期记忆(long-term memory):从对话中提取结构化的关键信息,在多个会话之间保留知识,使Agent能够”学习”用户偏好、事实和摘要等信息
在架构设计上,Memory模块采用分层存储策略:短期记忆层存储原始交互事件作为即时上下文,长期记忆层则存储从事件中提取的概要知识。当新的事件被存储时,如果Memory配置了长期记忆策略,服务会在后台异步地对事件内容进行分析(例如调用基础模型)来提炼出可长期保存的知识片段。这种设计既保证了实时响应性能,又实现了知识的持续积累。
所有数据由亚马逊云科技以加密方式存储,并使用命名空间(namespace)进行隔离分区,确保不同应用或用户的记忆数据彼此分隔。对于需要在多云环境下部署AI应用的团队,可以参考多云账单代付解决方案来简化跨平台的资源管理与成本控制。
Memory系统工作流程详解
从初始化到记忆检索,AgentCore Memory的完整工作流程涉及多个关键环节。在这个流程中,大语言模型主要承担两个核心作用:记忆提取和上下文注入。
记忆提取机制
Memory的长期记忆依赖于对对话内容的自动分析和提炼,这一过程由LLM完成。AgentCore Memory内置了多种记忆策略(Memory Strategy)来定义如何将原始对话转化为结构化长期记忆:
- SemanticMemoryStrategy(语义记忆策略):从对话中抽取出事实和知识,以便日后查询
- SummaryMemoryStrategy(摘要策略):为每个会话生成对话摘要,提炼主要内容
- UserPreferenceMemoryStrategy(用户偏好策略):捕获用户的偏好、风格和重复选择等信息
使用内置策略时,无需额外配置模型,AgentCore Memory服务会在后台使用预置的模型来完成提取和归纳。当开发者调用CreateEvent保存新事件后,这些策略会被自动触发,异步运行LLM分析内容并产生长期记忆记录(memory records)。
值得注意的是,AgentCore还允许使用CustomMemoryStrategy(自定义记忆策略),开发者可提供自定义的提示词(prompt)和选择特定的基础模型来执行记忆提取,例如只提取某类domain知识,这为复杂业务场景提供了极大的灵活性。
上下文注入机制
Memory提供存储和检索API,供应用在调用LLM推理时提取相关记忆并注入对话上下文中。开发者可以在每次生成回复前,调用list_events获取当前会话最近N条对话记录,将其附加到LLM的提示中,以维护对话连续性。对于跨会话的信息,可以使用retrieve_memories接口通过语义查询长期记忆,然后把检索到的内容纳入提示。
这种机制确保LLM在回答新问题时,不仅有当前对话文本,还能利用Memory中沉淀的历史知识,显著提高响应的相关性和智能性。
Memory as Tool模式
Memory模块还可以与Agent框架的推理流程集成,实现自动的上下文注入。AgentCore Memory可被包装成一个工具(Tool)供LLM调用。以Strands Agents框架为例,开发者通过AgentCoreMemoryToolProvider将Memory注册为工具,使得当模型需要回忆信息时,可以自主调用如”agent_core_memory”工具执行retrieve动作来查询记忆,或用record动作将新的信息存入记忆。
基于Strands Agents框架搭建agent的示例代码:
from strands_tools.agent_core_memory import AgentCoreMemoryToolProvider
strands_provider = AgentCoreMemoryToolProvider(
memory_id=memory.get("id"),
actor_id="CaliforniaPerson",
session_id="TalkingAboutFood",
namespace="/users/CaliforniaPerson",
region="us-west-2"
)
agent = Agent(tools=strands_provider.tools)
这种工具调用方式也通过Model Context Protocol (MCP)等标准,让LLM在推理中动态决定何时读写记忆,使Agent能够更加自主地管理上下文。
Memory核心组件与存储方式
Memory模块以记忆存储(Memory Store)的形式存在。开发者可通过SDK创建一个Memory实例来作为特定用途的记忆库,每个Memory实例都有唯一的ID。记忆事件(Event)是Memory中基本的数据单元,用于存储一次交互的信息。每个事件记录包含以下关键属性:
- actorId:参与者ID,用于标识是谁的记忆。例如可以是终端用户ID,或特定Agent标识等
- sessionId:会话ID,用于将一系列相关交互归组为同一会话(对话)
- payload:承载实际内容的数据,可以是对话消息(包括角色和消息内容)、工具调用、系统事件等。Memory允许一次事件存储多个消息片段,方便批量写入多轮交互
- eventId:事件的唯一标识符,支持通过ID精确检索事件
API操作清单
记忆管理操作:
- CreateMemory: 创建记忆资源
- GetMemory: 获取记忆详情
- ListMemories: 列出所有记忆资源
- UpdateMemory: 更新记忆配置
- DeleteMemory: 删除记忆资源
短期记忆操作:
- CreateEvent: 创建事件
- GetEvent: 获取特定事件
- ListEvents: 列出会话中的事件
- DeleteEvent: 删除特定事件
长期记忆操作:
- RetrieveMemoryRecords: 语义搜索记忆记录
- ListMemoryRecords: 列出命名空间中的记忆记录
- DeleteMemoryRecord: 删除特定记忆记录
基本使用步骤
安装SDK:
pip install bedrock-agentcore
创建Memory客户端:
client = MemoryClient(region_name="us-west-2")
创建记忆资源:
memory = client.create_memory(name="MyMemory")
开始存储事件:
client.create_event(memory_id, actor_id, session_id, messages)
短期记忆工作流程
- 事件创建: 使用CreateEvent操作捕获每个交互
- 会话管理: 通过sessionId维护对话上下文
- 历史检索: 使用ListEvents和GetEvent访问过往交互
长期记忆工作流程
- 策略配置: 在CreateMemory操作中添加记忆策略
- 异步提取: 后台自动从原始事件中提取洞察
- 记忆整合: 将新提取的信息与现有信息合并
- 语义检索: 使用RetrieveMemoryRecords进行智能搜索
API代码示例详解
创建短期记忆
from bedrock_agentcore.memory import MemoryClient
client = MemoryClient(region_name="us-west-2")
memory = client.create_memory(
name="CustomerSupportAgentMemory",
description="Memory for customer support conversations"
)
创建长期记忆
memory = client.create_memory_and_wait(
name="MyAgentMemory",
strategies=[{
"summaryMemoryStrategy": {
"name": "SessionSummarizer",
"namespaces": ["/summaries/{actorId}/{sessionId}"]
}
}]
)
创建事件
client.create_event(
memory_id=memory.get("id"),
actor_id="User84",
session_id="OrderSupportSession1",
messages=[
("Hi, I'm having trouble with my order #12345", "USER"),
("I'm sorry to hear that. Let me look up your order.", "ASSISTANT")
]
)
检索记忆
memories = client.retrieve_memories(
memory_id=memory.get("id"),
namespace="/summaries/User84/OrderSupportSession1",
query="can you summarize the support issue"
)
Memory策略处理逻辑
在单次会话的多轮对话中,短期记忆充当了”对话缓冲区”的角色。每当用户和Agent交互一个回合,Agent可以将本轮对话(包括用户消息、Agent回复,以及Agent调用工具的动作和结果)记录为一个Memory事件。这些事件按时间顺序累积在当前session下,Agent随后可以通过调用list_events获取最近若干轮对话历史,将其提供给LLM作为上下文。
通过Memory维护的对话历史,Agent无需依赖LLM自身的窗口去”记住”所有内容,而是可以在需要时检索相关内容并注入提示。这有效避免了长对话中上下文窗口溢出或遗忘的问题,使多回合对话更连贯。
Memory对用户状态的管理则依赖于长期记忆功能。随着用户在多次会话中的互动,Agent可以逐步积累关于该用户的偏好、习惯和历史请求等信息。当用户在未来的会话中与Agent互动时,Agent可以查询这些长期记忆来个性化当前对话。跨会话的记忆由Memory的actorId来区分不同用户:只要为同一用户使用相同的actorId,AgentCore Memory就能将该用户各次会话的长期记忆关联在一起。
Memory的维护和历史数据管理
作为托管服务,Bedrock AgentCore Memory提供了持久化存储来保留对话历史和提取出的知识。短期记忆和长期记忆的数据都会持久保存于Memory Store中,除非被显式删除或设置了过期策略。
短期记忆一般用于会话实时上下文,但实际上事件数据会存储在服务端,即使同一会话暂时结束,下次仍可检索先前的事件记录。长期记忆则是明确为跨会话持久化设计的,提取出的偏好、事实、摘要等会长久保存,供未来的对话查询。
在创建事件时,开发者可以设置一个eventExpiryDuration参数,为该事件指定自动过期时间。一旦事件超过设定的保留时长,系统将自动删除它,从而避免长期保存无用的短期对话数据。同时,Memory提供DeleteEvent API,可用于手动删除特定事件。这些机制使开发者能够按需控制历史数据的保留长度。
需要注意的是,Memory长期记忆记录的生成是异步的。当添加新的事件后,提取策略需要一些时间(通常1-2分钟)在后台将其处理为长期记忆。开发者应在提取过程完成后再检索长期记忆内容。
命名空间是一种逻辑隔离/分类手段,通常采用类似路径的格式表示层次结构。例如:
/strategy/{strategyId}/actor/{actorId}/session/{sessionId}
这样就可以基于不同颗粒度进行存储和搜索,从细到粗比如:按会话—按参与者—按策略组织—跨所有策略。
Memory案例展示:智能宠物管家系统
接下来通过构建一个智能宠物管家系统,展示如何使用Amazon Bedrock AgentCore Memory的四种记忆策略来实现AI应用的长期记忆管理。
四种记忆策略详解
长期记忆可以应用如下四种记忆策略,使用时可以指定一个,也可以同时指定多个策略。
1. 语义记忆 (Semantic Memory)
存储事实性知识和基本信息:
{
StrategyType.SEMANTIC.value: {
"name": "PetKnowledgeBase",
"description": "存储宠物基本信息、品种特征、健康状况等事实性知识",
"namespaces": ["/pets/{actorId}/knowledge"]
}
}
存储示例:
- “Max是一只3岁的金毛寻回犬,性格友好活泼”
- “Max已完成狂犬病疫苗接种,体重28kg正常”
2. 偏好记忆 (User Preference Memory)
跟踪个性化偏好和习惯:
{
StrategyType.USER_PREFERENCE.value: {
"name": "PetPreferences",
"description": "跟踪每个宠物的个性化偏好和习惯",
"namespaces": ["/pets/{actorId}/preferences"]
}
}
存储格式(JSON):
{
"context": "Max特别喜欢鸡肉,每次都吃得很香",
"preference": "喜欢鸡肉食物",
"categories": ["饮食", "偏好"]
}
3. 摘要记忆 (Summary Memory)
创建活动时间线摘要:
{
StrategyType.SUMMARY.value: {
"name": "PetActivitySummary",
"description": "创建和维护宠物日常活动的时间线摘要",
"namespaces": ["/pets/{actorId}/summaries/{sessionId}"]
}
}
4. 自定义记忆 (Custom Memory)
自定义记忆策略是AgentCore Memory的最强大特性,允许开发者自定义记忆提取逻辑。
配置结构:
{
StrategyType.CUSTOM.value: {
"name": "PetRoleSpecificMemory",
"description": "针对不同宠物护理角色的专业记忆提取和管理",
"namespaces": ["/pets/{actorId}/professional"],
"configuration": {
"semanticOverride": {
"extraction": {
"appendToPrompt": CUSTOM_EXTRACTION_PROMPT,
"modelId": "anthropic.claude-3-sonnet-v1:0"
}
}
}
}
}
自定义提取Prompt设计:
CUSTOM_EXTRACTION_PROMPT = """
根据当前激活的角色,专门提取相关领域的信息并添加角色标签:
护理员角色:日常护理、饮食管理、清洁卫生、生活习惯
提取格式:[护理员] 时间戳 | 活动类型 | 详细描述 | 重要性(1-10)
训练师角色:行为训练、技能培养、纪律管理、训练进度
提取格式:[训练师] 时间戳 | 技能名称 | 掌握程度 | 重要性(1-10)
医疗助手角色:健康监测、疫苗提醒、医疗建议、症状记录
提取格式:[医疗助手] 时间戳 | 健康项目 | 状态描述 | 重要性(1-10)
请仅提取与当前角色相关的专业信息,忽略无关内容。
"""
核心实现代码
环境设置和Memory创建
from bedrock_agentcore.memory import MemoryClient
from bedrock_agentcore.memory.constants import StrategyType
from datetime import datetime
REGION = "us-west-2"
SESSION_ID = f"pet_butler_{datetime.now().strftime('%Y%m%d_%H%M%S')}"
ACTOR_ID = "pet_max"
ROLE_ARN = "<your-role-arn>"
# 创建Memory客户端
client = MemoryClient(region_name=REGION)
# 创建Memory实例(包含四种策略)
memory = client.create_memory_and_wait(
name="PetButler",
strategies=strategies,
description="智能宠物管家系统",
event_expiry_days=90,
memory_execution_role_arn=ROLE_ARN
)
memory_id = memory['memoryId']
添加对话事件
demo_events = [
# 训练相关事件
("Max今天学会了握手,3次练习就掌握了!训练师Bob说这是个重要的技能。", "USER"),
("太棒了!Max学习能力很强,我会记录这个训练成果。", "ASSISTANT"),
# 护理相关事件
("Max特别喜欢鸡肉,每次都吃得很香,护理员Alice建议每天给200g。", "USER"),
("好的,我会记住Max的饮食偏好和分量建议。", "ASSISTANT"),
# 医疗相关事件
("疫苗接种:狂犬病疫苗已完成,体重28kg正常,医疗助手Dr.Chen说健康状况良好。", "USER"),
("很好,我会记录Max的疫苗接种和健康检查结果。", "ASSISTANT"),
]
# 添加到记忆系统
client.create_event(
memory_id=memory_id,
actor_id=ACTOR_ID,
session_id=SESSION_ID,
messages=demo_events
)
记忆检索
# 查询记忆
memories = client.retrieve_memories(
memory_id=memory_id,
actor_id=ACTOR_ID,
namespace=f"/pets/{ACTOR_ID}/knowledge",
query="Max学会了什么技能?",
top_k=5
)
# 处理结果
for memory in memories:
content = memory.get('content', {}).get('text', '')
score = memory.get('score', 0)
print(f"相关性: {score:.3f} | 内容: {content}")
多个查询的测试结果示例:
| 测试场景 | 召回时间 | 召回结果相关性 |
|---|---|---|
| Max学会了什么技能? | 0.321s | 0.594 |
| Max的饮食偏好? | 0.348s | 0.488 |
| 健康状况如何? | 0.343s | 0.385 |
与Agent集成
from strands import Agent
from strands_tools.agent_core_memory import AgentCoreMemoryToolProvider
# 创建记忆工具提供者
memory_provider = AgentCoreMemoryToolProvider(
memory_id=memory_id,
actor_id=ACTOR_ID,
session_id=SESSION_ID,
namespace=f"/pets/{ACTOR_ID}/knowledge"
)
# 创建智能Agent
pet_agent = Agent(
tools=memory_provider.tools,
system_prompt="""你是智能宠物管家,为宠物Max提供专业护理服务