Token、上下文窗口与注意力:模型到底看到了什么

# Token、上下文窗口与注意力:模型到底看到了什么

本篇目标

理解文本怎样变成 Token、上下文窗口装了什么,以及注意力机制为什么既能建立联系又会消耗计算资源。

认识 Token计算上下文预算理解注意力避免无效长上下文

# 先记住一句话

模型读取的不是字符和单词,而是 Token;上下文窗口是一次生成能够处理的 Token 总预算,放入更多内容会挤占输出空间,也可能带来更多噪声。

# Token 是什么

Token 是 Tokenizer(分词器)把文本切分后得到的模型输入单位。它可能是一个单词、单词的一部分、一个汉字、标点或空白片段,具体切法由模型使用的分词器决定。

原始文本
  ↓ Tokenizer 按词表切分
Token 序列
  ↓ 转成 Token ID
数字序列
  ↓ 查找向量表示
模型可以处理的输入
1
2
3
4
5
6
7

不能假设:

  • 1 个中文字符永远等于 1 个 Token;
  • 1 个英文单词永远等于 1 个 Token;
  • 字符数、字节数和 Token 数可以直接互换;
  • 不同模型一定使用相同的分词结果。

生产系统如果需要精确预算,应使用目标模型对应的 Tokenizer 或提供方计数接口。按字符数估算只能作为粗略保护,不能作为精确计费依据。

# 上下文窗口装了什么

上下文窗口(Context Window)是模型一次请求能够处理的 Token 总量。它通常包括:

  • Developer 或 System Instructions;
  • 用户输入和历史消息;
  • RAG 检索到的资料;
  • 工具定义及工具返回结果;
  • 图片等输入转换后的计量内容;
  • 模型本次生成需要使用的输出预算;
  • 部分模型内部使用的推理 Token。

可以先用下面的关系理解:

上下文总预算
= 固定指令
+ 当前输入
+ 历史消息
+ 检索资料和工具结果
+ 预留输出
+ 模型可能需要的内部推理空间
1
2
3
4
5
6
7

不同提供方和模型对内部推理 Token、缓存 Token 和多模态输入的计量方式不同,实际费用与限制应查看对应模型文档和返回的 Usage。

# 为什么不能把所有资料都塞进去

更长的上下文可以提供更多信息,但不等于答案一定更好:

  • 无关内容会稀释真正重要的证据;
  • 相互冲突的资料会增加判断难度;
  • 输入越长,延迟和费用通常越高;
  • 关键内容可能被埋在中间,模型未必稳定利用;
  • 超出窗口后,请求可能失败或被截断。

正确目标不是 “尽量塞满” ,而是在预算内给模型足够、相关、可信且排列清楚的信息。

# 注意力机制在做什么

注意力(Attention)让序列中的每个位置根据当前任务,动态关注其他位置。它不是给每个词永久标记一个固定重要度,而是在不同上下文中重新计算关联。

例如 “苹果发布了新系统,它增加了隐私功能” 中,“它” 更应该关注 “新系统” 而不是 “苹果” 这个词本身。模型会根据 Query、Key 和 Value 计算哪些位置与当前位置更相关,再汇总信息。

当前 Token 的 Query:我现在要找什么
其他 Token 的 Key:我能用什么特征被匹配
其他 Token 的 Value:匹配后我能提供什么信息
1
2
3

经典自注意力需要比较序列中的许多位置,序列增长会明显增加计算量。现代模型可能使用稀疏注意力、滑动窗口、KV Cache 等优化,但长上下文仍然不是免费的。

# KV Cache 是什么

自回归生成时,模型每生成一个新 Token 都需要参考前文。KV Cache 会保存前面 Token 在各层已经计算出的 Key 和 Value,避免每一步从头重复计算。

它能加快生成,但会占用显存或内存,而且上下文越长、并发越高,占用通常越大。因此服务端的并发容量不仅受模型参数影响,也受上下文长度和输出长度影响。

# 上下文应该怎样裁剪

推荐按照信息价值处理,而不是机械删除最早消息:

  1. 永远保留当前任务和关键约束;
  2. 保留完成任务所需的最近状态;
  3. 检索真正相关的原文,而不是装入整个知识库;
  4. 将较早对话压缩成可验证摘要,并保留关键事实来源;
  5. 丢弃重复、过期和纯寒暄内容;
  6. 给输出和失败重试预留空间。

如果自动截断会改变业务含义,应主动返回 “上下文过长” 并要求缩小范围,不能悄悄删除权限规则或关键条件。

# 项目中的预算方式

一个摘要接口可以先分配固定预算:

内容 处理方式
稳定 Instructions 固定上限并版本化
用户文章 超长时分段摘要,不从字节中间截断
历史消息 只保留与当前任务相关的部分
检索证据 按相关性和权限筛选
输出 根据摘要长度明确预留

同时记录实际输入 Token、输出 Token、截断原因和模型名称,才能判断预算是否合理。

# 高频面试题与回答

1. Token 和字符有什么区别?参考答案

字符是人看到的文本单位,Token 是模型分词器产生的输入单位。一个 Token 可能对应一个字符、一个词或词的一部分,不同模型的分词方式也可能不同,所以字符数不能直接当作精确 Token 数。

2. 上下文窗口只计算用户输入吗?参考答案

不是。它还包括系统或开发者指令、历史消息、检索资料、工具定义和返回结果,以及需要预留的输出空间。部分推理模型还会使用内部推理 Token,具体计量要看模型文档和 Usage。

3. 上下文越长,效果一定越好吗?参考答案

不一定。无关或冲突内容会增加噪声,长输入还会提高延迟和费用。工程上应保留当前目标、关键约束和最相关证据,对历史做筛选或压缩,并用评测验证不同预算下的质量。

4. KV Cache 有什么作用?参考答案

它缓存前文 Token 已经计算出的 Key 和 Value,使模型生成下一个 Token 时不必重复计算全部前缀。这样能加快生成,但会占用显存或内存,长上下文和高并发会放大这部分资源开销。

# 接下来学什么

下一篇学习 Transformer 与模型生成过程,把 Token、注意力和逐 Token 生成串成一条完整链路。

# 参考资料