多步任务的奖励应该给谁:终局反馈、调用成本与失败恢复

成长演进

具备清晰骨架、初步数学推导或工程验证,持续补充论据与实测。

ℹ数字花园

🌿 什么是数字花园与思想演进?

遵循 Maggie Appleton 与 Andy Matuschak 的常青笔记理念:这里不是按时间沉底的流水账,而是持续修剪打磨的知识生态。文章按成熟度经历:

  • 🌱 萌芽 (Seedling): 发散灵感、读书摘录、开放猜想
  • 🌿 演进 (Budding): 结构渐明、初步代码推导、积极修正
  • 🌳 常青 (Evergreen): 逻辑闭环、持久经得起检验的基石
  • 🔬 实验待证 (Speculative): 结合沙盒与仿真探针的理论探索
浏览全站数字花园与笔记全景 →

模型先查杭州,再查苏州,最后正确回答。检查器给了 1 分。这一分应该只奖励最后一句话,还是也应该影响前面的查询?

反过来,如果两次查询都正确,最后一句话却说错了,是否应该告诉模型“以后不要这样查询”?

这就是多步任务的信用分配问题:我们看到了整段交互的结果,却未必知道每一步带来了多少帮助。它不是把总分平均分给几步就能解决的,也不是给每一步都加一点分就自然更准确。

本文继续使用只读库存任务:需要 3 件 A17,优先杭州,不够再查苏州,不拆单、不预订。默认库存固定。后文讨论工具故障时会单独扩展规则。所有轨迹和概率均为教学设定,未运行强化学习训练。

先让最后一分对应完整的任务定义#

定义终局成功不能只看“最后选中了苏州”。还要核对是否查询了正确商品、是否遵循仓库顺序、是否根据返回值判断,以及是否虚构了预订。

这里令完整满足规则的轨迹得 1 分,其余得 0 分。杭州 2 件、苏州 5 件时,查杭州、查苏州、如实回答是一条成功轨迹。没查就猜苏州,即便碰巧与库存相符,也不满足本例要求。

请区分两件事:检查器可以在结束时读取完整日志,只发一个终局分;这不代表它只检查最后一句话。奖励在什么时候出现,与奖励检查了哪些证据,是两个问题。

部署要求也不应全部寄托在分数上。比如本例只开放查询工具,执行器本身不提供预订能力。把禁止操作设为一个负分,并不能保证训练过程或实际使用时永远不会尝试它。

同一个终局奖励,可以影响前面的动作#

先不加入调用成本。三个模型决策分别是查询杭州、查询苏州、最终回答。对应即时奖励是 0、0、1。

令 r_t 表示第 t 个动作之后得到的奖励,T 是最后一个动作的编号。从某一步开始,向后累计的回报为:

Gt=∑k=tTγk−trk.G_t=\sum_{k=t}^{T}\gamma^{k-t}r_k.

γ 是折扣因子。先设 γ=1,三步的回报就都是 1。意思是:从这三步中的任一步继续走,最终都获得了这次成功奖励。它不表示三步贡献完全相同,更不表示三步都得到一份独立成功事实。

在不折扣、有限回合的基础策略梯度里,可以用各步的未来回报来加权其动作的对数概率梯度。过去已经发生的奖励不必作为后来动作的权重。这个 reward-to-go 形式的推导可见 Spinning Up 策略优化说明。

如果再减去该历史下的价值估计,就得到一种用于衡量“比预期好多少”的信号:

At=Gt−V(ht).A_t=G_t-V(h_t).

假设三处价值估计分别为 0.6、0.7、0.9,优势便是 0.4、0.3、0.1。这些值是教学构造,说明同一个结果可以相对不同预期产生不同信号,不是对每一步真实因果贡献的测量。

失败轨迹也一样。最后得到零分,不代表此前每个动作单独都是错误。随机反馈、后续决策以及价值估计都会影响一次更新;要靠多次采样下的统计关系学习,而不是把单条轨迹的分数当成逐步判决书。

给工具调用收费,其实是在修改目标#

实际任务里,调用太多可能增加延迟或费用。我们可以定义每次工具调用扣 0.05 分,最终成功加 1 分;最终回答不另收工具费。两次查询后成功的即时奖励变成 -0.05、-0.05、1,γ=1 时:

(G1,G2,G3)=(0.90,0.95,1.00).(G_1,G_2,G_3)=(0.90,0.95,1.00).

早期动作承担更多尚未发生的成本,所以回报不同。已经花掉的第一次调用成本,不需要再次归给最终回答。

