【AIGC】RAGAS评估原理及实践

【AIGC】RAGAS评估原理及实践

      • (1)准备评估数据集
      • (2)开始评估
        • 2.1 加载数据集
        • 2.2 评估忠实性
        • 2.3 评估答案相关性
        • 2.4 上下文精度
        • 2.5 上下文召回率
        • 2.6 计算上下文实体召回率

在这里插入图片描述

RAGas(RAG Assessment)RAG 评估的缩写,是一个专门的解决方案用于评估、监控和提升生产环境中大语言模型(LLM)和检索增强生成(RAG)应用的性能,包括用于生产质量监控的定制模型。它除了评估,还能从数据集中生成测试集,这将极大地降低人力投入,毕竟一个良好的数据集构建是非常消耗时间和人力的。RAGas 从生成和检索两个维度评估 RAG 应用,如下图所示。

在这里插入图片描述

生成角度可以从忠实性 faithfulness 和回答相关性 answer relevancy 评估,而检索则从上下文精度(context precision)和上下文召回(context recall)上来测评。当然 ragas 不止这四种评测,还有答案准确性(answer correctness),上下文利用率(context utilization),上下文实体召回率(context entity recall)和噪声敏感度(noise sensitivity)等。后面会专门叙述常见的几种指标的计算。在开始评估之前,我们先安装 ragas。

pip install ragas

安装好之后,我们要如何评估 RAG 呢?拿什么评估?这就必须要说如何准备评估数据集。

(1)准备评估数据集

RAGas 需要的评估数据集格式如下:

data_samples = {'question': ['第一届超级碗是什么时候举行的?', '谁赢得了最多的超级碗冠军?'],       'answer': ['第一届超级碗于1967年1月15日举行', '赢得最多超级碗冠军的是新英格兰爱国者队'],       'contexts': [['第一届 AFL-NFL 世界冠军赛是一场美式橄榄球比赛,于1967年1月15日在洛杉矶纪念体育馆举行'],                    ['绿湾包装工队...位于威斯康星州绿湾市。', '包装工队参加...全国橄榄球联合会比赛']],       'ground_truth': ['第一届超级碗于1967年1月15日举行', '新英格兰爱国者队赢得了创纪录的六次超级碗冠军']   
} 

包含 4 个字段,分别是question、answer、contexts和ground_truth。每一项都是一个数组列表,要注意的是,答案、上下文和基本事实和问题列表是一一对应的,即第一个问题的答案也必须是 answer 中的第一个元素,同时也必须是上下文和基本事实的第一个元素。其中上下文的每个元素都是一组字符串数组,这是因为每个问题都可以有多个上下文。

如果你人力资源足够的话,我们可以手动构建这个数据集,假设你有问题列表和基本事实列表(这一个不是必须),回答就由你自己的 RAG 应用根据问题来填充,上下文也由你的 RAG 应用填充。

此外,我们也可以使用 ragas 根据数据集自动构建。因为要读入数据,这里需要先安装 langchain 或者 llamaindex 来支持数据的读入。

pip install langchain-community==0.2.17   
pip install unstructured==0.15.13

然后使用如下代码,读入数据。

from langchain_community.document_loaders import DirectoryLoader      loader = DirectoryLoader("~/Projects/graphrag/input")   
documents = loader.load()      
for document in documents:       document.metadata['filename'] = document.metadata['source']  

既然要生成数据集,当然需要大语言模型的支持了,也需要 embedding 模型支持,这里采用 DeepSeek 和智谱的在线模型 API。

from langchain_openai import ChatOpenAI, OpenAIEmbeddings      generator_llm = ChatOpenAI(model="deepseek-chat", openai_api_base="https://api.deepseek.com/v1", openai_api_key="xxxx")   
critic_llm = ChatOpenAI(model="deepseek-chat", openai_api_base="https://api.deepseek.com/v1", openai_api_key="xxxx")   
embeddings = OpenAIEmbeddings(openai_api_base="https://open.bigmodel.cn/api/paas/v4", openai_api_key="xxxx", embedding_ctx_length=512, chunk_size=512, model="embedding-3") 

注意必须配置这些选项,不然它默认就是访问 OpenAI 的模型。

然后就是使用 ragas 框架的 API 来生成测试集了,首先初始化测试集生成器。

