向量数据库、嵌入和重排序:检索的三个不同部分

嵌入、向量数据库和重排序器是检索的三个不同组成部分。嵌入模型将文本或其他数据转换为数值表示;向量数据库或向量索引存储并搜索这些表示以检索候选项;重排序器接收一个较小的候选集,并使用更昂贵的相关性模型或评分方法对其重新排序。它们经常一起出现在RAG中,但它们都不是RAG本身,也不是每个检索系统都必须具备的。
这真正意味着什么
搜索系统有两个相互竞争的目标:找到足够多可能相关的材料,并将最好的材料放在靠近顶部的位置。快速的第一阶段检索通常优化候选生成。更强的第二阶段模型则可以花费更多计算来区分最佳候选。
嵌入、向量索引和重排序器在该过程中占据不同的位置。将它们视为一个功能会掩盖关于召回率、精确率、延迟、存储、元数据过滤和模型成本的重要设计选择。
这种区分还可以防止一个常见的RAG错误:假设将文档嵌入存储在向量数据库中就会自动创建高质量的检索。检索质量取决于嵌入模型、分块、元数据、查询构建、索引配置、候选数量、混合检索、重排序以及底层来源的权威性。
最简单的例子
假设一个知识库包含100,000个文档块。用户问:“如何撤销API令牌?”
首先,嵌入模型可以将查询编码为向量。文档块可能已经存储了自己的嵌入。然后,向量搜索将查询向量与索引的文档向量进行比较,并返回例如30个可能的候选。
这30个候选随后可以传递给重排序器。重排序器更直接地将查询与每个候选进行比较,并产生新的相关性排序。应用程序可能会保留最好的五个用于模型上下文。
一个基本的两阶段语义检索流程
简单示例的局限
真实的检索系统根本不必使用密集嵌入。诸如BM25之类的关键词搜索可以作为第一阶段检索器。稀疏学习检索、SQL过滤器、图遍历或应用程序API也可以生成候选。
重排序器也不关心候选是否来自向量数据库。它可以对BM25结果、混合结果、手动选择的文档或来自多个检索器的候选进行重排序。
同样,嵌入不需要专门的向量数据库。小数据集可以在内存中或使用通用数据库和向量扩展进行比较。当索引、近似最近邻搜索、过滤、规模、更新行为或操作要求证明其合理性时,专门的向量系统才变得有用。
三种不同的检索组件
| 嵌入 | 向量数据库 / 索引 | 重排序器 | |
|---|---|---|---|
| 主要任务 | |||
| 典型输入 | |||
| 典型输出 | |||
| 成本特征 | |||
| 典型故障 |
嵌入:表示,而非检索
嵌入是模型生成的数值表示。对于语义检索,含义相关的文本旨在在向量空间中占据有用的位置,以便相似度或距离函数可以比较它们。
Sentence-BERT 是使句子级语义相似度变得实用的重要一步,它采用了双编码器风格的表示,可以独立计算并高效比较。这一总体思路仍然是现代稠密检索的核心:预计算文档表示,在搜索时计算查询表示,然后进行比较。
嵌入本身并不搜索语料库。它是由嵌入模型生成的数据。当系统将查询表示与存储的候选进行比较时,检索才开始。
嵌入模型定义了表示空间
文档和查询向量必须与创建它们时使用的模型和配置兼容。替换嵌入模型可能会改变维度、相似度行为、语言覆盖范围和领域性能。
这就是为什么嵌入模型迁移不仅仅是更改 API 名称。现有文档可能需要重新嵌入,索引需要重建或版本化。
稠密表示和稀疏表示是不同的
稠密嵌入通常包含许多非零维度,常用于语义相似度。稀疏表示包含许多零,可以保留更强的词元或词项结构。
两者都可以支持语义检索,现代搜索系统可以结合稠密、稀疏和词汇信号。因此,“向量搜索”并不总是意味着单一的稠密余弦相似度流水线。
相似度函数是表示契约的一部分
余弦相似度、点积和欧几里得距离的含义并不相同。正确的度量取决于嵌入模型是如何训练和归一化的。
例如,当前的 Qdrant 文档要求将距离度量作为向量配置的一部分,并记录了余弦、点积和欧几里得风格的选择。重要的架构规则是将度量视为嵌入/索引契约的一部分,而不是随意选择一种。
向量数据库和索引:候选检索
向量数据库或支持向量的搜索系统组织向量表示,以便应用程序能够高效地检索附近的候选。实际系统通常将向量与 ID 和有效负载元数据(如来源、语言、租户、文档类型、时间戳或访问范围)关联起来。
例如,Qdrant 将数据组织为点的集合,其中点包含向量和可选的有效负载元数据。其文档将基于 HNSW 的相似度搜索和元数据过滤描述为检索层的独立能力。
这种区分很重要:向量索引解决的是最近邻问题,而有效负载过滤器则强制执行结构性约束,例如租户、文档类别或语言。
近似最近邻搜索以精确性换取效率
将单个查询向量与每个向量进行比较对于小型集合可能是可行的,但在大规模场景下成本高昂。诸如 HNSW 之类的近似最近邻索引通过遍历索引结构而不是穷举扫描每个向量来降低搜索成本。
近似搜索引入了召回率与延迟之间的权衡。更快的搜索可能会遗漏精确搜索本应返回的候选结果。因此,索引参数不仅影响基础设施性能,还会影响检索质量。
Qdrant 同时提供了与 HNSW 相关的参数和精确搜索选项,这表明向量存储和近似检索策略是相互独立的决策。
元数据过滤应在候选检索之前或期间进行
如果用户只能访问租户 A,那么从租户 B 检索语义相似的片段并试图稍后将其移除,是错误的安全边界。授权和硬性资格过滤器应在候选结果能够影响下游处理之前,对候选空间进行约束。
同样的原则适用于区域设置、文档状态、来源类别、日期、产品版本以及其他确定性约束。相似度应对符合条件的候选结果进行排序;它不应覆盖资格条件。
向量数据库是可选的
对于小型语料库,暴力余弦比较可能简单且足够。具有向量支持的关系数据库也可能足够。当专用向量数据库的索引、过滤、分布式存储、更新行为或运维特性能够解决实际需求时,它才变得有价值。
因为“RAG 需要一个向量数据库”而选择向量数据库,颠倒了架构设计流程。应从检索需求和规模出发,然后选择存储/索引技术。
重排序:第二阶段的相关性优化
重排序器接收一个查询和一组较小的已检索候选结果,然后分配更强的相关性分数或新的排序。它通常比第一阶段检索的计算成本更高,这就是为什么它应用于候选生成之后,而不是针对整个语料库。
当前 Elastic 的指南将语义重排序描述为针对小型 top-k 集合的最终阶段技术,并指出它可以优化词汇、语义或混合检索。Cohere 记录了相同的架构:先进行第一阶段的词汇或语义搜索,然后进行重排序阶段。
一种常见的实现使用类似交叉编码器的模型,该模型同时检查查询和每个候选结果。这种更丰富的交互可以比独立的嵌入相似度更精确地区分相关性,但在语料库规模下成本要高得多。
双编码器检索和交叉编码器重排序解决不同的成本问题
| 属性 | 双编码器 / 嵌入检索 | 交叉编码器式重排序 |
|---|---|---|
| 编码方式 | 查询和文档独立表示 | 查询和候选结果联合处理 |
| 文档计算 | 可在摄取时预先计算 | 通常针对每个查询-候选对重新计算 |
| 语料库规模搜索 | 适合使用向量索引 | 在整个语料库上通常成本过高 |
| 典型角色 | 高召回率的候选生成 | 对小型候选集进行高精度排序 |
| 主要权衡 | 快速且可扩展,但相关性交互被压缩到向量中 | 更丰富的相关性判断,但延迟/成本更高 |
重排序器无法恢复检索遗漏的内容
如果相关文档不在候选集中,重排序就没有任何可以提升的对象。这就是需要分别评估检索和重排序的核心原因。
一个流水线可能具有出色的重排序器精确率,但仍然会因为第一阶段召回率较差而失败。提高重排序器质量无法修复缺失的源覆盖、糟糕的分块、限制性过滤器或较弱的候选检索器。
混合检索是一个独立的设计选择
当查询和文档使用不同措辞但表达相关含义时,稠密语义检索表现很强。当精确术语、标识符、名称、代码或罕见短语很重要时,词法检索表现很强。
混合检索结合多种候选信号,通常是词法 BM25 和向量相似度,然后使用诸如倒数排名融合或加权分数组合之类的方法合并排名。
随后,重排序可以在融合后的候选集上运行。因此,混合检索和重排序是互补但不同的阶段。
BM25 并不会因为嵌入的存在而过时
对于精确标识符、版本号、错误消息、产品代码和专业词汇,关键词搜索可能优于稠密检索。例如,SQLite FTS5 包含用于全文搜索的 BM25 排名函数。
一个强大的检索架构可以将词法检索作为唯一的第一阶段,将向量检索作为唯一的第一阶段,或者根据语料库和查询分布将两者结合起来。
分块会改变嵌入和重排序器能够看到的内容
如果文档被糟糕地切分,后续任何检索组件都无法完全重建缺失的语义单元。一个将条件与其例外切开的块,可能会以误导性的方式嵌入,也可能因为候选文本不完整而被错误地重排序。
因此,块大小、重叠、结构边界和元数据都会影响候选召回和重排序器判断。检索评估应测试从摄取到排名的完整流水线,而不仅仅是嵌入模型。
不要像比较通用概率那样比较检索分数
余弦相似度、BM25 分数、稀疏向量分数、RRF 排名和重排序器分数具有不同含义。来自一个嵌入模型的 0.82 分,并不自动与来自另一个模型的 0.82 分或与重排序器分数具有可比性。
阈值应针对实际模型、语料库和任务进行校准。当前 Elastic 指南还指出,嵌入相似度分数可能依赖于查询,这使得通用截断值存在风险。
分别评估检索阶段
| 层级 | 有用的问题 | 示例指标或测试 |
|---|---|---|
| 源覆盖 | 语料库是否包含所需信息? | 覆盖审计 / 已知答案源集合 |
| 分块 | 所需证据是否能作为连贯单元被检索到? | 块级支持审查 |
| 第一阶段检索 | 相关条目是否进入候选集? | Recall@k |
| 排名 | 相关证据出现得有多靠前? | MRR、nDCG、precision@k |
| 重排序 | 第二阶段评分是否改善排序? | Delta nDCG / MRR / precision |
| 上下文选择 | 最终选定的段落是否包含足够支持? | 上下文相关性 / 覆盖 |
| 答案阶段 | 模型是否正确使用选定的证据? | 忠实性 / 主张-证据评估 |
这种分离在操作上很重要。如果 Recall@50 很差,重排序器并不是第一个需要修复的组件。如果 Recall@50 很强,但最佳段落仍排在第 38 位,那么重排序或排名融合就成为一个可能的目标。
究竟是哪一层失败了?
症状与可能的检索层
| 观察到的症状 | 可能的层 | 首要诊断 | |
|---|---|---|---|
| 相关文档从未出现 | |||
| 相关文档排名过低 | |||
| 语义上良好但被禁止的结果 | |||
| 相关但过时的结果 | |||
| 检索到正确结果但被提示词遗漏 |
相关性与事实来源是不同的
重排序器可以让一份过时的文档看起来极其相关。向量索引可以检索到语义上比原始来源更接近的次级摘要。因此,检索质量不能替代权威规则。
在来源权威性重要的地方,元数据过滤器、来源类别、版本规则和出处应在结果成为模型上下文之前约束检索。
原始实现证据
事实来源研究引擎:词法检索与语义检索是分离的
事实来源研究引擎包含一条使用 SQLite FTS5/BM25 的本地词法检索路径,以及一条使用本地生成嵌入的独立可选语义检索路径。
其语义搜索实现会计算查询向量,并使用余弦相似度将其与存储的块向量进行比较。该项目有意将语义相似度视为发现信号而非证据:候选结果在支持某项主张之前,仍必须追溯到具体的来源和定位符。
这对 R01 来说是有用的实现证据,因为同一语料库可以同时支持词法排名和向量相似度,而不会将任一机制与证据权威性相混淆。
Aaasaasa AI 客户端:Qdrant 是向量基础设施组件
Aaasaasa AI 客户端将 Qdrant/向量基础设施作为独立的本地资源。Electron 架构从受信任的主进程侧暴露 Qdrant 服务,而不是将向量搜索视为模型本身的一部分。
该仓库包含 Qdrant 客户端适配器、Qdrant 服务配置以及基于 Docker 的 Qdrant 基础设施。这展示了 AI 提供商/模型执行与向量存储/搜索之间的架构分离。
不应将 Qdrant 支持的存在夸大为完整的生产级 RAG 流水线。这里的证据更为有限:向量基础设施是作为其自身的组件边界实现的。
| 实现证据 | 它展示了什么 |
|---|---|
| 事实来源研究引擎中的 SQLite FTS5/BM25 | 词法检索可以独立于嵌入存在。 |
| 本地 Ollama 嵌入 | 表示生成是其自身的阶段。 |
| 存储的语义向量 + 余弦比较 | 语义检索在嵌入生成之后消费它们。 |
| Aaasaasa AI 客户端中的 Qdrant 支持 | 向量存储/搜索是一种独立于模型提供商的基础设施能力。 |
| 事实来源研究引擎中的证据/出处规则 | 检索到的相似度不等于权威性或证明。 |
| 这些实现中没有声称的自定义重排序器 | 重排序被解释为一个架构阶段,而不是被虚假声称已经实现的证据。 |
何时需要每个组件?
| 需求 | 可能的组件 |
|---|---|
| 不同措辞之间的语义相似性 | 嵌入模型 + 向量相似性搜索 |
| 在大型向量语料库上进行高效搜索 | 向量索引/数据库或支持向量的搜索引擎 |
| 精确标识符、错误代码或罕见术语 | 词汇/全文检索,如 BM25 |
| 既需要精确术语又需要语义含义 | 混合词汇 + 语义检索 |
| 候选集良好但排序较弱 | 重排序器 |
| 相关项不在候选集中 | 在重排序之前改进源覆盖、分块、检索器、过滤器或候选数量 |
| 硬性租户/来源/版本约束 | 确定性元数据/授权过滤 |
| 小型语料库 | 可能使用简单的暴力相似性计算或通用数据库,而非专用向量数据库 |
实用的检索设计流程
从需求出发设计检索,而非从产品名称出发
常见误解
| 误解 | 纠正 |
|---|---|
| “嵌入就是向量数据库。” | 嵌入是一种表示;数据库/索引存储并搜索表示。 |
| “向量数据库创造语义含义。” | 嵌入模型创建表示;向量系统对其进行索引和比较。 |
| “RAG 需要向量数据库。” | RAG 需要检索,而不是特定的检索技术。 |
| “重排序与向量搜索相同。” | 向量搜索生成候选;重排序对候选集重新排序。 |
| “重排序器能修复糟糕的召回。” | 它们无法提升从未被检索到的文档。 |
| “密集搜索取代 BM25。” | 词汇搜索对于精确术语、标识符和专业词汇仍然有价值。 |
| “相似度越高意味着越权威。” | 相似度和来源权威性是不同的维度。 |
| “更大的 top-k 总能改善 RAG。” | 更大的候选集可以提高召回,但会增加延迟、噪声和上下文选择负担。 |
| “一个分数阈值适用于所有情况。” | 分数取决于模型、查询、语料库和检索方法,必须进行校准。 |
| “专用向量数据库总是更先进。” | 只有当其操作和检索能力符合需求时,才值得使用。 |
边缘情况和限制
有些应用不需要语义搜索。精确的数据库查找或结构化 SQL 可能比嵌入检索更正确、更快速且更易于审计。
有些语料库非常小,全向量扫描是可以接受的。近似索引增加了复杂性却没有有意义的收益。
有些查询在任何精度优化之前就需要高召回。法律发现、研究和合规审查可能更倾向于广泛的候选检索,然后进行透明的过滤和人工审查。
多语言和领域特定的检索在不同嵌入模型上的表现可能差异很大。来自公共数据集的基准声明不应被视为对私有语料库的证明。
重排序延迟随候选数量和长度的增加而增长。因此,候选大小应作为准确性/成本/延迟变量进行调整,而不是从教程中复制。
什么会改变这个答案?
如果供应商将嵌入生成、向量索引和重排序打包在一个 API 后面,组件边界不会改变。产品可能隐藏这些阶段,但它们在概念上仍然是不同的职责,具有不同的故障模式。
未来的嵌入或检索模型可能会在某些工作负载中减少对单独重排序的需求,而更强的后期交互或学习稀疏方法可能会模糊传统的密集/词汇类别。架构仍然应该问哪个阶段产生表示、哪个阶段生成候选以及哪个阶段细化排名。
最佳设计还会随语料库大小、查询组合、语言、领域术语、更新频率、来源权威性、延迟预算和评估结果而变化。
相关规范知识
R01 假设基本的 RAG 概念已经被理解。RAG 是一种更广泛的模式,其中检索到的外部信息被提供给模型;嵌入、向量搜索和重排序是该模式中的可选检索组件。
当检索失败时,应分别诊断来源覆盖、检索、排序、上下文组装和生成,而不是将整个系统视为一次“RAG 失败”。
真相来源架构是检索周围的权威层:它决定哪个来源可以确立一项主张,而嵌入和排序只决定哪些候选看起来相关。
常见问题
嵌入、向量数据库和重排序
嵌入和向量数据库有什么区别?
重排序器做什么?
RAG 需要向量数据库吗?
为什么不对整个语料库使用重排序器?
重排序能修复缺失的文档吗?
余弦相似度是相关性概率吗?
我应该同时使用 BM25 和向量搜索吗?
什么时候需要专用的向量数据库?
术语表
关键检索术语
- 嵌入
- 由嵌入模型生成的内容数值表示,用于相似度、聚类、检索或相关任务。
- 稠密向量
- 一种向量表示,其中许多维度携带非零值,常用于语义检索。
- 稀疏向量
- 一种高维表示,其中大多数维度为零,通常保留更强的词元或词项结构。
- 向量索引
- 一种数据结构,用于组织向量以实现高效的相似度或最近邻检索。
- 向量数据库
- 一种存储/搜索系统,旨在管理向量、相关元数据和向量检索工作负载。
- ANN
- 近似最近邻搜索,以精确穷举比较换取大规模下更快的检索。
- HNSW
- 分层可导航小世界,一种基于图的近似最近邻索引方法,广泛用于向量检索。
- BM25
- 一种基于词项出现和语料库统计的词法相关性排序方法,广泛用于全文搜索。
- 混合搜索
- 结合多种检索方法(如词法搜索和向量搜索)的结果或分数的检索。
- 重排序
- 检索的后续阶段,对已生成的候选集重新评分和重新排序。
- 双编码器
- 一种独立编码查询和候选的架构,支持预计算和可扩展的相似度搜索。
- 交叉编码器
- 一种联合处理查询和候选文本的模型,通常以更高的计算成本提高相关性判断。
- Recall@k
- 在前 k 个检索到的候选中恢复的相关项比例。
- nDCG
- 归一化折损累计增益,一种排序指标,奖励在有序列表中位置更高的相关结果。
结论
清晰的检索模型很简单:嵌入表示含义,向量搜索检索候选,重排序器优化候选排序。
一旦这些边界明确,架构决策就更容易诊断。缺失候选指向来源覆盖、分块、嵌入、过滤器或首阶段检索。排序不佳指向排序、融合或重排序。然后可以在上下文和生成层分别调查不正确的最终答案。
最重要的结果不是选择最时髦的检索组件。而是构建一个检索管道,其阶段、权威边界、指标和失败模式可以独立测量。
主要来源和实现证据
以下外部参考文献记录了本文中使用的表示、向量搜索和重排序机制。项目特定部分是原创实现证据,有意比关于完整生产 RAG 成熟度的声明更窄。
Sentence-BERT:使用孪生 BERT 网络的句子嵌入基础论文,展示了可独立计算的句子嵌入,用于高效的语义相似度搜索。
Qdrant — 架构和数据结构概述官方文档,描述集合、点、向量、有效负载元数据和基于 HNSW 的相似度索引。
Qdrant — 搜索官方向量搜索文档,涵盖相似度查询、过滤、精确与近似搜索以及稠密/稀疏行为。
Elastic — 向量搜索关于稠密/稀疏向量检索、词法/向量组合和多阶段搜索管道的最新文档。
Elastic — 语义重排序当前指南将语义重排序定义为对较小候选集进行的后期相关性操作。
Cohere — 使用 Cohere 进行重排序当前文档展示重排序作为对词法或语义第一阶段检索的第二阶段改进。
SQLite FTS5SQLite 官方文档,介绍全文搜索及用作词法检索证据的内置 BM25 排序函数。
Related Articles

