高级RAG(五):TruLens 评估-扩大和加速LLM应用程序评估

之前我们介绍了,RAGAs评估,今天我们再来介绍另外一款RAG的评估工具:TruLens , trulens是TruEra公司的一款开源软件工具,它可帮助您使用反馈功函数客观地评估基于 LLM 的应用程序的质量和有效性。反馈函数有助于以编程方式评估输入、输出和中间结果的质量,以便我们可以加快和扩大实验评估,并将其用于各种应用场景,包括问答、检索增强生成和基于代理的应用程序。

一、核心概念

1.1 反馈函数

反馈函数,类似于标记函数,提供了一种在应用程序运行时生成评估的编程方法。TruLens的反馈函数的实现包装了一个受支持的提供者模型,比如一个相关性模型或一个情感分类器,它被重新用于提供评估。通常,为了获得最大的灵活性,这个模型也可以是另一个LLM。

在两个维度上考虑评估范围是非常有用的:可扩展性(Scalable)和有意义(Meaningful)。

领域专家评估(Ground Truth Evals)

在早期开发阶段,我们建议从领域专家评估开始。这些评估通常是由开发人员自己完成的,代表了你的应用程序期望完成的核心用例。这让你能够更深入地了解应用的性能,但却缺乏规模性。

用户反馈(人工)评估(Human Evals)

在你完成了早期评估并对你的应用获得更多信心后,收集人们的反馈通常是有用的。这通常以用户提供的二元(上/下)反馈的形式出现。这比基本事实(Ground Truth)的可扩展性稍强,但与方差作斗争,并且收集起来仍然很昂贵。

传统 NLP 评估(Traditional NLP Evals)

传统的 NLP 指标进行评估是一种常见的做法,例如 BLEU 和 ROUGE。虽然这些评估具有极高的可扩展性,但它们通常过于语法化,并且无法提供有关应用程序性能的有意义的信息。

中等语言模型评估(MLM Evals)

中等语言模型(如BERT)是LLM应用评估的最佳选择。这种规模的模型运行起来相对便宜(可扩展),还可以为你的应用提供细微的、有意义的反馈。在某些情况下,这些模型需要进行微调,以便为你的领域提供正确的反馈。

TruLens提供了许多开箱即用的反馈功能,这些功能依赖于这种模型风格,如基础NLI、情感、语言匹配、适度等。

大型语言模型评估(LLM Evals)

大型语言模型也可以为LLM应用程序的性能提供有意义和灵活的反馈。通常通过简单的提示,基于LLM的评估可以提供与人类非常一致的有意义的评估。此外,它们可以很容易地用LLM提供的推理来扩展,以证明对调试有用的高或低评估分数。

根据LLM的规模和性质,这些评估在规模上可能相当昂贵。

1.2 RAG三元组

为了避免LLM产生幻觉,RAG已经成为为LLM提供上下文(Context)的标准架构。然而,即使是RAG也会产生幻觉,因为当检索器无法检索到足够的上下文,甚至检索到不相关的上下文,然后将其传送给LLM后,LLM也可能产生幻觉。

TruEra创新的使用了RAG三元组来评估RAG架构的每条边的幻觉,如下所示:

 RAG 三元组由 3 个评估组件组成:上下文相关性(Context Relevance)、基础性(Groundedness)和答案相关性(Answer Relevance)。 

上下文相关性(Context Relevance)

任何 RAG 应用程序的第一步都是检索;为了验证检索的质量,我们希望确保每个检索到的上下文文档块(Context)都与输入查询(question)相关。这一点至关重要,因为LLM将使用此Context来形成答案(answer),因此Context中任何不相关的信息都可能会被编织成幻觉。TruLens 使您能够使用序列化记录的结构来评估上下文相关性。

基础性(Groundedness)

在检索上下文之后,然后由LLM将其形成答案。LLM往往倾向于偏离所提供的事实,夸大或扩展到一个听起来正确的答案。为了验证我们的应用程序的基础性(groundedness),我们可以将LLM产生的答案(answer)分成单独的主张(claims),并在检索的上下文(Context)中独立地搜索支持每个主张的证据。

答案相关性(Answer Relevance)

最后,我们的答案(answer)仍然需要有助于回答最初的问题。我们可以通过评估最终答案与用户输入(question)的相关性来验证这一点。

将它们组合在一起

