LLM-向量数据库中的索引算法总结

news2024/9/25 7:14:26

文章目录

  • 前言
  • 向量数据库介绍
  • 索引方法
    • 倒排索引
    • KNN 搜索
    • 近似 KNN 搜索
    • Product Quantization(PQ)
    • NSW 算法搜索
    • HNSW

前言

向量数据库是当今大模型知识库检索落地实践的核心组件,下图是构建知识库检索的架构图:
image.png

  • 首先会将相关文档数据向量化嵌入到向量化数据库中,然后将用户的查询语句转为向量化查询,从向量数据库中召回相似度高的 TOP N 条数据。
  • 然后在对这 TOP N 进行排序,取其中几条,构造成 prompt ,和 LLM 交互查询。

向量查询的数据与 query 的相似度,直接影响到 prompt 的好坏,本文将对市面上已有的向量数据库进行简单介绍,然后会对其使用到的索引方法进行说明,包括倒排索引,KNN,Approximate KNN, Product Quantization, HSNW 等,会对这些算法的设计理念和方法进行说明。

向量数据库介绍

image.png
目前开源的比较火的三大向量数据库为 Chroma, Milvus, Weaviate,关于他们的介绍与区别这篇文章我觉得讲的不错,感兴趣的可以看下:三大开源向量数据库大比拼。
下边是开源向量数据库的发展历程:
image.png
它们用到的索引方法如下:
image.png

索引方法

倒排索引

image.png
假如现在我有一个使用倒排索引的数据库,其中存储了10的12次方个索引数据,我们在往数据库中存储数据的时候,会将数据切分,然后记录被切分后的单词对应的索引位置有哪些, 因为不同句子可能会出现相同的单词,因此每个单词对应的是一个索引集合:

  • 大模型——>[…]
  • 应用——>[…]

假设现在我有一个 query: 大模型的应用会在2024年有哪些发展?
数据库将我们的查询语句切分为三个关键单词:大模型,2024年,发展。然后查询出每个单词对应的索引结合,求交集,这一查询过程就叫做召回。
此时,我们就拿到了和查询相关联的数据,但是这些数据与查询语句相似度是不同的,我们需要对其进行排序,取 TOP N。
但是这种直接将文本数据和索引对应的查询效率并不高,我们有没有什么办法可以加速相似度检索呢?
这个时候就出现了向量化检索,将数据转化为向量,然后在通过计算向量的相似度距离两方面来检索:
image.png

KNN 搜索

KNN 搜索叫做 K 近邻搜索,将查询语句转换为向量,然后再求该向量与数据库中的向量相似度最高,距离最近的向量集。
image.png
其中时间复杂度为O(N)*O(d), d 为维度,维度数据一般为固定的,假设数据库中存储了 10000个向量数据,其中维度都为 1024,那么查询出 maxSim(q,v)(相似度最高),minDist(q,v)(距离最近)的向量的时间复杂度就位 O(10000)*O(1024)。
这种检索方式的优点是查出来的数据精确度高,缺点就是慢。

近似 KNN 搜索

近似 KNN 搜索就是将搜索空间从点变为块,先确定距离最近的那一块,然后再在该快空间中寻找距离最近,相似度最高的点,下图中左边是KNN搜索,有边是 近似 KNN 搜索:
image.png
其中每个块中都会有一个中心点,计算查询点与块的距离就是计算查询点到每个块的中心点的距离:
image.png
比如说上图中的查询步骤如下:

  • 查询点距离最近的块为 C6(距离C6的中心点最近)
  • 然后查询 C6 中距离最近,相似度最高的点

但是通过我们肉眼可以看出其中红色和橙色的块的中心点虽然离查询点远,但是它们块中的点离查询点近,这个时候就需要扩大搜索块的范围:
image.png
下边是求相似度最高和距离最近的算法公式,其中相似度最高(COS_SIM)是通过余弦计算,距离最近有两种算法,欧式算法和曼哈顿算法,这里就不展开讲解了:
image.png

