LLM 基础系列 · 第 5 篇
前面四篇讲了 Transformer 的架构、Attention 的机制、Token 的切分、Context Window 的范围。这一篇回到起点------每个 Token 进入 Transformer 之前,被变成了一个高维向量。这个向量就是 Embedding。
Embedding 是 AI "理解"语义的唯一方式。它不"知道""苹果"是一种水果------它只知道"苹果"这个词的向量跟"香蕉"的向量距离很近,跟"汽车"的向量距离很远。这篇文章解释这是怎么做到的。
Embedding 不是"查字典",是"学出来的"
Embedding 的直观理解:每个 Token(比如"苹果")被分配一个固定长度的向量(GPT-3 是 12288 维)。这个向量由 12288 个浮点数组成:
arduino
"苹果" → [0.013, -0.042, 0.001, -0.027, ..., 0.033]
↑ 12288 个数字
但这 12288 个数字不是人工设定的------是训练期间通过反向传播"学出来"的。初始状态:每个 Token 的 Embedding 向量是随机分配的。训练过程:模型反复看到"我今天吃了一个苹果"和"我今天吃了一个香蕉"这样的句子。反向传播通过梯度下降不断调整"苹果"和"香蕉"的向量------因为两者在"我今天吃了 ___"这个位置出现的上下文高度相似------它们的向量逐渐靠近。
训练结束时------具有相似上下文的词获得了相似的向量------而这些向量就是模型"理解"词义的全部基础。
词向量的关键特性:语义关系 = 向量空间的几何关系
Embedding 不是把词"分类"------是把词之间的关系"编码"为向量空间里的几何关系。
经典例子:类比推理
perl
vec("国王") - vec("男人") + vec("女人") ≈ vec("女王")
在 12288 维空间里------"国王"减去"男人"------相当于抽走了"国王"向量里携带的"男性"成分------剩下的部分近似"皇室身份"这个语义方向。然后加上"女人"------"女性"成分加回去------结果向量恰好接近"女王"。
模型没有"理解"王室继承法------它只是训练期间在大量文本里反复看到"国王和女王"、"男人和女人"这类成对出现的词------它们的相对位置被反方向传播塑造成这种规律性的关系。
另一个例子:时态变换
perl
vec("walking") - vec("walk") ≈ vec("running") - vec("run")
"walking 和 walk 之间的差异向量"跟"running 和 run 之间的差异向量"指向大致相同的方向。这个方向可以理解为"现在进行时"在向量空间里的编码。模型没有"语法课"------它从海量文本里自动内化了这种规律。
从词到句子:一个句子怎么变成向量?
第 1 篇讲过------Embedding 只是入口。一个 Token 的 Embedding 向量经过 96 层 Transformer(Attention + FFN + 残差)之后------变成了一个融入全句上下文的新向量。这个新向量通常叫 Contextualized Embedding 或 Hidden State。
arduino
Token "苹果" 的行程:
原始 Embedding("苹果") → [0.013, -0.042, ...]
经过 Layer 1 的 Attention + FFN → 融入了相邻词的信息
经过 Layer 2-12 → 融入了句法结构
经过 Layer 13-48 → 融入了短语和句子层面的语义
经过 Layer 49-96 → 融入了整个段落的全局语境
最终 "苹果" 的上下文向量 → 包含了"这个具体语境里苹果是谁/在哪/干什么"
同一个词"苹果"------在不同句子里的最终上下文向量完全不同:
- "削了一个苹果" → 向量接近可食用水果相关词的聚集区
- "苹果发布了新手机" → 向量接近科技公司相关词的聚集区
- "苹果肌下垂了" → 向量接近美容护肤相关词的聚集区
同一个原始 Embedding------经过不同上下文推动------最终落在完全不同的向量空间区域。Embedding 只提供"建议的语义",上下文决定"实际语义"。
Embedding 的根本限制:没有上下文就没有正确语义
Embedding 是词的"静态画像"------但它不能区分多义词------这是 Transformer 的 Attention 层的活。
一个极端的例子------中文词"意思":
arduino
"这个东西很有意思" → "意思" = interesting(有趣)
"一点小意思,不成敬意" → "意思" = gift(礼物)
"你到底什么意思?" → "意思" = intention(意图)
三个句子里"意思"的原始 Embedding 完全相同------都是同一个向量。是 Transformer 96 层的 Attention 看到了周围的词("有"、"小"、"到底"),把不同的语义方向"推"进了"意思"的最终上下文向量。所以准确地说------Embedding 是模型的第一层理解------但在最终输出前------这个理解已经被 Transformer 层层重塑。
余弦相似度:测量两个向量"有多像"的标准方法
在 Embedding 的向量空间里------两个向量的"距离"用余弦相似度,而不是欧几里得距离:
css
余弦相似度 = (A · B) / (|A| × |B|)
= 两个向量的点积 ÷ 两个向量的模长乘积
余弦相似度测量的是"方向的一致程度"------不是"绝对距离":
余弦 = 1.0 → 方向完全一致(语义完全相同)
余弦 = 0.0 → 方向垂直(语义无关)
余弦 = -1.0 → 方向完全相反(语义对立)
为什么用余弦而不用欧氏距离?因为在高维空间里(12288 维),欧氏距离会被"向量长度"主导------一个高频词的向量长度往往较大(因为训练时梯度更新更多),但这不代表它跟其他词"更不相关"。余弦相似度剥离向量长度------只看方向------对于 Embedding 比较来说准确得多。
Embedding 怎么变成了 RAG 的基石
RAG(检索增强生成)------第 5 篇幻觉文章提过------是当前降低幻觉最有效的方法。RAG 的工作流程:
markdown
1. 把知识库里的所有文档分段,每段转成一个 Embedding 向量
2. 把所有这些向量存在一个向量数据库里
3. 用户提问 → 把问题也转成一个 Embedding 向量
4. 在向量数据库里查找跟问题向量余弦相似度最高的 K 个段落
5. 把这 K 个段落塞到 Prompt 里 → AI 基于这些段落回答
这一套流程的核心桥梁就是 Embedding:任何文本(文档、代码、API 文档、聊天记录)都能被压缩成一个固定长度的向量------然后做向量检索。 不同语言、不同领域的文本------经由 Embedding 模型映射到同一个向量空间------所有比较和检索都在这个空间里统一发生。
Embedding 模型 ≠ LLM 模型
一个容易被忽略的点:用来做向量检索的 Embedding 模型(如 OpenAI 的 text-embedding-3-large、Cohere Embed、BGE 系列)跟用来生成文本的 LLM 是不同的模型。它们的目标不同:
markdown
Embedding 模型:把文本压缩成一个能捕捉语义的固定长度向量。
目标 → 语义相似 = 向量相似
LLM 模型(GPT/Claude 等):逐个 Token 生成文本。
目标 → 给定前缀,预测下一个最合理的 Token
Embedding 模型的训练目标不是"续写文本"------而是"让语义相关的文本在向量空间里距离近"。通常用对比学习(Contrastive Learning):给一对相似的文本让它们的向量靠近,给一对不相似的文本让它们的向量远离。
生产环境里------你的 RAG 系统很可能是:提问 → Embedding 模型转成向量 → 向量数据库检索 → 检索结果进入 LLM 的 Prompt → LLM 生成文字回答。两个不同类型的模型协同工作。
一句话总结
Embedding 是 AI 理解语义的基石------词被映射到高维向量空间,语义相似度变成向量空间的几何距离。12288 维的向量不是人工设定的,是训练期间基于上下文共现模式自动学习的。同一个词的原始 Embedding 相同------但经过 Transformer 96 层的上下文重塑------它的"最终意义"在不同句子里完全不同。Embedding 是 RAG 的基础------所有知识库检索的第一步就是把文本转成向量------然后在向量空间里做最相似查找。
下一篇:向量数据库------FAISS、Milvus、Pinecone。为什么普通的 SQL 数据库做不了向量检索?ANN(近似最近邻)和 HNSW 是什么?以及如何用向量数据库搭建一个真正的 RAG 系统