# 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 的直觉——**语义相似度变成了空间距离**。

<EmbeddingConceptDemo />

::: 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. 相似度计算：向量之间有多"近"？

有了向量表示，下一个问题自然是：**怎么衡量两个向量有多相似？** 这就像在地图上衡量两个城市有多近——你可以量直线距离，也可以看方向是否一致。

<VectorSimilarityDemo />

::: 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)**。

<VectorIndexDemo />

::: 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）擅长处理结构化数据，但对高维向量的相似度搜索力不从心。**向量数据库**就是为这个场景专门设计的。

<VectorDatabaseDemo />

::: tip 向量数据库的核心能力
1. **高效存储**：针对高维浮点向量优化的存储格式
2. **ANN 检索**：内置多种近似最近邻索引算法（HNSW、IVF 等）
3. **元数据过滤**：支持在向量搜索的同时按标签、时间等条件过滤
4. **实时更新**：支持动态增删改向量，无需重建整个索引
5. **水平扩展**：分布式架构支持亿级向量规模
:::

| 数据库 | 类型 | 特点 | 适用场景 |
|-------|------|------|---------|
| Pinecone | 全托管云服务 | 零运维、开箱即用 | 快速原型、中小规模生产 |
| Milvus | 开源分布式 | 高性能、可扩展 | 大规模生产环境 |
| Chroma | 开源轻量 | 嵌入式、API 简洁 | 本地开发、小型项目 |
| Weaviate | 开源云原生 | 内置向量化、GraphQL | 需要自动向量化的场景 |
| Qdrant | 开源高性能 | Rust 实现、过滤强 | 需要复杂过滤的场景 |
| pgvector | PG 扩展 | 复用现有 PG 基础设施 | 已有 PostgreSQL 的团队 |

---

## 5. 端到端 Pipeline：从文本到检索的完整流程

理解了各个组件后，让我们把它们串起来，看看一个完整的向量检索系统是怎么工作的。

整个流程分为两条线：**离线写入**（把文档变成向量存起来）和**在线查询**（把问题变成向量去搜索）。

<EmbeddingPipelineDemo />

::: 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) - 嵌入模型性能对比排行榜





