
向量搜索从根本上改变了我们在现代开发中处理信息检索的方式。它操作于数据的数值表示形式,称为向量嵌入,这些嵌入捕捉了向量空间中的语义含义。向量搜索可以在不需要精确文本匹配的情况下识别相关对象,这使得它对于现代信息检索系统,特别是对于传统搜索系统无法满足的 AI 原生应用程序来说,越来越重要。
什么是向量搜索?
向量搜索是一种通过比较它们的向量表示形式(即特征的数值编码)来查找和检索大型数据集中的相似项目的方法。与依赖于精确匹配的传统搜索不同,向量搜索会根据含义或上下文寻找相似性。它被用于图像检索、推荐系统和搜索引擎等应用中。
向量搜索是如何工作的?
向量搜索通过将数据和查询转换为 向量嵌入 来工作。向量嵌入由语言模型生成,这些模型学习在数值表示形式中捕捉数据的含义和上下文。

在数据输入/导入(或数据对象发生任何重大更改)时,每个数据对象和查询都会使用 嵌入模型 转换为数值向量表示形式。数据集中的每个数据对象都会获得一个向量,并在搜索时将其与查询向量进行比较。
简而言之,向量嵌入是数字数组,可以用作高维空间中的坐标。虽然很难想象超过 3 维(x、y、z)的空间中的坐标,但我们仍然可以使用这些向量来计算向量之间的距离,这可以用来指示对象之间的相似性。有很多不同的 距离度量,例如 余弦相似度 和 欧几里得距离(L2 距离)。
每当我们运行查询(例如:“柏林最高的建筑物是什么?”)时,向量搜索系统会将它转换为“查询”向量。向量数据库的任务是识别并检索与查询向量最接近的向量列表,使用距离度量和搜索算法。
这有点像玩滚球游戏——小标记(目标)是我们的查询向量的位置,球(保龄球)是我们的数据向量——我们需要找到最靠近标记的球。
搜索算法的一个例子是 k-最近邻 (kNN) 算法,它通过计算每个数据向量与查询向量的相似度得分来返回 k 个最近的向量。在我们的滚球游戏中,如果有 6 个球,kNN 算法会测量目标与地面上每个球之间的距离。这将导致 6 个单独的计算。

