当前位置: 首页 > article >正文

工程化RAG-无法评估,就无法改进

工程化RAG-无法评估,就无法改进

  • 一、问题的出现
  • 二、RAG流程
  • 三、评价RAG的要素
  • 四、评价前准备
  • 五、工程化创造测试集
  • 六、评估维度
    • 1、答案相似度(Answer semantic similarity)
    • 2、忠诚度(Faithfulness)
    • 3、答案相关度(Answer Relevance)
  • 七、实战
  • 八、写在最后

“向量检索的时候,我得切分长一点”
“这个提示语不好用,我得改一下"

对于RAG,这些可能都对,也可能不对。这在于你是否有有正确的改进方向。

一个无法评估的系统,就无法改良。

一、问题的出现

RAG有两个主要模块:

  1. 检索信息
  2. LLM回答

检索信息会涉及切分的方式方法,以及多种召回策略的设计。
LLM回答会涉及提示词的改进以及模型的选择。

为什么需要测评? 如果我们不能测评一个系统是好还是坏,我们就无法改进它,所以在做任何工程的时候,都需要先做好评估准则。

今天我们只关注LLM回答部分的测评,期待找到合适的模型、超参数(比如温度)以及调优的提示词。

关于模型原理的理解以及模型的能力区别我都在之前的文章做了介绍:
1.大话AI模型:无需数学知识,掌握LLM原理
2.啊!这就是为什么不要微调!

二、RAG流程

RAG的流程一共分为三步:

在这里插入图片描述

1.用户提出问题,比如:爱因斯坦是谁?

2.通过检索的方法可以获取到相关的信息片段,比如:

片段1: 阿尔伯特·爱因斯坦,是出生于德国、拥有瑞士和美国国籍的犹太裔理论物理学家,他创立了现代物理学的两大支柱的相对论及量子力学,也是质能等价公式的发现者。
片段2: 爱因斯坦在科学哲学领域颇具影响力。因为“对理论物理的贡献,特别是发现了光电效应的原理”,他荣获1921年度的诺贝尔物理学奖
片段3: 爱因斯坦发现为量子理论的建立踏出了关键性的一步。

3.让大模型进行总结,比如提示词如下:

只根据一下资料,回答用户的问题:“爱因斯坦是谁?”
注意,不要自己发挥,一定要按照相关资料进行回答。
	<相关资料>
	片段1: 阿尔伯特·爱因斯坦,是出生于德国、拥有瑞士和美国国籍的犹太裔理论物理学家,他创立了现代物理学的两大支柱的相对论及量子力学,也是质能等价公式的发现者。
	片段2: 爱因斯坦在科学哲学领域颇具影响力。因为“对理论物理的贡献,特别是发现了光电效应的原理”,他荣获1921年度的诺贝尔物理学奖
	片段3: 爱因斯坦发现为量子理论的建立踏出了关键性的一步。
	</相关资料>

模型回答如下:

阿尔伯特·爱因斯坦是出生于德国、拥有瑞士和美国国籍的犹太裔理论物理学家,他创立了现代物理学的两大支柱的相对论及量子力学,也是质能等价公式的发现者。他在科学哲学领域颇具影响力,因“对理论物理的贡献,特别是发现了光电效应的原理”,荣获1921年度的诺贝尔物理学奖。此外,爱因斯坦发现为量子理论的建立踏出了关键性的一步。

三、评价RAG的要素

评估RAG一共需要这些内容:
1.用户提出的问题:question
2.检索的所有信息称为context,组成context得每一个信息片段叫做trunk,上边的三个片段,可以称为trunk1,trunk2,trunk3.
3.模型生成的答案:response
4.除了上边三个部分,还需要一个最重要的组成部分,标准答案:golden_answer。因为只有有了标准答案,才能进行测评呀。它是整个系统改进的方向。

总结RAG测评的内容有: question , context , response , golden_answer (其中response是我们要对其进行评估的)

四、评价前准备

首先,你肯定有个场景吧,比如:根据患者症状,进行中成药推荐。
其次,对于这个场景,你肯定有相应的数据,比如中成药说明书的数据。
有了以上两个步骤的铺垫,我们要开始准备标准测试集合了。

你需要有至少100个高质量的测试题,其中每一个测试题都要包括:question,context,golden_answer.

