LLM 输出差异:何时进行单次定向重试才值得
对于相同的输入,45% 的 LLM 输出会发生变化。本文介绍如何将这种差异性转变为一次性重试,从而在不耗尽重试预算的情况下恢复质量。
重试一个已经返回了有效答案的 LLM 调用听起来很浪费。大多数情况下确实如此。但我们在一个生产环境的翻译流程中测量到的一些数据改变了我们的想法:当我们用相同的模型、相同的提示和相同的输入重新生成 55 个已接受的输出时,其中 25 个返回了不同的结果。对于本应确定的答案,这相当于 45% 的差异率。本文探讨的是一个特例,在这种情况下,差异性可以成为一种资源:一种一次性的、有条件限制的重试,可以恢复真正的质量。同时,本文也探讨了在启用此功能前必须围绕其设计的两种故障模式(结果覆盖和预算耗尽)。
测量结果:在输入完全相同的情况下,45% 的输出发生了变化
所讨论的流水线用于填充一个多语言术语表。一个批处理生成器向两个大语言模型 (LLM) 请求医疗美容术语的翻译,一个共识步骤对它们进行比较,一个反向翻译检查步骤验证其含义。通过所有关卡的输出会被存储为已确认的条目。
在一次审查中,我们删除了 55 个已确认的中文条目,然后再次运行了完全相同的生成过程。提示词没有变,模型没有变,temperature 参数也没有变。第二次运行的结果仅在 30 个条目上与第一次相同。另外 25 个条目返回了不同的表层形式。
这些差异并非随机噪声。它们可分为三组:
- 格式漂移:
capitalization(大小写)、空格以及同义词级别的替换,任何规范化工具都会将其视为相同。 - 真正的改进:对于某个设备,第一次运行时保留了英文品牌名未作处理,而第二次运行则生成了当地市场已确立的名称。
- 真正的退步:第二次运行丢弃了正确的本地名称,转而退回使用英文品牌名。
第二组和第三组是值得关注的。它们是同一现象,但指向相反的方向。对于长尾品牌术语,模型并不能可靠地知晓其在当地市场的名称。它有时能生成,有时则不能,两种情况都有不可忽略的概率。从该分布中抽取的单个样本并非模型的最佳答案。它只是一次抽样结果。
一旦你将生成过程看作是从一个分布中进行抽样,关于重试的问题就变了样。问题不再是“我应该信任模型吗”,而是“对于哪些输出,第二次抽样可能会优于第一次,以及我如何低成本地识别出它们?”
仅在违反可检查属性时重试
对所有内容进行重试会使成本翻倍,但收益几乎为零:对于 30 个稳定条目,第二次抽取会返回相同的结果;而对于不稳定的条目,你无法知道哪次抽取更好。盲目重试会将方差转化为流失。
解决方法是找到一个具有以下特性的属性:
- 无需再次调用 LLM 即可确定性地检查。
- 与“第二次抽取可能更好”高度相关。
- 测试成本足够低,可以对每个输出进行测试。
在我们的案例中,这个属性是书写系统不匹配。中文术语表条目通常应包含汉字。中国的美学市场甚至会为进口品牌设备创造本地名称,因此,一个中文槽位只包含拉丁字母字符串通常意味着“模型在这次抽取中没有检索到本地名称”,而不是“不存在本地名称”。一个纯函数可以测试这一点:遍历代码点,计算汉字与拉丁字母的数量,无需网络连接。
因此,重试的门槛变成了:在完整的验证链通过后,如果一个中文槽位接受的输出仅包含拉丁字母,则重新生成该槽位一次,并附上一条额外指令:“如果存在已确立的本地市场汉字名称,则优先使用;对于没有本地名称的品牌,保留原始名称。”
这里有两个细节很重要。首先,重试会复用与原始尝试相同的生成、共识和验证流程。跳过验证的重试不是重试,而是绕过。其次,新增的指令是附加在基础提示词之后,而不是替换它,这样重试与第一次抽取的区别就只有一点。你希望这种差异是可归因的。
在实时数据上的结果是:一个填充品牌槽位首次返回的是原始英文品牌名,在重试后返回了正确的汉字市场名称。重试后仍为拉丁字母的槽位绝大多数是那些不存在既定本地名称的小众品牌,这正是你希望留下的那部分。运行后,约 11% 的新填充中文槽位仍仅包含拉丁字母,这些槽位会被标记以供审查,而不是静默通过。
绝不使用失败结果覆盖通过的结果
任何重试设计的第一个失败模式是覆盖。你的原始输出通过了每个门控,但重试的输出可能不会。如果你无条件地写入重试结果,一个通过的条目可能会被拒绝结果所取代,一个已填充的槽位也会变为空。这绝对比不重试更糟糕。
我们最终达成的契约是:
snapshot = copy(result) // everything the pipeline may mutate
reset(result) // back to undecided state
regenerate with reinforced prompt
run consensus + verification // same gates as the original
adopt only if:
verdict == pass
AND output now satisfies the property (contains Han)
AND output does not collide with an existing confirmed entry
otherwise:
restore(snapshot) // the passing original wins
每个条件都有其存在的意义。“通过”检查将验证权保留在其所属之处。属性检查会拒绝再次返回拉丁文的重试,因为采纳它会耗费预算却解决不了任何问题。“冲突”检查很重要,因为新的汉字名称可能会与另一个概念已确认的翻译重复;采纳它会在稍后触发流水线的重复项关卡,并使整个条目随之失效。在采纳前进行检查意味着,发生冲突的重试会静默地恢复原始条目,而不是破坏一个有效的条目。
快照必须覆盖流水线所修改的每个字段,而不仅仅是输出文本。我们的快照包含七个字段,包括判定结果、返译和相似度距离。缺少任何一个字段都意味着恢复后的条目是两次运行的混合体。
隐藏的成本:重试预算和永久性耗尽
第二种故障模式更为微妙,并且几乎在我们最初的实现中就发布了。批处理流水线通常会对每个槽位的尝试次数设置上限。我们的流水线允许三次尝试:在三次判定失败后,一个槽位会永久离开填充群体,这样有问题的输入就不会每晚都消耗 LLM 的开销。
尝试次数计数器源自审计日志的行记录。我们最初的设计将重试记录为单独的一行,这被解读为每晚增加一次尝试。一个每晚都被重试的槽位会在两晚内达到三次尝试的上限,并永久地从填充群体中移除。这个本意是用来填充更多槽位的功能,反而会悄悄地删除它们。
修复方法是让重试对预算不可见。重试不会写入单独的审计行。而是在最后一行记录的摘要字段中附加一个标记,并同时记录原始输出。这一个标记起到了双重作用:
- 预算中立:尝试次数计数系统每晚只看到一行记录,和以前一样。
- 仅执行一次的强制措施:在重试之前,流水线会读取该槽位的最新行记录。如果存在标记,意味着该槽位在当前判定周期内已经重试过,因此跳过。
我们将“仅执行一次”的范围限定在判定周期内,而不是永久性的。如果审核员之后拒绝了该条目,导致槽位重新进入填充群体,它会随着新的尝试次数一起获得一次新的重试机会。永久性的“仅执行一次”将意味着一个多年前被判定过的槽位再也无法从中受益,这对谁都没有好处。
如果说本节有什么要点:在向批处理系统添加任何重试机制之前,请找出所有使用你的尝试次数或成本核算的消费者,并检查你的重试在它们各自看来是什么样的。重试会与预算、去重检查、耗尽谓词和监控系统相互作用。除非你明确地进行处理,否则这些消费者都不会知道你额外的那次调用“仅仅是一次重试”。
此模式的适用与不适用场景
该模式可推广至任何具备低成本、决定性属性检查的生成任务:
- 必须能解析的结构化输出(JSON 模式、日期格式):解析失败即为该属性。
- 必须使用目标语言文字的翻译:如本文所述,进行书写系统检查。
- 必须能编译的代码生成:编译器即为属性检查。
- 受限重写(长度限制、禁用词):扫描器即为属性检查。
当质量是一个程度问题且没有确定性测试时,该模式不适用。如果无法用纯函数来判断“是否违规”,那么你就回到了 LLM-judges-LLM 的范畴,而那是一个成本不同的不同工具。当方差较低时,该模式的价值也会降低:我们在长尾术语上观察到 45% 的方差,但对于众所周知的术语,同一流水线几乎是确定性的,此时重试纯属浪费。在假定重试会发现新内容之前,请先在“删除并重新生成”的样本上测量方差。
还有一个坦诚的局限:单次重试会对分布进行两次采样。对于我们的工作负载,这恢复了大多数可恢复的案例,因为属性检查准确地告诉了我们哪些位置值得进行第二次抽取。如果你的可恢复集需要五次抽取,那么经济效益就会发生变化,此时你或许应该修复提示词,而不是更努力地采样。
常见问题解答
为什么不通过提高 temperature 或使用不同模型来重试呢? 一次更改两个变量会使结果无法归因。我们的重试只改变一件事,即一条针对已知失败的附加指令,因此任何改进都可以被归功并保留下来。更换模型也破坏了重试输出会面临与原始输出相同验证的保证。
为什么只重试一次,而不是直到属性成立为止? 因为“不存在既定的本地名称”是一个合法的终止状态。对于小众品牌,正确答案是其拉丁名称,而循环要么会永远进行下去,要么需要一个单独的停止条件,这个条件比“一次尝试,然后标记以供审核”更难推理。
对于大语言模型 (LLM) 来说,45% 的方差是正常的吗? 这在很大程度上取决于任务与模型知识边界的接近程度。我们的知名术语在多次运行中是稳定的;方差集中在模型确实不确定的长尾条目中。这种集中正是定向重试有效的原因:属性检查会找到不确定的位置。
这会取代人工审核吗? 不会。它会缩减审核队列。重试后仍然违规的输出会被标记,并且该标记会携带原始输出,以便审核人员能看到两次抽取的结果。这种模式将工作重心从“审核所有内容”转移到“审核机器再试一次也无法修复的内容”。