RAG测评关键指标

news2024/10/9 21:04:18

解读RAG测评:关键指标与应用分析

©作者|CodeDan

来源|神州问学

一、RAG介绍

1.1 简介

RAG(Retrieval-Augmented Generation)是一种结合信息检索与文本生成的技术,旨在提高大型语言模型(LLM)在回答复杂查询时的表现。它通过检索相关的上下文信息来增强生成答案的质量和准确性。

想象一下,你在准备一场关于某个冷门历史事件的演讲,但你不太了解细节。你有一个很聪明的助手(相当于大型语言模型,LLM),但他也不是万能的,需要查阅外部信息来给出最好的答案。

这时候,RAG 就像是你的智能助手工作流程,它分成两个步骤:

1. 检索:助手先从图书馆或网上找出与这个历史事件相关的几篇文章或资料(这就是检索部分,它从外部数据源中找到相关的信息)。

2. 生成:助手读了这些资料后,再根据你给的提示(比如:“这个事件的关键人物是谁?”),结合刚刚找到的资料,生成一个完整、准确的回答告诉你。

通俗来说,RAG 就是让智能助手先去查资料,再根据资料来生成答案,而不是仅仅凭借它自己原有的知识作答。这样能让回答更准确,特别是对于冷门或专业领域的问题。

1.2 RAG的问题以及关注点

但是RAG也不是万能的,通常他们在检索质量和生成质量上需要我们着重关注。让我们在原来的例子中来体会一下这两个问题。

在检索质量上,助手从图书馆找到了几本书或文章,但其中一些信息可能并不完全相关,甚至有很多不必要的噪声。如果助手不能准确挑选出最有价值的内容,就可能导致生成的答案不准确或不连贯。因此,检索器必须确保找到的资料高度相关,避免噪声和无关信息的干扰,否则会直接影响到生成环节的表现。

在生成质量上,即使检索器找到了相关的资料,助手如何将这些资料转化为一个连贯、准确的回答仍然是个挑战。如果助手在生成答案时信息混乱或缺乏逻辑,就会降低最终的回答质量。因此,生成器需要有能力根据检索到的信息进行高质量的回答生成,并且还要能适应特定领域的问题。

通常来说,生成质量在很大程度上取决于模型的智能水平。像 GPT-4 或 GPT-1o 这样的高级模型,通常能提供较高的生成质量,确保答案的准确性和连贯性。

因此,我们的重点更多集中在检索质量上。那么,如何判断检索出的信息是否满足需求呢?

二、检索质量关键测评指标

这篇论文《生成式搜索引擎中验证性评估》的思路非常贴近我们讨论的主题,尤其是在评估生成内容的可验证性方面。其内容总结下来就是一论点,四指标,两算法。

2.1 一个论点

论文中的一个观点——成熟的可信赖的生成式搜索引擎(Generative Search Engine, GSE)的先决条件是可验证性(verifiability)。理想的 RAG 系统应该具备以下特征:

• 高引用召回率(high citation recall):所有生成内容都有充分的外部知识支持。

• 高引用精度(high citation precision):每个引用确实支持生成的内容。

然而,研究表明,这两个指标不可能达到 100%。根据实验结果,现有的 GSE 经常生成无据陈述和不准确的引文,分别达到 51.5% 和 74.5%。

2.2 四个指标

并且论文采用了四个指标来进行评估:

1. 流畅性(fluency):生成文本是否流畅连贯,使用五点李克特量表进行评分,从“强烈不同意”到“强烈同意”。

2. 实用性(perceived utility):生成内容的有用性,评测者对“这个回答对查询是有帮助且信息丰富的”这一说法的同意程度进行评分。

3. 引文召回率(citation recall):引文支持的生成内容与总生成内容的比例,类似于上下文支持率的概念。

4. 引文精度(citation precision):与特定主题相关的文献数量与检索到的内容的比例,接近于上下文有效率的概念。

2.3两个算法

为了综合考虑精确率和召回率,论文中引入了 F1 分数和 F2 分数:

F1 分数:精确率和召回率的调和平均数,适用于数据不平衡的情况,能够更全面地反映模型性能。

