0 参考资料

代码仓库https://github.com/huangjia2019/rag-in-action

13 评估RAG系统

13.1 RAG系统评估

RAG 的系统评估分为检索评估和响应评估:

  • 对检索器的评估 包含一定的主观因素,但仍可以采用信息检索领域的一些指标来进行衡量,例如 准确率(Precision)、召回率(Recall)和 排名准确度等。
  • 生成器的评估(也称为“响应评估”,实际上是针对RAG系统给出的最终结果进行的整体评估)则更加复杂。它不仅要求验证生成的答案是否基于事实(即与上下文相关),以及是否有效地回答了用户的问题(即与查询相关),还需要判断答案是否流畅、安全且符合人类价值观。为了评估生成内容的质量,会结合使用定量指标(如 BLEU 或 ROUGE)和定性指标(如 回答的相关性、语义一致性、语境契合度、扎实性及忠实度)。鉴于这些因素的复杂性,还需要依赖人类的主观评价来辅助完成整个评估过程。

RAG 的评估三角:
上下文关联:针对 Query 进行检索,评估检索后结果的准确性
响应忠实度:LLM 基于 检索出的 Context 进行回答,回答的内容与 Context 的相关性
回答关联性:最终回答的内容 与 Query 的相关性。
image.png

13.2 检索器的评估指标

13.2.1 精确率 Precision

精确率 衡量 检索到的文本块中有多少与查询相关,即检索到的相关文本块数量占总检索文本块数量的比例。精确度旨在回答:“在所有被检索出的文本块中,有多少是真正相关的?”
image.png

高精确率也意味着检索内容更加精准,有效减少了不必要的信息展示。这一指标在避 免无关信息的呈现方面尤为重要,尤其在医疗、法律等专业领域,高精确率能够有效防止 误导性信息的传播。

13.2.2 召回率 Recall

召回率 衡量系统检索到的相关文本块的全面性,即检索到的相关文本块数量占数据库中所有相关文本块数量的比例。召回率旨在回答:“在所有相关的文本块中,系统成功检索出了多少?”

image.png
高召回率对避免遗漏关键信息至关重要。若召回率低,模型可能由于缺乏关键信息而 生成不完整的回答或产生错误。例如,在法律文档检索中,遗漏相关信息可能会影响到案 例分析的完整性。

13.2.3 F1 分数

在 RAG 系统中,提高精确率往往会导致召回率的降低,反之亦然。因此,为了获得 最佳的检索性能,通常需要在精确率和召回率之间找到平衡。这一平衡通常使用 F1 分数 来量化,它是精确率与召回率的调和平均数,用于在两者之间找到适合具体应用需求的最 优点。
image.png

13.2.4 平均倒数排名

平均倒数排名(MRR)是一项评估检索系统效率的指标,它特别关注第一个相关文 本块的排名。MRR 可以帮助我们衡量 RAG 系统能否快速返回第一个相关文本块,它的 值对用户体验有直接影响。MRR 值越高,表示系统能越快地找到第一个符合需求的答案。
image.png
Q 表示总查询数。rankq 表示查询 q 的第一个相关文本块的排名。该公式需要 取第一个相关文本块排名的倒数,这意味着 MRR 只关注每个查询返回的第一个相关文本 块的位置。根据这种计算方式,文本块排名越靠前,rankq 的倒数越大,MRR 也会越大。

13.2.5 平均精确率

平均精确率(MAP)是一项跨多个查询评估的精确率衡量指标,它不仅考虑了检索 结果的精确率,还强调了文档排序的重要性。MAP 通过计算每个查询在不同排名的精确 率来评估检索效果,确保重要的相关文档较为靠前,从而优化用户的搜索体验。
image.png
其中,Q 表示总查询数。而 Average Precision 是针对每个查询计算的平均精确度, 考虑了相关文档的顺序。MAP 在搜索引擎等注重排名质量的系统中很实用,常用于电商平台的产品推荐系统 等场景。

13.2.6 P@K

