每次跟 Agent 聊天它都像第一次见到你。你的名字、你的偏好、之前做过的事它全忘了。这是 Agent 最让人抓狂的地方。好消息是 Hermes 有完整的记忆系统,调好了 Agent 可以记住你想让它记住的所有东西。

Agent 的三种记忆

Hermes 的记忆分三层。第一层是短记忆(Memory)。每次会话中 Agent 自动记录的关键事实。退出会话就丢了。适合放临时性信息——比如这周在处理什么项目、刚才提到的 Bug 编号。不用手动管理,Hermes 会自动处理和遗忘。这一层的好处是轻量——不会因为关了一个会话就永久丢失工作进度。我写代码写到一半,问 Agent 上一步我们定义的函数参数是什么,它能从短记忆中准确回忆出来。但一旦关掉窗口重新开,短记忆就清空了。

第二层是持久记忆(Permanent Memory)。存在 ~/.hermes/memories/ 目录下的文件里。跨会话保留。适合放应该长期记住的信息——你的名字、你的工作角色、你用的工具链、代码风格偏好。这是人工管理的,你告诉它记住什么它就记住什么。我踩过的坑是:刚开始把所有东西都往持久记忆里塞,包括 Session ID、临时文件名这些一次性信息。结果记忆文件越滚越大,很快涨到十几 KB,每次对话 Agent 都要读一遍全文,响应速度肉眼可见地变慢。后来我学会只放「过了三个月还有用的信息」——比如工作目录路径、常用框架、编码规范。临时任务信息放短记忆,过两周就自动忘了。

第三层是技能文件(Skills)。存在 ~/.hermes/skills/ 目录下,是结构化的可执行知识。适合放工作流程和操作指南。比如「代码审查流程」、「项目初始化步骤」、「部署检查清单」。技能文件比持久记忆更结构化——它包含完整的执行步骤、工具调用顺序、输出格式模板。我写了个「数据库迁移技能」,每次说「要加个字段」,Agent 自动按步骤:先备份 → 写 ALTER TABLE → 运行测试 → 验证数据完整性。完全不用我手动指挥每一步。

这三层的关系就像人的记忆一样:短记忆是今天吃了什么,长记忆是你做的第一份工作是什么,肌肉记忆是你怎么骑自行车。缺哪层 Agent 的行为都不完整。设置的关键不是一股脑全塞给它,而是按层级分类存放。我刚用 Hermes 的时候把所有东西全塞进持久记忆,结果几周后记忆文件长到十几 KB,每次对话都要读一篇长文,反而拖慢了 Agent 的响应速度。后来做了个分类:工作项目相关的临时信息放短记忆(让 Agent 自动管理),个人信息和偏好放持久记忆(我手动维护),标准工作流程写技能文件(结构化存储)。三个月下来,记忆文件稳定在 2 KB 左右,Agent 输出质量明显提升。

怎么教 Agent 记住你的偏好

假设你想让 Agent 永远记得你习惯 Python 优先、喜欢简洁的风格、不喜欢写文档注释。打开终端运行 memory 命令。选择 target 为 memory。内容写:用户偏好 Python 优先于 JavaScript,回复风格简洁不废话,不需要文档注释。这就写进去了。之后每次跟 Agent 对话它都会读这段记忆。效果立竿见影——之前我每次都要跟 Agent 说请用 Python 写,设好记忆后它默认就选 Python 了,除非我主动说要别的语言。

我让 Agent 记住的东西:工作目录是 ~/projects/;代码默认不写注释;测试用 pytest 框架;回应用户时先给结论再给过程。设好之后省了太多事了。原来每次开新会话都要重复一遍,现在不用了。不过记忆需要定期维护,太旧的信息删掉,太长的截短。我大概一个月整理一次记忆文件,去掉已经过时的项目信息,更新一下最新的工作习惯。否则 Agent 会参考过期的记忆做出错误的判断。

