Skip to content

RAG 检索优化:距离、稀疏稠密、粗排精排与向量数据库 ​

面试结论| 生产检索通常不是“向量库搜 TopK”一个动作,而是硬过滤后由 BM25/稀疏检索守住精确词,由稠密向量补充语义召回,再用 RRF 或归一化加权融合,最后让 Cross-Encoder 在有限候选上精排。粗排负责低成本扩大 Recall,精排负责在候选内提高前排 Precision;向量数据库只提供存储、索引、过滤与查询能力,不能替代数据治理、评测和排序策略。

目录 ​

1. 小白先这样理解 ​

小白先这样理解:给走失宠物匹配线索 ​

社区里一只叫“雪球”的白色柴犬走失。志愿者收到四条线索:

  1. “看到名牌写着 XQ-204 的白色柴犬”;
  2. “公园里有只浅色中型犬,一直追红色飞盘”;
  3. “宠物店见到白色萨摩耶”;
  4. “停车场有只棕色柯基”。

按编号查找时,第 1 条最可靠;按描述含义找时,第 2 条也很值得调查。系统先让两支便宜快速的队伍工作:一支按名字、编号和词语查,另一支按整体语义查;合并出几十条候选后,再让熟悉犬种和上下文的专家逐条比较“问题 + 线索”,排出最终顺序。

故事元素技术概念边界
按 XQ-204、名字、犬种查精确匹配、倒排索引、BM25/稀疏检索词面不重合时可能漏掉
按“浅色中型犬追红飞盘”找相似描述稠密向量、语义相关性可能把语义相近但事实不同的线索排高
两队各交一批名单多路粗排与各自 k_recall只保证候选,不保证最终顺序
合并名单RRF 或归一化加权融合异构原始分数不能随便相加
专家同时阅读寻犬信息与线索Cross-Encoder 精排计算贵,且救不回未召回线索

类比边界: 专家可能凭现实经验核验颜色、时间和地点,模型只依据训练与输入。若元数据时间范围、地理范围或权限没有作为硬约束,相关性再高也可能是错误候选。

2. 一张数据表看懂完整漏斗 ​

示例查询:企业版 ERR-42 付款一直转圈怎么办?

阶段输入规模代表动作示例输出主要目标
硬过滤100 万 Chunktenant=17 AND product=enterprise AND version=v78 万可见 Chunk正确边界
BM25 粗排8 万匹配 ERR-42、企业版、付款100 个候选精确词召回
Dense 粗排8 万匹配“支付卡住/结算无响应”语义100 个候选语义召回
融合去重最多 200stable ID 去重,RRF60 个候选汇总互补信号
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),它可由向量夹角定义,并能联系到余弦定理,但两者不是同一个检索算法名称。

若三角形两边长度为 a,b,夹角为 θ,对边为 c,余弦定理是:

c2=a2+b2−2abcos⁡θ

把两条边看成从原点出发的向量 x,y,则 a=∥x∥、b=∥y∥、c=∥x−y∥。与 ∥x−y∥2=∥x∥2+∥y∥2−2x⋅y 对照,可得 x⋅y=∥x∥∥y∥cos⁡θ,再归一化就是余弦相似度。余弦定理提供几何关系,余弦相似度才是检索中用于比较向量方向的量。

3.2 欧几里得距离 ​

对向量 x,y∈Rn:

dL2(x,y)=∑i=1n(xi−yi)2

距离越小越相近。它同时受方向和模长影响,适合模长具有明确意义或模型按 L2 空间训练的表示。

生活直觉是城市地图上的直线距离:两家店坐标越近,走向上越相似。但高维语义空间不是物理地图,维度由模型学习,不能把单维直接解释为“价格”或“情绪”。

3.3 余弦相似度 ​

cos⁡(x,y)=x⋅y∥x∥2∥y∥2

它主要比较方向;值越大通常越相似。若向量都已归一化为单位长度:

∥x−y∥22=2−2cos⁡(x,y)

因此在单位向量上,按 L2 距离与按余弦相似度排序等价。这个结论依赖相同的归一化条件。

3.4 点积 ​

sdot(x,y)=x⋅y

点积同时受方向和模长影响。若向量均已单位归一化,点积等于余弦相似度;未归一化时,不能把两者混称。

3.5 用二维数据手算 ​

