
时间感知记忆:保留历史,同时回答当前事实
2026年7月22日工程

一套用于区分临时工作上下文、持久用户知识与保留原始来源文档的决策框架。
很多智能体团队都从一个看起来无害的词开始:记忆。最近一条消息被叫作记忆,保存下来的用户偏好被叫作记忆,从政策手册里检索出来的一段文字也被叫作记忆。三者都可能进入下一次模型调用,但它们的所有者、寿命、失效方式和删除规则完全不同。
当上下文、持久记忆和来源文档被设计成三个独立系统,只在检索和组装阶段相遇,架构反而更容易解释。这样划分不是为了术语整齐,而是为了答案出错时,团队能确认哪一层才是权威。
向量数据库不会替你决定什么值得长期保存;知识图谱不会替你决定谁有权修正一条事实;更大的上下文窗口也不会告诉你,在删除或重建索引后哪份来源必须继续存在。这些都是生命周期问题,应该先于索引选型被回答。
| 层级 | 典型内容 | 权威来源 | 通常寿命 | 主要失效方式 |
|---|---|---|---|---|
| 工作上下文 | 最近消息、工具输出、计划状态 | 当前请求的组装过程 | 一轮对话或一次工作流 | Token 膨胀、过期任务状态 |
| 持久记忆 | 偏好、约束、决策、纠正 | 带作用域的规范记录与历史 | 直到被纠正、到期或删除 | 所有权错误、召回旧事实 |
| 来源语料 | 手册、政策、合同、长篇证据 | 原始字节或精确来源文本 | 由来源保留策略决定 | 来源链丢失、无法重新提取 |
上下文存在的目的,是让模型完成眼前的请求。它可能包含最近几轮对话、一次工具响应、一段文档摘录和少量记忆。应用应当能解释每项材料为什么被放进去,也应当能在任务结束后把它丢弃。
三个实践可以让上下文保持可控:
长上下文窗口只能推迟这些决定,不能消除它们。旧工具结果可能和新结果冲突,早期硬约束可能被埋没,而大部分保留文字没有帮助时,成本仍会继续上升。
一条记忆应足够精炼,能改变后续决策;也应足够结构化,可以被纠正。最低限度包括内容、结构化作用域、来源、稳定身份、时间字段,以及每次重要变化的不可变历史。
作用域不是装饰。用户偏好属于该用户,智能体运行规则可能属于某个 agent,临时工作结果可能只属于某次 run。已经认证的项目或命名空间是外层安全边界,不应接受请求正文传入的未受信值。
一个实用判断:如果应用说不清一条记录归谁所有、怎样产生、怎样被替代,它就还没有建立持久记忆契约。
当应用已经知道要保存的准确内容时,应直接写入,不要再经过一次模型推理。当需要从对话中提取时,推理应成为可观察的操作,具有明确成功或失败状态。提取失败后悄悄改为保存原始聊天,会创造第二套没有写进产品契约的行为。
员工手册的一段话不是用户偏好,签署过的合同也不是模型推断出来的事实。长来源需要单独语料层,因为它们的权威来自被完整保留。保存原始资产或精确文本,记录校验和与身份,把 Markdown、分块、向量、实体图和摘要都当作可替换投影。
这层分离让系统可以:
把文档中每个有用句子都转成画像记忆看似方便,却会混淆保留期限、访问控制和纠错路径。来源应保持完整,只派生产品确实需要跨任务复用的小记录。
一轮请求的提示词是一份编译产物。一个可落地的组装顺序是:
最终输入对模型而言可能只是一段文本,应用仍应保留边界。纠正记忆不应改写合同;删除文档不应抹掉无关偏好;一次 run 过期,也不应删除长期运行规则。
成本不断增加,早期约束越来越难找到,一次格式错误的工具输出还可能污染之后每一轮。所有数据都没有独立生命周期,系统也无法区分“到期”和“删除”。
存储会充满临时观察、重复内容与没有证据的结论。搜索结果表面相关,却可能召回用户从未同意长期保留的事实。
以后改进解析器和分块器时,只能从已经损失信息的内容开始。所谓引用只剩片段标签,无法回到可检查来源。
摘要和画像有助于渐进披露,但它们可能滞后,也可能重建失败。它们应引用规范记录;刷新失败时保留上一个有效视图,而不是覆盖来源真相。
FishMem 把规范记忆记录与保留来源的文档设计为两个独立产品面。规范记录携带作用域、历史、时间字段与来源;文档版本保留精确来源内容,而检索分块与索引可重建。应用负责决定如何把二者放进模型的工作上下文。
这是架构选择,不代表每个应用都需要三层。短生命周期工具也许只需要上下文;个人助理可能需要上下文和带作用域记忆;客服、研究等智能体通常才需要完整三层。