第 2 课:向量数据库到底在解决什么问题
RAG 课程 · 02 |目标:说清 ANN 的必要性|用时:20 分钟
从“向量是什么”走到“为什么不能每次都和全部数据逐个比较”。
核心直觉
Embedding 把“语义相近”变成“空间位置相近”。向量数据库要做的,是在这个空间里快速找到离查询最近的点。
从文本到点
假设 embedding 模型把每段文本映射成一个 d 维向量:
“如何申请年假?” → [0.12, -0.31, 0.44, ...]
“年假审批流程” → [0.10, -0.28, 0.47, ...]向量的每一维不必被人直接解释;它们共同构成一个可比较的表示。常见距离包括 cosine similarity、dot product 和 Euclidean distance。具体使用哪一种,必须和 embedding 模型的训练与归一化约定一致。
精确搜索为什么不够
最直接的办法是把查询向量与 N 个向量逐个计算距离,再取最小的 k 个。这是 exact nearest neighbor,结果准确,但查询成本会随 N 增长。
当库里有百万甚至十亿条向量时,系统通常采用 ANN(Approximate Nearest Neighbor):允许极少量候选不是全局最优,以换取更低的延迟和更可控的资源消耗。这里的关键不是“近似一定更好”,而是用可接受的召回损失换取吞吐和延迟。
向量搜索的决策链
- **表示:**选择 embedding 和维度。
- **度量:**选择 cosine、dot 或 L2。
- **索引:**选择 FLAT、IVF、HNSW 等。
- **搜索:**返回 top-k 候选。
索引取舍怎么想
- **FLAT:**接近精确搜索,适合小数据集或作为评测基线。
- **HNSW:**通过多层图导航减少搜索路径,通常以更多内存换较好的查询表现。
- **IVF:**先把空间分成若干簇,只搜索部分簇;探查的簇越多,通常召回越高但延迟也越高。
工程上不要凭产品默认值判断索引好坏。固定一批查询,比较同一数据集下的 Recall@k、p95 延迟、内存和写入/更新成本,再选参数。
自测
练习 1:ANN 相比 exact search 的主要交换是什么?
A. 增加维度
B. 减少语义
C. 牺牲精度
D. 删除元数据
答案:C。ANN 以可控的近似误差换取更低延迟和更好的规模表现。
练习 2:评估 ANN 索引时,哪组数据最有用?
A. 颜色字号
B. 文档总数
C. 模型名称
D. 召回延迟
答案:D。实际评估应同时观察 Recall@k、p95 延迟、内存和更新成本;四个选项中“召回延迟”最接近有效工程指标。
把判断写下来
假设你有 5000 条内部文档、查询量很低、结果必须尽量准确。你会先选 FLAT 还是 HNSW?请用“数据规模 + 目标指标 + 资源约束”写出三句话理由。
完成后把答案和第 1 课的请求链一起发给我。下一课将把这些原理落到 chunking、embedding 和 metadata 数据建模上。
主读材料
HNSW 原始论文。重点看摘要和图搜索直觉;想进一步比较索引,再看 Milvus 官方索引说明。
上一步与速查
有任何不清楚的地方,直接向老师提问。