6. 记忆

记忆是让智能体不那么像搜索框、而更像一位同事的关键。聊上几次之后,它应该知道你叫什么、你的偏好、你在做的项目,以及你常提起的那些人。本章会讲清楚:它记住什么、它如何决定要不要记住,以及当存错或不再需要时,你该怎么纠正或清理。


6.1 三个层级

OpenHermit 把记忆分成三层,作用域由小到大:

会话历史。 一次对话里的每条消息。绑定在那个会话上;一旦你开新会话,智能体的滚动条历史就是空的。它对单次聊天里的来回非常有用。

工作记忆。 智能体在单个会话内部保留的短期备忘 —— “用户偏好 markdown 表格”、“我们正在排查认证流程”。会话结束就会清掉。你很少需要直接和工作记忆打交道,智能体会自己管理。

长期记忆。 持久化条目,带 key、内容与标签,存在数据库里,在那个智能体的所有会话间可检索。这一层是智能体连续性的来源。当人们说”智能体记住了我的地址”,指的就是这里。


6.2 智能体如何决定要记住什么

智能体有一组工具用来添加、检索、列出、更新和删除长期记忆条目。它会随对话推进自行使用这些工具:

  • 你说了一句它判断值得保留的话(“我吃素”、“我们的预发 URL 是 ……”) → 它新增一条。
  • 你的问题触及它做过笔记的话题 → 它去检索。
  • 你之前说过的某件事其实是错的 → 它去更新。
  • 你明确要它忘记 → 它去删除。

你不需要用任何特殊语法,大白话就行:

  • “记一下,我在柏林。”
  • “忘掉我说的周五会议那事。”
  • “你还记得迁移项目的哪些事?”

智能体倾向于多记而不是少记,所以日常的整理动作通常是”删掉你不想要的”,而不是”确保它都记下了”。


6.3 记忆按智能体划分,而不是按用户

长期记忆挂在智能体身上,不是挂在跟它说话的人身上。两个人共用一个智能体,就共用同一份记忆库。智能体的确会注意是谁在说话(并把上下文打到条目的标签里),但它记住 Alice 的事和记住 Bob 的事,放在同一个池子里。

如果你需要用户私有的记忆,就为每个人各跑一个智能体。代价很小(共用同一个实例,只是 agent ID 不同),隔离则是彻底的。


6.4 查看记忆

想看智能体保留了什么,直接问它:

  • “列出你记住的关于我的事。”
  • “你有哪些打了 project-x 标签的记忆?”
  • “把最近的 10 条记忆条目给我看看。”

它会调用 memory_listmemory_recall,然后把结果打出来。

Web 管理界面:记忆库的管理视图在路线图上;在它落地之前,智能体自己就是你最好的查看工具 —— 它有读取全部记忆的权限。


6.5 角色差异

角色读记忆写记忆
Owner
User
Guest

Guest 不能读写长期记忆,记忆工具对他们隐藏。这是有意为之 —— 自动创建 guest 的公开智能体,不应该让陌生人往共享记忆里写东西。


6.6 How-to 配方

6.6.1 教智能体一条长期偏好

场景 —— 你想让智能体在所有回答中都用公制单位。

做法

直接说:

记住,我所有回答都偏好公制单位,如果资料是英制的,顺便也转成公制。

智能体确认并存下。后续的会话会自动用上。

验证 —— 开一个全新会话,问一个自然会涉及单位的问题(例如”柏林到慕尼黑多远?”)。智能体应该不需要提示就用 km 作答。

常见问题 —— 如果这件事你想作为规则强制执行(不希望模型偶尔忘记),请改用指令(第 7 章)。记忆是软提示,指令才是强制。


6.6.2 纠正一条错误记忆

场景 —— 智能体存了”用户对花生过敏”,但其实你只是有点轻微敏感,远没到严重过敏。

做法

告诉它:

更新一下你的记忆:我是对花生轻微敏感,不是严重过敏。

它会对对应条目调用 memory_update。如果有多条匹配,它会选最新的或者反过来问你。

验证 —— “你还记得我对什么过敏吗?” —— 智能体应该给出更正后的版本。


6.6.3 让智能体忘掉某件事

场景 —— 你拿假数据测试过智能体,现在想把那些测试条目清掉。

做法

把所有打了 test 标签的记忆条目删掉。

或者:

忘掉我上周说的那些旅行计划。

智能体会删除匹配的条目。

验证 —— “你知道我的旅行计划吗?” —— 应该是空的。


6.6.4 把记忆从一个智能体迁移到另一个

场景 —— 你之前用的是 personal,现在想用 personal-v2 重新开始,但希望把整理过的一组偏好带过去。

做法

目前还没有一键导出。两条实用路径:

  • 让 A 智能体自我汇总。personal 说:“把你所有记忆条目用 markdown 项目列表给我。“复制下来,在 personal-v2 中开会话并说”这些是我的偏好,把它们每条都存进记忆。“慢,但精确。
  • 直接复制数据库。 如果你同时是 OpenHermit 实例的运维者,可以把 memories 表里的行从旧的 agent_id 复制到新的。这属于运维侧,不属于用户侧。

验证 —— 问 personal-v2 一个被迁移过去的偏好覆盖的问题。


6.7 FAQ

智能体会记住我说的每一句话吗? 不会。它会判断哪些消息含有可持久化的事实,哪些只是聊天。如果某件你在意的事没存下来,直接说”请记住 ……”即可。

我能一次看到所有记忆吗? 可以 —— 让智能体列出来。单次列表没有硬上限,长结果智能体会分页给你。

如果我删掉一个会话,它的记忆也会跟着没吗? 会话历史会随会话一起没。但智能体从那个会话里提炼出来、写进长期记忆的条目会留下 —— 它们当初就被提升到了长期库,删会话不会回溯把它们清掉。

我能彻底禁用记忆吗? 可以,在策略里关掉记忆工具即可(见 第 15 章)。届时智能体就只剩会话历史。

记忆会吃 token 吗? 记忆条目不会自动注入到每个 prompt 里。智能体按需通过 memory_recall 拉相关条目。所以再大的记忆库也不会让 token 使用量暴涨。


6.8 指引