核验器才是产品;生成器只是一个提议分布。
本节中的每一种搜索方法最终都落到一个选择器上。当这个选择器是一个学到的奖励模型而非投票时,你得到的就是核验器引导的搜索:由结果奖励模型(ORM)或过程奖励模型(PRM)所引导的 best-of-N 重排、束搜索或树搜索。本文对比 ORM 与 PRM,说明各自接入搜索的位置,并捍卫那个核心论断——核验器的质量是一切的上限。
两种奖励形状:结果型与过程型。
ORM 给一条已完成的轨迹打分:对最终答案是否正确给一个标量。标注便宜(你只需要结果标签),与 best-of-N 天然兼容,但对轨迹在哪里走错一无所知,因而无法给出搜索中途用于剪枝的信号。PRM 给每一步打分:对部分轨迹给出逐步的正确性估计。它能支持剪枝与束搜索,因为你可以给部分状态排序,但步级标签收集起来昂贵且噪声大(在一条最终走向错误答案的推导里,什么算"正确的一步"?)。2025 年的趋势是生成式核验器——GenPRM/ThinkPRM 风格的模型在给某一步打分前先对该步进行推理,降低标注数据负担,并在束搜索下胜过判别式 PRM。
核验器接入的位置。
# Best-of-N with an outcome verifier (ORM) cands = [model.sample(q) for _ in range(N)] best = argmax(cands, key=lambda c: ORM.score(q, c)) # Beam search with a process verifier (PRM) beam = [root(q)] for _ in range(DEPTH): nxt = [s.extend(t) for s in beam for t in s.expand(K)] beam = top_k(nxt, B, key=lambda s: PRM.step_score(s))
ORM 是一个螺栓在独立样本之上的纯重排器。PRM 是搜索循环内部的一个转向信号。生成器相同;是核验器决定谁能存活。
核验器即一切:不对称性论证。
核验器引导的搜索之所以有效,是因为核验往往比生成容易。best-of-N 把一个弱生成器转化为强系统,当且仅当核验器能可靠地把正确轨迹与"看似合理但错误"的轨迹区分开。生成器只需在 N 个样本里的某处对一条正确轨迹放上不可忽略的概率质量;困难的区分由核验器来做。这正是为什么在计算最优的测试时扩展下,一个小策略模型配一个好 PRM,能匹敌一个大得多却没有 PRM 的模型。其推论很残酷:你的系统恰好等于你的核验器有多好,而不是你的生成器有多好。对任何存在核验器的任务,花在改进核验器上的钱,都压倒花在改进生成器上的钱。
奖励作弊:搜索优化的是你实际写下的那个代理。
搜索是一个瞄准核验器分数的优化器,于是它会找到核验器的盲点。把 N 拉得足够高,best-of-N 就不再找最好的答案,而开始找最能糊弄奖励模型的答案——冗长、自信、表面结构良好、被 RM 过度奖励的输出。这是推理时的奖励作弊,而且它随算力增加而变本加厉,不是变好:真实准确率对 N 的曲线会上升、走平,然后在 RM 分数还在攀升的同时向下弯折。
始终画真实任务准确率(留出、真值)对 N 的曲线,而不只是平均奖励。如果准确率掉头向下而奖励还在上升,你就是在过度优化一个有缺陷的代理。修法是换一个更好/更难的核验器或收紧 N——绝不是"再加样本"。
按你实际能打分的东西来选区间。
若存在真值检查器(单元测试、SAT/LP 求解器、证明检查器、可执行规约),就用它作核验器——它在学到的 RM 会被作弊的那些方面是不可作弊的,对它跑 best-of-N 是本节最强的廉价杠杆。若只有一个学到的 ORM,优先用保守 N 的 best-of-N 并监控掉头点。只有当问题具有"早剪枝能省下真实算力"的长多步结构、且你付得起步级打分调用时(每个束步要付 K 次生成器 + K 次核验器调用),才动用配束/树搜索的 PRM。如果你没有可用核验器,那你做的就不是核验器引导的搜索——你做的是自一致性或什么都没有,你应当对此诚实。
只要任务允许,哪怕只是部分检查器(类型检查、几个属性测试),也优先选廉价的精确检查器而非昂贵的学到的 RM。一个 AUC 0.9 的有噪 RM 把你的系统封顶在大致那个区分力上;一个可靠的检查器则把你封顶在生成器对正确轨迹的覆盖率上——通常高得多。
诚实的取舍。
核验器引导的搜索把额外推理算力换成准确率,其兑换率恰好由你核验器的区分力决定——而一个有缺陷的核验器会把更多算力变成更多被自信地作弊出来的输出。先投核验器再投生成器,精确检查器优先于学到的检查器,并盯住准确率对 N 的曲线那个掉头点——它在说你现在优化的是代理,不是任务。