HelloAgents:Memory------让 Agent 拥有记忆
从"失忆的大模型"到"具有长期记忆的智能体"
系列说明:本文是 HelloAgents 第八章《记忆与检索》的学习笔记(上篇),结合官方教程内容和个人理解进行整理。本文主要介绍记忆系统(Memory)的设计思想,包括为什么 Agent 需要记忆、人类记忆模型对智能体的启发,以及 HelloAgents 中 Memory 模块的整体架构。
前言
随着大语言模型(LLM)的不断发展,越来越多的智能体(Agent)开始具备自主规划(Planning)、工具调用(Tool Use)、反思(Reflection)等能力。前面的 HelloAgents 教程也逐步实现了这些核心功能,一个 Agent 已经能够根据用户需求自主调用工具并完成复杂任务。
然而,即使拥有这些能力,Agent 仍然存在一个非常明显的缺陷------没有长期记忆。
例如下面这段对话:
text
用户:
我叫小明,目前是一名计算机专业研究生。
Agent:
好的,我记住了。
......
(几天后重新开启会话)
用户:
你还记得我是谁吗?
Agent:
抱歉,我不知道。
为什么会出现这种情况?
原因并不复杂。
LLM 本身并没有真正意义上的"记忆",模型能够看到的信息全部来自上下文窗口(Context Window)。一次对话结束之后,新的会话不会自动继承之前的内容,因此模型无法真正记住用户的信息。
也就是说,对于大模型而言:
它不是忘记了,而是从来没有保存过。
这也是为什么我们会觉得 ChatGPT、Claude 等模型"像失忆一样"。
虽然目前越来越多的产品都提供了 Memory 功能,但这实际上并不是模型本身具备了记忆,而是在模型之外额外构建了一套记忆管理系统(Memory System)。
HelloAgents 第八章的目标,就是为 Agent 增加这样一套长期记忆能力。
一、为什么 Agent 需要 Memory
在传统聊天机器人中,每次回答往往都是独立完成的,因此是否具有长期记忆影响并不明显。
但是对于 Agent 来说,仅仅能够回答问题远远不够。
一个真正能够持续工作的智能体,需要在不同时间、不同任务之间保存经验、积累知识,并根据历史信息做出更加合理的决策。
因此,Memory 已经成为现代 Agent 不可缺少的重要组成部分。
通常来说,Memory 至少具有以下几个作用。
1. 实现连续对话
最直观的作用就是支持长期对话。
例如:
text
用户:
以后推荐编程语言的时候,优先推荐 Python。
......
几天后
用户:
推荐一个适合机器学习的语言。
如果 Agent 没有长期记忆,它只能重新分析用户当前的问题。
而如果保存了历史信息,它就能够知道:
用户之前明确表示喜欢 Python。
因此回答可能变成:
推荐 Python,因为你之前提到希望优先学习 Python,它拥有丰富的机器学习生态,例如 PyTorch、TensorFlow、Scikit-Learn 等。
可以看到,回答已经具有连续性。
2. 构建用户画像(User Profile)
长期记忆不仅能够保存一句话,还可以逐渐形成用户画像。
例如经过很多次交流之后,可以得到:
text
用户偏好:
✓ 喜欢 Python
✓ 使用 Markdown
✓ 更喜欢中文回答
✓ 主要研究方向:多目标优化
✓ 正在学习 Agent
以后 Agent 回答问题时,就不需要用户反复介绍自己的背景。
这也是许多商业 AI 产品越来越重视 Memory 的原因。
3. 支持长期任务(Long-term Task)
越来越多 Agent 开始执行持续数小时甚至数天的任务,例如:
- Deep Research
- 自动软件开发
- 长时间数据分析
- 自动论文阅读
如果 Agent 每完成一步就忘记之前发生了什么,那么整个任务几乎无法继续。
例如:
text
Day1:
已经阅读论文 A
Day2:
继续阅读论文 B
Day3:
总结所有论文
如果没有 Memory,第三天根本不知道前两天做过什么。
因此,Memory 也是实现 Long-term Agent 的基础能力。
4. 不断积累经验
对于真正智能的系统来说,重要的不仅是回答问题,更重要的是学习。
例如:
第一次:
text
用户:
这个回答太简单了。
第二次:
text
用户:
希望加入代码示例。
第三次:
text
用户:
最好使用 Markdown。
如果 Agent 能够不断记录这些反馈,它以后生成内容时就会越来越符合用户习惯。
这种能力,本质上就是一种经验积累。
二、人类记忆系统对 Agent 的启发
HelloAgents 在介绍 Memory 时,并没有直接讲代码,而是首先介绍了**认知心理学(Cognitive Psychology)**中的人类记忆模型。
这是因为,目前很多 Agent Framework(如 LangGraph、Mem0、Letta 等)在设计 Memory 时,都借鉴了人类大脑的记忆方式。
通常认为,人类记忆可以划分为三个层次:
text
外界信息
│
▼
感觉记忆(Sensory Memory)
│
▼
工作记忆(Working Memory)
│
▼
长期记忆(Long-term Memory)
不同层次承担不同的功能。
(一)感觉记忆(Sensory Memory)
感觉记忆是信息进入大脑后的第一站。
例如:
当我们看到一张图片、听到一句话、闻到一种气味时,这些信息都会首先进入感觉记忆。
它具有两个特点:
① 容量非常大
几乎所有感官信息都会短暂保存。
② 保存时间极短
通常只有几百毫秒到几秒钟。
如果没有进一步关注,这些信息很快就会消失。
例如:
text
走在街上
↓
看到很多广告牌
↓
大多数内容马上忘记
Agent 一般不会实现这一层,因为它更关注已经进入推理阶段的信息。
(二)工作记忆(Working Memory)
工作记忆可以理解为:
当前正在思考的问题。
例如我们计算:
text
37 × 48
脑海中不断保存:
text
37
48
1776
这些临时信息,就是工作记忆。
工作记忆容量非常有限。
认知心理学提出著名的 "7±2 法则",认为人类能够同时处理的信息数量通常只有 5~9 个对象。
对于 Agent 而言,工作记忆对应的是:
- 当前 Prompt
- 当前任务状态
- Tool 返回结果
- 中间推理过程
例如:
text
用户提问
↓
LLM 思考
↓
调用搜索工具
↓
获取搜索结果
↓
继续推理
整个过程中产生的大量临时信息,都属于 Working Memory。
这些内容通常只在当前任务中有效,任务结束后即可释放。
(三)长期记忆(Long-term Memory)
真正让人具有学习能力的,是长期记忆。
与工作记忆相比,它几乎没有容量限制,可以保存几年甚至一生。
长期记忆又可以进一步划分为两类。
1. 程序性记忆(Procedural Memory)
程序性记忆保存的是技能。
例如:
- 骑自行车
- 游泳
- 打字
- 写代码
这些能力往往很难用几句话描述,却能够通过不断练习形成。
对于 Agent 而言,可以理解为各种能力模块,例如:
- 会调用搜索工具
- 会调用代码解释器
- 会生成图片
- 会编写 SQL
这些能力类似于 Agent 已经掌握的"技能"。
2. 陈述性记忆(Declarative Memory)
陈述性记忆保存的是可以用语言描述的信息。
它又继续分为两种不同类型:
(1)语义记忆(Semantic Memory)
语义记忆主要保存事实和知识。
例如:
text
北京是中国首都
Transformer 于 2017 年提出
Python 是解释型语言
这些知识没有明显时间属性。
对于 Agent 来说,语义记忆通常包括:
- 用户偏好
- 用户职业
- 常见知识
- 事实信息
例如:
text
用户喜欢 Markdown。
用户研究方向是 Agent。
用户主要使用 Python。
这些都属于 Semantic Memory。
(2)情景记忆(Episodic Memory)
与语义记忆不同,情景记忆保存的是经历过的事件。
例如:
text
昨天下午
导师让我修改实验方案。
或者:
text
上周完成了论文初稿。
它最大的特点就是具有时间属性。
通常包含:
- 时间
- 地点
- 人物
- 事件
对于 Agent 来说,情景记忆非常重要。
例如:
text
2026-06-01
已经完成数据清洗
↓
2026-06-05
已经训练模型
↓
2026-06-08
开始分析实验结果
这些任务记录共同组成了一条完整的工作流程。
因此,在很多现代 Agent 框架中,Semantic Memory 与 Episodic Memory 都是长期记忆的重要组成部分。
下面继续第二部分。本部分重点介绍 Memory 与 RAG 的关系、HelloAgents 的 Memory 架构以及四类记忆的设计。
三、Memory 与 RAG 有什么区别?
很多初学 Agent 的同学都会有一个疑问:
既然已经有 RAG(Retrieval-Augmented Generation,检索增强生成),为什么还需要 Memory?
实际上,这两者虽然都涉及"检索",但解决的问题完全不同。
可以先看下面这张对比图:
text
Agent
┌─────────────────┐
│ LLM │
└────────┬────────┘
│
┌──────────┴──────────┐
│ │
▼ ▼
Memory RAG知识库
(记住过去) (查询外部知识)
一句话概括就是:
- Memory:记住"自己经历过什么"。
- RAG:查找"外部有哪些知识"。
二者关注的对象不同。
Memory:保存智能体自己的经历
Memory 保存的是 Agent 与用户交互过程中产生的信息,例如:
text
用户喜欢 Python。
用户正在学习 Agent。
用户上周完成了论文初稿。
用户昨天让我帮忙修改代码。
这些内容都是 Agent 自己经历过的。
它们最大的特点是:
- 与用户密切相关
- 会随着交流不断增加
- 每个用户都不一样
因此,Memory 更像一个人的大脑。
RAG:连接外部知识世界
而 RAG 面向的是另一类问题。
例如:
text
企业内部文档
PDF
Word
论文
产品说明书
API 文档
公司知识库
这些知识模型原本并不知道。
如果直接问:
TensorRT 最新支持哪些功能?
LLM 很可能回答得不完整。
但如果先去企业知识库检索相关文档,再把文档放进 Prompt,模型就能够基于最新资料回答。
整个过程就是 RAG。
因此,RAG 更像一本能够快速翻阅的百科全书。
一个例子理解二者区别
假设用户连续几个月都在使用同一个 Agent。
某一天用户问:
text
帮我推荐一本机器学习的书。
Agent 的处理流程可能如下:
第一步:查询 Memory
Memory 中发现:
text
用户喜欢 Python。
用户是一名研究生。
主要研究方向是人工智能。
这些信息说明:
推荐应该偏向 Python 实现,而不是 C++。
第二步:查询 RAG
随后再去知识库中检索:
text
机器学习经典教材
最新出版书籍
课程资料
找到之后交给 LLM。
最终回答可能变成:
text
根据你的研究方向,我建议阅读:
《Hands-On Machine Learning with Scikit-Learn、
Keras and TensorFlow》
原因:
① 你之前一直学习 Python;
② 这本书代码全部采用 Python;
③ 非常适合研究生学习。
可以看到:
Memory 决定了"推荐给谁";
RAG 决定了"推荐什么"。
两者结合之后,Agent 才真正具有个性化能力。
四、HelloAgents 的 Memory 系统架构
理解 Memory 的作用之后,再来看 HelloAgents 是如何设计整个记忆系统的。
官方并没有把 Memory 看成一个简单的列表,而是设计成了完整的分层架构。
整体可以表示为:
text
Memory System
│
┌───────────────────┼───────────────────┐
│ │ │
▼ ▼ ▼
Infrastructure Memory Types Storage
│
▼
Embedding
整个系统可以理解为四层。
第一层:Infrastructure(基础设施层)
这是整个 Memory 的核心入口。
它负责统一管理所有记忆操作。
主要包括几个基础组件:
text
MemoryManager
MemoryItem
MemoryConfig
BaseMemory
它们各自承担不同职责。
MemoryItem------记忆的基本单元
所有记忆最终都会表示成一个 MemoryItem。
例如:
python
MemoryItem(
content="用户喜欢 Python",
memory_type="semantic",
importance=0.9
)
一个 MemoryItem 一般包含:
text
content
memory_type
timestamp
importance
embedding
metadata
其中:
content
真正保存的信息。
例如:
text
用户喜欢 Markdown。
memory_type
表示属于哪一种记忆。
例如:
text
working
semantic
episodic
不同类型采用不同管理策略。
importance
表示重要程度。
例如:
text
天气很好
重要性可能只有:
text
0.2
而:
text
用户长期研究方向是人工智能
重要性可能达到:
text
0.95
重要信息通常不会轻易删除。
MemoryManager------整个系统的大脑
如果说 MemoryItem 是一条记忆,
那么 MemoryManager 就是管理所有记忆的人。
Agent 不会直接操作数据库。
所有操作都会经过 MemoryManager,例如:
text
添加记忆
↓
更新记忆
↓
搜索记忆
↓
删除记忆
↓
总结记忆
统一管理之后,不同类型 Memory 的接口保持一致,也方便后续扩展新的记忆类型。
BaseMemory------统一接口
HelloAgents 中,不同 Memory 类型都继承同一个父类。
例如:
python
class BaseMemory:
def add():
pass
def search():
pass
def update():
pass
def delete():
pass
这样做的好处就是:
无论是 Working Memory,还是 Semantic Memory,都可以通过统一接口进行操作。
符合面向对象设计思想。
第二层:Memory Types(记忆类型)
官方根据前面介绍的人类记忆模型,实现了四种不同类型的 Memory。
text
Memory
│
├── Working Memory
├── Semantic Memory
├── Episodic Memory
└── Perceptual Memory
下面分别介绍。
(一)Working Memory(工作记忆)
工作记忆主要保存:
当前任务执行过程中产生的信息。
例如:
text
用户问题
↓
Prompt
↓
Tool 返回结果
↓
LLM 推理过程
↓
最终回答
整个流程中产生的大量临时数据,都属于 Working Memory。
它具有几个特点:
- 生命周期短
- 容量有限
- 任务结束即可释放
例如:
text
正在调用搜索工具......
搜索完成......
继续推理......
这些内容没有必要长期保存。
因此 Working Memory 通常会设置 TTL(Time To Live),到期自动删除。
(二)Semantic Memory(语义记忆)
Semantic Memory 保存长期知识。
例如:
text
用户喜欢 Python。
用户来自哈尔滨。
用户研究方向是 Agent。
用户经常使用 Markdown。
这些信息没有明显时间限制。
无论今天还是一年后,它们通常仍然成立。
因此适合长期保存。
Agent 每次回答之前,都可以先查询 Semantic Memory,从而生成更加个性化的回复。
(三)Episodic Memory(情景记忆)
Episodic Memory 保存的是事件。
例如:
text
2026-06-01
开始训练模型。
或者:
text
2026-06-03
实验出现 CUDA Out Of Memory。
继续:
text
2026-06-05
修改 Batch Size。
成功完成训练。
这些事件按照时间不断排列,就形成了一条完整的经历。
因此 Episodic Memory 更关注:
- 时间
- 地点
- 顺序
- 上下文
很多长任务 Agent 都依赖 Episodic Memory 来追踪执行过程。
(四)Perceptual Memory(感知记忆)
除了文本之外,现在越来越多 Agent 开始支持:
- 图片
- 视频
- 音频
这些多模态信息,也需要长期保存。
例如:
text
今天上传了一张实验图片。
↓
Agent 自动分析。
↓
以后再次提到这张图片,
Agent 能继续讨论。
这种能力就是 Perceptual Memory。
它对应的是智能体对于视觉、听觉等多模态输入的长期记忆。
目前,多模态 Agent 已逐渐开始支持这一类型的记忆。
四种 Memory 的对比
| Memory 类型 | 保存内容 | 生命周期 | 示例 |
|---|---|---|---|
| Working Memory | 当前任务、中间推理 | 短期 | Prompt、Tool 输出 |
| Semantic Memory | 知识、事实、用户偏好 | 长期 | 用户喜欢 Python |
| Episodic Memory | 事件、经历 | 长期 | 昨天训练模型成功 |
| Perceptual Memory | 图片、音频等多模态信息 | 长期 | 上传的一张实验图片 |
可以看到,这四类 Memory 并不是孤立存在的,而是共同组成了 Agent 的长期记忆系统。
下面继续第三部分,也是本篇博客的最后一部分。这一部分会介绍 Memory 的存储方式、生命周期以及 HelloAgents 中 Memory 的基本使用流程,最后进行总结。
五、Memory 是如何存储的?
前面已经介绍了 Memory 的分类,但还有一个问题:
这些记忆最终保存在哪里?
如果只是保存在 Python 变量中,那么程序一旦关闭,所有记忆都会消失。因此,一个完整的 Memory 系统必须具备**持久化存储(Persistent Storage)**能力。
HelloAgents 将 Memory 的存储拆分为多个层次,不同类型的数据交由不同的存储方式管理。
整体流程如下:
text
用户输入
│
▼
MemoryManager
│
┌──────────┴──────────┐
│ │
▼ ▼
文本信息存储 向量信息存储
│ │
SQLite Qdrant
可以发现,一条记忆并不会只保存一份,而是会根据用途保存不同的数据。
SQLite:保存原始文本
SQLite 是一个轻量级关系型数据库,非常适合本地部署。
例如:
text
content:
用户喜欢 Python
time:
2026-07-04
type:
semantic
这些结构化信息都可以直接存入 SQLite。
SQLite 的优点包括:
- 部署简单,不需要额外服务器;
- 支持 SQL 查询;
- 易于管理文本和元数据;
- 适合作为 Memory 的持久化数据库。
因此,在 HelloAgents 中,它主要负责保存原始内容和相关属性。
为什么还需要向量数据库?
如果只保存文本,那么当用户输入:
推荐一种适合人工智能开发的语言。
数据库中保存的是:
text
用户喜欢 Python。
由于两个句子没有完全相同的关键词,传统数据库很难判断它们相关。
因此,仅靠字符串匹配并不能满足 Agent 的需求。
这也是为什么现代 Agent 基本都会引入向量数据库(Vector Database)。
Embedding:把文本转换成向量
在进入向量数据库之前,需要先进行 Embedding(向量化)。
Embedding 可以理解为:
把一句自然语言转换成一个高维数字向量。
例如:
text
用户喜欢 Python
经过 Embedding 模型之后,可能变成:
text
[0.12, -0.37, 0.81, ..., 0.24]
再例如:
text
推荐 Python 做机器学习。
转换后:
text
[0.10, -0.35, 0.79, ..., 0.26]
虽然两句话完全不同,但由于表达的语义相近,因此两个向量之间的距离会比较近。
这就是语义检索能够工作的基础。
Qdrant:负责语义检索
得到向量之后,就可以存入向量数据库。
HelloAgents 使用 Qdrant 作为默认向量数据库。
Qdrant 的主要职责包括:
- 保存 Embedding;
- 根据向量相似度进行搜索;
- 返回最相关的 Memory。
例如,当前数据库中保存了:
text
Memory A:
用户喜欢 Python。
Memory B:
用户喜欢 Java。
Memory C:
用户喜欢 C++。
用户输入:
text
推荐一种适合深度学习的编程语言。
经过 Embedding 后,系统会计算该问题与所有 Memory 向量之间的距离。
由于 "Python" 与 "深度学习" 的语义最接近,因此 Qdrant 会优先返回:
text
用户喜欢 Python。
这就是语义检索(Semantic Retrieval)的过程。
相比传统关键词匹配,它能够理解含义相近但表达不同的文本,因此检索效果更好。
六、Memory 的生命周期
一条 Memory 从产生到被使用,并不是简单地"存进去再取出来"。
HelloAgents 借鉴了人类记忆形成过程,将 Memory 划分为多个阶段。
整个流程如下:
text
用户输入
│
▼
Encoding(编码)
│
▼
Storage(存储)
│
▼
Retrieval(检索)
│
▼
Consolidation(巩固)
│
▼
Forgetting(遗忘)
下面分别介绍。
1. Encoding(编码)
这是 Memory 的第一步。
当用户输入一句话时,系统首先判断:
这句话是否值得记住?
例如:
text
今天天气不错。
通常没有长期价值。
而:
text
以后回答问题请使用 Markdown。
则属于用户偏好,值得长期保存。
如果需要保存,系统会完成以下操作:
- 提取关键信息;
- 计算 Embedding;
- 构建 MemoryItem;
- 准备写入数据库。
这个过程就称为 Encoding。
2. Storage(存储)
完成编码之后,Memory 会真正写入数据库。
例如:
python
memory.add(
content="用户喜欢 Markdown",
memory_type="semantic",
importance=0.9
)
此时系统会同步完成:
- 保存文本;
- 保存 Embedding;
- 保存时间;
- 保存类型;
- 保存重要程度。
这样,一条完整的 Memory 就建立完成了。
3. Retrieval(检索)
当用户再次提问时,系统不会立即调用 LLM。
而是先执行 Memory 检索。
例如:
text
用户:
推荐一种笔记格式。
Memory 检索后发现:
text
用户喜欢 Markdown。
于是把它加入 Prompt:
text
用户偏好:
喜欢 Markdown。
当前问题:
推荐一种笔记格式。
最终 LLM 会生成更加符合用户习惯的回答。
这也是 Memory 发挥作用最重要的一步。
4. Consolidation(巩固)
并不是所有 Memory 都具有相同的重要性。
例如:
text
今天搜索了一次天气。
价值很低。
而:
text
用户连续几十次要求使用 Markdown。
则说明这是一个长期稳定的偏好。
因此,系统可以根据:
- 出现频率;
- 用户反馈;
- 使用次数;
- Importance;
不断提高某些 Memory 的权重。
这个过程类似于人脑不断强化长期记忆,因此称为 Consolidation(巩固)。
5. Forgetting(遗忘)
真正优秀的 Memory 系统不仅会"记住",也要学会"忘记"。
如果所有内容都永久保存,那么数据库会越来越大,检索效率也会不断下降。
例如:
text
昨天查询天气。
今天搜索快递。
临时生成一个验证码。
这些信息通常没有长期价值。
因此,系统会根据:
- TTL(生存时间);
- Importance(重要程度);
- 最近访问次数;
自动清理无效 Memory。
这种机制既节省存储空间,也提高了检索效率。
七、HelloAgents 中 Memory 的基本使用
HelloAgents 将 Memory 封装成统一接口,开发者无需直接操作数据库。
例如,添加一条记忆:
python
result = memory_tool.execute(
"add",
content="用户喜欢 Python",
memory_type="semantic",
importance=0.9
)
这里:
content:需要保存的内容;memory_type:指定记忆类型;importance:重要程度,用于后续排序和保留策略。
搜索 Memory 也非常简单:
python
result = memory_tool.execute(
"search",
query="机器学习",
limit=3
)
系统内部会自动完成:
text
查询语句
│
▼
Embedding
│
▼
Qdrant 相似度搜索
│
▼
返回 Top-K Memory
开发者只需要关注搜索结果,而不需要自己实现向量检索逻辑。
如果想查看当前 Memory 的整体情况,还可以进行统计:
python
result = memory_tool.execute("summary")
可能得到类似结果:
text
Working Memory:2 条
Semantic Memory:15 条
Episodic Memory:8 条
方便开发者了解当前 Agent 的记忆状态。
八、总结
随着 Agent 能力不断增强,仅依靠 LLM 的上下文窗口已经无法满足复杂任务需求。
Memory 的引入,使 Agent 不再只是"即时回答问题",而是真正具备了持续学习、长期积累和个性化服务的能力。
通过本章的学习,我们可以总结出以下几点:
-
Memory 是 Agent 长期运行的基础能力。 它能够保存用户偏好、历史事件以及任务经验,使智能体具备连续对话和长期任务执行能力。
-
HelloAgents 的 Memory 借鉴了人类记忆模型。 根据不同信息的特点,将记忆划分为 Working Memory、Semantic Memory、Episodic Memory 和 Perceptual Memory,不同类型采用不同的管理策略。
-
Memory 与 RAG 并不冲突,而是相辅相成。 Memory 负责保存 Agent 自身的经历和用户信息,RAG 则负责连接外部知识库,为模型提供最新、最专业的知识支持。
-
向量化(Embedding)和向量数据库(Qdrant)是 Memory 实现语义检索的关键。 它们使系统能够理解文本的语义,而不仅仅依赖关键词匹配,从而显著提升检索质量。