本文面向 RAG 开发者和 Milvus 初学者,用大白话讲透 768 维密集向量 + BM25 稀疏向量 的全索引类型,以及 4 种文档切片方法 的对比与选型。适合 10 万级数据、混合检索场景,让你看完就能直接抄作业。
一、Milvus 向量索引:一张表搞定选型
1. 先分清两大类
- 密集向量索引(dense_vector)
语义向量、Embedding、768/1024 维 ------ 日常 90% 的场景 - 稀疏向量索引(sparse_vector / BM25)
关键词、分词、全文检索 ------ 配合密集向量做混合检索
2. 密集向量索引(语义搜索必备)
| 索引类型 | 一句话原理 | 优点 | 缺点 | 适用场景 | 推荐距离 |
|---|---|---|---|---|---|
| HNSW 🔥 | 多层导航小世界图,近邻快速跳转 | 查询最快、召回最高、精度最好 | 内存大、建索引稍慢 | 10万~千万级、RAG、AI问答 | COSINE |
| IVF_FLAT | 先聚类分桶,再桶内检索 | 内存小、建索引快 | 召回一般、速度中等 | 低配机器、海量冷数据 | COSINE / L2 |
| IVF_PQ | 向量量化压缩,大幅瘦身 | 极度省内存 | 精度下降、召回变差 | 亿级归档、容忍精度损失 | COSINE / L2 |
| FLAT | 不建索引,全量暴力比对 | 100% 精准 | 极慢,数据一多就卡死 | 测试环境、几百条小数据 | 任意 |
💡 RAG 生产首选:HNSW + COSINE
3. 稀疏向量索引(BM25 专属)
-
SPARSE_INVERTED_INDEX
原理:倒排索引,关键词→文档映射
优点:关键词命中极快,短句、专有名词精准
使用方式:pythonindex_type = "SPARSE_INVERTED_INDEX" metric_type = "BM25"
4. 标量字段索引
- AUTOINDEX :Milvus 自动选择索引类型,用于
file_name、file_type、created_at等非向量字段的过滤。
5. 三大距离度量(与索引配套)
- COSINE:余弦相似度 ------ 语义向量、Embedding、RAG ✅ 最常用
- L2:欧氏距离 ------ 图像向量、特征数值
- IP:内积 ------ 归一化向量、特殊业务
6. 一键选型速记卡
| 你的场景 | 直接抄 |
|---|---|
| 本地开发 / RAG / 10万~百万数据 | HNSW + COSINE |
| 机器配置差、内存小 | IVF_FLAT + COSINE |
| 亿级海量归档 | IVF_PQ |
| 关键词 + 语义混合检索 | HNSW(密集) + SPARSE_INVERTED_INDEX(稀疏) |
| 仅测试、少量数据 | FLAT |
⚠️ 重要提醒:向量字段必须手动建索引 才能
load(),务必使用prepare_index_params()官方写法。
二、RAG 文档切片:四种方法对比与选择
1. 固定规则切片(Fixed Chunking)
- 怎么做:按固定字符数 / 单词数 / 段落 / 句子直接切割。
- 优点:实现简单,处理飞快,无需依赖。
- 缺点:可能切断语义(句子中间、段落中间)。
- 参数建议 :中文字符
chunk_size=200~500,可加overlap=20~50(10~25 字)。 - 适用:快速原型、教学演示。
2. 滑动窗口切片(Sliding Window)
- 怎么做:固定窗口大小 + 固定步长,相邻切片有重叠。
- 优点:保持上下文连续性,减少语义切断影响。
- 缺点:数据冗余(重叠部分重复存储),切片数量增多。
- 参数建议 (通用推荐):
- 小重叠(20%):省空间,适合粗略检索
- 中重叠(50%):平衡性能与精度,生产默认 ✅
- 大重叠(80%):极致保留上下文,适合精细检索
- 适用:大多数生产 RAG 场景,无 API 成本。
3. AI 辅助切片(AI‑Assisted Chunking)
- 怎么做:调用 LLM(如阿里云百炼、OpenAI)识别语义边界,智能切分。
- 优点:切片语义最完整,质量最高。
- 缺点:需要 API 调用,有成本,速度较慢,结果可能波动。
- 成本降低技巧:先用规则粗切(段落/章节),再用 LLM 精切。
- 适用:高质量 RAG、企业级知识库(有预算)。
4. 概要生成切片(Summary Chunking)
- 怎么做:为每个切片生成一句话摘要(可用 LLM 或规则提取)。
- 核心思想:检索时用摘要匹配,回答时用原文。
- 优点:摘要噪声小,检索精度高,尤其适合长文档。
- 缺点:需额外生成摘要,存储成本增加(原文+摘要)。
- 适用:长文档检索(单篇 >500 字),对召回质量要求高的场景。
5. 四种方法综合对比表
| 维度 | 固定规则 | 滑动窗口 | AI 辅助 | 概要生成 |
|---|---|---|---|---|
| 实现难度 | ⭐(极简) | ⭐⭐(简单) | ⭐⭐⭐(中等) | ⭐⭐⭐(中等) |
| 处理速度 | ⭐⭐⭐⭐(非常快) | ⭐⭐⭐(快) | ⭐⭐(慢,API) | ⭐⭐(慢,API) |
| 语义完整性 | ⭐⭐(较差) | ⭐⭐⭐(较好) | ⭐⭐⭐⭐(好) | ⭐⭐⭐⭐(好) |
| 检索精度 | ⭐⭐(一般) | ⭐⭐⭐(良好) | ⭐⭐⭐⭐(优秀) | ⭐⭐⭐⭐⭐(最佳) |
| 存储成本 | ⭐⭐⭐⭐(低) | ⭐⭐⭐(中,冗余) | ⭐⭐⭐⭐(低) | ⭐⭐(高,存摘要) |
| 需要 API | ❌ | ❌ | ✅ | ✅(摘要生成) |
| 适用文档 | 任意 | 任意 | 结构化较好 | 长文档(>500 字) |
6. 选择决策树(直接照着选)
你有 API 预算吗?
├─ 没有 → 用「滑动窗口」(window=500, step=250,重叠50%)
│
└─ 有 → 文档平均长度?
├─ <500 字 → 「AI 辅助切片」(语义边界切分)
└─ >500 字 → 检索精度要求?
├─ 高 → 「概要生成切片」(摘要检索 + 原文回答)
└─ 中 → 「AI 辅助切片」
7. 推荐配置(无脑抄作业)
-
通用配置(生产首选)
方法:滑动窗口
参数:
window_size=500,step_size=250(50% 重叠)理由:平衡性能、效果与成本,无 API 依赖。
-
高质量配置(有预算)
方法:AI 辅助 + 概要生成混合
步骤:段落粗切 → LLM 精切 → 生成摘要 → 混合检索(摘要权重 0.6,原文权重 0.4)
适用:企业客服、法律/医疗文档检索。
-
快速原型配置
方法:固定字符切片
参数:
chunk_size=300适用:验证 RAG 想法、Demo 演示。
三、踩坑经验总结
-
Milvus 索引必须手动建
只写字段定义不行,必须调用
prepare_index_params()并create_index(),否则load()会报错。 -
混合检索需要分开建索引
密集向量、稀疏向量、标量字段要分别创建索引,不能混在一起。
-
切片质量决定检索上限
无论用什么向量数据库或 LLM,如果文档切得稀烂,召回就不可能好。建议从滑动窗口(重叠 50%)起步,再根据 bad case 调优。
-
不要在生产环境用 FLAT
FLAT 只适用于测试或 <1000 条数据,数据量一上去就是灾难。
四、写在最后
本文覆盖了 Milvus 中 768 维密集向量 + BM25 稀疏向量 的全索引选型,以及 RAG 系统中 4 种主流文档切片方法 的对比与选型。无论你是刚入门的 RAG 开发者,还是正在优化生产环境的工程师,希望这些"大白话 + 速记卡"能帮你快速落地。
🎯 一句话记住:
HNSW 跑语义,SPARSE_INVERTED 做关键词,滑动窗口是切片默认,想更准就用 AI 或摘要。
如果你对 混合检索的具体代码 或 不同切片方法对召回率的影响 感兴趣,欢迎在评论区留言,我会继续更新实战对比数据。
📌 本文原创,转载请注明出处。
如果觉得有用,点个 赞 或 收藏 支持一下~