F2 分数:通过引入参数 β,允许调整精确率和召回率的相对重要性。比如β<1时,意味着精确率大于召回率,反之精确率大于召回率。

这些分数能够更准确地评估模型的性能,尤其是在面对不平衡数据时,提供比单纯准确率更有价值的见解。

三、RAG评测的具体方法RAGAs

3.1 RAGAs框架介绍

RAGAs (Retrieval-Augmented Generation Assessment) 是一个评估框架,专注于分析 RAG 系统在检索和生成环节的性能。它评估检索系统识别相关上下文段落的能力,以及大语言模型(LLM)在生成中如何有效利用这些段落。此外,RAGAs 还关注生成内容的质量。

为了评估 RAG 流程,RAGAs 需要以下几类数据:

RAGAs 提供多个指标来从组件和整体流程两个层面评估 RAG 系统的性能。所有指标的评分范围在 0 到 1 之间,分数越高代表性能越好。

组件层面的指标:

3.2 RAGAs实际代码演示

# 创建一个 GPT-4 小模型实例,用于生成对话。可以通过指定 API 密钥和 base URL 进行自定义调用。
model = ChatOpenAI(model="gpt-4o-mini", openai_api_key="",openai_api_base="",temperature=1)
# 加载博客文章或其他文本数据。
loader = TextLoader("your_name")
documents = loader.load()
# 使用字符分割器将文本按 1000 个字符大小进行切片,且切片之间不重叠。
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)
# 将切片后的文本数据向量化,以便于后续的检索操作。
embeddings = OpenAIEmbeddings(model="text-embedding-3-large",openai_api_key="", openai_api_base="")
# 将向量化后的文档存入 FAISS 向量存储中,便于进行相似度检索。
vectorstore = FAISS.from_documents(texts, embeddings)
# 将向量存储转换为检索器,使其能够基于嵌入向量进行文档检索。
retriever = vectorstore.as_retriever()
# 设置系统提示,告诉模型其角色是基于检索的上下文回答问题,且答案需要简洁。
system_prompt = ( "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, say that you "
"don't know. Use three sentences maximum and keep the "
"answer concise."
"\n\n"
"{context}"
)
# 定义一个对话提示模板,包含系统消息和用户输入部分。将检索到的上下文嵌入到回答逻辑中。
prompt = ChatPromptTemplate.from_messages(
[
("system", system_prompt),
("human", "{input}"),
]
)
# 创建用于文档处理的 QA 链(基于检索内容回答问题的链条)。
question_answer_chain = create_stuff_documents_chain(model, prompt)
# 将检索器整合进问答链,形成一个完整的 RAG(检索增强生成)链,用于实现基于检索的生成式问
答。
rag_chain = create_retrieval_chain(retriever, question_answer_chain)
from datasets import Dataset
from ragas import evaluate
from ragas.metrics import (
faithfulness, answer_relevancy, context_recall, context_precision,
)
# 示例问题
questions = ["question1", "question2", "question3"]
# 真实答案
ground_truths = [["true_answer1"], ["true_answer2"], ["true_answer3"]]
# 存储推导的答案和上下文
answers = []
contexts = []
# 迭代每个问题,生成答案并获取相关上下文
for query in questions:
# 生成答案
answer = rag_chain.invoke(query)
answers.append(answer if isinstance(answer, str) else answer['text'])
# 获取与问题相关的文档内容
relevant_docs = retriever.get_relevant_documents(query)
contexts.append([doc.page_content for doc in relevant_docs])
# 将数据转换为字典形式
data = { "question": questions, "answer": answers, "contexts": contexts, "ground_truths": ground_truths
}
# 创建数据集
dataset = Dataset.from_dict(data)
# 评估结果
result = evaluate(
dataset=dataset, metrics=[
context_precision, context_recall, faithfulness, answer_relevancy,
],
)
# 将结果转换为 Pandas DataFrame 格式
df = result.to_pandas()
print(df)

3.2 RAGAs效果展示

这些指标为衡量 RAG 系统在检索和生成环节的表现提供了标准,能够帮助判断 RAG 流程的性能是否有所提升。

参考内容:

