Memory-R1
Agent 记忆 · 强化学习 · arXiv 2508.19828

Memory-R1:不教它何时存、何时删,只教它「答案对不对」

带外部记忆库的 LLM 系统,在「这条新信息该 ADD、UPDATE、DELETE 还是不动」,以及「检索回来的 60 条里该信哪几条」上,大多是照提示词拍脑袋。 论文把这两个判断交给两个 RL 微调的智能体,奖励只有一个:最终答案是否与标准答案完全一致(Exact Match)。152 条训练 QA 就训练完成,跨三个基准(LoCoMo / MSC / LongMemEval)、Qwen-2.5 的 3B–14B 都能涨。

Sikuan Yan et al. · LMU Munich / MCML · 页面数字以 arXiv v5(2026-01-14)为准 arXiv 2508.19828v5 ↗
TL;DR · 30 秒抓住核心

问题不是「记不住」,而是不会管。外部记忆库一旦持续写入,规则式系统就会把「又领养了一只狗」误判成矛盾,DELETE 掉旧记忆再 ADD,把一个连续的事实拆成碎片(Figure 1)。

论文的办法是把记忆拆成两个角色分别学:Memory Manager 只负责挑四种原子操作之一并写出新记忆内容 m′;Answer Agent 只负责从 60 条候选记忆里蒸馏出有效证据再作答。两者都用 PPO 或 GRPO 训练。

最省事的一点是奖励不需要人工标注记忆操作:Manager 的奖励来自「下游冻结的 Answer Agent 能不能答对」,Answer Agent 的奖励就是 EM。代价是两阶段必须分开训练,而且结论集中在对话类基准上。

+37.4%(相对 Mem0)
LLM-as-a-Judge 相对 Mem0
LoCoMo Overall,LLaMA-3.1-8B-Instruct
J 62.74 vs 45.68 → +17.06 点,相对 45.68 为 37.35%(Table 1;37.4% 为按原文一位小数四舍五入的写法)
+19.72 点
Answer Agent RL 的 F1 增益(绝对点,非百分比)
LoCoMo,配 GPT-4o-mini Manager;配 LLaMA-3.1-8B Manager 仅 +10.10 点(Figure 6 正文)
152 条
训练 QA 对数
LoCoMo 剔除 adversarial 子集后按 1:1:8 切分:训练 / 验证 / 测试 = 152 / 81 / 1307
01

记忆的问题不是存不下,而是「管」的时候只有规则、没有反馈

读完这节你应该知道:为什么 LLM 失忆、RAG 加了记忆库之后反而会越管越乱。

论文从 LLM 的无状态说起:记忆被有限的上下文窗口卡死,窗口外的信息就没了,长对话、持续演进的任务都无法维持知识。主流补救是外挂一个记忆库,走 RAG 范式——把检索到的条目拼进 prompt。这解决了「能拿到过去」,却只解决了一半。

论文 Figure 1 的案例

「又养了一只狗」被当成「改口了」

用户先说「我领养了一只叫 Buddy 的狗」,后来又说「我又领养了一只叫 Scout 的狗」。原始的记忆系统把两句话当成矛盾,发出 DELETE+ADD,把 Buddy 那条记忆覆盖掉,结果答案变成「1 只狗」。

训练过的 Manager 只发一条 UPDATE,把它合并成「Andrew 有两只狗:Buddy 和 Scout」(Figure 1 图注原句「Andrew adopted 2 dogs named Buddy and Scout」),Answer Agent 再从 60 条检索记忆中蒸馏出这一条,答出「2 dogs」。

论文把难点归结为两个对称的问题:

论文还专门排除了监督微调(SFT):要标注每一步记忆操作和每个检索决策,成本不现实。RL 只需要一个结果信号,所以被看作补齐「自适应记忆」缺失的那一块。

02

已有工作要么是固定的记忆结构,要么有操作原语却没有学习信号

分两路看:一路做「记忆系统」但策略写死;一路做「LLM+RL」但没碰记忆管理。

记忆系统

结构做得出来,策略选不出来

MemGPT 用工作缓冲区和长期缓冲区加调度策略;MemoryBank 做组合式记忆控制器;ReadAgent 做 gist 记忆;Mem0 把操作定为 {ADD, UPDATE, DELETE, NOOP} 的模块化系统;A-Mem 会自动建、连、更新结构化记忆(§2.1 列举的顺序与对象)。

