关于 evaluate-rag
面向 RAG 流水线的评估技能,指导团队先分析运行跟踪,再分别测量检索与生成质量。内容涵盖评估数据集构建、检索指标、分块优化和答案质量诊断。
主要功能
- 01先分析端到端运行跟踪
- 02分别评估检索与生成
- 03构建查询与相关文本块数据集
- 04使用 Recall@k、MRR、NDCG@k 等指标
- 05网格搜索优化文本分块
- 06检查答案忠实度与相关性
适用场景
- 01定位 RAG 流水线的检索或生成问题
- 02衡量首轮检索和重排质量
- 03评估多跳查询的检索覆盖
- 04比较文本分块配置
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ ai-evals-course/ evals-skills --skill evaluate-rag安装后在 Claude Code 中输入/evaluate-rag确认已加载。
附带文件agents/openai.yaml
详细介绍
评估 RAG
概述
- 首先对端到端跟踪记录进行错误分析。判断故障来自检索、生成,还是两者都有。
- 构建检索评估数据集:将查询与相关文档块配对。
- 使用 Recall@k 衡量检索质量(对第一阶段检索最重要)。
- 单独评估生成:忠实度(是否以上下文为依据?)和相关性(是否回答了查询?)。
- 如果检索是瓶颈,先通过网格搜索优化分块,再调整生成。
前提条件
选择指标前,先对 RAG 管道跟踪记录进行错误分析。检查实际检索到的内容与模型所需内容。判断问题出在检索、生成,还是两者都有。先修复检索问题。
核心说明
分别评估检索和生成
独立衡量每个组件。针对各个检索阶段使用合适的指标:
- 第一阶段检索: 优化 Recall@k。纳入所有相关文档,即使会带来噪声也无妨。
- 重排: 优化 Precision@k、MRR 或 NDCG@k。优先排列最相关的文档。
构建检索评估数据集
你需要将查询与真实相关文档块配对。
人工整理(质量最高): 编写真实的问题,并将每个问题对应到包含答案的确切文档块。
合成 QA 生成(可扩展): 针对每个文档块,提示大模型提取一个事实,并生成一个只能根据该事实回答的问题。
合成 QA 提示词模板:
Given a chunk of text, extract a specific, self-contained fact from it.
Then write a question that is directly and unambiguously answered
by that fact alone.
Return output in JSON format:
{ "fact": "...", "question": "..." }
Chunk: "{text_chunk}"
对抗性问题生成: 创建更难的查询,使其内容与多个文档块相似,但只有一个文档块能回答。
流程:
- 选择包含明确事实的目标文档块 A。
- 使用嵌入搜索找到相似的文档块 B、C(包含相同术语但不包含答案的文档块)。
- 提示大模型使用 B 和 C 中的术语撰写问题,且只有文档块 A 能回答该问题。
示例:
- 文档块 A:“2020 年 4 月,公司报告季度收入下降了 17%,这是自 2008 年以来最大的降幅。”
- 文档块 B:“在 2008 年金融危机期间,公司遭受了重大损失。”
- 生成的问题:“公司何时出现了自 2008 年金融危机以来最大的收入降幅?”
只有文档块 A 包含答案。文档块 B 是一个看似合理的干扰项。
筛选合成问题: 使用少样本大模型评分,按真实性对合成查询进行评分。只保留评分为 4-5 分(满分 5 分)的真实问题。这里适合使用 Likert 评分,因为目标是对数据集整理进行模糊排序,而不是衡量故障率。
检索指标
Recall@k: 前 k 个结果中找到的相关文档所占比例。
Recall@k = (relevant docs in top k) / (total relevant docs for query)
第一阶段检索应优先考虑召回率。大模型可以忽略无关内容,但无法根据缺失的内容生成答案。
Precision@k: 前 k 个结果中相关结果所占比例。
Precision@k = (relevant docs in top k) / k
用于评估重排。
Mean Reciprocal Rank (MRR): 第一个相关文档出现得有多靠前。
MRR = (1/N) * sum(1/rank_of_first_relevant_doc)
最适用于单事实查找场景,因为这类场景只需要一个关键文档块。
NDCG@k(归一化折损累计增益): 适用于文档效用各不相同的分级相关性场景。将相关性更高的内容排在更前面会获得更高分。
DCG@k = sum over i=1..k of: rel_i / log2(i+1)
IDCG@k = DCG@k with documents sorted by decreasing relevance
NDCG@k = DCG@k / IDCG@k
注意:弱相关文档的最佳排序可能会比排名较低的高度相关文档得分更高。应结合 Recall@k 使用。
选择 k: k 会因查询类型而异。事实查找通常使用 k=1-2。综合类查询(“总结市场趋势”)通常使用 k=5-10。
指标选择
| 查询类型 | 主要指标 |
|---|---|
| 单事实查找 | MRR |
| 需要广泛覆盖 | Recall@k |
| 排名质量很重要 | NDCG@k 或 Precision@k |
| 多跳推理 | Two-hop Recall@k |
评估和优化分块
将分块视为可调超参数。即使使用相同的检索器,指标也会仅因分块方式不同而有所变化。
固定大小分块的网格搜索: 测试不同的分块大小和重叠量组合。针对每种配置重新为语料建立索引。在评估数据集上测量检索指标。
搜索网格示例:
| 分块大小 | 重叠量 | Recall@5 | NDCG@5 |
|---|---|---|---|
| 128 个令牌 | 0 | 0.82 | 0.69 |
| 128 个令牌 | 64 | 0.88 | 0.75 |
| 256 个令牌 | 0 | 0.86 | 0.74 |
| 256 个令牌 | 128 | 0.89 | 0.77 |
| 512 个令牌 | 0 | 0.80 | 0.72 |
| 512 个令牌 | 256 | 0.83 | 0.74 |
内容感知分块: 当固定大小的分块将相关信息拆开时:
- 使用文档的自然边界(章节、段落、步骤)。
- 为分块补充上下文:在嵌入每个分块之前,将文档标题和章节标题添加到分块开头。
评估生成质量
确认检索有效后,从以下两个维度评估 LLM 如何利用检索到的上下文:
答案忠实度: 输出是否准确反映了检索到的上下文?检查以下问题:
- 幻觉: 源文档中不存在的信息。在 RAG 中,即使 LLM 自身知识中的事实是正确的,也算作幻觉。
- 遗漏: 输出忽略了上下文中的相关信息。
- 误解: 对上下文信息的表述不准确。
答案相关性: 输出是否回应了原始查询?答案可能忠实于上下文,却没有回答用户的问题。
使用错误分析,找出工作流中的具体问题表现。确定哪些类型的信息会产生幻觉,以及哪些约束会被遗漏。
按指标模式诊断故障
| 上下文相关性 | 忠实度 | 答案相关性 | 诊断 |
|---|---|---|---|
| 高 | 高 | 低 | 生成器关注了正确文档中的错误章节 |
| 高 | 低 | -- | 对检索内容产生幻觉或误解 |
| 低 | -- | -- | 检索问题。修复分块、嵌入或查询预处理 |
多跳检索评估
对于需要从多个分块获取信息的查询:
两跳 Recall@k: 两跳查询中,真实标签对应的两个分块都出现在前 k 个结果中的比例。
TwoHopRecall@k = (1/N) * sum(1 if {Chunk1, Chunk2} ⊆ top_k_results)
通过分类故障进行诊断:第一跳未命中、第二跳未命中,或排名不在前 k 位。
反模式
- 使用单一的端到端正确性指标,却不分别衡量检索和生成。
- 尚未阅读跟踪记录,就直接查看指标。
- 对合成评估数据过拟合。定期使用真实用户查询进行验证。
- 将相似度指标(ROUGE、BERTScore、余弦相似度)作为主要的生成评估方式。使用由错误分析驱动的二元评估器。
- 评估生成时不检查上下文依据。