理解构建LLM驱动的聊天机器人时的向量数据库检索的局限性 - (第1/3部分)

本博客是一系列文章中的第一篇,解释了为什么使用大型语言模型(LLM)部署专用领域聊天机器人的主流管道成本太高且效率低下。在第一篇文章中,我们将讨论为什么矢量数据库尽管最近流行起来,但在实际生产管道中部署时从根本上受到限制。在下面的文章中,我们说明了我们在ThirdAI上发布的最新产品如何解决这些缺点,并实现以低成本在生产中部署LLM驱动的检索的愿景。

动机

专用领域聊天机器人是 ChatGPT 最受欢迎的企业应用程序。具有特定知识库的自动问答功能可以使任何雇主的员工提高工作效率,同时节省员工宝贵的时间。举例来说,如果员工与客户互动,那么触手可及的与客户的所有历史互动将非常方便。如果你想为一个大型代码库做出贡献,如果你能在细粒度级别快速掌握任何现有功能,它可以让你非常高效。这样的例子不胜枚举。

ChatGPT 是一个很棒的对话工具,它根据互联网上发现的大量文本信息进行了训练。如果你问ChatGPT关于互联网的一般知识,它可以很好地回答。但是,它有一些明显的局限性。ChatGPT 无法回答那些答案不属于其训练数据中的问题。因此,如果您问 ChatGPT谁赢得了 2022 年足球世界杯? 它将无法回答,因为它在 2021 9 月之后没有接受过任何信息的训练。企业坐拥一堆非常专业、特有且不断更新的信息语料库,而开箱即用的 ChatGPT 不会成为该知识库的查询助手。更糟糕的是,众所周知,在没有适当保护机制的情况下,对 ChatGPT 的查询可能会导致虚构的答案。

幸运的是,有着大量措施正围绕使用提示解决上述两个缺陷。

什么是提示?

提示是一种新术语,用于告诉会话代理回答问题所需的所有特定信息。然后,它依靠座席的对话能力来生成精美的答案。如果你想让 ChatGPT 回答一个不属于其训练集的特定问题,你必须基本上让 ChatGPT 知道它需要知道的所有信息,少于 4096 个令牌(或大约 3200 个单词,GPT-4的单词上限达到了25000个),然后用给定的上下文问它同样的问题。

无论这听起来多么愚蠢,提示仍然是一种有价值的功能。像人类那样进行自动化的对话是我们最近在生成式人工智能方面取得显著进步的罕见壮举。实际上,构建查询助手可以归结为经典问题,即“检索与查询相关的信息,然后使用 ChatGPT 的功能生成基于检索到的信息的对话答案。我们可以看到,这会自动在幻觉周围设置护栏,因为会话代理被迫将答案接地到检索到的文本中,而这是知识库的子集。

最难的部分是总是大海捞针!

嵌入和向量数据库生态系统:在任何给定的语料库上使用 ChatGPT 构建接地气的查询助手。

使用Langchain构建了一系列聊天机器人应用程序,您可以在其中引入任何文本语料库并使用ChatGPT与之交互。所有这些应用程序都建立在基于嵌入的标准信息检索过程之上。

该过程分为两个主要阶段。第一阶段是预处理步骤,用于生成嵌入向量并构建用于近邻搜索的向量索引。生成索引后,下一阶段是查询。我们简要介绍一下这两个阶段。

预处理步骤:此步骤获取所有原始文本并构建可以有效搜索的索引。下图描述了该过程。

预处理步骤概述:您需要同时将文本和向量嵌入存储在数据库中,并以向量作为 KEY。该过程需要LLM将文本块转换为向量。LLM 在查询时候的逻辑应该是相同的。

注意: 对LLM的任何更改或更新都需要重新索引Vector DB中的所有内容。您需要完全相同的LLM进行查询 不允许更改尺寸。 

隐私风险:所有文本都需要转到嵌入模型和向量数据库。

昂贵: 完整文本语料库中的每个标记都转到LLM和Vector DB。

