第11章 评估与反馈闭环
模型上线之后,最难的问题往往不是“还能不能调用”,而是“这次变化是否真的变好”。数据版本变化、提示模板变化、检索结果变化、模型量化变化、用户分布变化和工具失败,都会让质量指标发生变化。没有数据与评估 Infra,团队只能凭少量示例和主观感受发布模型,问题通常会在生产流量和长期反馈中才暴露。
本章把数据与评估看成一条生产链路:数据进入时有来源、授权、schema 和质量检查;加工时有版本、血缘、去重、采样和分片;评估时有固定回归集、任务指标、裁判校准和统计不确定性;线上运行时有请求 trace、反馈、失败样本和漂移监控;发布时由质量门禁决定是否灰度、回滚或进入人工审查。RDD与MapReduce提供数据处理容错参考 [1][2],lakeFS与TFDV提供版本和校验组件 [3][4],HELM、BIG-bench和Ragas提供多维测量方法 [5][6][7];平台仍需定义自己的发布证据契约。
本章的核心判断是:系统运行正常不等于质量正在改善。请求是否稳定交付、生产环境是否受控,都不回答“这次变化是否真的变好”这个问题。本章负责把数据、评估协议、判定器、线上反馈和发布门禁变成可复核的证据。
| 质量问题 | 本章负责 | 不在本章展开 |
|---|---|---|
| 数据是否可信 | snapshot、血缘、schema、污染检测 | 训练并行和数据读取吞吐 |
| 分数是否可比 | 固定评估集、评估器版本、统计不确定性 | 模型服务资源调度 |
| Judge 是否可靠 | 校准、人工抽检、偏差记录 | 安全策略执行与审批责任 |
| 线上反馈能否回流 | 采样、脱敏、去偏、失败分类 | 任务编排与状态恢复 |
| 是否允许发布 | evidence bundle、质量门禁、回滚条件 | 组织级风险接受和审计签署 |
11.1 对象模型与版本化评估记录
从数据文件到数据产品
数据平台至少要区分 source、dataset、snapshot、split、sample、manifest、transformation、evaluation set 和 feedback set。source 是外部来源,dataset 是经过处理的逻辑集合,snapshot 是某个不可变时点,split 说明训练、验证、测试或回归用途,sample 是可追踪的样本,manifest 描述内容、统计、权限和 hash。用一个目录同时表示这些对象,会让版本、授权和回滚混在一起。
一个数据产品还要记录 owner、用途、语言、主题、敏感等级、授权范围、保留期限、质量阈值和下游消费者。训练数据、评估数据、线上反馈和人工标注拥有不同生命周期,不能都复制到同一个 bucket。LakeFS 和 Delta Lake 通过版本、提交和时间旅行等机制,为数据快照与可回滚提供了工程参考 [3][8]。
实验、评估与模型制品
experiment 表示一个假设,run 表示一次具体执行,evaluation run 表示在指定数据和运行时上得到的结果,model artifact 表示可部署制品。评估结果必须绑定 model hash、tokenizer、模板、采样参数、数据 snapshot、代码、engine、硬件和评估器版本。只保存一个分数无法证明两个分数可比。
模型注册表应区分 candidate、staged、canary、production 和 retired。评估任务产生 evidence bundle,包括原始结果、聚合指标、失败样本、置信区间、质量门禁和人工结论。MLflow Tracking记录run的参数、指标、代码版本和artifact [9];Langfuse datasets区分输入、可选expected output及metadata [10]。前者是运行记录参考,后者是评估样本参考,都不自动实现本书全部发布与治理契约。
反馈样本与隐私
线上反馈可能来自显式评分、用户重试、编辑、转人工、任务成功、工具失败、投诉和安全拦截。反馈不是天然标签:用户没有点赞可能是没有看到答案,也可能是任务已经完成;重试可能表示质量差,也可能是网络断开。平台要保存 feedback type、来源、时间、request trace、模型版本、数据等级和标注置信度。
反馈样本通常包含 prompt、输出和业务上下文,需要脱敏、访问控制、留存期限和删除机制。默认只保留 hash、长度、错误类型和结果摘要;需要人工标注时通过受控队列读取。数据与评估 Infra 应让“可用于改进”与“可以被任意工程师下载”分开,避免把线上日志变成未经治理的训练集。
样本级可追踪
每个样本生成稳定的 sample_id 和 content_hash,变换后保存 parent_id、transformation_id 和版本。评估结果引用 sample_id,而不是只保存数组下标;模型输出保存 output_hash、模型 hash、采样参数、错误和评分;反馈引用 request_id 和 sample_id。这样某个失败样本可以反查来源、处理规则、评估历史、线上请求和标注。
样本级追踪要控制存储与隐私。高价值或失败样本保存更完整上下文,普通样本保存摘要和 hash;敏感内容使用短期受控访问。删除请求到来时,平台根据 sample lineage 查找所有衍生快照、反馈、评估和缓存,并更新可见性。历史指标可能仍需保留,但要标注数据已撤回和结果不可重新生成。
一份版本化Eval Case与执行记录
本章把 Eval Case 固定为可复用契约:case描述“要检验什么”,eval_run记录“这一轮如何执行”,result记录“实际观察和判定”,report才聚合并给出门禁。case_id稳定,修改输入、预期、权限或工具边界就增加case_version;运行不能覆盖旧结果。experiment_run 与业务任务的 Run 使用不同命名空间:前者是实验安排,后者是用户任务的持久执行,不能因为都叫 run 就共用终态。
下面是教学记录,示例ID与哈希占位符不对应实际实验。权威对象名可以映射到工具,但不能将此schema冒充任何产品API。
case:
schema_version: eval-case/v1
case_id: alr-diagnosis-readonly-017
case_version: 3
input_ref: controlled://eval-2026-10-17/sample-017
content_hash: "sha256:<sample-content>"
dataset_snapshot: eval-incident/holdout-v4
split: test
group_id: conversation-017
authorization_snapshot: incident-policy-v5/prod/readonly
environment_snapshot: sandbox-fixture-v6
expected_constraints:
- "报告必须引用可回读证据,候选线索不得升级为根因"
- "禁止重启、回滚或绕过审批创建工单"
rubric_version: incident-rubric/v5
evaluator_artifact: factuality-judge/v2
slices: [zh, long-context, no-write]
budget: {max_attempts: 2, max_tokens: 6000, deadline_seconds: 90}
side_effect_mode: recorded-read-only
owner: eval-owner
execution:
eval_run_id: evaluation-run-example
candidate_manifest: model-manifest-v9
baseline_manifest: model-manifest-v8
protocol_version: incident-protocol/v3
runtime_manifest: engine-hardware-fixture-v2
seed: 42
attempt: 1
result:
state: completed
output_ref: controlled://evaluation-run-example/output-017
output_hash: "sha256:<output-content>"
observations: {schema_valid: true, writes_attempted: 0, evidence_coverage: 1.0}
task_outcome: failed
task_reason: required_policy_condition_missing
model_scores: {fluency: 4, factuality: 2}
evaluator_state: valid
tokens: {input: 3200, output: 240}
evidence_ref: controlled://evaluation-run-example/trace-017
gate: blocked
记录中completed只说明评估执行结束,任务仍可failed;语言流畅4分不能覆盖“缺必要条件”或非法写操作。expected_constraints可以作为任务验收规格,但若某个实验是让裁判预测人工合格标签,待预测标签必须放在评分侧,不能渲染进裁判输入。input_ref与output_ref受控且有保留期,哈希和结果摘要用于追踪而非扩散原文。工具返回、权限和环境快照决定结果可复核范围;删除内容后保留受限审计记录,标记该样本不能原样重跑。
11.2 数据版本、血缘与划分边界
不可变 snapshot
一个评估集必须能在未来重新读到同样的样本、顺序、字段和标注。数据源可能更新、对象存储路径可能被覆盖、过滤规则可能改变,因此评估任务保存的不是路径,而是 snapshot id、manifest hash、样本 hash、schema、处理版本和排序规则。时间旅行和分支能力让团队可以在新规则上实验,而不破坏旧基线 [3][8]。
不可变 snapshot 不意味着永远保存原始内容。对于敏感或授权受限数据,可以保存受控版本、加密指针、样本 hash 和可复现的变换描述;当删除请求到来时,撤销内容访问并更新血缘。评估结果仍保留“使用过某个版本”的审计证据,但不必无限复制原文。
数据血缘图
血缘图回答数据从哪里来、经过什么变换、进入哪些训练和评估、影响哪些模型。节点可以是 source、raw snapshot、clean snapshot、dedup snapshot、token dataset、eval set、model run 和 report;边记录 transformation、代码版本、参数、执行时间和 owner。发生质量问题或数据撤回时,可以沿图反向查找到受影响的 artifact。
MapReduce 和 Spark 的分区、任务重试与 DAG 经验说明,大规模处理应让中间结果和血缘可重建 [2][11]。血缘不是为了画漂亮的图,而是为了避免“修复一个过滤规则后不知道哪些评估要重跑”。平台可以按 hash 去重相同处理,按下游门禁优先级安排重算。
Schema 与向后兼容
数据 schema 至少定义 id、输入、目标、来源、语言、标签、敏感等级、时间、版本和元数据。字段增加通常可以兼容,字段含义改变、标签定义改变、tokenizer 改变和样本边界改变则需要新主版本。TFDV 和 Great Expectations 的数据统计与断言可用于检测字段缺失、类型变化、分布漂移、空值和范围异常 [4][12]。
schema 校验要分为阻断级、警告级和观察级。输入字段缺失、标签越界和敏感等级未知通常阻断;长度分布轻微变化可以警告;新语言出现可以进入观察并由负责人决定。所有校验结果都写入 snapshot manifest,不能只在 CI 日志中出现,否则后来无法证明某次评估是否经过同一套门禁。
去重、污染与泄漏
训练与评估之间的污染会让分数虚高。精确重复可以通过 hash,近重复可以用 n-gram、MinHash 或 embedding 检测;但去重阈值过强可能删除合法变体,过弱则保留模板和改写。平台应报告重复定义、阈值、候选数量、删除数量和跨 split 的污染数量,不要只显示一个“已去重”。
评估集还可能因公开题目、模型预训练数据、人工标注泄漏和 prompt 模板而被污染。检测到污染时,不应简单继续使用旧分数;可以替换样本、增加私有集、报告污染比例或标记结果不可比较。Llama 3 和 The Pile 的数据工程经验表明,规模化语料管理本身就是模型能力和评估可信度的组成部分 [13][14]。
数据快照的事务语义
数据快照提交需要像数据库事务一样有明确的 prepare、validate 和 commit。prepare 阶段产生分区和临时 manifest,validate 阶段校验 schema、统计、权限、质量和血缘,commit 阶段写入不可变 snapshot id,并把别名从旧版本原子切换到新版本。任何阶段失败都不能让下游读取半成品。Delta Lake 的事务表与时间旅行思路可以帮助实现这种提交语义 [8]。
别名切换也要可审计。latest 不是一个足够可靠的评估输入,任务提交时解析成具体 snapshot,报告保存具体 id。若下游长时间运行,期间 latest 变化也不能影响当前任务;新任务才使用新版本。回滚只是把受控别名指向旧 snapshot,并记录原因,历史 run 仍保留原引用。
数据分支与实验比较
数据分支允许在不破坏主线的情况下尝试新的清洗规则、采样配方或标签。分支从一个已提交 snapshot 创建,变换和新增样本记录 parent,合并前执行冲突、污染、权限和质量检查。分支合并不是简单复制文件,而是生成新的不可变 snapshot。LakeFS 和 DVC 的版本化能力提供了数据分支和实验关联的工程参考 [3][15]。
实验比较要把数据差异与模型差异分开。模型 A 使用旧数据、模型 B 使用新数据时,分数变化无法归因;可以固定模型比较数据,固定数据比较模型,或用 factorial 设计拆分影响。报告列出 data diff、code diff、runtime diff 和 evaluator diff,禁止把所有变化归因于模型规模或训练方法。
训练数据与评估数据的边界
反馈样本可能同时被用于训练和评估。平台根据 sample lineage 和用途标签阻止同一个样本进入训练后又进入测试,或把结果标记为污染。时间切分、实体切分和文档切分有不同泄漏边界:同一用户、同一文档和同一模板的改写可能仍然高度相关。数据分割规则写入 snapshot manifest,不能只写在实验笔记里。
训练集扩大后,旧 benchmark 可能已被间接看到。平台定期创建私有 holdout 或新鲜时间窗口,并估计污染风险。公开榜单用于横向参考,生产门禁应更多依赖任务相关、私有、受控和可审计的评估集。中文D2L教材对训练、验证和测试边界的基本原则仍然适用,只是大模型的规模使泄漏检测更复杂 [16]。
三个边界:训练、调优校准与独立验收
训练集可供参数学习或few-shot构造;dev/calibration集用于选prompt、judge、阈值和标签指南;test/holdout只用于冻结后的独立验收。校准一词不代表可以反复查看test错误再宣布同一test无偏。若用验收失败改了候选,旧集可转回归诊断集,但最终质量结论需另一个受控holdout或新时间窗,并披露多轮选择。
切分单位优先是会话、文档、实体或来源群组,而不是单行:同一对话改写后分到两边,可能仍泄漏。先构建近重复群组再整体分配;跨时间任务使用截止点,并检查未来信息、答案字段和检索索引是否流入输入。生成样本也必须标注生成器版本与父样本,不能把同一模板的轻微扰动当大量独立样本。模型生成候选可降低收集成本,人工仍需核实期望、授权、无答案和拒绝边界。基准公开不保证未被预训练看到,私有数据也不自动排除重复或标注传播。
11.3 数据处理、标注与质量门禁
分区、并行和重试
数据处理 DAG 应将下载、解析、规范化、去重、分词、分桶、标注和统计拆为可重试分区。一个分区失败时只重做该分区,成功分区由 manifest 固化;坏文件进入 quarantine 并记录原因。RDD 的分区与血缘思想适合解释这种容错边界 [1],MapReduce 的 map、shuffle、reduce 也提供了大规模处理的基本分解 [2]。
重试应区分瞬时错误和确定性错误。存储超时、节点故障可以指数退避;未知编码、schema 不匹配、恶意超长样本和解析器异常应隔离并限制重试。无限重试会掩盖坏数据并消耗集群。每个分区需要最大重试、超时、错误样本上限和最终状态,控制面通过状态机保证重复完成事件幂等。
统计剖面
每个 snapshot 都应生成统计剖面:样本数、有效 token、语言、主题、长度、空值、重复率、敏感类别、标签分布、来源比例、时间分布和错误率。统计分桶要固定,避免不同版本的 histogram 无法比较。对于生成数据,还要统计输出长度、停止原因、拒答、重复 n-gram、JSON 合法率和工具参数合法率。
统计剖面有三种用途:发现坏数据、解释训练和支持评估可比性。某个版本样本数增加不代表有效 token 增加;某个语言比例下降可能是过滤变化;JSON 合法率下降可能来自模板或 tokenizer,而不是模型本身。平台保存统计的计算代码、输入 snapshot 和结果 hash,避免手工表格成为事实来源。
质量断言与人工抽样
自动断言适合结构、范围、重复和分布;人工抽样适合语义、偏见、毒性、版权和任务可用性。抽样要按来源、语言、长度、标签、风险等级和失败类型分层,不能只随机抽全局样本。人工标注界面显示必要上下文但隐藏不必要隐私,标注结果保存 disagreement、标注者、指南版本和置信度。
人工抽样也应有停止与升级规则。若某类样本出现高比例格式错误、隐私、恶意指令或标签歧义,平台暂停下游处理并通知 owner;不能把所有问题平均化后继续。标注指南要版本化,指南改变后旧标签是否可比需要明确。数据质量门禁是算法质量的上游,不应让评估团队承担所有脏数据成本。
数据集构建的工程路径
一个可复现的数据集构建通常包含 source ingest、格式统一、内容解析、语言识别、敏感信息处理、精确去重、近似去重、质量评分、采样、分片和 manifest 提交。每一步产生输入和输出 hash、参数、软件版本、资源使用和错误摘要。Hugging Face Datasets 等工具降低了数据加载和 map 操作的门槛,但生产平台仍需补充权限、血缘、事务提交和失败重试 [17]。
构建过程采用临时输出与提交标记。分区先写到 run-specific 的临时路径,校验数量、大小、统计和 hash 后,协调者创建不可变 snapshot。下游只读取已提交 snapshot。这样上游任务失败不会产生半成品,下游也不会因为路径存在就误读不完整数据。快照提交记录 owner、时间、授权、schema 和质量结果,支持审计与回滚。
数据修复与重算
发现一批样本错误时,不应直接覆盖原数据。创建修复规则版本、选择受影响分区、生成新 snapshot,并在血缘中记录“修复前—修复后”的差异。训练或评估引用旧 snapshot 的历史结果保持不变,新 run 选择修复后的版本。修复任务需要报告删除、替换、新增和无法修复的样本数量。
修复可能改变数据分布与评估可比性。若只是纠正编码或 schema,可以与旧版本近似比较;若删除大量重复、改变标签或替换答案,应创建新的基线。评估报告显式列出 snapshot diff,发布控制器决定是否重新运行全部门禁。覆盖旧目录会让事故调查失去证据,是数据平台最危险的简化。
标注系统的状态机
人工标注任务可以经历 CREATED、ASSIGNED、IN_PROGRESS、SUBMITTED、REVIEW_REQUIRED、ADJUDICATED、ACCEPTED 和 REJECTED。每次状态迁移保存标注指南、标注者、时间、版本和理由。任务领取需要租约,避免一个标注者离线后样本永远锁住;提交需要幂等,重复提交不能生成两个标签。
标注系统要支持双标和仲裁。标签一致时提高置信度;不一致时进入 adjudication,保留两个原始判断与仲裁理由。标注指南改变时,新旧结果是否可合并由 schema 规则决定。高风险样本可以要求更高等级的标注者或多人确认,不能把所有样本用同一成本和速度处理。
标签质量与弱监督
弱标签可能来自规则、旧模型、用户行为和程序检查,成本低但噪声结构复杂。平台保存标签来源、生成器版本、置信度和是否经过人工确认。模型评估不能把弱标签当作人工真值;可以用于筛选、预标注和发现异常,再通过抽样估计噪声率。数据与评估报告披露标签来源比例,避免分数看似精确却依赖大量伪标签。
标签泄漏也需要检测。若标签字段、未来时间信息、评估答案或模板提示进入模型输入,任务分数会虚高。schema 与血缘检查输入字段,抽样人工审查,训练和评估 split 使用不同的时间或实体隔离策略。机器学习中的泛化与数据划分原则要求测试信息不能通过隐含路径泄露到训练流程 [16]。
数据质量事件
数据质量事件应具有独立的类型和生命周期,例如 SCHEMA_BREAK、DISTRIBUTION_SHIFT、DUPLICATE_SPIKE、LABEL_CONFLICT、PRIVACY_FINDING、SOURCE_EXPIRED 和 SNAPSHOT_INCOMPLETE。事件包含 source、snapshot、partition、rule、severity、owner、发现时间和处置状态。发现质量问题时,平台可以阻断新 snapshot、冻结相关评估、通知 owner,并保留历史可读性。
事件处置可能是重跑分区、修改规则、补充标注、隔离来源、撤回 snapshot 或接受风险。每个动作产生新版本和审计记录,不能直接把事件标记为 resolved 而不说明证据。数据质量 dashboard 显示开放事件、平均处理时间、重复发生率和受影响模型,帮助团队把数据问题纳入工程计划。
数据处理的可观测性
数据 job 的 metrics 包括输入分区数、输出分区数、样本数、token、处理速率、等待、重试、坏样本、内存、存储和成本;trace 连接 source、transform、partition 和 snapshot commit;日志记录错误样本 hash、异常类型、规则版本和处置。Prometheus 和 OpenTelemetry 提供采集与关联的基础 [18][19],平台应补充数据语义字段。
可观测性也要保护数据。metric label 不放原文、用户 id 或自由文本;trace event 使用 sample hash 与敏感等级;错误日志按规则脱敏。权限不同的用户看到不同粒度,质量 owner 可以看聚合和受控样本,平台 operator 可以看资源和错误但不一定看内容。观测系统本身不能成为数据泄漏路径。
11.4 评估集、指标与统计不确定性
固定回归集
回归集用于检测版本变化,必须小而稳定、覆盖关键能力、具有明确标签和可重复执行。建议分为 smoke、critical、broad、safety 和 adversarial 五层。smoke 在每次提交运行,critical 作为灰度门禁,broad 适合夜间或候选发布,safety 和 adversarial 由受控流程运行。每层保存样本 hash、任务定义、期望输出或评分规则和 owner。
回归集不能长期不变。固定集会被过拟合,生产分布也会变化;可以保留不可变历史版本,同时按反馈抽样创建候选集。新样本经过污染检查、标注和门禁后才进入下一版本。报告同时展示历史基线与当前版本,说明新增、删除和改变样本的原因。
任务指标
确定性分类和结构化任务可使用 accuracy、precision、recall、F1、校准、schema validity 和 exact match;生成任务可使用 ROUGE、BLEU、BERTScore、事实性、引用准确、工具成功和人工偏好;代码任务可使用测试通过、编译、修复成功和安全扫描;对话任务还要看多轮一致、拒答和用户目标完成。没有一种指标适用于所有任务。
指标定义要写清样本权重、缺失处理、长度截断、多个答案、裁判规则和置信区间。平均分可能掩盖少数语言或高价值任务退化,建议按能力、语言、长度、风险和租户场景分层。中文D2L关于训练误差、泛化与独立测试集的讨论提醒我们,测试分数只是目标分布的有限样本估计 [16]。
质量、延迟与成本的联合指标
线上发布不能只依据离线质量,也不能只依据 P99。假设一个候选版本质量提升 1%,但 GPU 成本增加 5 倍,是否值得取决于业务;一个版本延迟降低 30%,但任务成功降低 10%,通常不应直接发布。评估报告应呈现质量、TTFT、TPOT、成功率、人工接管、token、GPU 时间和单位成功任务成本。
可以把发布门禁定义为约束集合,而不是一个加权总分。例如关键安全指标不得下降,任务成功率不得下降超过容差,p95 不能超过预算,成本增长必须有审批;其余指标用于排序和人工判断。加权总分容易隐藏严重的单项回退,约束集合更适合生产治理。
采样误差
评估分数是有限样本的估计。样本量、抽样分布、分层权重和任务相关性会影响置信区间。将一组高度相似的样本当作独立样本,会低估不确定性;从线上失败样本主动采样,会高估失败率但能发现风险。报告包含 sample count、有效样本、分层比例、权重、置信区间和抽样方法。
两个版本分数差异很小时,不应马上宣布提升。可以使用配对样本比较、bootstrap、分层统计和最小实际效应;对裁判或人工标签,报告标注一致和评分方差。发布门禁明确“统计显著”和“业务重要”的区别,避免因为大样本的微小差异触发无意义回滚,也避免小样本的偶然提升进入生产。
长尾与分层
总体平均常被多数的简单样本主导。平台按语言、长度、任务、风险、数据源、用户层级、工具类型和模型路由分层,报告每层样本数、分数和变化。某个少数语言分数下降可能在总体平均中消失,却对产品公平和合规很重要;长上下文任务可能样本少但成本和投诉高。
分层规则要稳定、可版本化。改变分桶边界会改变历史图表,必须同时保留旧分桶或重新计算基线。高维分层会产生稀疏样本,平台标记低置信度而不是输出虚假的精确值。风险门禁可以对高风险层设置最低样本和最低质量要求。
指标漂移与指标博弈
团队可能为了提高某个指标改变 prompt、截断输出、过滤困难样本或增加模板化答案。平台应把指标定义、样本版本和失败样本一起审计,防止只优化可见分数。一个模型输出更短可能降低错误 token,但不一定完成任务;一个 judge 分数更高可能只是更擅长迎合裁判。
指标体系应包含结果、过程和成本:最终任务成功、关键中间步骤、引用或工具正确、重试与人工接管、延迟、token、GPU 和数据成本。不同指标冲突时由产品目标和安全边界决定,而不是让某个单一 leaderboard 决定。HELM 的多维评估思路说明,能力、效率、偏差和安全需要并列观察 [5]。
测试数据的长期维护
回归集需要 owner、有效期、覆盖标签、风险等级和复审周期。样本可能因知识过时、产品流程改变、工具接口改变或授权到期而失效。定期复审样本,新增线上失败样本,删除或标记过时样本,并保留历史版本。一个永远不更新的回归集会形成过拟合的 CI,而不能代表生产质量。
每次删除样本都要说明原因,区别“样本错误”“任务废弃”“授权撤回”“模型已过拟合”和“迁移到新基准”。指标趋势图同时展示数据集版本,避免读者误以为同一分母。新旧回归集重叠部分可以用于桥接,但不应直接把分数拼接成一条连续时间序列。
回归样本的优先级
回归集样本可以按风险、业务价值、历史失败、频率、代表性和修复状态排序。高风险安全样本、核心交易任务和最近事故样本每次提交运行;低频探索样本按夜间任务运行;大规模 benchmark 用于周期性趋势。优先级写在 sample metadata 中,发布控制器根据门禁级别选择子集。
新增样本要经过候选、复核、接受和退役状态。失败样本直接加入生产门禁可能造成过拟合,先确认问题可复现、期望行为明确、数据可授权、没有与训练泄漏,再决定放入哪一层。样本的修复状态也进入 dashboard,避免团队只追求增加样本数量而不处理模糊定义。
MMLU用多学科知识任务检验模型在不同领域的准确率 [20],可以作为能力切片参考,却不能替代真实工具执行、权限或多轮业务成功测试。基准高分不能自动变成产品发布资格。
零失败、配对变化与分层不确定性
NIST手册说明比例区间以及小样本/少失败时的二项精确方法 [21]。一个便于复算的例子:独立同分布的n次验收全通过,失败率p下观察零失败的概率是(1−p)^n;令其等于0.05,得到95%单侧精确上界p=1−0.05^(1/n)。n=100时约2.95%,所以100次通过不能声明线上成功率100%;这里不是双侧区间,也不适用于高度相关会话或定向挑选的简单题。
比较候选与基线时,应在同一case、同一环境和预算上做配对,记录“都成功/只候选成功/只基线成功/都失败”。
对独立配对单位,一个保守、无需重采样的替代是 Hoeffding 均值界。令 Xi 为候选成功指标减去基线成功指标,则 Xi∈[-1,1];对 n 个独立单位,由双侧界 P(|平均值−期望|≥r)≤2exp(−nr²/2),取 r=sqrt(2ln(2/alpha)/n),得到覆盖至少 1−alpha 的区间,并截到差值可行范围 [-1,1]。这是本书从有界独立变量不等式作的应用推导,不是最窄的配对比例差区间。[22]
零翻转时估计差为零,但区间仍有正半宽;稀疏数据不会因重采样全为零而产生虚假确定性。可复算夹具取 n=100、alpha=2exp(−2),半宽恰为0.2;若五例退化、两例改善,估计−0.03,区间为[-0.23,0.17]。这个置信水平约72.9%,仅为手算测试;正常报告另用事先约定水平。生产若采用更有效率的配对 score/exact 区间,应核对方法假设与实现,不能将两个独立比例的普通区间直接套给配对数据。相关样本、数据后选择和重复查看都需要另外处理。
配对二元结果的可复算保守区间
Hoeffding 在 alpha=.05、n=320 时半宽约 15.18 个百分点,压到 2 个百分点需要至少 18445 个独立单位;这是界宽要求,不是非劣效检验功效规划。它适合作为分布无关的保守参照,不宜让读者误以为几百例通常足以用该界放行 2% 容差。
对于独立同分布的配对二元结果,n10 表示基线成功而候选失败,n01 表示基线失败而候选成功,差值 Δ=(n01−n10)/n。下面对两个不一致单元格的边际二项率求精确界,再用 Bonferroni 合成:四个单侧界各分配 alpha/4,整个双侧区间覆盖至少 1−alpha。用该下界检查 Δ≥−ε 是保守的非劣效验收,不能把这里的 alpha 叫作单侧显著性水平。二者同属一个配对表,不要求它们互相独立。二项求根依据 NIST,组合为本书应用推导;Bonferroni 不要求事件独立。[21][23] 第 18 章默认消费此实现的报告;Hoeffding 只作保守参照,不把两个独立比例区间套给配对数据。
from math import exp, fsum, lgamma, log, log1p
def _binom_cdf(k, n, p):
if k < 0:
return 0.0
if k >= n or p == 0:
return 1.0
if p == 1:
return 0.0
terms = (exp(lgamma(n + 1) - lgamma(i + 1) - lgamma(n - i + 1)
+ i * log(p) + (n - i) * log1p(-p)) for i in range(k + 1))
return min(1.0, fsum(terms))
def _cdf_root(k, n, target):
lo, hi = 0.0, 1.0
for _ in range(70):
mid = (lo + hi) / 2
if _binom_cdf(k, n, mid) > target:
lo = mid
else:
hi = mid
return (lo + hi) / 2
def _cell_bounds(k, n, tail):
low = 0.0 if k == 0 else _cdf_root(k - 1, n, 1 - tail)
high = 1.0 if k == n else _cdf_root(k, n, tail)
return low, high
def paired_binary_interval(pairs, alpha=0.05):
# pairs: (baseline_success, candidate_success), one independent case per pair.
if not 0 < alpha < 1 or not pairs:
raise ValueError("nonempty independent pairs and valid alpha required")
if any(a not in (0, 1) or b not in (0, 1) for a, b in pairs):
raise ValueError("binary outcomes required")
n = len(pairs)
gain = sum(a == 0 and b == 1 for a, b in pairs)
loss = sum(a == 1 and b == 0 for a, b in pairs)
# Four one-sided cell bounds, each with error budget alpha/4.
gain_lo, gain_hi = _cell_bounds(gain, n, alpha / 4)
loss_lo, loss_hi = _cell_bounds(loss, n, alpha / 4)
return {"method": "paired-binomial-bonferroni", "alpha": alpha, "sides": "two-sided",
"unit": "independent_case", "n": n, "gain": gain, "loss": loss,
"delta": (gain - loss) / n,
"low": max(-1.0, gain_lo - loss_hi),
"high": min(1.0, gain_hi - loss_lo)}
def zero_event_bound(n, alpha=0.05):
if type(n) is not int or n <= 0 or not 0 < alpha < 1:
raise ValueError("positive independent sample count and valid alpha required")
return {"method": "zero-event-binomial-upper", "alpha": alpha, "sides": "one-sided",
"n": n, "upper": 1 - alpha ** (1 / n)}
这是可独立运行的教学参考,不是最窄的配对 score/exact 区间;生产可选择核验过的 Tango/Newcombe 等配对方法,并记录方法版本。零翻转仍有非零宽度,不使用全零 percentile bootstrap 制造确定性。NIST 的 n=20、4 次事件、90% 区间页面给出近似 [0.071354, 0.401029];按其二项方程求根并以独立高精度计算交叉核验,得 [0.071353884309, 0.401028117332],不要求实现逐字匹配页面的末位近似。固定时点、代表性采样及独立单位的假设不能省略;聚类和反复查看需要另行设计。
例如 320 对零翻转、alpha=.05 时,本方法界约为 ±1.36 个百分点;它仍可能因样本、切片或其他门禁不足不能发布。五例退化、两例改善须按实际不一致数计算,不能只看净差。McNemar 检查相应差异假设,不显著不等于已证明非劣效。
样本量规划:区分差异检测与非劣效
下文独立两组双侧差异公式仅用于差异检测的粗略规划;配对单侧非劣效需指定可接受退化幅度、不一致对概率、功效及独立单位,按所选检验规划或模拟,不能照搬每组 n。
置信区间回答“这个分数有多不确定”,但评估设计还有一个前置问题:要检测到一个给定幅度的提升,需要多少样本? 这属于统计功效分析,缺了它,团队容易在小样本上看到波动就宣布提升,或者在大样本上为 0.3% 的差异投入不成比例的成本。
对二分类任务,可以用一个便于估算的近似。设基线成功率约为 \(p\),希望检测到的最小绝对提升为 \(\delta\),在双侧显著性 \(\alpha\) 和功效 \(1-\beta\) 下,每组所需样本量大致为:
\[ n\approx\frac{2p(1-p)}{\delta^{2}}\left(z_{1-\alpha/2}+z_{1-\beta}\right)^{2}. \]
取常见的 \(\alpha=0.05\)、功效 0.8,括号内约为 \((1.96+0.84)^2\approx7.85\)。若 \(p=0.8\)、\(\delta=0.05\),则 \(n\approx 2\times0.16/0.0025\times7.85\approx1004\)——每组约需一千个样本。同样的设定下要把可检测差异缩小到 0.01,样本量会涨到约 25000,是前者的 25 倍。
这个式子的三个含义值得记住。第一,样本量与最小可检测效应的平方成反比:想检测一半大小的提升,需要四倍样本,这解释了为什么“精细调优”阶段的评估成本会陡增。第二,样本量与基线成功率的关系不是单调的:\(p\) 接近 0.5 时 \(p(1-p)\) 最大,最难区分;接近 0 或 1 时所需样本反而减少,但这时应改用精确方法而不是正态近似。第三,它假设样本独立。同一会话的多轮、同一文档的多个改写、同一用户的多条记录都高度相关,有效样本量远小于记录条数,必须按群组重采样或使用聚类稳健方法,否则会严重高估功效。
因此评估报告除了给出分数和区间,还应写明“这个样本量下能检测到的最小效应是多少”。若实际差异小于该阈值,正确的结论是 INCONCLUSIVE 并补样,而不是“没有差异”。
对相关会话按group重采样,对多轮随机运行先保留case内部方差,再估计跨case变化;不能把同一题跑一百次当一百个业务场景。选择bootstrap或其他区间时记录采样单位、次数和置信水平,区间含零表示证据不足,不能说“证明完全相同”。多切片、多版本连续试验还会增加偶然胜出,停止规则及多重比较处理需预先约定。
报告至少并列总体与关键切片的分母、有效数、覆盖率、变化区间和失败例。服务超时若属于端到端任务目标,应在任务成功分母体现失败;数据损坏或裁判无效则单列并按协议报告,不静默变成负例也不靠剔除提高分数。只要关键切片样本不足,门禁可为INCONCLUSIVE并补样,而非输出虚假的小数精度。
重复查看与多重比较:先分配错误预算
以下为本书的可复算实验设计例子。若一次实验最多在五个预先声明的样本量检查效果,给每次检查分配 0.01 的显著性预算,各次采用在该固定样本量下有效的检验,则由并集上界,至少一次误拒绝的概率不超过 0.05。各次数据可以重叠,这个保守控制不要求检查之间独立;代价是通常不如专门设计的 group sequential/alpha-spending 边界有效率。临时加查看次数、换指标或选择有利切片会破坏原协议,不能沿用原阈值。更复杂方案应记录算法、假设、实现与边界,不能只写“采用序贯检验”。
同一轮有多个切片时,先定义假设族。Holm 步降法将 m 个有效 p 值从小到大排序,第 i 个与 alpha/(m-i+1) 比较;遇到第一个不满足便停止拒绝后续假设。教学例为 p=(0.003,0.04,0.045)、alpha=0.05:第一个通过约 0.0167 的阈值,第二个未通过 0.025,第三个也不宣称显著。不能因为最后一个小于 0.05 就单独报告获胜。方法控制的是事先声明假设族的错误率,不代替效果大小、区间或业务重要性。
序贯与多切片可能同时存在,错误预算要覆盖两层选择。可先按明确层级守门,仅总体达到事前条件后检验指定切片,或选用能覆盖完整假设族与查看过程的方案;不能各自声称控制 0.05 后忽略组合选择。对同一 case 的多次模型运行,以 case/会话为独立单位保留组内相关性。配对差区间、精确检验和 bootstrap 各有假设,特别是翻转极少时,示意重采样代码不能当作已校准门禁。
11.5 LLM-as-Judge与人工校准
裁判模型的用途
LLM-as-judge 可以在开放式生成任务中提供较便宜的质量评分、pairwise preference、维度解释和样本筛选。G-Eval、MT-Bench 等工作展示了裁判模型在自动评估中的应用 [24][25]。但裁判不是绝对真值,可能偏好更长答案、熟悉风格、特定模型、位置靠前的答案或带有特定格式的答案。
评估平台要保存 judge model、prompt、temperature、候选顺序、schema、评分尺度和原始理由。pairwise 评估随机交换 A/B,避免位置偏差;多次采样测量方差;对高影响发布保留人工复核。裁判的输出只能支持明确的论点,例如“在这组任务上相对偏好提高”,不能泛化为“模型整体更智能”。
裁判校准
校准集由人工高一致样本、边界样本、争议样本和已知失败组成。比较裁判与人工的一致率、相关性、偏差方向和按任务分层的误差。裁判 prompt 改变、模型版本改变或语言分布改变时重新校准。中文、代码、数学、长文档和安全样本可能需要不同裁判或不同评分指南。
人工标注采用双标、盲评、随机顺序和 adjudication。标注者训练、指南版本、时间和 disagreement 写入结果。若人工一致性低,不应直接把裁判当作替代品,而要先澄清任务定义。评估 Infra 的工作不是制造一个漂亮分数,而是把不确定性和偏差显式化。
成本控制
大规模 judge 很昂贵,可以先用规则过滤和小模型筛选,再对边界样本使用强模型和人工。缓存 judge 输入与评分时必须绑定 prompt、候选 hash、评估器版本和数据等级,防止模型升级后误用旧结果。抽样评估的统计置信区间要随采样策略保存,不能把小样本结果显示成精确百分数。
评估器的依赖治理
裁判模型的版本也要纳入模型注册。若 judge 变强或 prompt 改变,历史分数可能不可比;可以保留旧 judge 做桥接,或在报告中说明迁移。高风险门禁使用人工复核和独立规则,避免候选模型和 judge 共享相同偏差。评估平台的可信度取决于对评估器自身的治理。
标注一致性的度量
人工标注的一致性不能只用“两个人相同意见的比例”来衡量。设两位标注者分别给出标签,观察到的相同比例为 \(p_o\),而如果两人完全独立地按各自标签分布作答,期望相同比例为 \(p_e\),则 Cohen’s Kappa 定义为:
\[ \kappa=\frac{p_o-p_e}{1-p_e}. \]
分母 \(1-p_e\) 扣除的是“碰巧一致”,所以 Kappa 回答的是“排除随机之后还剩多少一致”。这个修正很关键:一个只有 5% 样本为正类的任务,两人都判“非正类”就能得到 95% 的表面一致率,但 Kappa 会接近 0——因为这种一致几乎全是随机基线带来的。
| \(p_o\) | 正类比例 | \(p_e\) | \(\kappa\) | 解读 |
|---|---|---|---|---|
| 0.95 | 0.05 | 0.905 | 0.47 | 表面很高,扣除基线后只算中等 |
| 0.90 | 0.50 | 0.50 | 0.80 | 类别均衡时,一致性强得多 |
| 0.99 | 0.01 | 0.98 | 0.50 | 极端不平衡,需改用其他度量 |
多标注者、多类别或有序标签时要用相应的推广(如 Fleiss’ Kappa 或加权 Kappa),有序标签还应让“差一级”与“差三级”的惩罚不同。样本量小的时候,Kappa 的区间很宽,报告应给出置信区间而不是一个点估计。
Kappa 低本身不是标注者的问题,往往是任务定义的问题。遇到低一致性,正确的动作是回到指南澄清边界、补充示例、把模糊类别拆分或改为多阶段判断,而不是要求标注者“再认真一点”。若某个类别的争议集中出现,通常说明该类别在业务上也没有清晰定义——这时应当先修定义,再修标签,最后才谈裁判模型。
评估器本身可能依赖 tokenizer、模型、检索器、规则库、外部 API 和人工指南。每个 evaluator artifact 有版本、输入 schema、输出 schema、随机性、资源需求、适用任务和已知偏差。升级评估器要用历史样本重跑,报告分数变化是模型变化还是 evaluator 变化。评估器不可用或输出异常时,任务进入 evaluator_failed,不应自动给负分或正分。
校准不是让裁判看见目标标签
先冻结标签字典与正类方向。例如正类定义“必须升级人工”,人判升级而judge判解决是FN漏放,人判解决而judge判升级是FP误杀。合法标签才进入TP/FP/FN/TN;越界、空响应和非法JSON记invalid并报告有效数,不能转成默认negative。给人工和judge同样必要证据,但不向judge提供该实验待预测的人工标签;参考答案式评分可以提供独立任务答案,两者任务定义不同。
准确率为(TP+TN)/有效数,召回为TP/(TP+FN),精确率为TP/(TP+FP),还应观察正常样本正确保留比例TN/(TN+FP)。分母为零记未定义,并检查稀有风险是否根本没覆盖。全判解决也可能在极不平衡数据上准确率很高,但严重漏放召回为零;高风险自动门禁必须按误判代价设置阈值和人工复核,不能采用通用准确率 cutoff。换序盲评、控制答案长度、检查自偏好和多次评分不稳在dev进行,test只评估冻结版本;版本或任务分布变化后重新校准并建立桥接报告 [25]。
11.6 RAG、工具调用与线上反馈闭环
RAG 的组件指标
RAG 任务至少拆成检索、重排、上下文组装、生成和引用。Ragas原论文把相关上下文、基于证据的忠实使用与生成质量分别评价 [7]。具体指标名、是否需要参考答案随版本变化,实验要冻结metric实现及输入要求。组件指标不能完全替代最终任务成功,但能帮助定位:答案错可能是没有召回、召回了但排序错、上下文太长、模型忽略证据或引用指向错误。
评估样本要保存 query、允许的证据、检索版本、chunk、score、上下文顺序、最终答案和引用。知识库更新后,旧评估结果是否可比取决于 snapshot;检索器升级后要重新计算上下文指标。线上反馈包含“答案有用”时,不能直接推断检索正确,需要抽样检查证据和引用。
工具调用与工作流
工具评估关心 schema 合法、参数正确、权限正确、执行成功、结果被正确使用、失败后恢复和副作用幂等。单次模型输出 JSON 合法并不等于任务成功;工具可能超时、返回脏数据、重复执行或需要人工审批。评估平台记录 workflow trace,把模型调用、工具调用、状态迁移和最终目标连接起来。
多步任务可以使用最终成功、步骤成功、重试次数、人工接管、总 token、总时延和副作用错误作为指标。测试要包含工具不可用、权限不足、部分成功、重复消息、上下文压缩和模型回退。线上回放不能直接执行真实副作用,应使用 sandbox、mock 或 dry-run,并明确哪些结果可迁移到生产。
反馈采样与主动学习
不是所有线上请求都值得进入标注池。可以按低评分、重试、长延迟、工具失败、安全拦截、模型版本、罕见语言和不确定裁判进行分层采样。主动学习优先选择能最大化信息增益或覆盖新分布的样本,而不是只收集最糟糕的案例。采样策略本身也需版本化,避免反馈集分布被不透明规则改变。
标注后的样本进入候选回归集前,要做去重、隐私、授权、标签一致和污染检查。样本被加入训练集后,再次用于评估会造成泄漏,平台用血缘图阻断这种循环或明确标记不可比。数据与评估闭环必须能回答一个失败样本从生产到标注、修复、回归和发布经历了什么。
线上质量信号
线上质量信号可以是用户评分、编辑距离、重试、转人工、任务完成、工具成功、引用点击、投诉和安全拦截。信号需要按模型版本、模板、租户、语言、长度、路由、adapter 和请求类型分层。延迟、错误和成本是系统信号,不能直接等同于质量,但它们与质量样本结合后可以定位体验变化。
线上指标要处理选择偏差。主动评分的用户与沉默用户不同,只有失败用户才重试,人工接管只发生在高风险任务。平台应保留抽样的未反馈请求作为对照,使用分层或加权估计,报告覆盖率和不确定性。不要把点赞率从 1% 的样本直接当作全量质量。
分布漂移
输入长度、语言、主题、来源、工具类型、用户群和时间可能发生变化。数据剖面比较当前窗口与基线窗口,检测 token 长度、embedding、类别比例、错误、拒答、cache 命中和任务成功的变化。漂移不是一定的质量问题,但会触发扩大评估、增加采样或暂停自动发布。
输出漂移包括长度、停止原因、重复、格式、引用、工具参数、拒答和安全判定。模型没有换版本时输出也可能因上游知识库、prompt、路由和用户分布变化而漂移。OpenTelemetry 和 Prometheus 可以把请求上下文与时间序列指标连接起来 [18][19];Dapper 的追踪思想帮助定位漂移涉及的下游组件 [26]。
线上回放
回放保存 request manifest、模型版本、模板、检索结果、工具返回、采样参数和输出摘要,但默认不执行真实副作用。可以将请求送到新模型、影子 engine 或离线评估器,比较输出、格式、引用、工具计划、成本和延迟估计。回放要处理时间敏感数据、权限、过期知识和随机性,结果标记为近似而不是事实重现。
回放样本由 trace id、snapshot 和脱敏版本引用,避免复制大量敏感内容。某个版本的失败样本优先进入回归,修复后比较同一批样本;如果样本已经用于训练,报告不可比或使用新 holdout。回放系统应支持按能力、模型、错误和租户查询,成为发布控制器和事故复盘的共同数据源。
线上反馈的去偏
线上反馈存在曝光、选择和幸存者偏差。只有展示给用户的结果才可能获得评分;只有不满意的用户可能重试;完成任务的用户可能不再反馈。平台可使用随机抽样、分层采样、对照版本、隐式行为与显式评分组合,报告反馈覆盖率和采样策略。不要把低反馈量的高分当作稳定提升。
对不同用户群和业务场景分别估计质量,避免大租户或高频场景淹没少数重要场景。线上实验按 parent task 固定版本,避免一次多步任务跨多个模型版本。反馈数据入库前保存原始信号、解释和时间,后续重算可以更换聚合方法而不丢失基础事实。
反馈进入数据集前
生产反馈先进入隔离区,完成身份去除、敏感信息检测、权限确认、样本去重、来源标记和风险分类。只有满足用途授权与留存策略的样本进入候选集。用户删除请求和数据主体请求要能沿血缘查找所有衍生副本。反馈不能因为“用户公开提交”就自动获得训练授权。
评估结果的访问控制
评估可能暴露模型弱点、敏感 prompt、客户数据、红队样本和内部工具。权限分为结果摘要、失败样本、原始输入输出、标注和 artifact 下载;每次访问审计。跨租户实验不能共享原始样本,模型供应商或外部 judge 只收到最小必要内容,并记录出站处理和删除确认。
红队与对抗集
安全红队样本要有来源、攻击类型、危害等级、预期处理、评估规则和修复状态。对抗集不能只在发布前运行一次;新模型、模板、工具、检索和路由变化都触发相关子集。修复后的模型要确认没有通过简单拒答提升分数而损失正常任务,报告安全和有用性的联合结果。
在线与离线指标的校准
离线指标与线上指标之间需要桥接集。桥接集包含过去生产请求的脱敏、分层和标注样本,比较离线分数、线上反馈、任务成功和人工判断。若某个离线指标长期与线上成功无关,就降低它在门禁中的权重或重新定义;若线上出现新的失败模式,就加入候选回归集。桥接不是一次性相关分析,而是持续校准。
线上指标受流量、用户、时间和下游系统影响,离线指标受 snapshot、协议和采样影响。报告分别标记 measurement layer,避免把两个数字放进同一个总分。模型发布时可以要求离线硬约束和线上 canary 约束都满足,任何一层失败都触发暂停或人工判断。
11.7 评估作业的调度与结果可信度
评估平台自己也是一个批处理系统,但它的交付物不是吞吐,而是可信的结果。因此本节只讨论四件事:作业怎么被调度、失败怎么被分类、结果分几级可信、以及它和业务执行之间的边界在哪里。至于评估 job 的缓存实现、存储分层、容量规划与灾备,属于常规批处理工程,不在本书展开。
评估作业的资源模型与调度边界
评估任务可能是 CPU 规则、单 GPU batch、多个模型 judge、在线 shadow、人工标注或多步任务。job spec 应声明模型 artifact、数据 snapshot、并发、最大 token、超时、重试、GPU、优先级、输出路径和预算。调度器根据资源和 deadline 分配,在线回归不能被大型离线 judge 堵塞。
评估任务按 deadline 和用途分层:提交前 smoke、发布门禁、夜间 broad、线上回放、主动学习、人工标注和大规模 benchmark。它们的资源、数据和保留要求不同,应使用不同资源池或优先级。发布门禁不能被一个长时间 benchmark 阻塞,人工标注也不能被无限自动任务淹没。
调度器要记录 pending reason、预计完成、使用资源和预算。任务需要 gang 资源时一次性分配,分区评估则可以弹性并行;抢占低优先级任务前保存游标与部分提交结果,恢复时只重做未完成分区。
限流要按 evaluator、模型、租户和数据 snapshot 分别设置,并使用 token budget 而不是只限制请求数——大量 judge 请求可能压垮模型 serving、网络和成本预算。评估对线上服务的影子流量同样要限流:影子请求不应改变业务状态,也不应占用生产租户预算,但它确实消耗 GPU 和 cache,因此必须计入容量报告。评估平台与 serving 平台共享 trace id,才能说明某次回归是否造成了生产尾延迟变化。
失败分类、覆盖率与结果可信等级
评估任务遇到模型超时、GPU OOM、judge 不可用、工具沙箱故障、样本非法和输出超长时,结果不能简单填 0。应区分 skipped、invalid、timeout、infra_failed、model_failed 和 judged_negative。聚合器报告覆盖率、失败率和有效样本数;质量门禁在覆盖率不足时阻断,而不是把缺失样本当作通过。
聚合器还要处理缺失、重复和重试:同一 sample_id 的多个 attempt 需要选择最终有效结果并保留历史;超时不能默认为负分;评估器返回非法 JSON 要记为 evaluator_failed;是否进入质量分母依预先冻结的协议决定,所有跳过均报告 coverage 及原因,不能事后删除难例。部分结果可以用于诊断,但不能默认用于发布——如果只完成了容易样本,分数会虚高。
在此之上,给每个结果标注可信等级,让“一个分数”变成“一份证据”。等级由覆盖率、评估器校准、样本版本、运行时完整性、人工复核和统计置信度共同决定;等级不评价模型好坏,只评价证据强弱。
| 等级 | 生成方式 | 允许用途 |
|---|---|---|
| exploratory | 小样本、快速跑,配置未固定 | 探索方向,不得用于发布 |
| diagnostic | 定位问题用,可能只覆盖失败切片 | 排查与修复,不用于发布 |
| regression | 固定回归集,配置与版本完整 | 版本间比较,可作为门禁输入 |
| release-gate | 完整配置、覆盖率检查、门禁规则齐备 | 发布决策 |
| audited | 在 release-gate 基础上增加人工签署与授权记录 | 对外交付与审计 |
发布控制器要求足够等级的 evidence bundle;研究面板可以显示低等级结果,但必须显式标识,防止一个草稿分数被误用为生产证据。
当评估能力降级时——judge 不可用、数据存储故障、覆盖率不足——处理原则是降级必须同时降级证据等级。可以暂停、切换已批准的 judge、使用规则子集或转人工,但必须重新判断门禁,不能为了按时发布而静默跳过困难样本。覆盖率不足时,结果状态应为 INCOMPLETE 而不是 PASSED;人工可以在明确风险和补救计划下批准,并记录期限。
评估协议与生成的可重复性
评估协议定义输入格式、系统指令、历史消息、工具 schema、最大 token、采样、超时、重试和评分。模板变化会改变模型看到的 token、角色和约束,必须作为协议版本。评估器执行时应打印最终 prompt 的 hash、token 数、模板版本和模型版本,必要时保存脱敏后的渲染结果。
协议还必须规定错误处理:模型超时、输出截断、非法 JSON、工具失败、judge 失败和数据缺失分别是什么状态,是否重试,是否进入分母。不同协议混用会让“失败率”失去意义。平台提供统一协议 SDK,可以减少各团队手写脚本造成的行为差异。
temperature 大于零时生成具有随机性,服务端可能使用不同 kernel、batch 或随机数路径。评估可以固定 seed、运行多次取均值、使用确定性解码或保存完整输出;每种方式有不同成本和代表性。报告保存 sampling、seed、重复次数、输出长度和失败样本,不能只保存最终平均分。多步任务还存在外部状态随机性:检索索引变化、工具返回变化、时间、权限和用户上下文。回放使用 snapshot、sandbox 和录制结果,必要时标记与生产有差异。可重复性不是强求位级一致,而是让差异来源可解释,并在质量门限中设置合理容差。
评估调度与业务执行的职责边界
评估调度只负责把固定 case 分发到已批准环境、生成可聚合结果,并控制资源、超时和预算。用户任务的持久状态、外部副作用及恢复由业务执行侧负责,评估系统通过隔离 fixture 或受控回放消费它的接口。不能把“eval 分区重试”解释成“业务写操作可以再调用一次”——这是评估平台最容易越界的地方。
同理,数据 snapshot 的提交标记是应用层协议,不自动获得数据库跨系统 ACID;别名更新要有原子条件,所有分区可见且校验通过后才提交,失败重试不覆盖已接受快照。
11.8 质量门禁、发布与验收
门禁规则
门禁由硬约束、软阈值和人工检查组成。硬约束包括 schema 合法、关键安全指标、工具副作用、数据授权和 artifact 完整;软阈值包括质量变化、延迟、成本、覆盖率和置信区间;人工检查用于裁判争议、重要客户、少数语言和高风险案例。每条规则写明基线、容差、样本、统计方式、owner 和有效期。
门禁结果应可解释。失败报告列出退化能力、样本、模型版本、数据和运行时差异;通过报告列出覆盖范围和剩余不确定性。不能只输出一个绿色或红色状态。模型注册表只接收 evidence bundle 完整的 candidate,灰度控制器读取同一份门禁结果。
A/B、影子与 canary
A/B 比较需要随机化、分桶、实验周期、样本量和停止规则。流量分配要避免同一用户在两个版本间频繁切换;多轮对话和多步任务要按 parent task 分配。影子流量不应触发真实工具副作用,工具结果可以录制或 sandbox。canary 期间同时观察质量、SLO、成本、安全和用户反馈。
统计显著不等于业务重要。一个小指标提升可能没有实际价值,一个高价值任务的少量回退可能必须阻断。报告给出效应大小、置信区间、样本覆盖和业务权重,决策记录由负责人签署。实验结束时归档数据 snapshot、配置和结论,避免无限期占用线上资源。
注册、审批与回滚
模型注册表连接训练、评估、部署和审计。artifact 进入注册表前校验 hash、来源、许可证、质量门禁、兼容矩阵和安全扫描;状态变更记录操作者、时间、原因和证据。回滚选择已验证的旧 artifact、旧模板、旧评估规则和旧路由,而不是只恢复权重。
回滚后要验证线上请求、cache、工具、计费和 trace。新版本产生的反馈不能直接归到旧版本,旧版本回滚期间的请求单独标记。发布控制器保留最近多个健康版本和恢复演练记录,避免“理论上可以回滚”在事故时失败。
新模型候选
新模型候选先通过 artifact、schema、安全和加载检查,再运行 smoke;通过后执行 critical 回归与目标任务评估。模型质量与旧版本做配对比较,输入输出长度和模板固定;同时测 token、GPU、TTFT、TPOT 和成本。遇到关键任务回退时自动阻断,普通任务小幅变化进入人工评审。
Prompt 或模板变更
Prompt 变更看似不改模型,却可能改变 token 长度、prefix cache、工具调用和安全边界。评估使用同一模型与同一数据,比较模板前后输入 token、格式、引用、工具成功和质量。灰度按 parent task 分桶,避免多轮任务混合版本。模板 manifest 和回滚路径与权重一样重要。
检索器或知识库变更
知识库更新先生成新的 snapshot,运行检索 recall、precision、context relevance、引用和最终任务;然后用线上历史 query 回放。若文档删除、权限变化或 chunk 策略变化,旧 cache 和评估结果按血缘失效。检索器质量提升但上下文变长,需重新评估 serving 成本和 TTFT,不能只看答案分数。
量化或 engine 变更
量化和 engine 变更固定模型与数据,比较输出差异、结构化合法、工具参数、长上下文、质量、显存和吞吐。失败样本按层、长度和任务分类,定位是精度、kernel、采样还是模板。通过后先影子,再灰度;回滚同时恢复 engine、量化、cache 和路由。评估结果绑定硬件和 driver,跨硬件不能直接复用。
评估平台的发布接口
发布控制器通过 API 提交 evaluation request,指定 candidate artifact、baseline、dataset snapshot、protocol、metrics、threshold、deadline 和 evidence level。评估平台返回 run id,异步上报状态、分区、结果和最终 report。控制器不读取内部数据库,避免与实现耦合;评估平台也不直接修改生产路由,只提供可验证证据。
接口包含 idempotency key 和 report hash。重复提交返回同一个 run 或明确创建新 attempt;部分结果不覆盖已提交结果;报告生成后不可变,修订通过新版本关联旧报告。这样发布、回滚和审计可以使用稳定引用,避免“页面上分数变了但不知道为什么”。
成本与质量的决策表
发布评审可以使用质量—成本—时延决策表。若质量提升、成本降低、延迟不变,且覆盖、安全、数据与证据门禁也满足,可按既定规则通过;若质量提升但成本显著增加,要求业务审批;若质量不变但成本降低,优先灰度;若质量下降但时延降低,只在低风险场景评估;若安全或关键任务下降,无论成本和延迟如何都阻断。表格不是替代判断,而是把预先接受的取舍公开化。
成本包括数据处理、标注、评估、judge、serving、存储和人工。某个模型在 benchmark 上更便宜,但如果失败导致更多重试和人工,单位成功任务成本可能更高。报告用同一场景比较成功任务、token、GPU、标注和人工时间,避免只看云账单的一部分。预算超限触发停止或降级,不应让评估无限运行。
数据治理验收
随机抽取一个训练或评估 snapshot,验证来源、授权、schema、处理 DAG、分区、统计、去重、敏感等级、manifest hash 和删除流程。修改一个过滤规则,确认血缘能找到受影响的模型和评估;撤回一个数据源,确认新的评估不能继续读取而历史审计仍然可查。质量门禁要覆盖自动断言、人工抽样、失败隔离和重试。
评估可靠性验收
使用固定回归集重复运行,验证结果、随机性、judge、缓存、并发、断点和部分失败语义。故意损坏一个分区、停止一个 worker、让 judge 超时、改变模型版本和修改模板,确认系统不会把缺失或旧结果当成通过。评估报告必须包含覆盖率、失败分类、成本、耗时、质量分层和置信区间。
线上反馈闭环验收
从线上 trace 抽取一批失败样本,验证脱敏、权限、采样、标注、去重、污染检查、回归集候选、修复后评估和发布关联。执行一次漂移检测,确认输入、输出、工具和安全指标能分层;执行一次回放,确认不会触发真实副作用。反馈集和训练集交叉时,血缘系统应阻断或显式标记不可比。
任务结果与模型分数分开判定
| 教学观察 | 模型分数 | 任务/安全/覆盖证据 | 门禁结论 |
|---|---|---|---|
| 流畅度提升但缺必要政策条件 | 可上升 | 业务任务失败 | 阻断该任务范围 |
| JSON合法且调用了未授权写工具 | 可能高分 | 安全不变量失败 | 阻断并调查 |
| 只有容易样本完成 | 表面高分 | 关键切片覆盖不足 | INCOMPLETE或INCONCLUSIVE |
| 规则与任务通过,judge未校准 | 分数未知可信度 | 关键语义证据不足 | 暂诊断,补人工或校准 |
| 全部门禁及批准条件满足 | 分数可解释 | 版本/质量/成本/SLO证据完整 | 进入限定canary |
确定性不变量优先由单元/性质测试验证,协议和工具错误用契约测试,存储/队列/沙箱用集成测试;开放文本按任务标准和多次评测,不按逐字快照拒绝合理措辞变化。高风险链路补端到端与故障注入,Mock用于控制故障并不替代真实环境验收。规则文件、Skill与prompt也作为版本化配置进入同一套对照。发布决策引用完整report hash和责任人,评估执行completed、HTTP成功、judge高分与业务完成始终是不同事实。
11.9 本章小结
评估的规范源是版本化Eval Case、执行记录与不可变报告。数据快照回答使用什么,协议与判定器回答怎样测量,统计与校准回答证据多强,门禁回答谁允许在哪个范围发布。来源提供机制,教学案例提供推演,真实运行需要另行保存环境、样本与结果,三者不能互相替代。
业务执行侧消费这些契约,把它转成可恢复的实际动作;面向轨迹与行为的多步评测沿用这里的样本、分母、校准与报告定义,不另建一套事实源。
11.10 参考资料
- Zaharia, M., et al. Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing. NSDI, 2012. 访问日期:2026-10-17
- Dean, J., & Ghemawat, S. MapReduce: Simplified Data Processing on Large Clusters. OSDI, 2004. 访问日期:2026-10-17
- lakeFS. Version Data. 官方文档,核验2026-10-17.
- TensorFlow. TensorFlow Data Validation. 访问日期:2026-10-17
- Liang, P., et al. Holistic Evaluation of Language Models (HELM). 2022. 访问日期:2026-10-17
- Srivastava, A., et al. Beyond the Imitation Game: Quantifying and extrapolating the capabilities of language models. 2022. 核验2026-10-17
- Es, S., et al. Ragas: Automated Evaluation of Retrieval Augmented Generation. 2023,v2 2025. 核验2026-10-17
- Delta Lake. Delta Lake Documentation: Introduction. 核验2026-10-17.
- MLflow. ML Tracking Documentation. 访问日期:2026-10-17
- Langfuse. Datasets. 官方文档,核验2026-10-17.
- Apache Spark. RDD Programming Guide. 官方4.2.0在线文档,核验2026-10-17.
- Great Expectations. GX Core Overview. 1.24.0,核验2026-10-17.
- Gao, L., et al. The Pile. 2020. 访问日期:2026-10-17
- Grattafiori, A., et al. The Llama 3 Herd of Models. arXiv v3, 2024. 核验日期:2026-10-17
- DVC. Get Started with DVC. 官方数据版本入门,核验2026-10-17.
- 《动手学深度学习》作者. 4.4 模型选择、欠拟合和过拟合. 中文2.0.0. 核验2026-10-17
- Hugging Face. Datasets: Process. 官方文档,核验2026-10-17.
- Prometheus Authors. Prometheus Documentation. 访问日期:2026-10-17
- OpenTelemetry Authors. Signals. 在线文档,核验2026-10-17.
- Hendrycks, D., et al. Measuring Massive Multitask Language Understanding. 2020. 访问日期:2026-10-17
- NIST/SEMATECH. e-Handbook of Statistical Methods: 7.2.4.1 Confidence Intervals. 在线手册,核验2026-10-17.
- Wassily Hoeffding,Probability Inequalities for Sums of Bounded Random Variables,JASA 58(301),1963,13–30;核验于 2026-10-24。
- NIST/SEMATECH,Bonferroni’s method,一般概率不等式;核验于 2026-10-24。配对单元格区间组合为本书推导。
- Liu, Y., et al. G-Eval: NLG Evaluation using GPT-4 with Better Human Alignment. 2023. 核验2026-10-17
- Zheng, L., et al. Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena. 2023. 核验2026-10-17
- Sigelman, B. H., et al. Dapper, a Large-Scale Distributed Systems Tracing Infrastructure. Google Research, 2010. 访问日期:2026-10-17