[滚球游戏中的 kNN 搜索。]
如何在 Python 中从头开始实现向量搜索
我们只需几行 Python 代码就可以实现一个简单的向量搜索解决方案。
让我们首先安装 OpenAI python 包来生成文本的向量嵌入,以及 numpy 来进行我们的相似性计算。
pip install openai
pip install numpy
然后,我们可以导入所有依赖项,设置我们的`OPENAI_API_密钥`,并定义我们的句子列表。
from openai import OpenAI
from dotenv import load_dotenv
import os
import numpy as np
load_dotenv()
client = OpenAI(
api_key=os.getenv("OPENAI_API_KEY"),
)
sentences = [
"Best pizza places nearby.",
"Popular breakfast spots in New York.",
"Top-rated seafood restaurants in Miami.",
"Cheap hotels near the beach.",
"Recipes for quick pasta dishes.",
]
我们可以使用 OpenAI 为每个句子生成向量嵌入,并将这些存储在一个新的字典中。
def get_embedding(text, model="text-embedding-3-small"):
embedding = client.embeddings.create(input=[text], model=model).data[0].embedding
return embedding
sentence_vectors = {}
for sentence in sentences:
embedding = get_embedding(sentence)
sentence_vectors[sentence] = embedding
为了计算查询与每个句子之间的相似度得分,我们可以使用 余弦相似度 评分方法。
def calculate_cosine_similarity(query_vector, vector):
return np.dot(query_vector, vector) / (np.linalg.norm(query_vector) * np.linalg.norm(vector))
最后,此函数将接收我们的查询,将其转换为向量,并计算每个查询向量与文档向量之间的相似度得分。然后,它将根据相关性对结果进行排序,并返回前两个得分最高的句子。
def get_top_n_similar(query_sentence, n=2):
query_embedding = get_embedding(query_sentence)
similarities = {sentence: calculate_cosine_similarity(query_embedding, sentence_vectors[sentence]) for sentence in sentences}
sorted_similarities = dict(sorted(similarities.items(), key=lambda x: x[1], reverse=True))
top_matches = list(sorted_similarities.items())[:n]
for sentence, score in top_matches:
print(f"Similarity: {score:.4f} - {sentence}")
您可以看到,即使查询和返回的第一个句子没有所有相同的单词,它仍然被评为高匹配,因为 *含义* 非常相似。
query_sentence = "Find the best pizza restaurant close to me."
get_top_n_similar(query_sentence, n=2)
Similarity: 0.7056 - Best pizza places nearby.
Similarity: 0.3585 - Top-rated seafood restaurants in Miami.
虽然这种方法能够根据文本向量为我们提供相似的项目,但它效率很低。手动计算大型数据集中的每个向量的余弦相似度会很快变得计算量很大。此外,没有索引机制,所有向量都以原始形式存储,需要高内存消耗并降低搜索速度。最后,仅将向量和文本对象存储在字典中意味着我们缺乏结构化数据库功能。
为了解决所有这些问题,我们可以使用向量数据库来存储和搜索我们的向量。
向量数据库中的向量搜索
使用向量数据库进行的向量搜索,也称为语义搜索,能够快速有效地处理大量的 非结构化数据(想想段落而不是电子表格),并在搜索和推荐系统中基于语义相似性而不是精确匹配提供相关结果。这可以让你对数百万个文档进行高级搜索,例如,一个包含超过 2800 万个段落的维基百科数据集。
如果我们查询与:“欧洲的城市规划”相关的文章,向量数据库(例如 Weaviate)会回复一系列关于该主题的文章,例如“被设计为首都的城市”。
在巨大的非结构化数据存储库中找到正确的答案并不是 向量数据库 最令人印象深刻的部分(我的意思是,它非常令人印象深刻),但它是 🚀 所有这些发生的速度。对于包含 2800 万个段落的数据集,为了找到我们语义搜索查询的最相关答案,只需要几毫秒的时间。这在处理大量数据时非常重要,例如在推荐引擎或大型文档数据集中。
紧随此解释之后不可避免的问题是:为什么它如此快?
近似最近邻 (ANN)
大多数向量数据库不比较一个接一个的向量,而是使用 近似最近邻 (ANN) 算法,以牺牲一点准确性(名称中的 A)来换取巨大的速度提升。
ANN 算法可能不会返回真正的 k 个最近的向量,但它们效率很高。ANN 算法在非常大规模的数据集上保持良好的性能(亚线性时间,例如 (poly) 对数复杂度)。

[O(n) 和 O(log n) 复杂度]
请注意,大多数向量数据库允许你配置 ANN 算法的行为方式。这让你可以在召回率权衡(结果中真实的前 k 个最近邻的比例)、延迟、吞吐量(每秒查询数)和导入时间之间找到合适的平衡。
ANN 算法示例
ANN 方法的示例是

[基于树的 ANN 搜索]
哪种算法效果最好取决于你的项目。性能可以根据延迟、吞吐量(每秒查询数)、构建时间和准确性(召回率)来衡量。这四个组件通常存在权衡,因此取决于用例哪种方法效果最好。
因此,虽然 ANN 不是一种总是能在数据集中找到真正的 k 个最近邻的魔法方法,但它可以找到真实 k 邻近的相当好的近似值。而且它可以以更短的时间做到这一点!
Weaviate 中的 HNSW
Weaviate 是一个很好的例子,它使用 ANN 算法来提供超快速查询的向量数据库。Weaviate 使用的 ANN 算法是 分层可导航小世界图 (HNSW) 的自定义实现。