不要自己去写每一个标准测试问题和标准答案,那个太麻烦了。而且效率太低了。

五、工程化创造测试集

第一步,根据你的测试数据,直接要求AI创造150个问题,然后让专业的同事选取符合我们场景最优的100个题,提示词类似这样:

你现在是在药房门店工作,你的任务是根据患者的症状,进行一下中成药的推荐。
根据给出的资料,创建150个用户可能会问到的问题:
<相关资料>xxx</相关资料>

这里边的关键是:你得有个擅长业务场景的同事

第二步,根据选择最优的问题,去向量库中去查询30条相关的数据,然后让业务同事删除10条左右没啥关系的数据。因为重点不在检索,所以人工去挑选相关的数据就可以。

第三步,根据question和context让LLM生成答案。(这里一定要选一个最强的模型,别怕花钱,因为你在产生数据资产。)

第四步,让专业的同事进行审核和修改。形成最终标准答案。

这个流程有几个关键点:
1.一定一定要有一个专业的业务同学帮忙
2.最好将“生成问题”、“选择context”以及“生成答案”几个步骤都分开来做,不要一次性将他们全部生成,因为LLM是概率模型,一次性把他们都生成的效果不好。

这些流程都需要大量的人工参与,所以:人工智能,人工智能,人工越多,就越智能。

六、评估维度

1、答案相似度(Answer semantic similarity)

如果一段话与一段话的相似度比较高,他们在语言含义上的表达就是比较类似的。
比如:

句子1: 阿尔伯特·爱因斯坦的相对论彻底改变了我们对宇宙的理解。
句子2:爱因斯坦开创性的相对论改变了我们对宇宙的理解。
句子3:艾萨克·牛顿运动定律极大地影响了经典物理学。

其中句子1和句子2表达的含义内容就比较类似,所以句子1和句子2的相似度就比较高。
相反,句子1与句子3的表达上就不是很接近,他们的相似度就比较低。

那这个指标可以用于生成答案response与标准答案golden_answer之间的比较,如果相似度比较高,就可以认为生成的答案response与标准答案golden_answer表达的含义上是类似的。

所以,这个分值越高,说明越符合我们的标准答案。

2、忠诚度(Faithfulness)

大模型最大的问题就是总出现胡说八道的现象(也称为幻觉)。
我们希望大模型的输出都源于我们给的信息片段,当然这也是我们做RAG的目的。
所以我们需要判断,是否生成的答案都是源于context的。

可以这样做,让LLM根据原始问题question以及生成的答案response,把response拆分成一个个的陈述句,比如:

问题:阿尔伯特·爱因斯坦是谁,他最出名的是什么?
答案:他是一位出生于德国的理论物理学家,被广泛认为是历史上最伟大和最有影响力的物理学家之一。他最出名的是发展了相对论,他还对量子力学理论的发展做出了重要贡献。
陈述:
    <陈述>阿尔伯特·爱因斯坦,一位出生于德国的理论物理学家,因其对历史上最有影响力的物理学家的贡献而闻名。</陈述>
    <陈述>阿尔伯特·爱因斯坦最出名的是他的相对论。</陈述>
    <陈述>爱因斯坦的贡献极大地推动了量子力学领域的发展。</陈述>
    <陈述>在全球范围内得到认可,爱因斯坦的工作对科学界产生了深远的影响。</陈述>
    <陈述>爱因斯坦的开创性理论继续塑造着我们今天对物理学的理解。</陈述>

然后让LLM对每一个陈述进行观察,看是否可以从context推导出来,如果可以,标为1,不可以标为0.提示语大概是这样的:

我的资料是:<context>xxx</context>
 我的陈述可以从context中推导出来吗,如果可以,标为1,不可以标为0。我的陈述如下:
 <陈述>阿尔伯特·爱因斯坦,一位出生于德国的理论物理学家,因其对历史上最有影响力的物理学家的贡献而闻名。</陈述>
<陈述>阿尔伯特·爱因斯坦最出名的是他的相对论。</陈述>
<陈述>爱因斯坦的贡献极大地推动了量子力学领域的发展。</陈述>
<陈述>在全球范围内得到认可,爱因斯坦的工作对科学界产生了深远的影响。</陈述>
<陈述>爱因斯坦的开创性理论继续塑造着我们今天对物理学的理解。</陈述>

