OpenAI 自带的检索功能好用吗?定量测评带你深度了解!

向量数据库的劲敌来了?又有一批赛道创业公司要倒下?

……

这是 OpenAI 上线 Assistant 检索功能后,技术圈传出的部分声音。原因在于,此功能可以为用户提供基于知识库问答的 RAG(检索增强生成) 能力。而此前,大家更倾向于将向量数据库作为 RAG 方案的重要组件,以达到减少大模型出现“幻觉”的效果。

那么,问题来了,OpenAI 自带的 Assistant 检索功能 V.S. 基于向量数据库构建的开源 RAG 方案相比,谁更胜一筹?

本着严谨的求证精神,我们对这个问题进行了定量测评,结果很有意思:

OpenAI 表现不错!不过,在基于向量数据库的开源 RAG 方案面前仍有差距!

接下来,我将还原整个测评过程。需要强调的是,要完成这些测评并不容易,少量的测试样本根本无法有效衡量 RAG 应用的各方面效果。因此,需要采用一个公平、客观的 RAG 效果测评工具,在一个合适的数据集上进行测评,进行定量的评估和分析,并保证结果的可复现性。

话不多说,上过程!

01.评测工具

Ragas 是一个致力于测评 RAG 应用效果的开源框架。用户只需要提供 RAG 过程中的部分信息,如 question、 contexts、 answer 等,它就能使用这些信息来定量评估多个指标。通过 pip 安装 Ragas,只需几行代码,即可进行评估,过程如下:

from ragas import evaluate
from datasets import Dataset

# prepare your huggingface dataset in the format
# dataset = Dataset({
#     features: ['question', 'contexts', 'answer', 'ground_truths'],
#     num_rows: 25
# })
results = evaluate(dataset)

# {'ragas_score': 0.860, 'context_precision': 0.817,
# 'faithfulness': 0.892, 'answer_relevancy': 0.874}

Ragas 有许多评测的得分指标子类别,比如:

  • 从 generation 角度出发,有描述回答可信度的 Faithfulness,回答和问题相关度的 Answer relevancy

  • 从 retrieval 角度出发,有衡量知识召回精度的 Context precision,知识召回率的 Context recall,召回内容相关性的 Context Relevancy

  • 从 answer 与 ground truth 比较角度出发,有描述回答相关性的 Answer semantic similarity,回答正确性的 Answer Correctness

  • 从 answer 本身出发,有各种 Aspect Critique

alt

这些指标各自衡量的角度不同,举个例子,比如指标 answer correctness,它是结果导向,直接衡量 RAG 应用回答的正确性。下面是一个 answer correctness 高分与低分的对比例子:

Ground truth: Einstein was born in 1879 at Germany .
High answer correctness: In 1879, in Germany, Einstein was born.
Low answer correctness: In Spain, Einstein was born in 1879.

其它指标细节可参考官方文档。重要的是,每个指标衡量角度不同,这样用户就可以全方位,多角度地评估 RAG 应用的好坏。

02.测评数据集

我们使用 Financial Opinion Mining and Question Answering (fiqa) Dataset 作为测试数据集。主要有以下几方面的原因:

该数据集是属于金融专业领域的数据集,它的语料来源非常多样化,并包含了人工回答内容。里面涵盖非常冷门的金融专业知识,大概率不会出现在 ChatGPT 的训练数据集。这样就比较适合用来当作外挂的知识库,以和没见过这些知识的 LLM 形成对比。

该数据集原本就是用来评估 Information Retrieval (IR) 能力的,因此它有标注好了的知识片段,这些片段可以直接当做召回的标准答案(ground truth)。