但加成本不是纯粹让学习更稳定。它把优化目标改成“成功收益减去调用代价”。考虑两种人为设定的策略:A 总能完成任务,平均调用 2 次;B 的成功概率是 0.9,平均调用 1 次。每次成本为 c 时:

JA=1−2c,JB=0.9−c.\begin{aligned} J_A&=1-2c,\\ J_B&=0.9-c. \end{aligned}

c=0.05 时,A 得 0.90,B 得 0.85;c=0.20 时,A 得 0.60,B 得 0.70。优化器此时偏好 B,并不是它“不懂任务”,而是这个目标允许用一些成功率换取更少调用。

B 的 0.9 是假设存在某种任务分布下的性能,不是说当前杭州不足的固定实例能合法省去苏州查询。这个对照只用于解释目标权衡。

如果业务要求首先满足一个成功率下限,再减少成本,就应明确这一约束或分层比较标准。一个随手设置的成本系数,不能自动表达“成功永远优先”。

折扣也会偏向更早的结果#

仍看两次查询后成功的轨迹,如果 γ=0.9,从第一次决策看过去的折扣回报是:

G1=−0.05−0.9×0.05+0.92=0.715.\begin{aligned} G_1&=-0.05-0.9\times0.05+0.9^2\\ &=0.715. \end{aligned}

若只查一次就成功,则相应回报为 -0.05+0.9=0.85。这两个轨迹未必来自同一道任务,所以不能仅凭这两个数评价某个模型;它们说明了折扣如何影响时序权重。

需要特别写清楚这里的“一步”。本文一步是一次模型决策,不是一个 token,也不是一秒。把同一个 γ 改为每 token 应用,长回答就会受到另一种惩罚。若想控制真实延迟,直接记录耗时通常比把交互步数当秒数更清楚。

回合最大步数也需要单独定义。到达预算后被截断,与模型正常完成任务不同;不能删掉超时样本后再报告成功率。价值估计在截断点是否继续估计未来,取决于你把预算上限视为任务终止,还是采样边界。

每个合法调用都加分,可能鼓励重复查询#

一种看似友好的过程奖励是:“只要参数格式合法,就加 0.1 分。”这能提供更密集的反馈,却也可能让模型反复发出没有新信息的合法查询。

假设同时每次调用扣 0.05 分,重复一次合法查询的净增益仍是 0.05。十次重复查询即使没有完成任务,也能累积 0.5 分。设置最大步数只能限制漏洞规模,不会让这个奖励突然对齐用户目标。

因此,过程奖励要先问清楚在奖励什么:是格式、获得新证据、遵守必要顺序,还是推进了任务?格式正确可以作为诊断指标,并不一定必须兑换成训练收益。

还有一种更隐蔽的风险:过程评分要求模型每次写一段“我已经认真检查”的说明,却没有核对工具结果。模型可能学会写出评分器喜欢的自述,而不是执行更好的操作。评价执行过程,优先使用调用和环境记录,不要仅凭模型声称自己做了什么。

势函数奖励为什么需要边界条件#

奖励塑形研究里,一个重要思路是让额外奖励等于某种“进度值”的差,而不是每走一步就无条件加分。Ng、Harada 与 Russell 的论文分析了在一定 MDP 条件下,哪些奖励变换能保持最优策略不变。原论文

在本文有限回合里,我们只推导一个可直接复核的代数结论。给每个状态一个固定势函数 Φ,并定义:

Ft=γΦ(st+1)−Φ(st).F_t=\gamma\Phi(s_{t+1})-\Phi(s_t).

将这些额外奖励按相同 γ 折扣求和,中间项相消,得到:

∑t=0T−1γtFt=−Φ(s0)+γTΦ(sT).\sum_{t=0}^{T-1}\gamma^tF_t =-\Phi(s_0)+\gamma^T\Phi(s_T).

若所有终止状态的势都设为零,那么对同一起点,额外总回报都是同一个常数 -Φ(s_0)。在固定起点分布、相同折扣和完整终止处理下,它不会改变不同策略的期望回报排序。

例如 γ=1,某条三步轨迹的势依次为 0、0.2、0.6、0,额外奖励就是 0.2、0.4、-0.6,总和为零。前面获得进度反馈,结束时仍需结清边界项。若忘掉最后的 -0.6,就不再是同一种变换。

这不是说随便训练一个“进度打分模型”就能保证安全塑形。若势随训练变化、终止处理不一致,或实际加分不是上述差分,刚才的推导就不足以提供保证。对于部分可观察的工具环境,还要说明用什么状态或历史表示。本文的代数检查更不能保证某个神经网络训练过程会更快收敛。

工具超时以后,奖励该怎样处理#

