【aidoczh.com】RAGAS中文教程——使用RAGAs评估RAG应用程序
文章目录
1. RAGAS中文教程地址
2. 什么是RAGAs
RAGAs(Retrieval-Augmented Generation Assessment)是一个框架(GitHub,文档),为您提供必要的要素,帮助您在组件层面评估RAG管道。
到目前为止,我们知道为检索增强生成(RAG)应用程序构建概念验证很容易,但使其达到生产就绪状态非常困难。让RAG管道的性能达到令人满意的状态尤其困难,因为RAG管道中包含不同的组件:
- 检索器组件: 从外部数据库检索额外的上下文,以便大型语言模型(LLM)回答查询。
- 生成器组件: 基于包含检索信息的提示生成答案。
在评估RAG管道时,您必须分别且整体地评估这两个组件,以了解RAG管道是否以及在哪里需要改进。此外,为了理解您的RAG应用程序的性能是否在提升,您必须定量地进行评估。为此,您需要两个要素:一个评估指标和一个评估数据集。
目前,确定正确的评估指标和收集良好的验证数据是一个活跃的研究领域。随着这一主题的快速发展,我们目前正在见证各种RAG评估框架方法的出现,例如RAG指标三合一、ROUGE、ARES、BLEU和RAGAs [1]。以下将重点介绍如何使用RAGAs [1]评估RAG管道。
评估数据
RAGAs的有趣之处在于它最初是作为一个“无参考”评估框架 [1] 开始的。这意味着,不必依赖评估数据集中人工标注的真实标签,RAGAs在底层利用LLM进行评估。
为了评估RAG管道,RAGAs需要以下信息:
question
: 作为RAG管道输入的用户查询。输入。answer
: 从RAG管道生成的答案。输出。contexts
: 用于回答question
的从外部知识源检索的上下文。ground_truths
:question
的真实答案。这是唯一需要人工标注的信息。此信息仅对度量context_recall
是必需的。
利用LLM进行无参考评估是一个活跃的研究课题。虽然尽可能少地使用人工标注数据使其成为一种更便宜和更快速的评估方法,但关于其缺点(如偏差)的讨论仍在进行中 [3]。然而,一些论文已经显示出有希望的结果 [4]。有关详细信息,请参阅RAGAs [1] 论文的“相关工作”部分。
请注意,该框架已扩展为提供需要真实标签的指标和范式(例如,context_recall
和answer_correctness
。
此外,该框架为您提供自动生成测试数据的工具。
评估指标
RAGAs为您提供了一些指标,以对RAG管道进行组件级和端到端评估。
在组件级,RAGAs为您提供了评估检索组件(context_relevancy
和context_recall
)以及生成组件(faithfulness
和answer_relevancy
)的指标 [2]:
- 上下文精度衡量检索上下文的信噪比。此指标使用
question
和contexts
计算。 - 上下文召回率衡量是否检索到回答问题所需的所有相关信息。此指标基于
ground_truth
(这是框架中唯一依赖于人工标注真实标签的指标)和contexts
计算。 - 真实性衡量生成答案的事实准确性。给定上下文中正确陈述的数量除以生成答案中的陈述总数。此指标使用
question
、contexts
和answer
。 - 答案相关性衡量生成的答案与问题的相关性。此指标使用
question
和answer
计算。例如,对于问题“法国在哪里,它的首都是哪里?”答案“法国在西欧。”将获得较低的答案相关性,因为它只回答了一半的问题。
所有指标的范围均为[0, 1],较高的值表示更好的性能。
RAGAs还为您提供了一些指标以对RAG管道进行端到端评估,例如答案语义相似度和答案正确性。本文重点介绍组件级指标。
3. 使用RAGAs评估RAG应用程序
本节使用RAGAs评估一个最小的基础RAG管道,以向您展示如何使用RAGAs并让您了解其评估指标。
前提条件
确保您已安装所需的Python软件包:
- RAG管道的
langchain
、openai
和weaviate-client
- 用于评估RAG管道的
ragas
#!pip install langchain openai weaviate-client ragas
此外,在根目录下的.env文件中定义您的相关环境变量。要获得OpenAI API密钥,您需要一个OpenAI帐户,然后在API密钥下“创建新密钥”。
OPENAI_API_KEY="<YOUR_OPENAI_API_KEY>"
设置RAG应用程序
在评估您的RAG应用程序之前,您需要先设置它。我们将使用一个基础的RAG管道。由于我们将使用以下文章中详细描述的相同设置,因此本节将简短说明。
检索增强生成(RAG):从理论到LangChain实现
从原始学术论文的理论到其与OpenAI、Weaviate和LangChain的Python实现
towardsdatascience.com
首先,您必须通过加载和分块文档来准备数据。
import requests
from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
url = "https://raw.githubusercontent.com/langchain-ai/langchain/master/docs/docs/modules/state_of_the_union.txt"
res = requests.get(url)
with open("state_of_the_union.txt", "w") as f:
f.write(res.text)
# 加载数据
loader = TextLoader('./state_of_the_union.txt')
documents = loader.load()
# 分块数据
text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = text_splitter.split_documents(documents)
接下来,使用OpenAI嵌入模型为每个块生成向量嵌入,并将它们存储在向量数据库中。
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Weaviate
import weaviate
from weaviate.embedded import EmbeddedOptions
from dotenv import load_dotenv,find_dotenv
# 从.env文件加载OpenAI API密钥
load_dotenv(find_dotenv())
# 设置向量数据库
client = weaviate.Client(
embedded_options = EmbeddedOptions()
)
# 填充向量数据库
vectorstore = Weaviate.from_documents(
client = client,
documents = chunks,
embedding = OpenAIEmbeddings(),
by_text = False
)
# 将向量存储定义为检索器以启用语义搜索
retriever = vectorstore.as_retriever()
最后,设置一个提示模板和OpenAI LLM,并将它们与检索器组件组合成一个RAG管道。
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.schema.runnable import RunnablePassthrough
from langchain.schema.output_parser import StrOutputParser
# 定义LLM
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
# 定义提示模板
template = """You are an assistant for question-answering tasks.
Use the following pieces of retrieved context to answer the question.
If you don't know the answer, just say that you don't know.
Use two sentences maximum and keep the answer concise.
Question: {question}
Context: {context}
Answer:
"""
prompt = ChatPromptTemplate.from_template(template)
# 设置RAG管道
rag_chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
准备评估数据
由于RAGAs旨在成为一个无参考评估框架,评估数据集的准备工作是最小化的。您将需要准备question
和ground_truths
对,从中可以通过推理准备其余信息,如下所示:
from datasets import Dataset
questions = ["What did the president say about Justice Breyer?",
"What did the president say about Intel's CEO?",
"What did the president say about gun violence?",
]
ground_truths = [["The president said that Justice Breyer has dedicated his life to serve the country and thanked him for his service."],
["The president said that Pat Gelsinger is ready to increase Intel's investment to $100 billion."],
["The president asked Congress to pass proven measures to reduce gun violence."]]
answers = []
contexts = []
# 推理
for query in questions:
answers.append(rag_chain.invoke(query))
contexts.append([docs.page_content for docs in retriever.get_relevant_documents(query)])
# 转换为字典
data = {
"question": questions,
"answer": answers,
"contexts": contexts,
"ground_truths": ground_truths
}
# 将字典转换为数据集
dataset = Dataset.from_dict(data)
如果您对context_recall
指标不感兴趣,则不需要提供ground_truths
信息。在这种情况下,您只需要准备question
。
4. 评估RAG应用程序
首先,从ragas.metrics
中导入您想使用的所有指标。然后,您可以使用evaluate()
函数,并简单地传入相关指标和准备好的数据集。
from ragas import evaluate
from ragas.metrics import (
faithfulness,
answer_relevancy,
context_recall,
context_precision,
)
result = evaluate(
dataset = dataset,
metrics=[
context_precision,
context_recall,
faithfulness,
answer_relevancy,
],
)
df = result.to_pandas()
下方,您可以看到示例的RAGAs评分结果:
RAGAs评分上下文精度、上下文召回率、真实性和答案相关性。
我们可以做出以下观察:
context_relevancy
(检索上下文的信噪比):虽然LLM认为所有上下文对于最后一个问题都是相关的,但它也认为对第二个问题检索的大部分上下文是不相关的。根据此指标,您可以尝试不同数量的检索上下文以减少噪音。context_recall
(是否检索到回答问题所需的所有相关信息):LLM评估认为检索到的上下文包含回答问题所需的相关信息。faithfulness
(生成答案的事实准确性):虽然LLM判断第一个和最后一个问题回答正确,但错误地陈述总统未提及英特尔CEO的第二个问题答案的真实性被评估为0.5。answer_relevancy
(生成答案与问题的相关性):所有生成的答案都被认为与问题相当相关。
5. 总结
构建概念验证的RAG应用程序很容易,但让其性能达到生产就绪状态很困难。就像一个机器学习项目一样,您应该使用验证数据集和评估指标来评估RAG管道的性能。
然而,由于RAG管道由多个需要分别和组合评估的组件组成,您将需要一组评估指标。此外,从人工标注者那里生成高质量的验证数据集是困难的、耗时的且昂贵的。