向量数据库实战(Milvus/Chroma)
从 Embedding 的第一个维度到 RAG 系统的最后一公里——手把手带你玩转向量数据库。
1. 为什么你需要向量数据库
你可能已经在用 PostgreSQL 存用户数据,用 Redis 做缓存,用 Elasticsearch 做全文检索——这些数据库各有分工,运行得很好。
那为什么 AI 时代突然冒出一个新品类叫"向量数据库"?它解决了什么传统数据库解决不了的问题?
这一章,我们从一个真实场景出发,搞清楚向量数据库存在的根本原因。
1.1 一个真实场景:关键词搜索的困境
假设你在做一个技术文档问答系统,用户问了这样一个问题:
用户提问:"怎么让 Python 程序跑得更快?"
你的文档库里有这些内容:
┌─────────────────────────────────────────────────────────┐
│ 文档 A:《Python 性能优化指南》 │
│ → 讲 Cython、多进程、JIT 编译 │
│ → 全文没出现"跑得更快"这四个字 │
│ │
│ 文档 B:《Python 3.12 新特性》 │
│ → 提到"解释器性能提升 5%" │
│ → 包含"更快"这个关键词 │
│ │
│ 文档 C:《asyncio 并发编程》 │
│ → 讲异步 I/O,能大幅提升 I/O 密集型程序的吞吐量 │
│ → 全文没出现"快"字 │
└─────────────────────────────────────────────────────────┘如果用传统的关键词搜索(比如 SQL 的 LIKE '%更快%' 或 Elasticsearch 的全文检索):
关键词搜索的结果:
"怎么让 Python 程序跑得更快?"
│
├── ✅ 命中 文档 B ← 包含"更快"关键词,但内容最不相关
├── ❌ 漏掉 文档 A ← 最相关的文档,但没有匹配的关键词
└── ❌ 漏掉 文档 C ← 高度相关,但措辞完全不同
问题出在哪?
→ 关键词搜索做的是「字面匹配」
→ 用户说"跑得更快",它只会找包含这几个字的文档
→ 它不懂"性能优化" ≈ "跑得更快" ≈ "提升吞吐量"这就是关键词搜索的根本局限——它不理解语义。
核心矛盾:用户用自然语言提问,但传统搜索只会做字符串匹配。用户说的和文档写的,经常是"意思相同、措辞不同"。
语义搜索是怎么做的
向量数据库的解法完全不同——它不看文字本身,而是看文字背后的语义:
语义搜索的工作方式:
Step 1:把文档变成向量(数字)
─────────────────────────────────────────
文档 A:"Python 性能优化指南" → [0.82, 0.15, 0.93, ...]
文档 B:"Python 3.12 新特性" → [0.41, 0.67, 0.23, ...]
文档 C:"asyncio 并发编程" → [0.78, 0.22, 0.88, ...]
Step 2:把用户问题也变成向量
─────────────────────────────────────────
"怎么让 Python 程序跑得更快?" → [0.80, 0.18, 0.91, ...]
Step 3:计算向量之间的距离
─────────────────────────────────────────
距离越近 = 语义越相似
用户问题 ←→ 文档 A:距离 0.05 ← 🎯 最相似!
用户问题 ←→ 文档 C:距离 0.12 ← 也很相关
用户问题 ←→ 文档 B:距离 0.58 ← 不太相关
结果:文档 A 排第一,文档 C 排第二
→ 这才是用户真正需要的答案顺序关键洞察:向量数据库不做字符串匹配——它把文本转换成高维空间中的点,然后通过计算点与点之间的距离来判断"语义是否相近"。意思相近的文本,在向量空间中天然靠在一起。
1.2 什么是向量?什么是向量数据库?
先拆解两个概念。
向量:语义的数字指纹
在数学上,向量就是一组有序的数字。在 AI 语境下,向量是一段内容的语义指纹:
一个文本向量长什么样:
"Python 性能优化" → [0.82, 0.15, 0.93, -0.41, 0.67, ..., 0.23]
↑ ↑
第 1 维 第 1536 维
维度数量取决于 Embedding 模型:
• OpenAI text-embedding-3-small → 1536 维
• BGE-large-zh → 1024 维
• Sentence-Transformers all-MiniLM → 384 维
每一维代表什么?
→ 没有人类可读的含义
→ 但整体组合起来,编码了文本的语义信息
→ 类比:RGB (255, 128, 0) 单看每个数字没意义,
但组合在一起就是「橙色」关键性质:语义相近的文本,向量也相近。
向量空间中的语义聚类(简化为 2D 示意):
▲ 维度 2
│
"异步编程" │ "性能优化"
● │ ● "加速运行"
│ ●
│
──────────────────┼──────────────────▶ 维度 1
│
"机器学习" │
● │
"深度学习" ● │ "做蛋糕"
│ ●
│
→ "性能优化"和"加速运行"紧贴在一起(语义相近)
→ "机器学习"和"深度学习"也靠在一起
→ "做蛋糕"离其他编程话题很远向量数据库 vs 传统数据库
理解了向量,向量数据库就好解释了——它是专门用来存储和搜索向量的数据库:
传统数据库 vs 向量数据库:
┌─────────────────────┬───────────────────────────┐
│ PostgreSQL │ Milvus / Chroma │
│ (传统关系型) │ (向量数据库) │
├─────────────────────┼───────────────────────────┤
│ 存什么:行和列 │ 存什么:向量 + 元数据 │
│ 查什么:精确条件 │ 查什么:最相似的 K 个 │
│ 怎么查:WHERE x = 1 │ 怎么查:距离最近的 Top-K │
│ 索引:B-Tree / Hash │ 索引:HNSW / IVF / DiskANN│
│ 典型查询: │ 典型查询: │
│ SELECT * FROM users │ 找出和这段话最像的 │
│ WHERE age > 18 │ 5 篇文档 │
└─────────────────────┴───────────────────────────┘一句话总结:传统数据库回答"精确等于什么"的问题,向量数据库回答"最像什么"的问题。
向量数据库的核心能力
| 能力 | 说明 | 类比 |
|---|---|---|
| 向量存储 | 高效存储百万/亿级高维向量 | 图书馆的书架 |
| 相似度搜索 | 毫秒级找到最相近的 K 个向量 | 图书管理员帮你找相关书籍 |
| 元数据过滤 | 搜索时附加条件(如类别、时间) | "只在计算机区找" |
| 索引管理 | 多种索引算法,平衡速度与精度 | 不同的图书分类体系 |
| 标量存储 | 向量旁边存原始文本、来源等信息 | 书签上的备注 |
1.3 向量数据库在 AI 应用中的位置
向量数据库不是独立存在的——它是 AI 应用架构中的核心基础设施层。
RAG:向量数据库最典型的使用场景
目前向量数据库最主流的用法是 RAG(Retrieval-Augmented Generation,检索增强生成)。一句话解释:先从知识库中搜出相关内容,再喂给 LLM 生成答案。
RAG 全链路——向量数据库在哪一步:
┌─────────────────────────────────────────────────────┐
│ 离线阶段(数据准备) │
│ │
│ 📄 原始文档 ──▶ 📝 分块 ──▶ 🔢 Embedding ──▶ 💾 │
│ (PDF/Markdown) (Chunking) (向量化) 存入 │
│ 向量数据库│
└─────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ 在线阶段(用户提问) │
│ │
│ 👤 用户提问 │
│ │ │
│ ├── 🔢 问题向量化 │
│ │ │
│ ├── 🔍 向量数据库检索 Top-K 相关文档 ← 核心步骤 │
│ │ │
│ ├── 📋 拼装 Prompt = 相关文档 + 用户问题 │
│ │ │
│ └── 🤖 LLM 生成回答 │
│ │ │
│ ▼ │
│ 💬 返回用户(基于知识库的准确回答) │
└─────────────────────────────────────────────────────┘
向量数据库的角色:
→ 离线阶段:存储所有文档的语义向量
→ 在线阶段:毫秒级检索最相关的文档片段
→ 没有它,LLM 只能靠训练数据回答,容易幻觉核心价值:向量数据库是 LLM 的外部记忆。它让 AI 能基于你的私有数据回答问题,而不是靠"猜"。
不止 RAG——向量数据库的应用场景
| 场景 | 怎么用向量数据库 | 典型产品 |
|---|---|---|
| 知识库问答(RAG) | 存文档向量,检索相关片段给 LLM | 企业内部助手、客服机器人 |
| 语义搜索 | 替代关键词搜索,按语义排序 | 电商搜索、文档搜索 |
| 推荐系统 | 存用户/商品向量,找相似用户或商品 | 内容推荐、商品推荐 |
| 图片搜索 | 存图片向量,以图搜图 | Google Lens、电商找同款 |
| 异常检测 | 存正常行为向量,检测偏离的异常 | 安全监控、欺诈检测 |
| 代码搜索 | 存代码片段向量,语义搜索代码 | GitHub Copilot、Sourcegraph |
主角登场:Milvus vs Chroma
本教程会深入两个向量数据库——它们代表了两种典型定位:
Milvus vs Chroma ——一张图看懂定位差异:
项目规模 ──────────────────────────────────────────▶
个人项目 初创公司 中型产品 大型系统 亿级规模
├──────────┼──────────┼──────────┼──────────┤
│ │ │ │ │
│ Chroma ◀──────────▶│ │ │
│ "5 分钟上手" │ │ │
│ 嵌入式/零配置 │ │ │
│ │ │ │
│ │ Milvus ◀──────────────────────▶│
│ │ "生产级" │
│ │ 分布式/亿级向量 │
│ │ │
├──────────┼──────────┼──────────┼──────────┤
常见路径:
Chroma 快速验证 → 产品跑通 → 数据量上来 → 迁移到 Milvus学习建议:先用 Chroma 理解向量数据库的核心概念(第 5 章),再用 Milvus 掌握生产级实践(第 6 章)。两者 API 逻辑相通,切换成本不高。
本章小结
| 知识点 | 要点 |
|---|---|
| 关键词搜索的局限 | 只做字面匹配,不理解语义,"意思相同、措辞不同"就搜不到 |
| 语义搜索 | 把文本变成向量,通过距离计算判断语义相似度 |
| 向量 | 一组有序数字,是文本的"语义指纹",相近语义 → 相近向量 |
| 向量数据库 | 专门存储和搜索向量的数据库,核心操作是 Top-K 相似度检索 |
| 传统 vs 向量 | 传统数据库回答"精确等于什么",向量数据库回答"最像什么" |
| RAG | 向量数据库最典型的场景:检索相关文档 → 喂给 LLM 生成回答 |
| Milvus vs Chroma | Chroma 轻量上手,Milvus 生产级;两者 API 逻辑相通 |
下一章预告:Embedding——把万物变成向量。我们会深入 Embedding 模型的原理,对比 OpenAI / BGE / Sentence-Transformers 等主流方案,并动手用 Python 生成你的第一批文本向量。