假设我们有一个文本文档语料库来准备问答。第一步是将语料库(或文本文档)分解成小块文本,我们称之为块(该过程也称为分块)。然后将每个块馈送到经过训练的语言模型(如 BERT GPT)以生成向量表示,也称为嵌入。然后将文本嵌入对存储在矢量数据库或 <KEY VALUE> 存储中,其中 KEY 是矢量嵌入,VALUE 是文本块。矢量数据库的独特之处在于能够有效地对矢量执行近似近邻 ANN 搜索以进行 KEY 匹配,而不是在传统数据库中执行精确的 KEY 匹配。

  • 注意: LLM的任何更改或更新都需要重新索引Vector DB中的所有内容。您需要完全相同的LLM进行查询 不允许更改尺寸。
  • 隐私风险:所有文本都必须转到嵌入模型和矢量数据库。如果两者都是不同的托管服务,则可以在两个不同的位置创建 COMPLETE 数据的两个副本。
  • 注意成本: 完整文本语料库中的每个标记都转到LLMVector DB。将来,如果您通过微调,升级模型甚至增加维度来更新LLM,则需要重新索引并再次支付全部费用。
  • 使用托管服务进行成本估算:让我们适度估计一下使用所有Pubmed摘要的知识库来构建聊天机器人,以构建医疗保健问答应用程序。Pubmed有大约35万个摘要,大约需要100M个嵌入的块。假设每块 100 个代币,我们将有大约 25B 个代币。即使我们使用Pinecone的适度矢量数据库计划(性能)和OpenAI的更便宜的嵌入模型价格(Babbage V1),我们也在考虑向量数据库每月大约7000-8000美元的成本。此费用不包括任何仓储费。此外,根据代币数量生成嵌入的一次性成本为 12500 美元。每次更改嵌入模型时,我们也需要支付12500美元。如果我们每月进行 10亿次查询,那么我们每月至少支付 25000 美元的额外经常性费用,用于使用 OpenAI 进行查询嵌入服务和响应生成。值得注意的是,PubMed是较小的公共检索数据集之一。企业可能使用在10-100倍大的语料库之上进行上述工作。

查询阶段:嵌入和使用ANN搜索,然后通过提示生成

此步骤采用用户键入的问题,在矢量数据库中搜索与问题最相关的文本内容,然后根据该信息征求GenAI的响应。下图总结了这些步骤。

问答阶段: 对于索引文本块时使用的问题嵌入,您需要完全相同的 LLM。索引后无法修改 LLM。任何训练、调优都将使搜索过程无法使用,因为 ANN over KEY 可能不一致。如果要更新或更改LLM,则需要重新索引。注意:查询延迟是嵌入延迟 + 矢量数据库查询延迟 + GenAI 的文本生成延迟之和。

对于问答阶段,这个过程很简单。我们首先使用用于索引向量数据库的相同 LLM 生成查询的向量嵌入。此嵌入用作查询 KEY,并执行近似近邻搜索 ANN 以查找数据库中最接近查询嵌入的几个向量。接近度的度量是预定义和固定的,通常是余弦相似性。识别最接近的向量后,其相应的文本块用作与问题相关的信息。然后,相关信息和问题通过提示提供给生成AI,如ChatGPT,以生成响应。

  • 注意:查询延迟是三个延迟的总和:嵌入问题文本延迟 + 向量数据库检索延迟 + GenAI 的文本响应生成延迟。如果您使用多个托管服务和不同的微服务,请准备好等待至少数百毫秒才能获得答案。显然,对于搜索引擎、电子商务和其他延迟关键型应用程序来说,这太慢了,其中超过 100 毫秒的延迟会导致糟糕的用户体验。这是一篇亚马逊博客,介绍了每 100 毫秒延迟如何花费 1% 的销售额。
  • 成本:如上一节所述,一旦数据位于外部托管服务上,查询成本可能会很高并被锁定。

已知嵌入和矢量搜索的基本限制:为什么现代信息检索智慧提倡学习索引?

除了上面提到的延迟、成本、更新模型的不灵活性和隐私等问题外,还有一个根本的缺点,即使用基于余弦相似性的ANN(文本检索)断开了嵌入过程(KEY生成)的连接。

一个假设和Andrej Karpathy最近的实验比较接近:整个生态系统背后的隐含假设是向量嵌入之间的余弦相似性在检索相关文本。 众所周知,可能有更好的选择。这些LLM没有针对余弦相似性检索进行微调,其他相似性函数可能工作得更好。这是Andrej Karpathy的帖子和他的笔记本,以及关于他如何发现基于SVM的相似性更好。