最终会输出为[1,1,1,1,1,]一共有5条,每个陈述句都可以通过context导出,所以忠诚度是1=(1+1+1+1+1)/5.
换一个题目,如果陈述句有3条,输出是[1,0,0],那答案是多少? 对了,忠诚度是0.33=(1+0+0)/3

3、答案相关度(Answer Relevance)

其实我们特别希望答案reponse回答的恰到好处,最好不要缺少信息,或者没有大量的废话,最好回答的答案和问题是直接相关的。

比如有这样一个问题question:

感冒了,给我推荐三种中成药?

标准答案是golden_answer:

感康、感冒灵,板蓝根这三种药都是治疗感冒不错的选择

如果response是:

感康治疗感冒的效果比较好。

你会发现,答案相似度不低,因为他们都表达的是一样的语义信息:都是治疗感冒的药品是什么。而且忠诚度应该也不低,毕竟context中一定是有这些信息的。

但是它在回答的时候,缺少了一些信息:“3种中成药”。

这时候就要判断这个指标了:答案相关度(Answer Relevance)

它的假设是这样的:如果生成的答案response真的回答了原始问题question,那么通过答案生成几个问题,这几个问题的相似度应该和question差不多。

比如我的问题是:

法国位于哪里,它的首都是什么?

我的答案是:

法国位于西欧,巴黎是其首都。

通过答案生成的问题是:

问题1:“法国位于欧洲的哪个部分?”  
问题2:“法国在欧洲的地理位置是什么?”  
问题3:“你能确定法国位于欧洲的哪个地区吗?”

将这些生成的问题都于原始问题进行相似度的计算,然后求一个平均值,这就是答案相关度(Answer Relevance)了。

七、实战

理解了这三个指标之后,如何进行实操呢?
其实,不用咱们自己动手去写一个测评程序,是有开源的选择的。
我深度使用过Ragas,实战效果非常好,强力推荐给大家。
(可以快速将Ragas的评估模型配置成国内模型,比如:GLM,DeepSeek等。)

Ragas文档: https://docs.ragas.io/en/stable/concepts/metrics/available_metrics/

八、写在最后

通过这三个指标的指引,我们可以对提示语进行调整,对温度等参数进行调整了。
AI目前最难的点就是工程化落地,而工程化落地是真的需要评估和改进的。
因为真理就是:一个系统不能评估,就没有办法改进!

(文章原创,我花费大量时间,希望你在AI实施的过程中少走弯路,可以将AI工程化。 如果对你有帮助,帮我点赞、转发。这将是我最大的动力。万分感谢!!)


http://www.kler.cn/a/409799.html

相关文章:

  • vue中el-table合并单元格
  • jdk-VarHandle 翻译
  • GitLab/GitHub 多环境配置SSH密钥
  • Mysql的加锁情况详解
  • 详解Oracle表的类型(二)
  • Java中的File和IO流
  • 宝可梦GO如何超越李飞飞的空间智能?150万亿参数解锁现实边界 | LeetTalk Daily...
  • 新版布谷直播软件源码开发搭建功能更新明细
  • STM32 USART串口发送
  • 【Leetcode 每日一题】743. 网络延迟时间
  • Ant Design Vue中使用change方法时如何传递自定义参数
  • Lumos学习王佩丰Excel第十六讲:简单文本函数
  • 快速排序&Lambda表达式
  • 深度学习中的循环神经网络(RNN)与时间序列预测
  • 我的创作之路:机缘、收获、日常与未来的憧憬
  • 基础免杀 从.rsrc加载shellcode上线
  • 融合模型VotingRegressor 在线性数据上的比对与应用
  • Flutter 设计模式全面解析:抽象工厂
  • 3dm 格式详解,javascript加载导出3dm文件示例
  • Nginx防御机制
  • 数据结构——停车场管理问题
  • 致翔OA open_juese.aspx SQL注入致RCE漏洞复现
  • 算法分析 —— 《位运算基础》
  • JavaScript中的Observer模式:设计模式与最佳实践
  • 赛氪媒体支持“2024科普中国青年之星创作交流活动”医学专场落幕
  • BIO/NIO