generator = TestsetGenerator.from_langchain(generator_llm,critic_llm,embeddings)  

然后调用 API generate_with_langchain_docs准备生成,参数为读取的 documents,生成的数据集条数 test_size 以及生成问题的分布,如简单的占比 0.5,推理的 0.25 以及多个上下文的 0.25。

testset: TestDataset = generator.generate_with_langchain_docs(documents,test_size=10,distributions={simple: 0.5, reasoning: 0.25, multi_context: 0.25})  

然后我们将生成的数据集保存,以备后用。

ds = testset.to_dataset()   
ds.save_to_disk("./activity_testset") 

生成的数据大概如下所示。

在这里插入图片描述

ragas 在生成数据集上还可以配置问题的难易分布。理想的评估数据集应涵盖生产中遇到的各种类型的问题,包括不同难度级别的问题。大语言模型(LLMs)通常不擅长生成多样化的样本,因为它们倾向于遵循常见路径。ragas 受 Evol-Instruct[2] 等作品的启发,采用了一种进化生成范式,系统地从提供的文档集创建具有不同特征的问题,如推理、条件、多个上下文等。这种方法确保了对管道中各个组件性能的全面覆盖,从而实现更稳健的评估过程,原理如下图所示。

在这里插入图片描述

但我要说的是,ragas 在生成数据集非常不完善,很难生成,全靠运气,经常报 Connection 错误,而 API 明明可以连接。另外一点是所使用的 Prompt 都是英文,有几率生成一些英文问题,即使你的输入文档是中文的。虽然你可以通过 Prompt adapation 进行本地化,但 ragas 里对于 json 的处理非常简单,不会做任何解析增强,所以生成的东西也用不了,除非手工修改。

看了一些 ragas 代码,感觉写的不咋的,但他们的评估指标和思路是挺好的。生成测试集搞了我一周,魔改代码都没能解决一堆报错,搞得我一肚子火。今天发布了最新版本 v0.2.0,已经和上述代码不兼容了。还没空测评,不知道新版本是否有解决,希望给力点吧。

(2)开始评估

上节已经提到生成数据集功能缺陷太多,所以这里为了演示,我们使用官方 Demo 中的数据集。

2.1 加载数据集
from datasets import Dataset, load_dataset   def load_amnesty_qa() -> Dataset:       # loading the V2 dataset       amnesty_qa = load_dataset("explodinggradients/amnesty_qa", "english_v2")print(amnesty_qa['eval'].column_names)       # ['question', 'ground_truth', 'answer', 'contexts']       # amnesty_qa['eval']['contexts']       return amnesty_qa["eval"]         dataset = load_amnesty_qa() 
2.2 评估忠实性

计算 Faithfulness 就是计算忠实性。首先将答案分拆为几个声明(简单理解为句子也行),然后判断每个句子是否可以从上下文 contexts 中推断出来,如果出现过则认为是忠实的。比如将答案拆分为 3 个 claims,然后从 context 中判断有几个可以推断出来,假设为 2,那么忠实性就是 2/3。它需要回答和上下文。

from ragas.metrics import faithfulness, answer_relevancy, context_precision, context_recall, context_entity_recall   
from ragas import evaluate   def metric_faithfulness():       score = evaluate(dataset, metrics=[faithfulness], llm=generator_llm, embeddings=embeddings)print(score.to_pandas())      metric_faithfulness()

评估忠实性如下表所示。

在这里插入图片描述

2.3 评估答案相关性

计算答案的相关性 Answer relevancy,它基于答案推测出多个问题,然后计算用户问题和推测出的问题的相关性,也就是嵌入的相似度,然后取平均值从而得出相关性。它也需要回答和问题。

def metric_answer_relevancy():       score = evaluate(dataset, metrics=[answer_relevancy], llm=generator_llm, embeddings=embeddings)       print(score.to_pandas())      metric_answer_relevancy() 

评估结果如下表所示。

在这里插入图片描述

2.4 上下文精度

计算上下文精度 Context Precision,即召回的 K 个 Chunk 中,到底多少是和问题、真实答案相关的。然后基于此计算一个精度的分数。它需要问题、基本事实和上下文。

def metric_context_precision():       score = evaluate(dataset, metrics=[context_precision], llm=generator_llm, embeddings=embeddings)       print(score.to_pandas())   metric_context_precision()

