Token Counting

如何保留输出 token 而不降低回答质量

输出 token 限制很有用,直到它让模型在你真正需要的答案中途停住为止。过于宽松的上限会浪费预算,并且给输入留出的空间更少。过于严格的上限可能会删掉结论、截断 JSON、跳过必需部分,或者迫使你再发起一次调用,而这次调用的成本比你想省下的 token 还高。

实际可行的做法不是为每个上下文窗口固定预留一个百分比。先为最少可行答案预留空间,再加入任务特定的余量,然后把输入内容放进这个受保护的输出预算之内。

本指南将展示如何在不降低回答质量的前提下保留输出 token,并提供公式、示例、可直接粘贴的测试提示,以及一个你可以在 TokenTest 中运行的工作流程。

“保留输出 token”到底是什么意思

每次模型请求都必须符合你所使用路由的限制。从规划层面看,可以把请求理解为:

可用上下文 >= 输入 tokens + 预留输出 tokens + 安全余量

精确的计量方式会因提供商和模型而异。聊天封装、工具、图像、schema、缓存内容以及内部推理,都会改变哪些内容被计入或被报告。因此,规划时的估算不应被视为最终的权威依据。

因此,输出预留是一个调用前的容量决策,而不是预测模型一定会消耗完所有预留 token。你是在为一个有效答案保留足够空间,同时允许生成在完成时自然停止。

为什么较小的输出上限会降低回答质量

输出限制并不会告诉模型答案的哪一部分可以省略。如果生成达到了上限,结果可能会在任意位置停止。

这会带来四种常见失败模式:

  1. 结构截断:JSON 对象、代码块、表格或编号流程在闭合前就结束了。
  2. 优先级倒置:模型把 token 花在铺垫上下文上,结果遗漏了建议或结论。
  3. 需求丢失:多部分指令中后面的部分消失了,尽管开头看起来很完善。
  4. 假节省:不完整的答案会触发续写、修复或完全重试。

简洁且完整的答案是高效的。不完整的答案则不是。

受保护的输出公式

对每次请求,使用以下起始公式:

受保护输出预留 = 最少可行答案
               + 格式开销
               + 不确定性余量
               + 可选推理余量

1. 最少可行答案

定义仍能通过任务的最短响应。计算必需的部分、字段、示例、引用、代码块或步骤。

例如,一个返回五个 JSON 字段的支持分类任务,所需输出空间就远少于一个包含风险、命令和回滚步骤的技术迁移计划。

2. 格式开销

结构化格式会消耗不属于正文本身的 token。要为键名、大括号、Markdown 语法、代码围栏、表格分隔符、引用和重复标签预留预算。

3. 不确定性余量

当答案长度会随证据而变化时,要预留更多空间。检索结果、工具输出、来源数量、输入语言以及检测到的问题数量,都可能扩大响应长度。

4. 推理预留

某些 API 会将内部或不可见的推理 token 计入输出用量,而输出上限会同时约束这些用量和可见文本。OpenAI 目前的 token 计数指南明确警告,输出用量可能包含你看不到的 token。不要仅凭可见字数来为推理模型的响应设定大小。

实用预留表

优先根据任务形态,而不是模型上下文大小,来做首次定标信号。

任务 最低可用答案 建议的初始预留 质量检查
带紧凑 JSON 的分类 30–80 tokens 100–250 tokens 所有字段都能解析且使用允许值
简短支持回答 100–250 tokens 250–500 tokens 直接回答、关键注意事项、下一步
从单个文档中抽取 取决于 schema 已填充样例的 1.5–2.5× 结构有效;没有缺失必填字段
带说明的代码修复 300–800 tokens 700–1,500 tokens 完整补丁、假设、验证
有来源支撑的分析 600–1,500 tokens 1,200–3,000 tokens 建议、证据、注意事项、来源
长篇文章草稿 1,200–2,500 tokens 2,000–4,000 tokens 所有计划章节和 CTA 都已包含

这些是测试范围,不是通用模型限制。请用你自己提示词和路由中观察到的百分位数替换它们。

如何保留输出 token 而不降低回答质量

步骤 1:编写完成契约

在选择上限之前,先定义“完整”意味着什么。

答案必须包含:
- 一条直接建议;
- 三个实施步骤;
- 一个风险或注意事项;
- 一个验证检查;
- 引言不超过两句话。

这使质量下限可以被测试。它还会告诉模型,在可选细节之前优先输出有价值的内容。

步骤 2:创建一个具有代表性的答案骨架

用占位符起草最短可接受结构:

建议:[1-2 句话]

步骤:
1. [动作]
2. [动作]
3. [动作]

风险:[一个注意事项]
检查:[一个验证]

对这个骨架进行计数或估算,填入真实内容,并将其作为最低可用答案。不要只根据提示词来估算。

步骤 3:为格式和波动增加余量

对于边界严格的 JSON,一个较小的绝对缓冲可能就足够。对于有来源支撑的分析或多语言内容,则需要更大的预留,因为有效要点的数量和长度会变化。

一个简单的起始规则是:

初始输出上限 = 具有代表性的有效答案 × 1.3 到 1.8

对固定 schema 使用较低端,对开放式综合使用较高端。这个乘数只是测试经验法则,不是提供方保证。

步骤 4:在增加更多输入之前保护预留

如果某个请求接近该路由可用上下文的上限,应先减少或概括输入,再缩减受保护的答案。

