LLM之RAG实战(三十二)| 使用RAGAs和LlamaIndex评估RAG

       在之前的文章中,我们介绍了RAG的基本流程和各种优化方法(query重写,语义分块策略以及重排序等)。那么,如果发现现有的RAG不够有效,该如何评估RAG系统的有效性呢?

       在本文中,我们将介绍RAG评估框架RAGAs[1],并使用RAGAs+LlamaIndex来实现整个RAG评估过程。

一、RAG评估指标

       简单地说,RAG的过程包括三个主要部分:输入查询、检索的上下文和LLM生成的响应。这三个元素构成了RAG过程中最重要的三元组,并且是相互依存的。

       因此,RAG的有效性可以通过测量这些三元组之间的相关性来评估,如图1所示:

       论文《RAGAS: Automated Evaluation of Retrieval Augmented Generation》[1]提到了3个RAG评估指标:1)可信度(Faithfulness)、2)答案相关性(Answer Relevance)和3)上下文相关性(Context Relevance),这些指标不需要人工标注数据集或参考答案。

       此外,RAGAs网站[2]还引入了两个指标:上下文精度(Context Precision)和上下文召回(Context Recall)。

1.1 可信度/忠诚度

       可信度是指确保答案是基于给定的上下文生成的。这对于避免幻觉和确保检索到的上下文可以用作生成答案是非常重要的。如果得分较低,则表明LLM的响应不符合检索到的知识,这样提供幻觉答案的可能性增加。例如:

       为了评估可信度,我们首先使用LLM来提取一组语句S(a(q)),方法是使用以下提示:

Given a question and answer, create one or more statements from each sentence in the given answer.question: [question]answer: [answer]

       在生成S(a(q))之后,LLM确定是否可以从c(q)推断出每个语句si。使用以下提示执行此验证步骤:

Consider the given context and following statements, then determine whether they are supported by the information present in the context. Provide a brief explan ation for each statement before arriving at the verdict (Yes/No). Provide a final verdict for each statement in order at the end in the given format. Do not deviate from the specified format.statement: [statement 1]...statement: [statement n]

      最终可信度分数F计算为F=|V|/|S|,其中|V|表示根据LLM支持的语句数,|S|表示语句总数。

1.2 答案相关性

      答案相关性衡量的是生成答案和查询之间的相关性。得分越高表示相关性越好。例如:

       为了估计答案的相关性,我们提示LLM基于给定的答案a(q)生成n个潜在问题qi,如下所示:

Generate a question for the given answer.answer: [answer]

       然后,我们利用文本嵌入模型来获得所有问题的嵌入。对于每个qi,我们计算与原始问题q的相似性sim(q,qi),相似性计算可以使用嵌入之间的余弦相似性,计算问题q的答案相关性得分AR,如下图公式所示:

1.3 上下文相关性

       上下文相关性是一个衡量检索质量的指标,主要评估检索到的上下文支持查询的程度。得分低表示检索到大量不相关的内容,这可能会影响LLM生成的最终答案。例如:

       为了估计上下文的相关性,使用LLM从上下文(c(q))中提取一组关键句子(Sext)。这些句子对回答问题至关重要。提示如下:

Please extract relevant sentences from the provided context that can potentially help answer the following question. If no relevant sentences are found, or if you believe the question cannot be answered from the given context, return the phrase "Insufficient Information". While extracting candidate sentences you’re not allowed to make any changes to sentences from given context.

        在RAGAs中,使用以下公式计算句子级别的相关性:

1.4 上下文召回

       该指标衡量检索到的上下文和标注答案之间的一致性水平。它是使用基本事实和检索到的上下文来计算的,值越高表示性能越好。例如:

该评估方法需要提供标注数据。

          计算公式如下:

1.5 上下文精度

       该度量相对复杂,用于衡量检索到的包含真实事实的所有相关上下文是否排名靠前。分数越高表示精度越高。

       该指标的计算公式如下:

       上下文精度的优势在于它能够感知排名效果。然而,它的缺点是,如果相关召回很少,但都排名很高,那么分数也会很高。因此,有必要结合其他几个指标来考虑整体效果。

二、使用RAGAs+LlamaIndex进行RAG评估

        主要流程如图6所示:

2.1 环境配置

        使用pip安装ragas,并检查当前版本。

(py) Florian:~ Florian$ pip list | grep ragasragas                        0.0.22

如果您使用pip-install-git+https://github.com/explodinggradients/ragas.git安装最新版本(v0.1.0rc1),但该版本不支持LlamaIndex。

        然后,导入相关库,设置环境和全局变量

