跳到主要内容

为非确定性 AI 功能编写验收标准

· 阅读需 13 分钟
Tian Pan
Software Engineer

你的工程团队已经开发文档摘要生成器三个月了。规范要求:“摘要生成器应返回准确的摘要。”你发布了它。用户抱怨摘要有一半时间是错误的。事后分析显示,在发布前没有人能以可测试的方式定义“准确”的含义。

这是 AI 功能开发的标准轨迹,之所以会发生,是因为团队将为确定性软件构建的验收标准模式,套用到了本质上是概率性的系统上。由 LLM 驱动的摘要生成器没有单一的“正确”输出 —— 它有一系列的输出分布,其中一些是可以接受的,另一些则不然。二元的通过/失败规范无法映射到分布上。

这个问题不仅是哲学上的,它还会导致切实的痛苦:功能发布时质量门槛模糊,回归测试在用户发现之前难以察觉,产品和工程团队在功能是否“完成”上无法达成一致,因为没有人规定对于随机系统来说,“完成”意味着什么。这篇文章将介绍真正有效的模式。

为什么“应返回准确结果”不是一个规范

传统的验收标准源于一个系统要么执行、要么不执行的世界。给定一个有效的 HTTP 请求,端点返回 200。给定一个特定的输入,函数返回预期的输出。这些规范直接转化为产生二元结果的自动化测试。

由 LLM 驱动的功能并非如此工作。同一个问题问两次,你可能会得到两个不同的答案。问一千次,你会得到一个分布。在该分布中,有些回答是好的,有些是坏的,大多数处于中间位置。问题不在于该功能是否返回了正确的结果,而在于在什么条件下,多大比例的结果是可以接受的,以及随着输入分布的变化,这个比例如何维持。

“准确”也存在定义问题。对于摘要生成器来说,准确是指与源文档的事实一致吗?简洁吗?涵盖了要点吗?没有幻觉出原文中没有的细节吗?这些标准中的每一个都是不同的维度,每个维度的测量方式也不同,而且它们有时会发生冲突。简洁的摘要可能会忽略细微差别;完整的摘要可能会包含用户不需要的材料。将所有这些都归结为“准确”,会导致团队中的每个工程师产生不同的理解。

第一步是分解:将针对特定功能的“好”定义分解为不同的、可衡量的维度。摘要生成器的规范可以将事实一致性(无幻觉主张)、覆盖率(包含关键点)、简洁性(源文档低于 2,000 字时,摘要低于 150 字)和语气(中性、专业)分开。每个维度都需要自己的标准和测量方法。

评估阈值合约 (Eval Threshold Contracts)

一旦有了可衡量的维度,你就可以编写评估阈值合约 —— 这是验收标准的 AI 模拟物。其结构是:这个指标,通过这种方式测量,在这个测试集上,应该以这种置信度达到这个阈值

一个具体的例子:“事实一致性得分,通过使用 LLM 评委将提取的主张与源文档进行交叉引用来衡量,在包含 200 个示例的黄金数据集上应超过 0.85,且 95% 置信区间的下限应高于 0.82。”

该合约指定了你要测量的内容(事实一致性)、方式(基于 LLM 的主张提取和验证)、数据(固定的黄金数据集)、通过阈值(0.85)以及可接受的不确定性(置信区间下限高于 0.82)。工程师可以实现这个测试,在 PR 上运行它,并获得清晰的信号。

阈值水平取决于上下文。法律文档审查工具需要事实一致性高于 0.95,且置信区间较窄。用于总结会议记录的内部工具可能接受 0.80。重要的是,阈值是明确的,在开发开始前就已写下,并在发布前由产品和工程团队达成一致,而不是在收到投诉后才进行争论。

统计校准在这里非常重要。在 20 个示例上设置 0.90 的阈值意义不大 —— 置信区间太宽,以至于你无法判断你的功能是 0.85 还是 0.95。实际指导建议:对于失败成本较高的功能,使用 300-500 个示例并使用自助法(bootstrap)计算置信区间。对于低风险的内部工具,可以使用 50-100 个示例,并明确承认你接受了更多的不确定性。样本大小的选择应作为权衡后的深思熟虑被记录下来,而不是含糊处理。

错误预算(Error budgets)与阈值配合得很好。与其将规范定义为“必须达到 0.90”,不如将其定义为“在最多 10% 的情况下允许失败”。这种框架自然地映射到运维思维中 —— 已经习惯于使用运行时间错误预算的团队会发现,将相同的概念应用于 AI 功能质量是非常直观的。

基于示例的行为规范

阈值合约能告诉你某个功能何时在整体上通过,但它们无法告诉你哪些行为是必须的或被禁止的。基于示例的规范通过将需求锚定到特定实例来填补这一空白。

一个客户支持机器人的行为规范可能如下:给定一条包含取消请求的消息,响应必须确认该请求,确认取消流程,且不得向上下文中标记为高流失风险的用户提供留存折扣。这是一个具体的、可测试的行为 —— 你可以运行它,根据标准评估输出,并得到一个明确的答案。

黄金数据集大规模地编码了这些示例。一个构建良好的黄金数据集涵盖了预期的输入分布(常见情况)、边缘情况(罕见但重要)、对抗性案例(旨在破坏功能的输入)以及边界条件(功能可能失效的决策边界附近的情况)。每个示例都应有明确的预期行为 —— 不是单一的正确输出,而是一组任何可接受的输出都必须满足的标准。

加载中…
References:Let's stay in touch and Follow me for more thoughts and updates