如果我们对这个三元组进行评估后获得了满意的结果, 我们可以明确的说我们的应用程序经验证在其知识库的限制范围内不会出现幻觉。 换句话说,如果向量数据库包含的信息时准确的,那么RAG提供的答案也是准确的。

二、基本的RAG管道

2.1 基本的RAG管道介绍

在进行TruLens评估之前,我们首先回顾一下基本的RAG架构:

在基本RAG架构中包含了文档数据的处理,文档内容检索、LLM应答等环节,其中文档数据处理包含了文档的分割,向量化处理,向量数据库存储等步骤,而文档内容检索又包含了对向量数据库内容的相似度搜索,获取top_k个相关文档等步骤,然后将相关文档(context)和用户问题传送给LLM并产生最终的答案(answer), 如果对这些过程和步骤还不熟悉的朋友可以看一下我之前写的使用langchain与你自己的数据对话系列博客。接下来我们要使用llamaIndex开发一个基本RAG应用程序,并使用TruLens的RAG三元组对其进行评估。

2.2 环境配置

我们首先需要安装如下python包:

pip install llama_hub 
pip install llama_index
pip install trulens-eval

接下来我们需要做一些初始化的工作,比如导入openai,gemini等大模型的api_key:

import os
from dotenv import load_dotenv, find_dotenv
 
#导入.env配置文件
_ = load_dotenv(find_dotenv()) 

2.3 加载文档数据

今天我们同样使用上一篇博客:RAGAs评估 中的相同数据即从百度百科的网页中抓取关于恐龙的文章:

这里我们使用的是LlamaIndex 的数据爬虫工具:TrafilaturaWebReader

from llama_index.readers.web import TrafilaturaWebReader

url="https://baike.baidu.com/item/恐龙/139019"
docs = TrafilaturaWebReader().load_data([url])

docs

2.4 切割文档

接下来我们要对该文档进行切割,我们首先需要创建一个文档切割器:

from llama_index.node_parser import SimpleNodeParser
from llama_index.schema import IndexNode

#创建文档切割器
node_parser = SimpleNodeParser.from_defaults(chunk_size=1024)

node_parser

 这里我们创建了一个简单的文档切割器,并且将chunk_sez设置为1024,这样我们被切割出来的文档块长度将会在1024左右。

#切割文档
base_nodes = node_parser.get_nodes_from_documents(docs)
len(base_nodes)

这里我们看到,原来的文档被切割成了30个文档块,下面我们看一下文档块中的内容:

base_nodes[5]

2.5 设置Embedding 和 LLM

接下来我们要设置一些基础组件,其中包括:embedding模型,llm,service_context,这里我们的embedding模型选择的是开源的bge-small-zh-v1.5模型,llm选择的是openai的gpt-3.5-turbo模型,当然你也可以选择gemini模型:

from llama_index.embeddings import resolve_embed_model
from llama_index import VectorStoreIndex, ServiceContext
from llama_index.llms import OpenAI
#from llama_index.llms import Gemini


#创建BAAI的embedding
embed_model = resolve_embed_model("local:BAAI/bge-small-zh-v1.5")

#创建OpenAI的llm
llm = OpenAI(model="gpt-3.5-turbo")

#创建谷歌gemini的llm
# llm = Gemini()

service_context = ServiceContext.from_defaults(
    llm=llm, embed_model=embed_model
)

2.6 创建 Index, retriever, query engine

#创建index
base_index = VectorStoreIndex(base_nodes, service_context=service_context)
#创建检索器
base_retriever = base_index.as_retriever(similarity_top_k=2)
 
#检索相关文档
retrievals = base_retriever.retrieve(
    "恐龙是冷血动物吗?"
)

接下来我们可以查看和问题:"恐龙是冷血动物吗?"相关的文档:

from llama_index.response.notebook_utils import display_source_node
 
for n in retrievals:
    display_source_node(n, source_length=1500)

这里我们看到由于我们在创建检索器的时候设置了similarity_top_k=2,即让检索器每次都返回2个与用户问题相似度最高的文档,在上面的返回结果中我们同时还看到检索器除了返回相关node的内容(Text)以外,还返回了Node Id,相似度值Similarity。接下来我们要请出大模型ChatGPT根据检索器返回的相关文档来回答用户的问题,下面我们看看ChatGPT的回答:

