Hermes Agent 学习笔记 05:Memory 系统,为什么长期 Agent 不能每次都从零开始?
1. 为什么 Agent 需要 Memory?
在前几期中,我已经学习了 Hermes Agent 的安装、CLI/TUI 使用方式,以及它的工具调用系统。到这里,Hermes 已经不只是一个聊天入口,而是可以读取文件、执行命令、调用工具、分析项目的 Agent。
但是,如果一个 Agent 每次启动都像第一次见到用户一样,它仍然不能算是真正的长期助手。
举个简单例子。
假设我连续几天都在用 Hermes 学习一个开源项目。第一天,我告诉它这个项目的背景、目录结构和我的学习目标;第二天,我继续让它分析某个模块;第三天,我想让它帮我总结博客。
如果 Hermes 每次都忘记之前的项目背景,那我就必须反复解释:
这个项目是做什么的;
我已经分析到哪一步了;
我希望博客用什么风格;
我关注哪些模块;
哪些内容之前已经讲过。
这会让 Agent 的使用体验变得非常割裂。
因此,长期 Agent 必须具备 memory。它需要记住用户偏好、项目背景、环境信息、长期目标和已经学到的经验。否则,它就只是一个有工具调用能力的临时助手,而不是一个真正能陪伴用户长期工作的 Agent。
Hermes Agent 的 Memory 系统正是为了解决这个问题。
2. Memory 不是简单的聊天记录
很多人一看到 memory,就会以为它等于“保存历史聊天记录”。但在 Agent 系统中,memory 不应该被简单理解为聊天记录。
聊天记录是原始过程。
Memory 是从过程里提炼出来的长期有用信息。
例如,下面这段原始聊天记录:
用户:我现在主要在学习 Hermes Agent,准备写系列博客。
用户:博客风格希望偏学习笔记,不要太像官方文档翻译。
用户:每期要先讲问题,再讲机制,最后总结。
如果全部保存为聊天记录,内容会很长,而且里面可能混杂很多临时对话。但如果提炼成 memory,可以变成:
用户正在写 Hermes Agent 学习笔记系列博客,偏好“先讲问题,再讲机制,最后总结”的写法,避免机械翻译官方文档。
这才是适合长期保存的记忆。
所以,我理解 Hermes Memory 的关键不是“什么都存”,而是“存对以后有用的东西”。
3. Memory、上下文窗口和会话历史的区别
在学习 Hermes Memory 之前,必须先区分三个概念:
上下文窗口
会话历史
长期记忆
3.1 上下文窗口
上下文窗口是模型当前能看到的内容范围。它通常包括系统提示、用户消息、助手回复、工具调用结果等。
它的特点是:
短期;
受 token 限制;
随着对话变长而膨胀;
超过限制后需要截断或压缩。
上下文窗口适合处理当前任务,但不适合承载长期记忆。因为如果把所有历史对话都塞进上下文,成本会非常高,模型也容易被无关信息干扰。
3.2 会话历史
会话历史是某一次或多次对话的完整记录。它记录了用户和 Agent 之间发生过什么。
它的特点是:
保留过程;
信息完整;
但冗余很多;
不一定适合每次都注入模型。
会话历史适合回溯任务过程,比如查看之前做过哪些操作、读过哪些文件、执行过哪些命令。
但会话历史不等于 memory。因为历史中有大量临时内容,不一定都值得长期保存。
3.3 长期记忆
长期记忆是从用户、项目、环境和任务中提炼出来的稳定信息。
它的特点是:
长期有效;
经过筛选;
信息密度更高;
用于影响后续对话和任务执行。
例如:
用户偏好中文解释;
用户正在研究 AI Agent 源码;
某个项目使用 Python + FastAPI;
用户希望博客以学习笔记形式输出;
用户不喜欢直接照搬官方文档。
这些信息不一定属于某一次具体对话,但会影响后续很多任务。因此,它们更适合成为 memory。
4. Hermes Agent 的内置 Memory 结构
Hermes Agent 的内置 memory 主要由两个文件构成:
MEMORY.md
USER.md
可以这样理解:
MEMORY.md:Agent 的工作记忆,偏项目、环境、约定和经验。
USER.md:用户画像,偏用户偏好、沟通风格、角色和习惯。
4.1 MEMORY.md:记录任务和环境相关信息
MEMORY.md 更像是 Agent 自己的工作笔记。
它可以记录:
用户当前正在学习的项目;
项目所在路径;
项目技术栈;
常用命令;
实验环境;
已经确认过的事实;
后续任务中需要遵守的约定。
例如:
用户正在学习 Hermes Agent,并准备写中文学习笔记博客系列。
或者:
用户的当前实验环境是 Ubuntu 22.04,常用 Python 项目目录位于 ~/projects。
这类信息不是用户个人画像,而是 Agent 在任务执行过程中需要长期参考的工作背景。
4.2 USER.md:记录用户偏好和沟通方式
USER.md 更像是用户 profile。
它可以记录:
用户偏好的语言;
用户喜欢的回答风格;
用户的技术水平;
用户的写作习惯;
用户希望避免的表达方式;
用户常见工作流。
例如:
用户偏好中文回答,喜欢先讲问题本质,再讲技术细节。
或者:
用户写技术博客时偏好“学习笔记”风格,不喜欢太像官方文档翻译。
这类信息会影响 Hermes 后续如何组织回答。
5. Memory 是如何进入对话的?
Hermes Agent 的内置 memory 不是每次都靠 Agent 主动搜索出来的,而是在会话开始时被加载到系统提示中。
也就是说,当一个新的 Hermes 会话启动时,它会从本地 memory 文件中读取内容,并把这些记忆作为系统提示的一部分交给模型。
这样,模型在一开始就能知道一些长期背景,比如用户偏好、项目事实和环境信息。
这个机制有一个非常重要的特点:
会话开始时注入的是 memory 快照。
也就是说,如果 Agent 在当前会话中写入了新的 memory,这个 memory 会保存到磁盘中,但它不一定会立即出现在当前会话的系统提示中。新的 memory 通常要到下一次会话启动时,才会作为初始记忆被注入。
这个设计有它的原因。因为系统提示如果在对话中频繁变化,会影响上下文稳定性和缓存效率。把 memory 作为会话开始时的 frozen snapshot,可以让当前会话更稳定。
因此,使用 Hermes Memory 时要理解一个现象:
写入 memory 是立即持久化的;
但作为系统提示自动出现,通常要等下一次会话。
这也是很多初学者容易误解的地方。
6. Memory Tool:Agent 如何修改记忆?
Hermes Agent 通过 memory 工具来管理内置记忆。
它支持三类操作:
add:添加新记忆
replace:替换已有记忆
remove:删除不再需要的记忆
6.1 add:添加记忆
当 Agent 发现某条信息对后续任务有长期价值时,可以添加 memory。
例如:
用户正在写 Hermes Agent 学习笔记博客,当前已经完成前四期。
这条信息对后续“下一期”这类请求很有用,因此适合保存。
6.2 replace:更新记忆
如果某条记忆已经过时,就应该替换,而不是重复添加。
例如原来的记忆是:
用户正在写 Hermes Agent 学习笔记博客,当前完成到第二期。
后面应该更新为:
用户正在写 Hermes Agent 学习笔记博客,当前完成到第五期。
如果不做 replace,而是不断 add,就会产生多条互相冲突的记忆。
6.3 remove:删除记忆
有些信息过期后应该删除。
例如:
用户今天下午要调试某个临时脚本。
如果这个信息只对当天有效,就不适合作为长期 memory。即使被写入了,后续也应该删除。
长期 Agent 的记忆不是越多越好,而是越准确、越稳定、越相关越好。
7. Memory 的容量限制:为什么不能什么都记?
Hermes 的内置 memory 是有容量限制的。这一点非常重要。
很多人会以为长期记忆应该无限保存,但实际上,Agent memory 如果不加限制,很快就会变成垃圾堆。大量无关、重复、过期、矛盾的信息会进入模型上下文,反而降低效果。
因此,Hermes 对内置 memory 做了边界控制。它不是让 Agent 无限记忆,而是要求 Agent 维护一个精简、可控、长期有用的 memory 文件。
这带来一个重要原则:
Memory 应该是压缩后的长期信息,而不是完整聊天记录。
例如,不应该保存:
用户刚才问了一个安装命令。
但可以保存:
用户偏好在 WSL2 Ubuntu 环境中学习开源 Agent 项目。
不应该保存:
用户临时让 Agent 修改了一个文件名。
但可以保存:
用户写技术博客时希望每期都包含“问题、机制、总结”三个层次。
这就是 memory 筛选的重要性。
8. 什么信息适合保存?
我认为适合保存到 memory 的信息,通常有四类。
8.1 用户长期偏好
例如:
用户偏好中文回答。
用户喜欢解释问题本质。
用户不喜欢只给结论,不讲原因。
用户写博客时希望内容完整、可直接发布。
这些信息会长期影响回答方式,因此适合保存。
8.2 项目长期背景
例如:
用户正在学习 Hermes Agent,并写成系列学习笔记。
用户当前研究方向包括 AI Agent、CTI、联邦学习和区块链。
用户希望把开源项目学习转化为博客和论文素材。
这些信息可以帮助 Agent 在后续任务中减少重复询问。
8.3 环境和工具习惯
例如:
用户常用 Ubuntu/WSL2 环境学习开源项目。
用户习惯用 CLI 方式运行开发工具。
用户希望命令解释清楚后再执行。
这类信息对工具使用和实践教程很有帮助。
8.4 已确认的稳定事实
例如:
Hermes Agent 学习笔记系列第一期是项目介绍。
第二期是安装配置。
第三期是 CLI/TUI 使用。
第四期是工具调用系统。
第五期是 Memory 系统。
这类信息对连续写作很有价值。
9. 什么信息不适合保存?
不适合保存的内容也很重要。
9.1 临时任务
例如:
用户今天要安装一个包。
用户刚才让我改一个标题。
用户这次希望输出短一点。
除非用户明确表示以后都这样,否则这类信息通常不需要长期保存。
9.2 低价值过程信息
例如:
用户刚才输入了一个拼写错误。
用户刚才让我继续。
用户刚才要求“下一期”。
这些信息属于交互过程,不是长期背景。
9.3 敏感信息
例如:
API Key
密码
Token
银行卡信息
身份证信息
私人地址
这类内容不应该随意进入 memory。即使某些任务中短期需要,也应该避免长期保存。
9.4 不确定信息
例如:
用户可能在做某个项目。
用户好像喜欢某种风格。
如果没有明确依据,就不应该写入 memory。错误记忆会比没有记忆更糟糕,因为它会持续影响后续回答。
10. Memory 与 Skills 的区别
Hermes Agent 还有一个非常重要的能力是 skills。Memory 和 skills 很容易混淆,但它们不是一回事。
可以这样理解:
Memory 保存“事实和偏好”。
Skills 保存“做事方法和流程”。
例如:
用户喜欢博客先讲问题、再讲机制、最后总结。
这是 memory。
而下面这种内容更像 skill:
写 Hermes Agent 学习笔记时:
1. 先说明本期承接上一期;
2. 再提出本期核心问题;
3. 然后解释机制;
4. 中间加入示例;
5. 最后做小结并引出下一期。
这是一个可复用写作流程,更接近 skill。
所以,memory 解决的是“Agent 需要记住什么”,skills 解决的是“Agent 下次应该怎么做”。
这两者结合起来,才构成更完整的长期学习能力。
11. Memory 与上下文压缩的区别
在第三期中,我提到过上下文压缩。它和 memory 也不是一回事。
上下文压缩主要是为了处理当前会话太长的问题。它把当前对话的历史压缩成摘要,让模型后续还能继续当前任务。
Memory 则更强调跨会话长期保存。
可以这样区分:
上下文压缩:服务于当前长对话。
Memory:服务于未来多个会话。
例如,当前会话中已经分析了 Hermes Agent 的 CLI 命令,如果为了继续分析工具系统,可以压缩成当前会话摘要。
但如果“用户正在写 Hermes Agent 学习笔记系列,已经写到第五期”这个事实未来还会用到,就更适合进入 memory。
12. External Memory Providers:扩展长期记忆能力
Hermes Agent 除了内置 MEMORY.md 和 USER.md,还支持外部 memory provider。
内置 memory 更轻量,适合保存精简的长期事实和用户偏好。外部 provider 则可以提供更复杂的长期记忆能力,例如语义搜索、知识图谱、全文检索、云端存储、本地数据库、用户画像和会话级检索等。
这说明 Hermes 的 memory 设计不是只有一种模式,而是可以根据使用场景扩展。
如果只是个人学习和博客写作,内置 memory 通常已经够用。
如果要做长期项目管理、多项目知识库、团队协作或复杂个人助手,就可能需要外部 memory provider。
常见配置命令是:
hermes memory setup
查看当前 memory 状态可以使用:
hermes memory status
关闭外部 memory provider,回到内置 memory,可以使用:
hermes memory off
需要注意的是,外部 memory provider 越强大,越要关注隐私、成本、数据存储位置和检索准确性。
13. Recall Mode:记忆如何被使用
在外部 memory provider 中,一个很重要的问题是:记忆到底怎么进入对话?
大致可以分成三种方式:
自动注入;
工具检索;
混合模式。
13.1 自动注入
自动注入是指系统在每轮对话或某些时机自动把相关记忆放进上下文。
优点是用户不需要主动要求 Agent 回忆。
缺点是可能注入不相关内容,增加上下文负担。
13.2 工具检索
工具检索是指 Agent 需要时主动调用 memory search、recall 等工具。
优点是更可控。
缺点是模型可能忘记调用,或者不知道该查什么。
13.3 混合模式
混合模式就是两者结合。一部分基础上下文自动注入,复杂查询时再让 Agent 调用工具检索。
对大多数长期 Agent 来说,混合模式比较合理。因为用户画像、当前项目这类基础信息适合自动注入;而更细节的历史事实适合按需检索。
14. Memory 的风险:错误记忆比遗忘更危险
Memory 能增强 Agent 的连续性,但它也有风险。
其中最大的风险是错误记忆。
如果 Agent 记错了用户偏好,后续回答就会一直偏离。
如果 Agent 记错了项目事实,后续分析就可能建立在错误基础上。
如果 Agent 保存了过期信息,它可能在未来错误地复用。
如果 Agent 记住了敏感信息,就可能带来隐私风险。
所以,长期 Agent 的 memory 不是越自动越好,而是要有筛选、更新和删除机制。
我认为使用 Hermes Memory 时,至少要遵守以下原则:
重要信息才保存;
不确定信息不保存;
过期信息及时删除;
冲突信息优先替换;
敏感信息避免保存;
记忆内容尽量短而明确。
Memory 的目标不是让 Agent “什么都不忘”,而是让 Agent “记住真正该记住的东西”。
15. 如何在博客写作中使用 Hermes Memory?
结合我当前写 Hermes Agent 学习笔记的场景,memory 可以发挥很大作用。
例如,Hermes 可以记住:
用户正在写 Hermes Agent 学习笔记博客系列。
用户希望博客不是官方文档翻译,而是先讲问题,再讲机制,再讲使用理解。
当前系列已经完成:
01 项目介绍;
02 安装配置;
03 CLI/TUI 使用;
04 工具调用系统;
05 Memory 系统。
这样,当我下次输入“下一期”时,Agent 就不需要重新问我“你在写什么系列”“上一篇写到哪里了”。它应该能自动接上进度,继续写 Skills、Cron、MCP 或源码结构。
这就是 memory 对连续写作的价值。
不过,这里也要注意,memory 只保存系列进度和写作偏好即可,不需要把每一期全文都保存进去。每期全文属于文档内容,不适合塞进短 memory。更合理的做法是保存一个简洁进度摘要。
16. 一个推荐的 Memory 使用流程
对于个人学习 Hermes Agent,我认为可以这样使用 memory:
第一步,先手动确认哪些信息值得保存。
例如:
请记住:我正在写 Hermes Agent 学习笔记博客,风格是中文技术学习笔记,要求先讲问题,再讲机制,最后总结。
第二步,让 Agent 在阶段性任务完成后更新进度。
例如:
请更新记忆:Hermes Agent 学习笔记已经完成第五期,主题是 Memory 系统。
第三步,定期检查 memory 是否过期。
例如:
请检查当前 memory 中有没有过时、重复或不准确的内容。
第四步,发现错误及时替换。
例如:
请把“当前写到第四期”替换为“当前写到第五期”。
第五步,不让临时内容污染 memory。
例如:
这只是本次临时要求,不要写入长期记忆。
这套流程可以让 Agent 既保持连续性,又避免 memory 逐渐失控。
17. 对 Hermes Memory 系统的理解
学完 Hermes Memory 系统后,我对长期 Agent 有了更清晰的理解。
第一,Memory 是长期 Agent 的基础能力。
没有 memory,Agent 每次都从零开始,难以承担长期任务。
第二,Memory 不等于聊天记录。
Memory 应该是从历史交互中提炼出的稳定事实、用户偏好和项目背景。
第三,Memory 需要边界。
记忆太少,Agent 不够连续;记忆太多,Agent 会被噪声污染。
第四,Memory 和 Skills 是互补关系。
Memory 让 Agent 知道“用户是谁、项目是什么、背景是什么”;Skills 让 Agent 知道“遇到某类任务应该怎么做”。
第五,Memory 的安全问题不能忽视。
长期保存的信息会持续影响 Agent 行为,因此必须关注准确性、隐私和过期信息清理。
18. 小结
这一期主要学习了 Hermes Agent 的 Memory 系统。
我的理解是,Hermes Memory 的核心价值不是简单保存聊天记录,而是让 Agent 能够跨会话保留用户偏好、项目背景、环境事实和长期经验。它让 Agent 不再每次从零开始,而是能在长期任务中逐渐理解用户和项目。
Hermes 的内置 memory 主要由 MEMORY.md 和 USER.md 构成。MEMORY.md 更偏任务、项目和环境事实,USER.md 更偏用户画像和沟通偏好。除此之外,Hermes 还支持外部 memory provider,用于更复杂的语义检索、用户建模和长期知识管理。
但 memory 不是越多越好。一个好的长期 Agent,不应该什么都记,而应该知道什么值得记、什么应该忘、什么需要更新、什么不能保存。
下一期,我将继续学习 Hermes Agent 的 Skills 系统,重点分析 skills 和 memory 的区别,以及 Hermes 如何通过 skills 把任务经验沉淀为可复用能力。
更多推荐


所有评论(0)