[1] Chen, J., Lin, H., Han, J., & Sun, Y. (2023). 在检索增强生成中对大型语言模型进行基准测试. arXiv preprint arXiv:2309.01431v2.

https://doi.org/10.48550/arXiv.2309.01431

[2] Riedel, S., Kiela, D., Lewis, P., & Piktus, A. (2020). Retrieval Augmented Generation: Streamlining the creation of intelligent natural language processing models. Meta AI Blog.

https://ai.meta.com/blog/retrieval-augmented-generation-streamlining-the-creation-of-intelligent-natural-language-processing-models/

[3] Liu, N. F., Zhang, T., & Liang, P. (2023).

评估生成搜索引擎的可验证性. arXiv预印本, arXiv:2304.09848v2.

https://doi.org/10.48550/arXiv.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2200013.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ROS理论与实践学习笔记——4 ROS的常用组件之TF坐标变换

tf:TransForm Frame,坐标变换 坐标系:ROS 中是通过坐标系统开标定物体的,确切的将是通过右手坐标系来标定的。 作用:在 ROS 中用于实现不同坐标系之间的点或向量的转换。 说明:在ROS中坐标变换最初对应的是tf,不过在 hydro 版本开始, tf 被弃用,迁移到 tf2,后者…

docker 搭建 vue3 + vite

vue3发布了,今天就分享一下我使用docker 搭建 vue3 vite 开发环境。至于为什么使用docker搭建&#xff0c;因为多版本可以快速切换&#xff0c;和本地环境避免冲突。好了话不多说我们开始吧。 1. 准备资料 Docker Desktop wsl2 ubuntu 下载地址 : https://www.docker.…

实验室认证需要准备哪些文件材料?

实验室认证需要准备的文件材料通常包括以下几类&#xff1a; 一、法律地位文件 实验室成立文件及营业执照&#xff1a;包括实验室的成立证明文件、单位营业执照等&#xff0c;以证明实验室的法律地位和合法性。 人员任命文件&#xff1a;最高管理者&#xff08;如总经理&…

QT 实现QMessageBox::about()信息自定义显示

这是我记录Qt学习过程的第四篇心得文章&#xff0c;主要是方便自己编写的应用程序显示“关于信息”&#xff0c;对QMessageBox::about()输入信息进行规范&#xff0c;可以设置应用程序名称&#xff0c;通过定义宏从pro文件获取应用程序版本号&#xff0c;以及编译程序的QT版本、…

关于C语⾔内存函数 memcpy memmove memset memcmp

memcpy使⽤和模拟实现 void * memcpy ( void * destination, const void * source, size_t num ); 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。 这个函数在遇到 \0 的时候并不会停下来。 如果source和destination有任何的重叠&am…

Linux环境通过APT 仓库安装版PostgreSQL 数据库实战

Linux环境通过APT 仓库安装版PostgreSQL 数据库是运维人员常见的需求之一&#xff0c;今天我们一步一步演示一下&#xff1a; 1、添加 PostgreSQL APT 仓库 确保你的系统更新&#xff0c;然后添加 PostgreSQL 的官方 APT 仓库。 sudo apt update sudo apt install -y wget w…

原来机器学习那么简单——决策树回归

引言&#xff1a; 在正文开始之前&#xff0c;首先给大家介绍一个不错的人工智能学习教程&#xff1a;https://www.captainbed.cn/bbs。其中包含了机器学习、深度学习、强化学习等系列教程&#xff0c;感兴趣的读者可以自行查阅。 一、算法介绍 回归树是决策树的一种&#xff…

[已完结] Authentication Lab —— 靶场笔记合集

Authentication Labhttps://authlab.digi.ninja/ 0x01&#xff1a;Authentication Lab 靶场简介 Authentication Lab 是由 DigiNinja 提供的&#xff0c;一个专注于身份验证和授权漏洞的实验平台。该网站旨在提供一个可以让用户探索和实践各种常见与不常见的身份验证与授权漏…

带你深入浅出设计模式:十、责任链模式:设计模式中的多米诺骨牌效应

此为设计模式第十谈&#xff01; 用总-分-总的结构和生活化的例子给你讲解设计模式&#xff01; 码农不易&#xff0c;各位学者学到东西请点赞收藏支持支持&#xff01; 开始部分&#xff1a; 总&#xff1a;责任链的本质是使多个对象都有机会处理请求&#xff0c;将这些对象…

