TCPO:Verifier 给的分数很稠密,但"分数"和"信用"从来就不是一回事
不知道大家有没有在训练多轮 agent 的时候遇到过这种别扭的场景:模型第一轮写了个 60 分的答案,第二轮改成 90 分,第三轮又手贱改回 60 分。你手里握着每一轮的 verifier 分数——60、90、60,信号够稠密了吧?但问题来了,第二轮那个"90"到底该奖励多少?第三轮那个"60"又该惩罚多狠?
直觉的答案是"看分数差"。但这个直觉是错的。一篇新论文(arXiv:2608.01667)把这个问题讲透了:分数衡量的是当前输出的质量,信用衡量的是这一轮对整个修正过程的贡献。这是两回事,而几乎所有现有的多轮 RL 方法都在混用它们。
核心摘要:这篇论文提出 TCPO(Turn-Level Credit Policy Optimization),把多轮 verifier 引导的 RL 中的信用分配重新定义为"分数到信用的转换"问题。方法用三类参照系来构造轮级优势——回顾历史最优的 retrospective credit、对照未来最优的 hindsight credit、以及对最不确定轮次做固定历史反事实采样的 counterfactual credit。效果上,Qwen3-4B 在 MATH-500 上 Pass@8 从 MT-GRPO 的 82.4% 提到 86.8%,DeepSeek-R1-Distill-Llama-8B 上四个任务全部压过 GVPO,且训练开销只增加 3%–5%。我的判断:这不是一个颠覆性的框架创新,但它把一个被广泛忽视的概念混淆讲清楚了,并用很干净的消融证明了"转换"这一步本身值多少钱。做 agent RL 的人都值得读。
论文信息: - 标题:TCPO: Turn-Level Credit Policy Optimization - 作者:Sicong Liao, Zhi Chen, Yaohua Tang(arXiv 页面未列出机构信息) - 提交日期:2026 年 8 月 3 日 - 链接:https://arxiv.org/abs/2608.01667
🎯 问题动机:稠密的分数 ≠ 稠密的信用
先交代一下背景。现在训练 LLM agent 的主流玩法是 verifier-guided multi-turn RL:模型生成一版答案,verifier(答案检查器、代码测试套件、环境模拟器)给个分数,模型拿着反馈再改,如此循环,直到成功或者轮数用尽。相比只看最终结果的单轮 RL,这个设置最大的卖点就是"过程反馈更丰富"。
但作者在引言里直接泼了盆冷水:更稠密的 verifier 分数,并不会自动带来更好的信用分配。
他们举了三个具体的现象,每个都很扎心:
- 保持不等于进步:某个轮次拿了高分,但它可能只是守住了上一轮已经修好的状态。给它发和"修复错误"一样多的奖励,模型就学会了摸鱼。
- 延迟贡献:某个轮次分数没涨,但它做了关键的铺垫(比如定位到了真正的 bug 位置),成功发生在两轮之后。只看即时分数变化,这一轮的贡献完全是隐形的。
- 成功后退化:答案已经对了,模型又"优化"了一把,把对的改错了。trajectory-level 的方法把最终成功广播到所有轮次,等于连这个帮倒忙的家伙一起奖励了。
再看现有方法,个个都有盲区。trajectory-level 方法(比如经典 GRPO 直接搬过来用)把最终奖励撒给整条轨迹,失败尝试、有效修复、成功后退化混在一起发;直接拿逐轮分数当优势,奖励的是状态质量而不是边际贡献;看相邻轮次分数差的,既不知道当前状态有没有超过历史最优,也看不到未来的回报。
说实话,这个问题我之前在做代码修复 agent 的时候也隐约感觉到过——reward 曲线在涨,但仔细看轨迹,模型学会了"别乱动"而不是"会修复"。看到这篇论文把 preservation、regression、delayed repair 三种轮次类型明确拆开,还是挺有共鸣的。
🏗️ TCPO 怎么做:三个参照系翻译分数
TCPO 的核心思路一句话讲完:每一轮的 verifier 分数只是一个观测值,要通过和"参照物"比较才能变成信用。作者用了三个参照系,分别对付三类不同性质的轮次。