Product Quantization(PQ)

PQ 算法首先会将所有向量划分为多个子空间,和近似 KNN 一样每个子空间都有一个中心点(centroid)。
然后会将原有高维向量拆分为多个低维向量子向量,使用距离该子向量最近的中心点作为该子向量的 PQ ID,然后一个高维向量就由多个 PQ ID 构成,大大压缩了空间。
image.png
比如说上图中1024维的向量被拆分为4个 256维的子向量,然后这四个子向量距离最近的中心点分别为:50,118,29,47。因此,该1024 维的向量就可以用 V=(50,118,29,47) 表示,同时它的 PQ code 也是 (50,118,29,47) 。
因此使用 PQ 算法的向量数据库就需要保存所有中心点的信息以及所有高维向量的 PQ code。
假设现在我们有一个查询语句,需要从向量数据库中查询出相似度最高的向量,使用 PQ 算法该如何查询呢?

  • 首先会将我们的查询语句转换为一个查询向量
  • 然后该查询向量会和每一个向量的 PQ code 进行距离计算,其实也就是和 PQ code 中的每一个中心点进行距离计算然后相加,如下图所示:

image.png

  • 然后按照上边这种方式,和每一个子向量的 PQ code 进行计算,就可以算出距离最近的向量了,但是这种和中心点进行计算的算法会存在误差,如下图所示:

image.png
左边的是误差很小的情况,右边的是误差比较大的情况,一般会存在少数误差,但是大部分误差是比较小的。

使用缓存加速计算
如果说原始查询向量和每一个子向量的 PQ code 都需要进行一次距离计算,那么和近似 KNN 算法没有多大区别,空间复杂度都为O(n)*O(k),那么该算法的意义是什么呢?就只是单纯为了压缩,减少空间存储吗?
假设将所有向量划分为 K 个子空间,每一个子空间中有 n 个点,我们将每个子空间中的点到其中心点的距离提前计算出来,放到一个二维矩阵中,然后查询向量对应的每一个子向量到中心点的距离我们可以直接从矩阵中查询出来,如下图所示:
image.png
最后我们只需要将每个子向量的距离相加开平方根即可。

近似 KNN 与 PQ 算法结合
这两种算法是不冲突的,可以先使用近似 KNN,将所有向量划分为多个子空间,然后将查询向量定位到对应的子空间中。
这样再在子空间中使用 PQ 算法,加速计算。

NSW 算法搜索

在一个给定向量数据集中,按照某种度量方式,检索出与查询向量相近的K个向量(K-Nearest Neighbor,KNN),但由于KNN计算量过大,我们通常只关注近似近邻(Approximate Nearest Neighbor,ANN)问题。
NSW在构图时,每次随机选择点,加入图中。每次加入点都查找与其最近邻的m点以添加边。最终形成如下图所示的结构:

在搜索 NSW 图时,我们从预定义的入口点开始。这个入口点连接到附近的几个顶点。我们确定这些顶点中的哪一个最接近我们的查询向量并移动到那里。

如从A开始,A的临近点C离P的距离更近更新。然后C的临近点D距离P更近,然后D的临近点B和F没有更近,程序停止,即为D点。

HNSW

图的构建从顶层开始。进入图表后,算法贪婪地遍历边,找到与我们插入的向量q最接近的ef邻居——此时ef = 1。
找到局部最小值后,它会向下移动到下一层(就像在搜索期间所做的那样)。重复这个过程,直到到达我们选择的插入层。这里开始第二阶段的建设。
ef值增加到我们设置的efConstruction参数,这意味着将返回更多最近的邻居。在第二阶段,这些最近的邻居是新插入元素q的链接的候选者, 并作为下一层的入口点。
经过多次迭代后,添加链接时还要考虑两个参数。M_max,它定义了一个顶点可以拥有的最大链接数,同样的M_max0,它定义了针对第 0 层中的顶点的最大连接数。

