
向量嵌入数据库——或者简单地说,向量数据库——的核心功能是提供高质量的搜索结果,超越简单的关键词或同义词搜索,真正找到用户查询的含义,或者提供用户提出的问题的实际答案。
语义搜索(以及问答)本质上是基于相似性的搜索,例如基于文本的含义,或者基于图像中包含的对象。例如,考虑一个包含葡萄酒名称和描述的图书馆,其中一个描述提到该葡萄酒“适合搭配鱼”。关键词搜索“海鲜葡萄酒”,甚至同义词搜索,都找不到这款葡萄酒。基于含义的搜索应该理解“鱼”与“海鲜”相似,并且“适合搭配X”意味着该葡萄酒“适合X”——并且应该找到这款葡萄酒。

计算机如何模仿我们对语言的理解,以及词语或段落的相似性?为了解决这个问题,语义搜索在其核心使用一种称为向量嵌入(或简单地说,向量或嵌入)的数据结构,它是一个数字数组。以下是上述语义搜索的步骤
- 当数据对象被插入或更新到数据库中时,向量数据库使用给定的模型计算每个数据对象的向量嵌入。
- 这些嵌入被放置到索引中,以便数据库可以快速执行搜索。
- 对于每个查询,
- 使用与数据对象相同的方式计算向量嵌入。
- 使用特殊的算法,数据库找到与查询计算出的给定向量最接近的向量。
搜索的质量取决于模型的质量——这是“秘诀”,因为许多模型仍然是闭源。搜索的速度取决于向量数据库的性能能力。
什么是向量嵌入?
向量或向量嵌入是数据的数值表示,它捕捉了数据的某些特征。它们是对象在连续向量空间中的数学表示,用于捕捉这些对象的语义含义或属性,以便能够有效地搜索。
向量嵌入示例
例如,对于文本数据,“猫”和“小猫”具有相似的含义,即使“猫”和“小猫”这两个词在逐字比较时非常不同。为了使语义搜索有效工作, “猫”和“小猫”的嵌入表示必须充分捕捉它们的语义相似性。 这就是使用向量表示的原因,以及为什么它们的推导如此重要。
在实践中,向量嵌入是由机器学习模型生成的实数数组,具有固定的长度(通常从数百到数千个元素)。为数据对象生成向量的过程称为向量化。Weaviate 使用 与模型提供商的集成(OpenAI、Cohere、Google PaLM 等)生成向量嵌入,并方便地将对象和向量嵌入存储在同一个数据库中。例如,向量化上述两个词可能会产生以下词嵌入
cat = [1.5, -0.4, 7.2, 19.6, 3.1, ..., 20.2]
kitty = [1.5, -0.4, 7.2, 19.5, 3.2, ..., 20.8]
这两个向量具有非常高的相似度。相反, “banjo”或“喜剧”的向量与这两个向量不太相似。 在这种程度上,向量捕捉了词语的语义相似性。
现在你已经了解了向量是什么,以及它们在某种程度上可以表示含义,你可能还有进一步的问题。 其中之一是,每个数字代表什么? 这取决于生成向量的机器学习模型,并且至少在我们的语言和含义的概念方面,不一定是清晰的。 但有时我们可以通过将向量与我们熟悉的词语相关联来获得大致的了解。
基于向量的含义表示引起了前几年的轰动,并揭示了单词之间的数学运算。 也许最著名的结果是“king − man + woman ≈ queen”
这表明“king”和“man”之间的差异是某种“皇室”,这种皇室在数学上适用于“queen”减去“woman”。 Jay Alamar 提供了一个有用的可视化来解释这个等式。 几个概念(“woman”、“girl”、“boy”等)被向量化成(用)一个由 GloVe 模型生成的 50 个数字的数组。 在向量术语中,这 50 个数字称为维度。 向量使用颜色可视化,并排列在每个单词旁边