按以下顺序优先处理输入:

  1. 系统和安全指令;
  2. 用户当前请求;
  3. 所需证据和工具结果;
  4. 最近的相关对话;
  5. 可选示例和历史上下文。

丢弃低价值历史,通常比强行把 1,000 token 的交付内容塞进 300 个输出 token 更安全。

步骤 5:让提示词具备质量意识

要求模型进行优先级处理,而不只是追求简短。

请在可用预算内回答。保留最终建议、
必需字段和验证步骤。优先压缩背景说明。
不要让代码、JSON、表格或编号步骤不完整。

避免要求模型“用完每一个 token”。最大值是上限,不是目标。

步骤 6:验证停止条件

调用结束后,检查提供方返回的 finish 或 stop 原因以及报告的用量。仅仅因为响应包含流畅文本,就自动判定一个因达到 token 限制而停止的回答通过,这是不对的。

对于结构化输出,解析它。对于代码,运行最窄范围的相关检查。对于报告,确认每个必需部分都存在。

步骤 7:基于有效生产样本进行调优

仅针对通过任务的响应跟踪输出用量。然后从有效输出的上四分位区间选择上限,而不是根据整体平均值。

有用的字段包括:

route
task_type
input_tokens
output_tokens
output_cap
finish_reason
task_valid
repair_required
language

如果许多有效答案使用的 token 少于上限的一半,就逐步降低上限。如果截断或修复率上升,就增加预留空间或收紧要求的结构。

可直接粘贴到 TokenTest 的实验

打开 TokenTest,选择与你的路由相关的模型或 tokenizer,然后在发送到生产环境之前比较这些提示词。

实验 1:简短但完整的支持回答

你是一名技术支持工程师。解释为什么即使可见的用户消息很短,
API 请求也可能会触及上下文限制。

完成约定:
- 回答不超过 180 个词;
- 包含一个直接解释;
- 包含三个可能的隐藏因素;
- 包含一个诊断下一步;
- 如需压缩,保留诊断步骤。

实验 2:固定 JSON 预留

对以下产品反馈进行分类。仅返回有效 JSON,键为:sentiment, topic, urgency, summary, needs_human_review。

允许的 sentiment:positive, neutral, negative。
允许的 urgency:low, medium, high。
将 summary 控制在 30 个词以内。

反馈:
“导出可以用,但昨天的使用总量缺失,而且我们的财务团队需要在中午之前拿到报告。”

实验 3:双语差异

将完成约定各粘贴一次英文版和一次中文版。保持含义和必需字段一致,然后比较输入估算,并为每种语言分别保留输出余量。Token 计数取决于模型和 tokenizer;含义相同并不意味着 token 用量相同。

比削减答案更好的节省 token 方法

如果输出预留空间不够,先从其他地方减少浪费:

这些改动在降低输入或重复生成成本的同时,保留了回答质量的底线。

自适应输出上限比单一全局限制更有效

生产系统在分配输出上限之前,应先对任务进行分类。

if task is fixed-schema extraction:
    cap = filled_schema_estimate + small_buffer
elif task is short answer:
    cap = contract_estimate * 1.3
elif task is source-backed synthesis:
    cap = contract_estimate * 1.6
else:
    use a conservative default and collect evidence

如果请求包含更多必需章节、更多来源、更多代码文件,或者某个语言对在所选路由上的使用量更高,也可以提高上限。

常见错误

为上下文窗口预留固定百分比

10% 对分类器来说可能过多,对报告来说又可能不够。应按交付物形态来预留。

只衡量可见词数

token 与单词并非一一对应,而且某些路由会报告不可见的输出用量。最终调优时应使用路由原生的用量数据。

只把截断当作提示词问题

更好的提示词有帮助,但它不能把答案塞进一个小于所需结构的上限里。

在不控制范围的情况下提高上限

宽松的提示词会扩展到填满可用空间。应将上限与完成约束、章节限制以及清晰的优先级顺序配套使用。

所有语言共用同一个预算

tokenization 会因文本、语言、模型和 tokenizer 而异。应针对每个重要区域进行测试,而不是直接照搬英文预算。

最终检查清单

在上线 token 限制之前,请确认你已经:

这就是如何在不降低回答质量的情况下保留输出 token:先保护完整性,再约束可选细节,最后用观测证据替代估算。

使用 TokenTest 检查提示词大小,对比语言和模型,并在请求进入生产环境之前让预留空间可见。

如需了解更多实用的提示词预算工作流程,请浏览 TokenTest blog

FAQ

我应该预留模型的完整最大输出吗?

通常不需要。预留足以生成有效响应的空间,并加上经过测量的余量即可。即使模型在用完之前就停止,过高的上限也会减少可用输入容量,并削弱成本控制。

20% 的输出预留是个好规则吗?

这过于宽泛,不能作为可靠规则。固定模式抽取可能需要少得多,而长文合成可能需要更多。首先估算所需的交付内容。

当答案达到输出上限时,我该怎么办?

在验证之前,应将其视为不完整。提高上限、减少低价值输入、收紧结构,或请求一个有边界的续写,让其从缺失部分开始,而不是重新生成全部内容。

推理 token 会减少可见答案的空间吗?

在那些将推理 token 计入输出用量,或由输出 token 上限控制的路由上,确实会。请查看特定模型和 API 路由的官方文档以及用量字段。

我应该如何为中文和英文分配输出 token 预算?

使用实际的分词器或路由对两个版本进行测试。不要从字数换算,也不要假设等效提示会有相同的 token 数。

来源