Skip to content
简体中文

切换主题

Transformer 与大模型原理

Token 与 Embedding:大模型如何把文字变成数字

进阶 15 分钟 适合: 初学者 / 开发者 / 研究者

本课要点

  • ▸大模型读写的单位是 token:常见词、词片段或字节,由 BPE 之类的算法决定。
  • ▸上下文窗口、价格和速度都按 token 计算;同样的内容,用不同语言写,token 数可能差很多。
  • ▸每个 token 编号对应一个 Embedding:由几百到上万个数字组成、在训练中学出来的向量。
  • ▸在 Embedding 空间里,意思相近的内容彼此靠近,这是语义搜索和 RAG 的基础。

为什么不直接用字母或整词?

神经网络只能拿数字计算,所以文字要先变成一串编号。两个直观的方案都行不通:

  • 整词:词表会有几百万项,遇到新词、错别字、人名就不认识。
  • 单个字符:序列变得很长,模型又慢,也更难学到含义。

几乎所有大模型采用的折中方案是子词分词:常见词单独成为一个 token,少见的词拆成几块,最坏情况下退回到原始字节,所以永远不会出现“不认识”的输入。

BPE 怎样建立词表

**字节对编码(BPE)**由 Sennrich 等(2015) 引入神经网络,它从数据中学出词表:

  1. 先把单个字符(或字节)作为初始词表。
  2. 在大量语料里统计所有相邻的两两组合,把出现最多的一对合并成新 token(比如 t + h → th)。
  3. 不断重复,直到词表达到目标大小。

GPT-2 的词表有 50,257 个 token,Meta 的 Llama 3 约 128,000 个。SentencePiece 是一个常用库,直接在原始文本上做 BPE 或类似算法,很适合中文、日文这种没有空格分词的语言。

flowchart LR
  T["“大模型很有趣!”"] --> S["切成 token:'大' '模型' '很' '有趣' '!'"]
  S --> I["token 编号:如 1023, 52144, 3001, 8812, 6"]
  I --> E["查 Embedding 表:每个编号一个向量"]
  E --> M["Transformer 各层"]

(上面的切分和编号仅为示意,每个分词器都不同。)

token 数为什么重要

  • 上下文窗口:“128K 上下文”的模型能同时看到约 128,000 个 token,提示词、文档和回答加在一起算。
  • 费用与速度:API 按输入、输出 token 计费,生成速度用“每秒多少 token”衡量。
  • 语言差异:主要用英文训练的分词器,处理很多其他语言时需要更多 token,同样一段话可能更贵。OpenAI 给出的英文经验值是约 4 个字符一个 token(帮助文档);中文请用实际的分词器去数,比如 tiktoken。
  • 奇怪的失误:模型把 strawberry 看成几个 token,而不是十个字母,这是它数字母、做某些算术时不可靠的原因之一。

Embedding:token 变成向量

分词之后,每个编号会从 Embedding 矩阵里取出一行:一个由几百到上万个数字组成的向量(GPT-3 最大的模型用的是 12,288 维)。一开始这些向量是随机的,训练中反向传播会像调整其他参数一样调整它们,于是在相似语境中出现的 token,向量也会变得相似。

这个思想比大模型更早。word2vec(Mikolov 等,2013)就展示了:从上下文学到的词向量会把关系编码成方向,著名的例子是 国王 − 男人 + 女人 落在 王后 附近。在大模型内部,初始的 token embedding 只是起点:每个 Transformer 层都会根据上下文改写它,所以“苹果”在“吃苹果”和“苹果公司”里,最终的向量并不一样(见 Transformer 与注意力机制)。

向量模型与语义搜索

另一个相关但独立的工具是向量模型(embedding 模型,例如 Sentence-BERT,以及许多商用和开源模型)。它把整句话或整篇文档映射成一个向量,让意思相近的文本彼此靠近,通常用余弦相似度衡量。这样就能按“意思”而不是按关键词搜索,这正是向量数据库和 RAG 的基础。

动手试试

  • 把同一句话分别用中文和英文放进分词器查看工具(OpenAI 提供在线版),对比 token 数。
  • 用 Ollama 或 LM Studio 运行本地模型:两者都会显示每秒 token 数;Ollama 还能运行向量模型,你可以自己算两句话的余弦相似度。

常见问题

一个 token 等于几个字?

OpenAI 给出的经验值是:英文大约 4 个字符、约 3/4 个单词对应一个 token。中文因分词器而异,常见情况是一到两个汉字一个 token,准确数字要用对应模型的分词器去数。

为什么大模型数不清一个单词里有几个字母?

因为它通常把一个单词看成一两个 token,而不是一个个字母。要拼写或数字母,模型得记住每个 token 里面是哪些字母,这一点它往往记得不牢。

大模型里的 token embedding 和“向量模型”有什么区别?

token embedding 是大模型内部的第一层;向量模型(embedding 模型)是另一个独立的模型,把整句话或整篇文档变成一个向量,用于搜索、聚类和 RAG。

本课相关软件

相关 AI 新闻

链接指向原始发布方。

出处与延伸阅读

  1. Sennrich、Haddow、Birch(2015),Neural Machine Translation of Rare Words with Subword Units(BPE)
  2. Kudo & Richardson(2018),SentencePiece
  3. Mikolov 等(2013),Efficient Estimation of Word Representations in Vector Space(word2vec)
  4. OpenAI 帮助中心,What are tokens and how to count them?
  5. OpenAI,tiktoken(BPE 分词器)
  6. Reimers & Gurevych(2019),Sentence-BERT

所属学习路线

数据更新于:学 AI 课程 · 课程相关新闻(北京时间)