先讲一个每天早上都会发生的场景。
7:55,闹钟响,产品经理晓雯打开飞书,对办公Agent说:“帮我整理一下今天的待办。”
Agent秒回:“好的,今天的待办有:1. 评审需求文档;2. 跟客户同步进度;3. 检查测试报告。”
晓雯皱了皱眉:“我不是说了吗,每天早上先把所有待办发到我的企业微信,不要发飞书消息。我飞书消息太多了,经常漏。”
Agent:“抱歉,请再次告知你的通知偏好。”
晓雯:“发企业微信。”
第二天,同样的话,她又要说一遍。
第三天,她还是得再说一遍。
类似的事情也发生在模板上。每次让Agent生成周报,她都指定一次“用市场部的模板,不要用研发部的”。Agent每次都说“好的”,下一次又忘了。
一个记不住员工偏好的Agent,就像一个每周都要重新认识你的新同事。 你说一次,它做一次;你不说,它就按默认来。你说了,下次还忘。
这不叫智能,这叫复读机。
后来,我们给Agent加上了长期记忆。它现在记得晓雯的通知渠道是企业微信,记得她的周报模板是“市场部V3”,甚至记得她不喜欢在待办列表里看到“已完成”的任务。每天早上,她只说一句“早”,Agent就把所有事情按她的习惯安排好了。
这篇文章,我跟你聊聊怎么给办公Agent设计一个靠谱的长期记忆系统。不堆术语,只说我们怎么做的、踩过哪些坑、最后如何让Agent“记住你”。
一、长期记忆到底要记什么?——三层偏好模型
很多人的第一反应是:把用户跟Agent的所有对话都存下来,不就记住一切了吗?不行。对话数据爆炸式增长,而且大部分信息是一次性的(比如“今天几点开会”),不值得长期保存。
我们给偏好分成了三层,只存“值得记住”的东西。
第一层:显式偏好(用户主动教给Agent的)
这是最直接的。用户明确说:“以后周报用这个模板。”“通知发到企业微信。”“我喜欢表格形式,不要列表。”
Agent收到这类指令时,需要做两件事:
- 立即执行当前任务
- 把这条偏好写入长期记忆,标记为“用户显式设定”,优先级最高
实现上,我们在Agent的prompt里加了一条规则:
当用户说包含“以后”“每次都”“记住”“默认”等关键词的指令时,提取出偏好内容,调用记忆存储API。
第二层:隐式偏好(Agent从行为中推断的)
用户不会什么都主动说。但Agent可以通过观察行为来学习。
比如晓雯每次让Agent生成报告后,都会手动把输出里的“柱状图”改成“折线图”。连续三次之后,Agent主动问:“我注意到你每次都把柱状图换成折线图,是否需要将你的默认图表类型设为折线图?”
用户点“确认”,偏好就存入记忆。
推断逻辑不能太激进。我们的规则是:同一行为出现至少3次,且与默认行为不一致,才触发询问。避免因为一两次偶然就瞎猜。
第三层:场景化偏好(不同情境下的不同偏好)
同一个用户,在不同场景下可能有不同偏好。
- 工作时间内,通知发飞书;非工作时间,发短信。
- 周报用模板A,月报用模板B。
- 紧急任务用红色标记,常规任务用蓝色。
长期记忆需要支持条件存储。存储时带上上下文标签,比如{场景: "工作时间", 通知渠道: "飞书"},{场景: "非工作时间", 通知渠道: "短信"}。
检索时,Agent先匹配当前场景(时间、任务类型、所在项目等),再取对应的偏好。
二、记忆怎么存?——混合存储方案
我们试过纯向量数据库、纯关系数据库、纯键值存储,最后选了混合方案。不同类型的信息,用不同的存储引擎。
| 记忆类型 | 存储方式 | 例子 |
|---|---|---|
| 显式偏好(结构化) | 键值存储(Redis) | user:123:notify_channel = wecom |
| 隐式偏好(待确认) | 关系表(PostgreSQL) | 记录行为频次,用于触发询问 |
| 长期对话事实(非结构化) | 向量数据库(Qdrant) | “用户提到过他的老板是张总” |
| 场景化偏好 | JSON + 条件索引 | { user: 123, scene: "weekly_report", template: "market_v3" } |
为什么不全放向量库?因为显式偏好的查询模式非常简单(“用户X的通知渠道是什么?”),用键值存储又快又准,不需要向量检索的开销。只有那些模糊的、需要语义匹配的记忆(比如“用户上次抱怨过什么”),才放向量库。
三、记忆怎么更新和遗忘?——不永久记住一切
长期记忆不是“记到死”。有些偏好会过时,有些记忆会错,所以必须有更新和遗忘机制。
更新:覆盖 vs 追加
当用户说“以后通知改发企业微信”时,是覆盖原来的“飞书”偏好,还是同时保留两个?显然应该覆盖。但覆盖需要谨慎:我们要求用户在覆盖前确认一次。
“你的通知偏好当前为‘飞书’,确认改为‘企业微信’吗?”
如果是追加(比如增加一个新的偏好维度),则不需要确认。
遗忘:时间衰减 + 主动删除
- 时间衰减:超过90天未使用的偏好,自动降级为“低置信度”。Agent下次使用时,会再次询问用户确认,而不是直接应用。如果用户再次确认,则刷新有效期。
- 主动删除:用户可以对Agent说“忘掉我之前的通知偏好”,或者通过管理界面手动删除。我们设计了一条指令:“清除所有关于我的偏好。”——这比在设置里翻半天要友好得多。
另外,有些记忆涉及敏感信息(比如“用户说过他的银行卡号”),我们设计为短期存储,24小时后自动清除,不入库长期记忆。这需要在提取记忆时做一次敏感信息检测。
四、检索与应用的时机:什么时候该用记忆?
光有存储不够,关键是Agent要在正确的时机主动应用记忆,而不是每次都要用户触发。
我们定义了三个应用层次:
1. 任务执行前:自动填充参数
用户说“帮我生成周报”,Agent自动从记忆中读取:
default_week_report_templatedefault_notify_channeldefault_recipients
然后问:“将使用你常用的市场部模板,发送到企业微信,是否继续?”用户点“是”,一步到位。
2. 任务执行中:动态调整行为
用户让Agent“把这个任务分配给李雷”,Agent检索记忆发现:李雷平时不喜欢被@,更偏好被直接指派到任务系统。于是Agent不用@,而是创建飞书任务并私信通知。
3. 主动建议:记忆驱动的提醒
Agent检测到晓雯每次周五下午都会生成周报,但今天是周四下午,她还没做。Agent主动问:“按你往常的习惯,周报通常会在今天生成。是否需要现在开始?”
这种主动提醒,依赖的是对用户行为模式的长期记忆(每周五下午3点左右触发周报生成)。我们用一个简单的时序模式识别:记录用户每个任务的历史执行时间(周几+几点),当当前时间接近历史分布的中位数时,触发提醒。
五、隐私和安全:记住偏好不等于窥探隐私
长期记忆最容易引发隐私担忧。用户会想:“Agent记住了我那么多事,会不会被别人看到?”
三个设计原则:
1. 记忆归属用户
所有偏好数据,以user_id为分区存储。不同用户之间完全隔离。即使管理员也无法查看某个用户的个人偏好(只能看到“有多少用户设置了通知偏好”这种聚合统计)。
2. 透明与可审计
用户可以随时问Agent:“你记住了我的哪些偏好?”Agent会列出所有存储的记忆条目,并且每条都附上“添加时间”和“添加方式”(用户主动教/Agent推测/场景化)。用户可以逐条删除或修改。
3. 敏感信息不存储
Agent在提取“值得记忆的内容”时,会先过一个敏感词过滤器。包含身份证号、银行卡号、密码、手机号等个人信息的内容,即使符合“偏好”特征,也不会写入长期记忆。用户说“我的手机号是138xxxx”,Agent会回复:“我不会记住你的手机号,请放心。”
六、一个完整的长期记忆交互示例
把上面的设计串起来,看看一个“被记住”的用户体验长什么样。
第一天(初始状态,Agent对晓雯一无所知):
晓雯:帮我生成周报。
Agent:好的。请问使用哪个模板?(默认/市场部/研发部)
晓雯:市场部。发送到企业微信。
Agent:已将周报使用市场部模板,发送至你的企业微信。是否需要我记住这个偏好?
晓雯:记住。
Agent:已记住。以后你说“生成周报”将默认使用市场部模板,并发送到企业微信。
第二天(Agent应用记忆):
晓雯:生成周报。
Agent:好的。将使用市场部模板,发送到你的企业微信。是否继续?
晓雯:继续。
(周报生成,发送)
一周后(晓雯发现她偶尔也需要研发部模板):
晓雯:生成周报,用研发部模板。
Agent:本次使用研发部模板。是否需要将默认模板改为研发部?
晓雯:不用,只是偶尔用。
Agent:明白了。以后你说“生成周报”仍默认市场部模板;当你说“生成研发周报”时,将自动使用研发部模板。
一个月后(晓雯换部门了):
晓雯:以后周报改用运营部模板。
Agent:确认将默认模板从“市场部”改为“运营部”吗?
晓雯:确认。
Agent:已更新。旧的偏好已归档(保留但不使用,如需恢复请告知)。
晓雯的体验从“每次都重复说”,变成了“Agent懂我”。而她从来没有看过一行代码,也没点过复杂的设置界面。
七、你也能做的三个起步建议
如果你也想给自己的办公Agent加上长期记忆,不需要一步到位做全三层。可以从最简单的地方开始:
- 先做显式偏好:让Agent能识别“以后”“每次都”这类关键词,把偏好存进Redis。这是成本最低、见效最快的一步。
- 加一个“记住我”命令:用户可以主动说“记住,我喜欢用表格”,触发存储。比自动推断简单可靠。
- 做一个遗忘命令:用户说“忘掉我的通知偏好”,清除对应的键。这是建立信任的关键——让用户知道他能控制Agent记住了什么。
等这三个跑顺了,再慢慢加隐式推断、场景化、主动提醒。不要一上来就想做一个“全知全能的记忆系统”——你很可能先把自己搞崩溃。
写在最后:被记住,是一种被尊重的感觉
晓雯后来开玩笑说:“现在这个Agent比我男朋友还记事儿。我随口说一遍它就记住了,还不会忘。”
这其实说出了长期记忆的核心价值:让人感觉到被尊重。每次重复说明一个已经说过的事情,都是一种消耗。而Agent如果能记住,哪怕只是记住“你爱用哪个模板”,都是在替用户节省心力。
一个好的办公Agent,不是因为它能写多长的报告,而是因为它让你少说了多少废话。而少说废话的前提,就是它真的记得你——记得你的偏好,你的习惯,你不想每次都重复的那些小事。
下次当你对你的Agent说“早”的时候,它不只是回你一个“早”,而是把你今天该做的事按你的方式准备好了,你会觉得:“嗯,这家伙,没白养。”