RAG:系统评估,以RAGAS为例

面试的时候经常会问到,模型和系统是怎么评估的,尤其是RAG,这么多组件,还有端到端,每部分有哪些指标评估,怎么实现的。今天整理下

目前最通用的是RAGAS框架,已经在langchain集成了。在看它之前,首先要了解整个业界是怎么做的。
在这里插入图片描述

通用评估框架

这部分是介绍RAG评估的综合层面,就是在每个RAG环节和系统上评估的指标。
基于RAG的组件,划分了三部分。要了解RAG 应用程序的性能是否在提高,必须对其进行定量评估。为此,需要两个要素:评估指标和评估数据集。
本文侧重于前者。

原贴
三个主要部分:检索、生成/幻觉和端到端。

1.检索部分

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里的AP其实就是下面的Context Precision。
在这里插入图片描述

2.生成/幻觉部分

基于n-gram的评估:如BLEU、ROUGE、METEOR等。
关于BLEU、ROUGE可以看https://blog.csdn.net/qq_43814415/article/details/141142750

基于模型的评估:如BERTScore、BARTScore等。

基于LLM的评估:如G-Eval、UniEval、GPTScore、TRUE、SelfCheckGPT、ChatProtect、Chainpoll等。
这部分可以看司南。

3.端到端部分

Ragas框架:评估上下文召回、上下文精度、上下文相关性、答案语义相似性、答案正确性、忠实度、答案相关性。
promptfoo框架:评估上下文依从性、上下文召回、上下文相关性、真实性、答案相关性。
RAG Triad框架:评估上下文相关性、答案相关性、扎实性。
ARES框架:评估上下文相关性、答案忠实度、答案相关性。
EXAM框架:评估上下文相关性。

RAGAS

RAGAs(Retrieval-Augmented Generation Assessment)是一个评估框架,文档。考虑检索系统识别相关和重点上下文段落的能力,LLM 以忠实方式利用这些段落的能力,以及生成本身的质量。

根据以上部分,RAGAS也考虑到了单独评估检索器和生成器,以及整个端到端系统的评估。

下面将分别介绍所需的数据集格式,评估指标,实际用例等。

1.数据集格式

最开始的 RAGAs 在评估数据集时,不必依赖人工标注的标准答案,而是通过底层的大语言模型 (LLM) 来进行评估。
所以只需要一个带有问题-答案对的评估数据集(QA 对),如:https://huggingface.co/datasets/m-ric/huggingface_doc
具体字段:

  1. question:作为 RAG 管道输入的用户查询。输入。
  2. answer:从 RAG 管道生成的答案。输出。
  3. contexts:从用于回答question外部知识源中检索的上下文。
  4. ground_truths:question的基本事实答案。这是唯一人工注释的信息。

2.评估指标(link)

分为组件级和系统级。
在这里插入图片描述

检索部分

包括Context Precision上下文精确度(相关性)、上下文召回率。
目前都由question、contexts、ground_truths计算。

1.Context Precision

评估是否所有和ground_truths(真实答案)相关的chunk被检索到而且排名很靠前。
在这里插入图片描述

计算方法:
1.对于检索到的上下文中的每个块,检查它是否相关或不相关,以得出给定问题的基本事实。
2.计算上下文中每个块的precision@k。(precision@k衡量在检索结果的前 k 个返回结果中,有多少比例是相关的。true positives@k:表示在前 k 个结果中,确实与查询相关的文档数量。)
3.计算 precision@k 的平均值,得出最终的上下文精度分数。

代码:

from datasets import Dataset 
from ragas.metrics import context_precision
from ragas import evaluatedata_samples = {'question': ['When was the first super bowl?', 'Who won the most super bowls?'],'answer': ['The first superbowl was held on Jan 15, 1967', 'The most super bowls have been won by The New England Patriots'],'contexts' : [['The First AFL–NFL World Championship Game was an American football game played on January 15, 1967, at the Los Angeles Memorial Coliseum in Los Angeles,'], ['The Green Bay Packers...Green Bay, Wisconsin.','The Packers compete...Football Conference']],'ground_truth': ['The first superbowl was held on January 15, 1967', 'The New England Patriots have won the Super Bowl a record six times']
}
dataset = Dataset.from_dict(data_samples)
score = evaluate(dataset,metrics=[context_precision])
score.to_pandas()
2.Context Recall

