用途
evaluate-rag 用于评估检索增强生成(RAG)流水线的检索与生成质量。它面向需要衡量 RAG 系统表现的场景,帮助定位失败究竟来自检索、生成还是两者。
主要能力
先做错误分析
在选择指标之前,先对 RAG 流水线的端到端 trace 做错误分析。检查实际检索到的内容与模型所需内容之间的差异,判断问题出在检索、生成还是两者。优先修复检索。
分别评估检索与生成
对每个组件独立衡量,并为每个检索阶段使用合适的指标:
- 首轮检索:优化 Recall@k,即使引入噪声也要包含所有相关文档。
- 重排序:优化 Precision@k、MRR 或 NDCG@k,把最相关的文档排在最前。
构建检索评估数据集
需要将查询与作为 ground-truth 的相关文档块配对。
- 人工整理(质量最高):编写真实问题,并将每个问题映射到包含答案的确切文档块。
- 合成 QA 生成(可扩展):对每个文档块,提示 LLM 提取一个事实,并生成一个只能由该事实回答的问题。
合成 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(共享术语但缺少答案的文档块)。
- 提示 LLM 使用 B 和 C 中的术语编写一个问题,该问题只能由文档块 A 回答。
示例:
- 文档块 A:"In April 2020, the company reported a 17% drop in quarterly revenue, its largest decline since 2008."
- 文档块 B:"The company experienced significant losses in 2008 during the financial crisis."
- 生成的问题:"When did the company experience its largest revenue decline since the 2008 financial crisis?"
只有文档块 A 包含答案,文档块 B 是合理的干扰项。
过滤合成问题:使用 few-shot LLM 评分对合成查询的真实性打分,只保留被评为真实(1-5 分制中的 4-5 分)的查询。此处适合使用 Likert 评分,因为目标是用于数据集整理的模糊排序,而非衡量失败率。
检索指标
-
Recall@k:前 k 个结果中找到的相关文档比例。
Recall@k = (relevant docs in top k) / (total relevant docs for query)
首轮检索优先考虑召回率。LLM 可以忽略不相关内容,但无法从缺失内容中生成答案。
-
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(Normalized Discounted Cumulative Gain):用于文档效用各异的等级相关性。奖励将更相关的项目排在更高位置。
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。综合查询("summarize market trends")使用 k=5-10。
指标选择
| 查询类型 | 主要指标 |
|---|---|
| 单事实查找 | MRR |
| 需要广泛覆盖 | Recall@k |
| 排序质量重要 | NDCG@k 或 Precision@k |
| 多跳推理 | Two-hop Recall@k |
评估与优化分块
将分块视为可调超参数。即使使用相同的检索器,仅分块方式不同,指标也会变化。
固定大小分块的网格搜索:测试分块大小与重叠的组合。为每种配置重新索引语料库。在评估数据集上衡量检索指标。
搜索网格示例:
| Chunk size | Overlap | Recall@5 | NDCG@5 |
|---|---|---|---|
| 128 tokens | 0 | 0.82 | 0.69 |
| 128 tokens | 64 | 0.88 | 0.75 |
| 256 tokens | 0 | 0.86 | 0.74 |
| 256 tokens | 128 | 0.89 | 0.77 |
| 512 tokens | 0 | 0.80 | 0.72 |
| 512 tokens | 256 | 0.83 | 0.74 |
内容感知分块:当固定大小分块拆分了相关信息时:
- 使用自然文档边界(章节、段落、步骤)。
- 为分块添加上下文:在嵌入前为每个分块前置文档标题和章节标题。
评估生成质量
确认检索正常后,从两个维度评估 LLM 如何处理检索到的上下文:
- 答案忠实度:输出是否准确反映检索到的上下文?检查:
- 幻觉:源文档中不存在的信息。在 RAG 中,即使来自 LLM 自身知识的正确事实也算作幻觉。
- 遗漏:上下文中相关信息在输出中被忽略。
- 误解:上下文信息被不准确地表述。
- 答案相关性:输出是否回应了原始查询?答案可能忠实于上下文,但未能回答用户所问。
使用错误分析发现流水线中的具体表现。识别哪类信息会被幻觉,哪些约束会被遗漏。
按指标模式诊断失败
| Context Relevance | Faithfulness | Answer Relevance | 诊断 |
|---|---|---|---|
| High | High | Low | 生成器关注了正确文档的错误部分 |
| High | Low | -- | 对检索内容产生幻觉或误解 |
| Low | -- | -- | 检索问题。修复分块、嵌入或查询预处理 |
多跳检索评估
对于需要来自多个文档块信息的查询:
-
Two-hop Recall@k:两个 ground-truth 文档块都出现在前 k 个结果中的 2 跳查询比例。
TwoHopRecall@k = (1/N) * sum(1 if {Chunk1, Chunk2} ⊆ top_k_results)
通过分类诊断失败:第 1 跳未命中、第 2 跳未命中,或排名超出前 k。
反模式
- 使用单一的端到端正确性指标,而不分别衡量检索与生成。
- 不先阅读 trace 就直接跳到指标。
- 过拟合合成评估数据。定期用真实用户查询验证。
- 将相似度指标(ROUGE、BERTScore、余弦相似度)作为主要的生成评估。使用由错误分析驱动的二元评估器。
- 在不检查上下文接地的情况下评估生成。
使用方式
该技能以指导性说明的形式提供评估 RAG 流水线的方法、指标、数据集构建流程与诊断表。资料未提供具体的安装命令、代码调用方式或运行环境要求。
适用场景
- 评估检索增强生成系统的检索与生成质量。
- 构建检索评估数据集(人工或合成)。
- 选择检索指标并优化分块超参数。
- 诊断 RAG 失败来源并评估多跳检索。
限制
资料未提供该技能的收费、价格、平台支持、具体安装步骤或效果保证等信息。