P@K 衡量的是前 K 个检索结果的精确率,确保在展示的前几项结果中尽可能多地包含相关信息。
image.png
其中,分子表示前 K 个结果中相关文档的数量,分母中的 K 是固定的返回数量。P@K 在用户特别关注前几项结果的场景中非常有用。例如,在新闻搜索系统中, P@K 可以确保用户在进行搜索时,查到的前几条新闻与查询主题高度相关,从而提升阅 读效率。

13.2.7 总结

指标 衡量内容 计算方法 回答的问题
精确率 检索结果的准确性 相关文档块数 / 检索到的总文档块数 在系统检索的所有文档块中,有多少是真正相关的?
召回率 检索结果的完整性 检索到的相关文档块数 / 数据库中所有相关文档块数 在数据库中所有的相关文档块中,系统成功检索到了多少?
F1分数 精确率与召回率的平衡 2 * (精确率 * 召回率) / (精确率 + 召回率) 系统的精确性和完整性如何均衡?
平均倒数排名 系统快速检索到第一个相关文档块的能力 对多个查询的倒数排名取平均值 平均而言,系统多快能检索到第一个相关文档块?
平均精确率 精确性和相关文档块排序的综合评估 对多个查询的平均精确率取平均值 平均而言,系统检索的排名靠前的文档块有多精确?
P@K 前K个检索结果的精确度 前K个结果中的相关文档块数量 / K 在前K个检索结果中,有多少是相关的?

13.3 生成器的评估指标

响应评估:语义相似度、忠实度等

13.3.1 基于n-gram匹配程度的指标:BLEU

BLEU(Bilingual Evaluation Understudy,可译为“双语评估替代工具”)用于评 估生成的回答与参考答案之间 n-gram 的重叠情况,强调精确率。它通过 n-gram(即连 续的 n 个 token 构成的序列,n 可以为 1、2、3、4 等)的精确匹配来计算分数。
image.png
其中,BP 是长度惩罚(Brevity Penalty),用于防止生成的回答过短。若生成的回 答比参考答案短,则 BP 小于 1;否则,BP 等于 1。P n 是 n -gram 的精确率。w n 是每 个 n-gram 的权重,通常 w 1、w 2、w 3 和 w 4 的值相等。
例如,假设参考答案为“the cat is on mat”,而生成的回答为“the cat on mat”。 对 于BLEU-1(1-gram 精 确 度 ),1-gram( 单 词 ) 匹 配 项 包 括 “the”“cat”“on”“mat”4 个。生成的回答中有 4 个 1-gram。因此,1-gram 精确率 1。

13.3.2 基于n-gram匹配程度的指标:ROUGE

ROUGE(Recall-Oriented Understudy for Gisting Evaluation,一般译为“面 向召回的摘要评估替代工具”)用于计算生成的回答与参考答案之间 n-g ram 的重叠量, 并同时考虑了精确率和召回率,提供了较为平衡的评价方式。
image.png
继续使用前面的示例,假设参考答案为“the cat is on mat” ,而生成回答为“the cat on mat”。 对于 ROUGE-1(即 1-gram),匹配项包括“the”“cat”“on”和“mat”4 个。参考答案中有 5 个 1-gram。因此,ROUGE-1 为 0.8。 对于 ROUGE-2(即 2-gram),匹配项包括“the cat”和“on mat”2 个。参考 答案中有 4 个 2-gram。因此,ROUGE-2 为 0.5。

13.3.3 基于n-gram匹配程度的指标:METEOR

METEOR(Metric for Evaluation of Translation with Explicit Ordering,一般 译为“具有显式排序的翻译评估指标”)通过考量同义词、词干和词序等因素,提供了对 生成的回答与参考答案之间相似度更细致的评估。它不仅计算精确率和召回率的调和平均 值(F mean),还结合了一个惩罚机制来处理词序错误和其他不匹配的情况。METEOR 能 够比 BLEU 和 ROUGE 更好地捕捉语义特性。
image.png
其中,F mean 是精确度和召回率的调和平均值,用于综合衡量生成的回答与参考答案 的匹配程度。P penalty 是一个惩罚项,用于惩罚词序错误及其他类型的错误。

