跳转至

Token、Embedding 与上下文窗口

你有没有想过:当你给 ChatGPT 发一句"你好世界",它看到的并不是这四个汉字,而是另外一些东西?

LLM 不会直接"读"文字。它需要先把你输入的文本切成一块一块(Token),再把每一块变成一串数字(Embedding),然后在有限的记忆长度里处理这些信息(上下文窗口)。这三个概念——Token、Embedding、上下文窗口——是理解 LLM "怎么看文字"的关键。掌握它们,你就能解释清楚为什么同样的文字在不同模型里收费不同,为什么 LLM 能"理解"语义,以及为什么它有时候会"忘掉"你之前说过的话。

这三个概念解决什么问题

在深入定义之前,先说说它们各自回答了什么疑问:

问题 答案
为什么中文调用 API 比英文贵? 因为 Token 的切分方式不同,同样的意思中文消耗更多 Token
LLM 怎么"理解"一句话的意思? 通过 Embedding,把文字变成数学空间里的坐标,意思相近的离得近
为什么聊到后面模型会"忘掉"开头? 因为上下文窗口有上限,超出的部分模型"看不见"

这三个概念贯穿了 LLM 处理文字的整个流程。接下来逐个拆开讲。

Token:LLM 处理文本的最小单位

Token(词元) 是 LLM 处理文本的最小单位。它不是字,不是词,也不是字节——而是模型用特定算法切出来的"片段"。

可以把它想象成拼图块:一段话被切成若干块,每块就是一个 Token。模型不认识汉字或字母,它只认识这些块的编号。

同一个文本,不同模型切法不同

这是最让人意外的一点:同样的文字,在不同模型的 tokenizer(分词器)里,切出来的 Token 数可能完全不同。

以 "你好世界" 为例:

模型 Token 数 切分结果
GPT-4(cl100k_base) 5 个 ['你', '好', <乱码字节>, <乱码字节>, '界']
GPT-4o(o200k_base) 2 个 ['你好', '世界']

看到区别了吗?GPT-4o 因为训练了更好的 tokenizer,能把常见中文词合并成更少的 Token。而 GPT-4 面对同样的文字,反而要把某些字拆成 UTF-8 字节,切出更多块。

再看几个实际例子(基于 GPT-4o 的 tokenizer):

文本 Token 数 切分结果
Hello world 2 个 ['Hello', ' world']
人工智能 2 个 ['人工', '智能']
Artificial Intelligence 2 个 ['Artificial', ' Intelligence']
深度学习 3 个 ['深', '度', '学习']
unbelievable 3 个 ['un', 'bel', 'ievable']

中英文 Token 效率差异

从上面的例子能看出一个规律:中文通常比英文"费 Token"。

这不是歧视,而是技术原因:

  • 英文只有 26 个字母,高频组合(如 "ing"、"tion")可以被编码为单个 Token
  • 汉字有几万个,模型无法为每个字单独编码,常见做法是每个字或常用词作为一个 Token

实际经验值(以 GPT-4o 为例):

语言 1 个 Token 约等于
英文 0.75 个单词,或 4 个字符
中文 1~2 个汉字
代码 1~3 个字符

这意味着:同样表达一个意思,中文文本通常比英文多消耗 30%~50% 的 Token。而 API 是按 Token 计费的,所以中文调用成本更高。

Token 为什么重要

理解 Token 对你来说有三个实际意义:

  1. 计费:API 按输入 Token + 输出 Token 收费,Token 越多越贵
  2. 长度限制:上下文窗口的上限是按 Token 算的,不是按字数
  3. 模型看到的"真相":模型并不认识"苹果"这两个字,它认识的是 Token 编号。如果你发现模型对某些词反应奇怪,可能是因为它被切成了你不预期的方式

Embedding:把文字变成数字向量

计算机不懂"快乐"是什么意思,它只懂数字。那怎么让计算机也能判断"快乐"和"高兴"意思相近?

Embedding(嵌入/向量表示) 就是干这件事的:它把一段文字映射成一个高维空间里的数字向量,让语义相近的文字在空间里离得近,语义无关的文字离得远。

一个直观的比喻

想象一个巨大的地图,上面有无数个城市:

  • "北京"、"上海"、"广州" 都是中国城市,所以在地图的"中国区域"里聚成一团
  • "纽约"、"伦敦"、"巴黎" 都是国际大都市,它们在另一个区域
  • "苹果(水果)"和 "香蕉" 在"水果区"
  • "苹果(公司)"和 "谷歌"、"微软" 在"科技公司区"

Embedding 做的就是:给每个词或每句话在地图上找一个坐标。这个地图不是二维的,而是几百维甚至几千维的(比如 OpenAI 的 text-embedding-3-small 是 1536 维,text-embedding-3-large 是 3072 维)。