#openai的回答
response = query_engine_base.query(
    "恐龙是冷血动物吗?"
)
print(str(response))

 这里我们看到chatgpt模型在这两个相关文档的基础上归纳出了一个比较完整的且对用户友好的答案。

 三、TruLens 评估

3.1 什么是反馈函数

反馈函数的作用是在审查 LLM 应用程序的输入,输出和中间结果后给出一个分数。下面我们要定义一个评估器对象,和一个provider,其中评估器对象会初始化一个数据库,该数据库用来存储prompt、reponse、中间结果等信息。provider则用来执行反馈功能。

from trulens_eval import Tru
from trulens_eval import OpenAI as fOpenAI
import nest_asyncio

#设置线程的并发执行
nest_asyncio.apply()

#创建评估器对象
tru = Tru()
#初始化数据库,它用来存储prompt、reponse、中间结果等信息。
tru.reset_database()

#定义一个provider用来执行反馈
provider = fOpenAI()

 接下来我们需要定义Answer Relevance、Context Relevance、Groundedness等3个反馈函数。

3.2 答案相关性(Answer Relevance)

Answer Relevance评估的是最终的答案(answer)与用户的问题(question)相关程度。它的主要结构如下图所示:

 下面我们来定义一个Answer Relevance反馈函数

from trulens_eval import Feedback

f_qa_relevance = Feedback(
    provider.relevance_with_cot_reasons,
    name="Answer Relevance"
).on_input_output()

3.3 上下文相关性(Context Relevance)

Context Relevance评估的是检索出来的上下文(Context )与用户的问题(question)相关程度。由于我们会设置检索器返回的检索结果的数量(如similarity_top_k), 所以在计算Context Relevance指标时会对返回的多个上下文取平均值。

下面我们来定义一个Context Relevance反馈函数 

import numpy as np
from trulens_eval import TruLlama

context_selection = TruLlama.select_source_nodes().node.text

f_qs_relevance = (
    Feedback(provider.qs_relevance,
             name="Context Relevance")
    .on_input()
    .on(context_selection)
    .aggregate(np.mean)
)

3.4 基础性(Groundedness)

Groundedness用来评估LLM提供的答案(answer)和上下文(context)相关程度,或者说,当Groundedness的分数很低时,说明LLM产生了幻觉,理想情况下因为我们希望answer完全由context总结(推导)出来,当Groundedness的分数较高时可以排除LLM产生幻觉的可能性。下面我们来定义一个Groundedness反馈函数:

from trulens_eval.feedback import Groundedness

grounded = Groundedness(groundedness_provider=provider)

f_groundedness = (
    Feedback(grounded.groundedness_measure_with_cot_reasons,
             name="Groundedness"
            )
    .on(context_selection)
    .on_output()
    .aggregate(grounded.grounded_statements_aggregator)
)

3.5 评估RAG三元组

前面我们定义了三个反馈函数:f_qa_relevance、f_qs_relevance、f_groundedness,接下来我们要定义一组问题,然后通过基本RAG管道来检索答案,最后我们通过这些问题和答案来实现对基本RAG管道的评估:

from trulens_eval import TruLlama
from trulens_eval import FeedbackMode

#
tru_recorder = TruLlama(
    query_engine_base,
    app_id="App_1",
    feedbacks=[
        f_qa_relevance,
        f_qs_relevance,
        f_groundedness
    ]
)

#定义问题
eval_questions = ["恐龙是怎么被命名的?", 
                 "恐龙怎么分类的?",
                 "体型最大的是哪种恐龙?",
                 "体型最长的是哪种恐龙?它在哪里被发现?",
                 "恐龙采样什么样的方式繁殖?",
                 "恐龙是冷血动物吗?",
                 "陨石撞击是导致恐龙灭绝的原因吗?",
                 "恐龙是在什么时候灭绝的?",
                 "鳄鱼是恐龙的近亲吗?",
                 "恐龙在英语中叫什么?"
                ]
#执行评估,LLM回答所有的问题
for question in eval_questions:
    with tru_recorder as recording:
        query_engine_base.query(question)