卡点:操作的原语已经齐全,但「何时用哪个」依赖启发式或 in-context 指令,缺乏和长期目标挂钩的优化。

LLM + RL

RL 能训行为,但没训记忆

Toolformer / ReAct 把工具调用做成可学的问题;Search-R1 用 RL 训模型发搜索查询以最大化最终答案;Trial and Error 优化智能体选择推理路径。

卡点:这些都证明 RL 能改进复杂行为序列,但记忆管理与利用在 RL 视角下几乎空白。

所以论文的定位很明确:沿用 Mem0 的四操作原语(论文认为它「最小且足够表达记忆动态」),但用 RL 学「选哪个」;同时把检索后的取舍也纳入 RL——这是它与前两类工作最直接的差异。

03

记忆管理 = 一个策略 πθ(操作 | 新信息, 旧记忆),奖励只来自下游答题的 EM

读完这节你应该能写出两阶段各自的目标函数,并知道为什么两者都必须和「答案对不对」相连。

阶段一:Memory Manager 选一个操作

对每一轮对话抽出的新信息 x 和当前记忆库 Mold,Manager 输出一个操作 o ∈ {ADD, UPDATE, DELETE, NOOP} 以及更新后的内容 m′:

(o, m′) ~ πθ( · | x, Mold )
Eq. (1) · 四种操作里只选一个,并顺手写出要写入/替换成什么样

奖励不是「操作选得对不对」——没有这种标签。论文的做法是把操作施加到记忆库上,把新记忆库交给冻结的 Answer Agent 去答一道下游 QA,再看答对没有:

Ranswer = EM( ypred, ygold )
Eq. (4) · 完全匹配为 1,否则 0;不需要人工标注记忆操作,天然可扩展

阶段二:Answer Agent 先蒸馏,再作答

给定问题 q 和检索集合 Mret,Answer Agent 直接映射到答案:

y ~ πθ( · | q, Mret )
Eq. (5) · 按 Mem0 的做法固定检索 60 条候选,「蒸馏」就发生在这一次生成里——先输出它认为有用的记忆,再给答案

它用同样的 EM 作为奖励。关键设计:蒸馏不是单独的过滤模型,而是要求模型在作答前先复述选中的证据,再由 EM 来奖惩这个选择过程。C.2 的 prompt 里第 9 条要求「先输出你找到的有用记忆,再作答」,Figure 11 展示了这道因果链:原始模型吃到全部 60 条,被「登山」之类的无关记忆带偏答成 mountains;训练后的模型只吐出与海滩相关的两条,答出 beach。

为什么两阶段要分开训

Manager 训练时 Answer Agent 冻结,只当「评分器」;Answer Agent 训练时 Manager 固定,保证记忆输入稳定。论文给出的理由是稀疏奖励下的稳定性,这个解耦避免了「答错了到底怪记忆还是怪回答」的归因歧义。代价是它不再是端到端的多智能体 RL——论文在 Limitations 里也把端到端训练列为未来工作。

交互:滤得不够有噪声,滤得过头伤证据

论文做了 Memory Distillation 消融(Figure 5 (c,d)、§4.4 正文):Answer Agent 用 GRPO 训练时,不做蒸馏(F1 41.0 / B1 34.4 / J 60.1)和做蒸馏(F1 45.0 / B1 37.5 / J 62.7)对比,F1 相对 +9.8%(4.0/41.0)、B1 相对 +9.0%(3.1/34.4)、J 相对 +4.3%(2.6/60.1)。论文只披露了「全留」和「蒸馏」两点。

下面把「蒸馏」抽象成一个显式打分过滤器(论文的蒸馏是隐式生成,这里仅为演示):每轮作答先生成一个候选结果,再用相关度分数过滤,留下相关度 ≥ 阈值 τ 的结果。拖动 τ,看三条指标怎么分开走。

当前读数
从最左(τ=−2,几乎全部保留)开始往右拖。

