从 47 分到 84 分NylonME 记忆引擎的 LoCoMo 实测全记录本文所有数字来自可复现的评测脚本评测口径LoCoMo 证据召回 recall10词面向量融合检索1536 个可答 QA。起点一个诚实的 47.1%上一篇实测博客里我们公布了一个不算好看的数字LoCoMo 证据召回 recall10 47.1%。那是纯词面匹配的基线——你问「用户什么时候订的机票」系统只在记忆文本里找字面重叠。能找到的是问题里恰好出现的词找不到的是换了一种说法的同一件事。两周后这个数字变成了84.6%1294/1536 → 1299/1536 的两次全量。如果往前看检索阶段——种子层召回——我们已经做到90%。在公开 LoCoMo 全量评测成绩的开源记忆引擎中这两个数字足以让我们进入第一梯队。这篇文章不做任何粉饰完整记录中间每一次上涨和每一次失败的实验。记忆系统这个领域太少有人公开真实数据我们希望是个例外。全景五个台阶阶段种子层召回最终 recall10关键动作词面基线~47%47.1%纯词面匹配Phase 1 完工时向量图~75%70.6%bge-m3 嵌入接入词面/向量双通道种子融合双层写入~85%79.2%叶子层原文 抽象层 LLM 提炼事实共存按类深度~88%80.1%简单查询不走图扩散Cat4 max_hops0全量验证90%84.2%2 会话 → 10 会话小样本泡沫挤掉向量重排90%84.6%查询向量对激活集直接打分混合排序台阶一嵌入接入47 → 70.6Phase 1 时嵌入通道是预留的接口种子全靠词面。接入 bge-m31024 维跑在局域网一台 Ubuntu 机器的 ollama 上之后检索变成双通道词面通道负责精确实体人名、地名、数字向量通道负责语义近似「订机票」和「买了去上海的航班」。两个通道各产种子向量通道有保底名额8 个防止被词面种子挤占。融合后 recall 从 47.1% 跳到 70.6%。这是预期内的涨幅不惊喜。真正的硬仗在 70 分以后。台阶二双层写入70.6 → 79.2这是整个 Phase 2 最重要的架构决策值得展开讲。起初我们的做法很直觉对话进来LLM 把每个 session 分解成结构化事实事实进图。听起来很美好——直到消融实验给了当头一棒只用抽象层事实分数反而从 79.2% 跌到 67.3。原因很简单LLM 提炼必然有损。用户说「我上次住的那个酒店隔音不太好但早餐还行」提炼成「用户对酒店隔音不满意」——早餐的信息没了「上次」的时序锚点也没了。问「早餐怎么样」的查询在抽象层永远查不到答案。所以最终架构是双层写入叶子层逐轮对话原文直接入库一个字不动——保精准回忆Cat2 时序、Cat4 单跳的底气抽象层session 结束时由 LLM 提炼结构化事实挂上关系标签——保推理能力Cat1 多跳、Cat3 常识的底气两层共存各管各的查询类型。这里顺带确立了一个设计原则理解层在写入侧不在读取侧。LLM 是记忆的「编译器」负责在写入时把原始事件编译成可检索的结构查询时不再动用 LLM。我们也试过查询侧的 LLM 查询扩展把问题改写成关键词再查实测收益净零——写入侧的理解已经把事情做完了。台阶三简单查询不扩散79.2 → 80.1我们的核心检索机制叫情境共振从种子节点出发沿关系图多跳扩散边扩散边按张力衰减。这个机制对多跳推理「A 提过的事和 B 后来做的事有什么关系」是刚需。但数据告诉我们它对单跳查询是负优化「用户在第三段对话里说的手机号是多少」这种问题答案就在种子节点里扩散反而把无关邻居带进 Top-10把正确答案挤了出去。Cat4单跳一度只有 60 分上下。解法不是砍掉扩散也不是另开一套查询引擎而是在共振引擎内部加路由按查询类型自适应调节联想深度——Cat4 型查询 max_hops0只返回种子精准回忆Cat1 型 max_hops4充分联想。同一个引擎同一套接口扩散深度变成一个可调参数。对外叙事依然是统一的情境共振根据查询复杂度自适应调节联想深度。台阶四全量验证挤掉小样本泡沫之前所有的迭代都在 2 个会话231 题上做因为快。冲到 80.1% 后我们跑了全量 10 会话1536 题约 1 小时结果84.2%——总分涨了但分类数据发生了戏剧性的重新分布类别2 会话10 会话全量Cat1 多跳67.4%80.5%Cat2 时序93.7%86.6%Cat3 常识72.7%53.3%Cat4 单跳78.1%88.0%Cat3 从 72.7% 掉到 53.3%——它只有 92 题小样本时 11 题的方差大到可以随意骗人。这就是为什么我们坚持把「全量」作为唯一可信口径小样本人人都能跑出好看的数字全量才是照妖镜。台阶五从种子层到最终答案90% → 84.6%全量数据暴露了一个关键事实种子层召回已经达到 90%但最终回答召回停在 84.6%。这意味着绝大多数正确答案已经进入了候选集问题不在「找不找得到」而在「排不排得前」。先看一组对比数据Cat4 单跳查询种子层召回93.2%最终召回88.0%——5.2 个百分点的差距纯粹是排序环节的损耗。答案明明已经进了候选集却被排序挤出了 Top-10。这个 gap 给了我们非常明确的信号NylonME 的检索能力已经进入开源记忆引擎第一梯队种子层 90% 在公开 LoCoMo 成绩的系统里属于前列水平。下一阶段的战场是排序。我们先试了两个「显然正确」的排序优化方案全部失败张力下限防止老记忆被时间衰减挤掉零效果。因为评测中所有节点都是刚写入的张力本来就约等于 1——假设错了种子保底名额前 N 名给种子留着零效果。28 个种子几乎占满 32 的激活预算扩散节点本来就进不来几个——机制上就是空操作最终有效的是向量重排共振完成后用查询向量对激活集里的每个节点直接算余弦相似度按 0.5 的权重和共振分混合重排。Cat1 多跳 2.5 分80.5 → 83.0总分 0.4。为什么提升有限因为 Cat4 剩余的排序差距是bge-m3 嵌入质量的天花板干扰对话和证据共享大量实体都在聊旅行、都在聊健身嵌入层面就拉不开差距。这不是排序算法能修的需要交叉编码器式的 reranker 或更强的嵌入模型。失败实验清单同样重要诚实是这系列博客的传统这轮被淘汰的方案LLM 查询扩展把问题改写成关键词再检索。收益净零砍掉层间显式 derived 边抽象事实 → 原文叶子权重 1.0对 Cat2/Cat3 实测负收益默认关闭隐式自动建边0.5 权重已足够张力下限排序假设不成立评测无老记忆种子保底名额机制上空操作每一次失败都在收紧我们对「这个系统真正靠什么赢」的理解写入侧的理解深度 双通道种子质量 自适应联想深度就这三件事。顺便的里程碑它开始给我们自己打工了评测之外NylonME 已经部署到局域网服务器192.168.1.5gRPC :50051RocksDB 落盘并且接进了我们自己的开发流程Codex 通过插件在每次任务开始时 resonate 回忆历史决策收尾时 weave 沉淀新事实。29 条项目历史记忆架构结论、评测数据、踩坑记录已经织入实测「deepseek 模型有什么坑」这种查询能精确命中当时的 bug 记录。自己用自己的系统挖记忆是检验它有没有用的最狠的方式。行业坐标我们站在哪在公开 LoCoMo 全量评测成绩的开源记忆引擎中NylonME 的种子层召回 90%、最终回答召回 84.6%已经进入第一梯队。这是 10 会话、1536 题、完全可复现的评测数据不是小样本筛选后的「最好成绩」。种子层 90% 说明检索架构本身已经能覆盖绝大多数查询场景84.6% 的最终分数说明排序环节仍有优化空间——但这恰恰是明确的下一步而不是模糊的「还需要很多改进」。引擎与协议全部开源Apache-2.0github.com/nylon-memory/NylonME。数字好坏都会继续在博客里更新。记忆是 Agent 的最后一块地基。第二层也打完了。