深度学习革命告诉我们,联合优化的检索系统总是比嵌入然后ANN的断开连接的过程更好,在ANN过程中,ANN过程完全忽略了嵌入部分,反之亦然。

因此,如果矢量搜索生态系统的最终目标是为所提出的问题检索相关文本,为什么有两个互不关联的过程?为什么不有一个统一的学习系统,在给定问题文本时返回最相关的文本?难怪Andrej发现学习的SVM比简单的点积检索更好。近五年来,信息检索社区一直在构建这种联合优化的嵌入和检索系统

神经信息检索系统最有效的形式是学习索引在本博客的第 2/3 部分中,我们将回顾学习索引并讨论行业中以前部署的学习系统。我们将介绍神经数据库,这是一个端到端的学习索引系统,它完全绕过了昂贵而繁琐的高维近邻搜索向量。

最后一部分(第 3/3 部分),我们将讨论 ThirdAI 的生产上使用的神经数据库 API 及其与 Langchain ChatGPT 的集成。我们的解决方案完美避开了嵌入过程以及矢量数据库检索的昂贵、缓慢和严格的限制!

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

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

相关文章

【编译】gcc make cmake Makefile CMakeList.txt 区别

文章目录 一 关系二 gcc2.1 编译过程2.2 编译参数2.3 静态库和动态库1 后缀名2 联系与区别 2.4 GDB 调试器1 常用命令 三 make、makefile四 cmake、cmakelist4.1 语法特性4.2 重要命令4.2 重要变量4.3 编译流程4.4 两种构建方式 五 Vscode5.0 常用快捷键5.1 界面5.2 插件5.3 .v…

点播播放器如何自定义额外信息(统计信息传值)

Web播放器支持设置观众信息参数&#xff0c;设置后在播放器上报的观看日志中会附带观众信息&#xff0c;这样用户就可以通过管理后台的统计页面或服务端API来查看特定观众的视频观看情况了。 播放器设置观众信息参数的代码示例如下&#xff1a; <div id"player"…

加利福尼亚大学|3D-LLM:将3D世界于大规模语言模型结合

来自加利福尼亚大学的3D-LLM项目团队提到&#xff1a;大型语言模型 (LLM) 和视觉语言模型 (VLM) 已被证明在多项任务上表现出色&#xff0c;例如常识推理。尽管这些模型非常强大&#xff0c;但它们并不以 3D 物理世界为基础&#xff0c;而 3D 物理世界涉及更丰富的概念&#xf…

【100天精通python】Day20:文件及目录操作_os模块和os.psth模块,文件权限修改

目录 专栏导读 1 文件的目录操作 os模块的一些操作目录函数​编辑 os.path 模块的操作目录函数 2 相对路径和绝对路径 3 路径拼接 4 判断目录是否存在 5 创建目录、删除目录、遍历目录 专栏导读 专栏订阅地址&#xff1a;https://blog.csdn.net/qq_35831906/category_12…

Java中的代理模式

