mem0学习笔记1:ReAct 智能体的记忆困境

如果你正在构建 AI 智能体,你可能已经遇到了一个让人抓狂的问题:智能体似乎患有"阿尔茨海默症"

它刚刚花了 3 步去搜索某个 API 文档,但 5 分钟后,当你问同样的问题时,它又重新搜索了一遍。它无法记住自己做过什么、学到了什么,更不用说记住用户的偏好了。

这不是某个框架的 bug,这是 ReAct 智能体架构的固有问题

什么是 ReAct?

在深入记忆问题之前,让我们先理解 ReAct(Reasoning and Acting)范式。

ReAct 是由 Yao 等人在 2022 年提出的一种 Agent 架构模式。它的核心思想是:让 LLM 交替进行"思考"和"行动"

一个典型的 ReAct 循环

用户:帮我查一下今天纽约的天气,然后推荐合适的穿搭。

Thought 1: 我需要先查询纽约的天气。
Action 1: search_weather(location="New York")
Observation 1: 纽约今天 15°C,多云。

Thought 2: 15°C 比较凉爽,我应该推荐长袖衣物。
Action 2: FINISH
Answer: 今天纽约 15°C,建议穿长袖衬衫和薄外套。

与传统 Agent 的区别

  • Chain-of-Thought (CoT):只有思考,没有工具调用。
  • 传统 Agent:只有工具调用,缺少中间推理。
  • ReAct:思维链 (CoT) + 工具调用 (Tool Use) 的完美融合。

ReAct 的记忆问题

ReAct 范式很强大,但它有一个致命缺陷:每次对话都是从零开始

问题 1:任务遗忘

在多步骤任务中,智能体会忘记之前收集的信息。

# 第 1 次对话
用户:查一下苹果公司的最新股价。
Agent: 执行 search_stock("AAPL") → 得到 $175

# 5 分钟后
用户:刚才那个股价涨了吗?
Agent: 我不知道你说的是什么股票...

因为 LLM 的上下文窗口有限,旧的对话会被丢弃。

问题 2:重复调用工具

没有记忆,智能体无法知道"这个信息我已经查过了"。

用户:帮我分析一下 Python 的装饰器。

Thought: 我需要搜索装饰器的定义。
Action: search("Python decorator definition")
Observation: [得到结果]

Thought: 我还需要举个例子...
Action: search("Python decorator definition")  #  又搜了一遍!

问题 3:用户上下文丢失

智能体无法记住用户的偏好、工作领域、历史决策。

# 对话 1
用户:我是做 AI 开发的,帮我推荐学习资源。
Agent: [推荐了 AI 相关资源]

# 对话 2(新会话)
用户:再推荐一些资源。
Agent:  不知道用户的背景,推荐了通用编程资源...

Mem0:为 ReAct 智能体注入记忆

这就是 Mem0 登场的地方。它不仅仅是一个"数据库",而是一个 智能记忆层

技术优势 1:混合存储策略

传统 RAG 只使用向量数据库,但这对于智能体来说不够。

Mem0 的三层架构

  1. 向量存储 (Vector Store):语义搜索
    • 问题:"用户喜欢什么类型的书?"
    • 答案:"用户喜欢科幻和历史类书籍"(模糊匹配)
  2. 图存储 (Graph Store):结构化关系
    • 问题:"Alice 的老板是谁?"
    • 答案:"Bob"(精确关系,无幻觉)
  3. SQL/SQLite:历史审计
    • 问题:"显示昨天的所有工具调用"
    • 答案:完整的时间序列记录

为什么需要混合?
纯向量数据库可以告诉你"用户可能喜欢科幻",但无法准确回答"Alice 的团队有几个人"。图数据库则可以精确建模这种关系。

技术优势 2:自动去重与更新

如果智能体今天搜索到"Python 3.12 发布了",明天又看到"Python 3.13 发布了",Mem0 不会简单地存储两条记录。

它会:

  1. 检测冲突:这两条信息都是关于"Python 最新版本"。
  2. LLM 决策:3.13 比 3.12 新,应该执行 UPDATE 而不是 ADD
  3. 更新记录:旧记录被标记为过时或直接删除。

这种"自我修正"能力是静态 RAG 所不具备的。

技术优势 3:与 Agent 框架无缝集成

Mem0 提供了开箱即用的集成:

  • LangChain: 作为 Memory 组件直接插入 AgentExecutor
  • LlamaIndex: 可以作为 BaseMemory 使用。
  • 自定义框架: 通过简单的 add()search() API 调用。
from mem0 import Memory

memory = Memory()

# 在 ReAct 循环中
memories = memory.search("之前我们搜索过什么?", user_id="alice")
# 将 memories 注入到下一个 Thought 中

下一步是什么?

我们已经理解了问题和解决方案。在 下一篇文章 中,我们将动手实现一个完整的 ReAct 智能体,并逐步加入 Mem0 记忆层。

你将看到:

  • 如何手动实现 ReAct 循环(无框架依赖)
  • Thought 阶段注入记忆
  • Observation 后保存新知识