在之前的系列文章中,我介绍了 RAG
和 Embedding
,本篇文章将侧重在梳理整个向量检索技术体系。
信息检索(Information Retrieval, IR
)的历史是一部不断追求更精准、更智能地匹配用户意图的演进史。早期的检索系统严重依赖于关键词匹配,即词法搜索(Lexical Search
)。这种方法通过寻找查询词在文档中的精确出现来判断相关性,虽然高效,但其局限性也显而易见:它无法理解同义词、多义词或更深层次的语义关联。随着深度学习,特别是自然语言处理(NLP
)技术的发展,我们进入了语义搜索(Semantic Search
)的时代。语义搜索的核心思想是理解查询和文档背后的意义,而非仅仅是字面上的字符串。通过将文本、图像甚至音频等非结构化数据转换为高维向量(即嵌入,Embeddings
),我们可以在一个数学空间中捕捉它们的语义关系,使得“动物”和“猫”在空间中彼此靠近。
本篇文章目的是为大家提供一份关于向量检索的详尽介绍,系统性地梳理从经典理论到前沿实践的完整知识图谱。我将从信息检索的基石——以BM25
为代表的稀疏检索方法出发,为后续的讨论奠定理论基础。随后,我将深入探讨语义革命的核心——稠密向量检索,详细解析其背后的近似最近邻(ANN
)搜索算法,特别是 HNSW 和 IVF
。在此基础上,我将介绍混合检索与多级检索等高级策略,它们是构建现代高性能检索系统的关键。最后,我会介绍如何通过 Embedding
调优、查询优化和引入反馈机制等手段,极限提升召回精度,并展望向量检索技术的未来发展趋势。无论是刚接触 RAG
的开发者,还是寻求深度优化的资深工程师,希望在阅读完本篇之后能够对向量检索整个技术领域有个完整的理解。
在深入探讨现代向量检索之前,我们必须首先理解其前身:稀疏检索方法。这些基于关键词统计的经典算法,至今仍在许多高性能系统中扮演着不可或缺的角色。它们之所以被称为 稀疏(sparse
),是因为其生成的向量表示维度极高(通常与词汇表大小相当),但其中绝大多数元素为零。
TF-IDF
是信息检索领域最具里程碑意义的算法之一。它的核心思想是:一个词在一个文档中的重要性,与其在该文档中出现的频率成正比,但与其在整个语料库中出现的频率成反比。这个简单的原则能够有效地过滤掉像“的”、“是”这类普遍存在但信息量低的“停用词”,同时提升那些能代表文档语义的关键词的权重。
TF-IDF的分数是通过将 词频(Term Frequency, TF) 与 逆文档频率(Inverse Document Frequency, IDF) 相乘得出的。
这里通过一个简单的例子来理解TF-IDF
的计算过程。假设我们有两份文档:
对于词 "car"
在文档 A 中的 TF-IDF
分数,计算过程如下:
"car"
在文档A中出现了一次,所以它的词频分数相对较高。"car"
只出现在一份文档里,说明它比较独特。因此,它的逆文档频率分数是一个正数。"car"
获得了一个正向的权重分数,表明它对于文档A是重要的。对于词 "the" 在文档A中的TF-IDF分数:
"the"
同样在文档A中出现了一次。"the"
在两份文档中都出现了,说明它是一个非常常见的词。因此,它的逆文档频率分数计算结果为零。"the"
的最终TF-IDF
分数为零,表明这个词信息量低。尽管TF-IDF非常有效,但其局限性也十分明显:
"car"
和 "automobile"
之间的语义相似性。"not pay the bill"
和 "pay the bill"
这样含义截然相反的短语。为了克服TF-IDF
的诸多限制,大佬们开发了Okapi BM25(Best Matching 25)
算法。BM25
不仅仅是TF-IDF
的一个简单改进,它代表了从启发式的向量空间模型到更严谨的概率信息检索模型的范式转变。它在两个核心方面对TF-IDF
进行了根本性的优化。
TF-IDF
模型假设词频对相关性的贡献是线性增长的。然而,BM25
认识到一个更符合直觉的现实:当一个词在文档中出现的次数达到一定程度后,其对相关性的贡献会逐渐饱和,即收益递减。一份包含 200 次“大象”的文档,其相关性并不必然是一份包含100次“大象”的文档的两倍。TF-IDF
缺乏一个内置的、有效的文档长度归一化机制。BM25
则明确地将文档长度与其在整个语料库中的平均长度进行比较,并据此对分数进行调整,从而更公平地惩罚那些仅仅因为篇幅长而导致词频较高的文档 。BM25
通过一个综合性的评分机制来评估文档与查询的相关性,该机制由可调参数 k1 和 b
控制:
k1
的值通常设置在1.2
到 2.0
之间。一个较高的 k1
值会延迟饱和点的到来,使得高频词获得更高的权重。0
到 1
之间,通常取 0.75
。当 b
设为1
时,系统会应用完全的长度归一化;当设为0
时,则完全不考虑文档长度的影响。凭借其在词频饱和度和文档长度归一化方面的精妙设计,以及可调参数带来的灵活性,BM25
在各种信息检索任务中都表现出比TF-IDF
更优越且更稳定的性能。它在简单性和性能之间取得了出色的平衡,使其成为现代搜索引擎(如 Elasticsearch)和向量数据库(如Milvus)中默认的稀疏检索算法,构成了许多复杂检索系统(包括混合检索)的基础。
表1:TF-IDF vs. BM25:一项对比分析
特性 | TF-IDF | BM25 |
---|---|---|
理论模型 | 向量空间模型 (Vector Space Model) | 概率信息检索模型 (Probabilistic Model) |
词频处理 | 线性或对数增长,无上限 | 非线性增长,具有饱和效应 |
文档长度归一化 | 无内置机制,通常需要外部归一化 | 内置归一化,通过参数 b 调节 |
核心参数 | 无 | k1 (饱和度), b (长度归一化) |
计算成本 | 较低 | 略高 |
典型用例 | 基础的关键词权重计算、文本分析入门 | 现代搜索引擎、RAG系统中的稀疏检索标准 |
随着深度学习的兴起,信息检索领域经历了一场从词法到语义的深刻革命。这场革命的核心,是将文本、图像等非结构化数据转化为能够捕捉其深层含义的稠密向量(Embeddings
),并在此基础上进行高效的相似性搜索。
与TF-IDF
或BM25
生成的稀疏向量不同,Embedding 是通过神经网络模型(如BERT或Sentence-BERT)学习到的低维、稠密的实数向量。这些向量的每一个维度并不直接对应某个特定的词,而是共同编码了输入数据的复杂语义特征。这种表示方式的巨大优势在于,语义上相近的内容,即使使用的词语完全不同,其对应的向量在向量空间中的位置也会非常接近 。例如,“夏季服装”和“短裤与T恤”的向量会比它们和“冬季大衣”的向量更近。这使得计算机能够超越关键词匹配,实现真正意义上的“理解” 。
然而,这种强大的表示能力也带来了新的挑战:我们如何在包含数百万甚至数十亿个高维向量的数据库中,快速找到与给定查询向量最相似的几个向量?传统的精确最近邻(k-NN)搜索算法需要计算查询向量与数据库中每一个向量的距离,在海量数据面前,这种暴力搜索的计算成本是无法接受的 。
为了解决规模化搜索的难题,近似最近邻(Approximate Nearest Neighbor, ANN
)搜索应运而生。ANN
的核心思想是一种工程上的权衡:放弃寻找绝对精确的最近邻,以换取搜索速度的指数级提升。对于绝大多数应用场景,如推荐系统或语义搜索,找到“足够相似”的结果已经完全满足需求,而牺牲的微小精度损失通常可以忽略不计。ANN
算法通过构建巧妙的数据结构(索引),在搜索时能够跳过大量不相关的向量,从而避免了全局的暴力比较 。
ANN算法的发展历程体现了一种核心理念的转变,即从试图对整个高维空间进行“划分”转变为在数据点之间建立“导航”网络。这一转变是应对 维度灾难 的根本性策略。
早期的ANN
算法,如KD
树,其工作原理是通过递归地用超平面将向量空间进行划分。这种方法在低维空间中非常直观有效。然而,随着维度的增加,空间的体积会呈指数级增长,数据点变得极其稀疏,“附近”这个概念也变得模糊不清。
相比之下,现代的基于图的ANN
算法,如HNSW
,采取了截然不同的策略。它不再试图去理解和划分整个宏观空间,而是在数据点之间构建一个连接网络(图),其中边代表了数据点之间的邻近关系。搜索过程不再是遍历一个刚性的树状结构,而是在这个关系网络中,从一个入口点开始,沿着边“导航”到查询向量的最近邻。这种方法更加鲁棒,因为它依赖的是数据本身的局部邻域结构,而这种结构即使在高维空间中也依然存在。
表2:ANN 算法版图:HNSW vs. IVF
在众多ANN
算法中,基于图的HNSW
和基于聚类的IVF
是当今向量数据库中最主流的两种索引策略。它们代表了两种不同的ANN
实现哲学:HNSW
侧重于构建可导航的邻近图,而IVF
则通过聚类来裁剪搜索空间。
维度 | HNSW (Hierarchical Navigable Small World) | IVF (Inverted File) |
---|---|---|
底层算法 | 基于图的导航 | 基于聚类的划分 |
数据结构 | 多层邻近图 | 倒排文件(聚类中心 -> 向量列表) |
索引构建时间 | 较慢,需要构建复杂的图结构 | 较快,主要耗时在k-means聚类训练 |
查询速度 | 极快,对数级别复杂度 | 快,但速度依赖于 nprobe 参数 |
内存占用 | 高,需要存储图的连接信息 | 较低,主要存储向量和聚类中心 |
核心参数 | M, ef_construction, ef_search | nlist, nprobe |
优势 | 查询速度快,召回率高,无需训练 | 内存效率高,索引构建快 |
劣势 | 内存消耗大,索引构建耗时 | 召回率对 nprobe 敏感,可能错过边缘向量 |
HNSW
是目前公认的性能最佳的 ANN
算法之一,它巧妙地结合了两种思想:可导航小世界图和概率跳表。
HNSW
构建了一个分层的图结构。顶层图最稀疏,连接最长,像“高速公路”,负责全局的快速导航;底层图最密集,包含了所有向量,像“本地道路”,负责局部的精确搜索。M
(每个节点的最大连接数)和 ef_construction
(构建时的搜索范围大小)建立连接。IVF
系列索引是另一种广泛使用的 ANN
技术,其核心思想借鉴了传统文本检索中的倒排索引,通过聚类来减少需要比较的向量数量。
k-means
)将整个向量空间划分为 nlist
个聚类(或称为“桶”)。每个聚类的中心点被称为“质心”(Centroid)。nprobe
个质心。然后,搜索范围被限定在这 nprobe
个聚类所包含的向量中,从而大大减少了计算量。在掌握了单一的稀疏或稠密检索方法后,构建一个真正强大的、生产级的检索系统还需要更高级的架构设计。这些策略通过组合不同的技术,取长补短,以应对真实世界中复杂多变的查询需求。
混合检索(Hybrid Search
)是一种将关键词检索(稀疏)与语义检索(稠密)相结合的强大策略,旨在同时利用两者的优势,提供更精准、更鲁棒的搜索结果。
纯粹的语义检索虽然在理解用户意图方面表现出色,但在处理需要精确关键词匹配的场景时却常常力不从心。例如,用户搜索一个特定的产品型号(如“SKU-12345”)、一个专有品牌名或一个技术缩写时,向量模型可能无法准确捕捉其独特性。这恰恰是稀疏检索(以BM25
为代表)的强项。因此,混合检索的出现并非锦上添花,而是一种务实的修正,它承认了在真实应用中,上下文理解和关键词精度同等重要。
一个典型的混合检索系统的工作流程如下:
BM25
)和稠密检索管道(ANN
搜索)。rank
)。一个结果在原始列表中排名越靠前,它在最终融合结果中的权重就越大。多级检索,特别是 检索-重排(Retrieve-and-Rerank
)架构,是另一种在精度和效率之间取得极致平衡的高级策略。它将检索过程分解为两个阶段:
ANN
索引的向量检索(Bi-encoder
)或 BM25
。Cross-Encoder
之所以在重排阶段表现卓越,其根本原因在于其独特的处理机制。与Bi-Encoder
(双编码器)将查询和文档独立编码为向量再计算相似度不同,Cross-Encoder
将查询和单个文档拼接成一个输入对,然后将这个组合输入到一个完整的Transformer
模型中进行处理 。
这种“共同处理”的方式允许模型内部的自注意力机制在查询和文档的每个词元之间进行深度、细粒度的交互建模,从而输出一个远比向量相似度更精准的相关性分数。然而,这种高精度是有代价的。Cross-Encoder
的联合处理过程必须在查询时对每一个候选文档都执行一次完整的、耗时的前向传播,因此它无法被预计算,速度要慢得多。
正是这种“快而粗”的Bi-Encoder
和“慢而精”的Cross-Encoder
之间的特性互补,使得 检索-重排 范式成为构建顶级信息检索系统的黄金标准。
构建一个向量检索系统不仅仅是选择算法和架构,更关键的是如何根据具体应用场景对系统进行细致的调优,以在查询速度、召回精度和资源消耗这三个维度上找到最佳平衡点。
索引是向量检索性能的核心。对索引参数的精细调整,是决定系统最终表现的关键一步。
HNSW索引的性能主要由三个参数控制:
m
:定义了每个节点允许拥有的最大连接数。增加 m
会使图更密集,通常能提高召回率,但代价是内存占用和构建时间增加 35。ef_construction
:索引构建时的搜索范围大小。一个更大的值可能构建出质量更高的图,有助于提升查询召回率,但这会显著增加索引构建时间。ef_search
:查询时的搜索范围大小。这是在查询速度和召回率之间进行权衡的主要调节旋钮。增加 ef_search
会提高召回率,但也会直接导致查询延迟增加。IVF系列索引的性能主要由两个参数控制 :
nlist
:定义了向量空间被划分成的聚类数量。一个较大的 nlist
值意味着每个聚类中的向量数量较少,可以提高查询速度,但过多的聚类也可能降低召回率。经验法则是,对于百万级向量,nlist
可以设为 4 * sqrt(向量总数)
。nprobe
:查询时需要探查的聚类数量。这是直接控制查询速度和召回率之间平衡的关键。增加 nprobe
会提高召回率,但会线性增加查询的计算量和延迟。表3:HNSW与IVF索引调优参数
索引类型 | 参数 | 描述 | 增加该参数的影响 |
---|---|---|---|
HNSW | m | 每个节点的最大连接数 | 召回率 ↑, 查询速度 ↓, 索引大小 ↑, 构建时间 ↑ |
ef_construction | 构建索引时的搜索范围 | 召回率 ↑, 查询速度 ↔, 索引大小 ↔, 构建时间 ↑ | |
ef_search | 查询时的搜索范围 | 召回率 ↑, 查询速度 ↓, 索引大小 ↔, 构建时间 ↔ | |
IVF | nlist | 聚类中心的数量 | 召回率 ↓, 查询速度 ↑, 索引大小 ↑, 构建时间 ↑ |
nprobe | 查询时探查的聚类数量 | 召回率 ↑, 查询速度 ↓, 索引大小 ↔, 构建时间 ↔ |
ANN
效率;**后过滤 **先执行向量搜索再过滤,更简单快速,但可能需要“过采样”以确保过滤后仍有足够结果。PCA
)可以减少存储和计算成本,但可能损失精度。量化(如PQ
)通过压缩向量来减少内存占用和加速计算,是在精度和资源消耗之间进行权衡的有效手段。对于查询量巨大的系统,引入缓存层是降低延迟、节省计算资源的关键。
LLM API
的调用次数。Milvus
提供了丰富多样的索引类型,以适应不同场景下的性能、精度和资源消耗需求。
表4:Milvus 浮点向量索引类型
索引类型 | 分类 | 理想场景与权衡 |
---|---|---|
FLAT | 暴力搜索 | 数据集规模较小(百万级以内),且要求100%精确召回率的场景。速度最慢。 |
IVF_FLAT | 基于量化(聚类) | 追求高查询速度和尽可能高的召回率之间的平衡。 |
IVF_SQ8 | 基于量化(聚类+标量量化) | 对内存资源有限制,同时追求高查询速度,可以接受轻微召回率损失的场景。 |
IVF_PQ | 基于量化(聚类+乘积量化) | 内存资源非常有限,追求极高的查询速度,可以接受更明显召回率损失的场景。 |
HNSW | 基于图 | 对查询速度和召回率有极高要求,且拥有充足内存资源的场景。 |
GPU_CAGRA | GPU优化 | 适用于需要利用GPU进行大规模并行计算加速的负载,以获得极致的查询性能。 |
Milvus
提供了一套完整的 API,用于对向量数据进行全生命周期的管理,支持标准的 CRUD
(创建、读取、更新、删除)操作。所有的数据修改操作都会先写入日志代理,确保了操作的持久性和可恢复性。
在 Milvus 的 API 中,理解search
和query
的区别至关重要:
search
:特指向量相似性搜索。它的输入是一个或多个查询向量,输出是与之最相似的向量及其元数据。query
:特指基于标量字段的元数据过滤。它的工作方式类似于传统SQL数据库中的WHERE
子句,用于根据非向量字段的条件来精确检索实体。在实际应用中,这两者经常结合使用,实现混合搜索,从而在满足特定标量条件的数据子集中进行高效的向量相似性搜索 。
一个检索系统的构建,不仅依赖于底层的索引和架构,更取决于对系统“两端”——即输入端的 Embedding
模型和用户查询——的精细打磨。
Embedding
模型是整个语义检索系统的基石,其质量直接决定了检索效果的天花板。
**海量文本嵌入基准(Massive Text Embedding Benchmark, MTEB)**及其多语言版本(MMTEB
)已成为业界公认的权威资源,它对数百个模型在多种任务和上千种语言上进行了全面评估。开发者应当优先考虑在MTEB上表现优异的、与自己应用场景相匹配的模型。
当前,Embedding
模型领域呈现出两大趋势:
multilingual-e5-large-instruct
等模型,通过在训练中加入任务指令,使得模型能够更好地理解任务意图。当现成的模型无法满足特定业务需求时,对基础模型进行领域专属的微调(Fine-tuning)就显得至关重要。
Embedding
空间中,拉近“相似”样本对的距离,推远“不相似”样本对的距离。常用的损失函数包括 **Triplet Loss(三元组损失)**和更高效的 Multiple Negatives Ranking Loss (MNR Loss) 。Hard Negatives
对于训练出具有高区分度的模型非常重要。如何科学地衡量 Embedding 的质量?评估方法可分为 内在评估(评估向量本身性质)和 外在评估(将Embedding 应用于下游任务并衡量其性能)两大类。对 RAG 系统而言,外在评估最有实际意义。
表5:检索任务核心评估指标
指标 | 定义 | 解读 | 适用场景 |
---|---|---|---|
Recall@k | 在返回的前k个结果中,包含了多少比例的“所有”相关文档。 | 衡量系统的“查全率”或覆盖能力。 | 文档检索、商品推荐等需要尽可能多地发现相关项的场景。 |
Mean Reciprocal Rank (MRR) | 多个查询的倒数排名(第一个正确答案所在位置的倒数)的平均值。 | 衡量系统将第一个相关结果排在多靠前的位置。高分(接近1)表示系统总能把正确答案放在最前面。 | 问答系统、事实查找等用户期望快速找到唯一正确答案的场景。 |
Precision@k | 在返回的前k个结果中,有多少比例是相关的。 | 衡量返回结果的“准确率”。高分表示返回的顶部结果相关性很高。 | 网页搜索等用户主要关注顶部结果质量的场景。 |
NDCG@k | 归一化折损累计增益,同时考虑了结果的相关性等级和位置。 | 最全面的排名质量指标之一,奖励将更相关的结果排在更前面。 | 任何对结果排序质量有精细化要求的场景。 |
用户输入的原始查询往往是模糊的,在检索前对查询进行优化也非常重要。
LLM
生成一个“虚拟”的理想答案文档,并使用其 Embedding
进行搜索)。WordNet
)进行扩展,以及经典的**伪相关反馈(Pseudo-Relevance Feedback, PRF)**技术,即利用初次检索结果中的高频词来扩展原始查询。传统的 RAG
系统是静态的,通过引入用户反馈循环,特别是负反馈,我们可以将 RAG
系统从一个静态的信息处理器转变为一个能够持续学习和自我改进的动态系统。这一演进过程可以分为几个阶段:
Embedding
模型或Reranker
模型进行微调,创建了一个手动的改进循环。本文系统地梳理了向量检索技术从经典稀疏模型到现代稠密模型的演进脉络,深入探讨了从底层算法、高级架构到系统优化的全栈知识体系。
BM25
的关键词精度与向量模型的语义理解能力高度互补。混合检索已成为业界共识,是构建鲁棒、高精度检索系统的基石。Embedding
模型的质量决定。模型选择、领域微调以及科学的评估是提升系统性能的根本途径。向量检索技术的发展已进入深水区。构建下一代人工智能应用,要求我们必须采取一种系统性的、端到端的视角。这不仅意味着要关注单个算法的创新,更要着眼于如何将数据、模型、架构和用户反馈融合成一个高效、智能、可持续演进的闭环生态系统。