AI · AI基础
AI的token和上下文窗口是什么?
简短回答
token 是语言模型读写文字的基本单位:可能是一个完整的短词、长词的一部分、一个标点,或几个字符。上下文窗口(context window)是模型一次最多能处理的 token 数,你的指令、聊天记录、附带的文件和它写出的回答都要算进去。超出上限,较早的内容会被丢弃,或者请求直接失败。
token长什么样
语言模型读的不是字母,也不是完整的词。分词器(tokenizer)先按固定词表把文本切成片段,每个片段变成一个数字,模型从头到尾只看得到这些数字。
下面的例子用 OpenAI 开源的分词库 tiktoken 计数,编码为 o200k_base。其他模型用的分词器不同,计数会有差别,但规律相似。
| 文本 | token数 | 切分方式 |
|---|---|---|
| The cat sat on the mat. | 7 | The | cat | sat | on | the | mat | . |
| Tokenization is surprisingly unintuitive. | 7 | Token | ization | is | surprisingly | unint | uitive | . |
| unbelievable | 3 | un | bel | ievable |
| strawberry | 3 | st | raw | berry |
| 2026-11-02 | 6 | 202 | 6 | - | 11 | - | 02 |
| ChatGPT | 2 | Chat | GPT |
| 我喜欢吃苹果。 | 5 | 我 | 喜欢 | 吃 | 苹果 | 。 |
常见词通常是单个 token,一般连前面的空格一起算。生僻词或长词会被拆开。数字和日期的切法与它们的含义并不对应,这是模型算错数的原因之一。而 strawberry 是以三块的形式送进去的,所以模型从来没有直接看到过里面有几个字母 r。
为什么模型用子词token
如果词表里全是完整的词,会大得惊人,而且仍然装不下新词、人名和错别字。如果词表只有单个字符,每段文字都会变得很长。子词 token 是两者之间的折中。
如今大多数分词器使用字节对编码(byte pair encoding,BPE)或与它相近的方法:从单个字节或字符出发,不断把训练文本中出现最频繁的相邻一对合并成新的 token。合并很多轮后,高频词变成单个 token,而生僻词仍能用更小的片段拼出来,所以不存在词表之外的词。
每个模型系列都有自己训练的分词器,同一句话在不同模型里的计数不同。token 数适合用来估算和做预算,并不是通用的单位。
同一句话,不同语言的token数
分词器主要是用训练数据里最常见的语言训练出来的。数据较少或文字体系不同的语言,表达同样的意思往往需要更多 token。下面是同一条指令,Please summarize this article in three bullet points(请用三个要点总结这篇文章),翻译后分别用较早的分词器 cl100k_base 和较新的 o200k_base 计数的结果:
| 语言 | 字符数 | token数(cl100k_base) | token数(o200k_base) |
|---|---|---|---|
| 英语 | 53 | 9 | 9 |
| 西班牙语 | 36 | 7 | 7 |
| 中文(简体) | 13 | 13 | 10 |
| 日语 | 20 | 15 | 12 |
| 韩语 | 24 | 19 | 13 |
| 越南语 | 42 | 21 | 14 |
有两点值得注意。词表更大的新分词器,对中文、日文、韩文和越南语的效率高得多。但即便如此,在这个例子里,这些语言表达同样的意思所用的 token 仍比英语多。API 价格和上下文上限都以 token 计,所以同一个任务在某些语言里可能更贵,也更快占满窗口。
上下文窗口是什么
上下文窗口是模型处理一次请求时的工作记忆,与模型在训练中学到的东西是两回事。模型写出回答所能用到的一切内容都必须放进窗口,回答本身也要算在内。
在聊天应用里,每发一条新消息,都会连同之前的整段对话一起发出去,所以聊得越久,窗口越满。一次典型的请求里,下面这些都算:
- 系统提示词,即应用或开发者设置的隐藏指令。
- 对话中之前每一条用户消息和助手回复。
- 附带的文档、粘贴的文字、图片以及从中提取的文字。
- 工具定义和工具返回的结果,比如联网搜索的结果。
- 新的回答,包括模型在回答前写出的隐藏推理(thinking)token。
各个模型的窗口大小差别很大,而且经常变化:就目前而言,小型本地模型只有几千个 token,一些大型云端模型则达到一百万或更多。请查看你所用模型的文档。
窗口满了会怎样
不同产品处理上限的方式不一样:
| 情形 | 通常的结果 | 你会看到什么 |
|---|---|---|
| API 请求超过窗口大小 | 请求被拒绝并报错 | 提示词过长的错误信息 |
| 回答达到输出上限 | 生成提前停止 | 回复停在半句话或列表中间 |
| 应用里的长对话 | 最早的几轮被丢掉或换成摘要 | 助手忘了开头的细节 |
| 很长但仍在窗口内的上下文 | 模型保留全部内容,但利用得更差 | 长输入中间的事实被漏掉 |
最后一行在日常使用中最重要。研究发现,模型对长输入开头和结尾的信息,利用得往往比中间的好。模型服务商也指出,token 数增长后,准确率和召回率可能下降。窗口大能让你放进更多内容,但不保证模型能把这些内容都用好。
如何估算和节省token
- 先估算。英文用词数乘以约 1.3;中文或日文数字符,用较新的分词器大致每字符一个 token 或略少。字数统计工具,比如 cv.cm 的字数统计,能很快给出字数和字符数。
- 需要精确时再准确计数。用你所调用模型的分词器或 token 计数接口,因为不同模型的计数不同。
- 只发需要的内容。粘贴文档的相关部分,而不是整份文件,并删掉重复的页眉、页脚和套话。
- 把关键指令放在长提示词的开头或结尾,不要埋在中间。
- 换话题就开新对话。旧消息会一直占用空间,还可能干扰模型。
- 给回答留出空间。如果输入几乎占满窗口,回复会很短,或被截断。
- 长任务可以让模型先总结到目前为止的决定,然后带着这份摘要,在新对话里接着做。
常见误区
- 把token当成词。一份1,000词的文档不等于1,000个 token,在许多语言里要多得多。
- 以为模型读完了所有内容。即使在窗口之内,长输入中间的细节也可能被忽略。可以让模型引用它所依据的原文段落。
- 指望跨对话的记忆。新对话从空窗口开始,除非应用把保存的笔记插进来。
- 忘了隐藏内容。系统提示词、工具定义和推理 token 虽然你看不到,也会占用窗口。
- 直接比较不同模型的上限。一个模型的10万 token 和另一个模型的10万 token,因为分词器不同,能装下的文字量也不同。
常见问题
1000个英文单词是多少token?
对普通英文散文,用常见的现代分词器,大约是 1,200 到 1,300 个 token。代码、数字、网址和许多非英语语言需要更多。
空格和标点算token吗?
算。标点通常单独成一个 token,单个空格一般并入后面那个词的开头。多余的空格、换行和缩进会增加 token。
图片也占token吗?
占。支持图片输入的模型会把每张图转换成若干 token,计入上下文窗口。图片越大、越精细,通常占得越多,具体规则因模型而异。
为什么 ChatGPT 或其他聊天机器人会忘记我之前说的话?
对话很长时,应用可能为了留在上下文窗口内,丢掉或概括较早的消息。即使旧消息还在,模型对它们的关注也可能变少。重复关键信息,或者带着一份简短摘要开新对话,会有帮助。
上下文窗口越大越好吗?
不一定。窗口大可以放进更多材料,但成本更高,还可能让模型变慢,对细节也不够精准。发送更短、精心挑选过的上下文,往往能得到更好的回答。