跳转至

第4章 Embedding

学习目标

  • 理解文本向量化的原理与意义
  • 掌握余弦、欧氏、点积三种距离度量的差异
  • 了解主流 Embedding 模型及其适用场景
  • 理解向量维度对存储与性能的影响
  • 使用 Python 生成文本向量并完成语义相似度计算

问题导入

"猫"和"小猫咪"在字面上不同,但语义高度相似;传统关键词匹配无法识别这种关系,导致搜索"猫咪粮"时找不到标注为"猫粮"的商品。Embedding(向量化)技术解决了这一难题:它把文本映射为高维向量,使语义相近的内容在向量空间中距离更近。Embedding 是语义搜索、推荐系统、RAG(检索增强生成)乃至 Agent 长期记忆的底层基石。掌握 Embedding,就掌握了让 AI"理解语义"的钥匙。本章将从原理、模型、度量到实战,系统讲解这一核心能力。

核心概念

1. 向量化原理

Embedding 是将离散文本(词、句、文档)映射为连续稠密向量(如 1536 维浮点数)的过程。模型通过对比学习训练:让语义相近的文本对距离缩小、不相关的文本对距离拉大。最终向量空间的几何结构反映了语义关系——例如经典的 king - man + woman ≈ queen。

2. 距离度量

  • 余弦相似度(Cosine Similarity):衡量向量方向夹角,范围 [-1, 1],对向量长度不敏感,是文本相似度最常用度量。
  • 欧氏距离(Euclidean Distance):衡量向量空间绝对距离,对长度敏感。
  • 点积(Dot Product):同时考虑方向与模长,归一化后等价于余弦相似度,计算最快。

选择原则:归一化向量用点积(最快);关注方向相似性用余弦;关注绝对差异用欧氏。

3. 主流 Embedding 模型

模型 厂商 维度 特点
text-embedding-3-small/large OpenAI 1536/3072(可降维) 通用性强,性价比高
voyage-3 / voyage-large Voyage AI 1024/2048 检索质量领先
bge-m3 / bge-large-zh 智源 1024 中文开源领先
Qwen3-Embedding 阿里 1024/2048 中英文双语优秀
CLIP OpenAI 512 跨模态(图+文)
BERT / sentence-transformers Google/社区 768 经典开源方案

4. 向量维度与性能

  • 高维(如 3072):表达能力强,召回精度高,但存储与检索成本上升。
  • 低维(如 384/768):速度快、占用小,适合大规模初筛。
  • Matryoshka 维度降维:OpenAI text-embedding-3 支持指定 dimensions 参数,从 3072 降到 256 仍保留主要语义,便于按需权衡精度与成本。

5. 多模态 Embedding

CLIP 等模型将图像与文本映射到同一向量空间,使"以图搜文""以文搜图"成为可能。这对电商商品检索、内容审核等场景价值巨大。

6. Embedding 在 Agent 中的作用

  • 长期记忆:将历史对话向量化存储,按需检索。
  • 工具路由:根据用户意图向量匹配最相关工具。
  • 示例选择:在 few-shot 中动态挑选最相似的示例。

原理图

flowchart TD
    TextA[文本A: 猫咪粮] --> Model[Embedding模型]
    TextB[文本B: 猫粮] --> Model
    TextC[文本C: 狗粮] --> Model
    Model --> VecA[向量A\n0.12, 0.88, ...]
    Model --> VecB[向量B\n0.15, 0.85, ...]
    Model --> VecC[向量C\n0.71, 0.30, ...]

    VecA --> Sim{相似度计算}
    VecB --> Sim
    Sim --> Result[A与B相似度高\nA与C相似度低]

    subgraph 向量空间
        VecA -.近.-> VecB
        VecC -.远.-> VecA
    end
图:Embedding 将语义相近的文本映射到向量空间相近位置

示例代码

使用 OpenAI Embedding API 生成文本向量,并用余弦相似度比较语义。

import os
import math
from openai import OpenAI

client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])


def get_embedding(text: str, model: str = "text-embedding-3-small") -> list[float]:
    """获取文本的 Embedding 向量。

    Args:
        text: 待向量化的文本。
        model: Embedding 模型名称。
    """
    resp = client.embeddings.create(model=model, input=text)
    return resp.data[0].embedding


