为什么是 Previously
对话是 UI 产物。时间线是认知模型。Previously 从根本上重新思考 AI 交互:修复记忆模型,交互模型便会自行修复。
两个问题,同一个根源
当前 AI 助手存在一对相互关联的缺陷,大多数人将其体验为同一种挫败感。
问题 1:记忆被束缚在单次对话中。 每一次新聊天都从零开始。Agent 看不到你昨天、上周或在另一个相关话题的线程中讨论过什么。跨对话回忆需要拼接向量数据库、RAG 流水线和提示词工程——即便如此,结果仍像在跟一个失忆症患者交谈。
问题 2:对话列表是错误的心智容器。 人类不会把记忆整理成"跟妈妈的第 47 次聊天"。你是根据事情发生的时间和内容来记忆的。扁平化的聊天线程列表是消息应用遗留下来的 UI 产物,而不是人类实际思考和回忆方式的模型。
这两个问题是同一个错误的两面:围绕对话 UI 而非围绕记忆来构建产品。
记忆模型修复交互模型
如果一个 Agent 真正记住了你——跨越时间、跨越话题、跨越数天或数周的间隔——那么对话管理就变得不再必要。你不需要选择或创建正确的线程。你不需要提醒 agent 你是谁、你在做什么。你只需要出现,然后对话。
Previously 用时间线取代了聊天线程列表:一个从上到下的垂直时间切片视图。每个切片是一段不间断的对话片段——你开始说话时打开,在静默 30 分钟后自动关闭。路径精确告诉你它发生在何时:
memory/episodic/slices/YYYY/MM/DD/HHMM.md
一个日历日是一个目录,可以包含多个切片。没有需要命名、整理或搜索的对话——只有一段持续不断的关系,向上滚动回顾过去,向下滚动继续。
每次请求的上下文都保持有界,因为提示是从时间线上相关切片中组装而成,而不是来自不断增长的对话窗口。Agent 不会忘记长历史的开头,因为开头从未出现在窗口里——只有那些重要的片段,每次都被重新组装。
"Previously"这个名字来自电视:"Previously on..."(上一集回顾)——简要回顾上次的内容,刚好够你从停下的地方继续。
设计原则
完整的 Agent,而非仅仅一个记忆工具
Previously 可以读、写、推理和行动。记忆使交互看起来连续,但它并非唯一的能力。Agent 对你的 GitHub 仓库运行工具,使用多模型架构(DeepSeek V4 Flash 负责快速回忆和元数据维护,DeepSeek V4 Pro 负责深度推理和生成回复),并在一个白名单安全边界内运行,该边界将 agent 的写入权限限制在 memory/、tasks/ 和 sessions/——src/ 目录是只读的。
记忆是真正的难题
存储对话是微不足道的。在正确的时刻以正确的深度检索到正确的记忆,才是真正的难点——而这正是投入精力的地方。架构体现了这一优先级:每次请求一次 Flash 往返,同时完成意图分类、回忆扫描和元数据维护。复杂度预算投入到核心的"存储-索引-回忆"循环中,而不是配置旋钮或边缘情况。
你的记忆属于你自己
记忆是带有 YAML 前置元数据的纯 Markdown,存储在你自己的 GitHub 仓库中。每个文件都可被任何工具读取、可移植到任何系统,并通过 git 进行版本控制。没有云数据库、没有向量存储、没有专有格式。存储后端可在本地文件系统(开发环境)和 GitHub API(生产环境)之间切换,但格式完全一致。
白名单安全层强制执行这一所有权。Agent 工具只能写入 memory/、tasks/ 和 sessions/。代码——agent 的运行时和能力——在 src/ 中保持只读。
简洁胜于复杂
只有一个切片规则决定一个对话片段何时成为新切片:30 分钟静默。早期版本有容量检查和 Flash 连续性检查;这些已被移除。一个硬编码的阈值——这就是全部规则。每次请求一个 Flash 调用,在一个往返中同时处理回忆、意图路由和元数据维护,附带一次重试(300 毫秒)和一个回退到安全默认值的降级方案。
简洁是一个有意的选择:每一个可配置的旋钮、每一个边界情况处理器、每一个存储的标志,都是对未来推理征收的税。Previously 只在核心循环中——在真正产生价值的地方——才支付这笔税。
人类记忆是正确的隐喻
架构直接映射到认知科学。Endel Tulving 在 1972 年提出的情景记忆(与时间和地点绑定的事件)和语义记忆(抽象知识、事实、概念)的区分是蓝图:
- Slices 是情景性的——"发生了什么",按时间组织。
- Strands 和 memory nodes 是语义性的——"是关于什么的"。Strand 是一个关键词,贯穿所有包含它的切片;
memory/episodic/strands.json将每个 strand 映射到其切片路径。(实验性:strand 在切片关闭时写入,但尚未在召回时被扫描。)
回忆遵循这种分层模式。Flash(快速、轻量、有意设计为可犯错的那个模型)扫描最近的切片摘要,返回带有相关性分数的指针——一种快速的条件反射。Pro(主模型)接收这些指针,决定通过 readMemory 完整读取哪些切片——深思熟虑、深入且资源充沛。如果 Flash 没有找到任何内容,Pro 直接扫描切片目录。
上下文依赖性记忆研究(Godden & Baddeley, 1975; Smith & Vela, 2001)表明,当检索上下文与编码上下文匹配时,回忆效果更好。时间线保留了时间上下文,而回忆正是利用这一点。
Flash 回忆和深度回忆已在 previously-demo.ldwid.com 的在线 demo 中发布(只读,记忆写入已禁用,刷新后重置)。更丰富的基于 strand 的回忆——在查询时主动扫描 strands.json——是一个明确的未来里程碑。
延伸阅读
本文是对 Previously 设计哲学的高层概述。深入的技术探讨请阅读作者的英文文章:Is Time the Missing Dimension in AI Memory?(dev.to,英文)。
状态
Previously 目前处于实验阶段。它是一个单人研究项目,尚未准备好用于个人或生产环境。本文所述一切反映的是 v0.1.0 的设计意图和可用代码——标记为路线图的功能正在积极演进中,而非最终的确定性承诺。