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

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

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

人类的记忆是不可靠的。因此,只要我们试图以书面形式收集“知识”,我们就必须弄清楚如何在不反复重读同一本书的情况下搜索相关内容。这就是为什么一些天才引入了倒排索引(inverted index)。最简单的形式就是书末的附录,通常列出基本术语及其出现的页码链接。术语按字母顺序排列。在过去,这是一份需要花费大量精力手工制作的列表。数字化时代开启后,制作变得容易多了,但我们仍然遵循相同的通用原则。这种方法过去有效,现在依然有效。

如果您要在某本书中查找特定主题,可以尝试找到相关短语并快速跳转到正确页面。当然,前提是您知道正确的术语。如果您不知道,就必须多次尝试并失败,或者找别人帮您构建正确的查询。

A simplified version of the inverted index.

倒排索引的简化版本。

随着时间的推移,这一领域长期以来并没有太大变化。但我们的文本数据收集开始以更快的速度增长。因此,我们也开始围绕这些倒排索引构建许多流程。例如,我们允许用户提供多个词,并开始将它们拆分。这使得查找某些不一定包含所有查询词、但可能包含部分查询词的文档成为可能。我们还开始将单词转换为它们的词根形式以覆盖更多情况,去除停用词等。实际上,我们变得越来越人性化。尽管如此,整个过程背后的思想仍然源自中世纪以来最直接的关键词搜索,只是做了一些调整。

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

分词处理过程,包含额外的停用词去除和词根转换。

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

An example of a query vectorized to sparse format.

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

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

巴别塔

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

The Tower of Babel, Pieter Bruegel.

巴别塔,皮特·勃鲁盖尔。

表征革命

机器学习在 NLP 领域的最新研究主要集中在训练深度语言模型上。在此过程中,神经网络以大型文本语料库作为输入,并以向量形式创建单词的数学表示。创建这些向量的方式是:含义相似且出现在相似上下文中的单词会被归为一类,并由相似的向量表示。我们还可以取所有单词向量的平均值,为整个文本(例如查询、句子或段落)创建一个向量。

deep neural

我们可以采用神经网络生成的这些稠密向量(dense vectors),并将它们用作不同的数据表示。它们之所以被称为“稠密”,是因为神经网络很少在任何位置产生零值。与稀疏向量相反,它们的维度相对较低——只有几百或几千。遗憾的是,如果我们想通过观察向量来查看和理解文档内容,已不再可能。维度不再代表特定单词的存在。

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

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 上,还是通过像 SentenceTransformers 这样的库。不过,如果您不想亲自处理神经模型,也可以使用 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 Issue。