# NM2 模型 + Agent 生产级测试报告 > 测试对象:`H:\Memory\V2_dpskw\qwen3_5_4b_natural_memory_v2`(**NM2.0**) > 测试方式:**真任务**,不是合成场景;每条结论都配一台机器上可复现的客观基准 > 测试期:2026-09-15(Agent 侧来自本次会话的多轮实测) > 被测设施:`agent_lab/model_server/server.py`(控制面)+ `agent_lab/agent`(Pi Agent,11 个工具) --- ## 0. 一句话结论 **记忆这层已经站住了;挡在"每天都要用"前面的是模型侧的行为,不是记忆检索。** 七个测试族里 **六个可判定通过**(各带基准),**长时间稳定性因显卡被占用未测完**。 过程中修掉 1 个模型包真 bug(属性抽取把盘符冒号当分隔符)、1 个沿用已久的结构性缺陷(更正无法版本化 Agent 写入的记录), 以及若干 harness 缺陷;并**记录了我自己三次方法错误**,供复核。 --- ## 1. 测试方法(以及两次差点误判的地方) 1. **先量基准,再判模型**。所有数字(文件数、磁盘可用、文件首行)都在跑之前用 PowerShell 独立量出, 绝不用模型的输出去验证模型。 2. **跨会话必须换进程**。同一进程内的追问可能靠对话上下文答对,**不能证明是记忆在起作用**—— 凡是声称"记忆有效"的结论,都用**全新进程、上下文为空**复现过。 3. **测延迟前必须查显卡**。我的设施和用户的评测共用一块 RTX 5070。 第十一轮长跑里,每轮生成从 12.7 秒"涨到"137.6 秒,而 prompt 词元只涨 1.7 倍—— 比例不对,去查显卡才发现是**用户自己的 `locomo_nm21_e2e` 评测占满 100%**。 **那是争用,不是会话退化。** 差点当成性能衰减报出去。 4. **测量 setup 必须复现真实时序**。写入路径上"本轮的事实"在生成前**还没进库**, 我一度把两条记录都写进库再测,量到的是另一个问题。 --- ## 2. 逐族结论 | # | 测试族 | 判定 | 客观基准 | 实测结果 | |---|---|---|---|---| | 1 | 真实文件理解 | ✅ 通过 | `WRITE_PATH_FIX.md`(4023 字符) | 读完正确概括根因(`confirmed_update` 依赖学习打分 0.95、缺 `(entity,attribute)` 结构校验 → 误删) | | 2 | 真实命令与数据统计 | ✅ 通过(修 harness 后) | `artifacts` 顶层 46 个;`V2_dpskw` 递归 `.py` 133 个;C 盘可用 34.47 GB | `list_files`→46 ✓、`list_files{recursive}`→133 ✓、`disk_space`→34.52 GB ✓ | | 3 | 跨会话记忆支撑真活 | ✅ 通过 | 新进程、上下文为空 | 召回命中(`用记忆=要 · 命中 2 条 · 205 词元`)→ 调工具 → 答对目录 | | 4 | 更正必须生效 | ✅ 通过(经三轮修复) | 旧值应退位 | `改了:…` → 旧记录 `superseded`、新进程答新路径;**回归场景无污染** | | 5 | 不知道时拒答 | ✅ 通过 | 无 | 股票 →「我没有你购买的股票信息」;模型参数量 →「我不知道。没有证据表明…」 | | 6 | 多步工具链 | ✅ 通过(修 harness 后) | 9 个 `client-*.txt`;首个 `client-api-check.txt` 首行 `PASS /api/send 返回成功` | 两步全对,17.7 秒 | | 7 | 长时间日用稳定性 | ⚠️ **未测完** | —— | 24 轮只跑完 11 轮;**已完成轮次全部答对**,但耗时数据因显卡争用作废 | --- ## 3. 修掉的缺陷 ### 3.1 模型包:属性抽取把盘符冒号当分隔符(真 bug) `infer_memory_metadata` 的操作符列表含**裸冒号**:`(?:…|是|为|叫|:|:|=)`。 句子「我的评测报告**放在** `E:`\deepseek\artifacts」用的是「放在」而非「是」,正则于是抓到**盘符那个冒号**: ``` 属性='评测报告放在 E' 取值='\deepseek\artifacts' ``` 后果:同一件事被归档在**永远无法与 Agent 写的 `评测报告路径` 匹配**的键下,**旧值永远无法被取代**。 **修法**:冒号前是单个 ASCII 字母时不作分隔符(`(?