Previously 博客
时间是否是 AI 记忆缺失的维度?
也许 agent 可以把情景记忆锚定在时间上,从而一直记得——为什么时间线胜过对话线程,切片胜过摘要。
对话线程装不下的东西
过去一年多的时间里,我一直在做上下文和记忆相关的工作——主要是在应用层,基于模型提供的能力往上搭。从某个角度看,对话线程(thread)这个范式非常合理:它提供了一种干净的上下文管理方式,乱了可以清空,可以压缩,可以复制。对开发者来说,这是一个直白的抽象。
但后来我变成了一个重度用户。不只是让它写写代码片段——我用 agent 来梳理人生决策、分析个人处境、推演横跨数月的不确定事件。那些关于工作、关于家庭、关于我思考多年的爱好的对话线程,漫长而曲折。裂痕就是从这里开始出现的。
你一定经历过那个时刻。你在同一个线程里讨论一件事已经好几周了——一个项目、一段关系、一个你一直在琢磨的个人话题。这个线程有深度,有历史。然后有一天,它告诉你上下文满了。或者更糟——它什么都不说,只是开始犯糊涂。事实开始漂移,名字开始模糊,你上周纠正过三次的东西又错了。
于是你做了那个合情合理的操作:让它仔细压缩你们讨论过的一切,把摘要粘贴到一个新线程里,然后祈祷好运。它多少能撑几个回合——但有些东西在压缩中丢失了。agent 忘记了它本该记住的事,搞混了谁说了什么、事情发生在什么时候、哪个事件在前哪个在后。某些人物之间的关系缠成了一团,某些结果被套到了错误的原因上。
而且这不只是单个线程撞到上限的问题。还有一个更安静、更常见的版本:假设我在一个线程里讨论一个个人决策已经好几天了,现在我想在另一个线程里提起它——也许是另一个 agent,也许只是一个新的上下文。我做不到。大多数 agent 没有办法跨线程读取。所以我只能停下来,让当前的 agent 总结所有相关内容,复制摘要,粘贴到另一个线程里,然后祈祷上下文能接得上。两个线程,手动搭桥,每一次都是如此。
真正让我难受的是:纠正它根本没有用。我提醒它——"不对,那件事发生在三月,不是一月"——接下来的三个回合它能答对,然后又开始漂移。线程已经被污染了,再怎么打补丁也洗不干净。
某个时刻,我停止了排错,开始好奇。如果我把这一切讲给一个人听——同样的讨论、同样的细节、同样的历史——他是会记住的。不完美,不是逐字逐句,但他会知道大概的轮廓:那些人、那条时间线、那些利害。我自己也会记得。
那为什么 agent 不能?
或者问得更精确一点:线程装载上下文的方式,和真实的心智——人类的也好,其他的也好——装载记忆的方式,差别到底在哪里?我们缺失的是什么?
我们真正记忆的方式
1972 年,心理学家 Endel Tulving 提出了一个区分,直到今天它依然能切开 AI 领域大多数挂着"记忆"名号的东西。他称之为情景记忆(episodic memory)与语义记忆(semantic memory)。
语义记忆是事实。巴黎是法国的首都,水在 0 摄氏度结冰。这正是 LLM 惊人擅长的东西——它们吞下了整个互联网的语义记忆。
情景记忆是你人生的记忆。你昨天进行的那场对话,它给人的感觉,它之前发生了什么、之后又发生了什么。它不是一次数据库查询——而是一次重构。当你回忆起某件事时,你的大脑并不是在回放一段录像,而是借助线索——时间、地点、情绪、顺序——从碎片中把那个场景重新搭建出来。
如果你大致盘点一下今天可用的记忆与上下文管理方案——RAG 管线、向量数据库、结构化知识库——在我看来,它们本质上都是语义记忆系统。它们被设计用来精确记录干净、边界清晰的事实。你告诉 agent 你在某一天开始了新工作,你告诉它你最喜欢的水果、你偏好穿的衣服类型。它做得很好:这些系统把每条事实包进一个可检索的信封,建好索引,在查询匹配时递还给你。RAG 和向量检索已经在生产环境中久经考验——它们有效、被充分理解,并且背后有不断增长的研究支持。我不是要反对它们。
但它们从来没让我觉得足够。原因如下。
假设我花两轮对话——也许一百来个字——描述我午饭吃了什么。我谈到那家餐厅,谈到和我一起吃饭的人,谈到那道菜让我想起多年前旅行过的某个地方。一个搭载语义记忆系统的 agent 可能会尽职尽责地记下:"用户吃了午饭,在餐厅吃的。"技术上没错。但它把那个时刻值得记住的一切全部扔掉了:语气、质感、那顿午饭和一段旅行记忆之间的联想线索——全没了。对一个语义系统来说,这些细节看起来是噪声。如果你的目标是建一个干净的知识库,也许它们确实是噪声。但如果你的目标是让 agent 理解你——让它的回应更接近共情,而不是数据库检索——那么这些"噪声"细节恰恰是全部的意义所在。没有它们,agent 的回复就会偏向理性,并且在某些情况下自信地犯错,因为它缺失了那个能告诉它"事实并非如此"的上下文。
情景记忆就是在这里登场的。想想你参加过的一次重要会议。后来有人提起它时,你脑海里浮现的是什么?你大概率想不起一份整齐的会议纪要。你记得的是那个房间,桌子对面那个人的坐姿,讨论的走向——从哪里开始、在哪里卡住、最终在哪里转向。你也许能想起结论的片段,但想不起确切的措辞。你回忆起的是一个场景。而如果你需要更多——那个具体数字、那句确切的承诺——你可以在脑海中重新走进那个场景,把它重构出来。场景是检索的钥匙,细节随之而来。
我想,这才是我们大多数人在大多数时候真正使用的那种记忆。不是对个人数据库的一次语义查询,而是一个场景、一个情景——锚定在某个时刻上,随身携带那个时刻的质感。
而如果记忆本质上是情景式的——如果它的基本单位是场景而不是条目——那么下一个问题就自然浮现了:是什么在组织这些场景?它们挂在哪根脊柱上?
时间。每一个情景都带有一个时间戳。它不需要精确——"去年春天的某个时候"常常已经足够——但它几乎从不会缺席。当你搜索自己的记忆时,你问的第一个问题通常是"什么时候"。"我们那次聊这件事是什么时候?"从"什么时候",你导航到"在哪里"和"是什么"。时间不是事后附加的元数据字段,时间正是记忆早已沿其铺展开来的那根轴。
我想在这里停下来,把话说得谨慎一些:我并不是声称语义记忆无关紧要。它显然是我们思考方式的一部分。但它也许不是我们应该围绕着搭建 agent 整个记忆架构的那一部分。我想指向的东西更简单,也更令人不安:也许 agent 记住你的最自然方式,不是一堆抽取出的事实,而是一条连续的情景时间线——一个个场景,由时间串起,每一个都携带足够的质感,让 agent 能从中重构出它需要知道的东西。
有一个比喻最终让我想通了这一切。电视剧从不指望你记得前几季的每个细节,它以前情提要开场。"Previously on……"三秒钟,几个场景,足够让接下来的一个小时连贯起来。它不会试图把整部剧压缩进一个向量,它只是给你看上集发生了什么。而它确实有效——每周如此,对千百万人如此。
如果 AI 的记忆也是这样工作的呢?
你的「前情提要」(Previously on You)
想想一本教科书。如果你把一本生物课本的章节按时间重排——周一:第一章,周二:第二章,周三:第三章——你只会把这本书弄得更糟。章节是围绕概念组织的,而不是围绕日期。按照"恰好哪天读到"来切分,完全错过了材料本身结构的要点。
但你的生活不是教科书。你生活中的事件本来就是按时间组织好的。你参加的那场会议、之后的那次谈话、午饭时你在手机上读到的那个东西——它们是沿着同一根轴依次发生的。你并不是把它们作为一组语义类别来体验的,归档到"工作""感情""爱好"之下。你体验到的是一条流。时间就是那根脊柱。
所以想法是这样的:不再从每段对话中抽取实体——把这个人和那个项目关联、把这个决定和那个结果关联——而是把每个情景原样按序存下来,让时间线去做索引,会怎样?你放弃构建那张精细的语义地图,作为回报,你得到一个维护成本几乎为零的东西。你不需要分类、重新分类、重新索引任何东西。情景进入时间线,时间线不会改变。发生过的事,就是发生了。唯一的工作是回忆。
而回忆出人意料地直接。假设你想找回几天前一场会议的细节。在语义系统里,agent 必须先弄清楚你说的是哪场会议——跟实体名称、项目标签、话题聚类逐一匹配——然后才能开始回忆。而在时间线上,你只要说"几天前"。agent 沿着轴往回走,找到大致的窗口,回忆落在那里的一切。先粗扫,再深读。你不需要 agent 在开始回忆之前就知道它到底要回忆什么。
这指向了记忆系统到底在做什么的一次更深层转变。在语义路线里,功夫都下在存储上:你抽取实体、归类关系、把场景拆成结构化的事实、为检索重建索引。这些步骤里的每一步都有丢失东西的风险——一个时刻的质感被压成概率分布,一段对话被拍平成一组打了标签的话题。但一个情景切片本身就是完整的。你不需要为了存储而把它拆开。唯一的难题是回忆——在你需要的时候找到正确的切片。其他的一切,不过是保管好那个文件。
一个围绕情景和时间线构建的记忆系统,问的是一个和围绕实体与 embedding 构建的系统根本不同的问题。语义系统问的是:我能抽取出什么?情景系统问的是:我怎么找到回去的路?
这也改变了"上下文"的含义。在线程系统里,上下文是你要随身携带的东西——小心压缩,粘贴进新窗口,提防溢出和污染。而在时间线系统里,上下文是你走进去的地方。每段对话开始时,先让 agent 自己找到立足点:沿时间线往回走,回忆相关的情景,读它们。上下文在每一次请求时被动态组装,永远不会完全相同,因为它是从你此刻站立的位置重建出来的。
这是一种 agentic 的记忆方式。你不是在要求模型把所有东西装进它的上下文窗口,而是在要求它去导航。走那条时间线,回忆重要的东西,带着你需要的回来。
这一切都不需要一种新的数据库。它只需要对一个问题给出不同的回答:记忆的基本单位是什么,它应该如何被组织?
而这就是名字的由来。如果记忆是一条情景的时间线——一个个场景,由时间串起,靠行走而非搜索抵达——那么和 agent 的每段对话,都应该像一部电视剧在中断后复播那样开始:一段前情提要,上次的几个场景,刚好够你知道自己身在何处。Previously on you。这就是那个想法,剩下的都是实现。
切片与 Strand
一旦你接受了前提,实现几乎是一目了然的。我把它做成了一个叫 Previously 的开源项目——GitHub 仓库在这里,线上 demo 在 previously-demo.ldwid.com。
没有线程。 在时间线设计下,你其实根本不需要"对话"这个概念。只有一条连续的时间线,回忆沿着这根轴动态发生——时间线本身就是唯一的组织结构。你不需要把对话隔离进线程,因为这根轴已经给了你线程本该提供的一切:按时间分隔。
切片(Slices)。 一个切片就是一个情景——一小段连续的对话。在目前的实现里,一个切片就是一个 Markdown 文件,存放在 memory/episodic/slices/YYYY/MM/DD/HHMM.md,时间戳就是第一条消息。三十分钟的沉默会自动关闭这个切片。这就是全部逻辑:由时间来下刀。我并不声称这是定义切片边界的最优方式——也许有更优雅的触发条件,我预期它会继续演化。但原则是成立的:情景由时间界定,而不是由话题界定。
Strand。 如果所有东西都活在一条时间线上,你怎么找到跨越数周数月、关于同一件事的那些对话?你可以手动走时间线,但那是不可扩展的。一个 Strand 就是一层薄薄的交叉引用——从每个切片中抽取的关键词和概念标签,存放在一个 JSON 文件里,把每个标签映射到携带它的那些切片上。想象一个你讨论了半年的项目:可能有十个切片,散布在六个月里,各自从不同的角度触及这个项目。这十个切片构成一个 Strand。当模型检测到你又在讨论这个项目时,它可以从 Strand 出发——一条预先算好的穿越时间线的路径——而不是盲目地扫描。Strand 只是索引引用,仅此而已。它们指向切片,但不复制切片、不压缩切片、不把切片变成抽象表示。时间线依然是唯一的真相来源。
有一个我还在思考的开放问题:Strand 最终能否完全取代语义记忆?一张足够丰富的、横跨时间线的交叉引用之网,能否让一个独立的语义存储变得不再必要?我还不知道。但值得指出的是,语义记忆和这套架构并不冲突。你随时可以叠加一个专门的语义层——知识图谱、向量索引、结构化事实存储——架在切片与 Strand 之上,不会破坏任何东西。重活由时间线干,其余的都是锦上添花。
GitHub 上的 Markdown。 每个切片都是一个带 YAML frontmatter 的 Markdown 文件。用 Markdown,因为它人类可读、与模型无关,而且几十年后大概率依然可读。用 GitHub,因为它免费给你版本控制、访问控制和可恢复性。如果一段记忆被意外覆盖或删除,你可以回滚它。你的上下文——任何 agent 系统里最宝贵的资产——留在你自己的仓库里,由你自己掌控。关于 Git 分支还有一个让我很感兴趣的可能性,我还没想清楚怎么把它用好。分支是 Git 最强大的思想之一,我直觉那里有东西,还在继续探索。
两阶段回忆。 一段对话开始时,一次快速而浅层的扫描会过一遍最近的切片摘要。这更像条件反射而不是搜索:宽泛、低成本、允许不完美——相当于沿着时间线回头瞥一眼,看看有什么东西跳出来。如果它找到了什么,第二阶段随即开始:一次更深的、带工具调用的读取,读出匹配切片的完整内容,沿着 Strand 走,重构出足以开始这段对话的上下文。两个阶段是耦合的——先广度,后深度——它们不是两套独立系统,而是同一次回忆过程的两个时刻。一个说"看这里",另一个说"现在,读这个"。
Serverless。 我希望这个 agent 是你打开一个浏览器标签页就能触达的东西——不装客户端,不要后台守护进程,除非你自己想要,否则没有任何本地搭建。整个运行时活在一个 Vercel 请求生命周期里:请求进来 → 从 GitHub 读 → 调 LLM → 写回 → 结束。把 GitHub 作为存储层让这一切变得自然:仓库永远可达、永远同步,你永远不需要去想你的记忆到底存在哪里。对于偏好本地部署的人,同样的 Markdown 文件在本地文件系统上一样工作良好——没有网络依赖,没有外部服务。
时间作脊柱,情景作内容,Strand 作索引。这就是全部。
我并不孤单
先说清楚:在开始这项工作之前,我并没有密切关注研究界在 2026 年上半年做了什么。我没有跟进关于 agent 记忆或时间索引的最新论文。我只是从工程、产品和生意的角度感觉——有什么地方不对劲。一个要求用户不停开新聊天、手动压缩旧聊天、机械背诵关于自己的零散事实的 agent 产品,在体验层面上就是一个糟糕的设计。我开始勾勒一个不同的架构,是因为现有的那个让我沮丧,而不是因为我有什么理论要证明。
所以几个月后,当我发现 2026 年已经产出了一批围绕同样想法的工作时,我是真心惊讶的。
在核心问题上——时间是否应该取代语义相似度,成为记忆的主要组织维度?——几篇论文落在了大致相同的位置。TiMem(Findings of ACL 2026)把时间连续性当作一等设计原则,构建了一棵 Temporal Memory Tree,让对话历史沿时间轴而不是话题地图来组织。MemForest(2026 年 5 月)用 MemTree 做时间索引的层次化方案,在 LongMemEval-S 上达到 79.8% 的准确率,吞吐量比此前的方法提升 6 倍——整套架构建立在一个洞见之上:按时间组织,比按语义相似度组织,让更新更简单、更可预期。Cortex(2026 年 4 月)可能是已发表的系统里和我做的东西最接近的——Markdown 原子、按时间分层为热/温/冷三层、零 embedding、已在生产环境部署。
在一个相关但不同的问题上——我们说的到底是哪一种时间?——Temporal Semantic Memory(Findings of ACL 2026)画出了一条我一直在绕着走、却从没清晰表述出来的线:对话时间(dialogue time)与发生时间(occurrence time)。你讨论一件事的那个时刻,和这件事发生的那个时刻,并不是同一个时刻,而记忆系统应该知道这个差别。
但趋同本身是有含义的。当多条相互独立的路径——有的来自学术实验室,有的来自一个烦透了又要打开一个空白聊天窗口的人——抵达了同一个反直觉的方向,这就值得关注。也许这个结论根本不反直觉。也许它就是显而易见的,只是我们所有人都想多了。
让我们找到答案
我不知道这是不是正确的方法。Cortex、TiMem 和其他任何一个系统背后的研究者们也不知道。我们都在探索同一个问题:对 AI 来说,"记得"到底意味着什么?
诚实的答案是:在更多人尝试之前,我们不会知道。更多人在它之上构建,更多人把它拆开、找到它断裂的地方。
我在 X 上是 @likedreamwalker,项目还有一个 GitHub discussion 区。每一条我都会读。
问题不是 AI 能不能记忆——以它自己的方式,它已经能了。问题是它能不能记住你——不是你的数据,不是你的 embedding,而是你的生活在时间中展开的那个形状。
也许时间就是我们一直缺失的那个维度。让我们找到答案。
原文发布于 dev.to。