使用 RAGAs(检索增强生成评估)评估 RAG 应用

2024-02-28 05:36

本文主要是介绍使用 RAGAs(检索增强生成评估)评估 RAG 应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文地址:Evaluating RAG Applications with RAGAs

一个包含指标和大型语言模型生成的数据框架,用于评估您的检索增强生成管道的性能。

2023 年 12 月 13 日

Stylized performance dashboard for Retrieval-Augmented Generation

到目前为止,我们知道为检索增强生成 (RAG) 的应用程序构建概念验证很容易,但要将其实际应用到生产环境中则非常困难。由于 RAG 流程中包含不同的组件,因此要使 RAG 系统的性能达到令人满意的状态尤其困难:

  • 检索器组件: 为LLM从外部数据库中检索额外的上下文,以便回答查询。
  • 生成器组件: 根据使用检索到的信息来增强提示(prompt)并生成答案。

评估 RAG 流程时,您必须单独和一起评估两个组件,以了解 RAG 流程是否以及在哪些方面仍需要改进。此外,要了解 RAG 应用程序的性能是否有所改善,您必须对其进行定量评估。为此,您需要两个要素:评估指标和评估数据集。

目前,确定正确的评估指标并收集良好的验证数据是一个活跃的研究领域。由于这是一个快速发展的主题,我们目前正在见证各种 RAG 评估框架方法的出现,例如RAG Triad of MetricsBLEU [1] 评估 RAG 系统。RAGA [1]。本文将重点介绍如何使用 RAGA 和 、ARESROUGE

什么是 RAGA

RAGAs(Retrieval-Augmented Generation Assessment,检索增强生成评估)是一个框架(GitHub,文档),可提供必要的工具,帮助在组件层面评估 RAG 流程。

评估数据

RAGAs 的有趣之处在于,最初是作为一种无需参照标准的评估框架而设计的 [1]。这意味着,RAGAs 不需要依赖评估数据集中人工标注的标准答案,而是利用底层的大语言模型进行评估。

为了对 RAG 流程进行评估,RAGAs 需要以下几种信息:

  • question:RAG 流程的输入,即用户的查询问题。
  • answer:RAG 流程的输出,由RAG流程生成的答案。
  • contexts:为解答 question 而从外部知识源检索到的相关上下文。
  • ground_truthsquestion 的标准答案,这是唯一需要人工标注的信息。这个信息仅在评估 context_recall 这一指标时才必须(详见 评估指标)。

利用 LLM 进行无参考评估是一个活跃的研究课题。虽然尽可能少地使用人工标注数据会使得评估方法变得成本更低、速度更快,但仍有一些关于其缺点(如偏差)的讨论[3]。不过,一些论文已经显示出了有希望的成果[4]。详细信息请参见 RAGAs [1] 论文的 "相关工作 "部分。

外,该框架还为您提供了用于自动测试数据生成的工具。

评估指标

RAGA 为您提供了一些指标来按组件和端到端评估 RAG 系统。

组件级别,,RAGAs 提供了评价检索组件(包括context_relevancycontext_recall)和生成组件(涉及faithfulnessanswer_relevancy)的专门指标 [2]:

  • 上下文精度 :测量检索到的上下文的信噪比。该指标是使用 question 和 contexts 计算的。
  • 上下文召回率 : 衡量是否检索到回答问题所需的所有相关信息。该指标是根据 ground_truth(这是框架中唯一依赖人工注释的地面真实标签的指标)和 contexts 计算的。
  • 真实性:衡量生成答案的事实准确性。给定上下文中正确陈述的数量除以生成答案中的陈述总数。该指标使用 questioncontexts 和 answer
  • 答案相关性:衡量生成的答案与问题的相关程度。该指标是使用 question 和 answer 计算的。例如,答案“法国位于西欧”。对于问题“法国在哪里,它的首都是什么?”的答案相关性较低,因为它只回答了问题的一半。

所有指标都缩放到范围 [0, 1],值越高表示性能越好。

RAGA 还为您提供评估 RAG系统的指标端到端,例如答案语义相似性答案正确性。本文主要讨论的是组件层面的评价指标。

使用 RAGAs 评估 RAG 应用

本节将通过 RAGAs 工具来评估一个最基础的 RAG(检索增强生成)流程。目的是向您展示如何使用 RAGA 并让您直观地了解其评估指标。

准备工作

请确保你已经安装了以下 Python 包:

  • langchainopenai 和 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 流程。关于详细的设置过程,可以参考以下链接中的文章。

检索增强生成 (RAG): 从理论到 LangChain 实现

首先,准备数据,包括加载文档和进行数据分块。

import requests
from langchain.document_loaders import TextLoader
from 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)# 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 Datasetquestions = ["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 即可。

评估 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(是否检索到回答问题所需的所有相关信息):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 应用性能的必要工具,我建议你构建一个实验流程,并根据以下调优策略来逐步提升应用的表现:

A Guide on 12 Tuning Strategies for Production-Ready RAG Applications​towardsdatascience.com/a-guide-on-12-tuning-strategies-for-production-ready-rag-applications-7ca646833439

生成这些数据集的代码可以在这个 GitHub 仓库中找到。

References

[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.

这篇关于使用 RAGAs(检索增强生成评估)评估 RAG 应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/754508

相关文章

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详