import osos.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_KEY"dir_path = "YOUR_DIR_PATH"from llama_index import VectorStoreIndex, SimpleDirectoryReaderfrom ragas.metrics import (    faithfulness,    answer_relevancy,    context_relevancy,    context_recall,    context_precision)from ragas.llama_index import evaluate

        目录指定的是论文《TinyLlama: An Open-Source Small Language Model》[3]PDF文件。

(py) Florian:~ Florian$ ls /Users/Florian/Downloads/pdf_test/tinyllama.pdf

2.2 使用LlamaIndex构建一个简单的RAG查询引擎

documents = SimpleDirectoryReader(dir_path).load_data()index = VectorStoreIndex.from_documents(documents)query_engine = index.as_query_engine()

      LlamaIndex默认情况下使用OpenAI模型,LLM和嵌入模型可以使用ServiceContext轻松配置。

构建评估数据集

       由于有些指标需要手动标注数据集,下面是一些问题及其相应的答案的示例:

eval_questions = [    "Can you provide a concise description of the TinyLlama model?",    "I would like to know the speed optimizations that TinyLlama has made.",    "Why TinyLlama uses Grouped-query Attention?",    "Is the TinyLlama model open source?",    "Tell me about starcoderdata dataset",]eval_answers = [    "TinyLlama is a compact 1.1B language model pretrained on around 1 trillion tokens for approximately 3 epochs. Building on the architecture and tokenizer of Llama 2, TinyLlama leverages various advances contributed by the open-source community (e.g., FlashAttention), achieving better computational efficiency. Despite its relatively small size, TinyLlama demonstrates remarkable performance in a series of downstream tasks. It significantly outperforms existing open-source language models with comparable sizes.",    "During training, our codebase has integrated FSDP to leverage multi-GPU and multi-node setups efficiently. Another critical improvement is the integration of Flash Attention, an optimized attention mechanism. We have replaced the fused SwiGLU module from the xFormers (Lefaudeux et al., 2022) repository with the original SwiGLU module, further enhancing the efficiency of our codebase. With these features, we can reduce the memory footprint, enabling the 1.1B model to fit within 40GB of GPU RAM.",      "To reduce memory bandwidth overhead and speed up inference, we use grouped-query attention in our model. We have 32 heads for query attention and use 4 groups of key-value heads. With this technique, the model can share key and value representations across multiple heads without sacrificing much performance",    "Yes, TinyLlama is open-source",    "This dataset was collected to train StarCoder (Li et al., 2023), a powerful opensource large code language model. It comprises approximately 250 billion tokens across 86 programming languages. In addition to code, it also includes GitHub issues and text-code pairs that involve natural languages.",]eval_answers = [[a] for a in eval_answers]

指标选择和RAGA评估

metrics = [    faithfulness,    answer_relevancy,    context_relevancy,    context_precision,    context_recall,]result = evaluate(query_engine, metrics, eval_questions, eval_answers)result.to_pandas().to_csv('YOUR_CSV_PATH', sep=',')

       请注意,默认情况下,在RAGA中,使用OpenAI模型。

        在RAGAs中,如果您想使用另一个LLM(如Gemini)来使用LlamaIndex进行评估,即使在调试了RAGAs的源代码后,我也没有在版本0.0.22中找到任何有用的方法。

2.3 最终代码

