# Agent 企业评估方案深度分析:从“看答案”到持续质量闭环_码士教育

为什么 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 ConceptsLangSmith 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 ConceptsLangfuse 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_correctnessformula_correctness
引用和证据 citation_correctnesscitation_present
上下文一致 year_alignmentunit_consistency
回答完整 required_sections_complete
工具合规 tool_policy_compliant
用户反馈 user_helpfuluser_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:
  "这份回答是否真正等于标准答案,并由正确证据支持?"

前者适合发现风险,后者适合做版本门禁。


相关推荐
Cachel wood20 小时前
hands-on-modern-rl:动手学强化学习 贝尔曼方程
开发语言·网络·python·学习·embedding
豆角焖肉20 小时前
冒泡、快排、堆排的实现逻辑与选择思路
java·算法·排序算法·快排·冒泡·堆排
番茄炒鸡蛋加糖20 小时前
Spring 事务传播机制 & 事务失效场景
java·后端·spring
这就是佬们吗20 小时前
回溯算法三板斧---掌握「回溯三问」思考模板快速入门回溯
java·数据库·算法
qq_1715388520 小时前
深入浅出 MyBatis XML:从入门到精通
xml·java·mybatis
冻柠檬飞冰走茶20 小时前
PTA基础编程题目集 7-24 约分最简分式(C语言实现)
c语言·开发语言·数据结构·算法
qq_1715388520 小时前
Spring TransactionSynchronizationManager:事务同步的幕后指挥官
java·后端·spring
要开心吖ZSH20 小时前
一次 HikariCP 连接池耗尽导致的线上雪崩排查实录——完整排查报告
java·spring boot·mysql·连接池·hikaricp
SimonKing21 小时前
Spring Boot 集成 OnlyOffice,5 分钟搞定 Word/Excel 在线编辑
java·后端·程序员