上下文召回衡量检索到的上下文(contexts)与标准答案(ground_truths)的匹配程度。
在这里插入图片描述

  • 分子:GT claims that can be attributed to context
    表示在标准答案(GT)中的论断中,有多少是可以归因于检索到的上下文的。换句话说,这些论断在检索到的上下文中找到了支持或依据。
  • 分母:Number of claims in GT 表示标准答案中论断的总数量。

计算方法:
1:将标准答案分解为单独的陈述。
2.对于每个基本实况陈述,验证它是否可以归因于检索到的上下文。
3.计算上下文召回率。

由大模型完成。

代码:

from datasets import Dataset 
from ragas.metrics import context_recall
from ragas import evaluatedata_samples = {'question': ['When was the first super bowl?', 'Who won the most super bowls?'],'answer': ['The first superbowl was held on Jan 15, 1967', 'The most super bowls have been won by The New England Patriots'],'contexts' : [['The First AFL–NFL World Championship Game was an American football game played on January 15, 1967, at the Los Angeles Memorial Coliseum in Los Angeles,'], ['The Green Bay Packers...Green Bay, Wisconsin.','The Packers compete...Football Conference']],'ground_truth': ['The first superbowl was held on January 15, 1967', 'The New England Patriots have won the Super Bowl a record six times']
}
dataset = Dataset.from_dict(data_samples)
score = evaluate(dataset,metrics=[context_recall])
score.to_pandas()

生成部分

Faithfulness(忠实度)和Answer relevancy (答案相关性)

1.Faithfulness

这个指标衡量生成答案与给定上下文之间的事实一致性。它是根据answer和context计算的。

如果答案中提出的所有声明都可以从给定的上下文中推断出来,则生成的答案被认为是真实的。

在这里插入图片描述

  • 分子:在生成的答案中,有多少论断(claims)是可以从给定的上下文推断出来的。
  • 分母:生成的答案中论断(claims)的总数量。这包括所有生成的论断,无论它们是否能够从给定的上下文推断出来。

计算方法:
1.将生成的答案分解为若干单独的陈述。
2.对于每个陈述,验证是否可以从给定的上下文中推断出它。
3.计算忠诚度。

代码:

from datasets import Dataset 
from ragas.metrics import FaithulnesswithHHEM
from ragas import evaluatefaithfulness_with_hhem = FaithulnesswithHHEM()
data_samples = {'question': ['When was the first super bowl?', 'Who won the most super bowls?'],'answer': ['The first superbowl was held on Jan 15, 1967', 'The most super bowls have been won by The New England Patriots'],'contexts' : [['The First AFL–NFL World Championship Game was an American football game played on January 15, 1967, at the Los Angeles Memorial Coliseum in Los Angeles,'], ['The Green Bay Packers...Green Bay, Wisconsin.','The Packers compete...Football Conference']],
}
dataset = Dataset.from_dict(data_samples)
score = evaluate(dataset,metrics=[faithfulness_with_hhem])
score.to_pandas()
2.答案相关性

侧重于评估生成的答案与给定提示的相关性。
分数越低,回答不完整或包含冗余信息,分数越高表示相关性越好。
该指标是使用question、context和answer计算得出的。

在这里插入图片描述
计算方法:
1.使用大型语言模型 (LLM) 从生成的答案中对问题的“n”个变体进行逆向工程。也就是根据answer反向推导出可能的n个问题。
2.计算生成的问题与实际问题之间的平均余弦相似度。

代码:

from datasets import Dataset 
from ragas.metrics import answer_relevancy
from ragas import evaluatedata_samples = {'question': ['When was the first super bowl?', 'Who won the most super bowls?'],'answer': ['The first superbowl was held on Jan 15, 1967', 'The most super bowls have been won by The New England Patriots'],'contexts' : [['The First AFL–NFL World Championship Game was an American football game played on January 15, 1967, at the Los Angeles Memorial Coliseum in Los Angeles,'], ['The Green Bay Packers...Green Bay, Wisconsin.','The Packers compete...Football Conference']],
}
dataset = Dataset.from_dict(data_samples)
score = evaluate(dataset,metrics=[answer_relevancy])
score.to_pandas()