import osos.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_KEY"dir_path = "YOUR_DIR_PATH"from llama_index import VectorStoreIndex, SimpleDirectoryReaderfrom ragas.metrics import (    faithfulness,    answer_relevancy,    context_relevancy,    context_recall,    context_precision)from ragas.llama_index import evaluatedocuments = SimpleDirectoryReader(dir_path).load_data()index = VectorStoreIndex.from_documents(documents)query_engine = index.as_query_engine()eval_questions = [    "Can you provide a concise description of the TinyLlama model?",    "I would like to know the speed optimizations that TinyLlama has made.",    "Why TinyLlama uses Grouped-query Attention?",    "Is the TinyLlama model open source?",    "Tell me about starcoderdata dataset",]eval_answers = [    "TinyLlama is a compact 1.1B language model pretrained on around 1 trillion tokens for approximately 3 epochs. Building on the architecture and tokenizer of Llama 2, TinyLlama leverages various advances contributed by the open-source community (e.g., FlashAttention), achieving better computational efficiency. Despite its relatively small size, TinyLlama demonstrates remarkable performance in a series of downstream tasks. It significantly outperforms existing open-source language models with comparable sizes.",    "During training, our codebase has integrated FSDP to leverage multi-GPU and multi-node setups efficiently. Another critical improvement is the integration of Flash Attention, an optimized attention mechanism. We have replaced the fused SwiGLU module from the xFormers (Lefaudeux et al., 2022) repository with the original SwiGLU module, further enhancing the efficiency of our codebase. With these features, we can reduce the memory footprint, enabling the 1.1B model to fit within 40GB of GPU RAM.",      "To reduce memory bandwidth overhead and speed up inference, we use grouped-query attention in our model. We have 32 heads for query attention and use 4 groups of key-value heads. With this technique, the model can share key and value representations across multiple heads without sacrificing much performance",    "Yes, TinyLlama is open-source",    "This dataset was collected to train StarCoder (Li et al., 2023), a powerful opensource large code language model. It comprises approximately 250 billion tokens across 86 programming languages. In addition to code, it also includes GitHub issues and text-code pairs that involve natural languages.",]eval_answers = [[a] for a in eval_answers]metrics = [    faithfulness,    answer_relevancy,    context_relevancy,    context_precision,    context_recall,]result = evaluate(query_engine, metrics, eval_questions, eval_answers)result.to_pandas().to_csv('YOUR_CSV_PATH', sep=',')

      请注意,在终端中运行程序时,pandas数据框可能无法完全显示。要查看它,可以将其导出为CSV文件,如图7所示:

       从图7中可以明显看出,第四个问题“Tell me about starcoderdata dataset”全部为0,这是因为LLM无法提供答案。第二个和第三个问题的上下文精度为0,表明检索到的上下文中的相关上下文没有排在最前面。第二个问题的上下文调用为0,表示检索到的上下文与标注答案不匹配。

       现在,让我们研究问题0到3。这些问题的答案相关性得分很高,表明答案与问题之间有很强的相关性。此外,忠实度得分并不低,这表明答案主要是从上下文中得出或总结的,可以得出结论,答案不是由于LLM的幻觉而产生的。

      此外,我们发现,尽管我们的上下文相关性得分较低,gpt-3.5-turb-16k(RAGA的默认模型)仍然能够从中推断出答案。

      基于这些结果,很明显,这个基本的RAG系统仍有很大的改进空间。

三、结论

       一般来说,RAGAs为评估RAG提供了全面的评估指标,调用比较方便。

       在调试了RAGAs的内部源代码后,发现RAGAs仍处于早期开发阶段。我们对其未来的更新和改进持乐观态度。

参考文献:

[1] https://arxiv.org/pdf/2309.15217.pdf

[2] https://docs.ragas.io/en/latest/concepts/metrics/index.html

[3] https://arxiv.org/pdf/2401.02385.pdf

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OJ_汉诺塔问题

有三根柱子和一些大小不同的圆盘,开始时所有的圆盘都按照从小到大的顺序堆叠在柱子A上,要求把所有的圆盘移动到柱子C上,但是移动过程中要满足以下规则: 每次只能移动一个圆盘。不能将一个较大的圆盘放在较小的圆盘上面。 #incl…

【工具】Docker 入门及常用指令

SueWakeup 个人主页:SueWakeup 系列专栏:为祖国的科技进步添砖Java 个性签名:保留赤子之心也许是种幸运吧 目录 1. 什么是 Docker ? 2. Docker 安装 3. Docker 镜像 4. Docker 容器 4.1 运行容器 4.2 查看正在运行的容器 4…

leetcode 714

