Skip to content

高频面试题

Token 是什么?如何计算和控制 Token 数量?

这道题不是考你会不会背“一个 token 约等于几个字符”,而是考你能否在生产系统里管理成本、上下文和截断风险。

适合阶段:LLM 应用开发核心能力:Token 预算 · 成本控制 · 截断策略

面试官角度分析,想考什么

  • Token 和字符、单词有什么区别?
    考基础概念和 tokenizer 认知。
  • 为什么中文、英文、代码、JSON 的 token 比例不同?
    考是否知道 tokenization 依赖模型和文本类型。
  • 如何避免超过上下文窗口?
    考输入预算、输出预留和截断策略。
  • 如何降低 token 成本?
    考工程优化能力。

可直接抄走的 30 秒参考答案

text
Token 是模型真正处理的文本单位,不等于字符或单词。计算时最好用对应模型的 tokenizer,线上还要记录 API usage。控制 token 不能只靠限制用户字数,而要做整体预算:固定提示词、历史、RAG 文档、工具定义、few-shot 示例和输出空间都要算进去。常见手段是压缩模板、检索相关片段、摘要历史、限制输出并预留 completion 空间。

面试回答详解,知其所以然

Token 不是自然语言里的“字”或“词”,而是 tokenizer 切出来的子词、字符片段、标点或特殊符号。模型看到的是 token id 序列。

1. Token 是什么

text
原始文本 -> tokenizer -> token id 序列 -> embedding -> 模型计算

不同模型使用不同 tokenizer,同一句话在不同模型上的 token 数可能不同。中文、代码、JSON、Markdown、特殊符号和长数字都会影响切分结果。

2. 如何计算 token

  • 最准确:使用对应模型官方或 SDK 提供的 tokenizer。
  • 工程估算:服务端在请求前估算输入 token,并预留输出空间。
  • 日志回传:读取 API 返回的 usage,记录 prompt tokens、completion tokens 和 total tokens。
  • 不要只靠字数:字数适合前端粗提示,不适合作为最终限流依据。

3. Token 预算怎么做

一次调用通常要容纳:

  • system prompt、developer 规则和工具定义。
  • 用户当前输入。
  • 历史消息或摘要。
  • RAG 检索片段和引用。
  • few-shot 示例。
  • 模型输出空间。
text
总窗口 >= 固定前缀 + 动态上下文 + 用户输入 + 预留输出

如果不预留输出空间,模型可能生成到一半被截断,破坏 JSON、Markdown 或代码块。

4. 控制 token 的方法

  • 模板瘦身:删除重复说明、空泛角色和无效示例。
  • 动态上下文:只召回和当前问题相关的资料,不把整篇文档都塞进去。
  • 历史压缩:用摘要、结构化 state、滑动窗口保留关键状态。
  • 输出限制:设置 max output tokens,并在 Prompt 中要求先短答再展开。
  • 示例治理:few-shot 保留最能覆盖边界的 3-5 个示例。
  • 缓存复用:稳定 system prompt 和长文档前缀可利用 prompt caching 降成本。

5. 生产风险

token 超限不只是报错。更隐蔽的问题是自动截断:关键约束、证据来源、JSON 结构或安全规则被截掉,模型仍然继续回答,导致幻觉、格式错误或越权风险。

面试官追问3个问题

追问一:为什么不能只按中文字符数估算?

  • 考察点:是否理解 tokenizer 差异。
  • 回答方向:tokenizer 按子词和符号切分,代码、数字、JSON、混合语言都可能让比例变化,生产应使用模型 tokenizer。

追问二:上下文没超限但效果变差,为什么?

  • 考察点:是否理解长上下文噪声和位置偏置。
  • 回答方向:长上下文会增加注意力负担,关键信息可能被埋在中间,成本和延迟也会上升。

追问三:如何给输出预留 token?

  • 考察点:是否有落地经验。
  • 回答方向:根据任务类型估算最大输出,输入侧截断或压缩时保留 completion 预算,并对截断输出做检测和重试。

扩展知识

Token 预算示例

text
128K 窗口
- 固定系统提示词: 2K
- 工具定义: 6K
- 历史摘要: 2K
- RAG 证据: 20K
- 用户输入: 4K
- 输出预留: 4K
= 当前请求约 38K

预算要按最坏情况设计,尤其是长文档、工具 schema 很多和多轮 Agent 场景。

基于 MIT 协议开源