🧠AI LLM 基础
Token与上下文窗口
面试回答
常见问法
为什么 AI 系统里大家总在说 token、上下文窗口和截断?
回答
因为大模型真正处理的不是“字符”或“单词”,而是 token。上下文窗口决定一次请求里模型最多能看到多少 token,这会直接影响:
- 能塞多少历史消息和资料
- 请求成本
- 首字延迟和整体时延
- RAG 拼接策略和缓存策略
上下文窗口不是越大越好。窗口越大,成本和延迟通常越高,长上下文里还可能出现注意力稀释,导致真正关键的信息反而不突出。
def trim_messages(messages, max_tokens, tokenizer):
kept = []
total = 0
for msg in reversed(messages):
tokens = len(tokenizer.encode(msg["content"]))
if total + tokens > max_tokens:
break
kept.append(msg)
total += tokens
return list(reversed(kept))
追问
- 为什么同样一段话在不同模型里 token 数不一样
- 上下文窗口和输出 token 是如何一起计费的
- 为什么“都放进去”不一定比“挑重点”效果好
原理展开
token 可以理解为模型内部的文本切分单元。不同模型的 tokenizer 不同,所以同一句话在不同模型上的 token 数量可能不同。
工程里高频问题有三个:
- 历史太长,必须裁剪
- RAG 返回太多 chunk,塞不下
- 输出长度过长,超成本或超时
所以系统层常见动作是:
- 保留最近轮次
- 历史做摘要
- 对检索结果做 rerank 和压缩
- 给输出设置上限
面试里最好讲成一句完整链路: “token 是模型的计费和容量单位,上下文窗口是系统设计约束,不只是模型参数说明书。”
易错点
- 把上下文窗口当成绝对能力上限,而不看有效利用率
- 只关心输入 token,不关心输出 token
- 长对话里无脑保留全量历史
记忆技巧
记住三件事:
- token = 模型处理和计费的基本单位
- 窗口 = 一次请求能看到多少内容
- 裁剪 = AI 系统的必选工程动作