Press "Enter" to skip to content

(向量)指数的隐藏世界

一切关于(向量)索引的你一直想知道但又害怕问的事情。

自ChatGPT公开发布以来,几乎每天都有新内容讨论LLMs、RAGs和向量数据库。技术界对LLMs的可能性充满期待,将其视为将改变我们生活的最新技术:对某些人来说是最好的,对其他人来说是最糟糕的。在它们之外,检索增强生成(RAG)作为适应不断变化的知识领域的动态解决方案浮出水面。但是在幕后有一个至关重要的角色:向量索引和数据库。

尽管LLMs、RAGs和向量数据库被广泛讨论,但掌握这些创新的(向量)索引却为人所知甚少。在这篇文章中,我们将揭示索引的概念,帮助您了解索引是如何轻松地在庞大的数据集中查找信息的。

1. 什么是索引?

我们都遇到过这样的情况。你要去朋友家找她。她唯一给你的信息是:“我住在都市区。”当你到达所说的都市区时:

授权使用:Manson Yim(来自Unsplash的照片)

嗯,没有任何帮助的话,找到她的地方将会花上一段时间!要是入口处有张地图就好了…

这正是索引的作用:快速找到人(或数据)的位置。

黄页是一种索引,可以按照人名找到他们的住址。

索引是一种用于提高数据检索操作速度的数据结构。换句话说,它是如何组织信息,使您能够快速找到自己需要的信息。

数据使用进行索引。顺序是基于键的,并且可以使用多个键。在黄页中,第一个键是姓氏,第二个键是名字。

索引不一定存储整个数据。它只关注用于快速定位和访问整个数据集中特定数据片段的关键部分。

书末的索引是一个很好的例子:它向您显示在哪里找到使用该词的页面,因此它将每个词映射到页面编号,而不是句子本身。

索引是搜索引擎和数据库背后的关键:它们在提高数据检索操作的效率和速度方面发挥着至关重要的作用。

如何组织您的数据选择是至关重要的,并取决于上下文。

例如,在黄页的例子中,如果索引是按照电话号码组织的,而您只知道姓名,那么找到他们的地址将变得非常具有挑战性!

(向量)指数的隐藏世界 四海 第2张

信息确实存在,您最终会找到它,但所需的时间将阻止您甚至尝试。另一方面,使用黄页,对页面的一瞥就可以精确地知道您是否需要向前或向后查找!字典排序可以让您进行粗略的对数级搜索。这就是为什么选择索引很重要。

总的来说,索引具有非常明确的目的:它可以被设计用于执行快速的数据插入或检索操作,或者更复杂的查询,比如范围查询(“检索今年5月1日到8月15日期间的所有数据”)。要优化的操作的选择将决定索引的形式。

在线事务处理(OLTP)和在线分析处理(OLAP)数据库之间的主要区别在于它们想要优化的操作的选择:OLTP侧重于对行的操作(例如更新条目),而另一种侧重于对列的操作(例如计算平均值)。这两种数据库将不会使用相同的索引,因为它们不以相同的操作为目标。

1.1 索引和数据结构之间的区别是什么?

💡数据结构是一种在计算机中组织和存储数据的方式,以便能够高效地访问和操作。按照这种解释,索引和数据结构之间的区别有时很难看到,那么它们之间有什么区别呢?索引专注于插入、搜索、排序或筛选数据。数据结构更具通用性。

索引是使用数据结构构建的,但通常不存储数据本身。

如果考虑一个电影数据库,当索引更新时,你不希望移动大文件:你存储文件的指针,而不是文件本身。指针可以看作是磁盘上文件的地址。

现在,你对索引的一般概念有了一个了解,让我们关注数字示例。下面是常见的(数字)索引:

  • 倒排索引
  • 散列索引
  • B树
  • 局部敏感哈希(LSH)

为了更好地理解索引的工作原理,让我们探讨最基本的索引之一:倒排索引。

1.2 倒排索引

倒排索引是搜索引擎中使用的标准索引。

它旨在快速找到信息的位置:它旨在优化检索时间。

简而言之,倒排索引将内容映射到其位置,有点像书的索引。它经常用来将特征映射到具有该特征的数据。

例如,假设你想知道谁住在同一座大楼里。

首先,你应该有一张表,其中对于每个名字,你都有楼宇(这个表将帮助你找到Alice):

(向量)指数的隐藏世界 四海 第3张

每当一个人到达或离开该地区时,该表就会被更新。

如果你想在这个表中找到住在B栋楼的人,你必须遍历整个表。

虽然在技术上是可行的,但随着表的大小线性增长,计算时间会线性增加。

想象一下该地区的公寓数量:如果你想通过逐个检查所有个人资料来找到所有住在B栋楼的人,这将需要一些时间!

另一种解决方案是使用倒排索引:你维护一个表,其中楼宇被用作键,并与住在其中的人员相连接:

(向量)指数的隐藏世界 四海 第4张

与之前相比,此表同时维护:添加或删除新人的成本略高于之前,但检索时间几乎为零!

要找出谁住在B栋楼,你只需要访问此表的行“Building B”并获得结果!

电话号码的反向查找是电话号码的反向索引!

实际上,倒排索引比(用户,兴趣)对更复杂,因为它们操作比较复杂的数据。索引通常以哈希表的形式存储。

尽管相对简单,倒排索引是搜索引擎中使用最常见的索引之一。

1.3 索引和数据库

数据库是建立在索引之上的。索引增强了数据库中的数据检索,通过存储指向数据库数据的指针或引用。它不存储实际数据,但作为快速访问数据的一种方式,显著提高了查询性能。