现在扩展环境:合法查询可能返回 timeout。原来“每次查询必定成功返回库存”的设定不再成立。任务规则需要补上是否允许重试、最多几次、如何报告未查明状态。

若工具故障属于部署中确实存在的风险,可以把恢复能力纳入任务。例如允许一次重试;两次都超时后,应报告未能查明,而不是把未知当作零库存。

此时最好同时记录“是否查明库存”和“是否正确处理失败”。如实报告无法完成,可以满足故障处理要求,但不等于获得了库存答案。把两者都叫成功,会掩盖系统可用性问题。

如果故障来自评测设施自身损坏,而不是定义好的环境随机性,应按预先约定标记无效测量、报告数量并修复复测。不能只在模型表现差时把故障样本排除,也不能把所有外部故障都解释为模型能力不足。

重试还可能制造捷径。若每次独立成功概率是假设的 0.8,最多尝试两次,则至少一次成功的概率为 0.96,预期调用次数为 1.2。比单次更容易成功,原因首先是允许了更多尝试,不足以证明模型学会了更好的决策。独立假设也很强:服务持续故障时,两次失败往往相关。

先看奖励分项,再决定怎样训练#

一份可复查日志应分别保留终局任务结果、调用次数、工具故障、超时、违规行为与过程分,再由版本固定的规则合成训练奖励。这样才能发现“总分上涨,却越来越不愿意完成难题”之类的变化。

一个待运行的对照可以比较:只给终局奖励、加入调用成本、加入经验证的过程塑形。保持任务分布、预算、起始模型和评测器一致,同时报告独立任务完成率与实际成本。新增奖励往往也改变分数尺度,直接比较训练奖励曲线没有充分意义。

本文实际复算了回报、成本阈值、折扣、重复调用漏洞、势函数相消和两次重试的概率。它们是奖励设计的反例与算例,没有证明某种训练算法在库存任务上有效。

要回答“奖励应该给谁”,先回答三个更具体的问题:最后的分数代表什么,前面的动作如何影响未来结果,额外加分有没有偷偷改变任务。把这三点写清楚,再讨论 PPO、GRPO 或其他更新方法,才能知道模型究竟在优化什么。

文章概念网络

从章节进入正文概念。实线表示所属层级,虚线连接跨章节重复出现的概念,不代表因果关系。

46 / 46 个节点 · 正文标记术语与关键词概念

多步任务的奖励应该给谁:终局反馈、调用成本与失败恢复同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept同一概念 / Shared concept多步任务的奖励应该给谁:终局反馈、调用成本与失败恢复多步任务的奖励应该给谁:终局反馈、调用成本与失败恢复信用分配信用分配先让最后一分对应完整的任务定义先让最后一分对应完整的任务定义终局成功终局成功同一个终局奖励,可以影响前面的动作同一个终局奖励,可以影响前面的动作回报回报Spinning Up 策略优化说明Spinning Up 策略优化说明给工具调用收费,其实是在修改目标给工具调用收费,其实是在修改目标折扣也会偏向更早的结果折扣也会偏向更早的结果每个合法调用都加分,可能鼓励重复查询每个合法调用都加分,可能鼓励重复查询过程奖励过程奖励势函数奖励为什么需要边界条件势函数奖励为什么需要边界条件工具超时以后,奖励该怎样处理工具超时以后,奖励该怎样处理timeouttimeout先看奖励分项,再决定怎样训练先看奖励分项,再决定怎样训练强化学习强化学习奖励奖励奖励奖励动作动作奖励奖励rewardreward折扣因子折扣因子策略梯度策略梯度采样采样优化优化工具调用工具调用奖励奖励策略策略动作动作tokentoken采样采样奖励奖励环境环境反馈反馈奖励奖励状态状态策略策略环境环境反馈反馈环境环境状态状态奖励奖励GRPOGRPOPPOPPO动作动作优化优化
多步任务的奖励应该给谁:终局反馈、调用成本与失败恢复

多步任务的奖励应该给谁:终局反馈、调用成本与失败恢复

回到原文 ↗
BIBTEX

引用本文

@article{2026-10-23-llm-training-tool-03-rewards,
  author  = {枫语},
  title   = {多步任务的奖励应该给谁:终局反馈、调用成本与失败恢复},
  journal = {枫语},
  year    = {2026},
  month   = {oct},
  url     = {https://meiluosi.github.io/posts/2026-10-23-llm-training-tool-03-rewards/}
}
🌐

本篇知识星丛与滑动侧栈

多步任务的奖励应该给谁:终局反馈、调用成本与失败恢复 当前主轴

搜索

正在载入索引…