Ragas 官方也把它视作一个标准的入门测试数据集,并提供了构建它的脚本 (https://github.com/explodinggradients/ragas/blob/main/experiments/baselines/fiqa/dataset-exploration-and-baseline.ipynb)。因此有一定的社区基础,可以得到一致的认可,也比较合适用来做 baseline。

我们先使用转换脚本来将最原始的 fiqa 数据集转换构建成 Ragas 方便处理的格式。可以先看一眼该评测数据集的内容,它有 647 个金融相关的 query 问题,每个问题对应的知识原文内容列表就是 ground_truths,它一般包含 1 到 4 条知识内容片段。

alt

进行到这一步,测试数据就准备好了。我们只需要将 question 这一列,拿去提问 RAG 应用,然后将 RAG 应用的回答和召回,合并上 ground truths,将所有这些信息,用 Ragas 评测打分。

03.RAG 对照设置

接下来就是搭建我们要对比的两个 RAG 应用,来对比跑分。下面开始搭建两套 RAG 应用:OpenAI assistant 和基于向量数据库自定义的 RAG pipeline。

OpenAI assistant

我们采用 OpenAI 官方的 assistant retrieval 方式介绍,构建 assistant 和上传知识,并且使用 OpenAI 官方给出的方式拿到 answer 和召回的 contexts,其它都采用默认设置。

基于向量数据库的 RAG pipeline

紧接着我们打造一条基于向量召回的 RAG pipeline,用 Milvus 向量数据库存储知识,用 HuggingFaceEmbeddings 中的 BAAI/bge-base-en 模型构建 embedding,用 LangChain 的组件进行文档导入和 Agent 构建。

下面列出了两套方案的对比:

alt

这里注意到,我们用的 LLM model 都是 gpt-4-1106-preview,其它的策略由于 OpenAI 是闭源的,所以应该和它有许多差别。篇幅所限具体实现细节在此不作展开,可以参考我们的实现代码。

04 结果和分析

实验结果

我们使用 Ragas 里的多个指标对它们进行打分,得到下面每个指标的对比结果:

alt

可以看到,在我们统计的 5 项指标中,OpenAI assistant 除了在 answer_similarity 这项超过自定义的 RAG pipeline 之外,其它指标都略低于自定义的 RAG pipeline。

另外,Ragas 也可以通过计算各项指标的调和平均数,来得到一个总体平均的得分,叫作 Ragas score。调和平均数的作用在于惩罚低分项。从总体上看,OpenAI assistant 的 Ragas score 也是低于自定义的 RAG pipeline。

alt

那么,为什么会有这样的结果呢?通过大量的单条结果对比,我们发现,基于向量数据库搭建的 RAG pipeline 与OpenAI assistant 相比,有如下优势:

  1. OpenAI assistant 更倾向于用自己的知识回答,而少用召回的知识。

这可能是由于其内部的 Agent 设定导致,当遇到 GPT 可能知道的事实时,它更自信,选择使用自己训练时的知识,而不去使用召回的知识,但也许这时的知识就是正好和它训练的相悖。举个例子:

提问:

Are personal finance / money management classes taught in high school, anywhere?

OpenAI assistant 回答:

alt

这个回答对不对呢?只从回答来看是没什么问题,但我们注意到标亮的地方,强调的是其没有联网获取最新知识,这就说明它没有用到上传上去的知识文档内容。

再看看 ground truth,也就是数据集里标注的正确答案:

alt

可以看到,文档里举例了许多回答这个问题的具体场景,而 OpenAI 的回答确实没有用到它们。它认为这个问题过于简单,足以直接回答,而忽略了知识库里可能需要的信息。

接下来我们看看基于向量数据库的 RAG 的回答:

alt

高亮出了 RAG 回答中引用 ground truth 的内容,它很好地把知识内容融入到回答中去,这才是用户需要的。

  1. OpenAI 对知识的切分和召回有待优化,开源自定义方案更胜一筹。

我们可以通过查看 assistant 的中间召回的知识,来分析它对知识文档的切分策略,或者反推其 embedding 模型的效果。举个例子:

提问:

Pros / cons of being more involved with IRA investments [duplicate]

OpenAI assistant 的中间召回片段:

['PROS: CONS']

这显然是一个错误的召回片段,而且它只召回了这一条片段。首先片段的切分不太合理,把后面的内容切掉了。其次 embedding 模型并没有把更重要的、可以回答这个问题的片段召回,只是召回了提问词相似的片段。

自定义 RAG pipeline 的召回片段:

alt

可以看到,自行搭建的 RAG pipeline 把许多 IRA 投资的信息片段都召回出来了,这些内容也是有效地结合到最后 LLM 的回答中去。

此外,可以注意到,向量召回也有类似 BM25 这种分词召回的效果,召回的关键词确实都是需要的词“IRA”,因此向量召回不仅在整体语义上有效,在微观词汇上召回效果也不逊色于词频召回。

其它方面

除实验效果分析之外,对比更加灵活的自定义开源 RAG 方案,OpenAI assistant 还有一些较为明显的劣势:

  • OpenAI assistant 无法调整 RAG 流程中的参数,内部是个黑盒,这也导致了没法对其优化。而自定义 RAG 方案可以调整 top_k、chunk size、embedding 模型等组件或参数,这样也可以在特定数据上进行优化。

  • OpenAI 存储文件量有限,而向量数据库可以存储海量知识。OpenAI 单文件上传有上限 512 MB 并不能超过 2,000,000 个 token。

因此,OpenAI 无法完成业务更复杂,数据量更大或更加定制化的 RAG 服务。

05 总结

我们基于 Ragas 测评工具,将 OpenAI assistant 和基于向量数据库的开源 RAG 方案做了详尽的比较和分析。可以发现,虽然 OpenAI assistant 的确在检索方面表现尚佳,但在回答效果,召回表现等方面却逊色于向量 RAG 检索方案,Ragas 的各项指标也定量地反应出该结论。

因此,对于构建更加强大、效果更好的 RAG 应用,开发者可以考虑基于 Milvus 或 Zilliz Cloud 等向量数据库,构建定义检索功能,从而带来更好的效果和灵活的选择。

本文由 mdnice 多平台发布

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

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

相关文章

逆变器简述

一般家用电器,像微波炉,电饭煲等都是直接插墙壁上的电就可以工作,所以这些家用电器是使用我们市电AC220V的电压 但我们用到的手机,电瓶车以及新能源汽车都是需要充电器的,所以这些用电产品里面都是有电池的&#xff0…

统计学-R语言-4.1

文章目录 前言编写R函数图形的控制和布局par函数layout函数 练习 前言 安装完R软件之后就可以对其进行代码的编写了。 编写R函数 如果对数据分析有些特殊需要,已有的R包或函数不能满足,可以在R中编写自己的函数。函数的定义格式如下所示: …

在微服务架构中认证和授权的那些事儿

在微服务架构中认证和授权是最基础的服务能力,其中这一块行业类的标准就是OAuth2 和 SSO ,而OAuth2 和 SSO 可以归类为“用户管理和身份验证”工具,OpenID Connect 1.0是 OAuth 2.0 协议之上的一个简单身份层。 Part.1 认识OAuth 2.0 OAuth…

低代码与小程序开发:简化创新,加速应用开发

随着信息技术的迅速发展,应用程序的需求与日俱增。然而,传统的软件开发往往耗时、复杂,对于许多企业和开发者来说,开发应用程序的成本和难度成为了一道门槛。而近年来,低代码开发和小程序开发的兴起为解决这一难题带来…

RocketMQ源码阅读-Producer发消息

RocketMQ源码阅读-Producer发消息 1. 从单元测试入手2. 启动过程3. 同步消息发送过程4. 异步消息发送过程5. 小结 Producer是消息的生产者。 Producer和Consummer对Rocket来说都是Client,Server是NameServer。 客户端在源码中是一个单独的Model,目录为ro…

Torch not compiled with CUDA enabled

最近接触chatglm3对话预训练模型,从git上下载,装包装半天,最后终于跑起来了,但是一对他进行对话,后台就开始报错了 File "E:\Python311\Lib\site-packages\torch\nn\modules\linear.py", line 114, in forw…

【c++】入门4

内联函数声明和定义不能分开 inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址 了,链接就会找不到。 auto关键字 随着程序越来越复杂,程序中用到的类型也越来越复杂,经常体现在&…

动态pv策略和组件

pv和pvc,存储卷: 存储卷: emptyDir 容器内部,随着pod销毁,emptyDir也会消失 不能做数据持久化 hostPath:持久化存储数据 可以和节点上的目录做挂载。pod被销毁了数据还在 NFS:一台机器&am…

x-cmd pkg | tsx - Node.js 的直接替代品

目录 简介首次用户功能特点竞品和相关作品进一步探索 简介 tsx 代表 “TypeScript execute”,由 TypeScript 编写,内部使用由 Go 语言编写的 esbuild 核心二进制实现超快的 TypeScript 编译,旨在增强 Node.js 以无缝运行 TypeScript / ESM /…

Golang的API项目快速开始

开启一个简单的API服务。 golang的教程网上一大堆,官网也有非常详细的教程,这里不在赘述这些基础语法教程,我们意在快速进入项目开发阶段。 golang好用语法教程传送门: m.runoob.com/go/ 编写第一个API 前提:按照上一…

[Oracle][详细] Win完全卸载Oracle

前提准备 进入服务 找到Oracle开头的服务 将这些服务全部停止 Top 1 点击开始菜单找到Oracle,然后点击Oracle安装产品,再点击【Universal Installer】 Top 2 点击之后稍等一会然后会进入进入下图界面,点击卸载产品 Top 3 选中要删除的Oracle产品,然后点击【删除】 Top 4 进…

性能监控软件选择攻略

随着企业对应用程序性能的关注度不断增加,选择适当的性能监控软件变得至关重要。性能监控软件能够帮助企业实时追踪应用程序的性能指标,识别潜在问题并提高系统的稳定性。在选择性能监控软件时,以下攻略将有助于确保您的选择符合业务需求并能…

SpringIOC之support模块GenericApplicationContext

博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…

鸿蒙开发笔记(一):ArkTS概述及声明式UI的使用

ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集。 ArkTS在TS的基础上主要扩展了如下能力: 基本语法:ArkTS定义…

Docker实战06|深入剖析Docker Run命令

前几篇文章中,重点讲解了Linux Namespace、Cgroups、AUFS的核心原理,同样也是Docker的底层原理实现。目录如下: • 《Docker实战01|容器与开发语言》 • 《Docker实战02|Namespace》 • 《Docker实战03|C…

软件测试公式之如何高质量的做BUG分析?

对于BUG分析,测试人员再熟悉不过了。但如果是面对大量的BUG,要如何有效的分析呢?有什么好的方案和行动项?今天聊聊这个话题。 01 BUG分析简单可以分为两类:宏观BUG分析 和 微观BUG分析。 宏观BUG分析:在…

【python】进阶--->MySQL数据库(一)

一、mysql数据库 关系型数据库 : 一些相关的表和其他数据库对象的集合。 表是由行和列组成。列包含一组命名的属性(也称为字段)。 行包含一组记录,行和列的交集称为数据项(也叫字段值)。 数据库(database) : 存储数据的仓库,本质上就是一个文…

《C++ Primer》第14章 重载运算与类型转换(二)

参考资料: 《C Primer》第5版《C Primer 习题集》第5版 14.8 函数调用运算符(P506) 如果类重载了函数调用运算符,则我们可以像使用函数一样使用该类的对象。这样的类同时也能存储状态,所以它们比普通函数更加灵活。…

x-cmd pkg | czg - git commit 智能生成工具

目录 简介首次用户功能特点竞品和相关作品进一步探索 简介 czg 源于 commitizen/cz-cli 交互插件中 cz-git 的延伸项目,重新使用 TypeScript 编写的零依赖独立的 Node.js 命令行工具。旨在使用交互友好的方式,辅助用户生成规范的 git commit message 约…

游泳耳机哪种款式好?最值得入手的游泳耳机大全

在如今注重健康和娱乐的生活方式中,游泳作为一项全身性的运动备受欢迎。然而,对于热爱水中活动的人们来说,选择一款出色的游泳耳机至关重要。好的游泳耳机不仅能提供清晰的音质,还能有效防水,让您在水中尽情畅游的同时…