🧬 向量化与检索
Embedding 原理 · 向量数据库 · 混合检索 · 重排序
1. 什么是 Embedding(向量化)?
Embedding:把文本转换成一串数字(向量,如 1024 维),使语义相近的文本向量也相近——"学校创建于 1952 年"和"建校时间是 1952"的向量距离很近。
相似度计算:余弦相似度(cosine)、内积、欧氏距离。向量夹角越小越相似。
- 优势:能理解语义(同义词、口语化表达),关键词检索做不到
- 局限:精确匹配弱——对数字、编号、专有名词不敏感(如"实验楼 B 区 302"、"学号 20230101"、产品型号这类字符串,向量往往分不清;而字面高度相似的"张伟教授"与"张伟"反而可能被向量判得很近)
Embedding API 调用
from openai import OpenAI
client = OpenAI()
resp = client.embeddings.create(
model="text-embedding-3-small",
input=["校史馆建于 1998 年", "学校创建于 1952 年"]
)
vec1, vec2 = resp.data[0].embedding, resp.data[1].embedding
# 中文也可用开源模型:BAAI/bge-small-zh、moka-ai/m3e
🎯 面试要点
- Embedding 模型选择:中文场景用中文模型(bge/m3e)通常比通用模型好
- 向量维度与精度:维度高信息多但存储/计算贵,100~1536 维常见
- 建库和查询必须用同一个 Embedding 模型(不同模型向量空间不兼容)
2. 向量数据库怎么选?
| 方案 | 特点 | 适合 |
|---|---|---|
| FAISS | Meta 开源库,内存索引,极快,无服务 | 单机/原型/百万级以内 |
| Milvus | 分布式向量库,亿级,云原生 | 生产大规模 |
| pgvector | PostgreSQL 扩展,向量+关系数据同库 | 已有 PG、中小规模 |
| Elasticsearch | kNN 检索 + 关键词检索天然混合 | 需要混合检索、已有 ES |
| Qdrant/Weaviate | 专业向量库,Rust/Go 实现 | 中等规模独立部署 |
🎯 面试要点
- 选型看三点:数据量、是否需要混合检索、是否已有一套数据库
- 中小项目最省事组合:pgvector(或 ES)+ 现成编排框架
- HNSW(图索引)是主流近似最近邻算法——能说出索引类型是加分项
3. 为什么需要混合检索?怎么做?
纯向量检索的短板:
- 精确名词/编号检索弱:"实验楼 B 区 302"、"学号 20230101"——向量搜不准
- 短查询效果差("学费"这种一个词)
- 同义词污染:向量只认语义,不认精确表达
混合检索 = 向量检索(语义)+ 关键词检索(精确)并行,再融合结果:
- 关键词:BM25(TF-IDF 升级版)或 ES 全文检索
- 融合:两种做法——加权求和(给两路分数各配权重,需要调参)或 RRF 倒数排名融合(只用排名不用分数,因此不需要调权重)
RRF 融合示例
# 向量检索排名 [docA, docB, docC],关键词排名 [docC, docB, docE]
# RRF: score(doc) = Σ 1 / (k + rank),k=60 常数
# docA: 1/(60+1) = 0.016393
# docB: 1/(60+2) + 1/(60+2) = 0.032258 (两榜都第 2)
# docC: 1/(60+3) + 1/(60+1) = 0.032266 (一榜第 1、一榜第 3)→ 最高
# docE: 1/(60+3) = 0.015873
# 结论:docC 险胜 docB。RRF 只看排名——「一个榜第 1 + 另一个榜第 3」
# 可以压过「两个榜都第 2」,这正是倒数排名的特点
# 工程上:分别取 Top10,融合后取 Top3~5 进提示词
🎯 面试要点
- 混合检索是"语义 + 精确"双保险,能明显提升命中率——高级面试加分点
- RRF 不需要调权重参数,比加权求和省心
4. 重排序(Rerank)解决什么问题?
问题:向量检索的"粗排"结果可能顺序不佳——最相关的片段没排第一,甚至混入无关片段。直接全塞给 LLM 会污染答案。
Rerank:用专门的重排序模型对"问题 + 每个候选片段"打分(交叉编码器,比向量相似度更精细),重排后取 Top-K。
- 流程:粗检索 Top 20~50 → Rerank 精排 → Top 3~5 进提示词
- 模型:bge-reranker、Cohere Rerank、混合通用
- 代价:多一步推理(候选多时耗时增加)——通常值得
🎯 面试要点
- 检索管线三层:过滤(元数据)→ 粗排(向量+关键词)→ 精排(Rerank)
- 回答质量差时先查检索:把"检索到的片段"打出来人工看,多半是检索问题不是模型问题