Skip to content

向量数据库实战(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 ChromaChroma 轻量上手,Milvus 生产级;两者 API 逻辑相通

下一章预告:Embedding——把万物变成向量。我们会深入 Embedding 模型的原理,对比 OpenAI / BGE / Sentence-Transformers 等主流方案,并动手用 Python 生成你的第一批文本向量。

坚持是一种品格