🧠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 数量可能不同。

工程里高频问题有三个:

  1. 历史太长,必须裁剪
  2. RAG 返回太多 chunk,塞不下
  3. 输出长度过长,超成本或超时

所以系统层常见动作是:

  • 保留最近轮次
  • 历史做摘要
  • 对检索结果做 rerank 和压缩
  • 给输出设置上限

面试里最好讲成一句完整链路: “token 是模型的计费和容量单位,上下文窗口是系统设计约束,不只是模型参数说明书。”

易错点

  • 把上下文窗口当成绝对能力上限,而不看有效利用率
  • 只关心输入 token,不关心输出 token
  • 长对话里无脑保留全量历史

记忆技巧

记住三件事:

  1. token = 模型处理和计费的基本单位
  2. 窗口 = 一次请求能看到多少内容
  3. 裁剪 = AI 系统的必选工程动作