验证:最左端基本等价于论文消融里的「不做蒸馏」;往右拖时,噪声先被滤掉(精确率上升)。按演示模型实算:默认 p=0.55 时 F1 峰出现在 τ≈0.5–0.6(τ=0.5 与 0.6 都是 F1=49.2,平台),B1 峰约在 τ≈0.9–1.0(0.9 为 62.8、1.0 为 62.8),J 峰约在 τ≈0.95(43.1)。三项最小值的峰值在 τ≈0.9(min(F1,B1,J)=43.0)——τ=1.0 时 min=42.97,基本持平;τ≥1.4 后真记忆(z~N(0,1))几乎全被误删、三项一起归零,拖到 1.2 以后三项都开始塌。F1 峰(≈0.5–0.6)与三项最小值的峰值(≈0.9)并不重合,所以正文分开说。

端点有一个要说明的缺口:p=0.55 时 q·PU(τ)=0.55,而保留下来的伪相关记忆只有 ~0.16,精确率约 0.42,模型的 F1(~49 的峰值、τ=−2 处 ~33) 都不等同于论文「不做蒸馏」的 41.0——演示模型在低精度端整体偏悲观。因此下文只讨论相对趋势与峰值位置,不要把绝对值当论文读数。改变 p 会移动三项最小值的峰值:p 越小,最优截断点越靠左(p=0.3 约 0.6,p=0.5 约 0.9,p=0.7 与 0.9 约 1.0);F1 峰在 p=0.1–0.9 范围内始终落在 τ=0.6。论文没有公开中间截断点的数据,这里的曲线是演示模型,不是论文结果。

演示模型的假设与公式点开看怎么算、哪里不严谨

打分:相关度 z ~ N(0,1)。三部分来源:(1−q)·60 条真实记忆 + 伪相关记忆(分数 ~ U(0.3, 1.4));q·60 条真证据产出的结果 ~ N(0,1),其中 q = p·b,b 为命中率(这里取 b = 1,即该相关记忆都会被用上)。

留下与保留:S(τ) = Φ(−τ) + q·PU(τ),PU 为伪相关记忆在 τ 以上的比例;保留条数 = round(S)(最多 60 条)。

精确率 / 召回率:Recall = q·PU(τ) / S(τ);Precision = q·keep·Recall / (q·keep·Recall + (1−q)·keep)(相关条数除以保留条数)。

指标:F1 = 调和平均 ×100;B1 = F1 × 1.5 × (1 − 0.3·S)(保留越少、短答越多,brevity penalty 越重);J = (0.5·P + 0.5·R) × (1 − 0.3·S)(judge 既扣噪声也扣冗长)。

为什么中间到峰:伪相关记忆集中在 0.3–1.4 区间,先滤掉它们可提升精确率;超过 1.2 后真证据也被大面积删除,召回率塌方;两端都差,所以出现了中间峰(F1 在 τ≈0.5–0.6)。改变 p 会移动三项最小值的峰(见上文实算)。

不严谨之处:论文的蒸馏发生在生成里、与 backbone 和 prompt 绑定;这里把它简化为「按相关度分数显式截断」。所有读数都是演示模型输出,不能当作论文数据引用。

04

同一份 152 条 QA 训两个策略:GRPO 靠组内相对优势,省掉了 value function

读完这节你应该知道 PPO 和 GRPO 在这里各自吃哪个奖励、数据怎么从 LoCoMo 切出来。

论文把两个智能体都分别训成 PPO 或 GRPO 变体,所以报告了 Memory-R1-PPO 和 Memory-R1-GRPO 两个变体(§3.1–3.2)。

PPO:裁掉过大的更新

J(θ) = 𝔼[ min( ρθA,  clip(ρθ, 1−ε, 1+ε)·A ) ]   ,  ρθ = πθ(·) / πold(·)
Eq. (2) · 采样到的操作/答案先算切比雪夫比,超出 [1−ε, 1+ε] 的部分被裁掉,保证更新稳定

Manager 用 PPO 时,候选操作 o 和内容 m′ 从 πθ 采样,施加后交给冻结的 Answer Agent,答对与否给出标量 r,再估优势 A。Answer Agent 用 PPO 时目标相同,只是序列变成生成答案 y,ρ 换成 πθ(y | q, Mret) / πold(…)(Eq. 6)。

GRPO:组内比一比,不再需要 value function

对每个状态采 G 个候选动作,用组内标准化算相对优势:

Ai = (ri − mean(r)) / std(r) , J(θ) = 𝔼[ (1/G) Σ ρθ(i)Ai − β·DKL(πθ ‖ πref) ]
Eq. (3) · 优势全来自组内排名;KL 项约束策略别漂离参考策略。原文没有写明 std 除数是 G 还是 G−1;页面统一用总体标准差(÷G)

