为什么 Agent 回答正确,仍然可能是一次失败的运行?
为什么 LLM-as-a-Judge 不能直接代表真相?
如何用规则、黄金数据、人工审核和 Langfuse Worker,构建异步、持续、低耦合的企业评估体系?
项目:FinQA DeepAgents + FastAPI + Vue 3 + Langfuse
文档版本:v1.0
更新日期:2026-07-29
讲师:肖斌
一、核心问题:Agent 回答正确,为什么仍然可能失败?
1.1 普通程序和 Agent 的差别
传统程序通常是:
text
固定输入 → 固定代码路径 → 固定输出
只要输入、代码和环境相同,输出基本相同,所以我们可以使用断言:
python
assert add(1, 2) == 3
Agent 却更像一个"拥有工具和自主决策权的员工":
text
用户问题
→ LLM 理解任务
→ 选择工具
→ 填写参数
→ 读取数据
→ 调用子 Agent
→ 根据中间结果继续决策
→ 生成最终回答
这条路径不是完全固定的。即使最终答案相同,中间过程也可能完全不同。
1.2 一个容易误判的例子
假设用户问:
text
请计算 Apple 2014 年长期债务占经营活动现金流的比例。
Agent 最后回答:
text
结果为 24.26%。
只看最终答案,好像正确。但它可能经历了四种完全不同的过程:
| 情况 | 最终答案 | 实际过程 | 是否应判为成功 |
|---|---|---|---|
| A | 24.26% | 查询正确报告、读取正确年份、使用正确公式 | 是 |
| B | 24.26% | 使用了错误报告,只是碰巧得到相同数字 | 否 |
| C | 24.26% | 没有查询 SQLite,直接根据模型记忆猜测 | 否 |
| D | 24.26% | 子 Agent 得到正确数据,但主 Agent 忽略单位并错误换算两次,最后又碰巧抵消 | 否 |
最终答案正确,只能证明"结果碰巧对了",不能证明 Agent 的工作方式可靠。
这就是 Agent 评估比普通问答评估更难的根本原因。
1.3 Agent 的质量不是一个分数
一个企业 Agent 的质量至少包含六个部分:

