回忆(Recall)
回忆是 Previously 检索相关历史对话的方式。在 v1.0 里,它不再是主 Agent 驱动的检索工具,而是一位同事:一位情景回忆专家,主 Agent 用自然语言向它提问,它自己搜记忆,然后带回一份挂着原文引用的回答。每一步都实时渲染在聊天中:回忆在明处运行,而不是藏在 spinner 后面。
是同事,不是工具
契约的两端都是对话式的。主 Agent 用一个朴素的问题调用 recall——{question: "我们之前有没有和用户聊过婚礼致辞?"}——就像你问一位当时在场的同事。Recall 也用自然语言回答。
两条纪律贯穿整个交互:
- 同事关系,用户永远是第三方。 主 Agent 与 recall 互以同事相称,称你为「用户」——任何一方都不会假扮你,也不会把对方当成你。这写进了共享的子 Agent 基础提示词和主 Agent 的工具描述里。
- 证据锚定。 凡是对情景的断言,必须挂原文引用或 slice 指针;引不出原文的断言标为不确定。回忆、评分、方向变更全部遵守——幻觉是被结构性地锁死的,而不是指望模型自觉。
要点:主 Agent 不再亲自在记忆里导航。它问一位熟悉档案的同事,然后采信——并可以核验——对方的回答。
回忆报告
Recall 的回答落地为一份结构化报告,四个部分:
| 字段 | 内容 |
|---|---|
answer | 自然语言回答,用你的语言。「我们不记得聊过这个」是合法且重要的答案;硬凑命中是被禁止的。 |
references[] | {slice_id, quote, note}——answer 里每个情景断言都必须在这里挂一条原文引用。 |
searched[] | 实际找过的路径——时间窗、追过的 Strand、读过的切片——供主 Agent 判断这次回忆有多完整。 |
confidence | 0–1。 |
searched 轨迹让否定答案也可信:同样是「我们不记得」,查过相关时间窗和两条 Strand 之后说的,与扫了一眼时间线就放弃的,含义完全不同。
Recall 如何检索
Recall 持有全套只读记忆工具——readGlobalTimeline、readTimelineWindow、readStrand、listStrands、readSliceSummary,以及 readSlice(含 range 协议)——按人回忆的方式工作:先广度,深度只花在线索指向的地方。
- 时间锚点优先。 问题里带时间锚点(「上周」、「婚礼前一天」)时,先用
readTimelineWindow锁定物理时间窗。 - 追踪 Strand。 从问题里的线索出发,沿匹配的 Strand——关键词到切片的索引——找到所有携带该话题的切片。
- 先摘要,后全文。 切片摘要用来判断值不值得打开;全文深读配额最多 5 片,深度只花在重要的地方。
- 找不到就直说。 检索确实一无所获时,诚实的回答是「我们想不起来这个」,并附上
searched清单。Recall 绝不硬凑命中。
预算宽到足够认真检索——20 步、240 秒墙钟、温度 0.3(情景理解需要一点温度;诚实由证据锚定的结构保证)。超时不会白跑:recall 边想边写答案,runner 会返回已积累的部分结果。
返工信号
主 Agent 只保留了一个记忆读取工具:readSlice,专门用于核验 recall 的回答——「只在需要核对 recall 说了什么时,才打开原始切片」。
这条核验通道是埋了点的。当主 Agent 调用 recall 之后又自己重读同一个切片,系统会给这次读取分类——快速核对是 verify,把 recall 的活重干一遍是 rework,同一个问题再问一遍是 repeat——并记进 agent 时间线与 fitness store。一次 rework 是对 recall 的隐式扣分:它意味着回答没被采信。这是 fitness 评分最可靠的隐式信号源;攒够了,就会触发 recall playbook 的一次进化(见进化回路)。
回忆一次,然后采信。 如果 recall 找过且没找到,那就是确定性的答案——主 Agent 不会为同一个问题再问一遍,基于当前对话作答就是正确做法。把同事已经找过的东西再搜一遍,读起来就是不信任,而系统现在恰恰在给这种行为记分。
深夜,你忽然想起妈妈去年夏天的那次检查。你问 Previously:
23:47
紧张到几乎没睡。7 月 11 日那次对话里,你说你盯着天花板躺了一整夜,心跳得厉害,凌晨两点忍不住给 Alex 发了消息——对方回了一条语音,说无论怎样都会在终点等你。
I barely slept last night. Just lay there staring at the ceiling, heart racing. Ended up texting Alex at 2am and they sent a voice memo saying they'll be at the finish no matter what.
7 月 16 日晚上,你还站在终点线那儿,手里捏着奖牌,有点没缓过神来。Alex 举了个傻乎乎的牌子。你就那么站了十分钟,一句话也没说。
Alex was at the finish line with a stupid sign and I just stood there for ten minutes. Didn't even say anything. Just held the medal.
7 月 20 日你把整个备赛过程写成了一篇帖子——膝盖的伤、赛前的恐慌都写进去了。读完评论,你自己想明白了一件事:这场比赛从来不是关于成绩的,是证明自己能把一件事坚持到底。
the race was never really about the time. It was about proving I could stick with something.
在界面里看回忆
recall 的每一步——读时间窗、追 Strand、打开切片、报告落地——都实时渲染在聊天里的一张工具卡片上:回忆在明处运行,而不是藏在 spinner 后面。渲染的三个阶段与五种卡片状态,见聊天界面。
相关文档
- 切片(Slices) —— 切片如何创建、关闭和索引
- 主题索引(Strands) —— recall 所追踪的语义关键词索引
- 进化回路(Evolution) —— 当 fitness 分数开口时,进化 recall playbook 的那条回路
- 架构(Architecture) —— 同事制与主 Agent 收窄的工具面