事实会过期
每条记忆是一行有类型的记录,键是 (主语, 谓语, 宾语),带两条时间轴:事情何时为真,系统何时知道。同一个键出现新值时,旧值的有效期被关闭并标记为 superseded——不是删除,历史仍然可查。
llm-long-term-memory · SQLite + FTS5 · MIT
把对话变成有时间边界的结构化事实:事实变了就让旧的失效,而不是堆在一起;压缩丢掉了细节,就回原始对话里把它捞回来。
下面是一个可点击的演示。人物和对话都是虚构的示例数据,全部内置在这个页面里——它不连接任何服务,也不读取你的任何数据。页面底部是真实基准测试的数字。
演示
三个设计选择
每条记忆是一行有类型的记录,键是 (主语, 谓语, 宾语),带两条时间轴:事情何时为真,系统何时知道。同一个键出现新值时,旧值的有效期被关闭并标记为 superseded——不是删除,历史仍然可查。
抽取会保住大意、丢掉细节。「助手推荐过一台咖啡机」是真的,却答不了「链接是多少」。原始对话存在同一个数据库里并建了 BM25 索引;只有当回答器明确说「需要原文」时才付第二次检索的代价。
检索会同时返回命中的和被排除的,并给出原因:superseded(已经不成立)还是 below_rank(仍然成立,但分数没进前列)。后者才是排序出问题时该盯的那一半。
实测数字
| 方案(LongMemEval-S,dev50) | 准确率 | 上下文中位 token |
|---|---|---|
| 整段对话全塞进上下文 | 56.0% | 109,260 |
| 朴素 RAG:对原始会话做向量检索 | 54.0% | 13,057 |
| 只用结构化记忆 | 56.0% | 1,415 |
| 结构化记忆 + 条件回原文 | 72.0% | 1,455 |