对于精确率,生成的回答包含 4 个单词,其中包含 4 个匹配项。因此,精确度为 1。 对于召回率,参考答案包含 5 个单词,其中包含 4 个匹配项。因此,召回率为 0.8。 对于调和平均值,F mean= 2×1×0.8 1+0.8 = 1.6 1.8 ≈ 0.89。 对于惩罚项,由于生成的回答中缺少了“is”这个单词,METEOR 会应用一个惩罚 项 P penalty。这个惩罚项的具体数值取决于具体的实现细节,但在本例中我们可以假定它为 0.1。 最终,METEOR 为 0.801。

image.png

13.3.4 基于语义相似性的指标

image.png

将生成的回答和参考答案转化为向量,使用余弦相似度等方法来计算生成的内容与参考答案之间的语义相似性。

13.3.5 基于忠实度或扎实性的指标

文档精确率和页面精确率:这些指标用于衡量大模型引用的文档和具体页面的准 确性。这要求大模型在生成回答时,必须清晰地标注其信息来源,以减少虚构信息的发生。
幻觉检测 / 一致性检查:这些指标旨在判断大模型生成的回答是否基于提供的上下文信息,或在不同查询中提供的事实信息是否一 致。在评估过程中,将采用二进制评估(0/1),如果生成的回答无法从给定的文档推导出,即便回答本身正确,也视为幻觉。
大模型评分量表:利用更强大的大模型对生成的回答进行评分,例如采用 0 到 5 分的评分标准。具体的评分标准可以根据业务需求进行定制,以便更灵活地适应不同的应用场景。
人工评估:由领域专家手动检查大模型生成的回答是否准确,并验证其是否合理引用了检索到的文档。

13.4 RAG 评估框架/工具

工具使用代码示例:https://github.com/huangjia2019/rag-in-action/tree/master/09-系统评估-Evaluation

13.4.1 RAGAS

🎯 客观指标:使用基于LLM和传统方式的评估指标,精确评估你的LLM应用效果。
🧪 测试数据生成:自动创建覆盖多种场景的全面测试数据集。
🔗 无缝集成:可与LangChain等主流LLM框架及主要可观测性工具无缝协作。
📊 构建反馈闭环:利用生产数据持续优化你的LLM应用。

项目地址:https://github.com/explodinggradients/ragas

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
import os  
from dotenv import load_dotenv
load_dotenv()
import numpy as np
from datasets import Dataset
from ragas.metrics import Faithfulness, AnswerRelevancy
from ragas.llms import LangchainLLMWrapper
from ragas.embeddings import LangchainEmbeddingsWrapper
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_huggingface import HuggingFaceEmbeddings
from ragas import evaluate
from langchain_deepseek import ChatDeepSeek

# 准备评估用的LLM(使用GPT-3.5)
llm_deepseek = ChatDeepSeek(model="Pro/deepseek-ai/DeepSeek-V3", api_key=os.getenv("LLM_API_KEY"), api_base=os.getenv("LLM_BASE_URL"))
llm = LangchainLLMWrapper(llm_deepseek)
# llm = LangchainLLMWrapper(ChatOpenAI(model_name="gpt-3.5-turbo"))


