近年来,随着对话式 AI 的应用不断深入,为每位用户提供个性化体验变得愈发重要。当前所需的智能体,已不再是简单的一问一答模式,而是能够理解 “用户是谁、拥有怎样的关注点与目标” 后再进行响应的智能体。
在本文中,我们将结合 Strands Agents 与 Bedrock AgentCore,对可记忆并活用用户对话历史的个性化智能体进行实现与验证。
1. 引言
首先,我们将对各个构成要素进行简单介绍。
1.1 什么是 Strands Agents
Strands Agents 是一套能够灵活设计并构建对话式智能体行为及对话流程的机制。通过组合多个工具,可在对话过程中实现所需的处理(如 API 调用、数据检索、记忆查询等)。
相关内容也可参考 GitHub 链接:github.com
1.1.1 Strands Agents 工具
在 Strands Agents 中,“工具” 指的是智能体所使用的外部功能。本文将重点介绍用于处理对话记忆的 “Agent Core Memory” 工具。
相关参考链接:github.com
1.2 什么是 Bedrock AgentCore
Bedrock AgentCore 是一项托管服务,为智能体的开发与运行提供所需功能。它具备以下功能,可助力智能体的顺畅构建:
- 提供运行环境
- 与各类工具联动
- 认证与授权功能
- 按用户管理记忆等
官方参考链接:aws.amazon.com
1.2.1 AgentCore 记忆功能(AgentCore Memory)
AgentCore 具备 “Memory(记忆)” 功能,可让智能体拥有短期记忆与长期记忆。
其中,长期记忆尤为重要,它能够记录通过与用户对话获取的事实信息,并在后续对话中加以活用。例如,通过记忆用户 “擅长 Python”“喜欢旅行” 等偏好与特征,智能体在之后的对话中,就能给出更贴合用户需求的响应与建议。
需要注意的是,并非所有已记忆的内容都会被调用,系统会动态检索并使用与当前对话相关的信息。
ChatGPT 也具备记忆功能,能够记住用户的个人信息与偏好,而通过 Bedrock AgentCore,我们可以自行实现同等功能,从而达成自然的个性化体验。
官方文档参考链接:docs.aws.amazon.com
2. 验证
我们将实际创建智能体,验证其能否在保存、检索记忆的同时进行对话。
由于短期记忆可通过 StrandsAgents 的 ConversationManager 进行管理,因此本次验证将重点关注长期记忆。
我们已通过 AgentCore 的控制台,创建了启用 “用户偏好” 策略的记忆模块。
2.1 结构图

