检索增强生成的风格化性能仪表板
到目前为止,我们知道为检索增强生成 (RAG) 应用程序构建概念验证很容易,但使其投入生产却非常困难。让 RAG 管道的性能达到令人满意的状态尤其困难,因为 RAG 管道中有不同的组件:
- 检索器组件:从外部数据库检索额外上下文,以便 LLM 回答查询。
- 生成器组件:根据检索到的信息增强的提示生成答案。
在评估 RAG 管道时,您必须分别和同时评估这两个组件,以了解 RAG 管道是否以及在哪些方面仍需要改进。此外,要了解您的 RAG 应用程序的性能是否正在提高,您必须对其进行定量评估。为此,您需要两个要素:评估指标和评估数据集。
目前,确定正确的评估指标并收集良好的验证数据是一个活跃的研究领域。由于这是一个快速发展的主题,我们目前见证了各种 RAG 评估框架方法的出现,例如RAG 三元组指标、ROUGE、ARES、BLEU和RAGA [1]。本文将重点介绍如何使用RAGA评估 RAG 管道[1]。
什么是 RAGA
RAGAs(检索增强生成评估)是一个框架(GitHub、Docs ) ,它为您提供必要的要素,帮助您在组件级别评估 RAG 管道。
评估数据
RAGA 的有趣之处在于,它最初是一个“无参考”评估框架 [1]。这意味着,RAGA 不必依赖评估数据集中人工注释的真实标签,而是利用底层的 LLM 来进行评估。
为了评估 RAG 管道,RAGA 需要以下信息:
- question:作为 RAG 管道输入的用户查询。输入。
- answer:从 RAG 管道生成的答案。输出。
- contexts:从外部知识源检索到的用于回答问题的上下文question。
- ground_truths: 的正确答案question。这是唯一人工注释的信息。此信息仅对指标是必需的context_recall(请参阅评估指标)。
利用 LLM 进行无参考评估是一个活跃的研究课题。虽然使用尽可能少的人工注释数据使其成为一种更便宜、更快速的评估方法,但仍有一些关于其缺点的讨论,例如偏见 [3]。不过,一些论文已经显示出有希望的结果 [4]。有关详细信息,请参阅 RAGA [1] 论文的“相关工作”部分。
请注意,该框架已扩展以提供需要基本事实标签的指标和范例(例如,context_recall和answer_correctness,参见评估指标)。
此外,该框架还为您提供了自动测试数据生成的工具。
评估指标
RAGA 为您提供了一些指标,以逐个组件以及端到端评估 RAG 管道。
在组件级别,RAGA 为您提供了分别评估检索组件(context_relevancy和context_recall)和生成组件(faithfulness和answer_relevancy)的指标 [2]:
- 上下文精度 衡量检索到的上下文的信噪比。该指标使用question和contexts。
- 上下文回忆率 衡量是否检索到了回答问题所需的所有相关信息。此指标基于ground_truth(这是框架中唯一依赖人工注释的地面实况标签的指标)和contexts。
- 忠诚度衡量所生成答案的事实准确性。给定上下文中的正确陈述数除以所生成答案中的陈述总数。此指标使用question和contexts。answer
- 答案相关性question衡量生成的答案与问题的相关程度。此指标使用和计算得出answer。例如,问题“法国在哪里,它的首都是哪里? ”的答案“法国位于西欧”将获得较低的答案相关性,因为它仅回答了问题的一半。
所有指标均缩放到 [0, 1] 范围,值越高表示性能越好。
RAGA 还为您提供了端到端评估 RAG 管道的指标,例如答案语义相似度和答案正确性。本文重点介绍组件级指标。
使用 RAGA 评估 RAG 应用程序
本节使用 RAGA 来评估最小的 vanilla RAG 管道,向您展示如何使用 RAGA 并让您直观地了解其评估指标。
先决条件
确保已安装所需的 Python 包:
- langchain,openai以及weaviate-clientRAG 管道
- ragas用于评估 RAG 管道
#!pip install langchain openai weaviate-client ragas
此外,在根目录中的 .env 文件中定义相关的环境变量。要获取 OpenAI API 密钥,您需要一个 OpenAI 帐户,然后在API 密钥下“创建新密钥” 。
OPENAI_API_KEY="<您的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)
# Load the data
loader = TextLoader('./state_of_the_union.txt')
documents = loader.load()
# Chunk the data
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
# Load OpenAI API key from .env file
load_dotenv(find_dotenv())
# Setup vector database
client = weaviate.Client(
embedded_options = EmbeddedOptions()
)
# Populate vector database
vectorstore = Weaviate.from_documents(
client = client,
documents = chunks,
embedding = OpenAIEmbeddings(),
by_text = False
)
# Define vectorstore as retriever to enable semantic search
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
# Define LLM
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
# Define prompt template
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)
# Setup RAG pipeline
rag_chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
准备评估数据
由于 RAGA 旨在成为一个无参考的评估框架,因此评估数据集所需的准备工作很少。您需要准备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 = []
# Inference
for query in questions:
answers.append(rag_chain.invoke(query))
contexts.append([docs.page_content for docs in retriever.get_relevant_documents(query)])
# To dict
data = {
"question": questions,
"answer": answers,
"contexts": contexts,
"ground_truths": ground_truths
}
# Convert dict to dataset
dataset = Dataset.from_dict(data)
如果您对该指标不感兴趣context_recall,则无需提供该ground_truths信息。在这种情况下,您只需准备questions。
评估 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()
下面,您可以看到示例的 RAGA 得分结果:
RAGA 对上下文精确度、上下文回忆度、忠实度和答案相关性进行评分。
我们可以做出以下观察:
- context_relevancy(检索上下文的信噪比):虽然 LLM 判断所有上下文与最后一个问题相关,但它也判断第二个问题的大部分检索上下文无关。根据此指标,您可以尝试使用不同数量的检索上下文来减少噪音。
- context_recall (如果检索到了回答问题所需的所有相关信息):LLM 评估检索到的上下文是否包含正确回答问题所需的相关信息。
- faithfulness(生成答案的事实准确性):虽然 LLM 判断第一个和最后一个问题的答案都是正确的,但是第二个问题的答案错误地指出了总裁没有提到英特尔的首席执行官,因此判断忠诚度为 0.5。
- answer_relevancy(生成的答案与问题有多相关):所有生成的答案都被判断为与问题相当相关。
正如评估数据中提到的,使用 LLM 进行无参考评估是一个活跃的研究领域。我很好奇这个主题将如何发展。
概括
构建概念验证 RAG 应用程序很容易,但让其性能投入生产却很难。与机器学习项目一样,您应该使用验证数据集和评估指标来评估 RAG 管道的性能。
但是,由于 RAG 流程由多个组件组成,必须单独和组合评估,因此您需要一组评估指标。此外,从人工注释者那里生成高质量的验证数据集非常困难、耗时且成本高昂。
本文介绍了RAGAs [1] 评估框架。该框架提出了四个评估指标—— context_relevancy、context_recall和—— faithfulness,answer_relevancy它们共同构成了 RAGAs 分数。此外,RAGAs 利用底层的 LLM 进行无参考评估,以节省成本。
免责声明
在撰写本文时,我是一个开源矢量数据库 Weaviate 的开发倡导者。
参考
[1] Es, S.、James, J.、Espinosa-Anke, L. 和 Schockaert, S. (2023)。RAGA:检索增强生成的自动评估。arXiv预印本 arXiv:2309.15217。
[2] RAGAs 文档 (2023)。文档(2023 年 12 月 11 日访问)
[3] Wang, P., Li, L., Chen, L., Zhu, D., Lin, B., Cao, Y., … & Sui, Z. (2023)。大型语言模型不是公平的评估者。arXiv preprint arXiv:2305.17926。
[4] Liu, Y., Iter, D., Xu, Y., Wang, S., Xu, R., & Zhu, C. (2023)。G-eval:使用 GPT-4 进行 NLG 评估,具有更好的人类对齐效果,2023 年 5 月。arXiv预印本 arXiv: 2303.16634,6 。
作者:Leonie Monigatti
出处:https://towardsdatascience.com/evaluating-rag-applications-with-ragas-81d67b0ee31a