def cosine_similarity(vec_a: list[float], vec_b: list[float]) -> float:
    """计算两个向量的余弦相似度。

    Args:
        vec_a: 向量 A。
        vec_b: 向量 B。
    """
    dot = sum(a * b for a, b in zip(vec_a, vec_b))
    norm_a = math.sqrt(sum(a * a for a in vec_a))
    norm_b = math.sqrt(sum(b * b for b in vec_b))
    return dot / (norm_a * norm_b)


if __name__ == "__main__":
    texts = ["猫咪粮", "猫粮", "狗粮", "汽车保养"]
    embeddings = {t: get_embedding(t) for t in texts}

    query = "给小猫吃什么"
    query_vec = get_embedding(query)

    print(f"查询: {query}")
    for t in texts:
        sim = cosine_similarity(query_vec, embeddings[t])
        print(f"  与 '{t}' 相似度: {sim:.4f}")

运行结果说明:会输出"给小猫吃什么"与四个文本的相似度,"猫咪粮""猫粮"得分最高,"汽车保养"最低,直观展示语义检索能力。

企业案例

案例 1:电商语义搜索

某电商平台用 text-embedding-3-large 将 5000 万商品标题向量化并存入向量数据库,用户搜索"夏天的薄外套"能精准召回"轻薄防晒衣""夏季透气夹克"等结果,CTR 较关键词搜索提升 35%。

案例 2:客服知识库检索

某银行将 2 万条 FAQ 向量化,客服 Agent 接到用户问题时先做向量检索,命中 Top-3 后再交给 LLM 生成回答。准确率从 72% 提升至 91%,且新增 FAQ 无需重新训练模型。

案例 3:跨模态商品推荐

某时尚电商使用 CLIP 将商品图片与用户浏览文本统一向量化,实现"看到一张连衣裙图片→推荐相似款文字描述"的跨模态推荐,转化率提升 22%。

常见问题

Q1:Embedding 维度越高效果越好吗? A:不一定。维度提升带来的边际收益递减,且存储和检索成本线性增长。建议先在小规模数据上对比 768/1536/3072 的召回率,选择性价比最优的。

Q2:不同 Embedding 模型的向量能直接比较吗? A:不能。每个模型的向量空间不同,跨模型比较相似度无意义。换模型需重建整个向量库。

Q3:中文该用 OpenAI 还是国产模型? A:中文场景下 bge-large-zh、Qwen3-Embedding 通常优于 OpenAI 的通用模型,且支持本地部署。但 OpenAI 模型在多语言混合场景更稳定。

Q4:向量需要定期更新吗? A:Embedding 模型升级或业务语料发生显著变化时需要重新生成。建议设计版本管理机制,支持灰度切换。

面试题

1. 解释余弦相似度与欧氏距离的区别及适用场景。 参考答案:余弦只关注方向,对向量长度不敏感,适合文本语义相似度;欧氏关注绝对距离,对长度敏感,适合需要考虑"强度"的场景(如用户画像差异)。

2. 为什么归一化向量后点积等价于余弦相似度? 答题要点:归一化后向量模长为 1,点积公式 a·b = |a||b|cosθ 退化为 cosθ。

3. 如何选择 Embedding 模型? 答题要点:看语言(中/英/多语)、维度需求、是否需本地部署、MTEB 榜单表现、成本预算,并用自己的业务数据做 A/B 评测。

4. 简述 Matryoshka 降维的原理与价值。 参考答案:在训练时让向量的不同维度子集都保持语义信息,推理时可截断到更低维度,实现"一次训练,按需降维",平衡精度与成本。

练习题

  1. 相似度实验:用 text-embedding-3-small 计算"苹果手机""iPhone""华为手机"两两相似度,观察语义关系。
  2. 维度对比:分别用 1536 维与 256 维(dimensions 参数)对 100 条文本做检索,对比 Top-5 召回率差异。
  3. 思考题:如果两条文本向量余弦相似度为 0.99,是否说明它们一定语义相同?举一个反例。

小结

Embedding 将文本映射为高维向量,使语义相似性可计算,是语义搜索、RAG 与 Agent 记忆的底层基础。余弦相似度是最常用的度量;OpenAI、Voyage、bge、Qwen 等模型各有优势,需结合语言、维度、成本选型。延伸阅读:OpenAI Embeddings 指南、MTEB 中文榜单、CLIP 论文《Learning Transferable Visual Models From Natural Language Supervision》。