有几个实操技巧。第一,用「memory action=add」逐条写入,不要一次性长篇大论写一整段。逐条写入能让 Agent 更精准地理解每条记忆的语义边界。第二,重要程度不同分开写。工作偏好和工作项目分开,不要混在一起。否则你改了项目后删除旧项目记忆时容易误删偏好设置。第三,写记忆时用「用户」开头而不是「我」。比如「用户喜欢用 Python」而不是「我喜欢用 Python」。这样 Agent 在阅读时能区分记忆中的第三人称事实和当前对话中的第一人称陈述,减少混淆。

技能文件:把经验写成模板

持久记忆还不够——有时候你要的不只是记住一个事实,而是记住一个完整的工作方法。技能文件就管这个。在 ~/.hermes/skills/ 下建一个目录,里面写 SKILL.md 描述你这个技能的用途和执行流程。Hermes 启动时自动加载所有技能,在需要的时候会自动选择合适的技能来用。

我写了个代码审查技能。每次我说审一下这段代码,Agent 自动按技能里的步骤执行。技能的内容精确到每一步做什么、用什么工具、输出什么格式。比如说第一步检查代码有没有语法错误,第二步检查性能问题,第三步检查安全漏洞,最后用固定格式输出审查报告。不用每次都说一遍怎么审,Agent 记得整个流程。技能写多了之后 Agent 工作的质量明显提升,因为每一步都是你设计好的最优流程,而不是让 AI 随机发挥。

技能文件还有一个好处:可以复用。我在好几个项目里都用了同一个「Git 提交规范检查」技能,换项目时直接把技能文件夹复制过去就行。不同项目的 CR 标准不同,但 Git 提交流程是一样的。我还写过「新项目初始化」技能——自动创建目录结构、初始化 Git 仓库、生成 README 模板。每次开新项目只需要说一句「初始化新项目 my-project」,剩下全自动完成。

写技能的时候有几个坑要注意。第一,步骤不能太宽泛。我最初写的代码审查技能只有三步:「检查代码→找问题→输出报告」。太笼统了,Agent 执行时发挥空间太大,每次输出的格式和质量都不一样。后来改成「1. 用 pylint 检查语法和风格 2. 用 bandit 检查安全漏洞 3. 用 pytest 跑单元测试 4. 按 xxx 格式输出报告」。精确到工具和输出格式后,效果稳定多了。第二,技能里要包含反例,也就是「不要做什么」。比如「代码审查时不要修改代码,只输出发现问题」。加了这个限定后,Agent 不会再自作主张帮我把代码改了。

清理记忆比创建记忆更重要

我犯的最大的错不是没设记忆,是设了太多不管它。几个月下来积累了几十条记忆,有些内容互相矛盾。Agent 的回复有时候很奇怪——后来查才发现是因为它同时读了三条相互冲突的记忆。比如一条说用户喜欢用 Python,另一条说用户最近切换到 Rust 了,还有一条说用户讨厌编译型语言。Agent 不知道该听哪个,结果它的输出里面 Python 和 Rust 的内容夹杂在一起。更可怕的是,这些冲突的记忆互相否定,Agent 为了调和矛盾,有时候会输出一些完全不符合逻辑的结论。

解决办法是定期用 memory 命令查看当前存储的记忆列表。删掉过期的、合并重复的、修正自相矛盾的。保持记忆文件在 1-2 KB 以内最理想——够用又不拖慢响应。我每次写完一个项目后都会清理相关记忆,避免多个项目的上下文交叉污染。整理记忆就跟整理办公桌一样——每周花两分钟收拾一下,工作效率高很多。

整理记忆的具体步骤。第一步,memory action=list 列出所有记忆。第二步,一条一条看,问自己「这条记忆三个月后还有用吗」。答案是否的就删掉。第三步,如果两条记忆讲的是同一件事但表述不同,合并成一条。第四步,如果发现哪条记忆过时了——比如你去年用 Vue 今年转 React 了——把那条记忆删了重写,不要修改旧内容。因为修改后的旧记忆可能保留了过时的语义残留。重新写一条新的比修改旧的更干净。我现在每周一上午花 5 分钟做这个维护,效果很好。

💬 你用过哪些AI工具?

以上推荐的 AI 工具和模型,你用过哪些?欢迎到 AI House 排行榜 给你喜欢的模型投一票,看看大家心中的最佳 AI 是哪个。排行榜每天更新,参与投票还能解锁 🏅 创始投票人徽章!