Token 和 Embedding:大语言模型看世界的方式
梳理了大语言模型中的 Token 和 Embedding 概念,解释模型为何先通过 Tokenizer 将文本转为离散编号,再用 Embedding 将编号映射到高维向量空间。对比语言模型内部的 Token Embedding 与 RAG 场景中的文本 Embedding,说明二者在架构相似但训练目标和用途不同。
很多人第一次接触大语言模型时,都会有类似的困惑:
- 我明明输入的是「文字」,模型为什么老在说自己处理的是 Token?
- 为什么每个模型架构图里都有一块叫 Embedding 的东西?
- RAG 里也有 Embedding,它和大模型里的 Embedding 是一回事吗?
这些词听上去有点抽象,但它们其实对应的是非常具体的工程方案。
本文尝试用尽量直白的方式,把 Token 和 Embedding 这两个概念讲清楚。
一、大模型为什么不直接处理「文字」?
在和 ChatGPT 这类模型聊天时,我们都是直接敲文字。
但在计算机里,文字被存储成一个个离散的字符:
"Apple"其实是 5 个字符:A p p l e- 每个字符在底层是一个编码值(比如 UTF-8)
如果你把「字符」直接丢给模型,会出现两个问题:
- 效率极低
模型得先学会:
- 字母
a p p l e→ 单词"apple" "apple"→ 「苹果」这个概念
再把这个概念用于后续推理。
算力有限的情况下,这样太浪费。
- 表达能力差
对中文尤其明显:一个汉字通常占用多个字节,字符级别的拆分既冗长又不直观。
于是,人们给大模型做了一个「词典」,
用整数编号代表更高层次的单位——Token。
二、Token:数字形式的「词或词片」
可以粗略地把 Token 理解成「词或词片的编号」:
- Token 1 代表
"apple" - Token 2 代表
"banana" - Token 3 代表
"pear"
这样一来,模型看到的就不再是离散的字符流,而是一串数字序列:1, 2, 3, ...。
这比直接从字符开始学习要高效得多。
不过,Token 和单词并不是一一对应。为了兼顾未知词和不同语言,模型通常会把单词拆成更小的「词片」:
"oldest"可能被拆成两个 Token:"old"+"est""goodest"这个并不存在的词,也能被拆成"good"+"est",模型仍然能理解其大致含义
这就是所谓的 子词(Subword)建模 思路:
用有限的词表,覆盖无限的新单词。
1. Tokenizer:从文本到 Token 的转换器
负责完成「文本 ↔ Token」转换的,就是 Tokenizer。
它主要做两件事:
- 把字符串切成词或词片
- 给每个词片分配一个编号
常见的 Tokenizer 库有:
- OpenAI 的 tiktoken(使用 BPE 算法)
- 谷歌系的 WordPiece 等
它们的实现各不相同,但目标一致:
高效、稳定地把文本编码成 Token 序列。
每个 Tokenizer 能识别多少 Token,叫做 词表大小(Vocab Size)。例如:
- GPT-2 的词表大小是 50257
- 早期对中文支持不佳,很多汉字需要用多个 Token 表示
- 支持多语言更好的 GPT-4o,词表规模扩到 20 万级,大幅提升了中文等非英文语言的处理效率
需要注意的是:
Tokenizer 属于预处理步骤,不是模型的一部分。
训练大模型时,Tokenizer 是固定的,真正被训练的是后面的神经网络。
三、Embedding:从编号到「可以计算的意义」
现在我们已经有了 Token,它是一个整数。
但整数本身只占一个维度,表达能力非常有限。
想象一个极简的设计:
1表示「苹果」,2表示「香蕉」,3表示「梨」- 我们希望「苹果」和「香蕉」要比「苹果」和「汽车」更相近
- 同时,中英文的「苹果」(如
"apple"、日文"りんご")也应该在某种意义上靠得更近
仅靠 1、2、3 之间的距离,根本编码不了这么丰富的关系。
解决办法很直接:
别只用一个数,改用一串数。
也就是:把每个 Token 映射成一个高维向量,
向量中的每一维,都在某种程度上描述这个 Token 的一个「特征」。
你可以打个比方:
- 第 1 维表示语言类别(中文 / 英文 / 日文…)
- 第 2 维表示形状(圆 / 长条)
- 第 3 维表示颜色(红 / 黄 / 绿)
- 第 4 维表示大类(水果 / 动物 / 交通工具)
- ……
这样:
- 中文「苹果」可能是
[1, 1, 1, 1, …] - 英文
"apple"是[2, 1, 1, 1, …] - 香蕉则是
[1, 2, 2, 1, …]
它们之间就可以体现出「既近又远」的关系:
- 香蕉和苹果:同是水果,但颜色、形状不同
"apple"和「苹果」:语言不同,但含义几乎相同
这个把 Token 变成向量的过程,就叫做 Embedding。
在真实模型里,向量维度远不止 4 维,
而是几千到上万维。例如:
- GPT-2 XL 的 Embedding 维度是 1600
- DeepSeek-R1 的 Embedding 维度高达 7168
- 顶级闭源模型(例如最新一代的 GPT / Gemini)通常也在类似甚至更高的量级上
维度越高,代表模型「看世界的角度」越细腻:
它能用更多维度去区分不同语义、不同风格、不同语境。
四、Embedding 在 Transformer 中是怎么实现的?
从工程角度看,Embedding 的实现方式其实非常朴素。
假设:
- 词表大小
Vocab Size = 50257 - Embedding 维度
D = 1600
我们可以这样构造 Embedding 层:
- 把 Token 做成 one-hot 向量
- 每个 Token 变成长度为 50257 的向量
- 对应位置是 1,其他位置是 0
- 乘以一个线性层(矩阵)
- 这个线性层可以理解为一个大小为
50257 × 1600的矩阵 - one-hot 向量乘以它,结果就是一个 1600 维的向量
- 这个向量就是我们说的 Token 的 Embedding 表示
这个线性层本质上就是最普通的全连接层(Linear)。
在工程实现上可以用查表、稀疏矩阵等更高效的方式来做,但数学本质一样。
需要强调的是:
- Embedding 向量不是人工「手工设计」出来的,而是训练出来的
- 在训练大模型时,Embedding 矩阵和后面的所有层一起参与反向传播与更新
- 每一维到底代表什么含义,人类现在并不能精确解释,只能通过可视化和分析去大致理解
同样,在模型输出端,还有一个「反向的线性层」:
- 中间所有层都处理的是高维 Embedding 向量
- 最后一层线性变换,把向量映射回「每个 Token 的概率分布」
- 再根据这个分布采样出下一个 Token
因此,在一个标准的 Transformer 里:
- 输入侧的 Embedding 层:Token → 向量
- 输出侧的线性层:向量 → Token 概率
五、RAG 里的 Embedding 和大模型里的 Embedding 是一回事吗?
很多朋友听到这里会提出一个常见疑问:
「我在 RAG 里用的 Embedding,是把一整段话变成一个向量。
你前面讲的大模型 Embedding,是一个 Token 一个向量。
这俩真是一回事吗?」
严格说:
它们在名字上相同,架构上类似,但用途和训练方式不一样。
1. 大语言模型里的 Embedding
- 位置:模型最底层
- 粒度:每个 Token 一个向量
- 目标:把离散 Token 转成连续空间里的点,方便后续网络处理
- 训练方式:和语言模型一起,通过「预测下一个 Token」任务训练
例如在训练时:
- 输入:「老王」→ 让模型输出「爱」
- 输入:「老王爱」→ 输出「吃」
- 输入:「老王爱吃」→ 输出「苹果」
Embedding 在这个过程中被一起更新,
目的只是让模型更好完成「文字接龙」任务。
2. RAG / 向量检索里的 Embedding
RAG 场景里的 Embedding,目标完全不同:
- 目标:把一整段文本概括成一个向量
- 要求:语义相近的文本,向量距离要近;无关文本,距离要远
- 粒度:通常按「句子 / 段落 / 文档」级别做 Embedding,而不是单个 Token
训练方式也不同,典型的是 对比学习(Contrastive Learning):
- 给模型输入两段语义相近的文本,例如:
- 「老王爱吃苹果」
- 「小王特别喜欢吃水果」
期望它们的向量距离要 尽可能小,这是「正样本对」。
- 再输入一对完全不相关的文本,例如:
- 「老王爱吃苹果」
- 「老李找到了女朋友」
考虑到老王既不是老李,老王也不太可能突然就找到女朋友,
这俩句子语义基本无关,就应该把向量距离拉得足够大,这是「负样本对」。
通过成千上万这样的正负样本对,
模型学会:把语义相似的内容压缩到向量空间的相近位置里。
在结构上,RAG 的 Embedding 模型通常也是基于 Transformer:
- 通常是 Encoder-Only 架构(类似 BERT),
- Attention 不做自回归 Mask,可以充分利用双向上下文,
- 最后往往再加一层池化(Pooling),把所有 Token 的表示融合成一个向量。
你可以把它理解为:
把大语言模型中间的「语义理解能力」抽出来,专门用来做向量检索。
使用大语言模型,可以上 晨涧云AI算力平台 直接租用算力,简单高效。
六、小结:Token 和 Embedding 是大模型世界的「底层共识」
回到开头的三个问题,我们可以简单总结一下:
- 为什么大模型处理的是 Token 而不是文字?
- 因为字符级处理太低效
- Token 作为「词 / 词片编号」能大幅提高训练和推理效率
- 为什么必须有 Embedding?
- 模型是连续函数,需要在连续空间里理解和计算
- 单个整数无法表达复杂语义关系,必须映射到高维向量空间
- 大模型里的 Embedding 和 RAG 里的 Embedding 是一回事吗?
- 架构相似,都是「用向量表示文本」
- 但训练目标不同:
- 一个服务于预测下一个 Token
- 一个服务于「语义相似就靠得近」的检索需求
理解这两个概念,不会让你瞬间能写出一个 GPT-5。
但它能帮你从「把大模型当黑盒」
变成「至少知道盒子底下大致是怎么运转的」。
在大模型和向量检索越来越普及的今天,
Token 和 Embedding 已经成了 AI 时代的基础素养之一。