评估结果如下表所示。

在这里插入图片描述

2.5 上下文召回率

计算上下文召回率 Context Recall,衡量检索到的上下文与作为基本事实的一致程度。从基本事实中,提取出 Claims,然后判断每一个 Claims 是否可以从检索出的上下文中推断出来,然后计算推断出的 claims 数量和总 claims 数量。它需要问题、基本事实、上下文。

def metric_context_recall():       score = evaluate(dataset, metrics=[context_recall], llm=generator_llm, embeddings=embeddings)       print(score.to_pandas()) 

评估结果如下表所示。

在这里插入图片描述

2.6 计算上下文实体召回率

计算上下文中实体召回 Context Entities Recall,分别从 Context 和基本事实中提取出实体,然后从中找出实体的交集并和基本事实中的实体数量做比,得出一个实体召回率。它需要上下文和基本事实。

def metric_context_entities_recall():       score = evaluate(dataset, metrics=[context_entity_recall], llm=generator_llm, embeddings=embeddings)     print(score.to_pandas())

评估结果如下表所示。

在这里插入图片描述

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

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

相关文章

VuePress完美整合Toast消息提示

VuePress 整合 Vue-Toastification 插件笔记 记录如何在 VuePress 项目中整合使用 vue-toastification 插件,实现优雅的消息提示。 一、安装依赖 npm install vue-toastification或者使用 yarn: yarn add vue-toastification二、配置 VuePress 客户端增…

C#学习12——预处理

一、预处理指令: 解释:是在编译前由预处理器执行的命令,用于控制编译过程。这些命令以 # 开头,每行只能有一个预处理指令,且不能包含在方法或类中。 个人理解:就是游戏里面的备战阶段(不同对局…

开疆智能Profinet转Profibus网关连接CMDF5-8ADe分布式IO配置案例

本案例是客户通过开疆智能研发的Profinet转Profibus网关将PLC的Profinet协议数据转换成IO使用的Profibus协议,操作步骤如下。 配置过程: Profinet一侧设置 1. 打开西门子组态软件进行组态,导入网关在Profinet一侧的GSD文件。 2. 新建项目并…

(三)Linux性能优化-CPU-CPU 使用率

CPU使用率 user(通常缩写为 us),代表用户态 CPU 时间。注意,它不包括下面的 nice 时间,但包括了 guest 时间。nice(通常缩写为 ni),代表低优先级用户态 CPU 时间,也就是进…

Digital IC Design Flow

Flow介绍 1.设计规格 架构师根据市场需求制作算法模型(Algorithm emulation)及芯片架构(Chip architecture),确定芯片设计规格书(Chip design specification) 原型验证 原型验证(Prototype Validation)通常位于产品开发流程的前期阶段,主要是在设计和开发的初步阶…

算法打卡第18天

从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…

LangChain工具集成实战:构建智能问答系统完整指南

导读:在人工智能快速发展的今天,如何构建一个既能理解自然语言又能调用外部工具的智能问答系统,成为许多开发者面临的核心挑战。本文将为您提供一套完整的解决方案,从LangChain内置工具包的基础架构到复杂系统的工程实践。 文章深…

P3156 【深基15.例1】询问学号

P3156 【深基15.例1】询问学号 - 洛谷 数据结构-线性表 #include<bits/stdc.h> using namespace std; int n,m,a[2000005]; int main(){cin>>n>>m;for(int i1;i<n;i)cin>>a[i];//使用数组模拟线性表while(m--){int k;cin>>k;cout<<a[…

衡量嵌入向量的相似性的方法

