大语言模型 API Token 消耗深度剖析
在调用大语言模型(LLM)API 时,Token 统计不仅是计费的唯一依据,更是评估模型推理深度、响应延迟及上下文窗口管理的关键指标。本文旨在通过源码解析,帮助开发者彻底理解 Token 的消耗逻辑。
一、 数据结构源码定义
以下是基于主流 API(如 OpenAI 协议)的底层类定义,展示了 Token 消耗的层级结构:
python
from typing import Optional
from pydantic import BaseModel
class PromptTokensDetails(BaseModel):
"""输入 token(Prompt)的详细组成"""
audio_tokens: Optional[int] = None # 提示词中的音频输入 token 数
cached_tokens: Optional[int] = None # 提示词中命中缓存的 token 数
class CompletionTokensDetails(BaseModel):
"""输出 token(Completion)的详细组成"""
accepted_prediction_tokens: Optional[int] = None # 预测内容被模型采纳的 token 数
audio_tokens: Optional[int] = None # 模型生成的音频输出 token 数
reasoning_tokens: Optional[int] = None # 模型生成的推理/思考 token 数
rejected_prediction_tokens: Optional[int] = None # 未被采纳的预测 Token 数
class CompletionUsage(BaseModel):
"""单次请求的完整用量统计"""
prompt_tokens: int # 输入总 token 数
completion_tokens: int # 输出总 token 数
total_tokens: int # 总计消耗 (Prompt + Completion)
prompt_tokens_details: Optional[PromptTokensDetails] = None
completion_tokens_details: Optional[CompletionTokensDetails] = None
二、 Prompt 消耗组成 (输入端)
prompt_tokens 代表模型在生成第一个字符前必须"阅读"的信息总量。在 RAG(检索增强生成)场景中,这部分的成本控制至关重要。
Prompt 构成详表
| 组成部分 | 对应源码字段 | 物理意义 | 计费与性能影响 |
|---|---|---|---|
| 缓存 token | cached_tokens |
复用了之前请求中已处理过并存储在服务器缓存中的内容。 | 核心优化点。通常有显著价格折扣,且能极大提升首字响应速度 (TTFT)。 |
| 音频 token | audio_tokens |
输入中包含的语音数据、音频采样转换而来的等效 token。 | 适用于多模态原生语音交互。 |
| 常规输入 | (隐式计算) | 包含 System Prompt、历史上下文、用户当前提问等。 | 按标准输入单价全额计费。 |
三、 Completion 消耗组成 (输出端)
completion_tokens 反映了模型的"思考成本"和"表达成本"。现代高性能模型(如 DeepSeek-R1, GPT-4o)的输出 Token 由多部分组成,即使最终看到的文字很少,产生的 Token 也可能非常多。
Completion 构成详表
| 组成部分 | 对应源码字段 | 物理意义 | 是否在最终答案中可见 |
|---|---|---|---|
| 推理 token | reasoning_tokens |
模型在给出答案前进行的逻辑推演、思维链(CoT)内容。 | 通常不可见(后台运行) |
| 已接受预测 | accepted_prediction_tokens |
预测输出(Predicted Outputs)技术中模型猜对并采纳的 token。 | 可见 |
| 被拒绝预测 | rejected_prediction_tokens |
预测输出中猜错的部分。虽未采纳,但已产生计算消耗。 | 不可见 |
| 音频 token | audio_tokens |
模型直接生成的语音数据转换而来的等效 token。 | 以声音形式输出 |
| 标准文本 | (隐式计算) | 模型根据推理结果输出的最终文字答案。 | 可见 |
四、 核心逻辑总结
1. 计算公式
- 总消耗公式 :
total_tokens = prompt_tokens + completion_tokens - 输入细分公式 :
prompt_tokens = cached_tokens + audio_tokens + text - 输出细分公式 :
completion_tokens = reasoning + accepted_pred + rejected_pred + audio + text
2. 开发者调优建议
- 警惕推理陷阱 :在处理复杂逻辑时,
reasoning_tokens消耗极快。对于不需要深度逻辑的任务,建议降级使用非推理模型以节省开支。 - 利用缓存优化 :在 RAG 架构中,尽量保持 Prompt 头部(如大型知识库或 System Prompt)稳定,以提高
cached_tokens命中率,从而降低 50%-90% 的输入成本。 - 窗口溢出风险 :请记住,无论是隐藏的"推理 token"还是被丢弃的"预测 token",都会占用模型的上下文窗口总上限 。如果任务中断,请检查是否因推理过长导致触发
length限制。