设 Query q=(1,1),三个文档向量:

  • a=(2,2):方向完全相同但模长更大;
  • b=(1,0):部分同向;
  • c=(−1,−1):方向相反。
文档L2 距离,越小越好余弦,越大越好点积,越大越好
a2≈1.41414
b11/2≈0.7071
c22≈2.828−1−2

这里余弦认为 a 与 q 方向完全一致,L2 却认为 b 在坐标位置上更近。选择距离度量必须服从 Embedding 模型训练与官方建议,并在目标数据上验证,不能凭习惯切换。

3.6 高频追问:余弦与点积到底有什么区别 ​

30 秒回答| 余弦相似度只比较向量方向,因为它用两边的模长做了归一化;点积既受方向影响,也受模长影响。只有 Query 和文档向量都做了 L2 单位归一化时,点积才严格等于余弦相似度;未归一化时,模长较大的向量可能凭规模而不是方向获得更高点积分数。最终使用哪一种必须服从 Embedding 模型的训练目标和输出规范,并用固定评测集验证。

用 q=(1,0) 比较两个文档:

  • a=(1,0.1):方向与 Query 几乎一致,cos(q,a)≈0.995,点积为 1;
  • b=(10,10):方向偏离更大,cos(q,b)≈0.707,点积却为 10。

余弦会把 a 排在前面,因为它更关注方向;点积会把 b 排在前面,因为 b 的模长放大了分数。如果把 q、a、b 都归一化为单位向量,则:

q^⋅d^=q∥q∥⋅d∥d∥=q⋅d∥q∥∥d∥=cos⁡(q,d)

这里必须同时归一化 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 核心公式 ​

一种常见写法为:

score(D,Q)=∑qi∈QIDF(qi)⋅f(qi,D)(k1+1)f(qi,D)+k1(1−b+b|D|avgdl)
  • f(qi,D):词 qi 在文档 D 中的频次;
  • IDF(qi):词越稀有,区分力通常越强;
  • k1:控制词频饱和,出现 20 次不会简单等于出现 1 次的 20 倍;
  • b:控制文档长度归一化;
  • |D|/avgdl:当前文档长度相对平均长度。

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 × 饱和词频 × 长度归一化 后求和通常记作 [0,+∞),没有跨 Query、跨语料库的统一上限越大越相关固定 Query、固定语料、无额外 Boost 时分数有限;其他 BM25 变体的 IDF 可能允许负值
BGE-M3 Dense:归一化向量 + 点积/余弦s(q,d)=q^⋅d^=cos⁡(q,d)[−1,1]越大越相似BGE-M3 默认归一化 Dense 向量;线上常见正分不代表理论区间是 [0,1]
BGE-M3 Dense:未归一化点积s(q,d)=q⋅d(−∞,+∞)越大越相似同时受方向与模长影响,不能再把点积称为余弦
BGE-M3 Dense:L2 距离d(q,d)=‖q−d‖2一般为 [0,+∞);单位向量为 [0,2]越小越相似若存储的是平方 L2,单位向量区间为 [0,4]

Lucene 常见 BM25 实现使用:

IDF(qi)=ln⁡(1+N−df(qi)+0.5df(qi)+0.5)

代入 4.3 节公式后可以看到:稀有词的 IDF 更大;词频项随 f(qi,D) 增加逐渐饱和,极限趋近 k1+1;文档长度项负责抑制单纯靠长文本获得的优势。对一个固定 Query 和固定语料库,每个词项的贡献有限;但 Query 的词项数、语料规模、词项稀有度和业务 Boost 都可能变化,所以不存在可跨系统使用的“BM25 满分”。Lucene 默认参数为 k1=1.2、b=0.75,但项目仍应通过验证集调参,而不是把默认值当最优值。公式与默认值可核对 Lucene BM25Similarity API(访问日期:2026-08-22)。

BGE-M3 Dense 先取文本表示并做 L2 归一化:

q^=q‖q‖2,d^=d‖d‖2

官方示例再用矩阵乘法计算点积,因此:

sdense(q,d)=q^Td^=cos⁡(q,d)∈[−1,1]

这可以在 FlagEmbedding 的 BGE-M3 文档 和 BGE-M3 官方模型卡 中核对(访问日期:2026-08-22)。真实业务中的分数分布由 Query 类型、语料、模型版本和负样本难度决定,因此“超过 0.7 就相关”不是通用规则,阈值必须在本项目标注集上按 Precision、Recall、空召回率和成本共同校准。

