本文是 refine-rag 系列教程的第八篇,我们来学习向量存储的核心技术和 Milvus 数据库的使用。
本文所有代码都在:https://github.com/zonezoen/refine-rag
往期系列文章
- 007:RAG 入门-向量嵌入与检索
- 006:RAG 入门-面试官问你,RAG 为什么要切块?
- 005:RAG 入门-LangChain读取表格数据
目录
- 前言
- 为什么传统数据库搞不定向量搜索?
- 向量数据库横向对比
- 为什么选择 Milvus?
- 快速搭建 Milvus
- Milvus 核心概念
- 实战示例
- 学习路径
前言
前面我们学习了向量嵌入与检索,知道如何把文本转成向量、如何计算相似度。但有个问题:这些向量存在哪里?
如果只有几千条数据,存在内存里就够了。但如果有几百万、几千万条数据呢?这时候就需要专业的向量数据库。
向量数据库就像是为向量量身定制的"仓库管理系统",它不仅能存储海量向量,还能快速检索、高效管理。
为什么传统数据库搞不定向量搜索?
上一篇文章提到,向量本质上是一个浮点数数组,是机器理解文本语义的方式。
你可能会想:既然向量就是数组,那我存进 MySQL 的 JSON 字段或者直接存在内存 List 里不行吗?
答案是:小规模可以,大规模必死。
当你的知识库达到万级、百万级甚至亿级时,你会面临:
- 检索效率塌方(计算量过大):
传统数据库查找数据是“相等判断”,而向量搜索需要计算空间距离。如果你有 100 万条数据,每搜一次都要全表扫一遍并计算相似度O(n) 复杂,查询一次可能要几秒甚至几分钟。向量数据库通过 ANN(近似最近邻)算法(如 HNSW),将搜索效率提升到了毫秒级O(log n) 复杂度。
- 维度灾难(内存压力):
一个 1536 维的向量(OpenAI 标准)看起来不大,但几百万条叠在一起,会瞬间撑爆普通的服务器内存。向量数据库专门优化了数据的压缩与加载策略。
- 工程化缺失:
向量数据库不仅仅是“存数据”,它还提供了成熟的 CRUD、多租户隔离、数据备份和水平扩展(Scale-out)能力,这些是简单的内存库(如 FAISS)难以胜任的。
核心对比:传统数据库 vs 向量数据库
传统数据库查找的是精准的数据,而向量数据库则更适合模糊搜索。
- 传统数据库 (MySQL):
- 你问:“有没有编号为 1024 的商品?”他秒回。
- 你问:“有没有长得像苹果的手机?”他直接罢工”。
- 向量数据库 (Milvus):
- 他会把所有数据转化为空间坐标,告诉你:“虽然我没找到完全一样的,但有几个神似的数据。”
代码层面的直观感受
传统数据库(MySQL):侧重“准”- -- 精确查询:差一个字都搜不到
- SELECT * FROM products WHERE category = '手机' AND brand = '苹果';
- -- 范围查询:基于确定的数值边界
- SELECT * FROM products WHERE price BETWEEN 5000 AND 8000;
复制代码
- 特点:擅长精确匹配,基于 B-Tree 索引,查询条件极其明确(非黑即白)。
向量数据库(Milvus):侧重“像”- # 相似度查询:基于“语义距离”
- results = client.search(
- collection_name="products",
- data=[query_vector], # 搜索“长得像苹果的手机”对应的向量
- limit=10
- )
复制代码
- 特点:擅长模糊搜索,基于向量索引(HNSW、IVF),返回的是 Top-K 个“最相似”的候选者。
向量数据库横向对比
目前主流的向量数据库有很多,我们来对比一下:
主流向量数据库对比
数据库类型开源部署方式性能生态推荐度Milvus专业向量库是本地/云5/55/55/5Qdrant专业向量库是本地/云4/54/54/5Weaviate专业向量库是本地/云4/54/54/5Pinecone云服务否仅云5/54/53/5Chroma轻量级是本地3/53/53/5FAISS库(非数据库)是本地5/53/53/5pgvectorPostgreSQL 插件是本地/云3/54/53/5详细对比
1. Milvus
优点:
- 性能强大,支持亿级向量
- 索引算法丰富(HNSW、IVF、DiskANN)
- 支持混合检索(向量 + 标量过滤)
- 云原生架构,易扩展
- 社区活跃,文档完善
- 国内团队开发,中文支持好
缺点:
- 部署稍复杂(需要 etcd、MinIO)
- 资源占用较高
适用场景:
- 生产环境
- 大规模数据(建议百万级以上使用)
- 需要高性能和稳定性
2. Qdrant
优点:
- Rust 编写,性能优秀
- 部署简单(单二进制文件)
- API 设计优雅
- 支持 payload 过滤
缺点:
- 社区相对较小
- 中文文档较少
- 大规模数据性能不如 Milvus
适用场景:
3. Weaviate
优点:
- 内置 GraphQL API
- 支持多模态搜索
- 自带向量化模块
- 语义搜索能力强
缺点:
适用场景:
4. Pinecone
优点:
缺点:
- 闭源,不可自部署
- 费用较高
- 数据在国外(延迟问题)
适用场景:
5. Chroma
优点:
- 极简设计,易上手
- 轻量级,适合开发
- 与 LangChain 集成好
缺点:
适用场景:
<ul>学习和原型开发
小规模应用( |