Skip to content

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

词嵌入空间可视化

语义相近的词语在向量空间中距离更近,形成自然聚类

维度 1维度 2老虎兔子国王王后王子公主动物皇室

💡 嵌入模型将文本映射到高维向量空间(通常 768~1536 维)。这里我们将其简化为二维来展示核心思想:语义相近的词语,向量距离也更近

Embedding 的三个关键特性

  1. 语义聚类:相似含义的词会自动聚集在一起(动物一簇、食物一簇、科技一簇)
  2. 类比关系:向量运算可以表达语义关系,经典例子:king - man + woman ≈ queen
  3. 维度含义:每个维度隐式编码了某种语义特征(如"是否是动物"、"大小"、"情感倾向"等)
编码方式维度语义信息典型应用
One-Hot词表大小(~50000)传统 NLP
Word2Vec100~300词级语义词相似度、类比推理
BERT Embedding768上下文语义句子理解、问答
OpenAI text-embedding-31536~3072深层语义RAG、语义搜索

2. 相似度计算:向量之间有多"近"?

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

向量相似度计算器

拖动向量端点,观察不同相似度指标的实时变化

AB
余弦相似度
0.3969
-1 (相反) ~ 1 (相同)
欧氏距离
1.71
0 (完全重合) ~ ∞ (无穷远)
点积
0.96
dot(A, B) = |A||B|cosθ

💡余弦相似度只关注方向,不关注长度,适合文本语义比较;欧氏距离同时考虑方向和大小,适合需要绝对距离的场景。

两种核心度量

  • 余弦相似度(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)

向量索引策略对比

对比暴力搜索与近似最近邻搜索的效率差异

查询点
数据点总数
60
访问节点数
0
搜索效率
0%
找到最近 K 个
0
策略时间复杂度精确度适用场景
暴力搜索O(n)100%小数据集 (<10K)
ANN (IVF)O(n/k)~95%大数据集 (>100K)
HNSWO(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)擅长处理结构化数据,但对高维向量的相似度搜索力不从心。向量数据库就是为这个场景专门设计的。

主流向量数据库对比

点击卡片查看详细信息,了解不同向量数据库的特点与适用场景

P
Pinecone
全托管云服务
云原生Serverless
性能
易用性
扩展性
M
Milvus
开源分布式
开源分布式高性能
性能
易用性
扩展性
W
Weaviate
开源 AI 原生
开源GraphQL模块化
性能
易用性
扩展性
C
Chroma
轻量级嵌入式
开源轻量Python
性能
易用性
扩展性
pg
pgvector
PostgreSQL 扩展
SQLPostgreSQL扩展
性能
易用性
扩展性
场景推荐
&#x1F680;
快速原型
Chroma / Pinecone
&#x1F3E2;
企业级部署
Milvus / Weaviate
&#x1F4BE;
已有 PG 数据库
pgvector
&#x1F916;
RAG 应用
Chroma / Weaviate

向量数据库的核心能力

  1. 高效存储:针对高维浮点向量优化的存储格式
  2. ANN 检索:内置多种近似最近邻索引算法(HNSW、IVF 等)
  3. 元数据过滤:支持在向量搜索的同时按标签、时间等条件过滤
  4. 实时更新:支持动态增删改向量,无需重建整个索引
  5. 水平扩展:分布式架构支持亿级向量规模
数据库类型特点适用场景
Pinecone全托管云服务零运维、开箱即用快速原型、中小规模生产
Milvus开源分布式高性能、可扩展大规模生产环境
Chroma开源轻量嵌入式、API 简洁本地开发、小型项目
Weaviate开源云原生内置向量化、GraphQL需要自动向量化的场景
Qdrant开源高性能Rust 实现、过滤强需要复杂过滤的场景
pgvectorPG 扩展复用现有 PG 基础设施已有 PostgreSQL 的团队

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

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

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

嵌入生成流水线

逐步体验从文本到向量的完整转换过程

1
分词 (Tokenize)
2
编码 (Encode)
3
模型推理 (Model)
4
池化 (Pooling)
5
归一化 (Normalize)

离线写入流程

  1. 文档加载:从各种来源(PDF、网页、数据库)读取原始文本
  2. 文本预处理:清洗、去噪、标准化(去掉 HTML 标签、特殊字符等)
  3. 文本分块:按策略将长文本切分为合适大小的片段(200~500 tokens)
  4. 向量化:调用嵌入模型(如 OpenAI text-embedding-3-small)将每个片段转为向量
  5. 存入向量数据库:将向量和原始文本、元数据一起写入数据库

在线查询流程

  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. 端到端思维:从文档加载到最终检索,每个环节的选择都会影响最终效果

延伸阅读