Token、上下文窗口与注意力:模型到底看到了什么
# Token、上下文窗口与注意力:模型到底看到了什么
理解文本怎样变成 Token、上下文窗口装了什么,以及注意力机制为什么既能建立联系又会消耗计算资源。
# 先记住一句话
模型读取的不是字符和单词,而是 Token;上下文窗口是一次生成能够处理的 Token 总预算,放入更多内容会挤占输出空间,也可能带来更多噪声。
# Token 是什么
Token 是 Tokenizer(分词器)把文本切分后得到的模型输入单位。它可能是一个单词、单词的一部分、一个汉字、标点或空白片段,具体切法由模型使用的分词器决定。
原始文本
↓ Tokenizer 按词表切分
Token 序列
↓ 转成 Token ID
数字序列
↓ 查找向量表示
模型可以处理的输入
2
3
4
5
6
7
不能假设:
- 1 个中文字符永远等于 1 个 Token;
- 1 个英文单词永远等于 1 个 Token;
- 字符数、字节数和 Token 数可以直接互换;
- 不同模型一定使用相同的分词结果。
生产系统如果需要精确预算,应使用目标模型对应的 Tokenizer 或提供方计数接口。按字符数估算只能作为粗略保护,不能作为精确计费依据。
# 上下文窗口装了什么
上下文窗口(Context Window)是模型一次请求能够处理的 Token 总量。它通常包括:
- Developer 或 System Instructions;
- 用户输入和历史消息;
- RAG 检索到的资料;
- 工具定义及工具返回结果;
- 图片等输入转换后的计量内容;
- 模型本次生成需要使用的输出预算;
- 部分模型内部使用的推理 Token。
可以先用下面的关系理解:
上下文总预算
= 固定指令
+ 当前输入
+ 历史消息
+ 检索资料和工具结果
+ 预留输出
+ 模型可能需要的内部推理空间
2
3
4
5
6
7
不同提供方和模型对内部推理 Token、缓存 Token 和多模态输入的计量方式不同,实际费用与限制应查看对应模型文档和返回的 Usage。
# 为什么不能把所有资料都塞进去
更长的上下文可以提供更多信息,但不等于答案一定更好:
- 无关内容会稀释真正重要的证据;
- 相互冲突的资料会增加判断难度;
- 输入越长,延迟和费用通常越高;
- 关键内容可能被埋在中间,模型未必稳定利用;
- 超出窗口后,请求可能失败或被截断。
正确目标不是 “尽量塞满” ,而是在预算内给模型足够、相关、可信且排列清楚的信息。
# 注意力机制在做什么
注意力(Attention)让序列中的每个位置根据当前任务,动态关注其他位置。它不是给每个词永久标记一个固定重要度,而是在不同上下文中重新计算关联。
例如 “苹果发布了新系统,它增加了隐私功能” 中,“它” 更应该关注 “新系统” 而不是 “苹果” 这个词本身。模型会根据 Query、Key 和 Value 计算哪些位置与当前位置更相关,再汇总信息。
当前 Token 的 Query:我现在要找什么
其他 Token 的 Key:我能用什么特征被匹配
其他 Token 的 Value:匹配后我能提供什么信息
2
3
经典自注意力需要比较序列中的许多位置,序列增长会明显增加计算量。现代模型可能使用稀疏注意力、滑动窗口、KV Cache 等优化,但长上下文仍然不是免费的。
# KV Cache 是什么
自回归生成时,模型每生成一个新 Token 都需要参考前文。KV Cache 会保存前面 Token 在各层已经计算出的 Key 和 Value,避免每一步从头重复计算。
它能加快生成,但会占用显存或内存,而且上下文越长、并发越高,占用通常越大。因此服务端的并发容量不仅受模型参数影响,也受上下文长度和输出长度影响。
# 上下文应该怎样裁剪
推荐按照信息价值处理,而不是机械删除最早消息:
- 永远保留当前任务和关键约束;
- 保留完成任务所需的最近状态;
- 检索真正相关的原文,而不是装入整个知识库;
- 将较早对话压缩成可验证摘要,并保留关键事实来源;
- 丢弃重复、过期和纯寒暄内容;
- 给输出和失败重试预留空间。
如果自动截断会改变业务含义,应主动返回 “上下文过长” 并要求缩小范围,不能悄悄删除权限规则或关键条件。
# 项目中的预算方式
一个摘要接口可以先分配固定预算:
| 内容 | 处理方式 |
|---|---|
| 稳定 Instructions | 固定上限并版本化 |
| 用户文章 | 超长时分段摘要,不从字节中间截断 |
| 历史消息 | 只保留与当前任务相关的部分 |
| 检索证据 | 按相关性和权限筛选 |
| 输出 | 根据摘要长度明确预留 |
同时记录实际输入 Token、输出 Token、截断原因和模型名称,才能判断预算是否合理。
# 高频面试题与回答
1. Token 和字符有什么区别?参考答案
字符是人看到的文本单位,Token 是模型分词器产生的输入单位。一个 Token 可能对应一个字符、一个词或词的一部分,不同模型的分词方式也可能不同,所以字符数不能直接当作精确 Token 数。
2. 上下文窗口只计算用户输入吗?参考答案
不是。它还包括系统或开发者指令、历史消息、检索资料、工具定义和返回结果,以及需要预留的输出空间。部分推理模型还会使用内部推理 Token,具体计量要看模型文档和 Usage。
3. 上下文越长,效果一定越好吗?参考答案
不一定。无关或冲突内容会增加噪声,长输入还会提高延迟和费用。工程上应保留当前目标、关键约束和最相关证据,对历史做筛选或压缩,并用评测验证不同预算下的质量。
4. KV Cache 有什么作用?参考答案
它缓存前文 Token 已经计算出的 Key 和 Value,使模型生成下一个 Token 时不必重复计算全部前缀。这样能加快生成,但会占用显存或内存,长上下文和高并发会放大这部分资源开销。
# 接下来学什么
下一篇学习 Transformer 与模型生成过程,把 Token、注意力和逐 Token 生成串成一条完整链路。