这里有一个容易被忽略的细节:奖励是 0/1 的 EM,所以 Ai 只有两个取值——组内有答对的,答对者得正分、答错者得负分;整组全对或全错时 std(r)=0,组内优势全部为 0,这一步就没有学习信号。这就是稀疏奖励,也是论文说「分开训练以保证稀疏奖励下的稳定性」的背景。下面的交互把这一点算给你看。

交互:同一组候选,奖励怎么打分决定优势长什么样

候选固定为 8 个、用 0/1 表示「答对/答错」的序列,只改变奖励的取值范围。三个模式分别是:模式 0 / 1 共用同一组 EM 序列 [1,1,0,1,0,1,1,0],模式 1 把它整体乘以 2 得到 [2,2,0,2,0,2,2,0](五个 2、三个 0,mean=1.25);模式 2 换了一组序列 [2,2,0,2,1,2,2,0](把候选 #5 从 0 换成 1:五个 2、一个 1、两个 0,mean=1.375)。看两个都答对的候选为什么拿到完全相同的优势,以及把分数拉开后优势怎么变。

Group‑relative advantage
Ai=(ri−mean)/std,G=8,候选固定为 [1,1,0,1,0,1,1,0](论文的 EM 奖励只有 0/1)。
手算验证三个模式(三组奖励)的 mean / std / A 都列出来

口径:std 统一用总体标准差(除数 G=8),与页面计算器的 JS 一致(JS 里 v = Σ(r−mean)²/G、sd = √v,没有 Bessel 修正)。论文 Eq.(3) 只写 std(r),没交代除数;若改用样本标准差(÷7)会把 A 同比放大 √(8/7)=1.069 倍,组内排序不变。以下数值均用 python3 复算至 4 位小数。

模式 0(EM,r∈{0,1}):候选 AEM = [1,1,0,1,0,1,1,0],五个 1、三个 0。和 = 5,mean = 5/8 = 0.625。方差 = (5×0.375² + 3×0.625²)/8 = (0.703125 + 1.171875)/8 = 0.234375,std = √0.234375 = 0.4841。r=1 → A = 0.375/0.4841 = +0.7746(5 个);r=0 → A = −0.625/0.4841 = −1.2910(3 个)。

模式 1(r∈{0,2},同一序列乘 2):候选 A2 = [2,2,0,2,0,2,2,0],五个 2、三个 0。和 = 10,mean = 1.25。方差 = (5×0.75² + 3×1.25²)/8 = (2.8125 + 4.6875)/8 = 0.9375,std = √0.9375 = 0.9682(正好 2×0.4841)。r=2 → A = 0.75/0.9682 = +0.7746(5 个);r=0 → A = −1.25/0.9682 = −1.2910(3 个)——与模式 0 完全相同,因为线性缩放会被 std 约掉。

模式 2(r∈{0,1,2},候选换成另一组):候选 A2,1 = [2,2,0,2,1,2,2,0],五个 2、一个 1、两个 0。和 = 11,mean = 11/8 = 1.375。

离差平方:五个 2 各 (2−1.375)² = 0.390625(共 1.953125),两个 0 各 (−1.375)² = 1.890625(共 3.78125),一个 1 为 (1−1.375)² = 0.140625。方差 = (1.953125 + 3.78125 + 0.140625)/8 = 5.875/8 = 0.734375,std = √0.734375 = 0.8570(总体标准差)。

代入逐项:r=2 → A = 0.625/0.8570 = +0.7293(5 个);r=1 → A = −0.375/0.8570 = −0.4376(1 个);r=0 → A = −1.375/0.8570 = −1.6045(2 个)。若改用样本标准差 √(5.875/7) = 0.9161,三项同比缩放为 +0.6822 / −0.4093 / −1.5009,组内排序与结论不变。

读出来的规律:「答对就是答对」:只要两个候选奖励相等,它们在 GRPO 里获得的优势就完全一样——模式 0 与模式 1 的 A 逐位相同(+0.7746 / −1.2910),把整组奖励乘 2 不改变任何优势。改变的只有组内不同奖励之间的差距:模式 0/1 里「答对」与「答错」相差 2×0.7746 = 1.5492 个离差;模式 2 把 0/2 两档换成 0/1/2 三档后,「答对(2 分)」与「答错(0 分)」拉大到 (2−0)/0.8570 = 2.3337 个 std,而 1 分的候选落在中间。组内优势只反映相对好坏,不反映奖励绝对值。

数据从哪来,只用 152 条

为什么能只靠 152 条?因为奖励是结果信号,不需要逐条标注记忆操作或检索选择;而 152 = 81+81 正好是 1:1:8 切分里的训练与验证份数。

05

两条流水线:写记忆时只牵 Manager,答题时才牵 Answer Agent

按论文 Figure 2 与 Algorithm 3–5,把「一轮对话进来」到「一个问题答完」拆成两条泳道,再把训练时的奖励回路单独画出。

Stage 1 · 构建/更新记忆库 对话第 t 轮dialogue turn 抽取关键信息 fLLMExtract TopK 检索旧记忆M_old Memory ManagerRL 微调 · 输出 o, m′ 记忆库 MADD/UPDATE/DELETE/NOOP 逐轮循环(Algorithm 3) Stage 2 · 记忆增强作答 用户问题 qQA RAG 检索 60 条30 × 2 speakers Answer Agent先蒸馏,再推理 答案 y≤ 5–6 词 同一记忆库 训练时的奖励回路 ① 训 Manager冻结 Answer Agent ② 训 Answer Agent固定 Manager 两阶段奖励都是 EM1 / 0,无人工标注 图:按论文 Figure 2 与 Algorithm 3–5 重绘;Stage 1 与 Stage 2 共享同一个记忆库,训练时才交替进行。
图 1(据论文 Figure 2 / Algorithm 3–5 重绘):上两条是推理时全程;下一条是训练时的两阶段奖励回路。
展开说明 ▸
  • 写记忆一侧完全不看问题:Manager 只决定这一轮的信息怎么并进记忆库。这让记忆库可以在对话进行中不断演进。
  • 用记忆一侧固定取 60 条,蒸馏发生在 Answer Agent 的生成里(Algorithm 4 第 8 行写的是「输出 Mdistill, â」),不是单独一个检索器。
  • 训练交错:Manager 训练时 Answer Agent 冻结只做评分;Answer Agent 训练时 Manager 固定,保证记忆输入稳定。两者不会同时更新,论文把这种解耦解释为稀疏奖励下的稳定性选择。
  • 为什么没有箭头从答案回到 Manager:推理时不存在这种回传;只有训练时,这个信号才会通过 Ranswer 变成 Manager 的策略梯度。

冷启动的那一步常常被略过

在训 Manager 的那份数据里,Mold 是用 GPT-4o-mini 根据前若干轮先建好的(算法 1 第 5 行,前 50 轮;B.2 节写前 24 轮),而不是让待训练的 Manager 自己滚出来的。所以训练时 Manager 面对的是一个质量尚可的初始记忆库;评测时它要自己持续演进记忆库,存在一定的分布差 推断(由 Algorithm 1 第 5 行「前 50 轮由 GPT-4o-mini 预建」与 Algorithm 3 评测时「逐轮自建」的流程差推出;论文没有就这一点单独分析)。

06

相对 Mem0 大幅领先;与 SFT、MemoryOS 的差距揭示真正的贡献

读 Table 1 的整体数(LLaMA-3.1-8B / Qwen-2.5-7B),并区分「RL 的贡献」和「整套框架的贡献」。

下面是 Table 1 中两个 backbone 的整体(Overall)数字,去掉细分题型的列,数字原样照抄。

模型方法F1 ↑B1 ↑J ↑
LLaMA-3.1-8BLoCoMo (RAG)11.418.7113.62
A-Mem29.2024.4044.76
Mem030.4122.2245.68
MemoryOS35.0427.9948.20
Memory-SFT42.8132.9858.76
Memory-R1-PPO41.0532.9157.54
Memory-R1-GRPO45.0237.5162.74
Qwen-2.5-7BLoCoMo (RAG)8.977.2712.17
Mem030.6123.5553.30
MemoryOS34.6429.3651.26
Memory-SFT39.5130.8461.13
Memory-R1-PPO41.7233.7059.53
Memory-R1-GRPO43.1436.4461.51

数据来源:论文 Table 1「Overall」列,原样照抄。两行 tr.best(高亮)为 Memory-R1-GRPO:两个 backbone 上的 F1、B1、J 均为本表最高。

零样本迁移

只在 LoCoMo 上训,直接搬到 MSC / LongMemEval

Fig. 4 / Table 4 / Table 5(LongMemEval,LLaMA-3.1-8B)显示,只在 LoCoMo 上训、零样本搬到 LongMemEval,GRPO 的 Overall 为 F1/B1/J = 45.2 / 39.3 / 55.4,BASE 为 31.3 / 25.0 / 44.2,相对提升分别 +44.4% / +57.2% / +25.3%(+14.09 / +14.30 / +11.20 点)。这里零样本(不重训)有原文背书。

消融里的「加乘」现象:更好的 Manager 让 Answer Agent 的收益翻倍数据来自图 6 的正文描述

论文比较了 Answer Agent 的 RL 增益(Figure 6 正文,均为相对无 RL 的绝对点,不是百分比):配 LLaMA-3.1-8B Manager 时为 F1 +10.10 / B1 +10.81 / J +5.05,换成更强的 GPT-4o-mini Manager 后变为 F1 +19.72 / B1 +18.19 / J +15.76。记忆库质量越好,回答侧同样的 RL 能榨出更多收益——论文的原话是 "Memory-R1 compounds benefits"。

其余消融(Figure 5 (a,d) 与 §4.4 正文,GRPO):去掉 Manager 的 RL,F1/B1/J 从 41.0/32.9/57.5 掉到 37.5/30.6/52.9(注意这里的起点是 PPO 的 full pipeline 数,原文两段对照的分别是 PPO 与 GRPO,不能混用);去掉 Answer Agent 的 RL,GRPO 为 33.0/24.9/59.9(full pipeline 为 45.0/37.5/62.7);去掉蒸馏,从 45.0/37.5/62.7 掉到 41.0/34.4/60.1。每一块都必要。

一个值得警惕的奖励设计

Table 2 对比了两种 PPO 奖励(同一个 PPO Answer Agent,只换奖励模型):用 LLM-as-a-Judge 分数当奖励,得到 F1 33.69 / B1 23.36 / J 63.58;用 EM 当奖励,得到 F1 41.05 / B1 32.91 / J 57.54。J 奖励让 J 高 6.04 点(相对 +10.5%),却让 F1 低 7.36 点、B1 低 9.55 点。论文的解释很直白:judge 奖励鼓励长篇、描述性的回答,而这与字符串重叠指标天然冲突(同一个「yes」,描述版在 F1/BLEU-1 上被罚)。论文最终选 EM,理由是三项指标更均衡。

07

结论集中在对话一侧:端到端训练、多模态都没有覆盖

论文自己和表格里显式暴露的边界;判断它能不能用在你自己的 Agent 上。

边界一

只覆盖对话类长程记忆

论文 Limitations 原话:评测聚焦对话为中心的基准。MSC、LongMemEval 也是对话数据;代码、工具、文档这类持续演进的任务没有测。多模态记忆则超出本文范围。

边界二

分阶段训练是「必要但更绕」

为了稀疏奖励下的稳定,两个 Agent 必须分开训,这让流程不再端到端,也无法让两者在训练中互相适应。论文把端到端多智能体 RL 列为未来工作。

边界三

没有「重要性」信号,也没有长时漂移的评测

Manager 的动作空间里没有「重要性」维度,四种操作写死;Answer Agent 固定取 Top-k,蒸馏只在生成里发生。论文的奖励只看单题 EM,对跨月、跨年的策略漂移、记忆库膨胀没有讨论;延迟方面(Appendix G):LLaMA-3.1-8B 上 Manager 的 p50 在 1.98–2.17 s 之间,Answer Agent(GRPO)p50 0.34 s、p95 0.67 s(base 为 0.65 s / 3.07 s)。

一句话:Memory-R1 证明的是「写记忆」和「用记忆」这两个中间决策都可以用结果信号训出来,并且互惠(更强的 Manager → 更大的 Answer Agent 增益);它没有证明这套框架适用于对话之外的场景,也没有给出端到端的训练方法。读者把它搬到自己的 Agent 上时,最需要先回答的是:你的「记忆操作」能不能被一个下游 QA 的 EM 奖励可靠地评出来。