# 准备数据集
data = {
"question": [
"Who is the main character in Black Myth: Wukong?",
"What are the special features of the combat system in Black Myth: Wukong?",
"How is the visual quality of Black Myth: Wukong?",
],
"answer": [
"The main character in Black Myth: Wukong is Sun Wukong, based on the Chinese classic 'Journey to the West' but with a new interpretation. This version of Sun Wukong is more mature and brooding, showing a different personality from the traditional character.",
"Black Myth: Wukong's combat system combines Chinese martial arts with Soulslike game features, including light and heavy attack combinations, technique transformations, and magic systems. Notably, Wukong can transform between different weapon forms during combat, such as his iconic staff and nunchucks, and use various mystical abilities.",
"Black Myth: Wukong is developed using Unreal Engine 5, showcasing stunning visual quality. The game's scene modeling, lighting effects, and character details are all top-tier, particularly in its detailed recreation of traditional Chinese architecture and mythological settings.",
],
"contexts": [
[
"Black Myth: Wukong is an action RPG developed by Game Science, featuring Sun Wukong as the protagonist based on 'Journey to the West' but with innovative interpretations. In the game, Wukong has a more composed personality and carries a special mission.",
"The game is set in a mythological world, telling a new story that presents a different take on the traditional Sun Wukong character."
],
[
"The game's combat system is heavily influenced by Soulslike games while incorporating traditional Chinese martial arts elements. Players can utilize different weapon forms, including the iconic staff and other transforming weapons.",
"During combat, players can unleash various mystical abilities, combined with light and heavy attacks and combo systems, creating a fluid and distinctive combat experience. The game also features a unique transformation system."
],
[
"Black Myth: Wukong demonstrates exceptional visual quality, built with Unreal Engine 5, achieving extremely high graphical fidelity. The game's environments and character models are meticulously crafted.",
"The lighting effects, material rendering, and environmental details all reach AAA-level standards, perfectly capturing the atmosphere of an Eastern mythological world."
]
]
}

dataset = Dataset.from_dict(data)

print("\n=== Ragas评估指标说明 ===")
print("\n1. Faithfulness(忠实度)")
print("- 评估生成的答案是否忠实于上下文内容")
print("- 通过将答案分解为简单陈述,然后验证每个陈述是否可以从上下文中推断得出")
print("- 该指标仅依赖LLM,不需要embedding模型")

# 评估Faithfulness
faithfulness_metric = [Faithfulness(llm=llm)] # 只需要提供生成模型
print("\n正在评估忠实度...")
faithfulness_result = evaluate(dataset, faithfulness_metric)
scores = faithfulness_result['faithfulness']
mean_score = np.mean(scores) if isinstance(scores, (list, np.ndarray)) else scores
print(f"忠实度评分: {mean_score:.4f}")

# print("\n2. AnswerRelevancy(答案相关性)")
# print("- 评估生成的答案与问题的相关程度")
# print("- 使用embedding模型计算语义相似度")
# print("- 我们将比较开源embedding模型和OpenAI的embedding模型")

# 设置两种embedding模型
opensource_embedding = LangchainEmbeddingsWrapper(
HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
)
openai_embedding = LangchainEmbeddingsWrapper(OpenAIEmbeddings(model="text-embedding-ada-002"))

# 创建答案相关性评估指标
opensource_relevancy = [AnswerRelevancy(llm=llm, embeddings=opensource_embedding)]
openai_relevancy = [AnswerRelevancy(llm=llm, embeddings=openai_embedding)]

print("\n正在评估答案相关性...")
print("\n使用开源Embedding模型评估:")
opensource_result = evaluate(dataset, opensource_relevancy)
scores = opensource_result['answer_relevancy']
opensource_mean = np.mean(scores) if isinstance(scores, (list, np.ndarray)) else scores
print(f"相关性评分: {opensource_mean:.4f}")

print("\n使用OpenAI Embedding模型评估:")
openai_result = evaluate(dataset, openai_relevancy)
scores = openai_result['answer_relevancy']
openai_mean = np.mean(scores) if isinstance(scores, (list, np.ndarray)) else scores
print(f"相关性评分: {openai_mean:.4f}")

# 比较两种embedding模型的结果
print("\n=== Embedding模型比较 ===")
diff = openai_mean - opensource_mean
print(f"开源模型评分: {opensource_mean:.4f}")
print(f"OpenAI模型评分: {openai_mean:.4f}")
print(f"差异: {diff:.4f} ({'OpenAI更好' if diff > 0 else '开源模型更好' if diff < 0 else '相当'})")


