赞
踩
原文地址:Evaluating RAG Applications with RAGAs
一个包含指标和大型语言模型生成的数据框架,用于评估您的检索增强生成管道的性能。
2023 年 12 月 13 日
Stylized performance dashboard for Retrieval-Augmented Generation
到目前为止,我们知道为检索增强生成 (RAG) 的应用程序构建概念验证很容易,但要将其实际应用到生产环境中则非常困难。由于 RAG 流程中包含不同的组件,因此要使 RAG 系统的性能达到令人满意的状态尤其困难:
评估 RAG 流程时,您必须单独和一起评估两个组件,以了解 RAG 流程是否以及在哪些方面仍需要改进。此外,要了解 RAG 应用程序的性能是否有所改善,您必须对其进行定量评估。为此,您需要两个要素:评估指标和评估数据集。
目前,确定正确的评估指标并收集良好的验证数据是一个活跃的研究领域。由于这是一个快速发展的主题,我们目前正在见证各种 RAG 评估框架方法的出现,例如RAG Triad of Metrics、BLEU [1] 评估 RAG 系统。RAGA [1]。本文将重点介绍如何使用 RAGA 和 、ARES、ROUGE
RAGAs(Retrieval-Augmented Generation Assessment,检索增强生成评估)是一个框架(GitHub,文档),可提供必要的工具,帮助在组件层面评估 RAG 流程。
RAGAs 的有趣之处在于,最初是作为一种无需参照标准的评估框架而设计的 [1]。这意味着,RAGAs 不需要依赖评估数据集中人工标注的标准答案,而是利用底层的大语言模型进行评估。
为了对 RAG 流程进行评估,RAGAs 需要以下几种信息:
question
:RAG 流程的输入,即用户的查询问题。answer
:RAG 流程的输出,由RAG流程生成的答案。contexts
:为解答 question
而从外部知识源检索到的相关上下文。ground_truths
:question
的标准答案,这是唯一需要人工标注的信息。这个信息仅在评估 context_recall
这一指标时才必须(详见 评估指标)。利用 LLM 进行无参考评估是一个活跃的研究课题。虽然尽可能少地使用人工标注数据会使得评估方法变得成本更低、速度更快,但仍有一些关于其缺点(如偏差)的讨论[3]。不过,一些论文已经显示出了有希望的成果[4]。详细信息请参见 RAGAs [1] 论文的 "相关工作 "部分。
外,该框架还为您提供了用于自动测试数据生成的工具。
RAGA 为您提供了一些指标来按组件和端到端评估 RAG 系统。
在组件级别,,RAGAs 提供了评价检索组件(包括context_relevancy
和context_recall
)和生成组件(涉及faithfulness
和answer_relevancy
)的专门指标 [2]:
question
和 contexts
计算的。ground_truth
(这是框架中唯一依赖人工注释的地面真实标签的指标)和 contexts
计算的。question
、contexts
和 answer
。question
和 answer
计算的。例如,答案“法国位于西欧”。对于问题“法国在哪里,它的首都是什么?”的答案相关性较低,因为它只回答了问题的一半。所有指标都缩放到范围 [0, 1],值越高表示性能越好。
RAGA 还为您提供评估 RAG系统的指标端到端,例如答案语义相似性和答案正确性。本文主要讨论的是组件层面的评价指标。
本节将通过 RAGAs 工具来评估一个最基础的 RAG(检索增强生成)流程。目的是向您展示如何使用 RAGA 并让您直观地了解其评估指标。
准备工作
请确保你已经安装了以下 Python 包:
langchain
、openai
和 weaviate-client
,用于搭建 RAG 流程ragas
,用于评估 RAG 流程!pip install langchain openai weaviate-client ragas
此外,你需要在根目录下的 .env 文件中设置相关环境变量。要获取 OpenAI 的 API 密钥,你需要注册 OpenAI 账号,并在 API keys 页面创建新的密钥。
OPENAI_API_KEY="\<YOUR_OPENAI_API_KEY>"
在评估 RAG 应用之前,首先需要进行设置。我们这里使用一个基础版的 RAG 流程。关于详细的设置过程,可以参考以下链接中的文章。
检索增强生成 (RAG): 从理论到 LangChain 实现
首先,准备数据,包括加载文档和进行数据分块。
- 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()
- )
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 = []
-
-
- # 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)
dataset = Dataset.from_dict(data)
如果你不关注 context_recall
指标,就不必提供 ground_truths
数据。在这种情况下,你只需准备 question
即可。
首先,从 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
(是否检索到回答问题所需的所有相关信息):LLMs 认为检索到的上下文包含了正确回答问题所需的全部相关信息。faithfulness
(生成答案的事实准确性):虽然 LLM 认为第一个和最后一个问题的答案是正确的,但它对第二个问题的答案(错误地声称总统没有提到英特尔的 CEO)的准确性评分为 0.5。answer_relevancy
(生成答案与问题的相关性):所有生成的答案都被评估为与问题高度相关。正如 评估数据 一文中所述,利用大语言模型 (LLM) 进行无参考评估是当前研究的热点。我对这个领域的未来发展充满期待。
虽然快速搭建一个概念验证阶段的 RAG 应用相对简单,但要提升其到生产级别的性能却颇具挑战。这类似于在机器学习项目中,需要借助验证数据集和评估标准来全面审视 RAG 流程的效能。
但由于 RAG 流程涉及多个组件,这些组件不仅要单独评估,还需联合考量,因此需要多种评估标准。而且,依靠人工标注创建高品质的验证数据集既耗时又成本高昂。
本文向大家介绍了 RAGAs [1] 这一评估框架。该框架定义了四个核心评估指标——context_relevancy
(上下文相关性)、context_recall
(上下文召回率)、faithfulness
(真实性)和 answer_relevancy
(答案相关性)——这四个指标共同构成了 RAGAs 评分体系。此外,RAGAs 还巧妙利用了大语言模型 (LLM) 进行无参考评估,以降低成本。
现在,你已经掌握了评估 RAG 应用性能的必要工具,我建议你构建一个实验流程,并根据以下调优策略来逐步提升应用的表现:
生成这些数据集的代码可以在这个 GitHub 仓库中找到。
[1] Es, S., James, J., Espinosa-Anke, L., & Schockaert, S. (2023). RAGAs: Automated Evaluation of Retrieval Augmented Generation. arXiv preprint arXiv:2309.15217.
[2] RAGAs Documentation (2023). Documentation (accessed Dec 11, 2023)
[3] Wang, P., Li, L., Chen, L., Zhu, D., Lin, B., Cao, Y., … & Sui, Z. (2023). Large language models are not fair evaluators. arXiv preprint 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 preprint arXiv:2303.16634, 6.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。