# Embedding 与向量检索
::: tip 前言
**计算机怎么理解"猫和狗很像,但和汽车不像"这件事?** 对人类来说这是常识,但对计算机来说,"猫"、"狗"、"汽车"不过是三个毫无关联的字符串。Embedding(嵌入)技术就是解决这个问题的关键——它把文字变成数字向量,让计算机也能理解语义上的"远近亲疏"。
:::
**这篇文章会带你学什么?**
学完这章后,你将获得:
- **直觉理解**:明白 Embedding 是什么,为什么"猫"和"狗"的向量会靠近
- **相似度计算**:掌握余弦相似度、欧氏距离等核心度量方法
- **索引原理**:理解向量数据库如何在百万级数据中毫秒级检索
- **技术选型**:了解主流向量数据库的特点和适用场景
- **端到端流程**:掌握从文本到向量到检索的完整 Pipeline
| 章节 | 内容 | 核心概念 |
|-----|------|---------|
| **第 1 章** | Embedding 概念 | 语义空间、向量表示 |
| **第 2 章** | 相似度计算 | 余弦相似度、欧氏距离 |
| **第 3 章** | 向量索引 | 暴力搜索 vs ANN |
| **第 4 章** | 向量数据库 | Pinecone、Milvus、Chroma |
| **第 5 章** | 端到端 Pipeline | 文本→向量→存储→查询 |
---
## 0. 全景图:从文字到数字的桥梁
在自然语言处理的世界里,有一个根本性的挑战:**计算机只认识数字,不认识文字**。
早期的做法是给每个词分配一个编号(One-Hot 编码),比如"猫"=001,"狗"=010,"汽车"=100。但这样做有个致命问题:**所有词之间的距离都一样远**。"猫"到"狗"的距离和"猫"到"汽车"的距离完全相同——这显然不符合我们的直觉。
Embedding 的革命性在于:它把每个词映射到一个**稠密的低维向量空间**,让语义相近的词自然聚集在一起。在这个空间里,"猫"和"狗"靠得很近,而"汽车"则在远处——计算机终于能"理解"语义了。
::: tip 从 One-Hot 到 Embedding 的飞跃
- **One-Hot**:维度 = 词表大小(可能几万维),每个向量只有一个 1,其余全是 0,稀疏且无语义
- **Embedding**:维度通常 768~1536,每个数字都有意义,稠密且富含语义信息
- **关键突破**:Word2Vec(2013)证明了"词的含义可以用它的上下文来定义",开启了 Embedding 时代
:::
---
## 1. Embedding 概念:把文字变成坐标
Embedding 的核心思想可以用一句话概括:**用一组数字(向量)来表示一个词或句子的含义**。
想象一个二维坐标系。我们把"猫"放在坐标 (0.2, 0.7),"狗"放在 (0.3, 0.6),"汽车"放在 (0.9, 0.1)。你会发现"猫"和"狗"的坐标很接近,而"汽车"离它们很远。这就是 Embedding 的直觉——**语义相似度变成了空间距离**。
::: tip Embedding 的三个关键特性
1. **语义聚类**:相似含义的词会自动聚集在一起(动物一簇、食物一簇、科技一簇)
2. **类比关系**:向量运算可以表达语义关系,经典例子:king - man + woman ≈ queen
3. **维度含义**:每个维度隐式编码了某种语义特征(如"是否是动物"、"大小"、"情感倾向"等)
:::
| 编码方式 | 维度 | 语义信息 | 典型应用 |
|---------|------|---------|---------|
| One-Hot | 词表大小(~50000) | 无 | 传统 NLP |
| Word2Vec | 100~300 | 词级语义 | 词相似度、类比推理 |
| BERT Embedding | 768 | 上下文语义 | 句子理解、问答 |
| OpenAI text-embedding-3 | 1536~3072 | 深层语义 | RAG、语义搜索 |
---
## 2. 相似度计算:向量之间有多"近"?
有了向量表示,下一个问题自然是:**怎么衡量两个向量有多相似?** 这就像在地图上衡量两个城市有多近——你可以量直线距离,也可以看方向是否一致。
::: tip 两种核心度量
- **余弦相似度(Cosine Similarity)**:衡量两个向量的**方向**是否一致,值域 [-1, 1]。1 表示方向完全相同,0 表示正交(无关),-1 表示完全相反。文本语义比较的首选,因为它不受向量长度影响。
- **欧氏距离(Euclidean Distance)**:衡量两个向量端点之间的**直线距离**,值域 [0, ∞)。0 表示完全重合,值越大越不相似。适合需要考虑"绝对大小"的场景。
:::
| 度量方式 | 公式直觉 | 值域 | 适用场景 |
|---------|---------|------|---------|
| 余弦相似度 | 看方向,忽略长度 | [-1, 1] | 文本语义搜索、推荐系统 |
| 欧氏距离 | 看端点直线距离 | [0, ∞) | 图像特征、聚类分析 |
| 点积 | 方向 × 长度 | (-∞, +∞) | 归一化向量的快速计算 |
| 曼哈顿距离 | 沿坐标轴走的距离 | [0, ∞) | 高维稀疏向量 |
---
## 3. 向量索引:如何在百万向量中毫秒检索?
假设你有 100 万条文档,每条都转成了 1536 维的向量。用户提了一个问题,你需要找到最相似的 10 条。最直接的方法是逐一计算相似度——但这意味着要做 100 万次 1536 维的向量运算,太慢了。
这就是**向量索引**要解决的问题:**用空间换时间,通过预处理建立索引结构,让检索速度从 O(n) 降到近似 O(log n)**。
::: tip 暴力搜索 vs 近似最近邻(ANN)
- **暴力搜索(Flat)**:逐一比较,100% 准确但速度慢。适合数据量小(< 10 万)的场景。
- **IVF(倒排文件索引)**:先把向量空间划分成若干区域(聚类),查询时只搜索最近的几个区域。像是把图书馆按主题分区,找书时只去相关区域。
- **HNSW(分层可导航小世界图)**:构建多层图结构,从粗粒度到细粒度逐层导航。像是先看世界地图定位到国家,再看省级地图,最后看街道地图。
- **PQ(乘积量化)**:把高维向量压缩成短编码,牺牲少量精度换取大幅内存节省。适合超大规模数据集。
:::
| 索引类型 | 构建速度 | 查询速度 | 召回率 | 内存占用 | 适用规模 |
|---------|---------|---------|-------|---------|---------|
| Flat(暴力) | 无需构建 | 慢 | 100% | 高 | < 10 万 |
| IVF | 中等 | 快 | 95%+ | 中 | 10 万~1000 万 |
| HNSW | 慢 | 很快 | 99%+ | 高 | 10 万~1000 万 |
| PQ | 中等 | 快 | 90%+ | 很低 | > 1000 万 |
| IVF-PQ | 中等 | 快 | 92%+ | 低 | > 1 亿 |
---
## 4. 向量数据库:专为向量而生的存储引擎
有了向量和索引算法,你需要一个地方来存储和管理它们。传统数据库(MySQL、PostgreSQL)擅长处理结构化数据,但对高维向量的相似度搜索力不从心。**向量数据库**就是为这个场景专门设计的。
::: tip 向量数据库的核心能力
1. **高效存储**:针对高维浮点向量优化的存储格式
2. **ANN 检索**:内置多种近似最近邻索引算法(HNSW、IVF 等)
3. **元数据过滤**:支持在向量搜索的同时按标签、时间等条件过滤
4. **实时更新**:支持动态增删改向量,无需重建整个索引
5. **水平扩展**:分布式架构支持亿级向量规模
:::
| 数据库 | 类型 | 特点 | 适用场景 |
|-------|------|------|---------|
| Pinecone | 全托管云服务 | 零运维、开箱即用 | 快速原型、中小规模生产 |
| Milvus | 开源分布式 | 高性能、可扩展 | 大规模生产环境 |
| Chroma | 开源轻量 | 嵌入式、API 简洁 | 本地开发、小型项目 |
| Weaviate | 开源云原生 | 内置向量化、GraphQL | 需要自动向量化的场景 |
| Qdrant | 开源高性能 | Rust 实现、过滤强 | 需要复杂过滤的场景 |
| pgvector | PG 扩展 | 复用现有 PG 基础设施 | 已有 PostgreSQL 的团队 |
---
## 5. 端到端 Pipeline:从文本到检索的完整流程
理解了各个组件后,让我们把它们串起来,看看一个完整的向量检索系统是怎么工作的。
整个流程分为两条线:**离线写入**(把文档变成向量存起来)和**在线查询**(把问题变成向量去搜索)。
::: tip 离线写入流程
1. **文档加载**:从各种来源(PDF、网页、数据库)读取原始文本
2. **文本预处理**:清洗、去噪、标准化(去掉 HTML 标签、特殊字符等)
3. **文本分块**:按策略将长文本切分为合适大小的片段(200~500 tokens)
4. **向量化**:调用嵌入模型(如 OpenAI text-embedding-3-small)将每个片段转为向量
5. **存入向量数据库**:将向量和原始文本、元数据一起写入数据库
:::
::: tip 在线查询流程
1. **接收查询**:用户输入自然语言问题
2. **查询向量化**:用同一个嵌入模型将问题转为向量
3. **相似度检索**:在向量数据库中搜索 Top-K 最相似的文档片段
4. **后处理**:重排序、去重、元数据过滤
5. **返回结果**:将最相关的文档片段返回给调用方(或交给 LLM 生成回答)
:::
| 环节 | 关键选择 | 推荐方案 |
|------|---------|---------|
| 嵌入模型 | 精度 vs 成本 vs 速度 | OpenAI text-embedding-3-small(性价比高) |
| 分块策略 | 粒度 vs 语义完整性 | 递归分块,200~500 tokens |
| 向量数据库 | 规模 vs 运维成本 | 小项目用 Chroma,生产用 Pinecone/Milvus |
| 相似度度量 | 语义 vs 精确 | 余弦相似度(文本场景首选) |
| Top-K 值 | 召回率 vs 噪音 | 先检索 20 条,重排序后取 Top 5 |
---
## 总结
Embedding 与向量检索是连接"人类语言"和"机器理解"的桥梁,也是 RAG、语义搜索、推荐系统等 AI 应用的基础设施。
回顾本章的关键要点:
1. **Embedding 的本质**:把文本映射到高维向量空间,让语义相似度变成空间距离
2. **相似度度量**:余弦相似度关注方向(适合文本),欧氏距离关注绝对距离
3. **索引是性能关键**:HNSW 和 IVF 让百万级向量的检索降到毫秒级
4. **向量数据库选型**:小项目用 Chroma/pgvector,生产环境用 Pinecone/Milvus
5. **端到端思维**:从文档加载到最终检索,每个环节的选择都会影响最终效果
## 延伸阅读
- [OpenAI Embeddings 文档](https://platform.openai.com/docs/guides/embeddings) - 官方嵌入模型使用指南
- [Pinecone Learning Center](https://www.pinecone.io/learn/) - 向量数据库和检索的系统教程
- [FAISS Wiki](https://github.com/facebookresearch/faiss/wiki) - Facebook 开源的向量检索库文档
- [Word2Vec 原始论文](https://arxiv.org/abs/1301.3781) - Embedding 时代的开山之作
- [MTEB 排行榜](https://huggingface.co/spaces/mteb/leaderboard) - 嵌入模型性能对比排行榜