#展示评估结果
records, feedback = tru.get_records_and_feedback(app_ids=[])
records[['input', 'output']] = records[['input', 'output']].applymap(lambda x: x.encode('latin1').decode('unicode_escape'))
records[["input", "output"]+feedback]

 这里我们看到除了Context Relevance的分数有较大的波动之外,Groundedness和Answer Relevance的分数都是比较高,其中所有问题的Answer Relevance分数都是1,说明Answer和question有非常高的相关性,并且Groundedness除了两个问题之外剩余的8个问题得分都是1,这说明answer基本上都是从上下文(Context)中推导(或是总结)出来的,因此可以肯定的说answer不是由于LLM的幻觉产生的。另外Context Relevance分数较低这是和我们在拆分文档时设置的块大小(chunk_size)有关,当chunk_size设置的太大时文档块中可能会包含更多的信息,这就会导致检索到的文档块内容(context)和question的相关性降低。但是由于我们使用的是openai的gpt-3.5模型,它有着非常强大的推理能力,尽管我们的Context Relevance分数较低,但gpt-3.5模型仍然能够从中推导出正确的答案。下面我们看一下这10个问题的总体成绩:

tru.get_leaderboard(app_ids=[])

这里我们看到了总体的评估结果除了Context Relevance,Groundedness和Answer Relevance之外还包括了评估的耗时(latency),以及评估的总成本(total_cost),其中耗时耗时(latency)花费了10.25秒,而评估的成本花费了$0.003322美刀,而总成本是通过计算question,context,answer统计出来的。

四、总结

今天我们学习了TruLens评估的基本原理,其中包括RAG三元组Context Relevance,Groundedness和Answer Relevance的定义和作用,然后我们又使用llamaIndex开发了基本RAG应用,最后我们使用了TruLens的反馈函数对基本RAG的检索结果进行了评估。希望今天的内容对大家学习RAG有所帮助.

五、参考资料

LlamaIndex 🦙 0.9.26 

Feedback Functions - TruLens

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

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

相关文章

java 创建一个可执行的jar包小程序

第1步:写好代码 public class Main {public static void main(String[] args) {String str "hahah";if (StringUtils.isBlank(str)) {System.out.println(str);}System.out.println("Hello world!");} }第2步:设置 Artifact 选择入…

多模态推荐系统综述:二、特征交互 Fusion

二、Fusion 融合不同的多模态信息,与bridge相比,融合更关注项目之间的多模态内部关系。 它可以灵活地融合不同权重和焦点的多模态信息。 注意机制是应用最为广泛的特征融合。 2.1 粗粒度注意力。 一些模型应用注意力机制在粗粒度级别融合来自多种模式…

游客管理+导航系统(地图显示并实时更新线路)——MySQL数据库+javase+GUI+迪杰斯特拉算法

记录大二上学期——数据结构项目实训,要求实现求得两点的最短路径(无向赋权图) 本人—hl—一人完成代码的实现,废话不多说直接看功能 所需技术:javase数据库迪杰斯特拉GUI 统一工具:idea编辑器&#xff0c…

编程语言的语法糖,你了解多少?

什么是语法糖 语法糖是一种编程语言的特性,通常是一些简单的语法结构或函数调用,它可以通过隐藏底层的复杂性,并提供更高级别的抽象,从而使代码更加简洁、易读和易于理解,但它并不会改变代码的执行方式。 为什么需要语…

Day1Qt

1、实现登录窗口界面 头文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QIcon>//图标 #include <QLabel>//标签类 #include <QMovie>//动态类 #include <QLineEdit>//行编辑类 #include <QPushButton>…

有趣的前端知识(二)

推荐阅读 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;一&#xff09; 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;二&#xff09; 文章目录 推荐阅读HTML元素元素属性头部元素列表元素区块元素表单元素 颜色字符实体 HTML元素 …

过流继电器 GL-11/5 整定电流3.5A,动作时限0.5S josef约瑟

系列型号&#xff1a; GL-11过流继电器; GL-12过流继电器; GL-13过流继电器; GL-14过流继电器; GL-15过流继电器; GL-16过流继电器; GL-17过流继电器; GL-11/10过流继电器; GL-15/10过流继电器; GL-17/10过流继电器; GL-11/5过流继电器; GL-15/5过流继电器; GL-17/5过流继电器;…

Open3D 基于统计滤波去除噪点(5)

Open3D 基于统计滤波去除噪点&#xff08;5&#xff09; 一、什么是统计滤波二、具体实现1.代码 一、什么是统计滤波 统计滤波是一种常用的点云滤波方法&#xff0c;用于去除噪声和异常点。在统计滤波中&#xff0c;通过计算每个点邻域内的统计特征&#xff08;如平均值和标准…

C#之反编译之路(二)