另外,BGE-M3 还支持 Sparse 与 ColBERT 多向量模式。Sparse 分数可写为查询与文档重合词项权重乘积之和,通常非负但没有统一上限;Dense、Sparse、ColBERT 的加权混合分数也不再属于 [−1,1]。因此项目中的 BM25 与 BGE-M3 Dense 原始分数不能直接比较或相加,默认先用 RRF 做秩融合;只有经过同 Query 内归一化或跨 Query 校准并有标注集验证时,才学习分数权重。

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-*、Google gemini-embedding-*、Cohere embed-v4.0、Voyage voyage-4-* 属于托管 API,接入快,但要评估数据出域、费用、限流、版本与厂商锁定;
  • CLIP/SigLIP 或支持图文统一空间的托管模型适合图像、截图和 PDF 版面检索,不能和纯文本模型只按一个榜单名次比较。

事实边界| 下表依据各官方模型卡或官方文档在 2026-08-26 可见的能力整理。官方参数只证明它们是候选,不证明在 CSGO 中文问法、market_hash_name、Pattern/Phase、长文档和硬过滤条件下谁的真实 Recall、延迟与成本更好。

技术点 ID候选方案官方能力摘要优点代价与边界当前条件式结论
TP-R02BGE-M31024 维、8192 Token、100+ 语言;统一 Dense、Sparse、ColBERT Multi-Vector;MIT一套模型可做多路检索消融,自托管与中文/英文混合场景友好三种表示仍会增加索引、存储和检索成本;8192 Token 不取消切片;不是当前最新或必然最强当前首个自托管混合检索基线
TP-R02Qwen3-Embedding 0.6B/4B/8B32K、100+ 语言、指令感知、MRL 可变维度;最大维度依型号为 1024/2560/4096新一代质量候选,覆盖更长上下文、代码与跨语言检索,型号横跨效率到效果4B/8B 推理与部署成本明显更高;官方榜单不能代替项目基准质量优先对照组,先测 0.6B,再按收益评估大型号
TP-R02GTE Multilingual Base305M、768 维、8192 Token、70+ 语言;支持 Elastic Dense 与 Sparse向量更小,模型更轻,适合作效率和成本基线自定义代码、Sparse 路与版本集成需验证;项目术语质量未知效率优先对照组
TP-R02multilingual-E5-large-instruct0.6B、1024 维、多语言 Dense;Query 侧需要任务指令,长文本最多 512 Token成熟、容易建立纯 Dense 基线,指令可明确检索任务512 Token 截断,不统一提供 Sparse/ColBERT;漏加 Query 指令会掉质量纯 Dense 成熟基线
TP-R02托管 API:OpenAI/Gemini/Cohere/Voyage提供不同长度、维度、语言和模态的在线 Embedding;部分支持可变维度或图文输入无需自建推理服务,适合快速建立质量上界或多模态候选数据合规、网络、单价、限流、版本和重新建库风险需持续核对合规允许时选 1 个作外部质量基线,不默认替代自托管

BGE-M3 对当前设计的匹配点有五个:

  1. 中英混合: 中文知识问法与英文饰品名、技术名词可以进入同一模型;专有 ID 仍由 Keyword/BM25、词典和硬过滤兜底;
  2. 一套模型验证三种表示: 同一次模型推理可以产生 Dense、Sparse 与 ColBERT 表示,便于在统一语料上做单路与混合消融;但外部 BM25 与 BGE-M3 Sparse 是两条不同词法路径,不能混称;
  3. 较长输入: 8192 Token 为长段落和多语言文档保留空间,但 RAG 仍要按语义、引用粒度和 Token 预算切片;
  4. 自托管与可控版本: MIT 开源模型便于固定权重、预处理、归一化和索引版本,适合敏感数据不出域;代价是需要承担推理、容量、升级和监控;
  5. 现有链路一致: 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 与全库向量逐一计算距离,单次查询成本约为 O(Nd);当向量数量 N 和维度 d 增大时,延迟、吞吐和资源成本难以满足在线要求。ANN(Approximate Nearest Neighbor,近似最近邻)通过 HNSW 图、IVF 分桶等索引只访问更可能相近的一部分候选,用少量 Recall 损失换取更低延迟和更高吞吐。它不是无条件更准确,生产上必须用精确 KNN 作为基线评估 ANN Recall,再结合 P95/P99、吞吐和资源成本选参数。

