AI 推理优化|RAG 评测体系搭建:用 RAGAS 科学量化你的检索增强系统

AI 推理优化|RAG 评测体系搭建:用 RAGAS 科学量化你的检索增强系统 一、为什么 RAG 不能凭感觉评估传统 NLP 评测靠人工标注参考答案如 BLEU/ROUGE 对比标准答案。但 RAG 的答案来自检索到的上下文 模型生成同一个问题可能有多种正确表述人工打标成本高、主观强。RAGAS 的解法是用 LLM 当裁判LLM-as-a-Judge不需要标准答案只给你系统的输入输出就能打分。它把质量拆成四个正交维度指标衡量什么依赖Faithfulness忠实度答案是否完全基于检索上下文有无幻觉question, context, answerAnswer Relevancy答案相关性答案是否切题、有无答非所问question, answerContext Precision上下文精度检索到的内容里相关项是否排在前面question, contextContext Recall上下文召回标准答案所需信息是否都被检索到了question, context, ground_truth四个指标合起来基本覆盖了 RAG 的检索准不准和生成靠不靠谱。二、四大指标原理拆解2.1 Faithfulness忠实度—— 反幻觉核心思路把答案拆成若干陈述句逐句判断能否被上下文支撑。答案巴黎是法国首都人口约 200 万。 上下文巴黎是法国首都。 → 陈述1「巴黎是法国首都」→ 上下文支撑 ✅ → 陈述2「人口约200万」→ 上下文无 ✅→ 无法支撑 ❌ Faithfulness 可支撑陈述数 / 总陈述数 0.5RAGAS 用 LLM 生成每个陈述是否可由上下文推导的判断最后取比例。2.2 Answer Relevancy答案相关性用问题生成若干假设性问题看这些假设问题与原问题的相似度均值把答案逆生成问题 答案巴黎是法国首都。 → 生成问题法国首都是哪 similarity(原问题, 生成问题) 高 → 答案相关相似度用 embedding 余弦计算。答案越切题逆生成的问题越接近原问题。2.3 Context Precision / Recall上下文精度 / 召回这是检索器的考试卷Precision检索到的 top-k 文档里真正相关的排得靠前吗位置加权Recallground_truth 需要的信息是否全在检索结果里Precisionk Σ (相关? × 位置权重) / 累计相关数 Recall |检索到的相关文档 ∩ 需要的文档| / |需要的文档|三、源码走读RAGAS 的提示词范式RAGAS 本质是精心设计的 prompt LLM 调用。以 Faithfulness 为例它的核心 prompt 逻辑示意# ragas/metrics/faithfulness.py逻辑示意非逐字 faithfulness_prompt 给定 Context 和 Statement判断 Statement 是否可从 Context 推导。 只回答 1(可推导) 或 0(不可推导)。 ​ Context: {context} Statement: {statement} ​ def faithfulness(question, context, answer, llm): # 1. 把 answer 拆成 statements statements llm.decompose(answer) # LLM 抽取陈述句 # 2. 逐句判支撑 scores [] for s in statements: r llm(faithfulness_prompt.format(contextcontext, statements)) scores.append(int(r)) return sum(scores) / len(scores) # 比例即分数关键点所有判断都交给 LLMRAGAS 只负责把任务拆成 LLM 能稳定回答的小问题。这也是为什么它不需要人工标注。四、实战30 行代码跑通 RAGAS 评测4.1 准备数据集RAGAS 需要questionanswercontextsground_truth可选from datasets import Dataset ​ eval_data { question: [ Transformer 的注意力机制解决了什么问题, LoRA 为什么能减少显存, ], answer: [ 解决了 RNN 长程依赖难训练的问题可并行计算。, LoRA 用低秩分解只训练小矩阵冻结原权重。, ], contexts: [[ RNN 难以并行且长程梯度消失注意力机制可全局建模并并行。, LoRA 把 ΔW 分解为 BA仅训练 A/B显存大降。, ]], ground_truth: [ 解决长程依赖与并行问题。, 低秩分解降低可训练参数量。, ], } dataset Dataset.from_dict(eval_data)4.2 跑评测4.3 接入真实 RAG 管线from ragas import evaluate from ragas.metrics import ( faithfulness, answer_relevancy, context_precision, context_recall ) ​ # 用本地 Llama-3 当裁判 LLM避免调用云端可控成本 from langchain_community.llms import LlamaCpp llm LlamaCpp(model_path./llama-3-8b-q4.gguf, n_ctx4096) ​ result evaluate( dataset, metrics[faithfulness, answer_relevancy, context_precision, context_recall], llmllm, ) print(result) # {faithfulness: 0.92, answer_relevancy: 0.88, # context_precision: 0.95, context_recall: 0.90}把你的 RAG 系统的输出填进answer和contexts即可——评测与业务解耦改了检索器直接重跑对比分数。五、Llama-3 实测改检索器带来的分数变化用 50 条领域问答测试对比基础向量检索与向量 Reranker两种管线管线FaithfulnessAnswer Rel.Ctx PrecisionCtx Recall综合纯向量检索(top-5)0.810.790.740.680.755向量 bge-reranker(top-3)0.930.900.940.880.912加 Reranker 后综合分从 0.755 涨到 0.912——这就是评测体系的真正价值把感觉变好了变成分数涨了 0.15可量化地指导优化。六、避坑与最佳实践裁判 LLM 要够强用 7B 以下小模型当裁判分数会和人工偏差大建议 8B 或云端强模型Context Recall 必须有 ground_truth没标准答案时它算不了可暂时跳过指标不是越高越好Faithfulness1.0 但 Answer Relevancy 低说明答得对但答非所问批量评测要控制成本50 条 × 4 指标 × 多次 LLM 调用建议本地量化模型跑建立 baseline第一次跑出的分就是你的底线之后任何改动都要对比它七、总结RAGAS 把RAG 好不好从玄学变成可度量四大指标正交覆盖检索Precision/Recall与生成Faithfulness/RelevancyLLM 当裁判无需人工标注改一处就能看到分数变化30 行代码接入现有管线本地 Llama-3 即可跑实测加 Reranker 综合分从 0.755 → 0.912量化指导优化下篇预告评测告诉我们检索不准那检索本身怎么进化下期拆解 ColBERT 后期交互检索看它如何用 token 级交互把召回率再提一截。往期回顾AI 推理优化实践 | CLIP 图文对齐原理深度拆解从对比AI 推理优化系列:LoRA/QLoRA 微调原理单卡 24G 显存AI 推理优化实践vLLM Continuous Batching5800 t/s