端到端部分

Answer semantic similarity(答案语义相似性)和Answer Correctness(答案正确性)

1.Answer semantic similarity

答案语义相似性(Answer Semantic Similarity)的概念涉及评估answer与ground truth在语义上的相似程度。得分越高,表示生成答案与标准答案之间的语义匹配度越高。
这种评估使用交叉编码器模型(cross-encoder model)来计算语义相似性得分。

计算方法:
1.使用指定的嵌入模型对真值答案进行向量化。
2.使用相同的嵌入模型对生成的答案进行向量化。
3.计算两个向量之间的余弦相似度。

代码:

from datasets import Dataset 
from ragas.metrics import answer_similarity
from ragas import evaluatedata_samples = {'question': ['When was the first super bowl?', 'Who won the most super bowls?'],'answer': ['The first superbowl was held on Jan 15, 1967', 'The most super bowls have been won by The New England Patriots'],'ground_truth': ['The first superbowl was held on January 15, 1967', 'The New England Patriots have won the Super Bowl a record six times']
}
dataset = Dataset.from_dict(data_samples)
score = evaluate(dataset,metrics=[answer_similarity])
score.to_pandas()
2.Answer Correctness

答案正确性的评估涉及衡量answer与ground truth相比的准确性。

答案正确性包含两个关键方面:生成的答案与基本事实之间的语义相似性,以及事实相似性。使用加权方案将这些方面结合起来,以制定答案正确性分数。

语义相似性是上一个指标。
事实相似性量化了answer与ground truth之间的事实重叠,借用了混淆矩阵的概念:
TP(真阳性):存在于ground truth和answer中的事实或陈述。
FP(假阳性):存在于answer中但不存在于ground truth中的事实或陈述。
FN(假阴性):存在于ground truth中但不存在于answer中的事实或陈述。

然后根据F1值的公式得到事实相似性:
在这里插入图片描述
最后对事实相似性和语义相似性进行加权求和,得到答案正确性。

3.Domain Specific Evaluation

特定领域评估指标是一种基于评分量规的评估指标,用于评估模型在特定领域的性能。
评分标准由每个分数的描述组成,通常范围从 1 到 5。
使用评分标准中指定的描述使用 LLM 进行评分。

1.无参考的评估方法

from ragas import evaluate
from datasets import Dataset, DatasetDictfrom ragas.metrics import reference_free_rubrics_score, labelled_rubrics_scorerows = {"question": ["What's the longest river in the world?",],"ground_truth": ["The Nile is a major north-flowing river in northeastern Africa.",],"answer": ["The longest river in the world is the Nile, stretching approximately 6,650 kilometers (4,130 miles) through northeastern Africa, flowing through countries such as Uganda, Sudan, and Egypt before emptying into the Mediterranean Sea. There is some debate about this title, as recent studies suggest the Amazon River could be longer if its longest tributaries are included, potentially extending its length to about 7,000 kilometers (4,350 miles).",],"contexts": [["Scientists debate whether the Amazon or the Nile is the longest river in the world. Traditionally, the Nile is considered longer, but recent information suggests that the Amazon may be longer.","The Nile River was central to the Ancient Egyptians' rise to wealth and power. Since rainfall is almost non-existent in Egypt, the Nile River and its yearly floodwaters offered the people a fertile oasis for rich agriculture.","The world's longest rivers are defined as the longest natural streams whose water flows within a channel, or streambed, with defined banks.","The Amazon River could be considered longer if its longest tributaries are included, potentially extending its length to about 7,000 kilometers."],]
}dataset = Dataset.from_dict(rows)result = evaluate(dataset,metrics=[reference_free_rubrics_score,labelled_rubrics_score],
)

2.有参考的