Credit: Jay Alamar
我们可以看到所有单词在一个维度中共享一个深蓝色列(尽管我们无法确定它代表什么),并且单词“water”看起来与其他单词非常不同,这很有道理,因为其余的都是人。 此外,“girl”和“boy”比“king”和“queen”更相似,而“king”和“queen”也彼此相似。 因此,我们可以看到这些单词的向量嵌入与我们对含义的直观理解相符。 更令人惊奇的是,向量嵌入不仅限于表示单词的含义。
可向量化的数据类型
可以从任何类型的数据对象生成有效的向量嵌入。 文本数据是最常见的,其次是图像,然后是音频数据(这就是 Shazam 基于简短甚至嘈杂的音频片段识别歌曲的方式),还有时间序列数据、3D 模型、视频、分子等。 生成嵌入的方式是,具有相似语义的对象将具有“接近”彼此的向量,即在向量空间中它们之间的“距离”很小。 可以通过多种方式计算该距离,最简单的方法之一是“每个向量中位于位置 i 的元素的绝对差之和”(请记住,所有向量都具有相同的固定长度)。 让我们看一些数字(保证没有数学!)并用另一个文本示例进行说明
对象(数据):包括猫、狗、苹果、草莓、建筑物、汽车的单词
搜索查询:水果
对象和查询的简化向量嵌入集(只有 5 个维度)可能如下所示
| 单词 | 向量嵌入 |
|---|---|
| cat | [1.5, -0.4, 7.2, 19.6, 20.2] |
| dog | [1.7, -0.3, 6.9, 19.1, 21.1] |
| apple | [-5.2, 3.1, 0.2, 8.1, 3.5] |
| strawberry | [-4.9, 3.6, 0.9, 7.8, 3.6] |
| building | [60.1, -60.3, 10, -12.3, 9.2] |
| car | [81.6, -72.1, 16, -20.2, 102] |
| 查询:fruit | [-5.1, 2.9, 0.8, 7.9, 3.1] |
如果我们查看向量的 5 个元素中的每一个,我们可以快速看到猫和狗比狗和苹果更接近(我们甚至不需要计算距离)。 同样,fruit 比其他单词更接近 apple 和 strawberry,因此这些将是“fruit”查询的头条结果。 但是这些数字来自哪里? 这才是真正的魔力所在,也是现代深度学习取得巨大进步的地方。
如何创建向量嵌入?
向量搜索的魔力主要在于为每个实体和查询生成嵌入的方式,其次在于如何在非常大的数据集中有效地搜索(有关后者,请参阅我们的“为什么向量搜索如此快速”文章)。 正如我们提到的,可以为各种媒体类型(例如文本、图像、音频等)生成向量嵌入。 对于文本,向量化技术在过去十年中发生了巨大的发展,从久负盛名的 word2vec(2013)到由 BERT 在 2018 年发布而引发的最新transformer模型时代。
词级密集向量模型(word2vec、GloVe 等)
word2vec 是 模型架构系列,它引入了语言处理中的“密集”向量概念,其中所有值均非零。 特别是 word2vec 使用神经网络 模型 从大量的文本语料库中学习词语关联(最初由 Google 使用 1000 亿个单词进行训练)。 它首先从语料库中创建词汇表,然后学习词语的向量表示,通常为 300 维。 在相似上下文中找到的词语在向量空间中具有接近的向量表示,但词汇表中的每个词语只有一个结果词向量。 因此,可以量化词语的含义——“run”和“ran”被认为比“run”和“coffee”更相似,但像“run”这样具有多种含义的词语只有一个向量表示。 正如其名所示,word2vec 是一个词级模型,不能单独生成表示较长文本(例如句子、段落或文档)的向量。 但是,可以通过聚合构成词语的向量来完成,通常通过合并权重来实现,以便某些词语比其他词语具有更高的权重。 然而,word2vec 仍然存在重要的局限性
- 它无法解决具有多种含义的词语(多义词): “run”、“set”、“go”或“take”每个词都有超过 300 种含义(!)
- 它无法解决具有歧义的词语:“to consult” 甚至可以成为自己的反义词,例如许多其他词语
这让我们进入下一个,最先进的,模型。
Transformer 模型 (BERT, ELMo 等)
当前最先进的向量嵌入模型基于一种称为“transformer”(如这篇论文中所介绍的)架构。像 BERT 及其后续模型这样的 Transformer 模型 通过查看每个词的上下文来创建完整的上下文嵌入,从而提高搜索准确性、精确率和召回率(尽管 BERT 成功的确切机制尚未完全理解)。与上下文无关的 word2vec 嵌入不同,transformer 生成的嵌入会考虑整个输入文本——每个词的出现都有其自身的嵌入,该嵌入会根据周围的文本进行修改。这些嵌入更好地反映了词语的多义性,只有在上下文中考虑时才能消除歧义。一些潜在的缺点包括
- 更高的计算需求:微调 transformer 模型要慢得多(需要数小时而不是数分钟)
- 更高的内存需求:上下文敏感性大大增加了内存需求,通常会导致有限的输入长度
尽管存在这些缺点,transformer 模型仍然取得了巨大的成功。 近期涌现了无数的文本向量化模型。 此外,还有许多用于其他数据类型(如音频、视频和图像)的向量化模型。 一些模型,例如 CLIP,能够将多种数据类型(在本例中为图像和文本)向量化到同一个向量空间中,从而仅使用文本搜索图像的内容。
向量嵌入可视化
下面我们可以看到向量空间中数据对象的向量嵌入可能是什么样子。 该图像显示每个对象嵌入为 3 维向量,以便于理解,实际上向量的维度可以从大约 100 到 4000 不等。
在下图中,你可以看到“Wolf”(狼)和“Dog”(狗)的向量彼此靠近,因为狗是狼的直系后代。 在狗的附近,你可以看到“Cat”(猫)这个词,它与“Dog”这个词相似,因为两者都是常见的宠物。 但在右侧更远的地方,你可以看到代表水果的词语,例如“Apple”(苹果)或“Banana”(香蕉),它们彼此靠近,但与动物术语相距较远。

