Token 和 Embedding:大语言模型看世界的方式

梳理了大语言模型中的 Token 和 Embedding 概念,解释模型为何先通过 Tokenizer 将文本转为离散编号,再用 Embedding 将编号映射到高维向量空间。对比语言模型内部的 Token Embedding 与 RAG 场景中的文本 Embedding,说明二者在架构相似但训练目标和用途不同。

Token 和 Embedding

很多人第一次接触大语言模型时,都会有类似的困惑:

  • 我明明输入的是「文字」,模型为什么老在说自己处理的是 Token
  • 为什么每个模型架构图里都有一块叫 Embedding 的东西?
  • RAG 里也有 Embedding,它和大模型里的 Embedding 是一回事吗?

这些词听上去有点抽象,但它们其实对应的是非常具体的工程方案。

本文尝试用尽量直白的方式,把 Token 和 Embedding 这两个概念讲清楚。


一、大模型为什么不直接处理「文字」?

在和 ChatGPT 这类模型聊天时,我们都是直接敲文字。

但在计算机里,文字被存储成一个个离散的字符:

  • "Apple" 其实是 5 个字符:A p p l e
  • 每个字符在底层是一个编码值(比如 UTF-8)

如果你把「字符」直接丢给模型,会出现两个问题:

  1. 效率极低

模型得先学会:

  • 字母 a p p l e → 单词 "apple"
  • "apple" → 「苹果」这个概念

再把这个概念用于后续推理。

算力有限的情况下,这样太浪费。

  1. 表达能力差

对中文尤其明显:一个汉字通常占用多个字节,字符级别的拆分既冗长又不直观。

于是,人们给大模型做了一个「词典」,

用整数编号代表更高层次的单位——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

它主要做两件事:

  1. 把字符串切成词或词片
  2. 给每个词片分配一个编号

常见的 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 层:

  1. 把 Token 做成 one-hot 向量
  • 每个 Token 变成长度为 50257 的向量
  • 对应位置是 1,其他位置是 0
  1. 乘以一个线性层(矩阵)
  • 这个线性层可以理解为一个大小为 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 是大模型世界的「底层共识」

回到开头的三个问题,我们可以简单总结一下:

  1. 为什么大模型处理的是 Token 而不是文字?
  • 因为字符级处理太低效
  • Token 作为「词 / 词片编号」能大幅提高训练和推理效率
  1. 为什么必须有 Embedding?
  • 模型是连续函数,需要在连续空间里理解和计算
  • 单个整数无法表达复杂语义关系,必须映射到高维向量空间
  1. 大模型里的 Embedding 和 RAG 里的 Embedding 是一回事吗?
  • 架构相似,都是「用向量表示文本」
  • 但训练目标不同:
  • 一个服务于预测下一个 Token
  • 一个服务于「语义相似就靠得近」的检索需求

理解这两个概念,不会让你瞬间能写出一个 GPT-5。

但它能帮你从「把大模型当黑盒」

变成「至少知道盒子底下大致是怎么运转的」。

在大模型和向量检索越来越普及的今天,

Token 和 Embedding 已经成了 AI 时代的基础素养之一。

阅读更多