from ragas.metrics.rubrics import LabelledRubricsScoremy_custom_rubrics = {"score1_description": "answer and ground truth are completely different","score2_description": "answer and ground truth are somewhat different","score3_description": "answer and ground truth are somewhat similar","score4_description": "answer and ground truth are similar","score5_description": "answer and ground truth are exactly the same",
}labelled_rubrics_score = LabelledRubricsScore(rubrics=my_custom_rubrics)

实践

暂时还没有实验过,找到了以下资料参考:

https://huggingface.co/learn/cookbook/zh-CN/rag_evaluation

https://docs.ragas.io/en/latest/concepts/testset_generation.html

https://towardsdatascience.com/evaluating-rag-applications-with-ragas-81d67b0ee31a#c52f

参考

1.https://towardsdatascience.com/evaluating-rag-applications-with-ragas-81d67b0ee31a#c52f
2.https://docs.ragas.io/en/latest/concepts/testset_generation.html
3.https://liduos.com/how-to-evaluate-rag-application.html
4.https://myscale.com/blog/zh/ultimate-guide-to-evaluate-rag-system/

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

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

相关文章

Java面试--设计模式

设计模式 目录 设计模式1.单例模式?2.代理模式?3.策略模式?4.工厂模式? 1.单例模式? 单例模式是Java的一种设计思想,用此模式下,某个对象在jvm只允许有一个实例,防止这个对象多次引…

文本分类任务算法演变(一)

文本分类任务算法演变 1.简介和应用场景1.1使用场景-打标签1.2使用场景-电商评论分析1.3使用场景-违规检测1.4使用场景-放开想象空间 2贝叶斯算法2.1预备知识-全概率公式2.2贝叶斯公式2.3文本分类中的应用2.3.1任务如下 2.4贝叶斯的优缺点 3.支持向量机3.1支持向量机-决策函数3…

libnl教程(2):发送请求

文章目录 前言示例示例代码构造请求创建套接字发送请求 简化示例 前言 前置阅读要求:libnl教程(1):订阅内核的netlink广播通知 本文介绍,libnl如何向内核发送请求。这包含三个部分:构建请求;创建套接字;发送请求。 …

Web开发:web服务器-Nginx的基础介绍(含AI文稿)

目录 一、Nginx的功能: 二、正向代理和反向代理的区别 三、Nginx负载均衡的主要功能 四、nginx安装目录下的各个文件(夹)的作用: 五、常用命令 一、Nginx的功能: 1.反向代理:例如我有三台服务器&#x…

大数据项目——实战项目:广告数仓(第二部分)集群环境部署

目录 第4章 广告数仓架构设计 第5章 集群环境准备 5.1 服务器准备 5.1.1 创建3台虚拟机 5.1.2 SSH无密登录配置 5.1.3 编写集群分发脚本xsync 5.1.4 JDK准备 5.1.5 环境变量配置说明 5.2 Hadoop部署 5.2.1 完全分布式运行模式(开发重点) 5.2…

去噪、梯度与边缘检测

图像噪点消除 噪声在图像处理中指的是图像中出现的干扰因素,通常由采集设备或传输过程引起。噪声使得图像的亮度变得不均匀或引入了随机的干扰点。常见的噪声类型包括: 高斯噪声:符合正态分布的噪声,会使图像变得模糊或出现噪点。…

Java基础之switch分支语句

