主题
高频面试题
Token 是什么?如何计算和控制 Token 数量?
这道题不是考你会不会背“一个 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 场景。