[HNSW - 基于邻近图的 ANN 搜索]
HNSW 通过将向量组织成分层、多层图结构来工作,这允许在搜索期间快速浏览数据集。HNSW 的结构平衡了上层中较长的距离以实现更快的搜索,以及下层中较短的距离以实现准确的搜索。
在 Weaviate 的实现中,HNSW 得到了增强,以支持完整的 CRUD 操作,并允许实时查询、更新和删除,具有增量磁盘写入以进行崩溃恢复和 异步清理过程 以保持索引新鲜度。
查看 Weaviate ANN 基准测试,了解 HNSW 在现实世界的大规模数据集上表现如何。你可以使用它来比较召回率、QPS、延迟和导入时间之间的权衡。
你会发现有趣的是,Weaviate 可以在保持高吞吐量和低延迟(都以毫秒为单位)的同时,保持非常高的召回率(>95%)。这正是你需要的快速但可靠的向量搜索!
如果您对为自己的数据集进行基准测试感兴趣,请查看此网络研讨会。
ANN 与 KNN
kNN,或k-最近邻算法 (kNN),与 ANN 不同,因为它会计算数据库中每个数据向量与查询向量的相似度得分,就像我们从头开始的向量搜索示例一样
将查询向量与 10、100 或 1000 个数据向量在仅两个维度中进行比较是一项简单的任务。但当然,在现实世界中,我们更有可能处理数百万(如维基百科数据集)甚至数十亿的数据项。此外,大多数嵌入模型在语义搜索中使用的维度数高达数百或数千个维度!
kNN 搜索的蛮力在计算上非常昂贵-并且,根据数据库的大小,单个查询可能需要几秒钟甚至几个小时(糟糕😅)。如果您将一个具有 300 个维度的向量与 10M 个向量进行比较,搜索系统需要执行 300 x 10M = 3B 次计算!所需的计算量随着数据点的数量线性增加 (O(n))。
总而言之,kNN 搜索无法很好地扩展,很难想象在生产中使用它来处理大型数据集。
向量搜索的类型
向量搜索不仅限于文本,甚至不限于单一语言的文本。任何内容都可以通过正确的嵌入模型转换为向量,无论是图像、音频、视频还是多语言文档。这意味着我们可以开发多模态或多语言语义搜索系统,以处理各种数据格式、语言或搜索类型。
图像向量搜索
图像向量搜索将图像转换为向量表示,以实现图像之间的相似性搜索。向量嵌入编码了颜色、形状和纹理等特征,因此您可以根据视觉相似性而不是单独的元数据来搜索图像。这种类型的搜索经常用于电子商务领域,以查找视觉上相似的产品,或用于内容审核。
音频向量搜索
音频向量搜索将音频文件转换为向量,以基于声音特征(如音调、节奏或旋律)进行相似性搜索。这被用于音乐发现平台、音效库和语音识别系统等应用程序。
视频向量搜索
视频向量搜索通过采样帧或分析场景特征等方法将视频转换为向量嵌入,以基于视觉有时也包括音频相似性进行搜索。这种方法在内容库、监控和媒体数据库等应用程序中很受欢迎。
多模态向量搜索

多模态向量搜索将不同的数据类型(如文本、图像和音频)组合在同一个向量空间中,用于跨类型比较。例如,您可以找到与文本查询最相似的图像或音频,例如基于描述查找狮子或狮子的咆哮的图像。这可以用于在各种媒体格式(如电子商务、数字资产管理和社交媒体平台)中搜索的应用程序。
多语言向量搜索
多语言向量搜索可以通过将文本嵌入到同一个向量空间中来比较不同语言的文本。例如,英文查询可以检索描述相似概念的其他语言(如法语或中文)的文档、字幕或内容。这些跨语言搜索可以为全球电子商务、多语言客户支持和国际内容发现等应用程序提供支持。
混合搜索
混合搜索将多种搜索类型(通常是向量搜索和关键词搜索)组合到一个系统中。通过将传统的关键词搜索与语义搜索相结合,我们可以获得两者的优点:语义上下文+特定的关键词。语义搜索非常适合理解文档和查询的总体含义,但它不会优先考虑精确匹配,例如名称、行业特定术语或罕见词语,这些在许多类型的应用程序中可能很有帮助。但如果没有语义搜索(仅关键词),结果可能会错过相关语义信息和关于所需主题的上下文。结合这两种方法可以提高搜索结果的准确性和相关性。
向量搜索的优势
传统的基于关键词的搜索系统只能匹配文本中的确切术语或短语,或关键词。相比之下,向量搜索会根据其潜在的上下文或含义返回相似的条目,并且适用于各种数据类型,包括文本、图像、音频或视频。例如,搜索“健康零食”可能会返回语义上相关的术语,如“营养食品”或“低卡路里零食”,或者在多模态系统的情况下,格兰诺拉棒或水果的图片。
这就是为什么向量搜索通常也称为语义搜索的原因。它能够实现更“人性化”的搜索体验,允许用户在查询中不需要使用完全正确的词语就能找到相关对象。
向量搜索用例
向量搜索可以为各种不同的应用程序和用例提供支持,从高级搜索系统到推荐系统再到聊天机器人。
搜索系统
向量搜索可以应用于各种不同的搜索系统,从数十亿规模的电子商务应用程序到多模态和多语言搜索应用程序,再到大型企业的内部文档搜索。例如,在电子商务中,语义搜索可以根据客户意图推荐产品,即使他们没有在搜索查询中使用确切的关键词。通过正确的嵌入模型选择,您可以创建多语言的应用程序,如WeaLingo,或多模态搜索应用程序。向量搜索还可以加速企业搜索等用例的结果时间,因为 ANN 算法允许在大量非结构化文档上进行如此快速的检索。
推荐系统
向量搜索可以用于推荐系统,通过查找具有相似向量表示的项目来推荐相似的产品、电影或内容,即使没有共享的元数据或标签。这被广泛用于社交媒体应用程序、新闻网站或电子商务商店。
检索增强生成 (RAG)
检索增强生成,或 RAG,是向量搜索的一个流行用例,用于聊天机器人或问答系统等应用程序。RAG 只是向量搜索增加了一个额外的步骤-向量数据库返回的相似结果被提供给大型语言模型 (LLM) 以生成对用户查询的上下文相关响应。RAG 有助于最大限度地减少模型幻觉,提高响应的准确性,并允许生成模型访问专门的知识来回答复杂的数据驱动查询。
由于其速度以及基于含义而不是精确匹配搜索文档的能力,语义搜索非常适合 RAG 应用程序。