Agent 研究也越来越重视工具调用轨迹,而不是只看最终答案。例如 AgentBench 关注 Agent 在交互环境中的长期推理和决策能力;轨迹型研究还会检查工具选择、参数、依赖和调用顺序。AgentBench 论文、TRAJECT-Bench 论文
本节总结
传统软件测试一个函数,Agent 评估一名"数字员工"。
我们不仅要看它交付了什么,还要看它查了什么、调用了什么、为什么这么做,以及花了多少成本。
二、Agent 评估到底评估什么?
2.1 三条分类轴
面对大量评估名词,不要先背指标。只需要先回答三个问题:
#mermaid-svg-Kvsh4FJuaJRK1Tqm{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-Kvsh4FJuaJRK1Tqm .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Kvsh4FJuaJRK1Tqm .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Kvsh4FJuaJRK1Tqm .error-icon{fill:#552222;}#mermaid-svg-Kvsh4FJuaJRK1Tqm .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Kvsh4FJuaJRK1Tqm .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Kvsh4FJuaJRK1Tqm .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Kvsh4FJuaJRK1Tqm .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Kvsh4FJuaJRK1Tqm .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Kvsh4FJuaJRK1Tqm .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Kvsh4FJuaJRK1Tqm .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Kvsh4FJuaJRK1Tqm .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Kvsh4FJuaJRK1Tqm .marker.cross{stroke:#333333;}#mermaid-svg-Kvsh4FJuaJRK1Tqm svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Kvsh4FJuaJRK1Tqm p{margin:0;}#mermaid-svg-Kvsh4FJuaJRK1Tqm .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Kvsh4FJuaJRK1Tqm .cluster-label text{fill:#333;}#mermaid-svg-Kvsh4FJuaJRK1Tqm .cluster-label span{color:#333;}#mermaid-svg-Kvsh4FJuaJRK1Tqm .cluster-label span p{background-color:transparent;}#mermaid-svg-Kvsh4FJuaJRK1Tqm .label text,#mermaid-svg-Kvsh4FJuaJRK1Tqm span{fill:#333;color:#333;}#mermaid-svg-Kvsh4FJuaJRK1Tqm .node rect,#mermaid-svg-Kvsh4FJuaJRK1Tqm .node circle,#mermaid-svg-Kvsh4FJuaJRK1Tqm .node ellipse,#mermaid-svg-Kvsh4FJuaJRK1Tqm .node polygon,#mermaid-svg-Kvsh4FJuaJRK1Tqm .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Kvsh4FJuaJRK1Tqm .rough-node .label text,#mermaid-svg-Kvsh4FJuaJRK1Tqm .node .label text,#mermaid-svg-Kvsh4FJuaJRK1Tqm .image-shape .label,#mermaid-svg-Kvsh4FJuaJRK1Tqm .icon-shape .label{text-anchor:middle;}#mermaid-svg-Kvsh4FJuaJRK1Tqm .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Kvsh4FJuaJRK1Tqm .rough-node .label,#mermaid-svg-Kvsh4FJuaJRK1Tqm .node .label,#mermaid-svg-Kvsh4FJuaJRK1Tqm .image-shape .label,#mermaid-svg-Kvsh4FJuaJRK1Tqm .icon-shape .label{text-align:center;}#mermaid-svg-Kvsh4FJuaJRK1Tqm .node.clickable{cursor:pointer;}#mermaid-svg-Kvsh4FJuaJRK1Tqm .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Kvsh4FJuaJRK1Tqm .arrowheadPath{fill:#333333;}#mermaid-svg-Kvsh4FJuaJRK1Tqm .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Kvsh4FJuaJRK1Tqm .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Kvsh4FJuaJRK1Tqm .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Kvsh4FJuaJRK1Tqm .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Kvsh4FJuaJRK1Tqm .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Kvsh4FJuaJRK1Tqm .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Kvsh4FJuaJRK1Tqm .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Kvsh4FJuaJRK1Tqm .cluster text{fill:#333;}#mermaid-svg-Kvsh4FJuaJRK1Tqm .cluster span{color:#333;}#mermaid-svg-Kvsh4FJuaJRK1Tqm 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-Kvsh4FJuaJRK1Tqm .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Kvsh4FJuaJRK1Tqm rect.text{fill:none;stroke-width:0;}#mermaid-svg-Kvsh4FJuaJRK1Tqm .icon-shape,#mermaid-svg-Kvsh4FJuaJRK1Tqm .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Kvsh4FJuaJRK1Tqm .icon-shape p,#mermaid-svg-Kvsh4FJuaJRK1Tqm .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Kvsh4FJuaJRK1Tqm .icon-shape .label rect,#mermaid-svg-Kvsh4FJuaJRK1Tqm .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Kvsh4FJuaJRK1Tqm .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Kvsh4FJuaJRK1Tqm .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Kvsh4FJuaJRK1Tqm :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 设计一个 Agent 评估
① 评估什么?
② 谁来判断?
③ 什么时候判断?
最终结果
工具与执行轨迹
系统、成本与风险
代码规则
LLM Judge
人工专家
最终用户
离线:发布前
在线:真实流量
2.2 按"评估对象"分类
| 层级 | 评估对象 | 典型问题 | FinQA 项目示例 |
|---|---|---|---|
| 结果层 | 最终回答 | 数值是否正确?是否回答完整? | numeric_correctness |
| 证据层 | 检索结果和引用 | 引用是否真的支持结论? | citation_correctness |
| 轨迹层 | 工具调用和步骤 | 是否使用正确工具、参数和顺序? | tool_policy_compliant |
| 协作层 | 主 Agent 与子 Agent | 是否正确委派?Reviewer 是否独立复算? | Researcher/Reviewer Trace |
| 会话层 | 多轮上下文 | 是否记住前文?是否错误继承旧结论? | session_id 下的多条 Trace |
| 系统层 | 稳定性和效率 | 是否超时、死循环、重复调用? | 成功率、递归上限、延迟 |
| 运营层 | 成本和体验 | Token 是否失控?用户是否满意? | Token、成本、user_helpful |
| 风险层 | 安全和合规 | 是否泄露敏感数据、越权调用? | 工具白名单、内网部署 |
2.3 按"评估时间"分类
| 类型 | 什么时候执行 | 是否通常有标准答案 | 主要用途 |
|---|---|---|---|
| 离线评估 | 开发、测试和发布前 | 是 | 回归测试、版本比较、发布门禁 |
| 在线评估 | 真实用户请求完成后 | 通常没有 | 风险发现、质量趋势、异常监控 |
| 人工复核 | 自动评估发现风险后 | 可以补充 | 纠错、争议裁决、建立人工真值 |
线上和离线不是二选一:
#mermaid-svg-AWMALOVRWoTjEr6q{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-AWMALOVRWoTjEr6q .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-AWMALOVRWoTjEr6q .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-AWMALOVRWoTjEr6q .error-icon{fill:#552222;}#mermaid-svg-AWMALOVRWoTjEr6q .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-AWMALOVRWoTjEr6q .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-AWMALOVRWoTjEr6q .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-AWMALOVRWoTjEr6q .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-AWMALOVRWoTjEr6q .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-AWMALOVRWoTjEr6q .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-AWMALOVRWoTjEr6q .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-AWMALOVRWoTjEr6q .marker{fill:#333333;stroke:#333333;}#mermaid-svg-AWMALOVRWoTjEr6q .marker.cross{stroke:#333333;}#mermaid-svg-AWMALOVRWoTjEr6q svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-AWMALOVRWoTjEr6q p{margin:0;}#mermaid-svg-AWMALOVRWoTjEr6q .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-AWMALOVRWoTjEr6q .cluster-label text{fill:#333;}#mermaid-svg-AWMALOVRWoTjEr6q .cluster-label span{color:#333;}#mermaid-svg-AWMALOVRWoTjEr6q .cluster-label span p{background-color:transparent;}#mermaid-svg-AWMALOVRWoTjEr6q .label text,#mermaid-svg-AWMALOVRWoTjEr6q span{fill:#333;color:#333;}#mermaid-svg-AWMALOVRWoTjEr6q .node rect,#mermaid-svg-AWMALOVRWoTjEr6q .node circle,#mermaid-svg-AWMALOVRWoTjEr6q .node ellipse,#mermaid-svg-AWMALOVRWoTjEr6q .node polygon,#mermaid-svg-AWMALOVRWoTjEr6q .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-AWMALOVRWoTjEr6q .rough-node .label text,#mermaid-svg-AWMALOVRWoTjEr6q .node .label text,#mermaid-svg-AWMALOVRWoTjEr6q .image-shape .label,#mermaid-svg-AWMALOVRWoTjEr6q .icon-shape .label{text-anchor:middle;}#mermaid-svg-AWMALOVRWoTjEr6q .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-AWMALOVRWoTjEr6q .rough-node .label,#mermaid-svg-AWMALOVRWoTjEr6q .node .label,#mermaid-svg-AWMALOVRWoTjEr6q .image-shape .label,#mermaid-svg-AWMALOVRWoTjEr6q .icon-shape .label{text-align:center;}#mermaid-svg-AWMALOVRWoTjEr6q .node.clickable{cursor:pointer;}#mermaid-svg-AWMALOVRWoTjEr6q .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-AWMALOVRWoTjEr6q .arrowheadPath{fill:#333333;}#mermaid-svg-AWMALOVRWoTjEr6q .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-AWMALOVRWoTjEr6q .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-AWMALOVRWoTjEr6q .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-AWMALOVRWoTjEr6q .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-AWMALOVRWoTjEr6q .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-AWMALOVRWoTjEr6q .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-AWMALOVRWoTjEr6q .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-AWMALOVRWoTjEr6q .cluster text{fill:#333;}#mermaid-svg-AWMALOVRWoTjEr6q .cluster span{color:#333;}#mermaid-svg-AWMALOVRWoTjEr6q 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-AWMALOVRWoTjEr6q .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-AWMALOVRWoTjEr6q rect.text{fill:none;stroke-width:0;}#mermaid-svg-AWMALOVRWoTjEr6q .icon-shape,#mermaid-svg-AWMALOVRWoTjEr6q .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-AWMALOVRWoTjEr6q .icon-shape p,#mermaid-svg-AWMALOVRWoTjEr6q .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-AWMALOVRWoTjEr6q .icon-shape .label rect,#mermaid-svg-AWMALOVRWoTjEr6q .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-AWMALOVRWoTjEr6q .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-AWMALOVRWoTjEr6q .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-AWMALOVRWoTjEr6q :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 离线 Dataset
有 Expected Output
验证后发布
线上真实 Trace
通常没有标准答案
发现长尾错误
人工确认和修正
新版离线 Dataset
Langfuse、LangSmith 等评估平台都把离线实验与在线监控视为相互反馈的生命周期,而不是两个孤立功能。Langfuse Evaluation Concepts、LangSmith Evaluation
三、Agent 评估方法全景:没有一种方法可以包打天下
3.1 六类常用方法
| 方法 | 谁判断 | 适合判断 | 优点 | 局限 |
|---|---|---|---|---|
| 确定性规则 | Python/JavaScript | 精确数值、格式、JSON、工具白名单 | 稳定、快速、便宜、可重复 | 只能发现已经编码的错误 |
| Reference-based | 规则或 Judge + 标准答案 | 正确性、精确匹配、财务计算 | 有明确参照,适合发布门禁 | 只能用于有标准答案的数据 |
| Reference-free Judge | 另一个 LLM | 清晰度、完整性、语气、明显矛盾 | 覆盖开放问题,容易扩展 | 看不到真值,可能把"像对的"当成"真的对" |
| Reference-grounded Judge | LLM + 标准答案/证据 | 语义正确性、复杂推导 | 比精确匹配更灵活,比无参考更可靠 | 成本更高,仍需校准 |
| 人工标注 | 业务专家 | 争议、复杂证据、关键风险 | 最接近业务真值 | 昂贵、慢、存在标注者差异 |
| 用户反馈 | 真实用户 | 是否有用、是否解决问题 | 直接反映业务体验 | 稀疏、主观,点踩不等于答案一定错误 |
Langfuse 官方把评估方法概括为 LLM-as-a-Judge、Code Evaluator、UI Score、Annotation Queue 和 API/SDK Score;这些方法最终都可以落成统一的 Score 数据。Langfuse Evaluation Concepts、Langfuse Score Data Model
3.2 什么时候优先使用代码规则?
如果问题可以写成明确的 if/else,优先使用代码:
text
JSON 能否解析?
报告编号是否出现?
工具名称是否在白名单?
数值是否等于标准答案?
延迟是否超过 30 秒?
代码规则的价值不是"更聪明",而是"更确定":
text
同一个输入
→ 今天评一次
→ 明天再评一次
→ 结果应该相同
Langfuse 官方也建议:精确匹配、正则、Schema、工具调用和业务规则等客观检查使用 Code Evaluator;语义判断再使用 LLM-as-a-Judge。Langfuse Code Evaluators
3.3 LLM-as-a-Judge 是什么?
Judge 的工作方式是:
text
用户问题
+ Agent 回答
+ 可选的标准答案和证据
+ 评分 Rubric
→ Judge 模型
→ Score + Reason
它像"让另一位老师批改第一位老师的答卷"。
适合 Judge 的指标:
- 回答是否清晰;
- 是否完整覆盖用户要求;
- 语气是否合适;
- 是否与给定证据一致;
- 是否在语义上等价于标准答案。
不适合把 Judge 当作绝对真相的原因:
- 位置偏差:成对比较时偏爱放在某个位置的回答;
- 冗长偏差:容易把更长的回答误认为更好;
- 自我偏好:Judge 可能偏爱与自己风格相似的输出;
- Prompt 敏感:Rubric 的小变化可能改变分数;
- 缺少真值:无参考 Judge 只能判断"像不像正确答案"。
相关研究明确讨论了位置、冗长和自我增强等偏差;因此 Judge 应与人工样本进行一致性校准,而不是创建后直接成为发布门禁。MT-Bench 与 LLM-as-a-Judge 论文、Position Bias 研究
3.4 "金字塔"式评估组合
#mermaid-svg-mDOIwxMjdMvkgZWL{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-mDOIwxMjdMvkgZWL .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-mDOIwxMjdMvkgZWL .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-mDOIwxMjdMvkgZWL .error-icon{fill:#552222;}#mermaid-svg-mDOIwxMjdMvkgZWL .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-mDOIwxMjdMvkgZWL .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-mDOIwxMjdMvkgZWL .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-mDOIwxMjdMvkgZWL .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-mDOIwxMjdMvkgZWL .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-mDOIwxMjdMvkgZWL .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-mDOIwxMjdMvkgZWL .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-mDOIwxMjdMvkgZWL .marker{fill:#333333;stroke:#333333;}#mermaid-svg-mDOIwxMjdMvkgZWL .marker.cross{stroke:#333333;}#mermaid-svg-mDOIwxMjdMvkgZWL svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-mDOIwxMjdMvkgZWL p{margin:0;}#mermaid-svg-mDOIwxMjdMvkgZWL .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-mDOIwxMjdMvkgZWL .cluster-label text{fill:#333;}#mermaid-svg-mDOIwxMjdMvkgZWL .cluster-label span{color:#333;}#mermaid-svg-mDOIwxMjdMvkgZWL .cluster-label span p{background-color:transparent;}#mermaid-svg-mDOIwxMjdMvkgZWL .label text,#mermaid-svg-mDOIwxMjdMvkgZWL span{fill:#333;color:#333;}#mermaid-svg-mDOIwxMjdMvkgZWL .node rect,#mermaid-svg-mDOIwxMjdMvkgZWL .node circle,#mermaid-svg-mDOIwxMjdMvkgZWL .node ellipse,#mermaid-svg-mDOIwxMjdMvkgZWL .node polygon,#mermaid-svg-mDOIwxMjdMvkgZWL .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-mDOIwxMjdMvkgZWL .rough-node .label text,#mermaid-svg-mDOIwxMjdMvkgZWL .node .label text,#mermaid-svg-mDOIwxMjdMvkgZWL .image-shape .label,#mermaid-svg-mDOIwxMjdMvkgZWL .icon-shape .label{text-anchor:middle;}#mermaid-svg-mDOIwxMjdMvkgZWL .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-mDOIwxMjdMvkgZWL .rough-node .label,#mermaid-svg-mDOIwxMjdMvkgZWL .node .label,#mermaid-svg-mDOIwxMjdMvkgZWL .image-shape .label,#mermaid-svg-mDOIwxMjdMvkgZWL .icon-shape .label{text-align:center;}#mermaid-svg-mDOIwxMjdMvkgZWL .node.clickable{cursor:pointer;}#mermaid-svg-mDOIwxMjdMvkgZWL .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-mDOIwxMjdMvkgZWL .arrowheadPath{fill:#333333;}#mermaid-svg-mDOIwxMjdMvkgZWL .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-mDOIwxMjdMvkgZWL .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-mDOIwxMjdMvkgZWL .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-mDOIwxMjdMvkgZWL .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-mDOIwxMjdMvkgZWL .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-mDOIwxMjdMvkgZWL .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-mDOIwxMjdMvkgZWL .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-mDOIwxMjdMvkgZWL .cluster text{fill:#333;}#mermaid-svg-mDOIwxMjdMvkgZWL .cluster span{color:#333;}#mermaid-svg-mDOIwxMjdMvkgZWL 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-mDOIwxMjdMvkgZWL .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-mDOIwxMjdMvkgZWL rect.text{fill:none;stroke-width:0;}#mermaid-svg-mDOIwxMjdMvkgZWL .icon-shape,#mermaid-svg-mDOIwxMjdMvkgZWL .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-mDOIwxMjdMvkgZWL .icon-shape p,#mermaid-svg-mDOIwxMjdMvkgZWL .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-mDOIwxMjdMvkgZWL .icon-shape .label rect,#mermaid-svg-mDOIwxMjdMvkgZWL .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-mDOIwxMjdMvkgZWL .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-mDOIwxMjdMvkgZWL .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-mDOIwxMjdMvkgZWL :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 少量:领域专家审核
最贵、最权威
中量:Reference-grounded Judge
复杂正确性
较大量:Reference-free Judge
线上风险抽样
全量:代码规则 + 系统指标
便宜、稳定
3.5 企业评估的四阶段方案
可以把四个阶段理解成制造业的质量体系:
| 阶段 | 制造业类比 | 解决的问题 |
|---|---|---|
| 第一阶段:评分标准化 | 统一质检尺子 | 分数叫什么、如何产生、失败会不会丢 |
| 第二阶段:离线发布门禁 | 产品出厂检测 | 新版本能不能发布 |
| 第三阶段:人工标注闭环 | 专家复检和缺陷归档 | 自动评分错了谁来裁决,修正数据去哪里 |
| 第四阶段:线上持续评估 | 售后监控和质量预警 | 真实用户场景中是否出现新问题 |
#mermaid-svg-o7Gwbj37mA1Njo2G{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-o7Gwbj37mA1Njo2G .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-o7Gwbj37mA1Njo2G .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-o7Gwbj37mA1Njo2G .error-icon{fill:#552222;}#mermaid-svg-o7Gwbj37mA1Njo2G .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-o7Gwbj37mA1Njo2G .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-o7Gwbj37mA1Njo2G .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-o7Gwbj37mA1Njo2G .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-o7Gwbj37mA1Njo2G .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-o7Gwbj37mA1Njo2G .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-o7Gwbj37mA1Njo2G .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-o7Gwbj37mA1Njo2G .marker{fill:#333333;stroke:#333333;}#mermaid-svg-o7Gwbj37mA1Njo2G .marker.cross{stroke:#333333;}#mermaid-svg-o7Gwbj37mA1Njo2G svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-o7Gwbj37mA1Njo2G p{margin:0;}#mermaid-svg-o7Gwbj37mA1Njo2G .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-o7Gwbj37mA1Njo2G .cluster-label text{fill:#333;}#mermaid-svg-o7Gwbj37mA1Njo2G .cluster-label span{color:#333;}#mermaid-svg-o7Gwbj37mA1Njo2G .cluster-label span p{background-color:transparent;}#mermaid-svg-o7Gwbj37mA1Njo2G .label text,#mermaid-svg-o7Gwbj37mA1Njo2G span{fill:#333;color:#333;}#mermaid-svg-o7Gwbj37mA1Njo2G .node rect,#mermaid-svg-o7Gwbj37mA1Njo2G .node circle,#mermaid-svg-o7Gwbj37mA1Njo2G .node ellipse,#mermaid-svg-o7Gwbj37mA1Njo2G .node polygon,#mermaid-svg-o7Gwbj37mA1Njo2G .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-o7Gwbj37mA1Njo2G .rough-node .label text,#mermaid-svg-o7Gwbj37mA1Njo2G .node .label text,#mermaid-svg-o7Gwbj37mA1Njo2G .image-shape .label,#mermaid-svg-o7Gwbj37mA1Njo2G .icon-shape .label{text-anchor:middle;}#mermaid-svg-o7Gwbj37mA1Njo2G .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-o7Gwbj37mA1Njo2G .rough-node .label,#mermaid-svg-o7Gwbj37mA1Njo2G .node .label,#mermaid-svg-o7Gwbj37mA1Njo2G .image-shape .label,#mermaid-svg-o7Gwbj37mA1Njo2G .icon-shape .label{text-align:center;}#mermaid-svg-o7Gwbj37mA1Njo2G .node.clickable{cursor:pointer;}#mermaid-svg-o7Gwbj37mA1Njo2G .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-o7Gwbj37mA1Njo2G .arrowheadPath{fill:#333333;}#mermaid-svg-o7Gwbj37mA1Njo2G .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-o7Gwbj37mA1Njo2G .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-o7Gwbj37mA1Njo2G .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-o7Gwbj37mA1Njo2G .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-o7Gwbj37mA1Njo2G .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-o7Gwbj37mA1Njo2G .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-o7Gwbj37mA1Njo2G .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-o7Gwbj37mA1Njo2G .cluster text{fill:#333;}#mermaid-svg-o7Gwbj37mA1Njo2G .cluster span{color:#333;}#mermaid-svg-o7Gwbj37mA1Njo2G 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-o7Gwbj37mA1Njo2G .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-o7Gwbj37mA1Njo2G rect.text{fill:none;stroke-width:0;}#mermaid-svg-o7Gwbj37mA1Njo2G .icon-shape,#mermaid-svg-o7Gwbj37mA1Njo2G .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-o7Gwbj37mA1Njo2G .icon-shape p,#mermaid-svg-o7Gwbj37mA1Njo2G .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-o7Gwbj37mA1Njo2G .icon-shape .label rect,#mermaid-svg-o7Gwbj37mA1Njo2G .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-o7Gwbj37mA1Njo2G .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-o7Gwbj37mA1Njo2G .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-o7Gwbj37mA1Njo2G :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 线上低分/异常
Human Verified Dataset
校准后的 Evaluator
批准的 Agent 版本
第一阶段
评分标准化
第二阶段
离线发布门禁
第三阶段
人工标注闭环
第四阶段
线上持续评估
推荐原则:
text
能用代码确定的,不先问 LLM;
需要语义判断的,使用 Judge;
高风险和争议结论,交给人;
人的结论,再反过来校准规则和 Judge。
四、Langfuse 与其他评估平台如何选择?
| 工具/平台 | 优势 | 更适合的场景 | 需要注意 |
|---|---|---|---|
| Langfuse | 开源、自托管、Tracing、Prompt、Dataset、Experiment、Judge、人工标注一体化 | 企业内网、需要完整质量闭环 | 自托管需要维护 Web、Worker、Postgres、ClickHouse、Redis 和对象存储 |
| LangSmith | 与 LangChain/LangGraph 集成紧密,离线和在线 Evaluator 成熟 | LangChain 技术栈和托管平台优先 | 企业需根据版本和采购方案核实部署模式 |
| Arize Phoenix | OpenTelemetry/OpenInference 友好,调试、实验和 Evaluator 能力强 | 开源观测、数据科学和评估分析 | 持续线上评估能力应按 Phoenix/Arize 产品边界选择 |
| Ragas | RAG 指标和评估库成熟 | 在代码中构建 RAG 专项评估 | 不是完整的 Agent 运营和人工闭环平台 |
| DeepEval / OpenEvals | 接近测试框架,便于 CI 和自定义 Evaluator | 开发阶段自动化测试 | 通常还需要可观测、Dataset 和运营平台配合 |
Phoenix 同样支持确定性 Evaluator 和 LLM-as-a-Judge,并能对生产 Trace、Experiment 或 Dataset 运行评估,可作为开源替代方案之一。Phoenix Evaluation
对于当前项目选择 Langfuse 的原因不是"它能打一个分",而是:
text
Trace
+ Score
+ Prompt Version
+ Dataset
+ Experiment
+ Judge Worker
+ Annotation Queue
+ 自托管
= 一条完整的 AI Engineering 质量链
五、重点:Langfuse Worker 为什么是持续评估的核心?
5.1 如果没有 Worker,会发生什么?
最简单的同步评估是:
Langfuse Judge 模型 Agent API 用户 Langfuse Judge 模型 Agent API 用户 #mermaid-svg-Cb2NLGFUSSlcmGU5{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-Cb2NLGFUSSlcmGU5 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Cb2NLGFUSSlcmGU5 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Cb2NLGFUSSlcmGU5 .error-icon{fill:#552222;}#mermaid-svg-Cb2NLGFUSSlcmGU5 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Cb2NLGFUSSlcmGU5 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Cb2NLGFUSSlcmGU5 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Cb2NLGFUSSlcmGU5 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Cb2NLGFUSSlcmGU5 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Cb2NLGFUSSlcmGU5 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Cb2NLGFUSSlcmGU5 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Cb2NLGFUSSlcmGU5 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Cb2NLGFUSSlcmGU5 .marker.cross{stroke:#333333;}#mermaid-svg-Cb2NLGFUSSlcmGU5 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Cb2NLGFUSSlcmGU5 p{margin:0;}#mermaid-svg-Cb2NLGFUSSlcmGU5 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Cb2NLGFUSSlcmGU5 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-Cb2NLGFUSSlcmGU5 .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-Cb2NLGFUSSlcmGU5 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-Cb2NLGFUSSlcmGU5 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-Cb2NLGFUSSlcmGU5 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-Cb2NLGFUSSlcmGU5 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-Cb2NLGFUSSlcmGU5 .sequenceNumber{fill:white;}#mermaid-svg-Cb2NLGFUSSlcmGU5 #sequencenumber{fill:#333;}#mermaid-svg-Cb2NLGFUSSlcmGU5 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-Cb2NLGFUSSlcmGU5 .messageText{fill:#333;stroke:none;}#mermaid-svg-Cb2NLGFUSSlcmGU5 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Cb2NLGFUSSlcmGU5 .labelText,#mermaid-svg-Cb2NLGFUSSlcmGU5 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-Cb2NLGFUSSlcmGU5 .loopText,#mermaid-svg-Cb2NLGFUSSlcmGU5 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-Cb2NLGFUSSlcmGU5 .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-Cb2NLGFUSSlcmGU5 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-Cb2NLGFUSSlcmGU5 .noteText,#mermaid-svg-Cb2NLGFUSSlcmGU5 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-Cb2NLGFUSSlcmGU5 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Cb2NLGFUSSlcmGU5 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Cb2NLGFUSSlcmGU5 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Cb2NLGFUSSlcmGU5 .actorPopupMenu{position:absolute;}#mermaid-svg-Cb2NLGFUSSlcmGU5 .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-Cb2NLGFUSSlcmGU5 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Cb2NLGFUSSlcmGU5 .actor-man circle,#mermaid-svg-Cb2NLGFUSSlcmGU5 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-Cb2NLGFUSSlcmGU5 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 提问 Agent 推理和工具调用 等待 Judge 评分 Score 写入 Trace 和 Score 最终返回
问题是:
- Judge 增加几秒到几十秒延迟;
- Judge 限流会拖慢 Agent;
- Langfuse 暂时不可用会影响用户请求;
- 每增加一个 Evaluator,请求延迟继续叠加;
- Agent API 同时承担业务和评估,无法独立扩容;
- Vue SSE 可能因为评估步骤变慢或中断。
5.2 Langfuse Worker 的异步模式
Langfuse 自托管架构包含两个应用容器:
langfuse-web:提供 UI 和 API;langfuse-worker:异步处理事件和后台任务。
存储层通常还包括 PostgreSQL、ClickHouse、Redis/Valkey 和 S3/Blob Storage。Redis/Valkey 用于队列和缓存,Worker 可以与 Web 独立扩容。Langfuse 自托管架构、Langfuse Application Containers
#mermaid-svg-xzLBHRtvRgPvTSCd{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-xzLBHRtvRgPvTSCd .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-xzLBHRtvRgPvTSCd .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-xzLBHRtvRgPvTSCd .error-icon{fill:#552222;}#mermaid-svg-xzLBHRtvRgPvTSCd .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-xzLBHRtvRgPvTSCd .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-xzLBHRtvRgPvTSCd .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-xzLBHRtvRgPvTSCd .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-xzLBHRtvRgPvTSCd .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-xzLBHRtvRgPvTSCd .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-xzLBHRtvRgPvTSCd .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-xzLBHRtvRgPvTSCd .marker{fill:#333333;stroke:#333333;}#mermaid-svg-xzLBHRtvRgPvTSCd .marker.cross{stroke:#333333;}#mermaid-svg-xzLBHRtvRgPvTSCd svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-xzLBHRtvRgPvTSCd p{margin:0;}#mermaid-svg-xzLBHRtvRgPvTSCd .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-xzLBHRtvRgPvTSCd .cluster-label text{fill:#333;}#mermaid-svg-xzLBHRtvRgPvTSCd .cluster-label span{color:#333;}#mermaid-svg-xzLBHRtvRgPvTSCd .cluster-label span p{background-color:transparent;}#mermaid-svg-xzLBHRtvRgPvTSCd .label text,#mermaid-svg-xzLBHRtvRgPvTSCd span{fill:#333;color:#333;}#mermaid-svg-xzLBHRtvRgPvTSCd .node rect,#mermaid-svg-xzLBHRtvRgPvTSCd .node circle,#mermaid-svg-xzLBHRtvRgPvTSCd .node ellipse,#mermaid-svg-xzLBHRtvRgPvTSCd .node polygon,#mermaid-svg-xzLBHRtvRgPvTSCd .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-xzLBHRtvRgPvTSCd .rough-node .label text,#mermaid-svg-xzLBHRtvRgPvTSCd .node .label text,#mermaid-svg-xzLBHRtvRgPvTSCd .image-shape .label,#mermaid-svg-xzLBHRtvRgPvTSCd .icon-shape .label{text-anchor:middle;}#mermaid-svg-xzLBHRtvRgPvTSCd .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-xzLBHRtvRgPvTSCd .rough-node .label,#mermaid-svg-xzLBHRtvRgPvTSCd .node .label,#mermaid-svg-xzLBHRtvRgPvTSCd .image-shape .label,#mermaid-svg-xzLBHRtvRgPvTSCd .icon-shape .label{text-align:center;}#mermaid-svg-xzLBHRtvRgPvTSCd .node.clickable{cursor:pointer;}#mermaid-svg-xzLBHRtvRgPvTSCd .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-xzLBHRtvRgPvTSCd .arrowheadPath{fill:#333333;}#mermaid-svg-xzLBHRtvRgPvTSCd .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-xzLBHRtvRgPvTSCd .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-xzLBHRtvRgPvTSCd .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xzLBHRtvRgPvTSCd .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-xzLBHRtvRgPvTSCd .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xzLBHRtvRgPvTSCd .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-xzLBHRtvRgPvTSCd .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-xzLBHRtvRgPvTSCd .cluster text{fill:#333;}#mermaid-svg-xzLBHRtvRgPvTSCd .cluster span{color:#333;}#mermaid-svg-xzLBHRtvRgPvTSCd 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-xzLBHRtvRgPvTSCd .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-xzLBHRtvRgPvTSCd rect.text{fill:none;stroke-width:0;}#mermaid-svg-xzLBHRtvRgPvTSCd .icon-shape,#mermaid-svg-xzLBHRtvRgPvTSCd .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xzLBHRtvRgPvTSCd .icon-shape p,#mermaid-svg-xzLBHRtvRgPvTSCd .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-xzLBHRtvRgPvTSCd .icon-shape .label rect,#mermaid-svg-xzLBHRtvRgPvTSCd .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xzLBHRtvRgPvTSCd .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-xzLBHRtvRgPvTSCd .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-xzLBHRtvRgPvTSCd :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Langfuse 异步评估链路
Agent 业务主链路
Vue 用户
FastAPI
DeepAgents
主 Agent + 子 Agent
SSE 流式输出
Callback / OpenTelemetry
langfuse-web API
事件存储 / 队列
Evaluation Rule
过滤 + 抽样 + 字段映射
langfuse-worker
LLM Connection
DeepSeek Judge
Score + Reason
ClickHouse / Analytics
关键点:
text
Agent 把 Trace 发出去后,就可以继续给用户输出;
Judge 在后台运行;
Judge 成功或失败,不控制本次 SSE 是否成功。
Langfuse 的 Judge 执行状态包括:
| 状态 | 含义 |
|---|---|
Pending |
已经排队,等待 Worker |
Delayed |
遇到模型限流,延迟并重试 |
Completed |
已完成并写入 Score |
Error |
执行失败,可以查看 Judge Trace 排查 |
每次 LLM-as-a-Judge 执行本身也会形成可观察 Trace,可以查看输入映射、模型输出、Token、延迟和错误。Langfuse LLM-as-a-Judge
5.4 异步 Worker 带来的五个企业价值
价值 1:延迟隔离
text
Agent 延迟 ≈ 模型 + 工具 + 编排
而不是:
Agent 延迟 ≈ 模型 + 工具 + 编排 + 所有 Evaluator
价值 2:故障隔离
Judge 模型限流、Langfuse Worker 重启或某个 Evaluator 报错,不应把已经生成的 Agent 答案变成 HTTP/SSE 错误。
价值 3:独立扩容
业务流量增加时扩 FastAPI;评估积压增加时扩 Worker。Langfuse 还可以通过队列深度指标观察 Worker 积压并设计自动扩容。Langfuse Scaling
价值 4:成本控制
Evaluation Rule 可以:
- 只评估目标 Observation;
- 按 Environment、Release、Tag 等过滤;
- 只抽样一部分流量;
- 对高风险样本提高抽样率;
- 对 Dataset 校准集使用 100%。
价值 5:持续运行
只要线上 Trace 持续进入 Langfuse:
text
Rule 持续匹配
→ Worker 持续评估
→ Score 持续产生
→ Dashboard 持续更新
→ 低分持续回流
持续评估并不是 Agent 自己不停地反思,而是外部 Worker 持续消费运行数据。
5.5 当前 FinQA 项目的实际闭环
真正的闭环必须包含:
#mermaid-svg-3GcV1Pl208ssRG1Q{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-3GcV1Pl208ssRG1Q .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-3GcV1Pl208ssRG1Q .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-3GcV1Pl208ssRG1Q .error-icon{fill:#552222;}#mermaid-svg-3GcV1Pl208ssRG1Q .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-3GcV1Pl208ssRG1Q .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-3GcV1Pl208ssRG1Q .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-3GcV1Pl208ssRG1Q .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-3GcV1Pl208ssRG1Q .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-3GcV1Pl208ssRG1Q .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-3GcV1Pl208ssRG1Q .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-3GcV1Pl208ssRG1Q .marker{fill:#333333;stroke:#333333;}#mermaid-svg-3GcV1Pl208ssRG1Q .marker.cross{stroke:#333333;}#mermaid-svg-3GcV1Pl208ssRG1Q svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-3GcV1Pl208ssRG1Q p{margin:0;}#mermaid-svg-3GcV1Pl208ssRG1Q .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-3GcV1Pl208ssRG1Q .cluster-label text{fill:#333;}#mermaid-svg-3GcV1Pl208ssRG1Q .cluster-label span{color:#333;}#mermaid-svg-3GcV1Pl208ssRG1Q .cluster-label span p{background-color:transparent;}#mermaid-svg-3GcV1Pl208ssRG1Q .label text,#mermaid-svg-3GcV1Pl208ssRG1Q span{fill:#333;color:#333;}#mermaid-svg-3GcV1Pl208ssRG1Q .node rect,#mermaid-svg-3GcV1Pl208ssRG1Q .node circle,#mermaid-svg-3GcV1Pl208ssRG1Q .node ellipse,#mermaid-svg-3GcV1Pl208ssRG1Q .node polygon,#mermaid-svg-3GcV1Pl208ssRG1Q .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-3GcV1Pl208ssRG1Q .rough-node .label text,#mermaid-svg-3GcV1Pl208ssRG1Q .node .label text,#mermaid-svg-3GcV1Pl208ssRG1Q .image-shape .label,#mermaid-svg-3GcV1Pl208ssRG1Q .icon-shape .label{text-anchor:middle;}#mermaid-svg-3GcV1Pl208ssRG1Q .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-3GcV1Pl208ssRG1Q .rough-node .label,#mermaid-svg-3GcV1Pl208ssRG1Q .node .label,#mermaid-svg-3GcV1Pl208ssRG1Q .image-shape .label,#mermaid-svg-3GcV1Pl208ssRG1Q .icon-shape .label{text-align:center;}#mermaid-svg-3GcV1Pl208ssRG1Q .node.clickable{cursor:pointer;}#mermaid-svg-3GcV1Pl208ssRG1Q .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-3GcV1Pl208ssRG1Q .arrowheadPath{fill:#333333;}#mermaid-svg-3GcV1Pl208ssRG1Q .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-3GcV1Pl208ssRG1Q .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-3GcV1Pl208ssRG1Q .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3GcV1Pl208ssRG1Q .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-3GcV1Pl208ssRG1Q .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3GcV1Pl208ssRG1Q .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-3GcV1Pl208ssRG1Q .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-3GcV1Pl208ssRG1Q .cluster text{fill:#333;}#mermaid-svg-3GcV1Pl208ssRG1Q .cluster span{color:#333;}#mermaid-svg-3GcV1Pl208ssRG1Q 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-3GcV1Pl208ssRG1Q .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-3GcV1Pl208ssRG1Q rect.text{fill:none;stroke-width:0;}#mermaid-svg-3GcV1Pl208ssRG1Q .icon-shape,#mermaid-svg-3GcV1Pl208ssRG1Q .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3GcV1Pl208ssRG1Q .icon-shape p,#mermaid-svg-3GcV1Pl208ssRG1Q .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-3GcV1Pl208ssRG1Q .icon-shape .label rect,#mermaid-svg-3GcV1Pl208ssRG1Q .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3GcV1Pl208ssRG1Q .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-3GcV1Pl208ssRG1Q .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-3GcV1Pl208ssRG1Q :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 高分
低分或冲突
通过
线上 Trace
Langfuse Worker
Judge Score
Analytics / Dashboard
风险回流 Bridge
Annotation Queue
人工审核和 Corrected Output
Human Verified Dataset
离线 Experiment
Release Gate
发布新版本
text
线上 Rule:
58f1588e...
→ native_judge_answer_quality
→ 低于 0.75 视为风险
风险回流:
→ AnnotationCase(judge_risk)
→ Annotation Outbox
→ finqa/01-answer-review
→ 必要时 finqa/03-correction-approval
人工修正:
→ HUMAN_VERIFIED
→ Human Verified Dataset 新版本
离线门禁:
→ reference-grounded Judge
→ Calibration Report
→ Baseline Compare
→ Release Gate
总结:四阶段如何形成一个企业质量飞轮?
#mermaid-svg-KpWW7vVYhNA8OaVr{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-KpWW7vVYhNA8OaVr .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-KpWW7vVYhNA8OaVr .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-KpWW7vVYhNA8OaVr .error-icon{fill:#552222;}#mermaid-svg-KpWW7vVYhNA8OaVr .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-KpWW7vVYhNA8OaVr .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-KpWW7vVYhNA8OaVr .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-KpWW7vVYhNA8OaVr .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-KpWW7vVYhNA8OaVr .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-KpWW7vVYhNA8OaVr .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-KpWW7vVYhNA8OaVr .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-KpWW7vVYhNA8OaVr .marker{fill:#333333;stroke:#333333;}#mermaid-svg-KpWW7vVYhNA8OaVr .marker.cross{stroke:#333333;}#mermaid-svg-KpWW7vVYhNA8OaVr svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-KpWW7vVYhNA8OaVr p{margin:0;}#mermaid-svg-KpWW7vVYhNA8OaVr .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-KpWW7vVYhNA8OaVr .cluster-label text{fill:#333;}#mermaid-svg-KpWW7vVYhNA8OaVr .cluster-label span{color:#333;}#mermaid-svg-KpWW7vVYhNA8OaVr .cluster-label span p{background-color:transparent;}#mermaid-svg-KpWW7vVYhNA8OaVr .label text,#mermaid-svg-KpWW7vVYhNA8OaVr span{fill:#333;color:#333;}#mermaid-svg-KpWW7vVYhNA8OaVr .node rect,#mermaid-svg-KpWW7vVYhNA8OaVr .node circle,#mermaid-svg-KpWW7vVYhNA8OaVr .node ellipse,#mermaid-svg-KpWW7vVYhNA8OaVr .node polygon,#mermaid-svg-KpWW7vVYhNA8OaVr .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-KpWW7vVYhNA8OaVr .rough-node .label text,#mermaid-svg-KpWW7vVYhNA8OaVr .node .label text,#mermaid-svg-KpWW7vVYhNA8OaVr .image-shape .label,#mermaid-svg-KpWW7vVYhNA8OaVr .icon-shape .label{text-anchor:middle;}#mermaid-svg-KpWW7vVYhNA8OaVr .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-KpWW7vVYhNA8OaVr .rough-node .label,#mermaid-svg-KpWW7vVYhNA8OaVr .node .label,#mermaid-svg-KpWW7vVYhNA8OaVr .image-shape .label,#mermaid-svg-KpWW7vVYhNA8OaVr .icon-shape .label{text-align:center;}#mermaid-svg-KpWW7vVYhNA8OaVr .node.clickable{cursor:pointer;}#mermaid-svg-KpWW7vVYhNA8OaVr .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-KpWW7vVYhNA8OaVr .arrowheadPath{fill:#333333;}#mermaid-svg-KpWW7vVYhNA8OaVr .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-KpWW7vVYhNA8OaVr .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-KpWW7vVYhNA8OaVr .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KpWW7vVYhNA8OaVr .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-KpWW7vVYhNA8OaVr .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KpWW7vVYhNA8OaVr .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-KpWW7vVYhNA8OaVr .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-KpWW7vVYhNA8OaVr .cluster text{fill:#333;}#mermaid-svg-KpWW7vVYhNA8OaVr .cluster span{color:#333;}#mermaid-svg-KpWW7vVYhNA8OaVr 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-KpWW7vVYhNA8OaVr .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-KpWW7vVYhNA8OaVr rect.text{fill:none;stroke-width:0;}#mermaid-svg-KpWW7vVYhNA8OaVr .icon-shape,#mermaid-svg-KpWW7vVYhNA8OaVr .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KpWW7vVYhNA8OaVr .icon-shape p,#mermaid-svg-KpWW7vVYhNA8OaVr .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-KpWW7vVYhNA8OaVr .icon-shape .label rect,#mermaid-svg-KpWW7vVYhNA8OaVr .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KpWW7vVYhNA8OaVr .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-KpWW7vVYhNA8OaVr .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-KpWW7vVYhNA8OaVr :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 低分、异常、用户差评
HUMAN_VERIFIED
校准通过的 Evaluator
批准的新 Agent 版本
阶段 1:评分标准化
稳定 Score + Outbox
阶段 2:离线门禁
Dataset + Experiment + Baseline
阶段 3:人工闭环
Queue + Corrected Output
阶段 4:线上评估
Rule + Langfuse Worker
Human Verified Dataset 新版本
线上 Agent
四个阶段之间的依赖可以浓缩为:
| 阶段 | 给下一个阶段什么 |
|---|---|
| 第一阶段 → 第二阶段 | 稳定的 Score 名称、类型和确定性规则 |
| 第二阶段 → 第三阶段 | 失败样本、边界样本和可追溯 Experiment |
| 第三阶段 → 第四阶段 | 人工真值、Corrected Output 和 Judge 校准数据 |
| 第四阶段 → 第三阶段 | 真实线上流量中的低分和新型错误 |
| 第三阶段 → 第二阶段 | 新版 Human Verified Dataset |
| 第二阶段 → 第四阶段 | 已校准 Evaluator 和已批准 Agent 版本 |
六、第一阶段:评分标准化------先统一"尺子"
6.1 为什么先做 Score Config?
如果三个开发者分别创建:
text
numeric_accuracy
number_correct
numeric_correctness
它们可能表达同一个意思,但 Dashboard 无法稳定聚合。
Score Config 就像数据库 Schema:
text
名称:numeric_correctness
类型:BOOLEAN
允许值:true / false
含义:Agent 最终数值是否与 FinQA 标准答案一致
6.2 当前 FinQA 项目的评分分类
| 分类 | 指标 |
|---|---|
| 数值和计算 | numeric_correctness、formula_correctness |
| 引用和证据 | citation_correctness、citation_present |
| 上下文一致 | year_alignment、unit_consistency |
| 回答完整 | required_sections_complete |
| 工具合规 | tool_policy_compliant |
| 用户反馈 | user_helpful、user_issue_type |
总结:
第一阶段解决的不是"评分有多聪明",而是"评分口径稳定、结果不会丢、不会阻塞 Agent"。
七、第二阶段:离线发布门禁------坏版本不能上线
7.1 Dataset 不是一堆随时变化的问题
企业 Golden Dataset 应包含:
- Dataset 名称和版本;
- 固定样本;
- Input 和 Expected Output;
- 业务类型、风险等级等 Metadata;
- 不可变内容摘要;
- 创建来源和审核记录。
Langfuse Dataset 可以保存输入和预期输出,并把 Dataset Item 与 Experiment Run、Trace 和 Score 关联起来。Langfuse Dataset 文档、Langfuse Experiment Data Model
7.2 Experiment、Baseline、Candidate 和 Gate
#mermaid-svg-S8PYA1DEdS4uYsvv{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-S8PYA1DEdS4uYsvv .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-S8PYA1DEdS4uYsvv .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-S8PYA1DEdS4uYsvv .error-icon{fill:#552222;}#mermaid-svg-S8PYA1DEdS4uYsvv .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-S8PYA1DEdS4uYsvv .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-S8PYA1DEdS4uYsvv .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-S8PYA1DEdS4uYsvv .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-S8PYA1DEdS4uYsvv .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-S8PYA1DEdS4uYsvv .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-S8PYA1DEdS4uYsvv .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-S8PYA1DEdS4uYsvv .marker{fill:#333333;stroke:#333333;}#mermaid-svg-S8PYA1DEdS4uYsvv .marker.cross{stroke:#333333;}#mermaid-svg-S8PYA1DEdS4uYsvv svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-S8PYA1DEdS4uYsvv p{margin:0;}#mermaid-svg-S8PYA1DEdS4uYsvv .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-S8PYA1DEdS4uYsvv .cluster-label text{fill:#333;}#mermaid-svg-S8PYA1DEdS4uYsvv .cluster-label span{color:#333;}#mermaid-svg-S8PYA1DEdS4uYsvv .cluster-label span p{background-color:transparent;}#mermaid-svg-S8PYA1DEdS4uYsvv .label text,#mermaid-svg-S8PYA1DEdS4uYsvv span{fill:#333;color:#333;}#mermaid-svg-S8PYA1DEdS4uYsvv .node rect,#mermaid-svg-S8PYA1DEdS4uYsvv .node circle,#mermaid-svg-S8PYA1DEdS4uYsvv .node ellipse,#mermaid-svg-S8PYA1DEdS4uYsvv .node polygon,#mermaid-svg-S8PYA1DEdS4uYsvv .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-S8PYA1DEdS4uYsvv .rough-node .label text,#mermaid-svg-S8PYA1DEdS4uYsvv .node .label text,#mermaid-svg-S8PYA1DEdS4uYsvv .image-shape .label,#mermaid-svg-S8PYA1DEdS4uYsvv .icon-shape .label{text-anchor:middle;}#mermaid-svg-S8PYA1DEdS4uYsvv .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-S8PYA1DEdS4uYsvv .rough-node .label,#mermaid-svg-S8PYA1DEdS4uYsvv .node .label,#mermaid-svg-S8PYA1DEdS4uYsvv .image-shape .label,#mermaid-svg-S8PYA1DEdS4uYsvv .icon-shape .label{text-align:center;}#mermaid-svg-S8PYA1DEdS4uYsvv .node.clickable{cursor:pointer;}#mermaid-svg-S8PYA1DEdS4uYsvv .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-S8PYA1DEdS4uYsvv .arrowheadPath{fill:#333333;}#mermaid-svg-S8PYA1DEdS4uYsvv .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-S8PYA1DEdS4uYsvv .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-S8PYA1DEdS4uYsvv .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-S8PYA1DEdS4uYsvv .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-S8PYA1DEdS4uYsvv .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-S8PYA1DEdS4uYsvv .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-S8PYA1DEdS4uYsvv .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-S8PYA1DEdS4uYsvv .cluster text{fill:#333;}#mermaid-svg-S8PYA1DEdS4uYsvv .cluster span{color:#333;}#mermaid-svg-S8PYA1DEdS4uYsvv 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-S8PYA1DEdS4uYsvv .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-S8PYA1DEdS4uYsvv rect.text{fill:none;stroke-width:0;}#mermaid-svg-S8PYA1DEdS4uYsvv .icon-shape,#mermaid-svg-S8PYA1DEdS4uYsvv .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-S8PYA1DEdS4uYsvv .icon-shape p,#mermaid-svg-S8PYA1DEdS4uYsvv .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-S8PYA1DEdS4uYsvv .icon-shape .label rect,#mermaid-svg-S8PYA1DEdS4uYsvv .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-S8PYA1DEdS4uYsvv .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-S8PYA1DEdS4uYsvv .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-S8PYA1DEdS4uYsvv :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 质量不退化
成本和延迟可接受
关键指标失败
Golden Dataset
Baseline Run
已批准旧版本
Candidate Run
候选新版本
Release Gate
允许发布
CI 阻断
| 对象 | 通俗解释 |
|---|---|
| Experiment | 让一个 Agent 版本参加一次统一考试 |
| Baseline | 已经批准的上一届成绩 |
| Candidate | 这次准备发布的新版本成绩 |
| Release Gate | 录取分数线和硬性淘汰规则 |
Gate 不应只比较准确率,还应比较:
- Agent 成功率;
- 关键 Score;
- Score 覆盖率;
- P95 延迟;
- 平均 Token;
- 平均成本;
- 工具错误率;
- 安全和合规指标。
当前 FinQA 项目已经建立:
text
finqa/golden-core/v1.0.0
→ 10 条 Smoke
→ 30 条 Calibration
→ 150 条 Full Baseline
→ 人工批准 finqa-baseline-0.1.0
→ Candidate 与 Baseline 双向 Gate 实测
八、第三阶段:人工标注闭环------让错误变成资产
8.1 为什么自动评分后还要人工?
自动规则和 Judge 都可能错:
text
规则说错误,专家认为正确 → False Reject
规则说正确,专家发现漏算 → False Pass
Judge 给 1 分,但答案答错目标 → Judge 漏检
因此,高风险样本必须进入人工复核。
8.2 三类人工队列
| Queue | 审核重点 |
|---|---|
finqa/01-answer-review |
最终答案、公式、错误类型 |
finqa/02-evidence-review |
引用、年份、单位 |
finqa/03-correction-approval |
Corrected Output 是否可以成为优选答案 |
8.3 机器预标注不能冒充人工真值
text
SIMULATED_ANNOTATION
= 机器草稿,只帮助人快速判断
HUMAN_VERIFIED
= 真实审核人完成必填 Score,并批准修正结果
#mermaid-svg-IkUdtsnRwe2V8Mt5{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-IkUdtsnRwe2V8Mt5 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-IkUdtsnRwe2V8Mt5 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-IkUdtsnRwe2V8Mt5 .error-icon{fill:#552222;}#mermaid-svg-IkUdtsnRwe2V8Mt5 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-IkUdtsnRwe2V8Mt5 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-IkUdtsnRwe2V8Mt5 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-IkUdtsnRwe2V8Mt5 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-IkUdtsnRwe2V8Mt5 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-IkUdtsnRwe2V8Mt5 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-IkUdtsnRwe2V8Mt5 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-IkUdtsnRwe2V8Mt5 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-IkUdtsnRwe2V8Mt5 .marker.cross{stroke:#333333;}#mermaid-svg-IkUdtsnRwe2V8Mt5 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-IkUdtsnRwe2V8Mt5 p{margin:0;}#mermaid-svg-IkUdtsnRwe2V8Mt5 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-IkUdtsnRwe2V8Mt5 .cluster-label text{fill:#333;}#mermaid-svg-IkUdtsnRwe2V8Mt5 .cluster-label span{color:#333;}#mermaid-svg-IkUdtsnRwe2V8Mt5 .cluster-label span p{background-color:transparent;}#mermaid-svg-IkUdtsnRwe2V8Mt5 .label text,#mermaid-svg-IkUdtsnRwe2V8Mt5 span{fill:#333;color:#333;}#mermaid-svg-IkUdtsnRwe2V8Mt5 .node rect,#mermaid-svg-IkUdtsnRwe2V8Mt5 .node circle,#mermaid-svg-IkUdtsnRwe2V8Mt5 .node ellipse,#mermaid-svg-IkUdtsnRwe2V8Mt5 .node polygon,#mermaid-svg-IkUdtsnRwe2V8Mt5 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-IkUdtsnRwe2V8Mt5 .rough-node .label text,#mermaid-svg-IkUdtsnRwe2V8Mt5 .node .label text,#mermaid-svg-IkUdtsnRwe2V8Mt5 .image-shape .label,#mermaid-svg-IkUdtsnRwe2V8Mt5 .icon-shape .label{text-anchor:middle;}#mermaid-svg-IkUdtsnRwe2V8Mt5 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-IkUdtsnRwe2V8Mt5 .rough-node .label,#mermaid-svg-IkUdtsnRwe2V8Mt5 .node .label,#mermaid-svg-IkUdtsnRwe2V8Mt5 .image-shape .label,#mermaid-svg-IkUdtsnRwe2V8Mt5 .icon-shape .label{text-align:center;}#mermaid-svg-IkUdtsnRwe2V8Mt5 .node.clickable{cursor:pointer;}#mermaid-svg-IkUdtsnRwe2V8Mt5 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-IkUdtsnRwe2V8Mt5 .arrowheadPath{fill:#333333;}#mermaid-svg-IkUdtsnRwe2V8Mt5 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-IkUdtsnRwe2V8Mt5 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-IkUdtsnRwe2V8Mt5 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-IkUdtsnRwe2V8Mt5 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-IkUdtsnRwe2V8Mt5 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-IkUdtsnRwe2V8Mt5 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-IkUdtsnRwe2V8Mt5 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-IkUdtsnRwe2V8Mt5 .cluster text{fill:#333;}#mermaid-svg-IkUdtsnRwe2V8Mt5 .cluster span{color:#333;}#mermaid-svg-IkUdtsnRwe2V8Mt5 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-IkUdtsnRwe2V8Mt5 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-IkUdtsnRwe2V8Mt5 rect.text{fill:none;stroke-width:0;}#mermaid-svg-IkUdtsnRwe2V8Mt5 .icon-shape,#mermaid-svg-IkUdtsnRwe2V8Mt5 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-IkUdtsnRwe2V8Mt5 .icon-shape p,#mermaid-svg-IkUdtsnRwe2V8Mt5 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-IkUdtsnRwe2V8Mt5 .icon-shape .label rect,#mermaid-svg-IkUdtsnRwe2V8Mt5 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-IkUdtsnRwe2V8Mt5 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-IkUdtsnRwe2V8Mt5 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-IkUdtsnRwe2V8Mt5 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 否
是
失败 Trace
机器预标注
Annotation Queue
人工 Score
Corrected Output
人工批准?
退回修改
HUMAN_VERIFIED
Human Verified Dataset 新版本
当前项目已经使用 10 条真实 Agent 调用完成人工标注试点,并发布 finqa/human-verified-staging/v0.1.1。这批数据随后成为第四阶段 Judge 校准的人工真值。
九、第四阶段:线上持续评估------不等用户投诉才发现问题
9.1 线上为什么不能只使用 Reference-based Evaluator?
线上真实用户提出的问题通常没有 Expected Output:
text
线上 Trace:
有 Question
有 Agent Answer
有工具轨迹
没有标准答案
因此线上适合:
- 格式和工具规则;
- 成本、延迟和错误率;
- Reference-free Judge;
- 用户反馈;
- 风险抽样。
而精确正确性仍应回到版本化 Dataset 中,使用 Reference-grounded Evaluator。
9.2 当前项目为什么有多个 Evaluator?
| Evaluator | 输入 | 结论 |
|---|---|---|
finqa/native-answer-quality |
Question + Answer | 适合线上风险筛查,不承担发布门禁 |
finqa/native-answer-correctness-v2 |
Question + Answer + 更严格 Rubric | 仍缺少真值,保留为失败校准记录 |
finqa/reference-grounded-answer-correctness-v1 |
Question + Answer + Expected Answer/Program/Evidence + Preferred Response | 校准通过,用于离线门禁 |
这里最重要的实验结论是:
text
Reference-free Judge:
"这份回答看起来是否完整、合理?"
Reference-grounded Judge:
"这份回答是否真正等于标准答案,并由正确证据支持?"
前者适合发现风险,后者适合做版本门禁。