Qdrant中的向量搜索是如何工作的?

如果您仍在试图理解向量搜索的工作原理,请继续阅读。本文档描述了向量搜索的使用方式,涵盖了Qdrant在更大生态系统中的地位,并概述了如何使用Qdrant来增强您现有的项目。

对于那些想要立即开始编写代码的人,请访问我们的完整的初学者教程,在5-15分钟内构建一个搜索引擎。

人类的记忆是不可靠的。因此,只要我们试图以书面形式收集“知识”,我们就必须弄清楚如何在不重复阅读同一本书的情况下搜索相关内容。这就是为什么一些聪明的人引入了倒排索引。最简单的形式是,它是书的附录,通常放在书的末尾,列出了重要术语及其出现的页面链接。术语按字母顺序排列。在过去,这是一个手工制作的列表,需要大量的努力来准备。一旦数字化开始,这变得容易得多,但我们仍然保留了相同的基本原则。这种方法有效,而且现在仍然有效。

如果您在特定书籍中寻找特定主题,可以尝试查找相关短语并快速找到正确的页面。当然,前提是您知道正确的术语。如果您不知道,您必须多次尝试和失败,或者找其他人帮助您形成正确的查询。

A simplified version of the inverted index.

倒排索引的简化版本。

时间流逝,我们在那个领域很长时间没有太大的变化。但我们的文本数据收集开始以更快的速度增长。因此,我们也开始围绕这些倒排索引建立许多流程。例如,我们允许用户提供许多单词,并开始将它们拆分成部分。这使得可以找到一些不一定包含所有查询词,但可能包含部分查询词的文档。我们还开始将单词转换为其词根形式以覆盖更多情况,去除停用词等。实际上,我们变得越来越用户友好。尽管如此,整个过程背后的想法仍然源自中世纪以来已知的最简单的基于关键字的搜索,只是进行了一些调整。

The process of tokenization with an additional stopwords removal and converstion to root form of a word.

分词过程包括额外的停用词去除和将单词转换为词根形式。

从技术上讲,我们将文档和查询编码为所谓的稀疏向量,其中每个位置都对应整个字典中的一个单词。如果输入文本包含特定单词,则该位置将获得一个非零值。但实际上,没有任何文本会包含超过数百个不同的单词。因此,大多数向量将包含数千个零和少量非零值。这就是我们称它们为稀疏的原因。它们可能已经被用来通过找到具有最大重叠的文档来计算一些基于单词的相似性。

An example of a query vectorized to sparse format.

一个查询向量化为稀疏格式的示例。

稀疏向量具有相对高维度;等于字典的大小。而字典是从输入数据中自动获得的。因此,如果我们有一个向量,我们能够部分重建生成该向量的文本中使用的单词。

巴别塔

每当我们发现倒排索引的新问题时,我们就会提出新的启发式方法来至少在一定程度上解决它。一旦我们意识到人们可能会用不同的词来描述同一个概念,我们就开始构建同义词列表,将查询转换为标准化形式。但这对于我们未预见的情况不起作用。我们仍然需要手动制作和维护我们的词典,以便它们能够支持随时间变化的语言。另一个难题出现在多语言场景中。旧的方法需要设置单独的管道,并让人参与其中以保持质量。

The Tower of Babel, Pieter Bruegel.

巴别塔,彼得·勃鲁盖尔。

表示革命

最新的自然语言处理机器学习研究主要集中在训练深度语言模型上。在这个过程中,神经网络将大量文本语料作为输入,并以向量的形式创建单词的数学表示。这些向量的创建方式使得具有相似含义并在相似上下文中出现的单词被分组在一起,并由相似的向量表示。我们还可以以所有单词向量的平均值为例,为整个文本(例如查询、句子或段落)创建向量。

deep neural

我们可以获取网络生成的密集向量,并将它们用作不同的数据表示。它们是密集的,因为神经网络很少会在任何位置产生零值。与稀疏向量相反,它们的维度相对较低——只有几百或几千。不幸的是,如果我们想通过查看向量来查看和理解文档的内容,这已经不再可能。维度不再代表特定单词的存在。

密集向量可以捕捉文本的含义,而不是文本中使用的词语。也就是说,大型语言模型可以自动处理同义词。更重要的是,由于这些神经网络可能已经用多语言语料库进行了训练,它们将用不同语言书写的相同句子翻译成相似的向量表示,也称为嵌入。我们可以通过计算与数据库中其他向量的距离来比较它们,以找到相似的文本片段。

Input queries contain different words, but they are still converted into similar vector representations, because the neural encoder can capture the meaning of the sentences. That feature can capture synonyms but also different languages..

输入的查询包含不同的单词,但它们仍然被转换为相似的向量表示,因为神经编码器能够捕捉句子的含义。该特性可以捕捉同义词,也可以捕捉不同的语言。

向量搜索是一种基于嵌入相似性查找相似对象的过程。好处是,你不必自己设计和训练神经网络。许多预训练模型可用,无论是在HuggingFace上还是通过使用像句子变换器这样的库。然而,如果你不想接触神经网络模型,你也可以使用SaaS工具创建嵌入,比如co.embed API

为什么选择Qdrant?

向量搜索的挑战在于我们需要在一大组对象中找到相似的文档。如果我们想要找到最接近的示例,简单的方法需要计算与每个文档的距离。这在处理几十个甚至几百个示例时可能有效,但如果数量更多,可能会成为瓶颈。当我们处理关系数据时,我们会设置数据库索引以加快速度并避免全表扫描。向量搜索也是如此。Qdrant 是一个成熟的向量数据库,它通过使用类似图的结构在次线性时间内找到最接近的对象来加速搜索过程。因此,您不需要计算与数据库中每个对象的距离,而只需要计算与一些候选对象的距离。

Vector search with Qdrant. Thanks to HNSW graph we are able to compare the distance to some of the objects from the database, not to all of them.

使用Qdrant进行向量搜索。得益于HNSW图,我们能够比较与数据库中部分对象的距离,而不是所有对象。

在进行大规模的语义搜索时,因为这是我们有时称之为对文本进行的向量搜索,我们需要一个专门的工具来有效地完成这项工作——像Qdrant这样的工具。

下一步

向量搜索是稀疏方法的一个令人兴奋的替代方案。它解决了我们基于关键词搜索的问题,而无需手动维护大量的启发式方法。它需要一个额外的组件,即神经编码器,将文本转换为向量。

教程 1 - Qdrant 完全初学者指南 尽管其背景复杂,向量搜索的设置却异常简单。使用 Qdrant,您可以在五分钟内启动并运行一个搜索引擎。我们的完全初学者教程将向您展示如何操作。

教程2 - 问答系统 然而,你也可以选择SaaS工具来生成它们,避免构建自己的模型。如果你按照问答系统教程,使用Qdrant Cloud和Cohere co.embed API设置向量搜索项目是相当容易的。

关于向量搜索还有另一件令人兴奋的事情。只要有一个神经网络可以将你的数据类型向量化,你就可以搜索任何类型的数据。你有没有想过反向图像搜索?通过向量嵌入,这也是可能的。

这个页面有用吗?

感谢您的反馈!🙏

我们很抱歉听到这个消息。😔 你可以在GitHub上编辑这个页面,或者创建一个GitHub问题。