直观上,精确 KNN 像让工作人员把 Query 背包与仓库里每一个背包逐个比较;ANN 会先按特征把候选组织成“相近街区”,查询时只进入最可能的几个街区。它减少了比较次数,但也可能因为走错入口而漏掉真正最近的候选。

例如有 100 万个 1024 维向量,一次精确点积扫描在量级上需要处理约 10.24 亿个维度乘加项;这个数字只是计算量示意,不等于真实延迟,因为实现还受 SIMD、GPU、内存带宽、量化和并发影响。ANN 的核心价值是避免每次查询都完整扫描全库:

  • HNSW 把向量组织成多层近邻图,从少量入口逐步走向更近的节点;
  • IVF 先把向量划入多个聚类桶,查询时只探测最相关的一部分桶;
  • 参数越激进,通常访问候选越多、Recall 越高,但延迟和资源也随之上升。

ANN 的质量不能用“返回结果看起来差不多”验收。固定同一份数据、过滤条件、距离度量和 Query 集后,以精确 KNN 的 TopK 为参照:

ANN Recall@K=|TopKexact∩TopKann|K

再同时记录 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 加权的三种位置 ​

  1. 检索融合权重: Sparse 与 Dense 的贡献;
  2. 业务排序权重: 权威性、新鲜度、地域等软信号;
  3. 多模态权重: 文本、图像、音频等不同向量空间的贡献。

最危险的写法是直接:

text
final = 0.5 * bm25_raw_score + 0.5 * cosine_score

BM25 分数通常无统一上界,余弦的范围和分布又由模型决定,原始分数尺度不同且会随 Query 漂移。更稳妥的起点:

  • 用 RRF 按名次融合,不依赖原始分数可比;
  • 或先在每路做可靠归一化/校准,再用验证集学习权重;
  • 业务 boost 应有上限,不能让热度压过基本相关性;
  • 权重必须分查询类型评测,不用一套 α 覆盖错误码、自然语言和版本查询。

RRF 常见形式:

RRF(d)=∑r∈Rwrc+rankr(d)

它稳健但会丢失分数幅度;若第一名和第二名原分数差距巨大,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 可见的能力说明整理,只证明能力候选,不证明在你的数据、规模、硬件和团队约束下谁更优。价格、托管区域、版本限制和性能必须发布前重新核对并实测。

候选定位与能力侧重优点代价/风险更适合不宜仅凭此选择
pgvectorPostgreSQL 扩展;精确检索、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
为什么不用 pgvectorpgvector 具备精确/ANN、Sparse Vector,并可与 PostgreSQL FTS 组合混合检索;只有共享数据库的 CPU、内存、I/O、扩容或发布边界不再满足 SLO 时,拆出 Milvus 才有依据相同数据和过滤条件下的 pgvector 基线、资源争用与容量结果;不能只说“Milvus 性能更高”
为什么不用 OpenSearch当核心是专业向量与多向量检索,而不是复杂 Analyzer、聚合和全文搜索平台时,Milvus 更贴近负载精确词查询占比、Analyzer 需求、混合检索质量与运维成本对比
为什么不用 QdrantQdrant 同样是可行的向量优先候选,不能靠功能清单直接排除;应比较团队经验、部署拓扑、过滤分布、资源和故障恢复同一基准、版本和硬件下的 PoC 结果;没有数据时只说“候选待验证”
Milvus 的边界是什么它保存可重建的检索投影,不承载价格、库存、订单、权限和发布状态等业务真值PostgreSQL/业务 API 与索引同步、撤权传播、重建和对账设计

简历证据边界: 当前仓库能确认的是 Milvus 已作为用户补充的项目设计口径,并有正式架构与实践文档;尚未看到可核验的运行集群、项目代码或受控压测结果。因此,在取得证据前应写“设计/选型使用 Milvus”或“基于 Milvus 构建检索方案”,不要写“生产稳定承载大规模向量”或虚构性能提升。若确有真实落地,应补齐 Collection Schema、索引参数、数据规模、查询 Trace、评测集、SLO、故障演练和本人负责范围。