图1:TCPO 的完整流水线。上半部分是多轮 rollout——同一个 prompt 采样多条轨迹,每个节点标注 verifier 分数,橙色节点是高 surprisal 轮次,粉色虚线圈出被选中做反事实分支的轮次,绿色虚线圈出"非改进轮次组"。中间部分是三个信用计算模块:retrospective(和历史最优比)、hindsight(和同组非改进轮次的未来最优比)、counterfactual(固定历史,换输出重采样)。下半部分是统一信用公式、组内归一化加 early-turn 衰减,最后把轮级优势广播到该轮所有 token,用 GRPO 式裁剪目标优化。
设定:固定预算 rollout
形式上,给定 prompt \(x\),第 \(i\) 条轨迹第 \(k\) 轮的状态是 \(s_{i,k}=(x,\ T_{i,<k},\ F_{i,<k},\ E_{i,k})\)——之前所有轮次的 transcript、verifier 反馈、以及外部环境快照(数学和代码任务里这个 \(E\) 是空的,AppWorld 里是模拟器状态)。模型采样输出,verifier 返回归一化分数 \(r_{i,k}\in[0,1]\)。
有个细节很妙:训练时即使提前成功,rollout 也强制跑满 \(K\) 轮。这是故意让成功后的保持和退化行为暴露在训练信号里——如果一成功就停,regression 这种现象在训练数据里根本不会出现,模型永远学不会"对的别乱动"。这个设计我觉得很聪明,成本也不高。
参照系一:Retrospective Credit——和历史最优比
先定义历史最优分数 \(m_{i,k}=\max_{t \lt k} r_{i,t}\) 和进步量 \(\Delta_{i,k}=[r_{i,k}-m_{i,k}]_{+}\),然后:
三项各管一件事:超越历史最优给进步奖励;已经成功且守住了历史最优给保持奖励(\(\alpha_0\) 项);成功后把分数改低了就罚。注意这里比较的对象是历史最优而不是上一轮——这是和"相邻分数差"方法的关键区别。上一轮 60 分、这轮 90 分,如果历史最优本来就是 90,那这轮只是"恢复",不是"进步",奖励应该打折。
但这个参照系有个结构性盲区:对于还没成功、且没有即时进步的轮次,三个项全是零。这类轮次的贡献只能等未来揭晓——这就是第二个参照系存在的理由。
参照系二:Hindsight Delayed Credit——和未来最优比
对于成功前没进步的轮次(用门控 \(b_{i,k}=\mathbf{1}[m_{i,k}\lt\tau]\,\mathbf{1}[\Delta_{i,k}=0]\) 筛出来),TCPO 回头看这条轨迹在第 \(k\) 轮之后达到的最好分数 \(u_{i,k}=\max_{t\geq k}r_{i,t}\),然后和同 prompt、同轮次索引、同样"没进步"的其他轨迹的未来最优做留一比较:
翻译成人话:同样是在第 3 轮原地踏步,别人的轨迹后来修到了 95 分,你的只修到 70 分,那你这轮"原地踏步"的质量就是比人家差。这其实就是 GRPO 组内相对比较的思想,只不过被挪到了"轮次类型对齐"的切片上做。完全复用已有 rollout,不花一分额外的 verifier 调用。
当然这个信号是间接的——它比较的是不同轨迹的已实现未来,可能把后续修正的功劳或锅错安在当前轮头上。作者自己也承认这一点,所以才有了第三个参照系。
参照系三:Selective Fixed-History Counterfactual——固定历史,换个答案重问
最模糊、最难归因的轮次,值得花真金白银做反事实估计。但全做太贵,怎么办?TCPO 用平均 surprisal(当前轮输出在旧策略下的负对数概率均值)当"信用模糊度"的代理指标,每个 prompt 只挑 surprisal 最高的 \(L\) 个合格轮次(数学 \(L=5\),代码和 AppWorld \(L=10\)),对这些轮次固定住完全相同的历史 \(h_{i,k}\),重采样 \(M=8\) 个替代输出,分别送 verifier 打分:
原始输出比替代品的平均分高多少,就是这一轮的真实贡献。有状态的环境(AppWorld)里,所有替代输出都从同一个前轮模拟器快照出发评估,评完恢复现场——保证比较是严格受控的。
两个设计选择值得说说。一是只做一步 verifier 比较而不是完整反事实 rollout,刻意隔离"当前输出"这一个变量的效应;对二元精确匹配的 verifier 这是保守的——原始输出和替代品全挂,信号就是零,正信用留给 hindsight 补。二是有个非退化门控:只有当替代输出的分数方差大于零时才用反事实覆盖 hindsight 估计,否则回退。不会出现"反事实全失败把 hindsight 的正信号洗掉"的事故。
组装与优化
最终轮级信号是三部分的加权和,组内归一化后乘一个 early-turn 先验 \(\gamma^{k-1}\):
早轮次的信用被放大,鼓励模型尽早做有用的修复而不是拖到最后一轮。然后把这个轮级优势广播到该轮响应的所有 token 上,套标准的 GRPO 裁剪目标训练。整个方法实际上只替换了优势估计器,优化器、采样框架完全不动——工程上接入成本很低,这点对实际落地很友好。
🧪 实验:三个领域、两种模型规模、四种 verifier
实验覆盖数学推理(MATH-500、AIME 2024–2026,训练数据 DAPO-Math-17K)、代码生成(LiveCodeBench v6、HumanEval,训练数据 TACO-Verified)和 AppWorld 交互式 agent 任务。模型用 Qwen3-4B 和 DeepSeek-R1-Distill-Llama-8B 做主实验,AppWorld 上沿用 GVPO 原设置的 Qwen2.5-32B-Instruct。框架是 verl + vLLM 异步 rollout,跑在 H200 上,每个 prompt 采 8 条轨迹,数学 3 轮、代码 5 轮。baseline 是 Base、GRPO、MT-GRPO、GVPO 四个。
主实验:全线最优或并列最优
Qwen3-4B 上的结果(Pass@8 / 平均成功轮数):
| 方法 | MATH-500 | AIME | LiveCodeBench | HumanEval |
|---|---|---|---|---|
| Base | 79.6% / 1.42 | 47.8% / 1.53 | 38.7% / 1.96 | 84.1% / 1.35 |
| GRPO | 80.8% / 1.26 | 50.0% / 1.49 | 42.2% / 1.61 | 85.9% / 1.31 |
| MT-GRPO | 82.4% / 1.21 | 48.9% / 1.37 | 43.5% / 1.42 | 86.6% / 1.23 |
| GVPO | 85.2% / 1.22 | 51.1% / 1.36 | 44.3% / 1.39 | 86.6% / 1.18 |
| TCPO | 86.8% / 1.19 | 51.1% / 1.33 | 45.1% / 1.27 | 87.2% / 1.12 |
DeepSeek-R1-Distill-Llama-8B 上的结果:
| 方法 | MATH-500 | AIME | LiveCodeBench | HumanEval |
|---|---|---|---|---|
| Base | 29.8% / 2.25 | 21.1% / 2.67 | 12.6% / 2.83 | 84.8% / 1.33 |
| GRPO | 56.6% / 1.84 | 35.6% / 2.08 | 27.9% / 2.45 | 87.2% / 1.24 |
| MT-GRPO | 59.0% / 1.71 | 35.6% / 1.92 | 30.3% / 2.21 | 87.2% / 1.19 |
| GVPO | 62.8% / 1.62 | 36.7% / 1.87 | 31.8% / 2.13 | 87.8% / 1.19 |
| TCPO | 65.2% / 1.59 | 38.9% / 1.86 | 32.2% / 2.13 | 88.4% / 1.15 |
两个观察。其一,TCPO 的提升在弱模型上更明显——8B 模型相比 MT-GRPO 在 MATH-500 上涨了 6.2 个点,而 4B 模型涨 4.4 个点。这符合直觉:基础能力弱的模型轨迹更乱,保持、退化、延迟修复的轮次更多,信用翻译的收益自然更大。其二,平均成功轮数也在降——LiveCodeBench 上从 Base 的 1.96 轮降到 1.27 轮,说明 early-turn 先验确实在起作用,模型学会了早点修对而不是来回折腾。
不过坦率地讲,AIME 上 TCPO 和 GVPO 打平(51.1%),HumanEval 这种一轮就能解决的简单任务上优势也只有零点几个点。TCPO 的价值和多轮轨迹的"混乱程度"是绑定的,轨迹越短越干净,信用翻译的空间越小。这个趋势论文没明说,但数据里看得很清楚。
AppWorld:长程 agent 任务也成立
AppWorld 上是真正的状态型环境,verifier 是模拟器状态检查,TCPO 对比 GVPO(TGC/SGC,越高越好):
| 方法 | Dev TGC | Dev SGC | Test-N TGC | Test-N SGC | Test-C TGC | Test-C SGC |
|---|---|---|---|---|---|---|
| GVPO | 84.2 | 73.7 | 72.6 | 55.4 | 49.4 | 28.8 |
| TCPO | 88.3 | 75.0 | 74.4 | 57.1 | 49.9 | 28.8 |
Dev TGC 涨了 4.1 个点,Test-N 上 TGC/SGC 双升,Test-C 上 TGC 微升、SGC 持平。提升幅度不如数学代码,但考虑到 AppWorld 的轮次更长、环境状态更复杂,能在不换 backbone 不换数据的情况下稳定压过 GVPO,说明这套信用翻译对"真环境"也是有效的。Test-C(挑战集)的 SGC 卡在 28.8 没动,也说明难场景下信用分配不是唯一的瓶颈。
消融:每一刀都割在点子上
这张表是我觉得全文最值钱的部分(DeepSeek-R1-Distill-Llama-8B):
| 变体 | MATH-500 | LiveCodeBench |
|---|---|---|
| Trajectory 奖励 | 56.6% | 27.9% |
| 逐轮原始分数 | 59.0% | 30.3% |
| 相邻分数差 \(\Delta\) | 59.8% | 30.4% |
| Retrospective(进步+保持+退化) | 62.2% | 31.5% |
| Retro + Hindsight | 63.4% | 31.7% |
| TCPO 完整版 | 65.2% | 32.2% |
这条阶梯特别漂亮。从轨迹奖励到逐轮分数,涨 2.4 个点——这是"稠密化"本身的价值;从逐轮分数到相邻差,只涨 0.8——局部差分几乎没提供更多有效信息,这直接打脸了"看分数变化就够了"的直觉;换到和历史最优比较的 retrospective,一下涨 2.4 个点;hindsight 补延迟贡献再涨 1.2;反事实精修再涨 1.8。每个组件都有独立贡献,而且贡献的排序和论文的叙事完全自洽。这种消融做出来是需要点诚意的——很多论文的消融第二个组件就开始不涨分了。
反事实预算:钱花在哪比花多少重要
| 变体 | MATH-500 Pass@8 | 训练开销 | LCB Pass@8 | 训练开销 |
|---|---|---|---|---|
| No-CF | 63.4% | 1.00× | 31.7% | 1.00× |
| 随机选轮次做 CF | 63.4% | 1.03× | 31.8% | 1.05× |
| TCPO(Top-L 高 surprisal) | 65.2% | 1.03× | 32.2% | 1.05× |
| All CF(全部合格轮次) | 66.8% | 1.11× | 33.1% | 1.16× |
| CF-Aug(反事实样本也拿去训练) | 69.2% | 1.25× | 34.5% | 1.33× |
随机选轮次的对照组是点睛之笔:同样的反事实预算,随机选几乎零增益(63.4→63.4),高 surprisal 选择涨 1.8 个点。这证明了关键不是反事实计算本身,而是把预算花在最不确定的轮次上。同时也留下了上限空间——All CF 和 CF-Aug 还能再涨 1.6 到 4 个点,只是开销到了 1.11×–1.33×。默认配置选在 1.03×–1.05× 这个价位,是个很务实的工程权衡。
分析图:信用分配确实长成了设计的样子

