Vector Search
向量搜索通过精确 k-NN 或 HNSW 和 IVF 等近似索引,查找与查询向量最接近的已存储嵌入,从而快速搜索数百万条数据。
向量搜索会根据嵌入向量与查询嵌入向量之间的相似度度量,检索距离最近的项目;相似度度量可以是余弦相似度、点积或欧氏距离。嵌入模型会将含义或外观相似的项目放在彼此附近,因此最近的向量对应最相似的文档、图像或产品,即使它们与查询没有共同关键字也是如此。精确向量搜索会遍历所有已存储向量,执行一次k 近邻(k-NN)查找。在大规模场景中,系统会使用近似最近邻(ANN)索引,只将查询与一小部分向量进行比较,同时仍能返回几乎所有真正的近邻。
向量搜索的工作原理#
查询和已存储项目由同一个模型或共同训练的一对模型生成嵌入向量:文本使用句子编码器,文本与图像匹配使用 CLIP,图像与图像匹配使用视觉主干网络。度量方式应与模型的训练方式相匹配。对于单位长度向量,余弦相似度等于点积,按欧氏距离排序也会得到相同顺序。精确搜索对每个已存储向量执行一次比较,因此处理数万个向量很快,但处理数亿个向量就太慢;大型系统会使用以下四类 ANN 索引之一:
- HNSW等图索引:在分层图中将每个向量连接到其近邻,并通过贪心遍历逐步靠近查询向量来作答。
- 聚类索引(IVF):使用 k 均值对向量分组,只扫描质心与查询最接近的簇。
- 向量量化:例如使用乘积量化,将每个向量压缩到几个字节,从而根据保存在内存中的紧凑编码近似计算距离。
- 基于磁盘的图索引:像 DiskANN 那样将图索引保存在 SSD 上,以便在单台机器上搜索数十亿个向量。
IVF 索引的核心思路可以通过一个简短的 NumPy 和 scikit-learn 示例说明,并与精确搜索进行比较:
import numpy as np
from sklearn.cluster import KMeans
# 20,000 embeddings grouped by topic, normalized so a dot product is cosine similarity
rng = np.random.default_rng(0)
topics = rng.normal(size=(200, 64))
vectors = topics[rng.integers(200, size=20000)] + 0.5 * rng.normal(size=(20000, 64))
vectors /= np.linalg.norm(vectors, axis=1, keepdims=True)
query = vectors[0] + 0.1 * rng.normal(size=64)
# Exact search: score every stored vector
exact = np.argsort(-(vectors @ query))[:10]
# IVF index: cluster the vectors, then scan only the lists of the 5 closest centroids
kmeans = KMeans(n_clusters=100, n_init=1, random_state=0).fit(vectors)
probed = np.argsort(-(kmeans.cluster_centers_ @ query))[:5]
candidates = np.flatnonzero(np.isin(kmeans.labels_, probed))
approx = candidates[np.argsort(-(vectors[candidates] @ query))[:10]]
print(f"scanned {len(candidates) / len(vectors):.1%} of vectors")
print(f"recall@10: {len(set(exact) & set(approx)) / 10:.0%}")探测 100 个簇中的 5 个簇会扫描 5.1% 的向量,同时找到全部 10 个真正的最近邻,召回率@10 为 100%。探测更多簇会同时提高召回率和成本,因此探测数量是 IVF 索引中最重要的调优设置。
向量搜索与相关术语的比较#
- 关键字搜索:在倒排索引中查找完全匹配的词项,并使用 BM25 等公式对结果排序。它擅长查找名称、代码和生僻词,但会漏掉同义词。
- 语义搜索:按含义搜索,这是向量搜索最常见的用途。语义搜索系统通常还会在此基础上添加查询改写或重排器。
- 混合搜索:同时运行关键字搜索和向量搜索,并合并两个排序列表。
- 向量数据库:存储带有元数据的向量,并通过筛选、更新和持久化功能提供向量搜索的系统。
实际应用#
- 检索增强生成(RAG):查找语言模型回答问题所需的文档段落。
- 目标重识别:将人物或车辆的外观嵌入向量与此前的观测进行匹配,以便在不同摄像头之间关联同一目标。
- 人脸识别:将人脸嵌入向量与已登记的人脸进行比较,并在最近的人脸足够接近时接受匹配结果。
- 推荐系统:推荐嵌入向量与用户近期选择相近的产品、歌曲或视频。
Ultralytics Platform使用向量搜索来扩充训练数据集。其查找相似图像操作会选取一张图像,根据嵌入向量在公共数据集以及用户自己的数据集和团队数据集中搜索最近的图像,并显示最多 24 个匹配结果及其相似度分数;这些结果可以作为未标注的训练图像添加到数据集中。










