记忆 · 新说法和旧记忆打架了
新酷「常住杭州」记了 14 个月、被用过 23 次;今天他说搬去深圳了
记忆层最难的一类:不是记不住,是记住了旧的。
为什么要快 冲突要在写入那一刻就判掉。等到下次推荐时才发现,错的答案已经发出去了。
接线长什么样
判断层和计算层之间没有依赖,所以它们并行发 —— 串起来等于白花一个来回。
① 你的程序
状态一直在你这边,模型不持有任何东西
合法动作由你的代码生成,模型只在里面挑
一段话 + 选项
② 判断层 · Jett
3 个问题一次前向答完,不是问 3 次
回来的是选项 + 把握程度,不用再解析文字
② 数值 · Jett(与判断同一次请求)
需要的那个数随判断一起回来
精确值,带单位,可以逐位核对
答案 + 那个数
③ 你的程序
执行动作,世界更新
然后进入下一个 tick
往返 3 问 · 1 个数值问题
当时的情况
一段话,和你真的会拿到的一样
记忆里有一条 428 天前写下的「常住杭州」,此后被引用过 23 次,一直没被纠正。今天用户说:「我上个月搬到深圳了。」这条新消息是他主动说的,语气肯定。
要判断的事
一次问完,回来的是选项和把握程度,不是一段还要再解析的文字
选一个应当怎么处理这两条记忆?
用新的覆盖旧的两条都留,各自标上时间先问用户确认再改以上都不合适
是 / 否旧记忆是否还有保留价值?
打个档这次冲突的严重程度
不算冲突需要标注必须立刻纠正
要算的那个数
两条记忆之间隔了多久
- 旧记忆写下距今428 day
- 新消息所述距今35 day
展开这一步
#0 = 428 day (旧记忆写下距今) #1 = 35 day (新消息所述距今) n0 = SUB(#0, #1) result = @n0
「旧记忆有多旧」决定了要不要直接覆盖。一条昨天写的和一条一年前写的,面对同一句新消息,处理方式完全不同 —— 而这个「多久」得算,不能估。
① 你的程序
状态一直在你这边,模型不持有任何东西
合法动作由你的代码生成,模型只在里面挑
一段话 + 选项
② 判断层 · Jett
3 个问题一次前向答完,不是问 3 次
回来的是选项 + 把握程度,不用再解析文字
② 数值 · Jett(与判断同一次请求)
需要的那个数随判断一起回来
精确值,带单位,可以逐位核对
答案 + 那个数
③ 你的程序
执行动作,世界更新
然后进入下一个 tick
往返 3 问 · 1 个数值问题
接进你的系统
下面就是这一页真正发出去的东西。把 state 换成你的场景、criteria 换成你的动作集, 它就是你的了。
① 判断层 —— 一次请求,3 个问题一起问
POST /v1/systemone
{
"model": "memorylake-c1",
"state": "记忆里有一条 428 天前写下的「常住杭州」,此后被引用过 23 次,一直没被纠正。今天用户说:「我上个月搬到深圳了。」这条新消息是他主动说的,语气肯定。",
"questions": {
"action": {
"type": "choice",
"instructions": "应当怎么处理这两条记忆?",
"criteria": {
"overwrite": "用新的覆盖旧的",
"both": "两条都留,各自标上时间",
"ask": "先问用户确认再改",
"other": "以上都不合适"
}
},
"old_still_useful": {
"type": "noul",
"instructions": "旧记忆是否还有保留价值?"
},
"conflict": {
"type": "score",
"instructions": "这次冲突的严重程度",
"criteria": [
"不算冲突",
"需要标注",
"必须立刻纠正"
]
}
}
}回来的是 {answers: {key: {value, probs}}} ——不用再写一个解析器去猜模型想说什么, 也不用为「它这次多说了一句」写兜底。
② 需要的那个数
"两条记忆之间隔了多久": {
"type": "number",
"unit": "day"
}
→ { "value": ..., "unit": ..., "exact": true }数值问题和其它问题写在同一个 questions 里, 一次请求一起答完。返回的 exact: true 表示 这个值可以直接拿去跟阈值比大小。