mcpField
E
evaluate-rag

evaluate-rag

github.com/ai-evals-course测试与质量1.6k1.0k 次安装5 周前更新
代码仓库

关于 evaluate-rag

面向 RAG 流水线的评估技能,指导团队先分析运行跟踪,再分别测量检索与生成质量。内容涵盖评估数据集构建、检索指标、分块优化和答案质量诊断。

主要功能

  1. 01先分析端到端运行跟踪
  2. 02分别评估检索与生成
  3. 03构建查询与相关文本块数据集
  4. 04使用 Recall@k、MRR、NDCG@k 等指标
  5. 05网格搜索优化文本分块
  6. 06检查答案忠实度与相关性

适用场景

  1. 01定位 RAG 流水线的检索或生成问题
  2. 02衡量首轮检索和重排质量
  3. 03评估多跳查询的检索覆盖
  4. 04比较文本分块配置

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/ai-evals-course/evals-skills --skill evaluate-rag

安装后在 Claude Code 中输入/evaluate-rag确认已加载。

附带文件agents/openai.yaml

详细介绍

评估 RAG

概述

  1. 首先对端到端跟踪记录进行错误分析。判断故障来自检索、生成,还是两者都有。
  2. 构建检索评估数据集:将查询与相关文档块配对。
  3. 使用 Recall@k 衡量检索质量(对第一阶段检索最重要)。
  4. 单独评估生成:忠实度(是否以上下文为依据?)和相关性(是否回答了查询?)。
  5. 如果检索是瓶颈,先通过网格搜索优化分块,再调整生成。

前提条件

选择指标前,先对 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}"

对抗性问题生成: 创建更难的查询,使其内容与多个文档块相似,但只有一个文档块能回答。

流程:

  1. 选择包含明确事实的目标文档块 A。
  2. 使用嵌入搜索找到相似的文档块 B、C(包含相同术语但不包含答案的文档块)。
  3. 提示大模型使用 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@5NDCG@5
128 个令牌00.820.69
128 个令牌640.880.75
256 个令牌00.860.74
256 个令牌1280.890.77
512 个令牌00.800.72
512 个令牌2560.830.74

内容感知分块: 当固定大小的分块将相关信息拆开时:

  • 使用文档的自然边界(章节、段落、步骤)。
  • 为分块补充上下文:在嵌入每个分块之前,将文档标题和章节标题添加到分块开头。
评估生成质量

确认检索有效后,从以下两个维度评估 LLM 如何利用检索到的上下文:

答案忠实度: 输出是否准确反映了检索到的上下文?检查以下问题:

  • 幻觉: 源文档中不存在的信息。在 RAG 中,即使 LLM 自身知识中的事实是正确的,也算作幻觉。
  • 遗漏: 输出忽略了上下文中的相关信息。
  • 误解: 对上下文信息的表述不准确。

答案相关性: 输出是否回应了原始查询?答案可能忠实于上下文,却没有回答用户的问题。

使用错误分析,找出工作流中的具体问题表现。确定哪些类型的信息会产生幻觉,以及哪些约束会被遗漏。

按指标模式诊断故障
上下文相关性忠实度答案相关性诊断
高高低生成器关注了正确文档中的错误章节
高低--对检索内容产生幻觉或误解
低----检索问题。修复分块、嵌入或查询预处理
多跳检索评估

对于需要从多个分块获取信息的查询:

两跳 Recall@k: 两跳查询中,真实标签对应的两个分块都出现在前 k 个结果中的比例。

TwoHopRecall@k = (1/N) * sum(1 if {Chunk1, Chunk2} ⊆ top_k_results)

通过分类故障进行诊断:第一跳未命中、第二跳未命中,或排名不在前 k 位。

反模式

  • 使用单一的端到端正确性指标,却不分别衡量检索和生成。
  • 尚未阅读跟踪记录,就直接查看指标。
  • 对合成评估数据过拟合。定期使用真实用户查询进行验证。
  • 将相似度指标(ROUGE、BERTScore、余弦相似度)作为主要的生成评估方式。使用由错误分析驱动的二元评估器。
  • 评估生成时不检查上下文依据。

评论

支持 Markdown