KEEL · 龙骨 · A CURRICULUM FOR THE AI ERA
向量数据库工程课 · 课程导读 — keel 龙骨
向量数据库工程课:从暴力检索到 Milvus 的参考信息:向量数据库工程课 · 课程导读
你现在的起点
- 用过向量检索(pgvector、Milvus、faiss 或某个托管服务),能把向量存进去、搜出来;
- 知道要用余弦相似度,但说不清它和内积、L2 的区别,也没验证过归一化到底改变什么;
- 遇到过「召回不准」「加了索引反而慢」「带过滤就查不到东西」,靠调参和换库解决,没弄清根因。
如果你符合这三条,这门课就是为你写的。它不从「什么是向量」讲起——它讲你调参时那些数字背后的机制。
一条能走通的学习路径
精确检索的账(先算清 Flat 的延迟/内存,才有比较的基线)
→ 向量、距离与度量(L2 / 内积 / 余弦,以及归一化的真实影响)
→ 索引家族(IVF / IVFPQ / HNSW / DiskANN 的结构与失效场景)
→ 召回率-延迟曲线(nlist/nprobe/efSearch/M 怎么调,验收线怎么定)
→ Milvus 架构与一致性(四层架构、etcd/MinIO/消息队列、一致性级别的代价)
→ 过滤与混合检索(下推 vs 后过滤、partition key、标量+向量)
→ 选型与运维(pgvector / Milvus / faiss 选谁,容量估算与重建时机)
七章共用同一批数据:固定种子生成的 10 万条 128 维随机向量。第 00 章把它当作「精确检索的成本基线」,之后的每一章都在同一批数据上换索引、换参数、换度量,把同一个问题的不同答案并排放。
章节地图
| 章 | 关键问题 | 你会亲手验证什么 |
|---|---|---|
| 00 从暴力检索到 ANN | 精确检索的延迟/内存账怎么算,ANN 用哪部分准确率换了什么 | 10 万×128 的 Flat 单条延迟与 QPS,以及它到 100 万条时的外推 |
| 01 向量、距离与度量 | L2 / 内积 / 余弦的关系与陷阱,归一化改变什么 | 同一批数据三种度量 top-10 重合度,以及归一化后 L2 与余弦的排序是否一致 |
| 02 索引家族 | IVF / IVFPQ / HNSW / DiskANN 的结构、参数含义与失效场景 | IVF 训练-分桶-探测的实际数据分布,以及 HNSW 图的额外内存 |
| 03 召回率-延迟曲线 | nlist/nprobe/efSearch/M 怎么调,验收线怎么定 | 三组 nlist × 四个 nprobe 的完整 recall@10 / QPS 表,HNSW 的 efSearch 曲线 |
| 04 Milvus 架构与一致性 | 四层架构与 etcd/MinIO/消息队列的依赖,一致性级别的代价 | 官方文档规定的写读路径与一致性级别(本机未跑 Milvus,实验结论与文档分开陈述) |
| 05 过滤与混合检索 | 过滤为什么必须下推,partition key 怎么用 | faiss 下推 vs 后过滤在 1% 选择率下的召回,pgvector 带 WHERE 的执行计划 |
| 06 选型与运维 | pgvector / Milvus / faiss 该选谁,容量与成本怎么算 | 三种索引的建索引耗时、落盘大小与内存换算,重建时机 |
学完能做什么
- 拿到一个向量检索需求,能先算清数据量、维度和过滤比例,再判断该用精确检索还是 ANN、该选哪个索引家族;
- 拿到一条「召回不准」的投诉,能区分是度量选错了、nprobe 太小、还是过滤没下推,并给出下一步要看的指标;
- 拿到一份容量与成本估算,能判断是需要更多内存、更多副本、还是干脆换一类索引;
- 评审 AI 生成的向量检索代码时,能看出它把度量、索引参数、过滤顺序写错在哪里。
和相邻课程的分工
这门课和几门课都沾「检索」,边界必须说清:
- 记忆系统的 07 章 · 相关内容怎样被检索并放进上下文 讲的是检索语义:有哪几种检索信号(元数据、关键词、语义)、结果按什么顺序重排、怎么截断后塞进 prompt。它关心「搜出来的东西该不该进上下文」。本课讲它下面一层——存储与索引引擎:向量怎么存、索引什么结构、一次 search 在引擎里怎么走、召回率和延迟怎么权衡。那章里「Embedding 是索引不是记忆」的判断,正是本课要展开的引擎细节。
- 数据库与缓存调优 给的是通用方法论(慢查询定位、执行计划、连接池、缓存),示例以 MySQL/InnoDB 为主。本课第 05、06 章会用到
EXPLAIN ANALYZE,但对象是 pgvector 的向量索引,不是 B-tree 索引。 - PostgreSQL 工程课 讲存储引擎与运行时(MVCC、VACUUM、WAL、planner)。本课第 05 章在同一个 PostgreSQL 实例上调 pgvector,遇到的计划退化(用不用向量索引、退不退化到顺序扫描)是它的
04 索引与执行计划在向量场景的延续。
一句话:那三课解决「检索/数据库怎么用对」,本课解决「向量索引引擎怎么选、怎么调、代价是什么」。
前置要求
- 会 Python,能看懂 numpy 基本操作(本课实验脚本用 numpy 造数据、用 faiss 建索引);
- 知道向量、点积、范数是什么意思,会读
EXPLAIN ANALYZE的输出更好(第 05 章会用到,不熟也能跟上); - 建议先读记忆系统 07 章,建立「元数据过滤 → 相似度 → 重排 → Top-k」的检索心智模型;本课第 05 章的过滤下推就是把它落到索引层。
本课实验依赖 faiss-cpu 与 pgvector,原始输出留档,正文引用的每个数字都能在实验记录里对上。