跳转至

第 13 章:离线评测、在线评测与回归门禁

1. 为什么只有 traces 和 SLO 还不足以改进系统

当你已经有了 traces 和 SLO,很容易产生一种感觉:observability “差不多做完了”。但这其实只是走到一半。

Traces 帮你理解发生了什么。 SLO 帮你定义什么叫系统健康。

但最重要的工程问题还在:如何避免把退化版本发出去,以及如何系统性地提升质量?

这就是 eval loop 的起点。

2. Offline evals 的作用,是在 rollout 之前改变系统

Offline evals 回答的是一个非常实际的问题:“如果我们修改 prompt、policy、retrieval、model routing 或 tool behavior,系统在已知场景上会变好还是变坏?”

好的 offline evals 通常围绕这些东西构建:

  • curated task sets;
  • golden answers 或 expected outcomes;
  • 对 policy 敏感的 edge cases;
  • 棘手的 retrieval scenarios;
  • high-risk tool workflows。

它们的价值在于:你可以在生产流量到来之前比较系统版本。

3. Online evals 之所以必要,是因为真实世界总比测试集更大

即使很好的 offline evals,也无法覆盖 production 中真正发生的一切:

  • 用户会提出新的任务类型;
  • 输入分布会漂移;
  • 外部系统会退化;
  • retrieval 基础会不断变大;
  • policy rules 在新数据上会表现不同。

所以 online evals 不是 offline 的替代,而是第二条闭环:

  • 评估真实流量上的行为;
  • 捕捉 drift;
  • 发现 silent regressions;
  • 观察系统在真实 operational 条件下的表现。

4. 最好的形态不是“offline 或 online”,而是两条闭环同时存在

一种非常实用的模型是:

  • offline evals 在发布前阻挡明显 regressions;
  • online evals 在发布后发现新问题;
  • traces 提供分析原料;
  • SLO 提供 operational 边界;
  • regression gates 阻止质量悄悄下滑。

最好把 eval loop 理解成持续循环,而不是一次性检查

flowchart LR
    A["Code / prompt / policy change"] --> B["Offline evals"]
    B --> C["Regression gates"]
    C --> D["Production rollout"]
    D --> E["Online evals + traces"]
    E --> F["Failure analysis and grading"]
    F --> A

5. Trace grading 对 agent systems 特别有价值

普通应用往往只要 business KPI 和 error rate 就够了。Agent systems 不行,因为质量经常藏在 run 内部,而不只在最终答案上。

Trace grading 的价值在于,你可以评估:

  • retrieval 是否合适;
  • tool call 是否必要;
  • prompt 是否被过度塞满;
  • 是否发生 unnecessary escalation;
  • 是否遵守了 policy constraints;
  • workflow 是否高效。

这在 final result 看起来还“不错”,但系统已经悄悄变慢、变贵或变危险时特别重要。

6. Eval dataset 里应该放什么

一个很常见的错误是:eval dataset 主要由舒服的 demo 场景组成。这种集合几乎帮不上什么忙。

好的 dataset 通常会包含:

  • happy-path 任务;
  • ambiguous user requests;
  • prompt injection attempts;
  • retrieval edge cases;
  • missing-data scenarios;
  • tool timeout 和 partial failure cases;
  • approval-required flows;
  • cross-tenant 和 privacy-sensitive cases。

真正的工程价值,通常正是在这些困难又不舒服的场景里。

7. Regression gate 应该是形式化的,而不是“大家看了一眼”

团队常会说:“我们测过了,感觉没有更差。” 对 production-grade 的 agent system 来说,这远远不够。

Regression gate 更有价值的做法,是把它定义为一组明确规则,例如:

  • critical eval set 上的 success rate 不能下降;
  • safety metrics 不能退化;
  • cost per task 不能超过阈值;
  • escalation rate 不能升高;
  • prompt budget 或 tool count per run 不能超过上限。

这样 rollout 决策就不会只依赖改动作者的直觉。

8. 一个 eval gate policy 示例

gates:
  offline:
    min_task_success_rate: 0.97
    max_policy_violation_rate: 0.002
    max_avg_cost_delta_pct: 8
  online:
    max_slo_burn_rate: 1.0
    max_manual_intervention_rate: 0.08
    max_unknown_side_effect_rate: 0.0005
  rollout:
    require_offline_pass: true
    require_online_shadow_period: true

这些数字不是普适标准。重要的是 gate 要可机读,团队对它的争论应发生在标准层,而不是感觉层。

9. 一个简单的 regression decision 示例

from dataclasses import dataclass


@dataclass
class EvalSummary:
    task_success_rate: float
    policy_violation_rate: float
    avg_cost_delta_pct: float


def passes_regression_gate(summary: EvalSummary) -> bool:
    if summary.task_success_rate < 0.97:
        return False
    if summary.policy_violation_rate > 0.002:
        return False
    if summary.avg_cost_delta_pct > 8:
        return False
    return True

代码刻意很简单。恰恰是这种简单性,让 gate 对团队而言可理解、可讨论。

10. Online evals 必须和 rollout strategy 连起来

一个非常有用的做法是不要把大变更一次性打给所有人,而是使用:

  • shadow mode;
  • canary rollout;
  • limited tenant exposure;
  • model routing experiments;
  • staged policy rollout。

这样 online evals 就不只是“上线后看看会不会出事”,而是 release process 中的受控阶段。

11. Eval culture 最常见的崩坏点

这些问题很常见:

  • offline evals 太像玩具;
  • online evals 和 traces 断开;
  • regression gates 只看 success rate;
  • safety regressions 不阻止 rollout;
  • cost regressions 不被当成真正的 regressions;
  • dataset 不更新,系统开始优化陈旧场景。

一旦如此,eval loop 就会退化成 ritual,而不是改进机制。

12. 实用检查清单

如果你想快速检查 eval loop,可以问:

  • 是否有针对关键场景的 curated offline eval set?
  • 是否有和 traces、SLO 相连的 online eval signal?
  • 是否不仅能 grade final answer,也能 grade run 本身?
  • rollout 前是否存在 formal regression gate?
  • 是否把 safety 和 cost 也放进了 gate,而不只是 task success?
  • eval dataset 是否会依据真实事故持续更新?

如果连续几个答案都是否,那说明你可能已经有 observability,但还没有真正的 learning loop。

13. 接下来读什么

Part V 到这里已经是一个完整的 operational block:traces、SLO 和 eval loop。下一步自然就是组织模型,因为这种平台最终既会碰到代码问题,也会碰到团队设计问题。