上下文窗口是什么
上下文窗口是模型单次请求能容纳的 token 总量,通常按输入与输出合计计算,具体口径各厂商略有差异,以官方文档为准。窗口大小决定了一次能喂进多少资料,但它不是记忆力承诺:超长输入中间部分的信息容易被忽略,即所谓中间迷失现象。窗口内的每个 token 都要计费,所以窗口既是能力边界,也是成本杠杆。
基本信息
| 含义 | 单次请求可处理的 token 上限 |
|---|---|
| 计量单位 | token,不是字符或字数 |
| 常见口径 | 多数厂商按输入加输出合计 |
| 当前水平 | 主流 128K 与 200K 量级,部分模型到百万级 |
| 超出后果 | 请求被拒并返回上下文超限类错误 |
| 成本关系 | 输入与输出都按 token 计费,窗口用得越满越贵 |
不同内容的大致 token 量
| 内容 | 粗略量级 | 说明 |
|---|---|---|
| 一段中文段落 | 百 token 级 | 中文通常每字接近一个 token,英文约每四字符一个 token |
| 一页 A4 文档 | 数百到上千 token | 取决于排版与表格占比 |
| 一本长篇手册 | 十万 token 级 | 整本灌入会迅速吃满普通窗口 |
| 代码文件 | 千到万 token 级 | 缩进与符号会显著增加 token 数 |
| 一张高清截图 | 数百到上千 token | 按分辨率折算,具体折算规则见厂商文档 |
窗口管理的常见做法
- 裁剪历史:多轮对话只保留最近若干轮,丢弃与当前问题无关的旧内容
- 摘要压缩:把早前对话汇总成一段摘要,替代原始消息序列
- 检索替代灌入:长知识库走向量检索取相关片段,而不是整库塞入
- 关键内容前置或后置:指令与核心结论放在头尾,减少被忽略的概率
- 分段处理再汇总:超长文档先分块抽取要点,再基于要点作答
用 tiktoken 实测 token 数
用 tiktoken 实测 token 数
import tiktoken
enc = tiktoken.get_encoding("o200k_base") # 选择与目标模型匹配的编码器
text = "上下文窗口的计量示例:一张表 3 行,共 5 列。"
print(len(enc.encode(text))) # 得到真实 token 数,而不是字数
# 中文与英文混排时按字符估算误差很大,计费与截断判断都要用实测值
# 其他厂商的模型需换用其官方分词工具,编码表并不通用有效上下文小于标称窗口:资料很长时,关键信息放在输入的开头或结尾命中率更高,中间位置最容易丢失。
不要在产品说明里承诺窗口大小等于可记住的信息量:这会把技术参数变成无法兑现的用户预期。