008-01:RAG 入门-向量存储与企业级向量数据库 milvus
本文是 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=,# 搜索“长得像苹果的手机”对应的向量
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
适用场景:
[*]中小规模项目
[*]快速原型开发
[*]喜欢 Rust 生态
3. Weaviate
优点:
[*]内置 GraphQL API
[*]支持多模态搜索
[*]自带向量化模块
[*]语义搜索能力强
缺点:
[*]学习曲线陡峭
[*]资源占用高
[*]配置复杂
适用场景:
[*]知识图谱应用
[*]多模态搜索
[*]需要 GraphQL
4. Pinecone
优点:
[*]完全托管,无需运维
[*]性能优秀
[*]易用性好
缺点:
[*]闭源,不可自部署
[*]费用较高
[*]数据在国外(延迟问题)
适用场景:
[*]不想自己运维
[*]预算充足
[*]海外用户
5. Chroma
优点:
[*]极简设计,易上手
[*]轻量级,适合开发
[*]与 LangChain 集成好
缺点:
[*]性能一般
[*]不适合大规模生产
[*]功能相对简单
适用场景:
<ul>学习和原型开发
小规模应用(
页:
[1]