EvalScope+ Langfuse实现RAG三指标分层计算与组合归因操作手册
核心落地逻辑:EvalScope 负责分层执行评测、自动计算指标;Langfuse 负责全链路Trace埋点、结果回写、根因定位与资产沉淀。通过「三层独立评测任务 + 唯一标识透传 + 指标双向回写 + 归因矩阵自动匹配」,实现三个核心指标的精准拆分计算与组合根因定位,彻底解决“效果差但不知道差在哪”的痛点。
一、前置准备:环境与规范对齐
1. 工具环境部署
| 工具 | 版本 | 核心部署说明 |
|---|---|---|
| EvalScope | 1.8.0 | 部署评测服务,配置RAGAS评测引擎、裁判模型(critic_llm)、被测RAG系统接口地址;开启独立检索评测、生成评测、端到端评测三类任务模板 |
| Langfuse | v2.42.0 | 部署服务端,获取API密钥;被测RAG系统接入Python/JS SDK,开启全链路Span埋点;启用Dataset数据集功能与评分回写API |
2. RAG系统埋点规范(Langfuse侧)
必须按节点打独立Span,透传统一标识,这是分层定位的基础:
# 伪代码示例:RAG全链路埋点fromlangfuseimportLangfuse langfuse=Langfuse()defrag_pipeline(query,eval_case_id=None):# 根Span:透传评测用例ID,绑定整条Tracewithlangfuse.trace(name="rag_full",metadata={"eval_case_id":eval_case_id,"version":"v1.2.3"})astrace:# 节点1:查询改写withtrace.span(name="query_rewrite")asspan:rewritten_query=query_rewrite(query)span.set_input(query)span.set_output(rewritten_query)# 节点2:混合检索withtrace.span(name="hybrid_retriever")asspan:chunks=hybrid_retrieve(rewritten_query,top_k=10)span.set_input(rewritten_query)span.set_output([c["id"]forcinchunks])# 记录召回片段IDspan.set_metadata({"top_k":10,"recall_num":len(chunks)})# 节点3:答案生成withtrace.span(name="answer_generation")asspan:answer=generate_answer(query,chunks)span.set_input({"query":query,"contexts":chunks})span.set_output(answer)returnanswer强制规范:
- 每条评测请求必须透传唯一
eval_case_id,写入根Trace的metadata,实现用例与链路一一对应 - 检索、生成节点必须打独立Span,分别记录输入输出
- 统一版本标签(知识库版本、Prompt版本、模型版本),确保可横向对比
3. 三层测试集准备(EvalScope侧)
按评测层级分别准备独立测试集,禁止混用:
| 测试集类型 | 用途 | 标准字段 |
|---|---|---|
| 检索层测试集 | 计算召回率 | query、ground_truth_chunks(标准相关片段ID列表) |
| 生成层测试集 | 计算忠实度 | query、fixed_contexts(固定召回片段) |
| 端到端测试集 | 计算答案正确率 | query、ground_truth_answer(标准答案) |
数据来源:可从Langfuse Dataset导入历史bad case,或人工标注Golden Set;也可使用EvalScope自动生成基础测试集后人工校验。
二、三个核心指标分开计算的具体操作
1. 检索召回率(Recall@K)——检索层独立评测
控制变量原则:固定索引库、固定TopK参数,只跑检索链路,完全绕开生成模型,指标仅反映检索能力。
EvalScope侧操作
- 新建「检索独立评测」任务,选择指标:
Recall@10、Precision@10、NDCG@10、MRR - 导入检索层测试集,配置被测系统的纯检索接口地址(只返回召回片段,不生成答案)
- 配置参数:
top_k=10(与生产环境一致)、索引版本与生产对齐 - 执行评测,EvalScope自动比对召回片段与标注的标准片段,输出各指标得分
- Recall@K = 命中的相关片段数 / 全部相关片段总数
- 支持按查询维度输出每条用例的召回明细
Langfuse侧对应
- 每条检索请求对应
hybrid_retriever节点Span,记录召回的片段ID列表 - 通过
eval_case_id筛选Trace,可逐条回放召回结果,人工复核漏检片段 - 可按检索节点的错误标签,批量导出漏检case
验证标准
- 指标仅由检索策略、分块、Embedding影响,与生成模型无关
- 同一测试集多次执行,结果波动≤2%,否则索引不稳定
2. 生成忠实度(Faithfulness)——生成层独立评测
控制变量原则:固定输入同一批召回上下文,只跑生成环节,完全排除检索质量干扰,指标仅反映生成模型与Prompt的忠实性。
EvalScope侧操作
- 新建「生成层独立评测」任务,选择RAGAS框架的
Faithfulness(忠实度)指标 - 导入生成层测试集,固定传入同一批标准上下文片段,配置被测系统的纯生成接口地址(只接收上下文+query,返回答案,不做检索)
- 配置裁判模型(建议能力≥被测模型,如70B级或GPT-4o),确保评分稳定
- 执行评测,EvalScope自动拆解原子事实,校验每个事实是否有上下文支撑,输出整体忠实度与幻觉率
- 忠实度 = 有上下文支撑的原子事实数 / 总原子事实数
- 幻觉率 = 1 - 忠实度
Langfuse侧对应
- 每条生成请求对应
answer_generation节点Span,记录输入上下文与输出回答 - 评测完成后,通过EvalScope API将忠实度得分、幻觉标记回写到对应Trace的评分与标签中
- 低忠实度的Trace一键导入Langfuse Dataset,作为bad case沉淀
验证标准
- 固定上下文时,忠实度波动≤3%,否则生成模型不稳定或Prompt有歧义
- 必须先用50条人工标注样本校准裁判模型,Cohen’s Kappa ≥ 0.75方可批量执行
3. 端到端答案正确率(Answer Correctness)——全链路综合评测
控制变量原则:全链路跑通,不隔离任何环节,模拟真实用户请求,指标反映系统整体效果。
EvalScope侧操作
- 新建「端到端RAG评测」任务,选择指标:
AnswerCorrectness(答案正确性)、AnswerRelevancy(答案相关性) - 导入端到端测试集,配置被测系统的完整RAG接口地址
- 配置评分规则:事实准确性、完整性、合规性三个维度加权
- 执行评测,EvalScope对比最终回答与标准答案,输出整体正确率
- 答案正确率 = 回答完全正确的样本数 / 总样本数
Langfuse侧对应
- 每条请求对应完整Trace,包含所有节点的输入输出、耗时、Token消耗
- 评测结果回写到根Trace的评分中,标记
correct/incorrect标签与错误类型 - 支持按错误类型筛选Trace,回放全链路定位问题
三、三维组合归因实现方法
通过「指标回写 + 归因矩阵 + 自动标签」,实现三个指标的组合分析与根因自动定位。
1. 指标双向回写(数据打通核心)
评测完成后,通过API将EvalScope计算的三个指标回写到Langfuse对应Trace中:
| 指标 | 回写位置 | 标签字段 |
|---|---|---|
| 检索召回率 | 检索节点Span评分 | recall_score、retrieval_level: high/medium/low |
| 生成忠实度 | 生成节点Span评分 | faithfulness_score、generation_level: high/medium/low |
| 答案正确率 | 根Trace评分 | correctness_score、overall_level: high/medium/low |
实现方式:EvalScope回调 + Langfuse Score API,每条
eval_case_id匹配对应Trace,批量回写评分与标签。
2. 自动归因矩阵匹配
配置规则引擎,根据三个指标的高/中/低组合,自动判定根因层级与优化方向:
| 检索召回率 | 生成忠实度 | 端到端正确率 | 自动根因标签 | 优化优先级 | 核心优化方向 |
|---|---|---|---|---|---|
| <70%(低) | ≥85%(高) | 低 | bottleneck:retrieval | P0 | 优化分块、Embedding、混合检索、重排序 |
| ≥85%(高) | <70%(低) | 低 | bottleneck:generation | P0 | 优化系统Prompt、增加事实约束、更换生成模型 |
| ≥85%(高) | ≥85%(高) | 低 | bottleneck:knowledge | P1 | 修正知识库内容、补充多跳推理能力 |
| <70%(低) | <70%(低) | 低 | bottleneck:full | P0 | 从底座开始逐层优化 |
| ≥85%(高) | ≥85%(高) | ≥85%(高) | quality:excellent | - | 维持基线,监控长尾场景 |
3. Langfuse侧归因分析操作
- 按标签筛选:在Langfuse Trace页面按
bottleneck:retrieval等标签筛选,批量查看对应问题 - 轨迹回放:点击单条Trace,逐层展开Span,回放每个节点的输入输出,人工复核根因判断
- 维度统计:按标签统计各瓶颈类型的占比,输出质量分布报表
- 资产沉淀:将标注好根因的bad case一键导入Langfuse Dataset,补充进EvalScope测试集,形成闭环
四、工程化进阶:自动化执行与CI集成
1. 批量自动化执行流程
- 触发方式:知识库更新、Prompt迭代、模型升级时,通过Webhook自动触发EvalScope评测任务
- 执行顺序:严格自下而上,先跑检索层评测,达标再跑生成层,最后跑端到端;下层不达标直接终止
- 结果输出:自动生成评测报告 + Langfuse Trace链接 + 根因分析结论
- 通知推送:核心指标劣化自动推送告警,附带问题定位链接
2. 嵌入CI/CD质量门禁
- 合并前门禁:检索召回率、生成忠实度不低于基线,禁止合并
- 发布前门禁:端到端正确率不低于基线,安全红线零违规,禁止发布
- 所有门禁结果关联Langfuse Trace链接,研发可直接跳转定位问题
3. 持续优化闭环
- 每日定时跑核心基准集,监控指标漂移
- 每周从Langfuse拉取线上bad case,人工复核后补充测试集
- 每月输出质量趋势报告,分析各层级指标变化与优化收益
五、常见落地避坑
- 变量不隔离,混着算:算忠实度时用真实检索结果,每次检索都不一样,导致忠实度波动大。必须固定上下文输入。
- K值不匹配:评测用Recall@20,生产实际用Top5,指标好看但无业务价值。K值必须和生产环境一致。
- 裁判模型不校准:直接用LLM-as-Judge打分不做校准,结果偏差大。必须先用人工样本做一致性校验。
- 用例和链路对应不上:不透传唯一case_id,批量执行后无法一一对应,排查效率极低。
- 只看总分不看分层:只关注端到端正确率,不做分层指标,出问题完全不知道优化方向。