'''
我做了以下修改:
移除了 ragas.embeddings.base 中的 HuggingfaceEmbeddings 导入
改为导入 LangChain 的 HuggingFaceEmbeddings使用 LangchainEmbeddingsWrapper 来包装 LangChain 的 HuggingFaceEmbeddings这样做的原因是:
LangChain 的 HuggingFaceEmbeddings 是一个完整的实现,包含了所有必要的方法
LangchainEmbeddingsWrapper 会将 LangChain 的嵌入模型适配到 RAGAS 的接口
这个包装器会自动处理同步和异步方法的转换
1. Faithfulness(忠实度)
- 评估生成的答案是否忠实于上下文内容
- 通过将答案分解为简单陈述,然后验证每个陈述是否可以从上下文中推断得出
- 该指标仅依赖LLM,不需要embedding模型

正在评估忠实度...
Evaluating: 100%|███████████████████████████████████████████████████████████████████████████████████████| 3/3 [00:05<00:00, 1.87s/it]
忠实度评分: 0.6071

正在评估答案相关性...

使用开源Embedding模型评估:
Evaluating: 100%|███████████████████████████████████████████████████████████████████████████████████████| 3/3 [00:01<00:00, 1.54it/s]
相关性评分: 0.8565

使用OpenAI Embedding模型评估:
Evaluating: 100%|███████████████████████████████████████████████████████████████████████████████████████| 3/3 [00:06<00:00, 2.11s/it]
相关性评分: 0.9426

=== Embedding模型比较 ===开源模型评分: 0.8565
OpenAI模型评分: 0.9426
差异: 0.0861 (OpenAI更好)


'''

13.4.2 Trulens

使用 TruLens 对你的 LLM 实验进行系统化评估与追踪。在你开发应用的过程中,包括提示词、模型、检索器、知识源等,TruLens 都是你理解其性能表现的关键工具。
TruLens 提供细粒度、与技术栈无关的埋点机制和全面的评估体系,帮助你识别失败模式,并进行系统性迭代,持续优化应用。
深入了解 TruLens 背后的核心概念,包括 反馈函数(Feedback Functions)RAG 三要素(The RAG Triad),以及 诚实、无害、有用评估法(Honest, Harmless and Helpful Evals)

项目地址:https://github.com/truera/trulens

13.4.3 DeepEval

DeepEval 是一个易于使用的开源 LLM 评估框架,专为大语言模型系统的评估与测试而设计。它类似于 Pytest,但专注于对 LLM 输出结果进行单元测试。

DeepEval 融合了最新的研究成果,支持基于多种指标评估 LLM 输出,包括 G-Eval、幻觉检测(Hallucination)、答案相关性(Answer Relevancy)、RAGAS 等。这些指标利用本地运行的 LLM 和各种 NLP 模型进行评估,无需依赖云端服务。

无论你的 LLM 应用是 RAG(检索增强生成)流程、聊天机器人、AI 智能体,还是通过 LangChain 或 LlamaIndex 实现的,DeepEval 都能为你提供支持。借助 DeepEval,你可以轻松确定最优的模型、提示词和架构,以优化 RAG 流程和智能体工作流,防止提示词漂移,甚至自信地从 OpenAI 平滑迁移到自部署的 Deepseek R1。

项目地址:https://github.com/confident-ai/deepeval

13.4.4 Phoenix

Phoenix 是一个开源的 AI 可观测性平台,专为实验、评估和故障排查而设计。它提供以下功能:
• 追踪(Tracing):使用基于 OpenTelemetry 的埋点机制,追踪你的 LLM 应用运行时的行为。
• 评估(Evaluation):借助 LLM 对应用的响应质量和检索效果进行基准评估。
• 数据集(Datasets):创建可版本管理的示例数据集,用于实验、评估和微调。
• 实验(Experiments):跟踪并评估提示词、LLM模型和检索方式的变化效果。
• 沙盒(Playground):优化提示词、对比模型、调整参数,并回放已追踪的 LLM 调用。
• 提示词管理(Prompt Management):通过版本控制、标签和实验机制,系统化地管理和测试提示词的变更。

Phoenix 不依赖特定厂商或编程语言,开箱即用地支持多个主流框架(如 🦙LlamaIndex、🦜⛓LangChain、Haystack、🧩DSPy、🤗smolagents)以及主流 LLM 提供商(如 OpenAI、Bedrock、MistralAI、VertexAI、LiteLLM、Google GenAI 等)。
关于自动化埋点的更多信息,请参考 OpenInference 项目。

项目地址:https://github.com/Arize-ai/phoenix