先阅读C#之反编译之路(一)可以增加文章连续性 阅读C#之反编译之路(一) 如何快速定位代码位置 用一个小小的例子举例,用户反馈新能源车牌号无法录入,燃油车牌正常,查看日志报如下错误 拿到关键字车牌号长度错误直接反编译代码 打开dnSpy.exe→加载项目→CtrlF打开搜索框→输入…

ThreadLocal内存泄漏与解决

目录 什么是Threadlocal&#xff1f; Threadlocal的基本使用 ThreadLocal的内存泄漏举例 场景1 场景2 场景3 场景4 内存泄漏原因分析 总结 什么是Threadlocal&#xff1f; ThreadLocal 是 Java 中的一个类&#xff0c;它提供了线程本地变量的支持。线程本地变量是指被…

互联网加竞赛 基于卷积神经网络的乳腺癌分类 深度学习 医学图像

文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度&#xff0c;召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…

RBAC基于角色的访问控制

一 什么是RBAC 概念 RBAC 是基于角色的访问控制&#xff08;Role-Based Access Control &#xff09;在 RBAC 中&#xff0c;权限与角色相关联&#xff0c;用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。这样管理都是层级相互依赖的&#…

Django 4.2.7 ORM 连接MySQLServer 完成单表CRUD

文章目录 Django ORM介绍1.使用pycharm新建一个Django项目2.修改settings.py文件中 DATABASES3.创建APP4.创建模型5.操作数据库 Django ORM介绍 Django 模型使用自带的 ORM。 对象关系映射&#xff08;Object Relational Mapping&#xff0c;简称 ORM &#xff09;用于实现面向…

Java程序员面试-场景篇

前言 裁员增效潮滚滚而来&#xff0c;特总结一些实际场景方案的面试题&#xff0c;希望对大家找工作有一些帮助。 注册中心 题目&#xff1a; 有三台机器&#xff0c;分别部署了微服务A、微服务B、注册中心&#xff0c;其中A和B都有服务接口提供并正常注册到了注册中心&…

SpringMVC概述

MVC介绍 MVC是一种设计模式&#xff0c;将软件按照模型、视图、控制器来划分&#xff1a; M&#xff1a;Model&#xff0c;模型层&#xff0c;指工程中的JavaBean&#xff0c;作用是处理数据 JavaBean分为两类&#xff1a; 一类称为实体类Bean&#xff1a;专门存储业务数据的&…

Docker Compose--部署SpringBoot项目--实战

原文网址&#xff1a;Docker Compose--部署SpringBoot项目--实战-CSDN博客 简介 本文用实战介绍Docker Compose部署SpringBoot项目。 ----------------------------------------------------------------------------------------------- 分享Java真实高频面试题&#xff0c…

Java方法用法及解析

在 Java 中&#xff0c;方法&#xff08;Method&#xff09;是用于执行特定任务的代码块。它是一个函数&#xff0c;用于封装一段可重复执行的代码&#xff0c;并可以被其他代码调用。方法定义了一系列操作的步骤&#xff0c;并提供了一种结构化和可复用的方式来组织和执行这些…

MathType7.6安装教程

1.软件介绍 MathType是一款可以帮助用户快速完成数学公式编辑的应用软件&#xff0c;这款软件适合在进行教育教学、科研机构、论文写作的时候使用。我们可以直接通过这款软件来获取到大量数学上使用到的函数、数学符号等内容&#xff0c;然后使用这些内容来完成公式编辑。 不管…

【mars3d】new mars3d.layer.GeoJsonLayer(实现环状面应该怎么传data

问题&#xff1a;【mars3d】new mars3d.layer.GeoJsonLayer(实现环状面应该怎么传data 解决方案&#xff1a; 1.在示例中修改showDraw()方法的data数据&#xff0c;实现以下环状面效果 2.示例链接&#xff1a; 功能示例(Vue版) | Mars3D三维可视化平台 | 火星科技 export f…

深入理解Java源码:提升技术功底,深度掌握技术框架,快速定位线上问题

为什么要看源码&#xff1a; 1、提升技术功底&#xff1a; 学习源码里的优秀设计思想&#xff0c;比如一些疑难问题的解决思路&#xff0c;还有一些优秀的设计模式&#xff0c;整体提升自己的技术功底 2、深度掌握技术框架&#xff1a; 源码看多了&#xff0c;对于一个新技术…