基于 LangSmith Traces 的 RAG 分层评测方案
本方案基于 LangSmith 原生 Trace 数据结构,遵循分层解耦、全链路可追溯、指标可量化的原则,将 RAG 评测拆解为检索层、生成层、端到端层三个层级,直接从线上 Traces 中提取数据完成指标计算,同时支持结合黄金标注集做深度质量评估。
权威来源:LangSmith Trace 数据结构、Evaluator 能力参考官方文档:
https://docs.smith.langchain.com/observability/traces
https://docs.smith.langchain.com/evaluation/evaluators/faithfulness
一、前置基础:RAG 链路 Trace 埋点规范
所有分层评测的前提是埋点标准化,确保 Traces 可分层、可关联、字段完整。基于 LangChain 搭建的 RAG 链路,需遵循以下埋点约定:
| 链路节点 | 命名规范 | run_type | 核心输出字段 | 标签/元数据 |
|---|---|---|---|---|
| 全链路顶层 | rag_main_chain | chain | answer(最终回答) | tags:["rag","end2end"]metadata:prompt_version、kb_version、business_line、model_name |
| 检索节点 | knowledge_retriever | retriever | documents(召回片段列表,每个片段含page_content、metadata、score) | tags:["rag","retrieval"] |
| 生成节点 | answer_generation_llm | llm | generations[0].text(生成回答) | tags:["rag","generation"] |
数据关联逻辑:通过trace_id+parent_run_id关联同一请求的各层 Run,确保检索、生成、端到端指标对应同一条查询,避免数据错位。
二、分层评测体系(按链路节点拆解)
1. 检索层评测:基于 Retriever Run
对应 Trace 节点:run_type = "retriever"或name = "knowledge_retriever"
核心提取字段:inputs.query(用户查询)、outputs.documents(召回片段列表)、片段相似度score、duration(耗时)、error(异常信息)
评测分为两类:无标注运营指标(直接从线上 Trace 统计)和有标注质量指标(结合黄金测试集)。
(1)无标注运营指标(无需标注,直接计算)
| 指标 | 计算公式 | 业务意义 |
|---|---|---|
| 平均召回片段数 | avg(doc_count) = 所有Run召回片段总数 / 总Run数 | 监控 TopK 配置稳定性,排查召回为空/过量异常 |
| 零召回率 | 零召回Run数 / 总Retriever Run数 | 衡量无答案场景占比,对应知识库覆盖缺口 |
| 低分召回占比 | 最高相似度得分 < 阈值(默认0.6)的Run数 / 总Run数 | 预判召回质量整体水位,低分占比升高意味着检索质量漂移 |
| 检索延迟 TP50/TP90/TP99 | 所有 Retriever Run 的duration分位值 | 检索性能核心指标 |
| 检索错误率 | 出现异常的Retriever Run数 / 总Run数 | 衡量检索服务稳定性 |
(2)有标注质量指标(结合 Golden Set)
将 Trace 中的 query 与黄金标注集(每条 query 标注标准相关片段 ID)匹配,计算信息检索标准指标:
- Recall@K:召回的相关片段数 / 全部相关片段总数
- Precision@K:召回的相关片段数 / K
- NDCG@K:归一化折损累计增益,衡量排序质量
- MRR:平均倒数排名,衡量首个相关结果的位置
LangSmith 落地方式:
- 离线批量:通过
langsmith.Client按标签过滤拉取 Retriever Run,导出 documents 与 score,离线匹配标注集计算指标 - 在线自动:将黄金集上传至 LangSmith Datasets,配置检索评估器,自动批量输出质量指标
2. 生成层评测:基于 LLM Run
对应 Trace 节点:run_type = "llm"且name = "answer_generation_llm"
核心提取字段:inputs.messages(提取 system prompt、检索上下文 context、用户 query)、outputs.generations[0].text(生成回答)、prompt_tokens/completion_tokens、duration
核心评测指标
| 指标 | 计算逻辑 | LangSmith 落地方式 |
|---|---|---|
| 忠实度(Faithfulness) | 回答中可被检索上下文支撑的原子事实占比 | 直接调用 LangSmith 内置FaithfulnessEvaluator,传入 context 与 answer,自动输出 0-1 得分 |
| 幻觉率 | 1 - 忠实度得分 | 基于忠实度得分直接计算 |
| 指令遵循率 | 输出符合 Prompt 约束(格式、字数、引用标记等)的比例 | 自定义 Evaluator,通过规则或 LLM 裁判校验格式、关键字、约束条件 |
| 虚假引用率 | 回答中标注但上下文不存在的引用占总引用数的比例 | 自定义 Evaluator 匹配引用标记与上下文来源 |
| 平均 Token 消耗 | 总token数 / 总LLM Run数 | 直接从 Trace 的usage字段统计,核算推理成本 |
| 生成延迟 TP50/TP90 | LLM Run 的duration分位值 | 直接统计耗时字段 |
说明:内置 FaithfulnessEvaluator 基于原子事实拆解逻辑实现,与 RAGAS 忠实度计算逻辑对齐,是生成层评测的核心基准工具。
3. 端到端层评测:基于顶层 Chain Run
对应 Trace 节点:name = "rag_main_chain"(最顶层 RAG 链路)
核心提取字段:inputs.query、outputs.answer、duration(全链路耗时)、error、用户feedback(点赞/点踩)
核心评测指标
| 指标 | 计算逻辑 | 业务意义 |
|---|---|---|
| 端到端响应时间 TP50/TP90 | 顶层 Chain Run 的duration分位值 | 用户体验核心指标,包含检索+生成+工程链路总耗时 |
| 端到端错误率 | 顶层 Run 出现异常的比例 | 系统可用性核心指标 |
| 业务解决率 | 方式1:用户正向反馈数 / 总反馈数 方式2:结合黄金集,回答正确的 query 占比 | 最终业务价值指标 |
| 拒答准确率 | 知识库外问题中,模型正确拒答的比例 | 边界控制能力,需结合边界问题标注集计算 |
| 用户负反馈率 | 用户点踩/差评的对话占比 | 线上真实质量的最终体现 |
三、工程化落地路径
1. 定时批量离线评测(日常质量监控)
- 数据拉取:通过 LangSmith Python SDK,按时间窗口、业务线标签拉取全量 Traces
- 分层计算:
- 检索层:统计召回分布、零召回率、延迟、错误率
- 生成层:调用 FaithfulnessEvaluator 批量计算忠实度
- 端到端:统计全链路耗时、错误率、反馈率
- 输出报告:按日/周输出质量报表,对比版本基线,识别质量漂移
- 下钻定位:指标异常时,按业务线、Prompt 版本、知识库版本维度下钻,定位问题层级
2. 在线自动评估(实时质量门禁)
- 将高频业务 query、边界问题集同步到 LangSmith Datasets
- 配置自动评估器(忠实度、相关性、格式合规),每次 RAG 调用后自动打分
- 设置阈值告警:忠实度低于 0.8、零召回率高于 5% 等场景自动触发告警
- 灰度发布场景:实时对比新旧版本的分层指标,触发劣化自动回滚
3. Bad Case 闭环沉淀
- 自动筛选低得分、负反馈、异常的 Trace 进入 bad case 库
- 人工复核根因,标注问题类型(检索漏检/生成幻觉/知识库缺失)
- 定期将典型 bad case 补充进 Golden Set,迭代评测集覆盖度
四、关键注意事项
- 埋点一致性是前提:检索节点必须完整输出召回片段与相似度分,生成节点必须保留原始上下文,否则无法计算忠实度等核心指标
- 评估器需提前校准:内置/自定义 LLM 评估器,需先用人工标注集校准,Cohen’s Kappa 系数 ≥ 0.75 方可批量使用
- 避免数据泄露:用于评测的黄金集不能与知识库内容高度重合,否则指标虚高,无法反映真实线上效果
- 多维度下钻定位:不要只看整体指标,按业务线、问题类型、难度、版本分层下钻,精准定位瓶颈在检索还是生成