上下文预算:给模型输出预留空间
把检索片段一直追加到提示词里,可能在提交请求时超过上下文限制。只检查用户输入长度,会忽略系统指令、历史对话和输出预留。
▶ 本文含视频讲解▶ 教学视频手动播放 · 英语讲解
Intro to Large Language Models
结合模型讲解理解本文实验的背景;正文提供可独立运行的简化示例。此为外部原版课程,多篇笔记可能共用;未剪辑为本文专属视频。
播放器需要能访问 YouTube 的网络;若这里无法加载,可打开原视频。本文与本地图解仍可独立阅读。
问题从哪里出现
把检索片段一直追加到提示词里,可能在提交请求时超过上下文限制。只检查用户输入长度,会忽略系统指令、历史对话和输出预留。
理解核心机制
预算应覆盖全部输入组成,再根据所用模型的限制预留输出空间。下面直接使用假设已计数的 token 数演示预算账本,不把字符数或空格分词当作真实 tokenizer。
动手做一个小实验
Python 3.11 或更新版本,仅使用标准库;将示例保存为 demo.py 后执行 python3 demo.py。数字与样本均为教学演示,不代表真实模型或服务器的测量结果。
context_limit = 8192
parts = {"instructions": 400, "history": 2200, "question": 120}
reserved_output = 1200
remaining = context_limit - sum(parts.values()) - reserved_output
chunks = [800, 950, 1200, 1600]
selected = []
for size in chunks:
if size <= remaining:
selected.append(size)
remaining -= size
assert sum(parts.values()) + sum(selected) + reserved_output <= context_limit
print(selected, remaining)适用边界与常见误区
这些数字是教学输入,不是模型实测值。真实系统要用对应 tokenizer 和消息格式计数,并检查模型是否另有输入或输出上限。填满窗口也不保证模型有效利用全部信息。
继续练习
把历史记录增大一倍,比较删除最旧对话、摘要历史和减少检索片段的效果,并保留问题与关键约束。