向量搜索解决方案
有几种不同的方法可以在应用程序中启用向量搜索
向量索引库,如FAISS、Annoy和ScaNN,针对内存内相似性搜索进行了优化,并且仅存储向量,而不存储它们所来自的数据对象。它们的索引通常是不可变的,这意味着在不重建的情况下无法动态更新。此外,向量库通常需要导入所有数据后才能进行查询,这会限制它们在动态或不断更新的环境中的灵活性。这些库适用于涉及静态数据且不需要完全的 CRUD 操作或持久性功能的应用程序。
支持向量的数据库扩展了传统数据库的向量搜索功能,允许企业在利用现有数据库功能的同时集成语义搜索。这些解决方案通常在规模上难以保证可靠性和速度。
向量数据库(如 Weaviate)为语义搜索用例提供了一个全面的解决方案,支持向量索引,并管理数据持久性、扩展以及与 AI 生态系统的集成。它们为各种用例提供了灵活的解决方案,从大规模 AI 应用程序到刚刚起步的用户。
向量搜索引擎通常与向量数据库互换使用,但从技术上讲它们是不同的:向量搜索引擎仅关注检索层,而向量数据库包括存储、数据管理和聚类等其他功能。
向量搜索常见问题解答
语义搜索与向量搜索
从正式的定义来看,向量搜索只是将向量嵌入或向量排列成向量索引以执行相似性搜索的过程,而语义搜索是在向量搜索的基本定义之上构建的,以根据文本的含义而不是确切的术语返回更相关的结果。然而,在实践中,向量搜索和语义搜索通常可以互换使用。
向量搜索与关键词搜索
向量搜索基于数据的语义含义查找相似项目,而关键词搜索依赖于精确的单词匹配或短语出现。向量搜索可以处理非结构化、多模态数据(如文本、图像或音频)并找到相关概念,而关键词搜索更适合于结构化文本数据,在精确措辞很重要的情况下使用。
大规模向量搜索是如何进行的?
向量数据库使用近似最近邻 (ANN) 算法来加速大型数据集的搜索时间。借助 ANN 算法,向量搜索可以在几毫秒内返回与查询相似的项目,即使在数十亿个对象中也是如此。
总结
快速回顾
- 向量搜索,也称为语义搜索,可以在不需要精确文本匹配的情况下识别相关对象,允许用户基于语义含义而不是精确关键词进行搜索。
- 它使用机器学习模型为所有数据对象和查询生成向量嵌入,并通过进行数学计算来确定相似度。
- 向量嵌入捕捉数据的含义和上下文。
- 向量数据库得益于 ANN 算法,提供超快的查询响应。
- ANN 算法以牺牲少量准确性为代价,换取巨大的速度提升。
- 不同类型的向量搜索包括混合搜索或用于图像、音频或视频的多模态搜索。
- 向量搜索的应用场景包括检索增强生成 (RAG)、推荐系统或搜索系统。
准备开始构建了吗?
请查看 快速入门教程,或使用 Weaviate Cloud (WCD) 的免费试用版构建令人惊叹的应用程序。