智能体记忆别按召回次数加分
文章复盘skillmem的设计问题:把记忆被召回当作有效证据,会让错误经验不断强化。作者改为按证据类型调整记忆强度,强调检索匹配与执行成功应分别评价。
AI 深度解读
编码代理记住一条经验后,下次更容易把它找出来,这听起来很合理。但如果「被找出来」本身就能给经验加分,一条错误经验也会越用越牢。作者在开发 Claude Code 和 Codex 的本地记忆层 skillmem 时,就踩中了这个坑。
他的修正是:检索只记录访问,只有任务结果提供的证据才能增加记忆强度。不过,目前这些证据仍由代理自己申报。方案拆掉了一层反馈循环,还没有真正解决「谁来证明代理做对了」。
找到一条记忆,为什么不能给它加分
skillmem 存储的是操作流程,包括触发条件、执行步骤、结果和教训。每条记忆都有一个强度值,用来表达这条经验有多值得保留。
第一版在检索时增加强度。问题是,检索只能说明查询与记忆相似,不能证明照着做就有效。一条错误流程被召回后获得加分,下次排名更高,又更容易被召回。系统累积的可能只是曝光次数。
被召回证明的是相关性,不是正确性。
作者因此按证据类型调整强度,核心配置如下:
STRENGTH_BOOST = 0.15
EVIDENCE_WEIGHTS: dict[str, float] = {
"self_report": 0.0, # 代理声称有帮助:记录,但不奖励
"test_passed": STRENGTH_BOOST,
"diff_accepted": STRENGTH_BOOST,
"user_confirmed": STRENGTH_BOOST,
"failure": 0.0, # 单独处理:按比例降低强度
}
FAILURE_FACTOR = 0.7
要看的是 "self_report": 0.0:普通检索产生这种记录,只刷新最近访问时间和访问次数,不提高强度。测试通过、变更被接受、用户确认,才分别提供 0.15 的增量。
失败则单独处理,每次将强度乘以 0.7。它与奖励并不对称,因为一条被执行后造成问题的经验,理应比一条暂时没人需要的经验更快降权。
很久没用的规则,也应该被遗忘吗
记忆衰减有必要,但不能把「最近没用」直接当作「已经没用」。
skillmem 对闲置满 14 天的记忆,在每次衰减运行时乘以 0.85。这里没有说每天执行一次,因此不能自行理解为每日衰减。90 天未访问的记忆会被归档,退出召回,但不会删除;作者希望误归档能够用一条命令恢复,原文没有给出具体命令。
可像「不要向 main 强制推送」这样的规则,几个月没被检索到,也不代表可以淘汰。因此,记忆可以固定,免于衰减和归档;用户亲自编写或批准的规则还会被封存保护,代理报告的失败不能把它们降到无法召回的程度。
这里有个实用区分:操作经验可以根据结果调整,用户明确设定的约束则需要另一套保护机制。否则,代理只要把规则描述成「妨碍任务」,就可能逐渐削弱规则。
强度只能辅助排序,不能压过相关性
即使强度来源更可靠,也不适合让它主导检索。
作者在一个包含俄语和英语的 10 条查询小型基准上,对排序参数做了网格搜索。最初的强度系数是 0.3,结果高强度记忆会挤到更相关的记忆前面;后来改成 0.05,让强度主要承担相关性接近时的排序作用。
这个取舍容易理解:一条屡试有效的部署经验,也不该因为分数高,就出现在不相关的问题前面。
但 10 条查询只能提供调参方向。作者也明确承认,这不是足以支撑普遍结论的测量。
更关键的缺口在证据入口。代理调用 mem_reinforce,传入 evidence="test_passed",系统并不会核验测试是否真的执行。要补上这一环,证据应来自执行环境实际观察到的信号,例如测试命令的退出码。
确认操作也没有实现幂等:同一调用重试一次,可能重复加分。用于去重的证据 ID 仍待实现。
我的判断
我认同作者对反馈循环的警惕。只要模型生成的内容会影响评分,而评分又决定模型下次读什么,就必须追问:其中哪些信号来自模型之外?
当前实现更准确的评价是:它消除了「检索即奖励」的自动循环,但证据标签仍然是代理的声明。test_passed 这个名字看起来客观,实际可信度取决于谁填写、是否核验。
作者给出的 LongMemEval 成绩是 hit@5 0.889,衡量的是能否找回正确记忆。它不能证明引入强度后,代理完成任务的效果优于仅按最近访问时间排序。作者没有提供这组对照结果,因此效果仍需验证。
对一般团队来说,先保留相关性与最近访问时间的简单排序,再接入可核验结果,是更容易评估的起点。测试退出码也只是证据之一:测试是否覆盖当前修改,仍然决定它能证明多少。原文没有交代多条记忆参与同一任务时如何归因,这也是自动奖惩前需要补齐的问题。
能拿来做什么
- 给 Claude Code 或 Codex 增加项目记忆时,把「访问记录」与「有效性评分」分开存储,避免一次检索同时承担两种含义。
- 在前端或 Node 项目中,让执行测试的环境记录命令与退出码,再生成强化事件;同时检查测试是否覆盖本次修改。
- 将禁止向 main 强制推送等人工规则固定保护,经验性流程再按失败和闲置情况降权,并保留归档恢复入口。
- 接入自动加分前,先为证据事件设计唯一 ID,避免重试重复计分;评估时分别比较检索命中和任务完成效果。