switch分支语句 ​ switch语句也称为分支语句,其和if语句有点类似,都是用来判断值是否相等,但switch默认只支持byte、short、int、char这四种类型的比较,JDK8中也允许String类型的变量做对比。 语法: switch (表达式…

8.15 哈希表中等 139 Word Break review 467 Unique Substrings in Wraparound String

139 Word Break【逐一对比vs.多种 分割 组合】 片面思考的思路&#xff1a; class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {//字符串和对应的字典&#xff0c;如果s种可以用空格分隔出一个或多个字典里的词就返回true//核心&#x…

windows 安装TVM

TVM支持在Windows环境下使用&#xff0c;但需要一些额外的配置。以下是如何在Windows Python环境中安装TVM的详细步骤。 1. 安装TVM的预备条件 在Windows上安装TVM之前&#xff0c;需要确保系统已经安装了以下工具和依赖项&#xff1a; Visual Studio: 安装包含C开发工具的V…

利用ZXing.Net Bindings for EmguCV识别条形码及绘制条形码边框17(C#)

上一篇博文&#xff1a;绘制条形码的效果不是很好&#xff1a;利用Emgucv绘制条形码边框16(C#)-CSDN博客 测试环境&#xff1a; win11 64位操作系统 visual studio 2022 ZXing.Net.Bindings.EmguCV 0.16.4 测试步骤如下&#xff1a; 1 新建.net framework 4.8的控制台项目…

Linux日常运维-主机名hosts

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 本小章内容就是Linux进阶部分的日常运维部分&#xff0c;掌握这些日常运维技巧或者方法在我们的日常运维过程中会带来很多方…

【Vue3】嵌套路由

【Vue3】嵌套路由 背景简介开发环境开发步骤及源码 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日子。本文内…

【Linux】缓冲区和文件系统

目录 一、缓冲区 1.1 概念 1.2 用户缓冲区和内核缓冲区 二、磁盘的结构 三、文件系统 3.1 初识“块”和inode 3.2 磁盘分区和文件系统 一、缓冲区 1.1 概念 要理解什么是缓冲区&#xff0c;先看这段代码 #include <stdio.h> #include <string.h> #includ…

Linux系统驱动(十八)SPI总线(未整理)

文章目录 一、SPI总线协议简介二、SPI子系统驱动&#xff08;二&#xff09;SPI子系统API&#xff08;三&#xff09;SPI设备树节点 三、代码示例 一、SPI总线协议简介 高速、同步、全双工、非差分、总线式 传输速度在几十M 差分总线和非差分总线 非差分总线&#xff1a;受压…

江协科技STM32学习笔记(第13章 WDG看门狗)

第13章 WDG看门狗 13.1 WDG看门狗 13.1.1 WDG简介 看门狗就是程序运行的一个保障措施&#xff0c;我们得在程序中定期地喂狗&#xff0c;如果程序卡死了&#xff0c;没有在规定的时间里喂狗&#xff0c;那么看门狗硬件电路就会自动帮我们复位一下&#xff0c;防止程序长时间…

最新爆火文生图模型FLUX

在AI图片生成领域&#xff0c;Flux模型的推出引起了广泛关注。随着AI技术的不断进步&#xff0c;新的模型层出不穷&#xff0c;而Flux正是其中的一颗新星。 Flux&#xff1a;一款迅速走红的AI图片生成模型 8月初&#xff0c;初创公司Black Forest Labs推出了文本生成图像模型…

米联客-FPGA程序设计Verilog语法入门篇连载-10 Verilog语法_一般设计规范

软件版本&#xff1a;无 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用所有系列FPGA 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑&#xff01; 1概述 本小节讲解Verilog语法的一般…

合并两个有序数组(LeetCode)

题目 给你两个按 非递减顺序 排列的整数数组 和 &#xff0c;另有两个整数 和 &#xff0c;分别表示 和 中的元素数目。请你 合并 到 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&#xff0c;合并后数组不应由函数返回&#xff0c;而是…

Docker最佳实践进阶(一):Dockerfile介绍使用

大家好&#xff0c;上一个系列我们使用docker安装了一系列的基础服务&#xff0c;但在实际开发过程中这样一个个的安装以及繁杂命令不仅仅浪费时间&#xff0c;更是容易遗忘&#xff0c;下面我们进行Docker的进阶教程&#xff0c;帮助我们更快速的部署和演示项目。 一、什么是…

【初阶数据结构】通讯录项目(可用作课程设计)

文章目录 概述1. 通讯录的效果2. SeqList.h3. Contact.h4. SeqList.c5. Contact.c6. test.c 概述 通讯录项目是基于顺序表这个数据结构来实现的。如果说数组是苍蝇小馆&#xff0c;顺序表是米其林的话&#xff0c;那么通讯录就是国宴。 换句话说&#xff0c;通讯录就是顺序表…