使用 Weaviate 向量数据库存储和使用向量嵌入
因此,Weaviate 被配置为支持许多不同的向量化模型和向量化服务提供商。 你甚至可以 自带向量,例如,如果你已经有可用的向量化管道,或者如果没有可用的公共模型适合你。
例如,Weaviate 支持通过我们的 text2vec-huggingface 模块使用任何 Hugging Face 模型,以便你可以 从 Hugging Face 上发布的众多句子转换器中选择一个。 或者,你可以使用其他非常流行的向量化 API,例如 OpenAI 或 Cohere,通过 text2vec-openai 或 text2vec-cohere 模块。 你甚至可以使用 text2vec-transformers 在本地运行 transformer 模型,并且像 multi2vec-clip 这样的模块可以使用 CLIP 模型将图像和文本转换为向量。 但它们都执行相同的核心任务——将原始数据的“含义”表示为一组数字。 这就是语义搜索如此有效的原因。
总结
这篇博文解释了向量嵌入的概念和定义,它是向量数据库的核心,并实现了称为向量搜索的现代搜索技术。
总而言之,向量嵌入是对不同数据类型(如文本数据、图像数据或音频数据)的非结构化数据的数值表示。 根据数据类型,向量嵌入是使用能够将对象的含义转换为高维空间中的数值表示的机器学习模型创建的。 因此,有各种机器学习模型能够创建各种不同类型的向量嵌入,例如词嵌入、句子嵌入、文本嵌入或图像嵌入。
向量嵌入以数值形式捕获数据对象之间的语义关系,因此你可以通过确定它们在高维向量空间中的最近邻来找到相似的数据点。 这个概念也称为相似性搜索,可以应用于不同的应用程序,例如文本搜索、图像搜索或推荐系统。
现在你已经很好地理解了什么是向量嵌入以及如何创建向量嵌入,你可能还会对以下文章感兴趣
最后更新时间:2024 年 8 月 27 日
准备开始构建了吗?
请查看 快速入门教程,或使用 Weaviate Cloud (WCD) 的免费试用版构建令人惊叹的应用程序。