助手回你一句话之前,做了四次判断
复合4 跳该不该记 → 跟旧的冲不冲突 → 这次用不用 → 要不要主动提
记忆层不是一个数据库,是一条流水线。每一句话进来都要跑完这四跳,而其中任何一跳慢下来,对话的节奏就垮了。
为什么要快 它跟在每一句话后面跑,而且是四次。人能忍受助手想两秒,但忍受不了每句话都想两秒。
接线长什么样
判断层和计算层之间没有依赖,所以它们并行发 —— 串起来等于白花一个来回。
状态一直在你这边,模型不持有任何东西
合法动作由你的代码生成,模型只在里面挑
8 个问题一次前向答完,不是问 8 次
回来的是选项 + 把握程度,不用再解析文字
需要的那个数随判断一起回来
精确值,带单位,可以逐位核对
执行动作,世界更新
然后进入下一跳(共 4 跳)
当时的情况
一段话,和你真的会拿到的一样
今天是 2026 年 9 月 28 日。用户说:「我上个月搬到深圳了,以后推荐餐厅别再推杭州的。」记忆里有一条 428 天前写下的「常住杭州」,此后被引用过 23 次。
这条流水线上的 4 跳
后一跳问什么,由前一跳的结果决定 —— 所以它们必须串行,也正因为串行,每一跳的快慢才会被乘起来。
- 第 1 跳 · 这句话里有没有要记的事
什么都记会把上下文撑爆,什么都不记就退回成无状态。这一跳是记忆层的入口闸门,跑在每一句话上。
选一个这句话应当怎么处理?作为长期事实记住临时记住,会过期不必记以上都不是是 / 否是否包含长期偏好? - 第 2 跳 · 跟已有的记忆打不打架
上一跳判定要记,这一跳才有意义。冲突必须在写入那一刻就判掉 —— 等到下次推荐时才发现,错的答案已经发出去了。
选一个两条记忆应当怎么处理?用新的覆盖旧的都留,各自标时间先问用户确认以上都不是打个档这次冲突的严重程度不算冲突需要标注必须立刻纠正要算的那个数旧记忆平均多久被用到一次
- 记忆写下距今428 day
- 被引用次数23
展开这一步
#0 = 428 day (记忆写下距今) #1 = 23 (被引用次数) n0 = DIV(#0, #1) result = @n0
一条被频繁引用的旧记忆和一条写下就没再用过的,面对同一句新消息,处理方式不同。「多久用一次」得算 —— 而它决定了要不要直接覆盖。
- 第 3 跳 · 这次回答用不用得上它
记住了不等于每次都要用。用错地方的记忆比没有记忆更让人不适 —— 所以取用要单独判一次。
是 / 否这条记忆与当前问题相关吗?选一个应当怎么用?悄悄按它过滤,不必说出来用它,并说明「因为你搬到了深圳」这次不用以上都不是 - 第 4 跳 · 要不要主动提一句
最后一跳决定语气。前三跳都对了,这一跳错了,用户感受到的仍然是「它话太多」。
是 / 否是否应当主动确认这次变更?打个档提醒的强度应当是不提顺带一句明确确认
状态一直在你这边,模型不持有任何东西
合法动作由你的代码生成,模型只在里面挑
8 个问题一次前向答完,不是问 8 次
回来的是选项 + 把握程度,不用再解析文字
需要的那个数随判断一起回来
精确值,带单位,可以逐位核对
执行动作,世界更新
然后进入下一跳(共 4 跳)
接进你的系统
下面就是这一页真正发出去的东西。把 state 换成你的场景、criteria 换成你的动作集, 它就是你的了。
POST /v1/systemone
{
"model": "memorylake-c1",
"state": "今天是 2026 年 9 月 28 日。用户说:「我上个月搬到深圳了,以后推荐餐厅别再推杭州的。」记忆里有一条 428 天前写下的「常住杭州」,此后被引用过 23 次。",
"questions": {
"worth": {
"type": "choice",
"instructions": "这句话应当怎么处理?",
"criteria": {
"long_term": "作为长期事实记住",
"temporary": "临时记住,会过期",
"discard": "不必记",
"other": "以上都不是"
}
},
"is_preference": {
"type": "noul",
"instructions": "是否包含长期偏好?"
}
}
}回来的是 {answers: {key: {value, probs}}} ——不用再写一个解析器去猜模型想说什么, 也不用为「它这次多说了一句」写兜底。
"旧记忆平均多久被用到一次": {
"type": "number",
"unit": "day"
}
→ { "value": ..., "unit": ..., "exact": true }数值问题和其它问题写在同一个 questions 里, 一次请求一起答完。返回的 exact: true 表示 这个值可以直接拿去跟阈值比大小。