前言

计算机怎么理解"猫和狗很像,但和汽车不像"这件事? 对人类来说这是常识,但对计算机来说,“猫”、“狗”、“汽车"不过是三个毫无关联的字符串。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 的直觉——语义相似度变成了空间距离

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

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

两种核心度量
  • 余弦相似度(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)

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

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

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

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

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

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

延伸阅读

Last updated 26 Apr 2026, 03:21 +0800 . history