具体例子

假设用 Embedding 模型处理以下句子,得到的向量在空间中大致是这样的关系:

  • "猫坐在垫子上" 和 "一只小猫趴在毯子上" → 距离很近(意思相近,用词不同)
  • "猫坐在垫子上" 和 "量子计算取得了突破" → 距离很远(完全无关)
  • "退款"、"退货"、"还钱"、" reimburse" → 距离较近(语义相关,甚至跨语言)

这就是 Embedding 的魔力:它捕捉的是语义,而不是字面。你不需要告诉模型"小猫"和"猫"是近义词,它从海量文本训练中就学会了这件事。

Embedding 在 LLM 内部的作用

Embedding 不只是外部工具,它是 LLM 处理文字的第一步:

Mermaid Diagram

当你输入一句话时,模型先把每个 Token 查表转换成对应的 Embedding 向量,然后再交给后续的网络层去处理。这个"查表"过程,本质上是把离散的文字符号变成了连续的数学表示,模型才能在上面做加减乘除。

上下文窗口:LLM 的短期记忆上限

上下文窗口(Context Window) 是 LLM 一次能处理的 Token 总数上限。你可以把它理解为模型的"短期记忆长度"。

它到底限制什么

上下文窗口限制的不是你输入的字数,而是输入 + 输出的总 Token 数。

举个例子:

某模型的上下文窗口是 128K Token。你输入了一篇 100K Token 的长论文,让模型总结。模型最多只能再输出 28K Token。如果你要求输出 30K Token,模型要么中途截断,要么报错。

常见模型的上下文窗口大小:

模型 上下文窗口
GPT-4 128K Token
Claude 3.5 Sonnet 200K Token
Gemini 1.5 Pro 128K~1M Token
DeepSeek-V3 128K Token

上下文窗口的实际影响

上下文窗口小,会带来三个问题:

  1. 长文档处理受限:一本 10 万字的书,可能超过上下文窗口,模型读不完
  2. 多轮对话"失忆":聊了几十轮后,最早的对话可能被挤出窗口,模型"忘记"了前面的设定
  3. 成本上升:为了处理长文本,你需要用支持更大窗口的模型,通常也更贵

Mermaid Diagram

三者关系:一张图理清

Token、Embedding、上下文窗口不是孤立的概念,它们组成了 LLM "理解"文字的完整流水线:

Mermaid Diagram

  • Token 是输入单元:文字被切成的最小块
  • Embedding 是内部表示:Token 被翻译成的数字语言
  • 上下文窗口是处理上限:模型一次能"看"多少 Token,决定了它能处理多长的输入和输出

常见误区

误区 1:1 个汉字 = 1 个 Token

不一定。在 GPT-4o 的 tokenizer 里,"你好世界"是 2 个 Token,但"我爱北京天安门"是 6 个 Token。而且不同模型的 tokenizer 切法完全不同,不能用字数估算 Token 数。

误区 2:Embedding 就是把文字翻译成数字

不完全对。Embedding 不是简单的"编码"(比如 A=1, B=2),而是语义向量。它的目标是让意思相近的文字在数学空间里离得近。如果只是编码,"快乐"和"悲伤"可能只相差一个数字;但在 Embedding 空间里,它们会相距很远。

误区 3:上下文窗口越大越好

越大确实能处理更长的文本,但代价也很明显:

  • 更贵:长上下文意味着更多的计算量,API 费用更高
  • 更慢:处理 128K Token 比处理 4K Token 慢得多
  • 注意力稀释:窗口太大时,模型可能对中间信息的关注度下降(俗称"中间迷失")

实际使用中,够用就好。如果你只是问几个短问题,没必要用 128K 窗口的模型。

误区 4:Token 切分对模型理解没有影响

有影响。如果一个词被切成了不合理的碎片,模型理解起来会更困难。比如早期的 tokenizer 把某些中文字拆成字节,模型需要先"拼"回字才能理解,这会增加认知负担。

延伸阅读

练习题

实验 1:用在线 tokenizer 观察切分差异

找一个在线 tokenizer 工具(搜索 "OpenAI Tokenizer" 或 "tiktoken 在线"),输入以下文字,观察不同模型(如 GPT-4 和 GPT-4o)的切分结果:

  1. "你好世界"
  2. "unbelievable"
  3. "深度学习"
  4. 复制一段你自己的日常对话

记录:中文和英文哪个 Token 效率更高?同一个词在不同模型中切分是否一致?

思考题

  1. 如果你要用 LLM 处理一本 20 万字的小说,但模型上下文窗口只有 128K Token,你该怎么办?
  2. 为什么 Embedding 能让"退款"和"return policy"在向量空间里离得很近,即使它们是完全不同的语言?