Embedding 与向量检索
前言
计算机怎么理解"猫和狗很像,但和汽车不像"这件事? 对人类来说这是常识,但对计算机来说,"猫"、"狗"、"汽车"不过是三个毫无关联的字符串。Embedding(嵌入)技术就是解决这个问题的关键——它把文字变成数字向量,让计算机也能理解语义上的"远近亲疏"。
这篇文章会带你学什么?
学完这章后,你将获得:
- 直觉理解:明白 Embedding 是什么,为什么"猫"和"狗"的向量会靠近
- 相似度计算:掌握余弦相似度、欧氏距离等核心度量方法
- 索引原理:理解向量数据库如何在百万级数据中毫秒级检索
- 技术选型:了解主流向量数据库的特点和适用场景
- 端到端流程:掌握从文本到向量到检索的完整 Pipeline
| 章节 | 内容 | 核心概念 |
|---|---|---|
| 第 1 章 | Embedding 概念 | 语义空间、向量表示 |
| 第 2 章 | 相似度计算 | 余弦相似度、欧氏距离 |
| 第 3 章 | 向量索引 | 暴力搜索 vs ANN |
| 第 4 章 | 向量数据库 | Pinecone、Milvus、Chroma |
| 第 5 章 | 端到端 Pipeline | 文本→向量→存储→查询 |
0. 全景图:从文字到数字的桥梁
在自然语言处理的世界里,有一个根本性的挑战:计算机只认识数字,不认识文字。
早期的做法是给每个词分配一个编号(One-Hot 编码),比如"猫"=001,"狗"=010,"汽车"=100。但这样做有个致命问题:所有词之间的距离都一样远。"猫"到"狗"的距离和"猫"到"汽车"的距离完全相同——这显然不符合我们的直觉。
Embedding 的革命性在于:它把每个词映射到一个稠密的低维向量空间,让语义相近的词自然聚集在一起。在这个空间里,"猫"和"狗"靠得很近,而"汽车"则在远处——计算机终于能"理解"语义了。
从 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 的直觉——语义相似度变成了空间距离。
词嵌入空间可视化
语义相近的词语在向量空间中距离更近,形成自然聚类
💡 嵌入模型将文本映射到高维向量空间(通常 768~1536 维)。这里我们将其简化为二维来展示核心思想:语义相近的词语,向量距离也更近。
Embedding 的三个关键特性
- 语义聚类:相似含义的词会自动聚集在一起(动物一簇、食物一簇、科技一簇)
- 类比关系:向量运算可以表达语义关系,经典例子:king - man + woman ≈ queen
- 维度含义:每个维度隐式编码了某种语义特征(如"是否是动物"、"大小"、"情感倾向"等)
| 编码方式 | 维度 | 语义信息 | 典型应用 |
|---|---|---|---|
| One-Hot | 词表大小(~50000) | 无 | 传统 NLP |
| Word2Vec | 100~300 | 词级语义 | 词相似度、类比推理 |
| BERT Embedding | 768 | 上下文语义 | 句子理解、问答 |
| OpenAI text-embedding-3 | 1536~3072 | 深层语义 | RAG、语义搜索 |
2. 相似度计算:向量之间有多"近"?
有了向量表示,下一个问题自然是:怎么衡量两个向量有多相似? 这就像在地图上衡量两个城市有多近——你可以量直线距离,也可以看方向是否一致。
向量相似度计算器
拖动向量端点,观察不同相似度指标的实时变化
💡余弦相似度只关注方向,不关注长度,适合文本语义比较;欧氏距离同时考虑方向和大小,适合需要绝对距离的场景。
两种核心度量
- 余弦相似度(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)。
向量索引策略对比
对比暴力搜索与近似最近邻搜索的效率差异
| 策略 | 时间复杂度 | 精确度 | 适用场景 |
|---|---|---|---|
| 暴力搜索 | O(n) | 100% | 小数据集 (<10K) |
| ANN (IVF) | O(n/k) | ~95% | 大数据集 (>100K) |
| HNSW | O(log n) | ~98% | 高性能检索 |
暴力搜索 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)擅长处理结构化数据,但对高维向量的相似度搜索力不从心。向量数据库就是为这个场景专门设计的。
主流向量数据库对比
点击卡片查看详细信息,了解不同向量数据库的特点与适用场景
场景推荐
向量数据库的核心能力
- 高效存储:针对高维浮点向量优化的存储格式
- ANN 检索:内置多种近似最近邻索引算法(HNSW、IVF 等)
- 元数据过滤:支持在向量搜索的同时按标签、时间等条件过滤
- 实时更新:支持动态增删改向量,无需重建整个索引
- 水平扩展:分布式架构支持亿级向量规模
| 数据库 | 类型 | 特点 | 适用场景 |
|---|---|---|---|
| Pinecone | 全托管云服务 | 零运维、开箱即用 | 快速原型、中小规模生产 |
| Milvus | 开源分布式 | 高性能、可扩展 | 大规模生产环境 |
| Chroma | 开源轻量 | 嵌入式、API 简洁 | 本地开发、小型项目 |
| Weaviate | 开源云原生 | 内置向量化、GraphQL | 需要自动向量化的场景 |
| Qdrant | 开源高性能 | Rust 实现、过滤强 | 需要复杂过滤的场景 |
| pgvector | PG 扩展 | 复用现有 PG 基础设施 | 已有 PostgreSQL 的团队 |
5. 端到端 Pipeline:从文本到检索的完整流程
理解了各个组件后,让我们把它们串起来,看看一个完整的向量检索系统是怎么工作的。
整个流程分为两条线:离线写入(把文档变成向量存起来)和在线查询(把问题变成向量去搜索)。
嵌入生成流水线
逐步体验从文本到向量的完整转换过程
离线写入流程
- 文档加载:从各种来源(PDF、网页、数据库)读取原始文本
- 文本预处理:清洗、去噪、标准化(去掉 HTML 标签、特殊字符等)
- 文本分块:按策略将长文本切分为合适大小的片段(200~500 tokens)
- 向量化:调用嵌入模型(如 OpenAI text-embedding-3-small)将每个片段转为向量
- 存入向量数据库:将向量和原始文本、元数据一起写入数据库
在线查询流程
- 接收查询:用户输入自然语言问题
- 查询向量化:用同一个嵌入模型将问题转为向量
- 相似度检索:在向量数据库中搜索 Top-K 最相似的文档片段
- 后处理:重排序、去重、元数据过滤
- 返回结果:将最相关的文档片段返回给调用方(或交给 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 应用的基础设施。
回顾本章的关键要点:
- Embedding 的本质:把文本映射到高维向量空间,让语义相似度变成空间距离
- 相似度度量:余弦相似度关注方向(适合文本),欧氏距离关注绝对距离
- 索引是性能关键:HNSW 和 IVF 让百万级向量的检索降到毫秒级
- 向量数据库选型:小项目用 Chroma/pgvector,生产环境用 Pinecone/Milvus
- 端到端思维:从文档加载到最终检索,每个环节的选择都会影响最终效果
延伸阅读
- OpenAI Embeddings 文档 - 官方嵌入模型使用指南
- Pinecone Learning Center - 向量数据库和检索的系统教程
- FAISS Wiki - Facebook 开源的向量检索库文档
- Word2Vec 原始论文 - Embedding 时代的开山之作
- MTEB 排行榜 - 嵌入模型性能对比排行榜
