Embedding 模型
一、一句话先定性
Embedding 模型是一个“翻译官”:它把人类语言(一段文字),翻译成计算机能听懂的语言——一串固定长度的数字列表,也就是向量。
比如:
用户问:“红烧肉怎么做?”
翻译后得到:
[0.23, -0.41, 0.07, 0.52, ...](共 1536 个数字)
向量里的每一个数字,可以理解为模型在“语义空间”里给这段文字打的一个“坐标”。语义相似的文本,它们的坐标会离得很近。
二、核心概念:什么是“固定长度”?
不管是 10 个字的短句,还是 500 字的长文,Embedding 模型输出向量的数字个数是固定不变的。比如:
| 模型 | 输出向量维度 |
|---|---|
| text-embedding-3-small | 1536个数字 |
| text-embedding-3-large | 3072个数字 |
| bge-large-zh | 1024个数字 |
为什么必须固定?因为下游任务(检索、分类、聚类)需要用一个统一格式来比较两段文字的相似度。如果两段文字转出来的向量长度不一样,就没法直接计算“它们有多像”。
三、具体原理:以 text-embedding-3-small 为例,它是怎么把文字变成 1536 个数字的?
整个过程分三个步骤,我们一步步拆开看。
🔹 第 1 步:分词(Tokenization)—— 把句子切成小块
模型首先把输入文本拆成更小的单元,叫做token。一个 token 可以是一个单词、一个汉字,或者一个子词(比如“unbelievable”可能被切成 “un” + “believe” + “able”)。
例子:
输入文本"猫喜欢吃鱼"
经过分词后,可能被切成:["猫", "喜欢", "吃", "鱼"]四个 token(具体切法取决于模型的分词器)。
每个 token 都有一个唯一的索引编号,方便后续查找。
这就像每个词都有一个“身份证号”,但此时这些身份证号只是代号,还不包含语义信息。
🔹 第 2 步:查表取初始向量(Embedding Lookup)—— 给每个 token 配一个“初始草稿”
每个 token 在模型内部都有一个初始向量(通常存在一个叫Embedding 矩阵的表里)。这个初始向量是模型在预训练过程中逐渐学出来的,不是随便给的。
例子:
模型可能给
"猫"这个 token 的初始向量是[0.12, -0.35, 0.78, ...](1536 个数字)给
"喜欢"的初始向量是[0.45, 0.21, -0.14, ...]给
"吃"的初始向量是[0.33, -0.08, 0.56, ...]给
"鱼"的初始向量是[0.27, -0.44, 0.69, ...]
注意:此时这只是一个“草稿”,还没有结合整句话的上下文。
🔹 第 3 步:通过 Transformer 网络“互相看”—— 根据上下文调整每个向量
这是最核心的一步。模型会把这些 token 的初始向量一起送入一个深度神经网络(通常是 Transformer 架构),让每个 token“看到”其他所有 token,然后根据整句话的语境,重新调整自己的向量。
Transformer 的两个关键机制:
自注意力机制(Self-Attention):
让每个 token 的向量在更新时,参考句子中其他 token 的信息。比如"猫"这个词在"猫喜欢吃鱼"和"猫是一种动物"这两句话中,经过注意力机制调整后,得到的最终向量会有所不同,因为它在不同语境下扮演的角色不同。多头注意力(Multi-Head Attention):
模型会从多个不同角度(比如语法角度、语义角度、上下文距离角度等)同时学习 token 之间的关系,然后把多个角度的信息融合起来,让向量表达更丰富。
经过若干层 Transformer 处理后,模型会得到每个 token 的最终向量。
然后,为了得到一个代表整个句子的单一向量,常见做法是:
取所有 token 向量的平均值,或者
提取一个特殊标记
[CLS](CLS 是 “classification” 的缩写,在 BERT 类模型中被用来聚合整个序列的信息)对应的最终向量,作为整个句子的代表。
最终输出:1536 个数字,就是整句话的语义向量。
用一句话概括:分词 → 查初始向量 → Transformer 让它们“互相看”调整 → 输出固定长度向量。
四、其他主流模型的横向对比
| 模型 | 参数量 | 向量维度 | 最大输入长度 | 特点 |
|---|---|---|---|---|
| text-embedding-3-small | 未公开 | 1536 | 8192 tokens | OpenAI 性价比款,性能高成本低 |
| text-embedding-3-large | 未公开 | 3072 | 8192 tokens | 精度最高,维度最大,可降维使用 |
| bge-large-zh | 3.26 亿 | 1024 | 512 tokens | 中文特化,基于 BERT-like 架构,中文检索榜 C-MTEB 表现优异 |
| all-MiniLM-L6-v2 | 2270 万 | 384 | 512 tokens | 超轻量,适合本地 CPU 部署,速度快 |
bge-large-zh 的工作原理和 text-embedding-3-small 类似,但有一个显著差异:
bge-large-zh 使用 BERT 风格的特殊[CLS]标记的最终输出来代表整个句子,而不是对 token 向量取平均。这个[CLS]标记被专门训练成能聚合整个序列的语义信息。
五、一个物理类比帮助你记忆
想象一个 1536 维的高维空间(虽然我们无法直观想象,但数学上可以理解):
每一段文字,都被映射成这个空间里的一个点
语义相似的文字,它们的点在空间里靠得很近
语义不同的文字,它们的点离得很远
计算两个点的距离(比如用余弦相似度),就能得到两段文字的语义相似度
余弦相似度的值在 -1 到 1 之间:
接近 1→ 方向几乎相同 → 语义高度相似
接近 0→ 方向正交 → 语义基本无关
接近 -1→ 方向相反 → 语义相反
这就是 Embedding 模型的全部秘密:把语义翻译成坐标,把语义相似性翻译成坐标距离。
六、一句话总结
Embedding 模型 =把任意文本变成固定长度向量的翻译器,它先用“注意力机制”捕捉每个词在句子中的语境关系,再压缩成固定数量的数字坐标,让计算机可以用数学距离来比较语义相似性。
就像给你一座城市的每个地方都标上经纬度坐标,想找离你最近的地方,算坐标距离就行。Embedding 做的就是“给文字标坐标”这件事。
