为什么是 Previously
Previously 从根本上重新思考 AI 交互:修复记忆模型,交互模型便会自行修复。
两个问题,同一个根源
当前 AI 助手存在一对相互关联的缺陷,大多数人将其体验为同一种挫败感。
问题 1:记忆被束缚在单次对话中。 每一次新聊天都从零开始。Agent 看不到你昨天、上周,或在另一个相关话题的线程中讨论过什么。跨对话回忆需要拼接向量数据库、RAG 流水线和提示词工程——即便如此,结果仍像在跟一个失忆症患者交谈。
问题 2:对话列表是错误的心智容器。 人类不会把记忆整理成"跟妈妈的第 47 次聊天"。你是根据事情发生的时间和内容来记忆的。扁平化的聊天线程列表是消息应用遗留下来的 UI 产物,而不是人类实际思考和回忆方式的模型。
这两个问题是同一个错误的两面:围绕对话 UI 而非围绕记忆来构建产品。
记忆模型修复交互模型
如果一个 agent 真正记住了你——跨越时间、跨越话题、跨越数天或数周的间隔——那么对话管理就变得不再必要。你不需要选择或创建正确的线程,不需要提醒 agent 你是谁、你在做什么。你只需要出现,然后对话。
Previously 用时间线取代了聊天线程列表:一个从上到下的垂直时间切片视图。每个切片是一段不间断的对话片段——你开始说话时打开,一段沉默之后自动关闭。路径精确告诉你它发生在何时:
memory/episodic/slices/YYYY/MM/DD/HHMM/
├── previously.md ← 那一刻的用户卡片
└── timeline/
├── core.md ← 对话本身
└── agent.md ← agent 当时的思考
没有需要命名、整理或搜索的对话——只有一段持续不断的关系,向上滚动回顾过去,向下滚动继续。
每次请求的上下文都保持有界,因为提示是从时间线上相关切片中组装而成,而不是来自不断增长的对话窗口。Agent 不会忘记长历史的开头,因为开头从未被塞进窗口里——只有那些重要的片段,每次都被重新组装。
对话是 UI 产物。时间线是认知模型。
"Previously"这个名字来自电视:"Previously on..."(上一集回顾)——简要回顾上次的内容,刚好够你从停下的地方继续。
设计原则
记忆是真正的难题
存储对话是微不足道的。在正确的时刻以正确的深度检索到正确的记忆,才是真正的难点——而这正是投入精力的地方。架构体现了这一优先级:回忆不是一次数据库查询,而是一位专门的同事。自 v1.0 起,回忆由一个回忆子 agent 完成——它跑在你选的主模型上(以低 effort 思考),像一位当时在场的同事一样亲自探索记忆:先看时间线目录定位何时,再顺着 strand 找到什么,最后深读少量切片全文,然后用自然语言作答,每个结论都锚定一条原文引用({slice_id, quote, note})。「我们不记得聊过这个」是合法答案。主 agent 不亲自翻记忆——它只保留一条核对通道 readSlice,用来抽查回忆同事给出的引用是否属实。
记忆本身也不再是静态的:达尔文式自进化回路——一份带可证伪假说的用户画像、证据锚定的 fitness 评分、确定性的世代触发机制——让 agent 的行为跨切片持续改进。复杂度预算投入到核心的"存储-索引-回忆"循环中,而不是配置旋钮或边缘情况。
简洁胜于复杂
切片规则只有一条,而不是三条。每一个可配置的旋钮、每一个边界情况处理器、每一个存储的标志,都是对未来推理征收的税。Previously 只在核心循环中——在真正产生价值的地方——才支付这笔税。早期版本中更复杂的连续性启发式规则已被移除,而非被调校。
人类记忆是正确的隐喻
架构直接映射到认知科学。Endel Tulving 在 1972 年提出的情景记忆(与时间和地点绑定的事件)和语义记忆(抽象知识、事实、概念)的区分是蓝图:
- 切片是情景性的——"发生了什么",按时间组织。
- Strand 是语义性的——"是关于什么的"。一个 strand 是贯穿多个切片的关键词;
memory/episodic/strands.json将每个 strand 映射到其切片路径,回忆同事在查询时沿着 strand 追踪一个跨越多月的话题。
上下文依赖性记忆研究(Godden & Baddeley, 1975; Smith & Vela, 2001)表明,当检索上下文与编码上下文匹配时,回忆效果更好——潜水员在水下记住的单词,在水下回忆得最准。时间线保留了时间上下文,而回忆正是利用这一点:先定位何时,再检索什么。
在回忆这篇文档里,你可以直接问它几个问题——回答来自真实记忆,带原文引用。
你的记忆属于你自己
记忆是带有 YAML frontmatter 的纯 Markdown,躺在你自己的私有 GitHub 仓库里(Vercel 部署),或者你自己机器上的一个普通文件夹里(本机 npm)——两种跑法都是同一些文件、同一个 git 账本。每个文件都可被任何工具读取、可移植到任何系统。没有我们的服务器、没有云数据库、没有向量存储、没有专有格式。这是架构约束,不是隐私政策里的一句话——详见本地优先。
状态
Previously 处在活跃的早期开发阶段:会遇到毛边和破坏性变更,但核心纪律——记忆是文件、写路径可审计、数据归你——从第一天起就是架构约束。推荐形态是部署到 Vercel;本机 npm 客户端自 v0.9 起是正式版。它是个人项目,不是 SaaS。