本文将深入探讨RAGAS评估框架,并结合LlamaIndex展示如何实现自动化评估流程。
1. 为啥需要评估RAG系统
RAG系统能够基于大规模知识库生成准确、相关的回答。然而,这种复杂的系统也面临着诸多难题:
- 信息检索准确性:系统是否能够从海量数据中精准定位相关信息?
- 答案生成质量:生成的回答是否准确、连贯且符合语境?
- 幻觉问题:模型是否会生成看似合理但实际上并不基于检索内容的虚假信息?
- 效率和可扩展性:系统能否在合理的时间和资源限制内处理大量查询?
我们需要一个全面、客观的评估框架来衡量RAG系统的性能。这就是RAGAS框架诞生的背景。
2. RAGAS评估框架
RAGAS框架通过分析RAG系统的三个核心组件——查询(Query)、检索上下文(Context)和生成答案(Answer) 之间的关系,提供了一套全面的评估指标。
2.1 忠实度 (Faithfulness)
2.1.1 定义
忠实度衡量生成的答案对检索到的上下文的忠实程度。高忠实度意味着答案中的信息严格来源于检索到的上下文,而不是模型的"幻觉"。
2.1.2 计算方法
- 使用语言模型(LLM)从答案中提取一组陈述。
- 提示词为:
给定一个问题和答案,从给定答案的每个句子中创建一个或多个陈述。
问题:[问题]
答案:[答案]
2. 对每个陈述 ,判断其是否可以从检索到的上下文中推断出来。
- 提示词为:
考虑给定的上下文和以下陈述,然后确定它们是否由上下文中的信息支持。在得出结论(是/否)之前,为每个陈述提供简要解释。在最后以给定格式为每个陈述提供最终结论。不要偏离指定的格式。
陈述:[陈述 1]
...
陈述:[陈述 n]
5. 忠实度,其中是可以从上下文推断出的陈述数,是总陈述数。
示例: 假设答案中包含5个陈述,其中4个可以从上下文中直接推断,则忠实度为4/5 = 0.8。
2.1.3 实际意义
- 高忠实度(接近1)表明系统能够准确利用检索到的信息,减少虚假信息的生成。
- 低忠实度可能意味着系统过度依赖语言模型的先验知识,容易产生未经验证的信息。
2.2 答案相关性 (Answer Relevance)
2.2.1 定义
答案相关性评估生成的答案与原始查询的相关程度。高相关性意味着答案直接且准确地回应了用户的问题。
2.2.2 计算方法
- 根据生成的答案,使用LLM生成个潜在问题。
为给定答案生成一个问题。
答案:[答案]
- 计算这些潜在问题与原始问题的嵌入向量相似度。
示例: 假设根据答案生成了3个潜在问题,它们与原问题的相似度分别为0.8, 0.7, 0.9,则答案相关性为(0.8 + 0.7 + 0.9) / 3 ≈ 0.8。
2.2.3 实际意义
- 高答案相关性表明系统能够准确理解并回应用户查询。
- 低相关性可能意味着系统偏离了原始问题,需要改进查询理解或答案生成过程。
2.3 上下文相关性 (Context Relevance)
2.3.1 定义
上下文相关性衡量检索出来的信息有多么贴合你的问题。高上下文相关性意味着检索系统能够准确定位与查询相关的信息。
2.3.2 计算方法
- 使用LLM从上下文中提取与查询相关的关键句子。
请从提供的上下文中提取可能有助于回答以下问题的相关句子。
如果没有找到相关句子,或者你认为问题无法从给定上下文中得到回答,
则返回短语“信息不足”。
在提取候选句子时,你不得更改给定上下文中的句子。
- ,其中$|c(q)|是上下文中的总句子数。
2.3.3实际意义
- 高上下文相关性表明检索系统能够有效过滤无关信息,提供高质量的上下文。
- 低相关性可能意味着检索算法需要优化,或知识库需要更新或扩充。
2.4 上下文召回率 (Context Recall)
2.4.1 定义
上下文召回率评估检索到的上下文是否包含回答问题所需的全部信息。这个指标需要预先标注的"黄金标准"答案。
2.4.2 计算方法
CR = |可归因于上下文的Ground truth句子| / |Ground truth句子总数|
示例: 如果标准答案包含5个关键点,而检索的上下文只覆盖了其中3个,则上下文召回率为3/5 = 0.6。
2.4.3 实际意义
- 高召回率表明系统能够检索到回答问题所需的大部分相关信息。
- 低召回率可能意味着知识库不完整,或检索算法无法有效定位所有相关信息。
2.5 上下文精确度 (Context Precision)
2.5.1 定义
上下文精确度衡量检索到的相关上下文在结果中的排序质量。高精确度意味着最相关的信息被优先呈现。
2.5.2 计算方法:
CP@k = Σ precision@k / k中相关项目总数 其中,Precision@k = true positives@k / (true positives@k + false positives@k)
示例: 假设检索前5个结果中,第1、3、5个是相关的,则: Precision@1 = 1/1 = 1 Precision@2 = 1/2 = 0.5 Precision@3 = 2/3 ≈ 0.67 Precision@4 = 2/4 = 0.5 Precision@5 = 3/5 = 0.6 CP@5 = (1 + 0.5 + 0.67 + 0.5 + 0.6) / 3 ≈ 1.09
2.5.3 实际意义
- 高上下文精确度表明系统能够有效排序检索结果,将最相关的信息放在前面。
- 低精确度可能需要改进排序算法或调整相关性评分机制。
3. RAGAS + LlamaIndex自动化评估实现
现在,让我们深入探讨如何使用RAGAS框架和LlamaIndex实现RAG系统的自动化评估。以下是详细的代码实现和解释:
import os
from llama_index import VectorStoreIndex, SimpleDirectoryReader
from ragas.metrics import (
faithfulness, answer_relevancy, context_relevancy,
context_recall, context_precision
)
from ragas.llama_index import evaluate
# 环境配置
os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_KEY"
dir_path = "YOUR_DIR_PATH"
# 步骤1: 构建RAG查询引擎
documents = SimpleDirectoryReader(dir_path).load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine()
# 步骤2: 准备评估数据集
eval_questions = [
"Can you provide a concise description of the TinyLlama model?",
"What speed optimizations has TinyLlama implemented?",
"Why does TinyLlama use Grouped-query Attention?",
"Is the TinyLlama model open source?",
"Describe the starcoderdata dataset."
]
eval_answers = [
"TinyLlama is a compact 1.1B language model pretrained on approximately 1 trillion tokens for about 3 epochs. It builds upon the Llama 2 architecture and tokenizer, incorporating various advancements from the open-source community (e.g., FlashAttention) to achieve superior computational efficiency. Despite its relatively small size, TinyLlama demonstrates impressive performance across a range of downstream tasks, significantly outperforming existing open-source language models of comparable scale.",
"TinyLlama has implemented several speed optimizations during training. These include the integration of FSDP for efficient multi-GPU and multi-node setups, the use of Flash Attention as an optimized attention mechanism, and the replacement of the fused SwiGLU module from xFormers with the original SwiGLU module. These enhancements have reduced the memory footprint, allowing the 1.1B model to fit within 40GB of GPU RAM.",
"TinyLlama employs grouped-query attention to reduce memory bandwidth overhead and accelerate inference. The model uses 32 heads for query attention and 4 groups of key-value heads. This technique allows the model to share key and value representations across multiple heads without significantly compromising performance.",
"Yes, TinyLlama is open-source.",
"The starcoderdata dataset was compiled for training StarCoder, a powerful open-source large code language model. It encompasses approximately 250 billion tokens across 86 programming languages. Beyond code, it also includes GitHub issues and text-code pairs involving natural languages."
]
eval_answers = [[a] for a in eval_answers]
# 步骤3: 选择评估指标
metrics = [
faithfulness, answer_relevancy, context_relevancy,
context_precision, context_recall
]
# 步骤4: 执行评估
result = evaluate(query_engine, metrics, eval_questions, eval_answers)
# 步骤5: 导出评估结果
result.to_pandas().to_csv('evaluation_results.csv', sep=',')
代码解析:
- 环境配置:设置OpenAI API密钥和文档目录路径。
- 构建RAG查询引擎:使用LlamaIndex加载文档,创建向量索引和查询引擎。
- 准备评估数据集:定义测试问题和对应的标准答案。
- 选择评估指标:使用RAGAS提供的五个核心指标。
- 执行评估:调用RAGAS的evaluate函数,传入查询引擎、评估指标、问题和答案。
- 导出结果:将评估结果转换为pandas DataFrame并保存为CSV文件。
4. 样例评估结果分析
假设我们得到了如下的评估结果:
Question | Faithfulness | Answer Relevancy | Context Relevancy | Context Precision | Context Recall |
---|---|---|---|---|---|
Q1 | 0.95 | 0.89 | 0.75 | 0.80 | 0.85 |
Q2 | 0.88 | 0.92 | 0.70 | 0.00 | 0.00 |
Q3 | 0.93 | 0.87 | 0.65 | 0.00 | 0.75 |
Q4 | 1.00 | 0.95 | 0.90 | 0.95 | 1.00 |
Q5 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 |
结果分析:
-
问题1:整体表现良好,各项指标均衡且较高。这表明系统能够准确理解问题,检索相关信息,并生成忠实且相关的答案。
-
问题2:尽管忠实度和答案相关性较高,但上下文精确度和召回率为0。这可能意味着系统生成了相关答案,但未能正确检索或排序相关上下文。可能需要改进检索算法或扩充知识库。
-
问题3:情况类似于问题2,但有一定的上下文召回率。这表明系统检索到了部分相关信息,但排序效果不佳。可以考虑优化检索结果的排序算法。
-
问题4:所有指标都接近或等于1,表现出色。这可能是因为问题简单直接,且信息容易检索和验证。
-
问题5:所有指标为0,表明系统完全失败。可能的原因包括:
- 知识库中缺少相关信息
- 查询理解出现问题
- 检索或生成模块出现严重错误
总结
RAGAS框架为RAG系统评估提供了全面的指标和便捷的调用方式。在实际应用中,构建RAG流程后应进行充分的准确性测试,以确保系统性能满足部署要求。