外观
RAG 检索优化:距离、稀疏稠密、粗排精排与向量数据库
面试结论| 生产检索通常不是“向量库搜 TopK”一个动作,而是硬过滤后由 BM25/稀疏检索守住精确词,由稠密向量补充语义召回,再用 RRF 或归一化加权融合,最后让 Cross-Encoder 在有限候选上精排。粗排负责低成本扩大 Recall,精排负责在候选内提高前排 Precision;向量数据库只提供存储、索引、过滤与查询能力,不能替代数据治理、评测和排序策略。
目录
- 1. 小白先这样理解
- 2. 一张数据表看懂完整漏斗
- 3. 欧几里得距离、余弦相似度与点积
- 4. 倒排索引、倒排排名与 BM25
- 5. 稀疏、稠密、语义相关性与精确匹配
- 6. TopK、粗排、融合与精排
- 7. Cross-Encoder 与加权
- 8. 向量数据库与关系型数据库
- 9. 向量检索产品横向对比
- 10. 技术点清单与横向选型
- 11. 架构、调用流程与最小实现
- 12. 排障、面试追问与总结
1. 小白先这样理解
小白先这样理解:给走失宠物匹配线索
社区里一只叫“雪球”的白色柴犬走失。志愿者收到四条线索:
- “看到名牌写着 XQ-204 的白色柴犬”;
- “公园里有只浅色中型犬,一直追红色飞盘”;
- “宠物店见到白色萨摩耶”;
- “停车场有只棕色柯基”。
按编号查找时,第 1 条最可靠;按描述含义找时,第 2 条也很值得调查。系统先让两支便宜快速的队伍工作:一支按名字、编号和词语查,另一支按整体语义查;合并出几十条候选后,再让熟悉犬种和上下文的专家逐条比较“问题 + 线索”,排出最终顺序。
| 故事元素 | 技术概念 | 边界 |
|---|---|---|
按 XQ-204、名字、犬种查 | 精确匹配、倒排索引、BM25/稀疏检索 | 词面不重合时可能漏掉 |
| 按“浅色中型犬追红飞盘”找相似描述 | 稠密向量、语义相关性 | 可能把语义相近但事实不同的线索排高 |
| 两队各交一批名单 | 多路粗排与各自 k_recall | 只保证候选,不保证最终顺序 |
| 合并名单 | RRF 或归一化加权融合 | 异构原始分数不能随便相加 |
| 专家同时阅读寻犬信息与线索 | Cross-Encoder 精排 | 计算贵,且救不回未召回线索 |
类比边界: 专家可能凭现实经验核验颜色、时间和地点,模型只依据训练与输入。若元数据时间范围、地理范围或权限没有作为硬约束,相关性再高也可能是错误候选。
2. 一张数据表看懂完整漏斗
示例查询:企业版 ERR-42 付款一直转圈怎么办?
| 阶段 | 输入规模 | 代表动作 | 示例输出 | 主要目标 |
|---|---|---|---|---|
| 硬过滤 | 100 万 Chunk | tenant=17 AND product=enterprise AND version=v7 | 8 万可见 Chunk | 正确边界 |
| BM25 粗排 | 8 万 | 匹配 ERR-42、企业版、付款 | 100 个候选 | 精确词召回 |
| Dense 粗排 | 8 万 | 匹配“支付卡住/结算无响应”语义 | 100 个候选 | 语义召回 |
| 融合去重 | 最多 200 | stable ID 去重,RRF | 60 个候选 | 汇总互补信号 |
| Cross-Encoder 精排 | 60 | 联合编码 Query 与 Chunk | 前 12 个 | 前排相关性 |
| 上下文选择 | 12 | 去重、父块扩展、Token 预算 | 5 个证据块 | 可生成证据 |
表中数字是演示漏斗,不是推荐参数或实测数据。生产上应明确维护:
text
k_recall_sparse, k_recall_dense > k_rerank >= k_context这里表达阶段关系,不代表必须使用某个固定数值。
3. 欧几里得距离、余弦相似度与点积
3.1 先纠正术语
“余弦定理”是三角形边角关系;向量检索常用的是余弦相似度(Cosine Similarity),它可由向量夹角定义,并能联系到余弦定理,但两者不是同一个检索算法名称。
若三角形两边长度为
把两条边看成从原点出发的向量
3.2 欧几里得距离
对向量
距离越小越相近。它同时受方向和模长影响,适合模长具有明确意义或模型按 L2 空间训练的表示。
生活直觉是城市地图上的直线距离:两家店坐标越近,走向上越相似。但高维语义空间不是物理地图,维度由模型学习,不能把单维直接解释为“价格”或“情绪”。
3.3 余弦相似度
它主要比较方向;值越大通常越相似。若向量都已归一化为单位长度:
因此在单位向量上,按 L2 距离与按余弦相似度排序等价。这个结论依赖相同的归一化条件。
3.4 点积
点积同时受方向和模长影响。若向量均已单位归一化,点积等于余弦相似度;未归一化时,不能把两者混称。
3.5 用二维数据手算
设 Query
:方向完全相同但模长更大; :部分同向; :方向相反。
| 文档 | L2 距离,越小越好 | 余弦,越大越好 | 点积,越大越好 |
|---|---|---|---|
| a | |||
| b | |||
| c |
这里余弦认为 a 与 q 方向完全一致,L2 却认为 b 在坐标位置上更近。选择距离度量必须服从 Embedding 模型训练与官方建议,并在目标数据上验证,不能凭习惯切换。
3.6 高频追问:余弦与点积到底有什么区别
30 秒回答| 余弦相似度只比较向量方向,因为它用两边的模长做了归一化;点积既受方向影响,也受模长影响。只有 Query 和文档向量都做了 L2 单位归一化时,点积才严格等于余弦相似度;未归一化时,模长较大的向量可能凭规模而不是方向获得更高点积分数。最终使用哪一种必须服从 Embedding 模型的训练目标和输出规范,并用固定评测集验证。
用
:方向与 Query 几乎一致, ,点积为 ; :方向偏离更大, ,点积却为 。
余弦会把
这里必须同时归一化 Query 与文档向量,并保证线上和建库使用同一处理流程。只归一化一侧、模型版本不一致,或者模型本来利用向量模长表达置信度/流行度时,都不能直接把点积当成余弦。
4. 倒排索引、倒排排名与 BM25
4.1 什么是倒排索引
正排索引是“文档 → 包含哪些词”,倒排索引是“词 → 出现在哪些文档、哪些位置”。例如:
text
ERR-42 -> [(doc_1, tf=2, positions=[3, 19]), (doc_7, tf=1, positions=[8])]
付款 -> [(doc_1, tf=1), (doc_3, tf=4)]查询不必扫描全库文本,而是从词项的 posting list 取得候选。所谓“倒排排名”不是一种与 BM25 并列的固定算法,更准确的说法是:倒排索引负责快速找候选,BM25 等相关性函数负责排序。
4.2 精确匹配不等于 BM25
- 精确匹配可以是 ID、Keyword 字段、短语、布尔条件或未分词字段的相等判断;
- BM25 是基于词项统计的软相关性排序;
- 版本号、订单号、错误码常需要 keyword/phrase/field filter,不能只依赖默认分词后的 BM25;
- 中文还需要选择分词器、词典、同义词和字段策略,否则“企业版”可能被不合适地拆分。
4.3 BM25 核心公式
一种常见写法为:
:词 在文档 D 中的频次; :词越稀有,区分力通常越强; :控制词频饱和,出现 20 次不会简单等于出现 1 次的 20 倍; :控制文档长度归一化; :当前文档长度相对平均长度。
4.4 小数据直觉
在 1000 篇文档中,“系统”出现于 900 篇,“ERR-42”只出现于 3 篇。查询包含两词时,ERR-42 的 IDF 区分力更强;但若某篇文档把 ERR-42 重复堆砌 100 次,词频饱和会限制刷分。
BM25 擅长错误码、函数名、产品名、法规条款和精确术语;它不理解词面完全不同的“付款一直转圈”与“支付请求未完成”可能同义。
4.5 BM25 与 BGE-M3 的分数区间
这里必须先明确口径:下表中的 BGE-M3 指项目语义检索所用的 Dense 模式,不是 BGE-M3 的 Sparse 或 ColBERT 分数。
| 检索分数 | 常见计算方式 | 理论区间 | 排序方向 | 关键边界 |
|---|---|---|---|---|
| Lucene 风格 BM25 | 各查询词的 IDF × 饱和词频 × 长度归一化 后求和 | 通常记作 | 越大越相关 | 固定 Query、固定语料、无额外 Boost 时分数有限;其他 BM25 变体的 IDF 可能允许负值 |
| BGE-M3 Dense:归一化向量 + 点积/余弦 | 越大越相似 | BGE-M3 默认归一化 Dense 向量;线上常见正分不代表理论区间是 | ||
| BGE-M3 Dense:未归一化点积 | 越大越相似 | 同时受方向与模长影响,不能再把点积称为余弦 | ||
| BGE-M3 Dense:L2 距离 | 一般为 | 越小越相似 | 若存储的是平方 L2,单位向量区间为 |
Lucene 常见 BM25 实现使用:
代入 4.3 节公式后可以看到:稀有词的 IDF 更大;词频项随
BGE-M3 Dense 先取文本表示并做 L2 归一化:
官方示例再用矩阵乘法计算点积,因此:
这可以在 FlagEmbedding 的 BGE-M3 文档 和 BGE-M3 官方模型卡 中核对(访问日期:2026-08-22)。真实业务中的分数分布由 Query 类型、语料、模型版本和负样本难度决定,因此“超过 0.7 就相关”不是通用规则,阈值必须在本项目标注集上按 Precision、Recall、空召回率和成本共同校准。
另外,BGE-M3 还支持 Sparse 与 ColBERT 多向量模式。Sparse 分数可写为查询与文档重合词项权重乘积之和,通常非负但没有统一上限;Dense、Sparse、ColBERT 的加权混合分数也不再属于
5. 稀疏、稠密、语义相关性与精确匹配
5.1 稀疏向量
稀疏(Sparse)表示维度很高,但大多数值为零。传统词袋/BM25 可视作以词项为维度的稀疏信号;SPLADE 一类学习式稀疏模型还能扩展相关词,但仍保留可解释词项维度。
5.2 稠密向量
稠密(Dense)表示维度相对固定且多数值非零。Embedding 模型将文本、图像或音频映射到连续空间,用向量距离近似语义相关性。
5.3 四种相关性不要混成一个词
| 信号 | 它回答什么 | 擅长 | 典型误判 |
|---|---|---|---|
| 精确匹配 | 字符/字段是否相等或包含 | ID、错误码、版本、短语 | 同义改写完全不重合 |
| 词法相关性 | 查询词在文档中多重要 | 名词、术语、可解释搜索 | 只看词面,不懂完整意图 |
| 向量语义相关性 | 表示空间中是否接近 | 同义表达、自然语言描述 | 语义相近但事实、主体或时间错误 |
| 任务相关性 | 这段证据是否真正回答当前问题 | 条件、否定、细粒度关系 | 需要联合读 Query 与文档,成本高 |
Cross-Encoder 更接近第四类,但仍不是事实验证器。
5.4 向量模型有哪些,为什么把 BGE-M3 作为首个基线
30 秒回答| 工程里说的“向量模型”通常指 Embedding 模型。它们可以分为静态词向量、句子/段落 Dense 模型、同时输出 Dense/Sparse/Multi-Vector 的多功能模型、托管 Embedding API,以及文本图像统一空间的多模态模型。当前 CSGO RAG 把 BGE-M3 作为首个自托管基线,是因为它用一个开源模型覆盖中英多语言、1024 维 Dense、学习式 Sparse、ColBERT Multi-Vector 与最长 8192 Token,适合验证“精确术语 + 语义改写 + 长文档”的混合检索链路;但这只是能力与架构匹配,不是已经压测证明的最终最优模型。
“有哪些模型”无法列成封闭名单,实际选型先按职责分组:
- Word2Vec、GloVe、FastText 是静态词向量,适合理解词级表示或轻量词相似,不是现代段落级 RAG 的默认首选;
- Sentence-BERT、MiniLM、BGE v1.5 等是句子/段落 Dense 模型,部署简单,适合单路语义召回;
- multilingual-E5、Qwen3-Embedding、Jina Embeddings、GTE Multilingual 等覆盖多语言、指令或可变维度等不同侧重;
- BGE-M3、GTE Multilingual 可以同时生成 Dense 与学习式 Sparse 表示,BGE-M3 还提供 ColBERT Multi-Vector;
- OpenAI
text-embedding-3-*、Googlegemini-embedding-*、Cohereembed-v4.0、Voyagevoyage-4-*属于托管 API,接入快,但要评估数据出域、费用、限流、版本与厂商锁定; - CLIP/SigLIP 或支持图文统一空间的托管模型适合图像、截图和 PDF 版面检索,不能和纯文本模型只按一个榜单名次比较。
事实边界| 下表依据各官方模型卡或官方文档在 2026-08-26 可见的能力整理。官方参数只证明它们是候选,不证明在 CSGO 中文问法、
market_hash_name、Pattern/Phase、长文档和硬过滤条件下谁的真实 Recall、延迟与成本更好。
| 技术点 ID | 候选方案 | 官方能力摘要 | 优点 | 代价与边界 | 当前条件式结论 |
|---|---|---|---|---|---|
| TP-R02 | BGE-M3 | 1024 维、8192 Token、100+ 语言;统一 Dense、Sparse、ColBERT Multi-Vector;MIT | 一套模型可做多路检索消融,自托管与中文/英文混合场景友好 | 三种表示仍会增加索引、存储和检索成本;8192 Token 不取消切片;不是当前最新或必然最强 | 当前首个自托管混合检索基线 |
| TP-R02 | Qwen3-Embedding 0.6B/4B/8B | 32K、100+ 语言、指令感知、MRL 可变维度;最大维度依型号为 1024/2560/4096 | 新一代质量候选,覆盖更长上下文、代码与跨语言检索,型号横跨效率到效果 | 4B/8B 推理与部署成本明显更高;官方榜单不能代替项目基准 | 质量优先对照组,先测 0.6B,再按收益评估大型号 |
| TP-R02 | GTE Multilingual Base | 305M、768 维、8192 Token、70+ 语言;支持 Elastic Dense 与 Sparse | 向量更小,模型更轻,适合作效率和成本基线 | 自定义代码、Sparse 路与版本集成需验证;项目术语质量未知 | 效率优先对照组 |
| TP-R02 | multilingual-E5-large-instruct | 0.6B、1024 维、多语言 Dense;Query 侧需要任务指令,长文本最多 512 Token | 成熟、容易建立纯 Dense 基线,指令可明确检索任务 | 512 Token 截断,不统一提供 Sparse/ColBERT;漏加 Query 指令会掉质量 | 纯 Dense 成熟基线 |
| TP-R02 | 托管 API:OpenAI/Gemini/Cohere/Voyage | 提供不同长度、维度、语言和模态的在线 Embedding;部分支持可变维度或图文输入 | 无需自建推理服务,适合快速建立质量上界或多模态候选 | 数据合规、网络、单价、限流、版本和重新建库风险需持续核对 | 合规允许时选 1 个作外部质量基线,不默认替代自托管 |
BGE-M3 对当前设计的匹配点有五个:
- 中英混合: 中文知识问法与英文饰品名、技术名词可以进入同一模型;专有 ID 仍由 Keyword/BM25、词典和硬过滤兜底;
- 一套模型验证三种表示: 同一次模型推理可以产生 Dense、Sparse 与 ColBERT 表示,便于在统一语料上做单路与混合消融;但外部 BM25 与 BGE-M3 Sparse 是两条不同词法路径,不能混称;
- 较长输入: 8192 Token 为长段落和多语言文档保留空间,但 RAG 仍要按语义、引用粒度和 Token 预算切片;
- 自托管与可控版本: MIT 开源模型便于固定权重、预处理、归一化和索引版本,适合敏感数据不出域;代价是需要承担推理、容量、升级和监控;
- 现有链路一致: 1024 维与当前容量估算、Milvus/pgvector 候选和 RRF/Cross-Encoder 流程相容,切换成本较低。
最终选择必须执行同条件基准:固定语料、Chunk、Query 集、过滤条件、硬件和预算,至少比较 BM25 only、BGE-M3 Dense、BGE-M3 Dense + BM25/Sparse + RRF、Qwen3/GTE Dense 与 Hybrid + Reranker;分查询类型报告 Recall@K、MRR/NDCG、引用支持率、P95/P99、吞吐、显存、向量存储和重建时间。若 Qwen3/GTE 或托管 API 在必须守住的质量/SLO 上显著更好,额外资源或外部依赖可接受,就应切换,而不是为了简历技术栈固守 BGE-M3。
6. TopK、粗排、融合与精排
6.1 TopK 是一个操作,不是一个固定参数
TopK 表示按某个分数/距离取前 K 个。RAG 中至少有:
k_recall_sparse:BM25/稀疏路候选数;k_recall_dense:向量路候选数;k_fusion:融合后保留数;k_rerank:送入精排模型的候选数;k_context:最终进入上下文的证据数。
只说“TopK=5”没有说明阶段、分母、Token 预算和评测目标,几乎无法判断是否合理。
6.2 粗排与精排
粗排(Candidate Retrieval/First-stage Ranking)面向大语料,用倒排或 ANN 等索引快速缩小候选。它追求较高 Recall、较低单候选成本与稳定延迟。
精排(Reranking/Second-stage Ranking)只处理几十或几百候选,使用更贵、更细的 Query-Document 交互提高前排 Precision。精排不能补回粗排没有召回的证据。
6.3 为什么不能直接对全库 Cross-Encoder
若有 100 万 Chunk,每次都把 Query 与全部 Chunk 联合编码,计算和延迟通常不可接受;而双塔 Dense 可预计算文档向量,在线只编码 Query 并做 ANN。两阶段本质是缓存可复用表示换速度,再用少量深交互换精度。
6.4 为什么需要 ANN
30 秒回答| 精确 KNN 要把 Query 与全库向量逐一计算距离,单次查询成本约为
;当向量数量 和维度 增大时,延迟、吞吐和资源成本难以满足在线要求。ANN(Approximate Nearest Neighbor,近似最近邻)通过 HNSW 图、IVF 分桶等索引只访问更可能相近的一部分候选,用少量 Recall 损失换取更低延迟和更高吞吐。它不是无条件更准确,生产上必须用精确 KNN 作为基线评估 ANN Recall,再结合 P95/P99、吞吐和资源成本选参数。
直观上,精确 KNN 像让工作人员把 Query 背包与仓库里每一个背包逐个比较;ANN 会先按特征把候选组织成“相近街区”,查询时只进入最可能的几个街区。它减少了比较次数,但也可能因为走错入口而漏掉真正最近的候选。
例如有
- HNSW 把向量组织成多层近邻图,从少量入口逐步走向更近的节点;
- IVF 先把向量划入多个聚类桶,查询时只探测最相关的一部分桶;
- 参数越激进,通常访问候选越多、Recall 越高,但延迟和资源也随之上升。
ANN 的质量不能用“返回结果看起来差不多”验收。固定同一份数据、过滤条件、距离度量和 Query 集后,以精确 KNN 的 TopK 为参照:
再同时记录 P95/P99、吞吐、内存和索引构建成本。小数据、离线校验、法规或业务要求绝对精确,或者暴力扫描已经满足 SLO 时,可以继续使用精确 KNN;ANN 是规模和延迟驱动的工程取舍,不是向量检索的必选前提。
7. Cross-Encoder 与加权
7.1 Bi-Encoder 与 Cross-Encoder
| 维度 | Bi-Encoder/双塔 | Cross-Encoder/交叉编码器 |
|---|---|---|
| 输入方式 | Query 与文档分别编码 | [Query; Document] 联合编码 |
| 文档表示 | 可离线预计算 | 通常每次 Query 都要重算配对 |
| 速度 | 适合全库粗排 | 适合有限候选精排 |
| 交互强度 | 压缩成单向量后比较 | Token 级联合注意力更充分 |
| 边界 | 可能丢细粒度关系 | 成本高、输入截断、不能补召回 |
7.2 加权的三种位置
- 检索融合权重: Sparse 与 Dense 的贡献;
- 业务排序权重: 权威性、新鲜度、地域等软信号;
- 多模态权重: 文本、图像、音频等不同向量空间的贡献。
最危险的写法是直接:
text
final = 0.5 * bm25_raw_score + 0.5 * cosine_scoreBM25 分数通常无统一上界,余弦的范围和分布又由模型决定,原始分数尺度不同且会随 Query 漂移。更稳妥的起点:
- 用 RRF 按名次融合,不依赖原始分数可比;
- 或先在每路做可靠归一化/校准,再用验证集学习权重;
- 业务 boost 应有上限,不能让热度压过基本相关性;
- 权重必须分查询类型评测,不用一套 α 覆盖错误码、自然语言和版本查询。
RRF 常见形式:
它稳健但会丢失分数幅度;若第一名和第二名原分数差距巨大,RRF 只看到名次差。
8. 向量数据库与关系型数据库
8.1 向量数据库是什么
30 秒面试回答| 向量数据库(Vector Database)是面向高维向量存储和相似度检索优化的数据系统。它把文本、图片或音频经 Embedding 模型转换后的向量连同 Metadata 保存起来,再通过精确近邻或 ANN 索引快速找到与 Query Vector 最相似的候选。它解决的是大规模“按相似程度查找”的效率问题,但不负责理解原始内容、生成高质量 Embedding,也不能替代关系数据库的事务与业务真值。
可以把它理解成一个“按外观和特征找物”的失物招领处:普通数据库适合问“编号为 A-1024 的物品在哪里”,向量数据库更擅长问“帮我找和这张照片最像的背包”。照片先由 Embedding 模型压缩成一串数字,查询照片也变成同一向量空间中的数字;数据库再比较距离或相似度,返回最接近的若干物品。
| 失物招领场景 | 技术映射 |
|---|---|
| 背包照片 | 原始文本、图片或音频 |
| 把颜色、形状等特征编码成数字 | Embedding 模型生成高维向量 |
| “黑色、三楼、今天捡到” | Metadata 与硬过滤条件 |
| 在大量物品中快速找相似背包 | 精确 KNN 或近似最近邻 ANN 检索 |
| 返回最像的 10 个候选 | TopK 结果、相似度或距离 |
真实调用链是:原始数据先由数据库外部的 Embedding 模型生成向量,写入时保存 id + vector + metadata;查询时把 Query 用同版本模型转成 Query Vector,先应用租户、权限、版本等硬过滤,再按余弦、点积或 L2 距离执行 KNN/ANN 检索,返回候选 ID、Metadata 和分数。常见系统还提供 HNSW/IVF 等 ANN 索引、批量写入、删除、分片复制和混合检索能力。
类比边界: 向量中的单个维度通常不能直接解释为“颜色”或“材质”,相似也不等于事实正确。Embedding 模型、切片、距离度量、索引参数或权限过滤有问题时,向量数据库只会更快地返回错误候选;在 RAG 中,后面仍需融合、精排、上下文构造、引用和答案评测。
8.2 关系型数据库是什么
关系型数据库围绕表、Schema、约束、事务、JOIN、精确查询和一致性构建。pgvector 说明两者不是互斥物种:PostgreSQL 可以通过扩展获得向量类型和 HNSW/IVFFlat 搜索,在一套事务与 SQL 中同时管理业务字段和向量。
8.3 核心区别
| 维度 | 专用向量引擎 | 关系型数据库 | 设计判断 |
|---|---|---|---|
| 主查询 | 高维相似度/ANN | 精确过滤、JOIN、聚合、事务 | 看核心负载,不看名称 |
| 一致性与事务 | 产品差异大,常重搜索吞吐 | 成熟 ACID 与约束 | 业务真值优先留关系库 |
| Schema/关系 | Metadata 过滤为主 | 复杂关系和查询优化成熟 | 多表业务逻辑不应硬塞向量库 |
| 扩展方式 | 分片、索引、向量压缩专门优化 | 通用数据库扩展,向量能力依实现 | 规模与运维能力决定 |
| 混合检索 | 有的原生支持稀疏/混合 | 可配 FTS + pgvector | 用同一评测集比较 |
| 运维边界 | 新系统、新备份与一致性模型 | 可复用现有 Postgres 能力 | 小规模先避免过度拆分 |
关键边界: 向量库通常不是订单、权限、价格和账户余额的业务真值库。常见架构是关系库存文档状态与权限真值,向量引擎存可重建的检索投影,通过 outbox/CDC/任务对账保证同步。
9. 向量检索产品横向对比
事实边界| 下表依据各产品官方资料在 2026-07-13 可见的能力说明整理,只证明能力候选,不证明在你的数据、规模、硬件和团队约束下谁更优。价格、托管区域、版本限制和性能必须发布前重新核对并实测。
| 候选 | 定位与能力侧重 | 优点 | 代价/风险 | 更适合 | 不宜仅凭此选择 |
|---|---|---|---|---|---|
| pgvector | PostgreSQL 扩展;精确检索、HNSW、IVFFlat,可与 FTS 组合 | 复用 SQL、事务、备份与业务数据;架构简单 | 超大规模向量负载与独立扩缩容需实测;ANN 过滤要调参 | 已有 Postgres、中小规模、强事务/过滤 | 只因“少一个组件”就忽略容量与 P99 |
| Elasticsearch | 倒排、BM25、过滤与 kNN/混合检索统一在搜索引擎 | 词法搜索、字段查询、分析器和可观测生态成熟 | 集群与映射运维复杂,向量成本需压测 | 搜索本来就是核心、精确词与语义并重 | 只做简单向量 PoC |
| Qdrant | 向量搜索;named dense/sparse/multivector、过滤、多阶段查询 | 混合与多阶段查询表达清晰,Payload 过滤与多向量友好 | 复杂全文分析能力边界与 Elastic 不同;需新增服务治理 | 向量优先、混合/多向量、希望自托管或云 | 把它当复杂关系/全文分析数据库 |
| Milvus | 分布式向量数据库;多向量、过滤、混合搜索 | 面向大规模向量和多种索引/部署形态 | 组件、容量规划和运维复杂度较高 | 大规模、独立向量平台、专业运维团队 | 小数据且团队不愿承担平台成本 |
| Weaviate | 对象/向量搜索;BM25F、向量、混合、过滤、named vectors | 混合搜索接口完整,Schema 与模块生态丰富 | 版本特性、模块和资源模型需核对 | 希望一体化对象+混合搜索 | 不做版本验证就依赖预览能力 |
| Pinecone | 托管向量服务;Dense/Sparse/Hybrid、Metadata、Namespace | 托管运维、快速交付、弹性服务 | 厂商依赖、费用、数据区域与一致性边界需评估 | 不想自建集群、重视交付速度 | 强本地部署、特殊合规或需完全控制底层 |
| Chroma/本地轻量方案 | 开发与本地向量检索 | 上手快、适合教学和原型 | 生产扩展、HA、治理能力需单独验证 | Notebook、单机 PoC、测试 | 仅凭 PoC 顺畅直接作为大规模生产结论 |
9.1 条件式选型路径
- 数据与业务事务强绑定、规模可控:先验证 PostgreSQL + pgvector;
- 已有成熟 Elastic 搜索集群,错误码/字段/全文检索占比高:优先验证 Elastic 混合检索;
- 向量、多向量、过滤与自托管是核心:比较 Qdrant、Milvus、Weaviate;
- 团队希望托管、快速上线:评估 Pinecone 等托管方案,同时核对区域、费用、导出与锁定风险;
- 教学/原型:轻量本地方案可以最快闭环,但生产结论必须重新评估。
真正的选型顺序不是先列产品,而是先固定五类约束:数据规模与增长、Dense/Sparse/多向量检索形态、ACL/Metadata 过滤分布、事务与一致性要求、部署合规和团队运维能力。然后在同一份数据、查询集、过滤条件与硬件预算下比较 Recall@K、P95/P99、吞吐、写入与索引新鲜度、故障恢复、资源成本和运维工时,并预先写明切换条件。
9.2 简历中为什么选择 Milvus
30 秒项目化回答| 您说得对,pgvector 配合 PostgreSQL Full-Text Search、RRF 或 Cross-Encoder 同样能实现混合检索,所以“支持混合检索”不是我选择 Milvus 的充分理由。只有在向量检索已成为需要独立扩缩和资源隔离的核心负载,并且项目需要统一治理 Dense、Sparse/BM25、多向量字段、Metadata 过滤与索引重建时,我才会选择 Milvus;它的代价是引入新的分布式组件和运维链路。如果数据规模、并发和隔离需求没有超过 PostgreSQL 的 SLO,我会优先选择 pgvector,最终选择必须由同数据、同过滤条件和同硬件预算下的 Recall、P99、吞吐、资源与故障恢复测试证明。
这段回答的关键不是背 Milvus 功能,而是把“业务约束 → 候选差异 → 选择理由 → 代价 → 验证与回退”讲完整:
| 选型问题 | CSGO RAG 的条件式判断 | 必须准备的证据 |
|---|---|---|
| 为什么需要专用向量引擎 | 不是因为 PG 做不了混合检索,而是检索负载需要与业务事务、JOIN 和普通 SQL 查询分开扩缩、发布和故障隔离 | Chunk 数与增长、并发、过滤选择率、数据库资源争用、目标 P99 |
| 为什么是 Milvus | 官方能力覆盖 Dense、学习式 Sparse、BM25 全文检索、多向量混合搜索与分布式扩展,能承接 BGE-M3 的 Dense/Sparse 表示和混合召回设计 | Schema、索引与查询配置;固定问题集上的 Recall@K、MRR/NDCG |
| 为什么不用 pgvector | pgvector 具备精确/ANN、Sparse Vector,并可与 PostgreSQL FTS 组合混合检索;只有共享数据库的 CPU、内存、I/O、扩容或发布边界不再满足 SLO 时,拆出 Milvus 才有依据 | 相同数据和过滤条件下的 pgvector 基线、资源争用与容量结果;不能只说“Milvus 性能更高” |
| 为什么不用 OpenSearch | 当核心是专业向量与多向量检索,而不是复杂 Analyzer、聚合和全文搜索平台时,Milvus 更贴近负载 | 精确词查询占比、Analyzer 需求、混合检索质量与运维成本对比 |
| 为什么不用 Qdrant | Qdrant 同样是可行的向量优先候选,不能靠功能清单直接排除;应比较团队经验、部署拓扑、过滤分布、资源和故障恢复 | 同一基准、版本和硬件下的 PoC 结果;没有数据时只说“候选待验证” |
| Milvus 的边界是什么 | 它保存可重建的检索投影,不承载价格、库存、订单、权限和发布状态等业务真值 | PostgreSQL/业务 API 与索引同步、撤权传播、重建和对账设计 |
简历证据边界: 当前仓库能确认的是 Milvus 已作为用户补充的项目设计口径,并有正式架构与实践文档;尚未看到可核验的运行集群、项目代码或受控压测结果。因此,在取得证据前应写“设计/选型使用 Milvus”或“基于 Milvus 构建检索方案”,不要写“生产稳定承载大规模向量”或虚构性能提升。若确有真实落地,应补齐 Collection Schema、索引参数、数据规模、查询 Trace、评测集、SLO、故障演练和本人负责范围。
高频追问:pgvector 也支持混合检索,为什么不用
先承认事实,再比较架构边界,不能强行证明 Milvus 全面更强:
| 对比维度 | pgvector + PostgreSQL FTS | Milvus | 选型含义 |
|---|---|---|---|
| 混合检索 | 支持向量检索,并可与 PostgreSQL FTS、RRF、Cross-Encoder 组合 | 原生管理 Dense、Sparse/BM25、多向量搜索与融合 | 两者都能做,功能存在性不能决定选型 |
| 事务与关系查询 | 复用 ACID、JOIN、SQL、备份与业务数据 | 更适合作为可重建检索投影,不替代关系业务真值 | 业务与向量强关联、规模可控时 pgvector 更简单 |
| 资源与扩缩边界 | 向量、事务、JOIN 和普通查询共享 PostgreSQL 治理边界 | 存算解耦,写入、查询、索引/Compaction 可按架构独立治理 | 检索成为独立核心负载时 Milvus 的平台价值才成立 |
| 运维成本 | 少一个系统,可复用现有监控、备份和 HA | 新增对象存储、WAL/元数据、节点调度、升级和恢复链路 | 没有专门运维能力时不要为“先进架构”拆分 |
| 最终证据 | Recall、P99、吞吐、资源争用、扩容和恢复基线 | 使用同一数据与预算完成对照实验 | 没有对照数据,只能说设计选择,不能声称性能胜出 |
可直接接住追问:
是的,pgvector 可以配合 PostgreSQL FTS 做混合检索,所以混合检索只是必要条件,不是决定因素。我们考虑 Milvus 的核心原因,是把不断增长的向量写入、ANN 查询和索引构建从业务 PostgreSQL 的事务与 JOIN 负载中隔离出来,让检索层可以单独扩容、发布和重建;同时在一套检索 Schema 中管理 Dense、Sparse/BM25、多向量与 Metadata 过滤。不过,如果项目没有达到需要资源隔离的规模,或者 pgvector 压测已经满足 Recall 和 P99,我会选择 pgvector,因为系统更少、事务和运维更简单。当前没有真实对照压测时,我只能把 Milvus 表述为架构选型,不能说它已经被证明性能更好。
比“混合检索和数据量”更充分的理由
真正能经受追问的不是继续罗列功能,而是说明 Milvus 如何匹配项目的数据模型、事实边界和索引生命周期。理由强度可按下表排序:
| 理由强度 | CSGO 项目中的具体约束 | Milvus 承担的职责 | 回答边界 |
|---|---|---|---|
| 强:检索投影与业务真值分离 | 饰品知识可以重建索引,但价格、库存、订单、用户资产和权限必须保持事务一致、可审计且带时间戳 | PostgreSQL/API 保存权威事实;Milvus 只保存可重建的 Dense、Sparse、图像向量和检索 Metadata,索引构建与 ANN 负载不占用业务库的事务治理边界 | 这是架构职责划分,不代表拆分后性能必然更高;仍需测同步延迟、撤权传播、资源和故障恢复 |
| 强:多种检索表示属于同一饰品实体 | 同一件饰品既要按自然语言语义检索,也要命中 market_hash_name、Pattern/Phase 等精确术语;多模态阶段还可能按检视图或图片查找相似饰品 | 在同一 Collection 的实体上组织 Dense、Sparse/BM25 和可选图像向量字段,再融合各路候选,减少跨系统维护实体映射的胶水代码 | 只有已经实现的向量字段才能写成项目成果;图像向量若尚未落地,只能说是 Schema 的演进预留 |
| 强:先用业务条件守住事实边界,再做 ANN | “某武器、某品质、某磨损、某阶段、当前有效版本”不是语义相似问题;若先召回再过滤,可能丢失本应进入 TopK 的候选 | 在 ANN 前按 weapon、rarity、exterior、collection、phase、language、source、is_active、版本或 ACL 做 Scalar/Metadata 过滤,缩小候选空间 | pgvector 也能用 SQL 过滤;理由在于把多路向量检索和过滤统一放在独立检索层,不是 Milvus 独占过滤能力 |
| 强:索引版本可重建、可切换、可回退 | Embedding 模型、维度、距离度量、Chunking 或语料变化时,新旧向量不能混在同一检索版本中 | 为新版本建立独立 Collection,离线回放固定问题集;验收后切换 Alias,异常时回到旧 Collection,并保留 embedding_version、chunker_version 和 corpus_version | Alias 只是发布机制,不能替代数据校验;只有真正实现重建、验收和回退流程时,才能称为工程亮点 |
| 中:部署形态与 API 演进一致 | 当前几十万向量单机足够,但后续可能出现多模态、并发增长、索引重建和高可用要求 | 开发可用 Lite,当前可用 Standalone;达到受控压测与高可用切换条件后再评估 Distributed 或托管服务,应用侧保持 Milvus API 体系 | 这是降低未来迁移摩擦的设计价值,不是现在提前上分布式集群的理由;数据迁移和运维验证仍然存在 |
把这些理由收敛成一段 60~90 秒可直接口述的回答:
我选择 Milvus,不是因为只有它支持混合检索,也不是因为几十万条向量 PostgreSQL 放不下。这个项目更关键的约束有三个:第一,同一件 CSGO 饰品同时存在自然语言知识、精确名称和 Pattern 等稀疏特征,后续还可能增加图片向量,我希望以同一实体管理多种检索表示;第二,weapon、rarity、exterior、phase、有效版本和权限这类条件必须在向量召回前做硬过滤,避免语义相似但事实不符合的候选;第三,Embedding、Chunking 或语料升级时,检索索引要能独立重建,通过新 Collection 验证后再切换 Alias,避免新旧版本混用。与此同时,价格、库存、订单和用户资产仍然由 PostgreSQL 或受控 API 提供,Milvus 只承担可重建的检索投影。当前规模使用 Standalone 已足够;如果实际只有一个文本向量、过滤简单,而且 pgvector 在同一基准下满足 Recall、P99 和资源目标,我会选择 pgvector,因为它的系统复杂度更低。
面试时不要把下面几句话单独当作主理由:
- “Milvus 支持混合检索”:pgvector、OpenSearch、Qdrant 等也有可行路径;
- “Milvus 支持海量数据”:当前几十万向量还不能证明需要专用分布式引擎;
- “Milvus 性能更高”:没有同数据、同硬件、同过滤条件的基准就属于无证据结论;
- “Milvus 是云原生架构”:架构标签只有转化为扩缩、隔离、恢复或运维收益后才有项目意义。
面试表达原则: 最有说服力的顺序是“事实库与检索库的职责边界 → CSGO 的多向量实体和硬过滤 → 索引版本发布与回退 → 当前部署形态 → pgvector 的回退条件”。只讲已经实现或能够出示 Schema、Trace、评测集、部署配置的部分;其余明确标注为设计或演进计划。
9.3 CSGO 2.3 万件饰品的容量估算与向量库选择
估算输入与证据边界| 用户在 2026-08-22 提供约
23,000件饰品、饰品相关信息可能达到几十万条。这里把100,000~500,000个最终 Chunk 作为容量情景,不代表已经完成清洗、去重和切片;真实 Vector 数必须由导入结果统计,业务表的一行也不等于一个 Chunk。
哪些信息进入知识库
| 数据类型 | 代表内容 | 推荐存储与查询 | 是否向量化 |
|---|---|---|---|
| 稳定解释性知识 | 饰品背景、系列与稀有度说明、磨损和模板规则、印花/工艺解释、交易术语、平台规则、FAQ、攻略 | 版本化文档 + RAG;保留来源、生效时间和引用 | 是,按语义段落切片 |
| 饰品标准主数据 | item_id、market_hash_name、武器、皮肤、品质、磨损档位、StatTrak、Souvenir、Collection、Float 范围、Pattern/Phase、标签 | PostgreSQL 作为真值;同时复制必要字段到检索 Metadata 做硬过滤 | 只为自然语言说明生成少量事实卡,不把每个字段拆成独立向量 |
| 实时行情与市场状态 | 当前价格、在售数量、买卖盘、成交量、手续费、汇率、可交易状态 | 受控 API/SQL,返回来源、币种和 as_of | 否,不能依赖历史向量回答当前值 |
| 用户资产与订单 | Steam 库存实例、assetid、账号权限、挂单和订单状态 | 关系库/业务 API,按 Principal 鉴权 | 否,不能进入公共知识索引 |
| 历史行情明细 | 分钟/小时价格、成交事件、盘口快照 | 时序库、关系库分区或 OLAP;按时间聚合计算 | 明细不向量化,只将带日期和来源的分析报告按需入库 |
| 图片、检视图与视频 | 饰品图片、Pattern 图、检视截图、交易视频 | 对象存储保存原文件;关系库存资产与版权信息 | 需要多模态检索时保存 Caption/OCR 或独立图像向量,不把二进制塞进文本向量 |
推荐把一件饰品拆成“一个权威模板身份 + 零到少量知识事实卡 + 若干独立知识文章”,而不是把每一次报价、库存和成交记录都 Embedding。这样 23,000 件饰品不必然产生几十万个向量;最终数量由可回答的知识段落决定。
BGE-M3 Dense Vector 容量粗算
BGE-M3 官方模型卡给出的 Dense 维度是 1024。若使用 FP32 且每个 Chunk 保存一个 Dense Vector:
text
raw_dense_bytes = vector_count × 1024 × 4下表同时给出一个简化的 HNSW 图估算:假设每个节点记录 32 条、每条 4 Byte 的邻接关系。它只用于容量量级判断,忽略多层图、Segment、对齐和实现开销。
| 最终 Vector 数 | FP32 Dense 原始向量 | 简化 HNSW 邻接图 | 若平均正文为 2 KiB |
|---|---|---|---|
| 23,000 | 89.8 MiB | 2.8 MiB | 44.9 MiB |
| 100,000 | 390.6 MiB | 12.2 MiB | 195.3 MiB |
| 300,000 | 1.14 GiB | 36.6 MiB | 585.9 MiB |
| 500,000 | 1.91 GiB | 61.0 MiB | 976.6 MiB |
| 1,000,000 | 3.81 GiB | 122.1 MiB | 1.91 GiB |
这仍不是 Milvus 最终磁盘或内存总量。还要加上 Sparse Vector、标量字段和索引、主键、WAL、对象存储中的原始数据与索引文件、Compaction 临时空间、增长余量以及查询副本。Replica 通常会放大已加载数据的内存需求;Sparse Vector 大小由非零项数量决定,不能仅由 Dense 维度推算。生产容量应从真实 Collection/Segment 指标和压测观测取得,不使用固定倍数冒充实测。
针对当前数量的选型结论
| 条件 | 建议 |
|---|---|
| 已有 PostgreSQL、最终约 10 万~50 万 Vector、并发和过滤压力中等 | 优先用 pgvector 建基线。架构最简单,BGE-M3 的 1024 维在其向量维度范围内,并可结合 PostgreSQL FTS、Sparse Vector、RRF 与 Cross-Encoder |
| 论文或作品集明确要实践 BGE-M3 Dense/Sparse、Milvus BM25 与独立检索服务 | 可使用 Milvus Standalone,但理由应是检索服务边界和技术实践,不是“几十万数据只能用 Milvus” |
| 检索负载已影响业务 PostgreSQL,或查询、写入、索引构建需要独立扩缩、发布、恢复和高可用 | 再评估 Milvus Standalone/Distributed;是否升级分布式由 SLO、故障恢复和容量实测决定 |
| 关键词 Analyzer、全文字段查询、聚合和搜索运营比向量能力更重要 | 优先比较 OpenSearch/Elasticsearch |
| 想使用独立向量服务,但希望单节点部署和运维更轻 | 将 Qdrant 与 Milvus Standalone 放入同一 PoC,不凭产品名直接排除 |
当前推荐: 以 100,000~500,000 个 BGE-M3 1024 维 Vector 估算,这仍是单机可验证的规模。若目标是最小复杂度和真实产品实现,先选 PostgreSQL + pgvector;若目标同时包含 Milvus 架构实践,可以选 Milvus Standalone,官方当前给出的 Standalone 推荐起点是 4+ Core、16 GiB RAM、SSD/NVMe,可从 50~100 GiB NVMe 作为本项目 PoC 的工程预算起点,但磁盘数值是本文建议而非官方容量结论。不要仅因数据达到几十万条就部署 Milvus Distributed。
决策前最小基准
用同一份 100k/300k/500k 数据快照和固定问题集比较 pgvector 与 Milvus Standalone:
- 质量:Exact KNN 对照下的 ANN
Recall@20,以及混合检索的 MRR/NDCG、引用支持率; - 过滤:无过滤、候选保留 10%、1% 时的 Recall 与 P95/P99;
- 系统:并发
1/10/50下的吞吐、CPU、内存、磁盘和超时率; - 更新:批量导入、增量 Upsert、删除可见性、索引构建时间和索引新鲜度;
- 恢复:重启、索引重载、备份恢复和重建耗时;
- 运维:部署组件数、监控、升级、故障定位和月度资源成本。
只有当 Milvus 在项目必须守住的 SLO 或隔离边界上获得可证明收益,额外系统复杂度才值得承担。
索引参数、过滤、小 Segment、批写、Compaction、Load、资源隔离与压测闭环统一维护在《Milvus 生产问题与性能调优》,本篇不重复保存另一套易漂移的参数清单。
10. 技术点清单与横向选型
| 技术点 ID | 技术点/环节 | 类型 | 采用方案 | 链路职责 | 版本/证据边界 |
|---|---|---|---|---|---|
| TP-R01 | 词法粗排 | 检索算法 | 倒排索引 + BM25 + 精确字段 | 召回编号、术语和词面证据 | Analyzer 与参数按语料验证 |
| TP-R02 | 语义粗排 | 模型/索引 | Dense Embedding + ANN | 召回同义和意图相近证据 | 距离度量服从模型说明 |
| TP-R03 | 融合 | 排序算法 | RRF 起步,受控数据再校准加权 | 合并异构候选 | 权重与常数无通用最优 |
| TP-R04 | 精排 | 模型服务 | Cross-Encoder | 联合判断 Query-Chunk 任务相关性 | 只覆盖已召回候选 |
| TP-R05 | 向量存储 | 数据基础设施 | 依规模、事务、运维和搜索负载选型 | 存向量/Metadata 并执行过滤与 ANN | 官方能力核对于 2026-08-22 |
| 技术点 ID | 候选方案 | 优点 | 缺点/代价 | 适用场景 | 不适用场景 | 选择结论与依据 |
|---|---|---|---|---|---|---|
| TP-R01 | 精确 Keyword/Phrase | 确定、可解释 | 无同义召回 | ID、版本、错误码 | 自然语言改写 | 与 BM25 并存 |
| TP-R01 | BM25/BM25F | 词频统计和字段权重成熟 | 依赖分词,语义弱 | 技术文档、专名 | 纯语义问法 | 词法默认基线 |
| TP-R02 | 精确 KNN | Recall 可作为 ANN 基线 | 全库成本高 | 小库、离线校验 | 大规模低延迟 | 用于基线与抽样审计 |
| TP-R02 | HNSW/IVF 等 ANN | 速度和规模更好 | 牺牲部分 Recall、需调参 | 生产大库 | 不能容忍近似误差 | 用精确检索测 ANN Recall |
| TP-R03 | RRF | 不依赖异构原始分数尺度 | 丢分数幅度信息 | 无可靠校准的多路检索 | 需要精细概率解释 | 稳健起点 |
| TP-R03 | 归一化/学习加权 | 可利用分数与查询特征 | 需标注集、校准和防漂移 | 有充足评测数据 | 无标注或尺度不稳 | 证据充足再升级 |
| TP-R04 | Bi-Encoder 相似度 | 快,可预计算 | 交互不足 | 粗排 | 最终细粒度排序 | 不替代精排 |
| TP-R04 | Cross-Encoder | 联合交互更充分 | 延迟、成本、截断 | 有限候选精排 | 全库扫描 | 配超时降级 |
| TP-R05 | 关系库扩展 | 事务与 SQL 复用 | 独立扩缩和极限规模需验证 | 强业务关系、中小规模 | 纯向量超大负载 | 先做成本最低基线 |
| TP-R05 | 专用/托管向量引擎 | ANN、分片、多向量能力集中 | 新系统、成本和锁定 | 向量为核心负载 | 简单 PoC | 按受控基准选,不按榜单选 |
11. 架构、调用流程与最小实现
图:架构|混合检索、粗排精排与双存储边界
替代文本: 关系库存放权限、文档状态和版本真值,搜索/向量索引保存可重建投影;查询编排先生成可信硬过滤,再并行调用 BM25 与 Dense 粗排,融合去重后由 Cross-Encoder 精排并选择上下文,Trace 记录每层候选与版本。
图表加载中…
读图结论: 业务真值和检索投影职责不同;相关性优化只能发生在受权候选内,每个排序阶段都必须可重放。
图:技术调用流程|一次混合检索的成功、超时与降级
替代文本: 编排器先校验身份并构造硬过滤,并行请求词法和向量粗排;一路超时可在受权结果内降级,两路都失败则拒绝无证据回答;融合候选送精排,精排超时退回融合排名,最终二次授权并记录上下文。
图表加载中…
读图结论: 允许降级的是相关性质量,不允许降级的是权限边界;两路都没有可靠证据时应拒答,而不是让模型凭参数记忆补全。
最小融合伪代码:
python
def rrf(rank_lists, weights=None, c=60):
weights = weights or [1.0] * len(rank_lists)
scores = {}
for weight, docs in zip(weights, rank_lists):
for rank, doc in enumerate(docs, start=1):
scores[doc.stable_id] = scores.get(doc.stable_id, 0.0) + weight / (c + rank)
return sorted(scores, key=scores.get, reverse=True)
# 仅示意:c=60 不是通用最优值;必须保存每路原 rank 与检索版本。12. 排障、面试追问与总结
12.1 正确证据首次消失在哪一层
| 现象 | 对比数据 | 首要假设 |
|---|---|---|
| BM25 无、Dense 有 | 分词 Token、词项 DF、Dense rank | 同义表达或 Analyzer 问题 |
| Dense 无、BM25 有 | 向量范数、模型/维度、距离分布 | Embedding/索引版本错或专名 OOV |
| 两路有、融合后掉出 | 各路 rank、stable ID、融合配置 | 候选深度不足、重复、权重/RRF 配置 |
| 融合有、精排后掉出 | 输入是否截断、Reranker 版本与分数 | 精排模型不适配、截断或版本漂移 |
| 精排有、上下文没有 | k_context、父块、去重、Token 截断 | 上下文选择错误 |
12.2 递进追问
- 单位归一化后,L2、余弦和点积的排序关系是什么?
- 倒排索引与 BM25 分别负责什么?
- 为什么“语义相关”不等于“事实正确并能回答问题”?
- 为什么 BM25 原始分数不能和余弦分数直接加权?
- Cross-Encoder 为什么只能精排,不能补召回?
- 什么时候 pgvector 比专用向量库更合适,什么时候应拆分?
- 如何用精确 KNN 评估 ANN Recall 与参数取舍?
- 简历中为什么选择 Milvus,而不是 pgvector、OpenSearch 或 Qdrant?
- 向量数据库变慢时,为什么不能直接增加节点或调小
ef/nprobe?
12.3 一分钟面试复述版
我把检索拆成硬过滤、两路粗排、融合、精排和上下文选择。BM25 基于倒排与词项统计,擅长错误码和精确术语;Dense 用向量空间补同义和意图召回,距离度量必须服从模型训练与归一化方式。两路原始分数尺度不同,我通常先用 RRF,再在有标注集时做校准加权;Cross-Encoder 只处理有限候选,提高前排相关性,但救不回漏召回。向量数据库选型要同时看规模、过滤、混合检索、事务、运维、合规和成本,小规模强事务场景可先验证 pgvector,专用引擎则要用相同数据和 SLO 压测。
参考资料
- Robertson 与 Zaragoza,The Probabilistic Relevance Framework: BM25 and Beyond;
- Nogueira 与 Cho,Passage Re-ranking with BERT;
- pgvector 官方仓库,访问日期:2026-08-22;
- Elasticsearch kNN 与混合检索官方文档,访问日期:2026-07-13;
- Qdrant Hybrid Queries 官方文档,访问日期:2026-07-13;
- Milvus Filtered Search 官方文档,访问日期:2026-08-22;
- Milvus Overview 官方文档,访问日期:2026-08-22;
- Milvus Hybrid Search 官方文档,访问日期:2026-08-22;
- Milvus Multi-Vector Hybrid Search 官方文档,访问日期:2026-08-22;
- Milvus Collection 与 Alias 官方文档,访问日期:2026-08-22;
- Milvus Full Text Search 官方文档,访问日期:2026-08-22;
- Milvus Architecture Overview 官方文档,访问日期:2026-08-22;
- Milvus Index Explained 官方文档,访问日期:2026-08-22;
- Milvus Standalone Requirements 官方文档,访问日期:2026-08-22;
- Milvus Deployment Options 官方文档,访问日期:2026-08-22;
- BAAI BGE-M3 官方模型卡,访问日期:2026-08-22;
- Qwen3-Embedding 官方模型卡,访问日期:2026-08-26;
- GTE Multilingual Base 官方模型卡,访问日期:2026-08-26;
- multilingual-E5-large-instruct 官方模型卡,访问日期:2026-08-26;
- OpenAI Embedding 模型官方说明,访问日期:2026-08-26;
- Gemini Embedding 官方模型说明,访问日期:2026-08-26;
- Cohere Embed 官方模型说明,访问日期:2026-08-26;
- Voyage Text Embeddings 官方文档,访问日期:2026-08-26;
- Weaviate Hybrid Search 官方文档,访问日期:2026-07-13;
- Pinecone Search Overview 官方文档,访问日期:2026-07-13。
简明总结
一句话记忆: 粗排负责“别漏”,精排负责“排对”,硬过滤负责“不能错看”,数据库负责“高效执行”而不是替你决定答案。
- 欧几里得、余弦和点积只有在明确归一化条件下才能讨论排序等价;精确 KNN 是质量基线,ANN 用可测量的 Recall 损失换取延迟、吞吐和规模收益;
- 倒排索引找候选,BM25 排词法相关性,精确字段守住编号与版本;
- Sparse 与 Dense 互补,语义相关不等于事实正确;
- 多个 TopK 分属召回、融合、精排和上下文,必须分开记录与调优;
- 向量库与关系库不是替代关系,选型取决于真实负载、事务、规模和团队边界。