OpenViking Working Memory v2 评测报告:LoCoMo 长对话召回 79.61%、Token 成本下降 5 倍的结构化工作记忆实践
【免费下载链接】OpenVikingSelf-evolving Context Database for AI Agents. Unify Agent Memory, Knowledge RAG and Skills.项目地址: https://gitcode.com/GitHub_Trending/op/OpenViking
本报告基于 OpenViking 仓库 examples/openclaw-plugin/docs/workmemory-v2-test-report.md 整理,并结合 workmemory-v2-design.md 设计文档与 session.py 源码对结果成因做了解读。文中所有数据均为该测试报告原始记录,未做任何推算或外推。
导读
本文是 OpenViking Working Memory v2(以下简称 WM v2)的完整测试报告解读,覆盖 LoCoMo 长对话事实召回与 MemoryArena 跨会话规划两个基准场景,给出旧版基线(Main)、纯工作记忆(WM2-NOREC)、WM v2 全功能(WM2)与 OpenClaw 原生记忆(MC)四组的准确率、QA tokens 与单题成本(tok/correct)实测对比。读完本文,你将掌握:WM v2 相对旧版 structured_summary 到底提升了多少、结构化 7 段模板与增量更新的收益边界在哪里、以及这类「工作记忆 + 长期记忆向量召回」分层方案的评测方法论。
一、测试目标:验证 WM v2 四个核心改造的实际收益
WM v2 的核心改造点包括:结构化 7 段模板、tool_call 增量更新、服务端 Guards与keep_recent_count(详见 workmemory-v2-design.md)。测试要回答三个问题:
- WM v2 在小样本(35Q)和大样本(152Q)下相对旧版 Main 的准确率提升;
- WM v2 结构化 overview 的独立贡献(关闭向量召回);
- WM v2 + autoRecall 联合方案的最佳效果。
测试环境如下:
| 项 | 值 |
|---|---|
| LLM | doubao-seed-2-0-code-preview |
| Embedding | doubao-embedding-vision-251215 |
| Gateway | OpenClaw 2026.4.27 |
| Main 分支 | OpenViking @origin/main,commit4d6f5b65 |
| WM2 分支 | 工作记忆代码 |
| Judge | doubao-seed-2-0-code-preview-260215 |
二、LoCoMo 长对话事实召回测试
2.1 测试组设计
| 测试组 | 说明 | autoRecall | 设计目的 |
|---|---|---|---|
| WM2 | 工作记忆 + 长期记忆 + 工具回溯 | on | WM v2 全功能端到端测试 |
| WM2-NOREC | 工作记忆 + 工具回溯(关闭长期记忆) | off | 隔离工作记忆 + 工具回溯的独立贡献,看不靠向量召回时还能拿多少分 |
| MAIN | 原 overview + 长期记忆 + 老版工具回溯(仓库主分支代码) | on | 旧版基线 |
| MC | OpenClaw 原生记忆(关闭 OpenViking) | — | 横向对比 OpenClaw 原生记忆方案 |
这个分组是理解全部结论的钥匙:WM2 vs MAIN回答「新方案值不值得换」,WM2-NOREC vs MAIN回答「结构化工作记忆本身贡献了多少」,WM2 vs WM2-NOREC回答「向量召回还有没有增量」。
2.2 数据集
| 数据集 | session 数 | QA 数 | 说明 |
|---|---|---|---|
| locomo-small | 19 | 35 | LoCoMo sample 0 前 35 题,小样本快速对照 |
| locomo10 case0 | 19 | 152 | LoCoMo sample 0 完整 |
注意:Ingest 和 QA 同会话(QA 会话连续,复用前题上下文)——目的是测试工作记忆,而不是长期记忆的跨会话检索。
2.3 locomo-small(35Q):纯工作记忆即 +60.0pp
| 测试组 | 准确率 | QA tokens | tok/correct |
|---|---|---|---|
| MAIN | 28.57% (10/35) | 144,797 | 14,480 |
| WM2 | 94.29% (33/35) | 184,497 | 5,591 |
| WM2-NOREC | 88.57% (31/35) | 124,246 | 4,008 |
| MC | 42.86% (15/35) | 2,352,395 | 156,826 |
三组关键对比:
- 纯工作记忆 vs 旧版 MAIN:准确率从 28.57% 提升到 88.57%(+60.0pp),QA tokens 反而下降 14.2%(144,797 → 124,246),单题成本从 14,480 降到4,008(3.6× 效率)。仅靠结构化 7 段 overview + 工具回溯、无需任何向量召回,就已拿到大部分提升且同步节省 token。
- 叠加长期记忆 vs 纯工作记忆:准确率再升+5.7pp(88.57% → 94.29%),代价是 QA tokens 增加 48.5%(124,246 → 184,497),单题成本升到 5,591。长期记忆在此表现为「以 token 换最后一段准确率的细节召回」,边际收益递减但仍正向。
- OpenClaw 原生记忆 MC 横向对照:仅 42.86%,单题成本 156,826(是 WM2 的28 倍),准确率比 WM2 低51.4pp,无竞争力。
2.4 locomo10 case0(152Q):长样本上纯工作记忆已占整体提升的约 88%
| 测试组 | 准确率 | QA tokens | tok/correct |
|---|---|---|---|
| MAIN | 23.68% (36/152) | 2,280,098 | 63,336 |
| WM2 | 79.61% (121/152) | 1,510,190 | 12,481 |
| WM2-NOREC | 73.03% (111/152) | 1,622,319 | 14,615 |
- 纯工作记忆 vs MAIN:准确率从 23.68% 提升到 73.03%(+49.35pp),QA tokens 同步下降 28.8%(2,280,098 → 1,622,319),单题成本从 63,336 降到14,615(4.3× 效率)。纯结构化工作记忆贡献了整体提升的约 88%(49.35 / 55.93),且 token 大幅节省。
- 叠加长期记忆 vs 纯工作记忆:准确率再升+6.58pp(73.03% → 79.61%),QA tokens再节省 6.9%(1,622,319 → 1,510,190),单题成本降到 12,481。与 35Q 的「以 token 换准确率」不同,长样本上长期记忆是双向收益——既提升准确率,又因更高效答题而节省 token。
2.5 核心结论汇总
- LoCoMo 长对话事实召回:WM v2 在 152Q 上达79.61%(旧版 23.68%,+55.93pp);35Q 上达94.29%(旧版 28.57%,+65.7pp)。
- Token 效率:
- 35Q:WM v2 总 QA tokens 184,497(旧版 144,797,多 27.4%),但准确率涨 +65.7pp,单题成本从 14,480 降到5,591(约 1/2.6)。
- 152Q:WM v2 总 QA tokens 1,510,190(旧版 2,280,098,节省 33.8%),准确率涨 +55.93pp,单题成本从 63,336 降到12,481(约 1/5.1)。
- 整体趋势:35Q 是「以 token 换准确率」(总量略增 + 单题大幅降本),152Q 是双向收益(总量降 + 单题降)。
- 纯工作记忆是主体收益:关闭长期记忆向量召回仍能达73.03%(152Q),autoRecall 在此基础上再补+6.58pp。
三、MemoryArena Group Travel 跨会话规划对比
MemoryArenagroup_travel_planner是跨会话旅行规划任务(slot-filling + 后续 QA),不直接验证工作记忆能力——每个 task 是独立 session,没有跨题上下文累积。它被用来回答另外两个问题:与 OpenClaw 原生记忆的差距,以及与 OV 主分支无 WM 的严格 A/B 副作用检验。
3.1 数据集与方法
| 维度 | 说明 |
|---|---|
| 数据集 | MemoryArenagroup_travel_planner(270 task / 1869 subtask 的多日多人旅行规划) |
| 子样本 | sample0 / sample1 / sample2 共294 道 slot-level QA |
| 任务结构 | slot-filling 旅行规划 + 后续 QA(跨 task 独立 session) |
指标定义:
- Action:slot-filling 规划阶段的执行准确率——agent 在多步规划过程中正确填充 expected slot(如 flight number / departure time / arrival time)的比例,衡量规划执行阶段的动作准确性。
- QA:问答阶段答题准确率——agent 基于 task 上下文回答 slot-level 问题的正确率,衡量记忆/检索阶段能力。
- Combined Tokens:规划阶段(run)+ 问答阶段(QA)两阶段总 token。
3.2 WM v2 vs MC 原生:Action +42.52pp / QA +35.03pp / Token −21.76%
| 方案 | sample0 Action | sample1 Action | sample2 Action | Agg Action | Agg QA | Combined Tokens |
|---|---|---|---|---|---|---|
| MC memorySearch | 8/104 | 24/70 | 26/120 | 58/294 (19.73%) | 74/294 (25.17%) | 7,158,830 |
| WM v2 | 66/104 | 38/70 | 79/120 | 183/294 (62.24%) | 177/294 (60.20%) | 5,601,097 |
WM v2 相比 MC 原生:Action +42.52pp,QA +35.03pp,Combined Tokens−21.76%。在 slot-filling 任务上,OpenViking + 工作记忆的整体表现远胜 MC 自检索方案(LLM 主动调用memorySearch)。
3.3 严格 A/B(WM v2 vs OV-noWM):无副作用、大体持平
| Sample | OV-noWM Action | OV-noWM QA | WM v2 Action | WM v2 QA |
|---|---|---|---|---|
| sample0 | 71/104 (68.27%) | 65/104 (62.50%) | 66/104 (63.46%) | 60/104 (57.69%) |
| sample1 | 52/70 (74.29%) | 45/70 (64.29%) | 38/70 (54.29%) | 38/70 (54.29%) |
| sample2 | 66/120 (55.00%) | 58/120 (48.33%) | 79/120 (65.83%) | 79/120 (65.83%) |
| Aggregate | 189/294 (64.29%) | 168/294 (57.14%) | 183/294 (62.24%) | 177/294 (60.20%) |
WM v2 vs OV-noWM:Action −2.04pp(OV-noWM 略胜),QA +3.06pp(WM 略胜),token +2.75%。per-sample 异质性较高(sample1 OV-noWM 大幅领先、sample2 WM v2 大幅领先),aggregate 大体持平——没有显著退化也没有显著提升,符合预期(slot-filling 不直接受工作记忆改造影响),说明 WM 改造在此类任务上没有副作用。
四、为什么纯工作记忆能拿到主体收益:从源码看结果成因
测试结论「关闭向量召回仍能达 73.03%」并非偶然,而是 WM v2 三个设计原则在源码层面的直接体现(见 workmemory-v2-design.md 与 session.py):
4.1 固定 7 段结构化模板:让「记住什么」变得可维护
archive 的.overview.md是固定 7 段结构(Session Title / Current State / Task & Goals / Key Facts & Decisions / Files & Context / Errors & Corrections / Open Issues),每段职责明确,LLM 不能随意增删段落。代码中WM_SEVEN_SECTIONS常量(见 session.py)顺序固定,段上限约 2000 tokens、总 WM 上限约 12000 tokens,单段 ≥ 25 bullets 或 ≥ 1500 tokens 时触发 consolidation 提醒。
有结构才能做增量更新:LLM 对每个段独立发KEEP/UPDATE/APPEND,未变化的段发KEEP由服务端原样复制——零 token 消耗、零信息丢失。这正是 35Q 上「QA tokens 反降 14.2%」的结构性原因。
4.2 信息保留是系统责任:5 个段级 Guards
设计原则「信息保留是系统责任,不是 LLM 责任」落地为服务端 guard 函数(session.py):
| 段 | 数据特点 | Guard | 规则 |
|---|---|---|---|
| Session Title | 锚定型 | _wm_enforce_title_stability | UPDATE 与旧 title 有效词重叠 < 1 → 回退 KEEP |
| Current State | 易变型 | 无 | LLM 可自由 UPDATE |
| Task & Goals | 易变型 | 无 | LLM 可自由 UPDATE |
| Key Facts & Decisions | 累积型 | _wm_enforce_key_facts_consolidation | bullet 数 ≥ 旧 15% 且 lexical anchor 覆盖率 ≥ 70% 双阈值;被拒时提取新 items 做 APPEND |
| Files & Context | 引用型 | _wm_enforce_files_no_regression | UPDATE 丢失旧路径 → KEEP + APPEND 新路径 |
| Errors & Corrections | 只增型 | _wm_enforce_append_only | UPDATE 降级为 APPEND,去重后只追加新条目 |
| Open Issues | 跟踪型 | _wm_enforce_open_issues_resolved | 被静默丢弃的 item → 加[restored]标签恢复 |
即使 LLM 说 UPDATE,服务端也按段特性决定是否接受:Errors 纯 append-only(UPDATE 总被降级为 APPEND);Key Facts 允许「受控合并」,通过双阈值验证后才接受 LLM 的合并。这 5 个 guard + growth + 通用 schema 共有 107 个单元测试覆盖(tests/unit/session/test_wm_v2_guards.py、tests/unit/session/test_working_memory_growth.py),是「长对话丢信息」这一根因的直接防御。
4.3 增量更新协议:JSON schema 强约束 + 完整回退链
更新通过update_working_memory工具的 tool_call 提交,schema 要求 7 段全部必填、additionalProperties: false,漏段/多段/格式错误在 schema 层直接拦截。每段操作被oneOf约束为三种形状:{"op": "KEEP"}、{"op": "UPDATE", "content": "..."}、{"op": "APPEND", "items": [...]}。
服务端_merge_wm_sections(old_wm, ops)按常量遍历 7 段合并,并带完整回退链(session.py):tool_call 缺失 → 重跑创建 prompt(传入旧 WM 作为上下文);JSON parse 失败 → 正则 recovery → 段级 guard 兜底 KEEP;legacy 格式自动检测(检查 overview 是否含 7 段 header),旧格式会话走创建路径全量生成、下次 commit 自动升级,无需手动迁移。这就是「平滑升级、向后兼容」的保证——不配置新字段时行为完全不变,keep_recent_count=0等价于全量归档。
4.4 滑动窗口与 keep_recent_count:归档后的上下文连贯
SessionMeta维护pending_tokens与keep_recent_count并持久化到.meta.json(session.py):add_message时新消息进入保留窗口尾部、被挤出窗口的消息 token 累加到pending_tokens;commit时归零;GET /sessions/{id}直接读 meta,O(1) 判断是否触发归档。服务端有防御性 clamp(两者均max(0, ...)),CommitRequest.keep_recent_count在 router 层约束ge=0, le=10_000。
插件侧对应配置commitKeepRecentCount(默认 10,见 config.ts):afterTurn 归档时保留最近 N 条消息维持下一轮上下文,commitTokenThresholdRatio(默认 0.5)控制何时触发异步 commit;compact 路径则固定传keep_recent_count=0全量压缩。OV 存储模型保证tool_use/tool_result配对完整性,归档后工具调用链仍可完整回溯。
4.5 assemble 三分区:WM overview 成为会话摘要的单一来源
上下文组装按 instruction / archive / session 三分区:Layer 1 是 ≤8K tokens 的 Archive Memory(即 WM 7 段 overview),Layer 2 是未压缩的 live messages,Layer 3 保留 ≥20K tokens 给 LLM 回复空间。pre_archive_abstracts字段保留在 API 中但服务端固定返回空数组,插件侧只消费latest_archive_overview。需要细节时模型走两条回查路径:ov_archive_expand按archive_id展开单个 archive 原文,ov_archive_search按关键词跨 archive grep(默认最多 12 条命中、每条 1500 字符、不返回完整原文、正则元字符自动转义为字面量)。这套「摘要兜底 + 按需回查」机制,正是测试中「靠结构化摘要本身就能拿到大部分分数」的工程基础。
五、结论与适用边界
结论:在 LoCoMo 长对话事实召回上,WM v2 相比旧版 structured_summary 实现了准确率(+55.93pp / 152Q)与单题成本(约 1/5.1)的双重改善,其中纯工作记忆(结构化 7 段模板 + 工具回溯)贡献了约 88% 的提升;在 MemoryArena 跨会话规划上,WM v2 与 OV 主分支无 WM 严格 A/B 大体持平(QA +3.06pp / Action −2.04pp),相对 MC 原生显著领先(QA +35.03pp / Token −21.76%)。
适用边界(务必注意):
- MemoryArena 每个 task 是独立 session、无跨题上下文累积,不直接验证工作记忆,该任务结论不外推到 LoCoMo;
- 35Q 上长期记忆是「以 token 换准确率」,152Q 上才是双向收益——长对话场景收益更显著;
- 测试基于 doubao-seed-2-0-code-preview 与 OpenClaw 2026.4.27 特定环境,换模型/换 Gateway 后数值需重新验证。
相关实现与测试的进一步阅读入口:session.py(7 段常量、guards、滑动窗口)、ov_wm_v2 提示词模板、插件配置、设计文档、Guards 单元测试。
【免费下载链接】OpenVikingSelf-evolving Context Database for AI Agents. Unify Agent Memory, Knowledge RAG and Skills.项目地址: https://gitcode.com/GitHub_Trending/op/OpenViking
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考