Java中的代理模式 1. 静态代理JDK动态代理CGLib动态代理 1. 静态代理 接口 public interface ICeo {void meeting(String name) throws InterruptedException; }目标类 public class Ceo implements ICeo{public void meeting(String name) throws InterruptedException {Th…

【信号去噪和正交采样】流水线过程的一部分,用于对L波段次级雷达中接收的信号进行降噪(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

计算机网络——应用层

文章目录 **1 网络应用模型****2 域名系统DNS****3 文件传输协议FTP****4 电子邮件****4.1 电子邮件系统的组成结构****4.2 电子邮件格式与MIME****4.3 SMTP和POP3** **5 万维网WWW****5.1 HTTP** 1 网络应用模型 客户/服务器模型 C/S 服务器服务于许多来自其他称为客户机的主…

uniapp跨域解决

uniapp跨域解决 跨域是什么 跨域指的是浏览器不能执行其他网站的脚本&#xff0c;当一个网页去请求另一个域名的资源时&#xff0c;域名、端口、协议任一不同&#xff0c;就会存在跨域。跨域是由浏览器的同源策略造成的&#xff0c;是浏览器对JavaScript施加的安全限制。 报错…

Spring AOP 中,切点有多少种定义方式?

在 Spring AOP 中&#xff0c;我们最常用的切点定义方式主要是两种&#xff1a; 使用 execution 进行无侵入拦截。使用注解进行拦截。 这应该是是小伙伴们日常工作中使用最多的两种切点定义方式了。但是除了这两种还有没有其他的呢&#xff1f;今天松哥就来和大家聊一聊这个话…

【C语言初阶(20)】调试练习题

文章目录 前言实例1实例2 前言 在我们开始调试之前&#xff0c;应该有个明确的思路&#xff1b;程序是如何完成工作的、变量到达某个步骤时的值应该是什么、出现的问题大概会在什么位置。这些东西在调试之前都需要先确认下来&#xff0c;不然自己都不知道自己在调试个什么东西…

FFmpeg aresample_swr_opts的解析

ffmpeg option的解析 aresample_swr_opts是AVFilterGraph中的option。 static const AVOption filtergraph_options[] {{ "thread_type", "Allowed thread types", OFFSET(thread_type), AV_OPT_TYPE_FLAGS,{ .i64 AVFILTER_THREAD_SLICE }, 0, INT_MA…

二十三种设计模式第二十篇--备忘录模式

备忘录模式&#xff0c;备忘录模式属于行为型模式。它允许在不破坏封装的情况下捕获和恢复对象的内部状态。保存一个对象的某个状态&#xff0c;以便在适当的时候恢复对象&#xff0c;该模式通过创建一个备忘录对象来保存原始对象的状态&#xff0c;并将其存储在一个负责管理备…

使用adb通过电脑给安卓设备安装apk文件

最近碰到要在开发板上安装软件的问题&#xff0c;由于是开发板上的安卓系统没有解析apk文件的工具&#xff0c;所以无法通过直接打开apk文件来安装软件。因此查询各种资料后发现可以使用adb工具&#xff0c;这样一来可以在电脑上给安卓设备安装软件。 ADB 就是连接 Android 手…

测试libcurl库的demo时,报错 curl_easy_perform() failed: SSL connect error

系统&#xff1a;麒麟V10 arm roothg-TR3250:/home/cur765/curl-7.65.3/docs/examples# cat /etc/os-release NAME"Kylin" VERSION"银河麒麟桌面操作系统(国防版)V10" VERSION_US"Kylin Linux Desktop (GFB)V10" IDkylin ID_LIKEdebian PRETT…

CloudDriver一款将各种网盘云盘挂在到电脑本地变成本地磁盘的工具 教程

平时我们的电脑可能由于大量的文件资料之类的导致存储空间可能不够&#xff0c;所以我们可以选择将网盘我们的本地磁盘用来存放东西。 CloudDrive 是一款可以将 115、阿里云盘、天翼云盘、沃家云盘、WebDAV 挂载到电脑中&#xff0c;成为本地硬盘的工具&#xff0c;支持 Window…

职工管理系统(code)

首先创建头文件、源文件&#xff0c;再编程。&#xff08;B站黑马程序员视频笔记&#xff09; 一、头文件.h 1、boss.h #pragma once #include<iostream> using namespace std; #include "worker.h"//老板类 class Boss :public Worker { public://构造函数B…

最优化方法

一. 图论 1.最小生成树 图的生成树是它的一颗含有其所有顶点的无环连通子图,一 幅加权图的最小生成树(MST)是它的一颗权值(树中的所有边的权值之和) 最小的生成树 • 适用场景&#xff1a;道路规划、通讯网络规划、管道铺设、电线布设等 题目数据 kruskal算法 稀疏图&#x…

【Git系列】了解什么是版本控制

&#x1f433;了解什么是版本控制 &#x1f9ca;1. 什么是版本控制&#x1f9ca;2. 为什么要有版本控制&#x1f9ca;3. 常见的版本控制工具&#x1f9ca;4. 版本控制分类&#x1fa9f;4.1 本地版本控制&#x1fa9f;4.2 集中版本控制&#x1fa9f;4.3 分布式版本控制 学习git之…

Elasticsearch和Kibana的安装及验证

金翅大鹏盖世英&#xff0c;展翅金鹏盖世雄。 穿云燕子锡今鸽&#xff0c;踏雪无痕花云平。 ---------------- 2023.7.31.101 ----------------- 本文密钥&#xff1a;365 Elasticsearch 是一个分布式的 RESTful 风格的搜索和数据分析引擎&#xff0c;常用来进行全文检索、…