使用 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

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

AI一键生成 PPT

AI一键生成 PPT 操作步骤 作为一名打工人,是不是经常需要制作各种PPT来分享我的生活和想法。但是,你们知道,有时候灵感来了,时间却不够用了!😩直到我发现了Kimi AI——一个能够自动生成PPT的神奇助手!🌟 什么是Kimi? 一款月之暗面科技有限公司开发的AI办公工具,帮助用户快速生成高质量的演示文稿。 无论你是职场人士、学生还是教师,Kimi都能够为你的办公文

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

zoj3820(树的直径的应用)

题意:在一颗树上找两个点,使得所有点到选择与其更近的一个点的距离的最大值最小。 思路:如果是选择一个点的话,那么点就是直径的中点。现在考虑两个点的情况,先求树的直径,再把直径最中间的边去掉,再求剩下的两个子树中直径的中点。 代码如下: #include <stdio.h>#include <string.h>#include <algorithm>#include <map>#