办公Agent的长期记忆设计:记住员工偏好(通知方式、常用模板)

0 阅读11分钟

先讲一个每天早上都会发生的场景。

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_template
  • default_notify_channel
  • default_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加上长期记忆,不需要一步到位做全三层。可以从最简单的地方开始:

  1. 先做显式偏好:让Agent能识别“以后”“每次都”这类关键词,把偏好存进Redis。这是成本最低、见效最快的一步。
  2. 加一个“记住我”命令:用户可以主动说“记住,我喜欢用表格”,触发存储。比自动推断简单可靠。
  3. 做一个遗忘命令:用户说“忘掉我的通知偏好”,清除对应的键。这是建立信任的关键——让用户知道他能控制Agent记住了什么。

等这三个跑顺了,再慢慢加隐式推断、场景化、主动提醒。不要一上来就想做一个“全知全能的记忆系统”——你很可能先把自己搞崩溃。

写在最后:被记住,是一种被尊重的感觉

晓雯后来开玩笑说:“现在这个Agent比我男朋友还记事儿。我随口说一遍它就记住了,还不会忘。”

这其实说出了长期记忆的核心价值:让人感觉到被尊重。每次重复说明一个已经说过的事情,都是一种消耗。而Agent如果能记住,哪怕只是记住“你爱用哪个模板”,都是在替用户节省心力。

一个好的办公Agent,不是因为它能写多长的报告,而是因为它让你少说了多少废话。而少说废话的前提,就是它真的记得你——记得你的偏好,你的习惯,你不想每次都重复的那些小事。

下次当你对你的Agent说“早”的时候,它不只是回你一个“早”,而是把你今天该做的事按你的方式准备好了,你会觉得:“嗯,这家伙,没白养。”