01 Milvus-向量数据库基础

发布时间:2026/6/10 13:38:43

01 Milvus-向量数据库基础 「milvus-course-ai.zip」链接https://pan.quark.cn/s/00f3d411bb6dgithubhttps://github.com/yuanmomoya/milvus学习目标学完本章后你应该能够解释向量、Embedding、向量维度和向量空间。区分余弦相似度、内积和 L2 距离。理解为什么海量向量检索不能只靠暴力扫描。说清 ANN、HNSW、IVF、PQ 的基本思想。用 Recall、QPS、Latency、内存成本评价一个向量检索系统。理论知识形象化理解可以把向量数据库想象成一座按照“语义气味”摆放物品的巨大仓库。传统数据库像货架编号系统你必须知道商品编号、名称或分类才能找到它向量数据库则像给每个物品都贴上一个高维坐标意思相近的物品会自然靠在一起。用户问“怎么做知识库问答”时系统不是逐字找“知识库”三个字而是在语义空间里寻找气味最接近的一批内容。Embedding 模型就是这座仓库的“坐标测量仪”。同一套测量仪必须同时用于入库和查询否则坐标系会错位。余弦相似度像比较两个箭头的朝向L2 距离像比较两个地点的直线距离ANN 索引像在仓库里修快速通道不逐个货架查看而是先冲到最可能的区域再精细挑选 TopK。理解这一章时要记住一句话向量检索不是魔法而是“表示学习 距离计算 索引加速”的组合。召回、延迟和成本永远互相牵制工程师的任务就是在业务能接受的范围内找到平衡点。核心概念向量数据库保存的不是“文本本身有多像”而是模型把文本、图片、音频或视频映射到向量空间后的坐标。相似对象在向量空间里距离更近检索就是在这个空间中寻找离查询向量最近的 TopK。原始文本/图片/音频Embedding 模型高维向量Milvus Collection用户查询同一个 Embedding 模型查询向量相似度搜索 TopK向量是什么向量可以理解为一组浮点数例如[0.12, -0.03, 0.88, ...]。Embedding 模型负责让这些数字带有语义语义相近的内容在向量空间中更接近。常见中文文本模型如BAAI/bge-small-zh-v1.5输出 512 维向量CLIP 图片/文本模型常见输出 512 维向量。维度不是越高越好。维度升高通常会带来更强表达能力但也会增加存储、内存带宽、索引构建和搜索计算成本。粗略估算1,000,000条768维float32向量仅原始向量就需要1_000_000 * 768 * 4 ≈ 2.86GB还不包含索引和元数据。相似度度量度量直觉适用场景注意事项COSINE看方向是否相近文本语义检索常用通常要求向量归一化或模型天然适配IP内积越大越相似推荐、归一化向量检索未归一化时会受向量长度影响L2欧式距离越小越相似图像特征、传统特征与 COSINE 结果可能完全不同importnumpyasnpdefcosine(a:np.ndarray,b:np.ndarray)-float:# 余弦相似度越接近 1 越相似returnfloat(np.dot(a,b)/(np.linalg.norm(a)*np.linalg.norm(b)))defl2(a:np.ndarray,b:np.ndarray)-float:# L2 距离越接近 0 越相似returnfloat(np.linalg.norm(a-b))暴力检索 vs ANN暴力检索会计算查询向量与全部向量的距离准确但成本线性增长。ANN 是近似最近邻搜索用可控的召回损失换取数量级的性能提升。查询向量检索方式暴力检索 FLAT扫描全部向量高召回成本高ANN只访问候选子集召回略降速度显著提升HNSW 直觉HNSW 是图索引。每个向量是一个节点相似向量之间有边。搜索从高层稀疏图快速接近目标区域再到底层密集图精细搜索。底层密集邻接图ABCDEFG中层区域道路ABDFG高层稀疏高速公路ADGHNSW 常用参数参数作用增大后的影响M每个节点的邻居数量上限召回更好内存更高构建更慢efConstruction构建索引时的候选集索引质量更好构建更慢ef搜索时的候选集召回更好延迟更高IVF 直觉IVF 先把向量空间聚成多个簇搜索时只访问与查询最接近的若干簇。全部向量KMeans 训练中心倒排列表 nlist查询向量选择 nprobe 个最近中心只扫描被选中的列表TopKnlist决定分桶数量nprobe决定搜索多少个桶。nprobe太小会漏召回太大会接近暴力扫描。PQ 直觉PQ 把高维向量切成多个子空间每个子空间用码本近似表达。它的核心价值是压缩内存但会引入量化误差。768 维 float32 向量切成 m 个子向量每段查码本保存短编码低内存近似距离计算指标体系指标含义优化方向RecallK真正相关结果被 TopK 找回的比例增大 ef/nprobe优化 Embedding使用 RerankQPS每秒请求数减小候选集、水平扩展、减少输出字段Latency单次请求耗时关注 P50/P95/P99不只看平均值Build Time索引构建耗时调整索引类型、并行度、Segment 尺寸Memory内存占用量化、mmap、冷热分层、减少副本完整代码本章配套代码见../demos/basic-search。它会使用sentence-transformers生成中文文本向量。创建 Milvus Collection。建立 HNSW 索引。写入示例文本。执行 TopK 语义检索。cdmilvus-master-course ./scripts/start.shcddemos/basic-searchcp.env.example .env python main.py常见错误错误原因修复COSINE 结果不稳定模型输出未归一化或 metric 选错统一 Embedding 模型和 metric维度不匹配Collection dim 与模型 dim 不一致删除重建 Collection 或固定模型版本召回差Chunk 太大/太小、模型不适合中文、ef/nprobe 太低做离线标注集评测延迟高TopK 大、候选集大、输出字段多控制参数并压测 P95/P99面试题为什么向量数据库需要 ANNCOSINE、IP、L2 的差异是什么HNSW 为什么通常内存占用较高IVF 的nlist和nprobe如何影响召回和延迟PQ 为什么能降成本又为什么会损失精度练习题用demos/basic-search把 HNSW 的ef从 16、64、128 分别跑一次记录结果变化。把模型换成另一个中文 Embedding 模型观察维度变化和检索结果变化。自己构造 20 条容易混淆的文本手工评估 Recall3。小结向量数据库的本质是“在高维空间中快速找相似对象”。所有工程决策都围绕四个变量展开召回、延迟、吞吐、成本。后续章节会把这些变量落到 Milvus 的 Schema、索引、查询参数和生产架构中。

相关新闻