气隙AI:AI系统如何在没有互联网或云访问的情况下工作
气隙AI在隔离的安全域内运行模型、RAG和AI应用,无需互联网或云依赖。了解模型、数据、更新和工具如何离线运行。

MCP vs A2A vs UCP vs AP2 vs A2UI:智能体协议栈详解
MCP、A2A、UCP、AP2 和 A2UI 常被描述为相互竞争的智能体标准。它们大多解决的是不同的互操作性问题。本指南将每个协议映射到其实际标准化的边界,并展示它们如何在同一个生产系统中协同工作。

生成式人工智能解析:模型、检索、工具与应用并非同一回事
生成式AI不仅仅是一个模型。了解模型、检索、工具、上下文、运行时和应用程序如何在生产AI系统中协同工作。

AI代理记忆不是RAG:如何区分记忆、检索、状态和上下文
代理记忆、RAG、状态和上下文经常被当作可以互换的概念来使用。它们并不是。这个实用的架构模型将这四个层次区分开来,展示了每一层各自应处的位置,并解释了当系统将它们合并为一层时会出现什么问题。

什么是上下文工程?模型在回答之前接收到了什么
上下文工程负责设计 AI 模型在推理前接收的信息,包括提示词、检索内容、记忆、应用状态、工具结果和对话历史。