图2a:按轮次类型统计的平均归一化信用。改进轮次拿到接近 1.0 的最高正信用,保持轮次拿到小幅正信用,延迟修复轮次也有正信用,而退化轮次吃到接近 -1.0 的惩罚。MATH-500 和 LiveCodeBench 两个任务上的分布形态一致。

图2b:成功轨迹上,Turn 1 的平均信用约 0.8–1.0,Turn 2 降到 0.65 左右,Turn 3 进一步降到 0.4–0.55——越早的修复轮次信用越大,和 early-turn 先验的设计意图吻合。

图2c:相对饱和性能随训练轮数的变化。MATH-500 大约 3 轮就饱和,LiveCodeBench 约 5 轮到平台期,AppWorld 从 1 轮的约 84% 一路爬到 20 轮才到 100%。这解释了为什么数学设 3 轮、代码设 5 轮——不是拍的,是按饱和点选的。
🤔 我的判断
这篇论文最值钱的地方,是把"score ≠ credit"这个概念混淆从工程直觉提升成了明确的问题定义。做多轮 agent RL 的人多少都踩过这些坑——成功后被改坏的答案没人罚、原地踏步的轮次信号为零——但把它们系统性拆开、分别配一个参照系、再用消融逐一证明每个参照系值多少分,这是第一次有人做得这么干净。
方法层面,说实话三个组件单拎出来都不算新:和历史最优比是 best-so-far 差分,hindsight 是 GRPO 组内基线在轮次切片上的挪用,反事实重采样是经典操作。真正的贡献在"组装逻辑"——每个组件精确覆盖一类轮次,互相之间用门控隔离,不重叠不冲突。这种设计品味比单点创新更难能可贵。
批判的话也说几句。一是 surprisal 作为"信用模糊度"的代理终究是个启发式——高 surprisal 的轮次可能只是模型在胡说八道,不一定是归因最模糊的轮次;随机对照实验证明了它有效,但没有和"按 verifier 反馈长度/类型选择"等其他代理比较过。二是反事实对二元 verifier 的保守性问题:精确匹配场景下,原始输出和替代品全挂时信号为零,这种"全都是错但错得不一样"的轮次恰恰可能是信息量最大的。三是 AIME 上和 GVPO 打平、HumanEval 上优势微弱,说明收益和任务的多轮混乱程度强相关——如果你的场景轨迹本来就短而干净,这套东西的收益会打折。
工程建议:如果你已经在用 GRPO 系的多轮 RL,TCPO 的接入成本几乎就是换一个优势估计函数,3%–5% 的额外开销换 2–6 个点的 Pass@8 提升,这笔账怎么算都划算。哪怕不整个照搬,"retrospective 和历史最优比而不是和上一轮比"、"成功后强制跑满轮数暴露退化行为"这两个点,单独拎出来用也是稳赚的。
信用分配这个老问题,在多轮 agent 时代有了新的形状。这篇论文未必是终局,但它把问题的形状描清楚了——这往往比给一个答案更有价值。
觉得有启发的话,欢迎点赞、在看、转发。跟进最新AI前沿,关注我