HNSW 代表 Hierarchical Navigable Small World,一个多层图。数据库中的每个对象都在最低层(图片中的第 0 层)中捕获。这些数据对象连接得很好。在最低层之上的每一层上,表示的数据点较少。这些数据点与较低层匹配,但每个较高层中的点呈指数级减少。如果有搜索查询,将在最高层找到最近的数据点。在下面的示例中,这只是多了一个数据点。然后它更深一层,从最高层中第一个找到的数据点中找到最近的数据点,并从那里搜索最近的邻居。在最深层,将找到最接近搜索查询的实际数据对象。
HNSW 是一种非常快速且内存高效的相似性搜索方法,因为只有最高层(顶层)保存在缓存中,而不是最低层中的所有数据点。只有最接近搜索查询的数据点在被更高层请求后才会被加载,这意味着只需要保留少量内存。

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

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

相关文章

视图库对接系列(GA-T 1400)十六、视图库对接系列(本级)通知(订阅回调)

说明 之前我们实现了订阅接口,其中有一个receiveAddr参数, 这个就是对应的回调的地址。一般情况下对应的是同一个服务。 我们推荐使用http://xxx:xxx/VIID/SubscribeNotifications接口文档 SubscribeNotificationList对象对象如下: 文档中是xml,但实际上目前使用的都是jso…

在 PostgreSQL 里如何处理数据的归档和清理策略的优化?