衡量嵌入向量的相似性的方法 一、常见相似性计算方法对比 方法核心原理公式优点缺点适用场景余弦相似度计算向量夹角的余弦值,衡量方向相似性,与向量长度无关。$\text{cos}\theta = \frac{\mathbf{a} \cdot \mathbf{b}}{\mathbf{a}\mathbf{b}欧氏距离计算向量空间中的直线距离…

小番茄C盘清理:专业高效的电脑磁盘清理工具

在使用电脑的过程中&#xff0c;我们常常会遇到系统盘空间不足、磁盘碎片过多、垃圾文件堆积等问题&#xff0c;这些问题不仅会导致电脑运行缓慢&#xff0c;还可能引发系统崩溃。为了解决这些问题&#xff0c;小番茄C盘清理应运而生。它是一款专业的C盘清理软件&#xff0c;能…

【版本控制】Git 和 GitHub 入门教程

目录 0 引言1 Git与GitHub的诞生1.1 Git&#xff1a;Linus的“两周奇迹”&#xff0c;拯救Linux内核1.2 GitHub&#xff1a;为Git插上协作的翅膀1.3 协同进化&#xff1a;从工具到生态的质变1.4 关键历程时间轴&#xff08;2005–2008&#xff09; 2 Git与GitHub入门指南2.1 Gi…

Dify源码教程:账户和密码传递分析

概述 Dify系统中账户创建过程中的密码处理是Web应用安全的重要环节。本教程详细分析了从前端表单到后端存储的完整流程&#xff0c;展示了Dify如何安全地处理用户凭据。 前端部分 在 dify/web/app/install/installForm.tsx 文件中&#xff0c;当用户填写完表单并点击安装按钮…

window查看SVN账号密码

背景 公司的SVN地址发生迁移&#xff0c;想迁移一下本地SVN地址&#xff0c;后来发现SVN账号密码忘记了。写此文章纯记录。 迁移SVN地址&#xff1a; 找到svn目录点击relocate&#xff0c;输入新的svn地址&#xff0c;如需输入账号密码&#xff0c;输入账号密码即完成svn地址…

Read View在MVCC里如何工作

Read View的结构 Read View中有四个重要的字段&#xff1a; m_ids&#xff1a;创建 Read View 时&#xff0c;数据库中启动但未提交的「活跃事务」的事务 id 列表 。min_trx_id&#xff1a;创建 Read View 时&#xff0c;「活跃事务」中事务 id 最小的值&#xff0c;即 m_ids …

如何在mac上安装podman

安装 Podman 在 macOS 上 在 macOS 上安装 Podman 需要使用 Podman 的桌面客户端工具 Podman Desktop 或通过 Homebrew 安装命令行工具。 使用 Homebrew 安装 Podman&#xff1a; (base) ninjamacninjamacdeMacBook-Air shell % brew install podman > Auto-updating Hom…

QGraphicsView中鼠标点击与移动事件传递给MainWindow

在Qt图形应用程序开发中,QGraphicsView和QGraphicsScene框架提供了强大的2D图形显示功能。然而,当我们需要在主窗口(MainWindow)中处理这些视图中的鼠标事件。 问题背景 在典型的Qt图形应用程序架构中: MainWindow └── QGraphicsView└── QGraphicsScene└── QGra…

Spring Boot 缓存注解详解:@Cacheable、@CachePut、@CacheEvict(超详细实战版)

&#x1f4a1; 前言 在高并发、高性能的系统开发中&#xff0c;缓存是提升接口响应速度和降低数据库压力的重要手段。Spring Boot 提供了强大的缓存抽象层 —— spring-context-support&#xff0c;并结合 JSR-107 标准&#xff0c;提供了多个缓存注解&#xff0c;如&#xff…

vue中ref的详解以及react的ref对比

文章目录 1. ref是什么2. ref的使用3. ref的特性4. 使用场景5. 注意事项6. 与 React 的对比7. 动态 ref8. 函数式组件中的 ref9. 组合式 API 中的 ref10. 总结 1. ref是什么 ref 被用来给元素或子组件注册引用信息。引用信息将会注册在父组件的 $refs 对象上。可以通过实例对象…

通过ca证书的方式设置允许远程访问Docker服务

设置允许远程访问Docker服务 使用场景 环境 系统&#xff1a;anolis7.9 修改Docker服务配置&#xff0c;配置安全证书 生成ca证书到/etc/docker目录中&#xff0c;后续会要用到 #该步骤需要设置密码&#xff0c;后面步骤会要用到&#xff0c;此处设置密码为123456 openss…

Qt Quick Layout功能及架构

Qt Quick Layouts 是 Qt Quick 中用于管理用户界面布局的模块&#xff0c;在 Qt 6.0 中继续提供强大的布局管理功能。 一、主要功能 主要布局类型 RowLayout - 水平排列项目 ColumnLayout - 垂直排列项目 GridLayout - 网格排列项目 StackLayout - 堆叠项目&#xff08;一…