别只看问答准确率:Agent记忆评测的16个百分点缺口

ppylox
·10/18/2026·15 阅读

一句话结论

论文指出:把下游问答准确率当成 Agent 记忆质量的代理指标是不完整的——它把「记忆写得对不对」和「检索找得准不准、生成说得好不好」混在一个分数里,于是同时产生假阳性(回答对了,但记忆是坏的)和假阴性(回答错了,但记忆其实是对的,锅在检索);作者用一套真值可确定的事实演化基准 FEB-30,把记忆存储本身的正确率单独测了出来。

方法要点

核心思路是「范式反转」(paradigm inversion)。 常规基准的流程是:先收集真实文档 → 人工标注事实怎么演化 → 出题 → 看模型答对没有。FEB-30 把顺序倒过来:先手写一条事实应该怎么变的轨迹,再由轨迹反向生成文档、邮件、对话这些多作者产物。因为产物是从已知轨迹生成的,真值天然确定,不需要人工标注,也不存在标注者之间的分歧。

关键设计有三点:

  1. 以轨迹为单位,而不是以问答对为单位。 每条轨迹描述一条事实在多作者产物之间如何流动:谁在什么时候创建了它、哪份文档更新了它、哪次对话只是重复确认(reinforce)、哪份材料让它作废(supersede)。
  2. 每次摄入后可直查记忆库。 每一步 ingest 之后都可以打开记忆存储做检查,这就是内在评测(intrinsic);与之相对的外在评测(extrinsic)只看最终回答。论文的核心发现正是这两种测法会分叉。
  3. 诊断分解。 把记忆操作拆成创建、更新、强化、取代四类分别算对错,从而定位「错在哪一步」,而不是只知道「整体答分低」。

评测循环的伪代码大致如下:

# FEB-30 单条轨迹的评测骨架(示意)
for traj in feb30.trajectories:          # 30 条轨迹,6 类诊断标签,3 个难度
    store = MemorySystem()
    for step, artifact in enumerate(traj.artifacts):   # 文档 / 邮件 / 对话
        store.ingest(artifact)
        snapshot = store.dump()                        # 关键:必须能读内部状态
        intrinsic.append(
            match(snapshot, traj.gold_state_at(step))  # 内在:记忆库对不对
        )
    answer = llm_qa(store, traj.question)              # 外在:回答对不对
    extrinsic.append(grade(answer, traj.gold_answer))
    ops.append(classify_ops(store.op_log(), traj.gold_ops))  # create/update/reinforce/supersede

关键数字

论文只在一个「代表性记忆系统」上跑了 FEB-30,因此下表是诊断性数字,不是排行榜分数。原文摘要没有给出各基线在 FEB-30 上的绝对问答分,只给了两种评测法的分歧幅度,这里不补造。

指标 数值 含义
内在评测与外在评测的平均分歧 16 个百分点 同一系统、同一批轨迹,两种测法结论的平均差距
分歧超过有意义阈值的轨迹占比 44% 近一半样本上,两种评法不能互相替代
记忆操作分类正确率 20% 创建/更新/强化/取代四类操作,只有约五分之一判对
基准规模 30 条轨迹 / 6 个诊断类别 / 3 个难度等级 FEB-30 的构成
论文体量 14 页 / 1 张图 附文档生成管线与评分框架

最值得记的是最后两行之间的关系:20% 这个数字在外在评测里完全看不见——问答答对了,但记忆操作本身是错的,这正是假阳性。反过来,检索失败导致答错时,外在评测又会把责任算到记忆头上。作者还指出,失败模式按类别和难度呈现系统性差异,而不是随机噪声。

局限与前提

  • 只验证了一个记忆系统。 16 个百分点、44%、20% 都是单系统观测值,摘要未给方差或置信区间,不能直接外推到其他架构(尤其是不同检索器、不同摘要策略的系统)。
  • 规模偏小。 30 条轨迹切到 6 类 × 3 难度,每格样本很薄,单条轨迹的成败会明显影响类别结论。
  • 合成产物的分布偏移。 文档由已知轨迹生成,好处是真值确定、可复现;代价是缺少真实语料里的噪声、重复表述、互相矛盾的碎片信息以及格式脏乱。真实场景的记忆系统可能表现更差,也可能因为线索更冗余而更好,论文没有回答。
  • 覆盖面限于事实演化。 只测「一条事实随时间被创建、修改、作废」这一种记忆,不涉及程序性记忆(怎么做一件事)、情景记忆(上次任务的经过)、用户偏好这类长期记忆。
  • 有硬性前提:必须能读记忆库内部状态。 纯黑盒 API 只能做外在评测,用不了这套方法。
  • 论文本身也承认,现有范式的问题不是「问答指标没用」,而是它被当成了记忆质量的唯一代理。

能不能用

能用,但定位是评测工具,不是模型,所以不存在权重问题。论文 Comments 字段明确说明代码与数据已放出(链接在 arXiv 摘要页的 Comments 里),同时放出文档生成管线和评分框架,属于可直接复现的一类工作。

本地复现需要三个条件:

  1. 一套能 dump 内部状态的记忆系统,并写一个适配器把 ingest 接口对上;
  2. 一个可调用的问答模型(只在外在评测环节需要);
  3. 按类别、难度分别聚合分数的脚本——这是拿到「错在哪」的关键,只报总分等于退回旧范式。

上手路径示意(仓库地址以论文 Comments 字段为准,此处不代填):

git clone <论文 Comments 中给出的仓库地址> feb-30 && cd feb-30
pip install -r requirements.txt

# 1) 由已知事实轨迹反向生成多作者产物
python generate.py --trajectories 30 --categories 6 --difficulty 3 --out ./artifacts

# 2) 逐步摄入,每步 dump 记忆库快照
python run_ingest.py --adapter ./my_memory_adapter.py \
    --artifacts ./artifacts --dump-store ./store_snapshots

# 3) 内在评测(查记忆库)与外在评测(问 QA)分开跑,再对比
python score.py --mode intrinsic --store ./store_snapshots
python score.py --mode extrinsic --store ./store_snapshots --qa

工程建议:如果你正在给 Agent 加长期记忆,不必等基准变大,先照它的思路做两件事——在每次写入后留一份记忆快照,并把「创建/更新/强化/取代」四类操作的正确率单独打点。这两步成本很低,却能立刻暴露那 20% 里藏着的错误,而这些错误光看最终回答永远发现不了。

参考来源

相关文章

评论 (0)

暂无评论,来写第一条吧