2.2 实现过程
以下为智能体的实现代码。为了获取与特定用户的对话记录,我们设置了可通过参数接收 “与谁对话” 这一信息的功能。
class MemoryAgent:
PROMPT = dedent("""\
请你扮演一个能为用户提供个性化服务、贴合用户需求的助手。
请利用与用户过往的交互信息,理解用户想要做的事情。
以下内容仅需在你内部处理,不得告知用户。
请自然地进行互动。
- 对于用户的输入内容,不得修改,需全部通过agent_core_memory的record工具进行记录。
- 在对话过程中,若话题发生变化或开启新话题,请通过agent_core_memory的retrieve工具,从过往交互记录中获取与用户相关的信息。
以上内容仅需在你内部处理,不得告知用户。
""")
def __init__(self, actor_id: str, session_id: str):
model = BedrockModel(
model_id='us.anthropic.claude-sonnet-4-20250514-v1:0',
streaming=True,
additional_request_fields={
'thinking': {'type': 'enabled', 'budget_tokens': 4000},
'anthropic_beta': ['interleaved-thinking-2025-05-14'],
},
region_name='us-west-2',
)
# 此处准备AgentCore Memory
# 可指定使用的记忆模块以及长期记忆的整理策略
provider = AgentCoreMemoryToolProvider(
memory_id=MEMORY_ID,
actor_id=actor_id,
session_id=session_id,
namespace=f'/strategies/{STRATEGY_ID}/actors/{actor_id}',
region='us-west-2',
)
self.agent = Agent(
model=model,
system_prompt=self.PROMPT,
tools=provider.tools,
)
async def stream(self, prompt):
async for event in self.agent.stream_async(prompt):
if text := event.get('event', {}).get('contentBlockDelta', {}).get('delta', {}).get('text', ''):
yield text
for content in event.get('message', {}).get('content', []):
if isinstance(content, dict) and (tool_use := content.get('toolUse', '')):
logger.info('## 工具使用:%s', tool_use)
2.3 尝试对话
我平时习惯使用 “Python+Angular” 的组合开发应用。如果智能体生成的应用也采用这种技术组合,我不仅更容易理解,还能直接将其投入实际应用。
本次验证中,我首先明确告知智能体需用 Python+Angular 实现,随后在不额外说明的情况下让其开发应用,以此检验它是否会主动使用 Angular。若智能体在未明确告知的情况下仍能选择 Angular,就说明它理解了我的偏好,实现了个性化,称得上是贴心的智能体。
2.3.1 未理解用户偏好的情况
我们先确认未设置 Strands Agents Tools、不使用记忆功能时的智能体表现。
首次对话:明确告知所用框架并让智能体实现
“请用 Python+Angular 开发一个 LLM 聊天 GUI 应用。”
智能体按照需求,使用 Python+Angular 实现了应用:
“将为您开发 LLM 聊天应用。我们将以 Python(FastAPI)作为后端,Angular 作为前端进行构建。”(其余省略)
另起线程:不告知框架,让智能体实现
若让同一个智能体开发,它有可能从对话历史中推断出需使用 Angular。为避免这种情况,我先停止了智能体应用,重新初始化一个新的智能体,再发出以下请求:“开发一个 RAG 聊天 GUI 应用。”
由于新智能体未保留之前的对话记忆,不记得上次使用 Angular 作为前端框架的情况。因此,它并未采用我习惯使用的 Angular,而是生成了基于 Streamlit 的代码:
“将为您开发 RAG 聊天 GUI 应用。我们将使用 Streamlit,构建一个包含文档上传、向量检索、聊天功能的完整应用。”(其余省略)
2.3.2 已理解用户偏好的情况
接下来,我们启用 Strands Agents Tools 的 Memory(记忆)工具,通过使用 AgentCore Memory,验证智能体是否能记住过往对话,从而成为具备个性化能力的智能体。
首次对话:明确告知所用框架并让智能体实现
“请用 Python+Angular 开发一个 LLM 聊天 GUI 应用。”
智能体同样按照需求完成了开发:
“好的,我们来用 Python + Angular 开发 LLM 聊天 GUI 应用!将采用全栈架构,打造一个实用的聊天应用。”(其余省略)
另起线程:不告知框架,让智能体实现
此处我们同样先创建一个新的智能体,再发起请求:“开发一个 RAG 聊天 GUI 应用。”
智能体回复:
“参考过往的交互记录,发现您对用 Python 和 Angular 开发 LLM 聊天应用很感兴趣!本次我们来开发一个集成了 RAG(检索增强生成)功能的聊天 GUI 应用吧。
以下为您建议的技术架构:
技术栈
- 后端:Python(FastAPI)
- 前端:Angular
- RAG:LangChain + 向量数据库(Chroma/FAISS)
- LLM:OpenAI API 或 Hugging Face
(其余省略)”
可见,智能体记住了此前用户使用 Python+Angular 开发 GUI 应用的偏好,因此主动提议采用相同技术架构进行开发。
这表明 AgentCore Memory 实现了预期功能,能够输出符合用户偏好的响应。
2.4 查看 Memory的内容
由于无法从 AWS 控制台直接查看 Memory 的内容,我们通过 AWS 命令行工具(AWSCLI)获取相关数据。
从获取的结果中可以看出,智能体已将 “对开发 LLM 应用感兴趣”“使用 Python+Angular 开发应用” 识别为用户的偏好。
$ aws bedrock-agentcore list-memory-records \
--memory-id $memoryId \
--namespace /strategies/memory_preference/actors/sy
{
"memoryRecordSummaries": [
{
"memoryRecordId": "mem-cacf3145-324f-4f30-8e83-dade742bc2e0",
"content": {
"text": "{\"context\":\"对开发LLM(大型语言模型)聊天应用表现出兴趣\",\"preference\":\"对基于LLM的聊天应用感兴趣\",\"categories\":[\"人工智能\",\"技术\",\"应用开发\"]}"
},
"memoryStrategyId": "memory_preference",
"namespaces": ["/strategies/memory_preference/actors/sy"]
},
{
"memoryRecordId": "mem-77a9f50f-8589-4229-874b-2dcac251708f",
"content": {
"text": "{\"context\":\"用户要求使用Python+Angular开发LLM聊天GUI应用\",\"preference\":\"对使用Python和Angular开发应用感兴趣\",\"categories\":[\"编程\",\"软件开发\",\"技术\"]}"
},
"memoryStrategyId": "memory_preference",
"namespaces": ["/strategies/memory_preference/actors/sy"]
}
]
}
当 Strands Agents 的智能体调用该 Memory 时,可通过向量检索获取匹配度高的内容作为相关记忆。
以下是第二次运行智能体时,Strands Agents 实际执行的工具调用内容,从中可看出其利用了向量检索的分数来获取相关记忆:
agent.agent.tool.agent_core_memory(
action='retrieve',
query='RAG 聊天 GUI 应用 开发 编程',
)
{
"memoryRecordSummaries": [
{
"content": {
"text": "{\"context\":\"用户要求使用Python+Angular开发LLM聊天GUI应用\",\"preference\":\"对使用Python和Angular开发应用感兴趣\",\"categories\":[\"编程\",\"软件开发\",\"技术\"]}"
},
"namespaces": ["/strategies/memory_preference/actors/sy"],
"score": 0.49530885
}
]
}
3. 应用示例
通过将 Strands Agents Tools 与 AgentCore Memory 相结合,智能体能够记住对话上下文,并根据用户的偏好和目标提供个性化服务。
此处将介绍几个在实际业务或服务中的应用场景。
客户支持
将用户过往的咨询内容及问题处理记录存储在长期记忆中,用户无需每次都从基础情况开始说明。例如,在处理错误问题时,智能体可实现 “上次出现的是XX错误,这次看起来是△△错误呢” 这类理解上下文的支持服务。
持续学习支持
作为教育类应用或企业内部培训的辅助工具,智能体可记录学习者的进度及薄弱领域,并据此调整出题内容和讲解方式。用户能获得 “以前你对这个问题不太擅长,这次已经能解出来了呢” 这类反馈,从而得到更具持续性的学习支持。
个性化推荐系统
在提供产品推荐或内容建议的应用中,智能体可结合用户的偏好及过往选择进行推荐。例如,旅行方案推荐智能体可实现 “上次您更喜欢安静的温泉胜地,这次为您推荐氛围相似的〇〇地区” 这类响应。
4. 总结
通过将 Strands Agents 与 Bedrock AgentCore 的 Memory 功能相结合,能够实现传统对话式 AI 难以做到的 “保持上下文”“结合个人偏好提供服务” 等能力。
本文通过一个简单的聊天应用,对 AgentCore Memory 的功能进行了验证。
结果表明,利用 Memory 工具能够为用户提供更自然、更具连贯性的体验。
未来,还需要应对更复杂的应用场景,例如提升记忆的准确性、实现记忆的删除与修改控制、支持多用户使用等。可以说,让智能体具备 “记忆” 能力,是未来 AI 应用发展中的关键功能之一。

发表回复