从“找一样的”到“找像的”:稠密/稀疏向量、最近邻本质、为什么数据库做不了语义检索,以及完整链路。
向量检索(Vector Search / Similarity Search):把文字、图片、音频等内容编码成一串浮点数(向量 / embedding),然后通过"计算向量之间的距离/相似度"来找回语义上最接近的内容,而不是靠关键词精确匹配。
做向量检索前先要分清两种向量,它们是不同的技术路线:
| 维度 | 稠密向量(Dense) | 稀疏向量(Sparse) |
|---|---|---|
| 来源 | 神经网络模型(BGE / OpenAI / BERT)编码 | 词频统计 / 词项权重(BM25、SPLADE) |
| 维度 | 固定 384 / 768 / 1536 维,每维都有值 | 词汇表大小(几万~几十万),绝大多数是 0 |
| 可解释性 | 低,每个维度无明确含义 | 高,每个非零维度对应一个词项 |
| 擅长 | 语义相似、同义改写、跨语言 | 精确关键词、专有名词、罕见词 |
| 典型用法 | 语义搜索、RAG 召回 | 关键词检索;或做"混合检索"的另一路 |
把每条内容变成向量后,检索就退化成一个数学问题:给定查询向量 q,在 N 个候选向量里,找距离 q 最近的 k 个。这就是 k 近邻(k-NN)。
"距离"越小 = 越相似。常见距离/相似度见本系列《相似度度量》一篇。理论上 k-NN 可以暴力扫描所有候选求距离,但当 N 达到百万、亿级,且向量维度高达 768/1536 时,暴力扫描慢到不可接受——这正是后面 ANN(近似最近邻)要解决的。
WHERE title LIKE '%苹果%' 找的是包含"苹果"两字的行,找不到"iPhone""水果公司"这种语义相关但不含该词的内容。① 把原始内容用 Embedding 模型编码成向量;② 离线把所有向量建好索引(一次性成本);③ 查询时把 query 也编码,用索引快速找 top-k;④ 通常再接一个 Cross-Encoder 重排提升精度。RAG 就是这套流程 + 把召回文本喂给 LLM。