指针和引用区别

目录 指针 指针类型 野指针 二级指针 Const修饰指针 引用 引用的作用 常引用 引用和指针的对比 引用能够完全替换指针吗&#xff1f; 指针 指针是C语言中的概念&#xff0c;它是指计算机储存内容的地址。指针它的值指向存在电脑储存器中另一个地方的值。通过地址能找…

玩机搞机基本常识-----如何在 Android 中实现默认开启某个功能 修改方法列举

我们有时候需要对安卓系统进行修改。实现其中的某些功能。让用户使用得心应手。节约时间。那么如果要实现系统中的有些功能选项开启或者关闭。就需要对系统有一定的了解。那么在 Android 中实现默认开启某个功能可以通过以下几种方式&#xff1a; 一、在应用的设置中添加选项 …

Chromium 中js Fetch API接口c++代码实现(二)

Chromium 中JavaScript Fetch API接口c代码实现&#xff08;一&#xff09;-CSDN博客 接着上一篇继续介绍调用&#xff0c;上函数堆栈。 1、打开http://192.168.8.1/chfs/shared/test/test02.html 此标签进程ID12484&#xff0c; 2、打开vs附加上此进程ID12484 3、点击页面测…

uni-app 开发的应用快速构建成鸿蒙原生应用

uni-app 是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;它支持编译到 iOS、Android、小程序等多个平台。对于 HarmonyOS&#xff08;鸿蒙系统&#xff09;&#xff0c;uni-app 提供了特定的支持&#xff0c;允许开发者构建鸿蒙原生应用。 一、uni-app 对 HarmonyOS 的支…

分治算法(7)_归并排序_计算右侧小于当前元素的个数

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 分治算法(7)_归并排序_计算右侧小于当前元素的个数 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&…

公司防泄密软件哪个好?6款公司内部文件防泄密软件,2024超好用推荐!

企业的核心机密就如同生命之源&#xff0c;然而&#xff0c;数据泄露的风险也随之而来&#xff0c;让不少企业头疼不已。 面对这一挑战&#xff0c;选择一款高效、可靠的防泄密软件显得尤为重要。 那么&#xff0c;公司防泄密软件哪个好&#xff1f; 接下来&#xff0c;就让我…

攻防世界---->[简单] 初识RSA

做题笔记。 下载 是一个.py的文件。 用 Notepad打开瞅瞅。 分析&#xff1a; L (p-1)*(q-1) dgmpy2.invert(e,L) 求逆元快速算出来&#xff1a;invert(e,φ(N)) 求出d值。 n p*q pq p*(q-1) qp q*(p-1) L 【q*(p-1) * p*(q-1)】 // p*q >>> (p-1)*(…

C++关于树的基础知识

首先区分概念 “度为m的树”指的是至少有一个结点的度是m&#xff0c;一定是非空树 “m叉树”指的是允许所有的结点都小于m&#xff0c;且可以是空树 常见考点&#xff1a; 度为m的树的第i层最多有个结点 &#xff08;对于m叉树也相同&#xff09; 第一层m的0次方 第二层m的…

如何帮助企业进行有效的专利管理?

专利管理是企业创新发展的重要支撑&#xff0c;有效的专利管理不仅能保护企业的创新成果&#xff0c;还能提升企业的核心竞争力。那么&#xff0c;究竟该如何帮助企业进行有效的专利管理呢&#xff1f;接下来&#xff0c;本文将为您详细解答。 一、专利管理对企业的重要性 1. 保…

[ROS2]解决PyQt5和sip的各种报错问题 stderr: qt_gui_cpp

前言 编译ros环境的时候遇到了qt_gui_cpp各种编译问题&#xff0c;但是鉴于网上解决方法基本没有&#xff0c;故记录下来帮助后来者。整篇文章总结下来就是一句话&#xff1a;PyQt5和sip安装过程或安装版本有问题&#xff0c;需要重新安装。 问题与解决方法 如果PyQt5你是正…

华为OD机试 - 处理器问题(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…