leetcode 714 题目 例子 思路1 使用dp[n][2] 存储最佳利润值,动态规划的思路,重要的是转移方程。 代码1 class Solution { public: int maxProfit(vector& prices, int fee) { int n prices.size(); //dp[i][0] 前i天手里没有股票的最大利润 //…

Spring Bean的生命周期流程

前言 Java 中的公共类称之为Java Bean,而 Spring 中的 Bean 指的是将对象的生命周期,交给Spring IoC 容器来管理的对象。所以 Spring 中的 Bean 对象在使用时,无需通过 new 来创建对象,只需要通过 DI(依赖注入&#x…

使用光标精灵更换电脑鼠标光标样式,一键安装使用

想要让自己在使用电脑时更具个性化,让工作和娱乐更加愉快,改变你的电脑指针光标皮肤可能是一个简单而有效的方法。很多人或许并不清楚如何轻松地调整电脑光标样式,下面我就来分享一种简单的方法。 电脑光标在系统里通常只有几种默认图案&…

一次性支持 200 万字无损上下文!Kimi智能助手玩了个大的——月之暗面「登月」最新进展!

让大模型一次性无损地「吃下」一本书已经不是什么稀奇的事了,但如果我告诉你是下面👇🏻这样一本近百万字的书呢? 没错,这么疯狂的事竟然真的发生了——就在昨天月之暗面(Moonshot AI)召集了一次…

mysql 更新时,旧值与新值相同会怎么做?

文章目录 1 问题描述2 验证2.1 验证猜想12.2 验证猜想2 3 结论4 mysql 为什么这么设计呢? 1 问题描述 创建一张表t,插入一行数据 mysql> CREATE TABLE t ( id int(11) NOT NULL primary key auto_increment, a int(11) DEFAULT NULL ) ENGINEInnoDB…

9.登入页面

登入页面 在pages中新建页面login 修改代码 <template><view></view> </template><script setup></script><style lang"scss"></style>添加头像组件 官网 https://vkuviewdoc.fsq.pub/components/avatar.html …

vue:功能【xlsx】动态行内合并

场景&#xff1a;纯前端导出excel数据&#xff0c;涉及到列合并、行合并。 注&#xff09;当前数据表头固定&#xff0c;行内数据不固定。以第一列WM为判断条件&#xff0c;相同名字的那几行数据合并单元格。合并的那几行数据&#xff0c;后面的列按需求进行合并。 注&#x…

github 如何关闭 2FA

一开始按照各种教程都找不到&#xff0c;新版的太小了&#xff0c; https://github.com/settings/security

HTML实现卷轴动画完整源码附注释

动画效果截图 页面的html结构代码 <!DOCTYPE html> <html> <head lang=

【Maven入门篇】(3)依赖配置,依赖传递,依赖范围,生命周期

&#x1f38a;专栏【Maven入门篇】 &#xfeff;> &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#xfeff;> &#x1f386;音乐分享【The truth that you leave】 &#xfeff;> &#x1f970;欢迎并且感谢大家指出我的问题 文章目录 &…

(四)Android布局类型(线性布局LinearLayout)

线性布局&#xff08;LinearLayout&#xff09;&#xff1a;按照一定的方向排列组件&#xff0c;方向主要分为水平方向和垂直方向。方向的设置通过属性android:orientation设置 android:orientation 其取值有两种 水平方向&#xff1a;android:orientation"horizontal&…

【精品】递归查询数据库 获取树形结构数据 通用方法

数据库表结构 实体类基类 Getter Setter ToString public class RecursionBean {/*** 编号*/private Long id;/*** 父权限ID&#xff0c;根节点的父权限为空*/JsonIgnoreprivate Long pid;private List<? extends RecursionBean> children;/*** 递归查询子节点** param…

申请双软认证需要哪些材料?软件功能测试报告怎么获取?

“双软认证”是指软件产品评估和软件企业评估&#xff0c;其中需要软件测试报告。 企业申请双软认证除了获得软件企业和软件产品的认证资质&#xff0c;同时也是对企业知识产权的一种保护方式&#xff0c;更可以让企业享受国家提供给软件行业的税收优惠政策。 那么&#xff0c;…

奇舞周刊第522期:“Vite 又开始搞事情了!!!”

奇舞推荐 ■ ■ ■ Vite 又开始搞事情了&#xff01;&#xff01;&#xff01; Vite 的最新版本将引入一种名为 Rolldown 的新型打包工具。 unocss 究竟比 tailwindcss 快多少&#xff1f; 我们知道 unocss 很快&#xff0c;也许是目前最快的原子化 CSS 引擎 (没有之一)。 巧用…

Flink:使用 Faker 和 DataGen 生成测试数据

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

Linux 发布项目到OpenEuler虚拟机

后端&#xff1a;SpringBoot 前端&#xff1a;VUE3 操作系统&#xff1a;Linux 虚拟机&#xff1a;OpenEuler 发布项目是需要先关闭虚拟机上的防火墙 systemctl stop firewalld 一、运行后端项目到虚拟机 1、安装JDK软件包 查询Jdk是否已安装 dnf list installed | grep jd…

力扣每日一题 好子数组的最大分数 单调栈 双指针

Problem: 1793. 好子数组的最大分数 &#x1f496; 单调栈 思路 &#x1f468;‍&#x1f3eb; 参考题解 以当前高度为基准&#xff0c;寻找最大的宽度组成最大的矩形面积那就是要找左边第一个小于当前高度的下标left&#xff0c;再找右边第一个小于当前高度的下标right那宽…

Linux 磁盘的一生

注意&#xff1a;实验环境都是使用VMware模拟 ​ 磁盘接口类型这里vm中是SCSI&#xff0c;扩展sata,ide(有时间可以看看或者磁盘的历史) ​ 总结&#xff1a;磁盘从有到无—类似于建房子到可以住 ————————————————————————————————————…