高频追问:pgvector 也支持混合检索,为什么不用 ​

先承认事实,再比较架构边界,不能强行证明 Milvus 全面更强:

对比维度pgvector + PostgreSQL FTSMilvus选型含义
混合检索支持向量检索,并可与 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_versionAlias 只是发布机制,不能替代数据校验;只有真正实现重建、验收和回退流程时,才能称为工程亮点
中:部署形态与 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,00089.8 MiB2.8 MiB44.9 MiB
100,000390.6 MiB12.2 MiB195.3 MiB
300,0001.14 GiB36.6 MiB585.9 MiB
500,0001.91 GiB61.0 MiB976.6 MiB
1,000,0003.81 GiB122.1 MiB1.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:

  1. 质量:Exact KNN 对照下的 ANN Recall@20,以及混合检索的 MRR/NDCG、引用支持率;
  2. 过滤:无过滤、候选保留 10%、1% 时的 Recall 与 P95/P99;
  3. 系统:并发 1/10/50 下的吞吐、CPU、内存、磁盘和超时率;
  4. 更新:批量导入、增量 Upsert、删除可见性、索引构建时间和索引新鲜度;
  5. 恢复:重启、索引重载、备份恢复和重建耗时;
  6. 运维:部署组件数、监控、升级、故障定位和月度资源成本。

只有当 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-R01BM25/BM25F词频统计和字段权重成熟依赖分词,语义弱技术文档、专名纯语义问法词法默认基线
TP-R02精确 KNNRecall 可作为 ANN 基线全库成本高小库、离线校验大规模低延迟用于基线与抽样审计
TP-R02HNSW/IVF 等 ANN速度和规模更好牺牲部分 Recall、需调参生产大库不能容忍近似误差用精确检索测 ANN Recall
TP-R03RRF不依赖异构原始分数尺度丢分数幅度信息无可靠校准的多路检索需要精细概率解释稳健起点
TP-R03归一化/学习加权可利用分数与查询特征需标注集、校准和防漂移有充足评测数据无标注或尺度不稳证据充足再升级
TP-R04Bi-Encoder 相似度快,可预计算交互不足粗排最终细粒度排序不替代精排
TP-R04Cross-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 递进追问 ​

  1. 单位归一化后,L2、余弦和点积的排序关系是什么?
  2. 倒排索引与 BM25 分别负责什么?
  3. 为什么“语义相关”不等于“事实正确并能回答问题”?
  4. 为什么 BM25 原始分数不能和余弦分数直接加权?
  5. Cross-Encoder 为什么只能精排,不能补召回?
  6. 什么时候 pgvector 比专用向量库更合适,什么时候应拆分?
  7. 如何用精确 KNN 评估 ANN Recall 与参数取舍?
  8. 简历中为什么选择 Milvus,而不是 pgvector、OpenSearch 或 Qdrant?
  9. 向量数据库变慢时,为什么不能直接增加节点或调小 ef/nprobe?

12.3 一分钟面试复述版 ​

我把检索拆成硬过滤、两路粗排、融合、精排和上下文选择。BM25 基于倒排与词项统计,擅长错误码和精确术语;Dense 用向量空间补同义和意图召回,距离度量必须服从模型训练与归一化方式。两路原始分数尺度不同,我通常先用 RRF,再在有标注集时做校准加权;Cross-Encoder 只处理有限候选,提高前排相关性,但救不回漏召回。向量数据库选型要同时看规模、过滤、混合检索、事务、运维、合规和成本,小规模强事务场景可先验证 pgvector,专用引擎则要用相同数据和 SLO 压测。

参考资料 ​

简明总结 ​

一句话记忆: 粗排负责“别漏”,精排负责“排对”,硬过滤负责“不能错看”,数据库负责“高效执行”而不是替你决定答案。

  • 欧几里得、余弦和点积只有在明确归一化条件下才能讨论排序等价;精确 KNN 是质量基线,ANN 用可测量的 Recall 损失换取延迟、吞吐和规模收益;
  • 倒排索引找候选,BM25 排词法相关性,精确字段守住编号与版本;
  • Sparse 与 Dense 互补,语义相关不等于事实正确;
  • 多个 TopK 分属召回、融合、精排和上下文,必须分开记录与调优;
  • 向量库与关系库不是替代关系,选型取决于真实负载、事务、规模和团队边界。