RAGAS框架使用指南:从入门到高效评估RAG系统
本文将深入探讨「RAGAS框架安装指南」的核心概念与实战技巧,帮助你快速掌握关键要点。让我们开始吧!
RAGAS框架使用指南:从入门到高效评估RAG系统
引言:破解RAG系统评估难题,RAGAS带来的客观量化价值
想象一下,你刚刚搭建了一个基于检索增强生成(RAG)的智能问答系统,它能从公司知识库中召回文档并生成答案。你兴冲冲地测试了几个问题,感觉“好像还行”,但具体多好?哪里需要改进?你只能凭感觉、靠人工抽样、依赖主观判断。这种“盲人摸象”式的评估,正是RAG系统开发中最棘手、也最容易被忽视的环节。
传统的评估方式,比如让几个人给答案打分,不仅耗时费力,而且标准不一。张三觉得“不错”,李四可能认为“一般”。更致命的是,这种评估无法告诉你,问题是出在检索器没找到相关资料,还是生成器没有准确利用资料?一个检索增强生成系统,本质上是一个复杂的信息处理管道,包括文档解析、索引构建、检索召回、重排序、答案生成等多个环节。
任何一个环节的“木桶短板”,都会直接影响最终用户体验。没有客观的评估指标,你就无法精准定位瓶颈,优化也就无从下手。
这正是RAGAS框架诞生的意义。RAGAS(Retrieval Augmented Generation Assessment)是一个专门为评估检索增强生成系统而设计的开源框架。它提供了一套标准化、自动化、可量化的评估方案,让你能够从多个维度,科学地衡量RAG系统的性能。通过RAGAS,你可以清晰地看到:系统生成的答案是否忠实于检索到的上下文?
答案是否真正回答了用户的问题?检索到的文档是否包含了回答问题的关键信息?这些评估结果不再是模糊的感觉,而是精确的数字,直接指导你进行有针对性的优化。
本文将带你走进RAGAS的世界。从核心原理到评估指标,从安装配置到实战案例,从测试数据生成到优化闭环,我们将一步步拆解这个强大的工具。无论你是刚接触RAG的新手,还是希望提升系统稳定性的老兵,这篇文章都将为你提供一套完整、可落地的RAGAS评估方法论。RAGAS框架安装指南、RAGAS评估指标详解以及RAGAS测试数据生成方法,都将是本文的重点内容。
准备好,让我们一起终结RAG评估的“玄学时代”。
RAGAS框架核心原理与架构
要使用好RAGAS,首先需要理解它评估RAG系统时的核心逻辑。RAGAS并非直接评估模型,而是模拟一个完整的问答流程,并通过对比分析,量化系统各个环节的表现。
核心评估流程:模拟用户交互
RAGAS的评估流程,可以抽象为两个核心阶段:问题解析阶段和答案生成阶段。但这并非评估你的RAG系统,而是利用一组精心构造的测试数据集,去“考验”你的RAG系统。
-
问题解析阶段(Question Analysis):RAGAS框架本身并不解析问题。它要求你提供一个包含“问题(question)”、“标准答案(ground_truth)”、“检索到的上下文(contexts)”以及“系统生成的答案(answer)”的数据集。这四者构成了评估的基础。
-
答案生成阶段(Answer Generation):这是你的RAG系统的主场。你需要先用自己的RAG管道,基于给定的问题去检索知识库,得到上下文(contexts),然后让LLM基于这些上下文生成答案(answer)。RAGAS做的,就是拿到这个“答案”和“上下文”,与“标准答案”和“问题”进行对比,计算出一系列指标。
对比评估思想:衡量“差异”与“覆盖”
RAGAS的评估思想根植于对比。它不关心你的模型参数如何,也不评价你的提示词写得多好,它只关心几个关键的对齐关系:
-
生成的答案 vs. 标准答案:这是最基本的“事实一致性”检验。比如,问题“北京的人口是多少?”,标准答案是“2171万”,你的系统生成了“北京约有2200万人”。RAGAS会判断两者在语义上是否一致,这个指标就是忠实性(Faithfulness) 的另一种表现形式,但它更侧重于答案与事实的对齐。
-
生成的答案 vs. 检索到的上下文:这是衡量“系统是否会撒谎”的关键。理想情况下,答案应该完全基于所提供的上下文生成,而不是依赖LLM自身的“记忆”去编造。RAGAS会检查答案中的每个事实是否都能在“contexts”中找到依据。例如,如果你的系统根据一段关于“公司2024年Q1财报”的文档生成答案,却掺杂了“Q2”的信息,那么忠实性分数就会大幅下降。
-
检索到的上下文 vs. 问题:这是评估检索器质量的黄金标准。一个优秀的检索器应该能召回与问题高度相关的文档片段。RAGAS通过上下文精度(Context Precision) 和上下文召回(Context Recall) 两个指标来衡量。上下文精度关注你召回的文档中,有多少是真正有用的(信噪比)。上下文召回则关注所有相关的文档,你召回了多少(覆盖率)。
与RAG管道组件的关系
理解RAGAS的定位,关键在于认清它与你现有RAG系统的关系。RAGAS是一个评估者,不是你管道的一部分。它扮演着“审计员”的角色,而不是“程序员”。
-
与检索器(Retriever)的关系:RAGAS评估检索器的输出。你使用检索器从向量数据库中获取的
contexts,是RAGAS计算“上下文精度”和“上下文召回”的输入。通过这两个指标,你可以反向判断你的检索策略(如分块大小、检索Top K值、Embedding模型选择)是否有效。 -
与生成器(Generator/LLM)的关系:RAGAS评估生成器的输出。你的LLM基于
contexts生成的answer,是RAGAS计算“忠实性”和“答案相关性”的输入。你可以据此判断LLM是否准确理解了上下文,以及其回答是否直击要害。 -
与整个管道(Pipeline)的关系:最终,RAGAS给出的是对整个端到端系统的综合评估。一个RAG系统表现差,可能是检索器没找到好资料(上下文召回低),也可能是生成器没用好资料(忠实性低),抑或是两者结合的产物(答案相关性低)。RAGAS的指标网络,帮助你将一个模糊的“系统不好”的问题,拆解为清晰的、可定位的“哪个组件拖了后腿”的问题。
提示:RAGAS并非万能。它的评估高度依赖于你提供的测试数据集质量。如果“标准答案”本身就错了,或者“检索到的上下文”质量极差(比如是噪音),那么评估结果将失去意义。因此,投入时间构造高质量的评估数据集,是RAGAS使用中至关重要的一步。
RAGAS评估指标详解:从忠实性到上下文相关性
RAGAS的核心竞争力在于它提供了一套经过学术研究验证的、多样化的评估指标。每个指标都针对RAG管道中的一个特定环节,共同构成一个立体的评估体系。深刻理解这些指标,是读懂RAGAS评估报告、指导系统优化的前提。
忠实性(Faithfulness):答案是否忠于上下文?
忠实性是RAGAS最核心、也最直观的指标。它衡量的是:生成的答案中的每个陈述(claim),是否都能从所提供的上下文(contexts)中得到支持。如果一个答案包含了上下文中没有的信息或与上下文矛盾的信息,其忠实性得分就会很低。
举例说明:
- 问题:“2023年世界人口是多少?”
- 上下文:“根据联合国数据,2022年世界人口约为80亿。预计在2023年11月,世界人口将突破80亿大关。”
- 答案A(真实):“2023年世界人口预计突破80亿。” (完全基于上下文,忠实性高)
- 答案B(幻觉):“2023年世界人口达到82亿。
” (预测数字与上下文不符,忠实性低)
- 答案C(幻觉):“2023年世界人口超过80亿,其中中国人口14亿。” (后一句“中国人口”未在上下文中提及,忠实性低)
计算原理:RAGAS采用“分解-验证”的方式。它会首先将答案分解为多个独立的陈述句。然后,利用一个独立的评测语言模型(如GPT-4),逐个判断这些陈述是否可以被上下文支持。最后,计算被支持的陈述数量占总陈述数量的比例。例如,答案A被分解为1个陈述并得到支持,得分为1.0。答案C被分解为2个陈述,只有1个被支持,得分为0.5。
答案相关性(Answer Relevancy):答案是否回答了问题?
答案相关性关注的是回答的“针对性”。它衡量生成的答案与问题的相关程度。一个高相关性的答案,应该直接、完整地回答用户的问题,而不是答非所问或提供冗余信息。
举例说明:
- 问题:“如何安装RAGAS?”
- 答案A(直接):“你可以使用
pip install ragas命令进行安装。” (高相关性) - 答案B(相关但发散):“安装RAGAS很简单。它是一个评估RAG系统的框架,使用pip命令即可。你也可以尝试使用conda环境。
” (虽然包含关键信息,但引入了“conda环境”等额外话题,相关性略低)
- 答案C(不相关):“RAGAS是一个强大的框架,它可以帮助你优化RAG管道,提升生成质量。” (完全没有回答如何安装,相关性极低)
计算原理:RAGAS会利用评测LLM,基于问题和答案生成一个“倒推问题”。例如,给定答案A,LLM可能生成“如何安装RAGAS?”。然后计算生成的“倒推问题”与原始问题之间的语义相似度。相似度越高,说明答案相关性越高。如果一个答案能准确倒推出原问题,说明它完美地解答了问题。
上下文精度(Context Precision):检索到的文档有多准?
上下文精度衡量的是检索到的上下文列表中,有多少是与问题相关的。它更关注“信噪比”,即你辛苦召回的大堆文档中,到底有多少是真正派上用场的。高精度意味着你的检索非常“精炼”,返回的文档几乎都是有用的。
举例说明:
- 问题:“太阳是什么颜色?”
- 检索到的上下文列表(按relevance排序):
节点1:太阳实际上是白色的,但大气层使其看起来偏黄。(相关)节点2:太阳是一颗黄矮星。(不直接相关,但可接受)节点3:月亮是地球的卫星。
(完全不相关,噪音)
- 评估:在这个列表中,排名第一的节点是相关的。那么,在计算平均精度时,它会考虑所有相关节点的排名。排名越靠前,精度越高。
节点1排第一,很好;节点2排第二,也可;节点3是噪音。相比一个包含大量噪音的列表,这个列表的上下文精度更高。
计算原理:RAGAS会使用评测LLM,依次判断上下文列表中的每个节点是否与问题相关。然后,根据相关节点的排名,计算一个加权得分。核心思想是:你的检索器应该把最相关的文档排在前面。如果所有相关文档都排在后面,那么即使全部召回,上下文精度也会很低。
上下文召回(Context Recall):所有相关的文档你找齐了吗?
上下文召回关注的是“覆盖率”。它衡量的是,对于给定的问题,其标准答案中提到的所有必要信息,是否都能在你的检索到的上下文(contexts)中找到。高召回意味着你几乎找到了所有需要的信息,没有重大疏漏。
举例说明:
-
问题:“北京和上海哪个城市更大?”
-
标准答案:“北京是中国的政治、文化、国际交往和科技创新中心,面积16410平方公里。上海是中国的经济、金融、贸易和航运中心,面积6340平方公里。”
-
检索到的上下文:
节点1:北京是中国的首都,面积16410平方公里。
-
节点2:上海是中国最大的城市,面积6340平方公里。 -
评估:标准答案包含两个核心信息点:A)北京的性质和面积;B)上海的性质和面积。你检索到的两个节点分别覆盖了A和B。因此,上下文召回是100%(2/2)。
-
另一个检索上下文:
节点1:北京面积16410平方公里。
-
节点2:上海是中国的经济中心。 -
评估:节点1覆盖了“北京面积”,但节点2只覆盖了“上海的性质”,缺少“上海的面积”这一关键信息点。因此,上下文回召只有50%(1/2)。
计算原理:RAGAS首先将标准答案分解为一系列独立的“声明”或“信息点”,然后利用评测LLM判断这些信息点是否能够被提供的上下文所支持。最终得分是被支持的信息点数量与总信息点数量的比例。
最佳实践:这四大指标不是孤立的。你应该将它们组合起来解读。例如:高忠实性 + 低上下文召回 = “系统很诚实,但你没给它足够的资料”。低上下文精度 + 高上下文召回 = “你找到了所有资料,但混杂了大量噪音”。这种组合分析能力,是进行精准优化的关键。这也是RAGAS评估指标详解的核心价值所在。
RAGAS框架安装指南与基础使用流程
在深入实战之前,我们先完成最基础的一步:安装RAGAS,并跑通一个最简的评估流程。这将为你后续的使用打下坚实基础。
RAGAS框架安装指南:版本、依赖与注意事项
安装RAGAS非常简单,推荐使用pip进行安装。以下是详细的步骤和注意事项。
-
基本安装:
打开你的终端(Terminal),直接运行以下命令即可:pip install ragas这将安装RAGAS框架及其核心依赖,包括必要的机器学习库和用于评估的接口。
-
安装指定版本(推荐):
为了确保兼容性和稳定性,建议安装特定版本。你可以通过PyPI查询最新版本,或参考RAGAS官方文档。例如,安装0.1.8版本:pip install ragas==0.1.8 -
处理关键依赖项:OpenAI API:
RAGAS默认使用GPT-4或GPT-3.5-turbo作为评测LLM来计算上述指标。因此,你需要确保:- 拥有一个有效的OpenAI API Key。
- 在你的Python环境中配置该Key。通常通过环境变量设置:
import os os.environ["OPENAI_API_KEY"] = "你的OpenAI API Key" - 或者在
.env文件中配置,并使用python-dotenv库加载。
-
常见安装陷阱:
- 版本兼容性:RAGAS的早期版本可能与某些版本的
langchain或datasets存在依赖冲突。建议在一个干净的虚拟环境中安装,或参考官方文档的版本兼容矩阵。 - 依赖缺失:安装过程中如果报错,通常是因为缺少
numpy、pandas等基础库。
- 版本兼容性:RAGAS的早期版本可能与某些版本的
提前安装好这些库可以避免问题:pip install numpy pandas datasets。
- OpenAI配额:RAGAS的评估过程会消耗OpenAI API的tokens,尤其是当你评估大量数据时。务必关注你的API配额,避免超额导致评估中断或产生额外费用。
基础使用流程:数据集、指标与评估函数
安装完成后,我们来演示最核心的评估流程。RAGAS的接口设计非常简洁,只需要三步:准备数据、指定指标、运行评估。
1. 准备评估数据集(Dataset)
RAGAS接收的数据格式必须是一个datasets.Dataset对象。这个Dataset应该包含以下四个列:
-
question: 用户提出的问题列表。 -
answer: 你的RAG系统生成的答案列表。 -
contexts: 你的RAG系统为每个问题检索到的上下文列表,必须是列表的列表。 -
ground_truth: 每个问题的标准答案列表(用于计算上下文召回)。
2. 指定评估指标(Metrics)
从ragas.metrics中导入你想要评估的指标:
faithfulness: 忠实性。answer_relevancy: 答案相关性。context_precision: 上下文精度。context_recall: 上下文召回。
你可以选择全部使用,也可以根据需要选择子集。
3. 运行评估(evaluate)
调用ragas.evaluate()函数,传入数据集和指标列表,即可返回一个包含所有指标得分的Result对象。
完整代码示例与讲解
以下是一个最简的实战代码演示,结合了上述所有步骤。
# 1. 导入必要的库
from datasets import Dataset # Hugging Face Datasets库,用于数据装载
from ragas import evaluate # RAGAS核心评估函数
from ragas.metrics import ( # 导入我们需要的四个核心评估指标
faithfulness, # 忠实性
answer_relevancy, # 答案相关性
context_precision, # 上下文精度
context_recall # 上下文召回
)
import os
# 2. 设置OpenAI API密钥(重要!)
os.environ["OPENAI_API_KEY"] = "你的OpenAI API Key" # 请替换为你的真实密钥
# 3. 准备示例数据:模拟一个RAG系统的输出结果
# 注意:contexts字段必须是列表的列表(list of lists)
data = {
"question": [ # 问题列表
"什么是RAGAS?
",
"如何安装RAGAS?"
],
"answer": [ # RAG系统生成的答案列表
"RAGAS是一个评估RAG系统的框架。",
"使用pip install ragas安装。
"
],
"contexts": [ # 检索到的上下文列表
[ # 针对第一个问题的上下文
"RAGAS是用于评估检索增强生成系统的开源框架。
"
],
[ # 针对第二个问题的上下文
"通过pip install ragas命令安装。"
]
],
"ground_truth": [ # 标准答案列表
"RAGAS是一个用于评估RAG系统的开源框架。
",
"通过pip install ragas可以安装。"
]
}
# 将字典转换为Hugging Face Dataset对象
dataset = Dataset.from_dict(data)
# 4. 指定我们想要计算的评估指标
metrics = [faithfulness, answer_relevancy, context_precision, context_recall]
# 5. 运行评估!
# evaluate函数会自动调用底层的评测LLM(GPT)来计算每个指标
result = evaluate(dataset, metrics=metrics)
# 6. 打印评估结果
# result.to_pandas() 可以将结果转换为Pandas DataFrame,便于查看和分析
print("评估结果:")
print(result.to_pandas())
代码解析:
-
第1-6行:导入所有需要的库。注意,
datasets库用于构建标准化的数据集,这是RAGAS的输入接口。 -
第9行:设置OpenAI API Key。这是RAGAS默认评测LLM的通行证,没有它,评估将无法进行。注意:请务必将此Key保密,不要硬编码到公开的代码仓库中。
-
第12-31行:构造评估数据。这里模拟了两个简单的问答对。关键点是
contexts字段的嵌套结构。即使只有一个上下文,也必须用一个列表包起来,例如["上下文内容"],而不是"上下文内容"。 -
第34行:从
ragas.metrics中导入所有四个核心指标。 -
第37行:调用
evaluate()函数,传入我们的数据和指标列表。这个函数是RAGAS的入口和核心。 -
第41行:输出结果。
to_pandas()会将结果转换成类似表格的形式,每行对应一个样本,每列对应一个指标,非常直观。
运行结果示例:
评估结果:
faithfulness answer_relevancy context_precision context_recall
0 1.000000 1.000000 1.0 1.0
1 1.000000 1.000000 1.0 1.0
这表示,在我们模拟的完美情况下(答案和上下文高度匹配),所有指标都拿到了满分1.0。
注意:实际运行中,由于LLM的随机性和评估成本,你可能只会测试少量样本。在真实项目中,建议收集至少50-100个样本点进行评估,以获得统计学上更有意义的结果。
实战案例:使用RAGAS评估一个基于LangChain的RAG系统
理论讲完,代码也跑通了。现在,我们将RAGAS应用于一个真实的场景:评估一个基于LangChain构建的文档问答机器人。这个案例将展示RAGAS与LangChain的无缝集成,以及如何组织评估数据。
案例背景:文档问答机器人
假设我们有一个包含公司内部知识(如员工手册、产品FAQ等)的PDF文档。我们使用LangChain构建了一个RAG问答机器人。它的工作流程是:
- 用户提问。
- 系统检索与该问题最相关的文档片段(contexts)。
- 系统基于这些上下文生成答案。
我们的目标是使用RAGAS,客观地评估这个机器人回答一组预设问题的质量。
关键步骤:从LangChain管道中提取评估数据
RAGAS评估的数据来源,正是你的LangChain RAG管道。你需要从中“抓取”三个核心信息:contexts和answer。再加上你手动准备的questions和ground_truths。
如何从LangChain的RetrievalQA链中提取数据?
关键点在于,不要只使用RetrievalQA链的完整封装(chain.invoke(question)),而是需要获取中间过程。最常用的方法是:
- 使用
RetrievalQAWithSourcesChain:这个变体链除了返回answer,还会返回source_documents,其中包含了检索到的文档块。 - 使用回调(Callbacks)或自定义链:对于更精细的控制,你可以自定义一个链,在调用检索器和生成器后,显式存储中间结果。
数据格式转换:
- 从LangChain的
source_documents列表中,提取每个Document的page_content(文本内容),组合成一个contexts列表。 - 获取最终的
answer字符串。 - 注意,
contexts必须是列表的列表,以匹配RAGAS的输入格式。
完整实战代码与逐行讲解
from datasets import Dataset
from ragas import evaluate
from ragas.metrics import faithfulness, answer_relevancy, context_precision, context_recall
import os
# 假设这是你的LangChain RAG管道(示例)
# 伪代码,实际应用中需要根据你的文档构建
def my_langchain_rag_chain(question: str):
"""
模拟一个LangChain RAG管道。
接收一个问题,返回生成的答案和检索到的上下文。
"""
# 1. 检索文档(假设我们已经有一个vectorstore和retriever)
# retriever = vectorstore.as_retriever(search_kwargs={"k": 2})
# docs = retriever.get_relevant_documents(question)
# 模拟检索结果
docs_text = [
"RAGAS是用于评估检索增强生成系统的开源框架。
",
"通过pip install ragas命令可以安装RAGAS。"
]
# 2. 生成答案(假设我们有一个LLM链)
# llm_chain = prompt | llm
# answer = llm_chain.invoke({"context": docs_text, "question": question})
# 模拟生成结果
answer = "RAGAS是一个评估RAG系统的框架,可以通过pip install ragas安装。
"
return answer, docs_text # 返回答案和上下文字符串列表
# 主评估流程
def main():
# 1. 设置OpenAI API Key
os.environ["OPENAI_API_KEY"] = "你的OpenAI API Key"
# 2. 准备测试问题和标准答案(手动构建)
test_questions = [
"什么是RAGAS?
",
"如何安装RAGAS?"
]
ground_truths = [
"RAGAS是一个用于评估RAG系统的开源框架。",
"通过pip install ragas可以安装。"
]
# 3. 调用你的LangChain RAG管道,收集评估所需的全部数据
answers = [] # 存储生成答案的列表
contexts_list = [] # 存储上下文列表的列表(重要!)
for question in test_questions:
# 调用你的LangChain链,获取答案和文档
answer, docs = my_langchain_rag_chain(question)
# 将其添加到我们的数据集中
answers.append(answer) # 添加答案
contexts_list.append(docs) # 添加上下文列表(注意这里docs本身就是一个列表)
# 4. 构建RAGAS所需的Dataset
data = {
"question": test_questions,
"answer": answers,
"contexts": contexts_list, # 已经是列表的列表
"ground_truth": ground_truths
}
dataset = Dataset.from_dict(data)
# 5. 指定评估指标
metrics = [faithfulness, answer_relevancy, context_precision, context_recall]
# 6. 运行评估
result = evaluate(dataset, metrics=metrics)
# 7. 打印结果
print("RAG系统评估结果:")
# 计算平均分,更宏观地看系统表现
scores_df = result.to_pandas()
print(scores_df)
print("平均得分:")
print(scores_df.mean()) # 打印四个指标的平均值
if __name__ == "__main__":
main()
代码深度解析:
- 自定义RAG管道函数 (
my_langchain_rag_chain):- 这是一个占位符,你需要替换为你实际的LangChain代码。
- 关键要求:这个函数必须返回两个东西:一个是生成的
answer(字符串),另一个是检索到的contexts(字符串列表)。
这是连接LangChain和RAGAS的桥梁。
-
docs_text = ["...", "..."]:注意这里是列表,直接代表一个样本的所有上下文。它完美匹配了RAGAScontexts字段中一个元素的需求。 -
主函数 (
main):- 第41-45行:准备测试问题和标准答案。这些是评估的“基准”,必须由人工精心准备,确保准确无误。
- 第48-55行:这是核心数据收集环节。我们循环遍历每个测试问题,调用LangChain管道,将返回的
answer和docs分别存入answers和contexts_list列表。
-
第58-62行:构建
Dataset。注意contexts_list已经是[[doc1, doc2], [doc3, doc4]]这种格式,完美契合要求。- 第74行:
scores_df.mean()。这行代码非常重要,它计算了所有样本在各个指标上的平均分,让你从整体上把握系统性能,而不是盯着个别样本的得分。
- 第74行:
提示:在实际项目中,你通常不会直接手动输入
ground_truth。一个经典方法是:先让人类标注员为每个问题撰写一个“理想答案”,然后与系统生成的答案进行对比。或者,你也可以让一个更强大的LLM(如GPT-4)来生成标准答案,但人工审核是必不可少的环节。
RAGAS测试数据自动生成方法:从零构建多样化数据集
手动编写测试问答题库(questions和ground_truths)是评估中最耗时的工作之一。RAGAS提供了强大的测试数据生成方法,可以基于你的文档库,自动生成高质量、多样化的问答对。这不仅能节省大量时间,还能确保测试数据的覆盖面和客观性。
为什么需要自动生成测试数据?
-
覆盖率高:手动编写只能覆盖你想到的场景,而自动生成可以系统性地覆盖文档库的各个角落,包括一些你不熟悉的边缘情况。
-
多样化:RAGAS可以生成不同难度和类型的问题,例如:
- 简单问题:直接从文档中找到答案。
- 推理问题:需要基于文档中的多个信息点进行逻辑推理。
-
多跳问题:需要跨越不同文档或章节来寻找答案,考察系统的综合能力。
-
去偏见:人工编写的问题容易受主观认知影响,自动生成更能模拟真实用户的随机提问。
-
可重复性:你可以随时基于同样的文档库,以不同的种子值重新生成测试数据,确保评估的稳定性和可复现性。
RAGAS核心功能:TestsetGenerator
RAGAS提供了TestsetGenerator或SyntheticTestDataset等工具(不同版本可能API有细微差异,但核心思想一致)。它的基本逻辑是:
- 输入:你的文档库。通常是LangChain的
Document对象列表。 - 过程:利用一个强大的LLM(通常是GPT-4),对每个文档或文档片段进行分析,并根据设定的规则生成问题。
- 输出:一个包含了
question,contexts,ground_truth等字段的Dataset。
这个数据集可以直接用于RAGAS的evaluate()函数。
实战代码:自动生成多样化的测试数据集
以下代码演示了如何使用RAGAS的TestsetGenerator(假设RAGAS版本为0.1.x或类似版本。请注意,最新版本的API可能已更新,请参考官方文档)。
from ragas.testset.generator import TestsetGenerator # 导入测试集生成器
from ragas.testset.evolutions import simple, reasoning, multi_context # 导入问题类型
from langchain.document_loaders import TextLoader # 用于加载文档
from langchain.text_splitter import RecursiveCharacterTextSplitter # 用于分割文档
import os
# 1. 设置OpenAI API Key(生成测试数据也需要使用LLM)
os.environ["OPENAI_API_KEY"] = "你的OpenAI API Key"
# 2. 加载和准备你的文档库
# 示例:加载一个文本文件
loader = TextLoader("your_knowledge_base.txt") # 替换为你的文档路径
documents = loader.load()
# 3. 分割文档(文档通常很大,需要分割成小的块)
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500, # 每个块的大小(字符数)
chunk_overlap=50, # 块与块之间的重叠,保证上下文连贯
separators=["\n\n", "\n", " ", ""] # 分割符
)
chunked_documents = text_splitter.split_documents(documents)
# 4. 初始化TestsetGenerator
# 注意:需要传入一个LLM(用于生成)和一个嵌入模型(用于评估相似度等)
# 这里我们直接使用RAGAS内部的默认配置,它会自动使用OpenAI的模型
generator = TestsetGenerator(
llm="gpt-3.5-turbo", # 生成问题使用的LLM,通常GPT-3.5即可
embedding_model="text-embedding-ada-002" # 用于评估上下文的模型
)
# 5. 生成测试数据集!
# 关键参数:
# - source_documents: 文档列表
# - test_size: 生成的问题数量
# - distributions: 不同问题类型的比例。这里我们设定简单问题占40%,推理问题占40%,多跳问题占20%
testset = generator.generate_with_langchain_docs(
source_documents=chunked_documents,
test_size=50, # 生成50个问答对
distributions={
simple: 0.4,
reasoning: 0.4,
multi_context: 0.2
}
)
# 6. 检查生成的数据集
print(f"共生成了 {len(testset)} 个问题。")
# testset本身是一个Dataset对象,可以直接使用
# 例如,查看第一个样本
first_sample = testset[0]
print(f"问题: {first_sample['question']}")
print(f"标准答案: {first_sample['ground_truth']}")
print(f"相关上下文: {first_sample['contexts']}")
# 7. 清洗和验证(重要!)
# 自动生成的数据并非完美,建议进行人工抽检,修正错别字、逻辑矛盾或明显错误。
# 你可以将testset导出为CSV文件,方便人工编辑
testset.to_csv("generated_test_data.csv", index=False)
# 8. 用于评估你的RAG系统
# 现在,你可以将这个testset直接用于评估了!
# from ragas import evaluate
# result = evaluate(your_rag_dataset, metrics=[...])
代码详解与关键参数说明:
-
TestsetGenerator:这是生成测试数据的核心类。它内部会使用两个模型:一个用于生成问题的LLM(generator_llm),一个用于评估文档与问题相关性的嵌入模型(critic_llm)。通常,generator_llm使用GPT-3.5-turbo即可,critic_llm使用更强的模型(如GPT-4)效果更好。 -
generate_with_langchain_docs方法:这是专为LangChain用户设计的便捷方法,可以直接传入分割后的文档列表。如果你有其他来源的文档,也可以使用generate方法。 -
distributions参数:这是控制问题多样性的关键。通过调整simple,reasoning,multi_context的比例,你可以生成符合业务需求的测试集。
例如,如果系统主要用于回答事实性问题,可以调高simple的比例;如果要测试其推理能力,就增加reasoning的比例。
test_size参数:生成问题的数量。建议至少生成50个,以保证评估结果的
关于作者
devcfg 以已知,溯本源,探未知
同系列文章收录于本人 CSDN 专栏。
更多推荐
所有评论(0)