Eval 集治理与 Golden Set 生命周期
🏠 返回 07-README | ⬅️ 06-Harness 全栈 | ➡️ 11-AI制品Registry与发布门禁
定位 :Agent 架构师 「怎么保证发布不回归」 的组织答案------不只讲 faithfulness 公式,而是 Golden Set 从哪来、谁改、如何 pin、如何回流 。机制指标见 02-评估;CI 门禁见 06-Harness;四维版本见 11-Registry。
不重复 :LLM-Judge 校准、RAGAS 公式 → 02 §4--§8。
L1 · 是什么
1.1 一句话定义
Eval 集治理 = 把 Golden Set / Trajectory Set 当作 受版本控制的软件制品 :有 owner、有变更流程、有发布门禁、有线上回流闭环------让「能上线」变成 可审计的统计结论,而不是某次手工试聊感觉还行。
1.2 三类评测集(不要混用)
| 类型 | 内容 | 更新频率 | 用途 |
|---|---|---|---|
| Golden Set(回归) | 输入 + 期望行为(引用片段 / 工具名 / 拒答) | 周--月,PR 审批 | 发布 Gate,阻断劣化 |
| Shadow / 探针集 | 线上采样脱敏对话 | 日 | 离线--在线 gap 监测 |
| Red Team / 对抗集 | 注入、越权、诱导承诺 | sprint | 安全门禁,可与 Golden 分库 |
#mermaid-svg-Z25oEwdaisH6PbTR{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Z25oEwdaisH6PbTR .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Z25oEwdaisH6PbTR .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Z25oEwdaisH6PbTR .error-icon{fill:#552222;}#mermaid-svg-Z25oEwdaisH6PbTR .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Z25oEwdaisH6PbTR .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Z25oEwdaisH6PbTR .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Z25oEwdaisH6PbTR .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Z25oEwdaisH6PbTR .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Z25oEwdaisH6PbTR .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Z25oEwdaisH6PbTR .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Z25oEwdaisH6PbTR .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Z25oEwdaisH6PbTR .marker.cross{stroke:#333333;}#mermaid-svg-Z25oEwdaisH6PbTR svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Z25oEwdaisH6PbTR p{margin:0;}#mermaid-svg-Z25oEwdaisH6PbTR .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Z25oEwdaisH6PbTR .cluster-label text{fill:#333;}#mermaid-svg-Z25oEwdaisH6PbTR .cluster-label span{color:#333;}#mermaid-svg-Z25oEwdaisH6PbTR .cluster-label span p{background-color:transparent;}#mermaid-svg-Z25oEwdaisH6PbTR .label text,#mermaid-svg-Z25oEwdaisH6PbTR span{fill:#333;color:#333;}#mermaid-svg-Z25oEwdaisH6PbTR .node rect,#mermaid-svg-Z25oEwdaisH6PbTR .node circle,#mermaid-svg-Z25oEwdaisH6PbTR .node ellipse,#mermaid-svg-Z25oEwdaisH6PbTR .node polygon,#mermaid-svg-Z25oEwdaisH6PbTR .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Z25oEwdaisH6PbTR .rough-node .label text,#mermaid-svg-Z25oEwdaisH6PbTR .node .label text,#mermaid-svg-Z25oEwdaisH6PbTR .image-shape .label,#mermaid-svg-Z25oEwdaisH6PbTR .icon-shape .label{text-anchor:middle;}#mermaid-svg-Z25oEwdaisH6PbTR .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Z25oEwdaisH6PbTR .rough-node .label,#mermaid-svg-Z25oEwdaisH6PbTR .node .label,#mermaid-svg-Z25oEwdaisH6PbTR .image-shape .label,#mermaid-svg-Z25oEwdaisH6PbTR .icon-shape .label{text-align:center;}#mermaid-svg-Z25oEwdaisH6PbTR .node.clickable{cursor:pointer;}#mermaid-svg-Z25oEwdaisH6PbTR .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Z25oEwdaisH6PbTR .arrowheadPath{fill:#333333;}#mermaid-svg-Z25oEwdaisH6PbTR .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Z25oEwdaisH6PbTR .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Z25oEwdaisH6PbTR .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Z25oEwdaisH6PbTR .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Z25oEwdaisH6PbTR .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Z25oEwdaisH6PbTR .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Z25oEwdaisH6PbTR .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Z25oEwdaisH6PbTR .cluster text{fill:#333;}#mermaid-svg-Z25oEwdaisH6PbTR .cluster span{color:#333;}#mermaid-svg-Z25oEwdaisH6PbTR div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Z25oEwdaisH6PbTR .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Z25oEwdaisH6PbTR rect.text{fill:none;stroke-width:0;}#mermaid-svg-Z25oEwdaisH6PbTR .icon-shape,#mermaid-svg-Z25oEwdaisH6PbTR .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Z25oEwdaisH6PbTR .icon-shape p,#mermaid-svg-Z25oEwdaisH6PbTR .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Z25oEwdaisH6PbTR .icon-shape .label rect,#mermaid-svg-Z25oEwdaisH6PbTR .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Z25oEwdaisH6PbTR .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Z25oEwdaisH6PbTR .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Z25oEwdaisH6PbTR :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 在线
离线
人审确认
pass
fail
Golden Set vN
Harness CI
生产流量采样
Badcase 队列
发布
修复 prompt/tool/KB
1.3 与 AgentOps 的关系
| AgentOps 支柱 | 本篇交付物 |
|---|---|
| Eval | 数据集版本 eval_set_id@sha |
| Trace | badcase 必须带 trace_id 回放 |
| Alert | 在线 faithfulness 跌 → 触发「是否回流 Golden」 |
| Cost | 每次 eval run 记账 $ / eval_run |
详见 08-可观测 三合一 join。
L2 · 生命周期(七阶段)
2.1 总览
#mermaid-svg-pXDerw0iWjwkRebF{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-pXDerw0iWjwkRebF .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-pXDerw0iWjwkRebF .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-pXDerw0iWjwkRebF .error-icon{fill:#552222;}#mermaid-svg-pXDerw0iWjwkRebF .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-pXDerw0iWjwkRebF .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-pXDerw0iWjwkRebF .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-pXDerw0iWjwkRebF .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-pXDerw0iWjwkRebF .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-pXDerw0iWjwkRebF .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-pXDerw0iWjwkRebF .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-pXDerw0iWjwkRebF .marker{fill:#333333;stroke:#333333;}#mermaid-svg-pXDerw0iWjwkRebF .marker.cross{stroke:#333333;}#mermaid-svg-pXDerw0iWjwkRebF svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-pXDerw0iWjwkRebF p{margin:0;}#mermaid-svg-pXDerw0iWjwkRebF defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-pXDerw0iWjwkRebF g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-pXDerw0iWjwkRebF g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-pXDerw0iWjwkRebF g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-pXDerw0iWjwkRebF g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-pXDerw0iWjwkRebF g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-pXDerw0iWjwkRebF .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-pXDerw0iWjwkRebF .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-pXDerw0iWjwkRebF .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-pXDerw0iWjwkRebF .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-pXDerw0iWjwkRebF .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-pXDerw0iWjwkRebF .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-pXDerw0iWjwkRebF .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-pXDerw0iWjwkRebF .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-pXDerw0iWjwkRebF .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-pXDerw0iWjwkRebF .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-pXDerw0iWjwkRebF .edgeLabel .label text{fill:#333;}#mermaid-svg-pXDerw0iWjwkRebF .label div .edgeLabel{color:#333;}#mermaid-svg-pXDerw0iWjwkRebF .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-pXDerw0iWjwkRebF .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-pXDerw0iWjwkRebF .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-pXDerw0iWjwkRebF .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-pXDerw0iWjwkRebF .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-pXDerw0iWjwkRebF .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-pXDerw0iWjwkRebF .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-pXDerw0iWjwkRebF #statediagram-barbEnd{fill:#333333;}#mermaid-svg-pXDerw0iWjwkRebF .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-pXDerw0iWjwkRebF .cluster-label,#mermaid-svg-pXDerw0iWjwkRebF .nodeLabel{color:#131300;}#mermaid-svg-pXDerw0iWjwkRebF .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-pXDerw0iWjwkRebF .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-pXDerw0iWjwkRebF .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-pXDerw0iWjwkRebF .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-pXDerw0iWjwkRebF .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-pXDerw0iWjwkRebF .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-pXDerw0iWjwkRebF .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-pXDerw0iWjwkRebF .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-pXDerw0iWjwkRebF .note-edge{stroke-dasharray:5;}#mermaid-svg-pXDerw0iWjwkRebF .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-pXDerw0iWjwkRebF .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-pXDerw0iWjwkRebF .statediagram-note text{fill:black;}#mermaid-svg-pXDerw0iWjwkRebF .statediagram-note .nodeLabel{color:black;}#mermaid-svg-pXDerw0iWjwkRebF .statediagram .edgeLabel{color:red;}#mermaid-svg-pXDerw0iWjwkRebF #dependencyStart,#mermaid-svg-pXDerw0iWjwkRebF #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-pXDerw0iWjwkRebF .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-pXDerw0iWjwkRebF :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 产品/运营提需求
双人标注+仲裁
入 Git/Langfuse Dataset
PR 触发 Harness
Canary 5%
全量
线上采样
Badcase 回流
Draft
Review
Versioned
CI
Staged
Prod
Sample
2.2 阶段 0:需求与分层(RACI)
| 角色 | 责任 | 交付 |
|---|---|---|
| 产品/业务 | 定义场景优先级、合规红线 | 场景矩阵(意图 × 风险级) |
| Applied AI | 设计用例、写 rubric | cases.yaml 草稿 |
| 标注团队 | 双人标注 + IAA | 标注平台导出 |
| 平台/ML | Harness、CI、版本 pin | Pipeline + Registry 记录 |
| SRE/On-call | 在线告警、回滚 | Runbook |
Staff 口播 :「Golden Set 不是算法同学私藏 Excel,而是 平台托管、Git 或 Langfuse Dataset 版本化 的制品。」
2.2.1 分层采样(防偏见)
| 桶 | 占比建议 | 说明 |
|---|---|---|
| Head 意图 | 40% | Top-20 意图各 ≥5 条 |
| 长尾 | 30% | 低置信线上采样 |
| 高风险 | 20% | 资金/合规/承诺类 100% 覆盖 |
| 回归事故 | 10% | 每次 P0 事故 +1 条 永久保留 |
2.3 阶段 1:用例 Schema(Agent 专用)
最小字段 (YAML/JSONL,与 09-kit eval 对齐):
yaml
id: cs_refund_0142
tenant: default
input:
messages:
- role: user
content: "订单 8821 能退吗,已过 7 天"
context:
user_id: u_1001
order_id: "8821"
expect:
must_call_tools: [] # 空 = 禁止写操作
must_cite_kb: true
forbidden_substrings: ["保证退款", "一定赔"]
max_tool_calls: 3
trajectory_hash: null # 可选:固定工具序列
metadata:
risk: high
source: badcase_2026-03-12
trace_id: tr_abc123
Trajectory eval (多步 Agent):expect.trajectory 允许 有序工具名 + 参数子集匹配 ,见 06-Harness 与 buy-team demo eval/*.yaml。
2.4 阶段 2:版本与不可变
| 实践 | 说明 |
|---|---|
| 内容寻址 | eval_set_id = sha256(normalize(cases)) |
| 与发布绑定 | 发布记录写 eval_set_id@commit + prompt@ver + model@ver(见 11) |
| 禁止原地改 | 改一条 = 新版本;旧版本保留 90d 可回放 |
Langfuse(L1) :Dataset 版本 + Run 对比------Datasets 官方支持版本化实验。
2.5 阶段 3:PR 门禁(Harness)
#mermaid-svg-VT2rhREKCg80ps1u{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-VT2rhREKCg80ps1u .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-VT2rhREKCg80ps1u .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-VT2rhREKCg80ps1u .error-icon{fill:#552222;}#mermaid-svg-VT2rhREKCg80ps1u .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-VT2rhREKCg80ps1u .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-VT2rhREKCg80ps1u .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-VT2rhREKCg80ps1u .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-VT2rhREKCg80ps1u .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-VT2rhREKCg80ps1u .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-VT2rhREKCg80ps1u .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-VT2rhREKCg80ps1u .marker{fill:#333333;stroke:#333333;}#mermaid-svg-VT2rhREKCg80ps1u .marker.cross{stroke:#333333;}#mermaid-svg-VT2rhREKCg80ps1u svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-VT2rhREKCg80ps1u p{margin:0;}#mermaid-svg-VT2rhREKCg80ps1u .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-VT2rhREKCg80ps1u .cluster-label text{fill:#333;}#mermaid-svg-VT2rhREKCg80ps1u .cluster-label span{color:#333;}#mermaid-svg-VT2rhREKCg80ps1u .cluster-label span p{background-color:transparent;}#mermaid-svg-VT2rhREKCg80ps1u .label text,#mermaid-svg-VT2rhREKCg80ps1u span{fill:#333;color:#333;}#mermaid-svg-VT2rhREKCg80ps1u .node rect,#mermaid-svg-VT2rhREKCg80ps1u .node circle,#mermaid-svg-VT2rhREKCg80ps1u .node ellipse,#mermaid-svg-VT2rhREKCg80ps1u .node polygon,#mermaid-svg-VT2rhREKCg80ps1u .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-VT2rhREKCg80ps1u .rough-node .label text,#mermaid-svg-VT2rhREKCg80ps1u .node .label text,#mermaid-svg-VT2rhREKCg80ps1u .image-shape .label,#mermaid-svg-VT2rhREKCg80ps1u .icon-shape .label{text-anchor:middle;}#mermaid-svg-VT2rhREKCg80ps1u .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-VT2rhREKCg80ps1u .rough-node .label,#mermaid-svg-VT2rhREKCg80ps1u .node .label,#mermaid-svg-VT2rhREKCg80ps1u .image-shape .label,#mermaid-svg-VT2rhREKCg80ps1u .icon-shape .label{text-align:center;}#mermaid-svg-VT2rhREKCg80ps1u .node.clickable{cursor:pointer;}#mermaid-svg-VT2rhREKCg80ps1u .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-VT2rhREKCg80ps1u .arrowheadPath{fill:#333333;}#mermaid-svg-VT2rhREKCg80ps1u .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-VT2rhREKCg80ps1u .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-VT2rhREKCg80ps1u .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-VT2rhREKCg80ps1u .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-VT2rhREKCg80ps1u .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-VT2rhREKCg80ps1u .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-VT2rhREKCg80ps1u .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-VT2rhREKCg80ps1u .cluster text{fill:#333;}#mermaid-svg-VT2rhREKCg80ps1u .cluster span{color:#333;}#mermaid-svg-VT2rhREKCg80ps1u div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-VT2rhREKCg80ps1u .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-VT2rhREKCg80ps1u rect.text{fill:none;stroke-width:0;}#mermaid-svg-VT2rhREKCg80ps1u .icon-shape,#mermaid-svg-VT2rhREKCg80ps1u .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-VT2rhREKCg80ps1u .icon-shape p,#mermaid-svg-VT2rhREKCg80ps1u .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-VT2rhREKCg80ps1u .icon-shape .label rect,#mermaid-svg-VT2rhREKCg80ps1u .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-VT2rhREKCg80ps1u .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-VT2rhREKCg80ps1u .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-VT2rhREKCg80ps1u :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 全过
任一 fail
PR: prompt/tool/KB
单元: schema/护栏
Golden: faithfulness Δ
Trajectory: 非法工具率
成本: token 回归 <5%
合并
阻断
阈值示例(按业务校准):
| 指标 | Gate | 说明 |
|---|---|---|
faithfulness |
劣化 <0.5pp | 对上一稳定版 |
cite_rate |
不得降 | 客服/合规场景 |
illegal_tool_rate |
=0 | 越权调用 |
avg_cost_per_case |
+5% 需审批 | FinOps |
实现锚点:06-Harness、19 Harness demo。
2.6 阶段 4:Canary 与在线探针
| 层 | 做法 |
|---|---|
| 流量 | hash(user_id)%100 < 5 走候选四维版本 |
| 指标 | CSAT/FCR 延迟 24--72h;先看代理指标:转人工率、拒答率 |
| 探针 | 每小时 N 条固定 probe 对话,与 Golden 同 rubric 自动打分 |
离线--在线 gap(EVAL_OFFLINE_ONLINE_GAP):
| 根因 | 信号 | 治理动作 |
|---|---|---|
| 分布漂移 | 在线新意图占比↑ | Shadow 集加权回流 |
| 索引延迟 | cite 跌、检索空 | KB 管道告警 |
| 采样偏差 | Golden 过「干净」 | 提高 badcase 采样权重 |
| Judge 漂移 | κ 跌 | 重校准 rubric(02 §4) |
2.7 阶段 5:Badcase 回流
Golden Repo Quality Pipeline Agent User Golden Repo Quality Pipeline Agent User #mermaid-svg-7yfFnscv5h7qUbbQ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-7yfFnscv5h7qUbbQ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-7yfFnscv5h7qUbbQ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-7yfFnscv5h7qUbbQ .error-icon{fill:#552222;}#mermaid-svg-7yfFnscv5h7qUbbQ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-7yfFnscv5h7qUbbQ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-7yfFnscv5h7qUbbQ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-7yfFnscv5h7qUbbQ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-7yfFnscv5h7qUbbQ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-7yfFnscv5h7qUbbQ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-7yfFnscv5h7qUbbQ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-7yfFnscv5h7qUbbQ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-7yfFnscv5h7qUbbQ .marker.cross{stroke:#333333;}#mermaid-svg-7yfFnscv5h7qUbbQ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-7yfFnscv5h7qUbbQ p{margin:0;}#mermaid-svg-7yfFnscv5h7qUbbQ .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-7yfFnscv5h7qUbbQ text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-7yfFnscv5h7qUbbQ .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-7yfFnscv5h7qUbbQ .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-7yfFnscv5h7qUbbQ .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-7yfFnscv5h7qUbbQ .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-7yfFnscv5h7qUbbQ #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-7yfFnscv5h7qUbbQ .sequenceNumber{fill:white;}#mermaid-svg-7yfFnscv5h7qUbbQ #sequencenumber{fill:#333;}#mermaid-svg-7yfFnscv5h7qUbbQ #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-7yfFnscv5h7qUbbQ .messageText{fill:#333;stroke:none;}#mermaid-svg-7yfFnscv5h7qUbbQ .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-7yfFnscv5h7qUbbQ .labelText,#mermaid-svg-7yfFnscv5h7qUbbQ .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-7yfFnscv5h7qUbbQ .loopText,#mermaid-svg-7yfFnscv5h7qUbbQ .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-7yfFnscv5h7qUbbQ .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-7yfFnscv5h7qUbbQ .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-7yfFnscv5h7qUbbQ .noteText,#mermaid-svg-7yfFnscv5h7qUbbQ .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-7yfFnscv5h7qUbbQ .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-7yfFnscv5h7qUbbQ .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-7yfFnscv5h7qUbbQ .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-7yfFnscv5h7qUbbQ .actorPopupMenu{position:absolute;}#mermaid-svg-7yfFnscv5h7qUbbQ .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-7yfFnscv5h7qUbbQ .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-7yfFnscv5h7qUbbQ .actor-man circle,#mermaid-svg-7yfFnscv5h7qUbbQ line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-7yfFnscv5h7qUbbQ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 对话 错误回答 投诉/低分/转人工 trace 切片+脱敏 LLM 预标+人审 PR 新增 case CI Harness
规则:
- 每条回流必须附
trace_id+version_pin(prompt/model/KB/tool)。 - P0 合规/资金类 24h 内 进入 Golden,且标记
regression: permanent。 - 重复相似 query 聚类 后合并,避免 Golden 膨胀失控。
2.8 阶段 6:退役与归档
| 条件 | 动作 |
|---|---|
| 意图下线 | 用例 deprecated: true,保留 90d |
| 政策变更 | 批量 valid_to,重跑 embed 不测用例删 |
| 模型换代 | 保留旧集 只读 对比新模型分桶 |
L3 · 生产落地
3.1 目录与仓库布局
text
eval/
golden/
customer_service/
v2026.05.28/
cases.yaml
rubric.md
shadow/
weekly_2026_w21.jsonl
redteam/
injection_v3.yaml
harness/
thresholds.yaml
与 monorepo 代码同仓 或 独立 eval-repo (大组织)------关键是有 同一 CI 触发。
3.2 指标看板(最小集)
| 面板 | 维度 |
|---|---|
| Golden 规模 | 场景数、风险桶占比 |
| PR 阻断率 | 周趋势(过高=集太脆或模型不稳) |
| 回流 TAT | badcase → 入 Golden 中位天数 |
| Offline vs Online | faithfulness 差值、SRM |
| Eval 成本 | $ / run、GPU judge 占比 |
3.3 与 13 Playbook 对齐
| Playbook 域 | 本篇钩子 |
|---|---|
| §6 评估 | Golden 版本 = 发布必要条件 |
| §9 可靠性 | 事故用例永久入集 |
| §11 生命周期 | 四维版本 + eval_set 联合回滚 |
L4 · Staff 答辩
4.1 STAR-M-P:faithfulness 周降 9pp
| 要素 | 内容 |
|---|---|
| S | 大促后客服 faithfulness 从 0.88→0.79,投诉「政策答错」 |
| T | 7 天内恢复,禁止全量换模型 |
| A | 比对 kb_index_version;发现运营 PDF 未入管道;重跑 chunk+embed;Golden 增 40 条政策题;PR Gate 加 cite_rate 硬门槛 |
| M | 根因 KB 管道断流,非模型能力问题 |
| P | cite 0.78→0.91;转人工 -15%;eval_set 升 v2026.03.20 |
4.2 大厂追问答(节选)
Q1 · Golden Set 谁拥有?算法还是平台?
答 :平台拥有流程,业务拥有场景优先级 。Applied AI 写 rubric 与用例;平台提供 Harness、版本、CI;标注团队出标注;合并权 在 Tech Lead + 合规代表(高风险桶)。
Q2 · 500 条够吗?
答 :看 分桶覆盖 而非总数。Staff 口径:Top-20 意图全覆盖 + 每意图 ≥5 条 + 高风险 100% + 每次事故 +1。500 条 head 重复 不如 200 条分层。
Q3 · LLM-as-Judge 能否当唯一 Gate?
答 :不能 。Judge 作 一阶筛选 ;资金/合规/承诺类 人评抽检 + 规则断言 (forbidden_substrings、must_cite_kb)。每月 κ 校准(02)。
Q4 · 线上指标和 Golden 不一致怎么办?
答 :先查 分布与延迟 :新意图、索引延迟、CSAT 反馈滞后。建 Shadow 集 对齐在线分布;gap>2pp 触发 回流 sprint,而不是调低 Gate 阈值。
Q5 · Agent Trajectory 怎么测?
答 :三层 ------(1) 规则:非法工具、超步数、缺 HITL;(2) 轨迹哈希或有序工具名;(3) 端到端 outcome(订单状态不变)。与 96 §4 HARNESS_TRAJECTORY_DRIFT 对照。
4.3 与 Harness / CI 的契约
| 工件 | 生产者 | 消费者 |
|---|---|---|
cases.yaml |
Applied AI + 标注 | pytest / mvn test trajectory |
thresholds.yaml |
平台 | CI Gate |
eval_report.json |
Harness | Registry release_id 附件 |
rubric.md |
合规 + 产品 | LLM-Judge prompt 版本 |
GitHub Actions 示意(面试白板,非仓库强制):
yaml
name: agent-eval-gate
on: pull_request
jobs:
golden:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: pip install -e 09-industrial-agent-kit/python
- run: pytest eval/harness -q --threshold-file eval/thresholds.yaml
与 09-kit golden-harness 对齐;Java 轨见 buy-team TrajectoryEvalTest。
4.4 组织反模式(面试加分)
| 反模式 | 后果 | 治理修复 |
|---|---|---|
| Golden 只增不减 | CI 变慢、维护放弃 | 季度归档 + 分桶配额 |
| 只有 happy path | 线上事故重复 | 事故库 永久用例 |
| Judge 当唯一真相 | 长答案偏好、合规漏检 | 规则断言 + 人审 |
无 trace_id 回流 |
无法复现 | 质检流水线强制字段 |
| 改 Gate 阈值「过线」 | Goodhart | 双指标 + 业务 sign-off |
4.5 场景速查(面试 60s)
| 业务 | Golden 必含 | 特殊 Gate |
|---|---|---|
| 客服 RAG | cite + 拒答 | must_cite_kb |
| 退款 Agent | 工具序列 + HITL | illegal_tool_rate=0 |
| Text2SQL | 沙箱 + RLS 负例 | 越权 SQL 拦截 |
| Browser | 域名白名单 | 无支付点击 |
| 多租户 | tenant 标签 | 跨租户检索用例 |
4.6 Oncall Runbook(faithfulness 告警)
- 拉取
release_id分布------是否单版本劣化。 - 比对
kb_index_ref/prompt_ref变更时间线。 - 抽样 20 条 trace → 人工判因(检索空 / 幻觉 / 工具错)。
- 若确认回归:先回滚一维 (见 11 §3.3)。
- 24h 内 badcase 入 Golden + 扩 Gate 规则。
§7 仓库样例与 Release 绑定
本库提供可解析工件(面试/CI 示意):
| 文件 | 说明 |
|---|---|
| eval/golden/agent_platform_sample.yaml | 3 条:诱导承诺 / 轨迹 / RAG cite |
| eval/thresholds.yaml | faithfulness / illegal_tool / cost 阈值 |
| eval/README.md | 本地验证说明 |
Release Record 绑定示例:
json
{
"release_id": "rel_2026_05_28_demo",
"eval_set_ref": "golden_agent_platform_v2026.05.28",
"eval_report_uri": "ci://agent-eval-gate/validate-eval-artifacts"
}
CI:仓库根 .github/workflows/agent-eval-gate.yml 校验 YAML 可解析 + nlp-kit / 09-java / harness。
§8 Langfuse Dataset 字段对照(L1)
| Langfuse 概念 | 本库对应 | 面试说法 |
|---|---|---|
| Dataset | Golden Set 集合 | 版本化评测集 |
| Dataset Item | cases[] 一行 |
输入+expect |
| Dataset Run | 一次 Harness 执行 | 绑定 release_id |
| Run Score | faithfulness 等 | PR Gate 输入 |
| Prompt version | Registry prompt_ref |
与 eval 同发布 |
§9 Staff 白板脚本(45min · Eval 治理专章)
| 分钟 | 内容 |
|---|---|
| 0--5 | 三类集:Golden / Shadow / Red Team |
| 5--15 | 七阶段状态图 + badcase 回流序列 |
| 15--25 | PR Gate 四维阈值 + Harness |
| 25--35 | RACI + offline-online gap 表 |
| 35--40 | STAR faithfulness(KB 管道) |
| 40--45 | 追问:Judge κ、轨迹 eval、多租户分桶 |
§10 与 98 口播映射(G01--G05)
| 口播 ID | 本篇章节 |
|---|---|
| G01 Golden 谁负责 | §2.2 RACI |
| G02 三类集区别 | §1.2 |
| G03 PR Gate 阈值 | §2.5、§7 |
| G04 回流字段 | §2.7 |
| G05 offline-online gap | §2.6 |
5. 面试前 Checklist
- 能画 七阶段生命周期 与 badcase 回流
- 能述 RACI 与三类评测集区别
- 能列 PR Gate 四类阈值(质量/轨迹/成本/安全)
- 能解释 offline--online gap 四类根因
- 能口述 STAR faithfulness 下跌(KB 非模型)
- 知道 Langfuse Dataset 版本 与 Git 二选一或双写
6. 导航
| 关联 | 路径 |
|---|---|
| 指标定义 | 02-评估 |
| Harness | 06-Harness |
| 发布四维 | 11-Registry |
| 十二域 | 13-Playbook |
| 工业级 Catalog | 96 §4 EVAL_* |
| 子 97 | llm-agent/97 |
官方文档与源码(一级依据)
See registry · 机制对齐 Langfuse Datasets 、OpenTelemetry 、Spring AI Observation (eval 元数据挂载)。
L1 · 官方文档
- Langfuse --- Datasets & Experiments
- OpenTelemetry --- Semantic Conventions for GenAI
- Spring AI --- Observability
L2 · 官方源码