文章目录 在 PostgreSQL 中处理数据归档和清理策略的优化一、理解数据归档和清理的重要性二、确定归档和清理的标准三、PostgreSQL 中的数据归档方法(一)使用分区表(二)导出数据 四、PostgreSQL 中的数据清理方法(一&a…

操作系统——内存管理(面试准备)

虚拟内存 单片机没有操作系统,每次写完代码,都需要借助工具把程序烧录进去,这样程序才能跑起来。 另外,单片机的CPU是直接操作内存的物理地址。 在这种情况下,想在内存中同时运行两个程序是不可能的,如果第…

JavaFx+MySql学生管理系统

前言: 上个月学习了javafx和mysql数据库,于是写了一个学生管理系统,因为上个月在复习并且有一些事情,比较忙,所以没有更新博客了,这个项目页面虽然看着有点简陋了,但是大致内容还是比较简单的,于是现在跟大家分享一下我的学生管理系统,希望对这方面有兴趣的同学提供一些帮助 &a…

浪潮服务器内存物理插槽位置

浪潮服务器内存物理插槽位置 如下图所示

在iPhone / iPad上轻松模拟GPS位置 AnyGo for Mac

在iPhone / iPad上轻松模拟GPS位置 AnyGo for Mac AnyGo for Mac是一款专为Mac电脑用户设计的虚拟定位工具。它可以模拟你的GPS位置,让你的设备显示你在任何世界上的任何地方。无论你是想在游戏中虚拟移动,还是在社交媒体上分享虚拟的旅行照片&#xff0…

基于SpringBoot+MySQL的租房项目+文档

💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

05 以物品与用户为基础个性化推荐算法的四大策略

《易经》:“九二:见龙在田,利见大人”。九二是指阳爻在卦中处于第二位,见龙指龙出现在地面上,开始崭露头角,但是仍须努力,应处于安于偏下的位置。 本节是模块二第一节,模块二讲解传…

从业务架构到应用架构技术剖析

从业务架构到应用架构 4A架构理论,一个企业级架构框架,将企业架构(EA)划分为四大核心领域,每个领域都聚焦于组织的不同维度。该理论提供了一种结构化的设计和理解企业运作方式的方法,确保技术解决方案能…

前端面试题53(在vue中history与hash区别)

在Vue.js应用中,路由(routing)是管理应用程序中不同页面(视图)的重要部分。Vue Router提供了两种路由模式来管理URL:hash模式和history模式。下面详细介绍这两种模式的区别: 1. Hash 模式 原理…

如何在idea安装git,使用gitee?

一、什么是git,git与gitee、GitHub的关系? 1.什么是git? Git 是一个开源的分布式版本控制系统,用于企业项目中程序员协同开发。 2.git与gitee、GitHub的关系是什么? git :Git是一种版本控制系统&#x…

Linux:NFS共享存储

目录 一、NFS基本概述 二、NFS共享文件实验 2.1、安装nfs和rpcbind软件 2.2、修改配置文件设置共享 2.3、创建共享目录 ​编辑 2.4、开启服务 2.5、客户端验证共享目录可访问 三、tcpdump命令 3.1、概述 3.2、简单表达 3.3、过滤规则 ​编辑 3.4、tcpdump常见参数…

Redis分布式锁在高并发环境下的超卖问题

先看这样一段代码,购买商品,扣减库存的逻辑代码 当用户下单,并且调用扣减库存的接口时,先判断商品库存是否还有,因为是秒杀场景下,太多请求都打到数据库,可能会导致数据库崩溃,所以…

[leetcode] largest-divisible-subset 最大整除子集

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> largestDivisibleSubset(vector<int>& nums) {int len nums.size();sort(nums.begin(), nums.end());// 第 1 步&#xff1a;动态规划找出最大子集的个数、最大子集中的最大整…

Djngo项目创建的准备工作【5】

【 一 】搭建纯净模式 核心就是 在安装完drf之后记得在app里面注册rest_framework, # django 默认很多app--》很多表auth 6个表session 表content-type表 # django很多中间件 ​ # 以后我们的项目&#xff0c;可能不用这些东西---》由于带了内置app&#xff0c;这些表就会创建…

MaxViT : 多轴Vision Transformer

本文提出了一种高效、可扩展的多轴注意力模型,该模型包括两个方面:局部注意力被阻塞和全局注意力被扩张。这些设计选择允许在任意输入分辨率下的全局-局部空间交互,只有线性复杂度。还通过有效地将注意力模型与卷积混合在一起,提出了一个新的架构元素,并相应地提出了一个简…

IAR全面支持芯驰科技E3系列车规MCU产品E3119/E3118

中国上海&#xff0c;2024年7月11日 — 全球领先的嵌入式系统开发软件解决方案供应商IAR与全场景智能车芯引领者芯驰科技宣布进一步扩大合作&#xff0c;最新版IAR Embedded Workbench for Arm已全面支持芯驰科技的E3119/E3118车规级MCU产品。IAR与芯驰科技有着悠久的合作历史&…

强化学习实战3:Sarsa 与 Q-Learning 算法求解迷宫问题

前置知识 首先实验环境依然是我们之前说的迷宫环境&#xff0c;然后是一些基本术语&#xff0c;应该都是比较熟悉的&#xff1a; 强化学习的算法大概有两类&#xff0c;一类是策略迭代&#xff08;讲究的是策略 Π &#xff09;&#xff0c;还有一类是价值迭代&#xff0c;也就…

电脑 DNS 缓存是什么?如何清除?

DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;是互联网的重要组成部分&#xff0c;负责将人类易记的域名转换为机器可读的 IP 地址&#xff0c;从而实现网络通信。DNS 缓存是 DNS 系统中的一个关键机制&#xff0c;通过临时存储已解析的域名信息&#xf…

lnmp+DISCUZ+WORDPRESS

lnmpDISCUZWORDPRESS lnmpDISCUZ&#xff08;论坛的一个服务&#xff09; l&#xff1a;linux操作系统 n&#xff1a;nginx前端页面的web服务 php&#xff1a;动态请求转发的中间件 mysql&#xff1a;数据库 保存用户和密码以及论坛的相关内容 mysql8.0.30安装&#xff1a…