数据库不仅仅是索引,它是全面的数据管理系统。它存储、组织和管理实际数据,强制数据完整性,处理事务,并提供一系列超出索引的功能,使其成为数据存储和操作的中心枢纽。虽然索引加快了数据库内部的数据检索,但数据库作为完整的数据存储、管理和检索生态系统。

(向量)指数的隐藏世界 四海 第5张

总结一下,索引就像数据库中的路标,指引你寻找数据的方向。相比之下,数据库是实际数据存放的仓库,并配备了各种工具和功能来管理和操作这些数据。

根据你的使用情况,你可能不需要整个数据库,只需要索引,因为管理数据的覆盖可能很昂贵。

2. 矢量索引和矢量数据库

2.1 什么是矢量索引?

简而言之,矢量索引是以向量为关键字的索引

在我们的反向索引示例中,关键字是单词(爱好和姓名)。在矢量索引中,我们处理向量:固定大小的数字序列。

大小为4的两个向量。

我知道,我知道,我能听见你说,“我数学不好,我不想用向量”。

别担心,你不需要擅长数学就能理解矢量索引。

你只需要知道使用向量能够让你依赖强大且经过优化的操作。

你可能首先会问自己:“你的向量有什么有趣的地方”?

假设你最终找到了Alice的住处,现在你想找点东西吃。你可能想要找到最近的餐厅。你寻找了一份餐厅列表,得到一个包含餐厅、特色和地址的表格。让我们看看你可以找到的信息:

(向量)指数的隐藏世界 四海 第7张

看起来没什么用对吧?你唯一的选择是逐一扫描列表,一个一个读取地址,并手动评估离你的距离有多近。我们可以尝试自动排名最近的地方,但是基于原始地址计算距离很困难(两条街可能相邻但有不同的名字)。

然而,现在想象一下,你有一张包含每个餐厅精确纬度和经度的GPS位置表:

(向量)指数的隐藏世界 四海 第8张

每个位置都是一个大小为2的向量。有了这些向量,你可以通过一个简单而快速的数学操作轻松计算到自己位置的距离。然后你可以快速找到最近的餐厅,换句话说,距离你最近的餐厅!

(向量)指数的隐藏世界 四海 第9张

现在你可以轻松找到最近的餐厅!

有趣的是,通过直接以向量(在这个例子中是GPS位置)建立索引,我们可以优化索引,使得查找最小距离的条目非常快速。

矢量索引是专门设计用于高效检索与给定向量最接近或相似的向量的索引。这些索引依靠优化的数学操作来高效识别最相似的向量。

在我们的示例中,使用的距离是经典距离,但对于所有现有的距离或相似度,比如余弦相似度度量,都有相应的索引。

局部敏感哈希(LSH)是在数据集中查找最相似的k个数据点中最常用的索引之一,它可以处理不同的距离或相似度。

“这很好,但我在我的数据库中没有使用向量。”

这就是令人兴奋的部分:您可以将任何东西转化为向量。

仅仅采用二进制表示将是低效的,因为它可能包含噪音,因此找到能够保持数据特征的表示方法非常重要。

将不同信息表示为向量以利用向量索引已成为提高系统效率的标准方法。向量化已经成为一门艺术。

例如,如果您有一个图像数据集,并且希望拥有一个数据库,可以在其中找到与给定图像最相似的图像,您可以使用图像的SIFT描述符。

2.2 向量索引和向量数据库有什么区别?

向量索引和向量数据库的区别与索引和数据库的区别相同:索引仅用于快速查找数据所在位置,而向量数据库使用向量索引来执行快速检索查询,同时还存储和维护数据并提供其他操作和属性。

现在您已经了解了向量索引,您可能想知道为什么有关LLMs和RAGs的讨论也涉及向量索引。为了理解原因,让我们快速解释一下检索增强生成(RAG)是什么。 RAG充当对LLMs固有限制的一个巧妙解决办法,即它们的知识有限。

LLMs只知道它们训练时的数据。一个增加它们知识的技术是提示工程,其中将额外数据集成到查询提示中:“给定这些数据{data},回答这个问题:{question}”。

虽然有效,但该方法面临一个新的挑战:可扩展性。提示的大小不仅有限,而且您包含的数据越多,查询的成本就越高。

为了克服这一点,检索增强生成通过仅插入最相似的数据来限制数据的数量,这就是向量索引的作用所在!

它的工作原理如下:所有文档最初都使用LLMs(1)转换为向量。更具体地说,使用LLM的编码器部分。

这些向量用作索引文档的键(2)。

在执行查询时,使用LLM将查询向量化(3)。然后在向量索引中查询生成的向量以检索最相似的文档(4)。然后使用这些文档使用提示工程来回答查询(5)。

就是这样了!

正如您所看到的,与LLM类似,向量索引在RAG中占据着核心位置。

有些人更喜欢使用向量数据库而不是向量索引。当您想要在多个应用程序中重用相同的数据时,这是可以的。然而,如果您主要关注检索效率或希望根据每个应用程序定义索引的灵活性,单个向量索引通常更简单且更快速。

结论

恭喜那些勇敢读到底的人!我相信您现在已经具备了参与关于LLMs和RAGs的热烈讨论所需的背景知识。

索引在数据检索中起着核心作用。由于数据检索很可能仍然是数据技术的关键组成部分,所以了解索引,包括向量索引,是至关重要的。

如果您想了解更高级的索引,请阅读我关于LSH的文章。如果您希望学习一些更实际的内容,并且对于在实时检索增强生成(RAG)中体验到行动的好奇心,可以考虑探索LLM-app,在那里您可以亲身体验这些技术的威力。

Leave a Reply

Your email address will not be published. Required fields are marked *