一个带有指标和LLM生成数据的框架,用于评估检索增强生成管道的性能

到目前为止,我们知道为检索增强生成(RAG)应用构建一个概念验证是很容易的,但要使其适合生产环境则非常困难。使RAG管道的性能达到令人满意的状态尤其困难,这是因为RAG管道中存在不同的组件:
- 检索组件:从外部数据库中检索与LLM回答查询有关的附加上下文。
- 生成组件:根据附加的检索信息生成答案。
在评估RAG管道时,您必须单独评估这两个组件以及它们的整体表现,以了解RAG管道是否仍需要改进的地方。另外,为了了解RAG应用程序的性能是否在改善,您还必须进行定量评估。为此,您需要两个要素:一个评估指标和一个评估数据集。
目前,确定正确的评估指标和收集良好的验证数据是一个活跃的研究领域。由于这是一个快速发展的主题,我们目前看到了各种用于RAG评估框架的方法,例如RAG三元指标,ROUGE,ARES,BLUE和RAGAs [1]。本文将重点介绍如何使用RAGAs [1]评估RAG管道。
什么是RAGAs
RAGAs(检索增强生成评估)是一个框架(GitHub,Docs),它为您提供了在组件级别上评估RAG管道所需的必要元素。
评估数据
RAGAs的有趣之处在于它最初是一个“无参考”评估框架[1]。这意味着,在评估数据集中,RAGAs利用LLMs来进行评估,而无需依赖于人工注释的标签。
为了评估RAG管道,RAGAs需要以下信息:
question:作为RAG管道输入的用户查询。answer:RAG管道生成的答案。contexts:从外部知识源检索到的用于回答question的上下文。ground_truths:question的真实答案。这是唯一需要人工注释的信息。此信息仅在度量标准context_recall(参见评估指标)中需要。
利用LLMs进行无参考评估是一个活跃的研究领域。尽管尽可能少地使用人工注释数据使得评估方法更加经济和快速,但对其缺点仍有一些讨论,例如偏见[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 管道端到端提供了指标,例如答案语义相似性和答案正确性。本文重点介绍组件级别的指标。
使用 RAGAs 评估 RAG 应用
本节使用 RAGAs 评估一个最简化的 RAG 管道,以向您展示如何使用 RAGAs 并为您提供有关其评估指标的直观理解。
前提条件
请确保已安装所需的 Python 软件包:
langchain、openai和weaviate-client用于 RAG 管道- 用于评估 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 requestsfrom langchain.document_loaders import TextLoaderfrom langchain.text_splitter import CharacterTextSplitterurl = "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)# 加载文本dataloader = 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 OpenAIEmbeddingsfrom langchain.vectorstores import Weaviateimport weaviatefrom weaviate.embedded import EmbeddedOptionsfrom 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 ChatOpenAIfrom langchain.prompts import ChatPromptTemplatefrom langchain.schema.runnable import RunnablePassthroughfrom langchain.schema.output_parser import StrOutputParser# 定义LLMllm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)# 定义提示模板template = """您是一个用于问答任务的助手。使用以下检索到的上下文片段来回答问题。如果您不知道答案,请直接说您不知道。最多使用两个句子,并保持回答简明。问题:{question} 上下文:{context} 回答:"""prompt = ChatPromptTemplate.from_template(template)# 设置RAG流程rag_chain = ( {"context": retriever, "question": RunnablePassthrough()} | prompt | llm | StrOutputParser() )
准备评估数据
RAGAs致力于成为一个无需参考的评估框架,因此对评估数据集的要求很少。您需要从中准备question和ground_truths对,然后通过推理来准备剩余的信息,如下所示:
from datasets import Datasetquestions = ["总统对布雷耶法官有什么评价?", "总统对英特尔首席执行官有什么评价?", "总统对枪支暴力有什么说法?", ]ground_truths = [["总统表示布雷耶法官献身为国家服务,并对其服务表示感谢。"], ["总统表示帕特·赫尔辛格准备将英特尔的投资增加到1000亿美元。"], ["总统要求国会通过已证明有效的措施以减少枪支暴力。"]]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。
评估RAG应用
首先,从ragas.metrics导入您想要使用的所有度量标准。然后,您可以使用evaluate()函数并简单地传入相关的度量标准和准备好的数据集。
from ragas import evaluatefrom 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分数:

我们可以得出以下观察结果:
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进行无参考评估以节省成本。
现在,您已经有了评估RAG应用性能的工具,我建议您建立一个实验管道并开始使用以下调整策略优化性能:
针对生产就绪的RAG应用的12个调优策略指南
如何通过以下“超参数”和…来提高检索增强生成(RAG)流水线的性能
towardsdatascience.com
您可以在此GitHub存储库中找到生成此数据集的代码。
喜欢这个故事?
免费订阅,以便在我发布新故事时收到通知。
每当Leonie Monigatti发布时收到电子邮件。
每当Leonie Monigatti发布时收到电子邮件。通过注册,您将创建一个VoAGI帐户(如果您还没有…
VoAGI.com
免责声明
本文写作时,我是Weaviate的开发者倡导者,Weaviate是一个开源向量数据库。
参考资料
[1] Es, S., James, J., Espinosa-Anke, L., & Schockaert, S. (2023). RAGAs: Automated Evaluation of Retrieval Augmented Generation. 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). Large language models are not fair evaluators. arXiv预印本arXiv:2305.17926。
[4] Liu, Y., Iter, D., Xu, Y., Wang, S., Xu, R., & Zhu, C. (2023). G-eval: Nlg evaluation using gpt-4 with better human alignment, may 2023. arXiv预印本arXiv:2303.16634, 6。
图片
除非另有说明,所有图片均由作者创建。