欢迎来到啾啾的博客🐱。
记录学习点滴。分享工作思考和实用技巧,偶尔也分享一些杂谈💬。
有很多很多不足的地方,欢迎评论交流,感谢您的阅读和评论😄。
目录

引言
本篇简单介绍一下RAG评估与RAG评估框架Ragas。
1 RAG评估
RAG类型、优化方向有很多。比如提升检索相关性、提高生成质量、提高效率与可靠性。
这些优化都离不开评估。
1.1 评估指标
不管是人工、程序、还是大模型,我们的评估结果都需要落在指标上。
有一些通用的指标如下:
-
Faithfulness (忠实度):
衡量生成的答案在多大程度上是完全基于所提供的上下文的。一个高忠实度的答案不会捏造上下文中不存在的信息,这是评估“幻觉”的关键指标。 -
Answer Relevancy (答案相关性)
衡量生成的答案与原始用户问题的相关程度。一个答案可能忠实于上下文,但如果它没有回答用户的问题,相关性就很低。 -
Context Precision (上下文精确度)
衡量在检索到的上下文中,有多少比例是真正与回答问题相关的。高精确度意味着提供给LLM的“信噪比”高。 -
Context Recall (上下文召回率)
衡量所有相关的文档中,有多少比例被成功检索出来了。高召回率意味着系统没有漏掉重要的信息。
相关资料:Ragas可用指标列表
1.2 数据准备
为此,我们需要准备一下数据,比如项目有针对个人知识库进行检索,我们就需要:
- 准备 50-100 条个人笔记,涵盖不同主题和时间。
- 设计查询:简单(“复习线性代数”)、复杂(“总结过去一个月的技术学习”)。
然后构建测试样本数据,比如Ragas给出的样本数据:
test_data = {
"user_input": "summarise given text\nThe company reported an 8% rise in Q3 2024, driven by strong performance in the Asian market. Sales in this region have significantly contributed to the overall growth. Analysts attribute this success to strategic marketing and product localization. The positive trend in the Asian market is expected to continue into the next quarter.",
"response": "The company experienced an 8% increase in Q3 2024, largely due to effective marketing strategies and product adaptation, with expectations of continued growth in the coming quarter.",
"reference": "The company reported an 8% growth in Q3 2024, primarily driven by strong sales in the Asian market, attributed to strategic marketing and localized products, with continued growth anticipated in the next quarter."
}
包含 user_input(用户输入)、response(来自LLM的输出)和 reference(来自LLM的预期输出)作为数据点来评估摘要。
或者至少包含 question(问题)和 ground_truth(标准答案)。
2 Ragas基础概念
Ragas (Retrieval-Augmented Generation Assessment) 是一个专门用于评估和度量RAG(检索增强生成)管道性能的开源框架。
我们可以使用 Ragas 计算 Context Recall 和 Faithfulness等指标并实现自动化评估。
2.1 核心思想:LLM as a judge
传统基于数据的评估存在两个问题,即:
- 耗时的准备: 评估应用需要为每个输入准备预期的输出(
reference),这既耗时又具有挑战性。 - 评分不准确: 即使
response和reference相似,输出得分也很低。这是BleuScore等非LLM度量的已知局限性。
Ragas的核心思想是 “无参考评估”(Reference-Free Evaluation),即在很多关键指标上,它不需要你提供一个人工撰写的“标准答案”。它利用大语言模型(LLM)本身作为裁判(LLM-as-a-judge),从不同维度来自动化、可量化地评估RAG系统的表现。
也就是文档中提到的基于LLM的度量进行评估。
当然,这并不意味着不需要标准答案、不需要准备数据,Ragas提供有测试数据生成的功能,能自动创建涵盖广泛场景的全面测试数据集。
用于评估的LLM本身也有其偏好和盲点。可以考虑使用多个不同的LLM进行交叉评估,或者定期用少量人工评估来校准你的自动化评估结果。
2.2 评估维度
Ragas将RAG系统的复杂性拆解为两个核心部分并分别进行评估:
- 生成器(Generator)部分:评估最终生成的答案质量。
- 检索器(Retriever)部分:评估检索到的上下文(Context)质量。
2.3 核心功能
🎯 客观指标:使用基于 LLM 的传统指标,精确评估您的 LLM 应用。
🧪 测试数据生成:自动创建涵盖广泛场景的全面测试数据集。
🔗 无缝集成:与 LangChain 等流行 LLM 框架以及主要的可观测性工具完美兼容。
📊 构建反馈循环:利用生产数据持续改进您的 LLM 应用。
2.4 查询与数据集生成
查询分为单跳查询、多跳查询、抽象查询、具体查询。Ragas使用基于知识图谱的方法进行测试集生成。
![![[RAG评估-1.png]]](https://i-blog.csdnimg.cn/direct/1aee3c1a5b814adead2b475a4f1d9d24.png)
3 Ragas使用
我们需要将Ragas整合到MLOps流程中,形成一个持续评估和改进的闭环。
即准备一个高质量数据集合、一套标准稳定的流程、持续的迭代监控。
3.1 安装
pip install Ragas
3.2 评估流程
1.在黄金数据集上运行新的RAG系统,并收集所有必要的输出。对于数据集中的每一个问题,需要记录:
- question: 原始问题
- answer: RAG系统生成的答案
- contexts: 检索器返回的上下文文档列表(List of strings)
- ground_truth: 数据集中的标准答案
2.编写一个Python脚本来调用Ragas进行评估。
-
建立基线:首次运行时,你会得到一个“基线”分数。例如:Faithfulness: 0.92, Context Recall: 0.88。
-
设定门禁:在CI/CD流水线中设置一个“质量门禁”。例如,规定任何变更都不能让Faithfulness低于0.9或Context Recall低于0.85。如果评估分数低于这个阈值,流水线就失败,变更就不会被部署到生产环境。
-
诊断问题:
- Context Recall / Context Precision 分数低? -> 检查检索器。可能是Chunking策略不佳、Embedding模型不匹配、或者检索的top-k值不合适。
- Faithfulness / Answer Relevancy 分数低? -> 检查生成器。可能是Prompt设计得不好,或者需要对LLM进行微调(Finetuning)。
一般是这样的。但是在Ragas最新版中,其核心功能是使用评估指标(Metrics) 对一个已有的数据集进行评估。
因为围绕着一系列的Metric来工作,所以,数据集也有对应要求。
3.3 准备评估数据集
这是所有评估工作的基础。我们需要创建一个高质量、有代表性的“黄金评估数据集”。
- 收集来源:
- 从真实的用户查询日志中抽样。
- 业务专家根据业务场景编写典型问题。
- 对于没有标准答案的问题,可以利用Ragas的Testset Generation功能,基于你的文档自动生成问题-答案-上下文对,再由人工进行筛选和修正。
- 数据集格式,一般来说至少包含:
question (str): 用户提出的问题。answer (str): 您的 RAG 系统针对该问题生成的答案。contexts (list[str]): 您的 RAG 系统在生成答案时,从知识库中检索出的所有上下文片段。ground_truth (str):(可选) 该问题的标准参考答案或理想答案。某些高级指标(如 answer_correctness)会使用它来进行更严格的评估。
这一段的资料Domain Specific Evaluation。
这个格式并不绝对,是以 Hugging Face Datasets 的格式存在的,也可以从一个简单的 Python 字典或 Pandas DataFrame 开始。
在Ragas中,数据集是数据样本的同质集合。使用 EvaluationDataset类表示。该类提供了一种结构化的方式来组织和管理用于评估目的的数据样本。
在这一步需要注意的是Ragas将问题划分为以下类型:
- 简单问题(Simple): 这类问题通常可以直接从单个知识源或上下文段落中找到答案,主要用于评估 RAG 系统最基础的检索和生成能力。
- 推理问题(Reasoning): 这类问题需要 RAG 系统结合上下文中的多个信息点,通过逻辑推理才能得出答案。这考验了模型更深层次的理解和信息整合能力。
- 条件问题(Conditioning): 这类问题在提问中加入了特定的限制条件,RAG 系统需要准确理解并满足这些条件才能给出正确答案。
- 多上下文问题(Multi-Context): 回答这类问题需要从多个不同的文档或知识源中检索和整合信息。这对于评估系统处理复杂查询、进行跨文档信息综合的能力至关重要。
越是复杂的需求数据集的格式也越复杂。
但好消息是我们可以一步步来,先侧重简单问题、确保基本的检索和生成功能正常工作。
然后逐步增加推理问题和条件问题的比例,一步步校验和优化系统在处理复杂逻辑和约束条件下的表现。
3.4 持续监控
当我们的RAG流程有重大改进时,进行A/B测试。并且在应用运行维护期间、定期评估,检查是否随时间的退役而下降。
如果隐私和安全策略允许,可以定期从生产环境中抽取一小部分匿名的用户查询及其RAG系统的输出来进行评估。这能让你了解系统在真实、未知问题上的表现。
3.5 Ragas最新版demo
Ragas 0.3.2版本的最新demo
import asyncio
from ragas import evaluate
from datasets import load_dataset
from ragas import EvaluationDataset
from ragas.embeddings import LangchainEmbeddingsWrapper
from ragas.llms import LangchainLLMWrapper
from ragas import SingleTurnSample
from ragas.metrics import AspectCritic
from app.config.embedding_model import EmbeddingModelComponent
from app.config.small_model import KeywordModelComponent
evaluator_llm = LangchainLLMWrapper(KeywordModelComponent.get_default() )
evaluator_embeddings = LangchainEmbeddingsWrapper(EmbeddingModelComponent.get_default())
test_data = {
"user_input": "summarise given text\nThe company reported an 8% rise in Q3 2024, driven by strong performance in the Asian market. Sales in this region have significantly contributed to the overall growth. Analysts attribute this success to strategic marketing and product localization. The positive trend in the Asian market is expected to continue into the next quarter.",
"response": "The company experienced an 8% increase in Q3 2024, largely due to effective marketing strategies and product adaptation, with expectations of continued growth in the coming quarter.",
}
test_sample = SingleTurnSample(**test_data)
metric = AspectCritic(name="summary_accuracy",llm=evaluator_llm, definition="Verify if the summary is accurate.")
test_data = SingleTurnSample(**test_data)
result = asyncio.run(metric.single_turn_ascore(test_sample))
print(result)
# 数据集评估
eval_dataset = load_dataset("explodinggradients/earning_report_summary",split="train")
eval_dataset = EvaluationDataset.from_hf_dataset(eval_dataset)
print("Features in dataset:", eval_dataset.features())
print("Total samples in dataset:", len(eval_dataset))
results = evaluate(eval_dataset, metrics=[metric])
print(results)
print(results.to_pandas())
RAG评估与Ragas实践指南
5942

被折叠的 条评论
为什么被折叠?