RBAC与租户隔离:两种不同的安全边界
RBAC 控制用户可以做什么;租户隔离控制该操作可以触及哪个租户的资源。了解为什么多租户 SaaS 安全需要这两道边界。

LLM从哪里获取数据?Python中的RAG数据源
LLM 并不会神奇地知道你的文件、数据库或 API。这个 RAG 系列的实用续篇用简单的 Python 展示了外部数据如何变成可检索的证据:从文本文件和 SQL 到全文搜索、嵌入、上下文组装以及最终的 LLM 调用。

什么是AI平台架构师?模型、数据、运行时、安全与运维
AI平台架构师负责跨模型、提供商、检索、智能体、身份、安全、评估、可观测性和运营设计可复用的AI基础。

GPU 不是产品:面向未来的私有 AI 架构
私有 AI 基础设施不应围绕单一 GPU 或单一模型来设计。更具韧性的做法是将快速推理 GPU、内存充裕的 AI 系统、物理 AI 节点以及可选的前沿云模型,统一置于一个具备能力感知的路由层之后。

答案有效性边界:相关性到可靠AI答案之间缺失的层级
一个来源可能相关、权威,但对于所提出的问题仍然是错误的。缺失的层次是适用性:答案成立的条件,以及迫使其被重新考虑的变化。本文介绍了“答案有效性边界”这一面向人类、AI搜索和RAG系统的来源设计模式。

企业AI架构:当AI进入公司时会发生什么变化
企业AI架构阐释了AI如何在数据权限、身份、许可、提供商、风险、治理、评估、合规和运营方面改变公司系统。

为什么更多上下文会让AI的回答更糟
更大的上下文窗口并不保证更好的答案。本文解释了信号稀释、证据冲突、状态过时、位置敏感性和有损压缩如何降低AI可靠性——并介绍了一种实用的上下文压力测试。