借助 StrandsAgents+AgentCore Memory 实现符合个人偏好的智能体

近年来,随着对话式 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 应用发展中的关键功能之一。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注