跳转到主要内容
上线准备

Token 计算

了解文本、视觉和音频模型的 Token 用量及计费方式

Token 是千问云上文本和视觉模型的基本计费与上下文管理单位。了解 Token 的计算方式有助于估算成本、控制上下文长度并优化 Prompt。音频和图像生成模型使用不同的计费单位(秒、字符或图片数),本文也会一并介绍。

文本 Token

文本模型将输入和输出切分为子词(subword)单元。粗略估算:1 个 Token 约等于 4 个英文字符,或约 1.5 个中文字符。实际数量取决于分词器和词表。

从 API 响应中读取 Token 用量

每次文本生成响应都包含 usage 对象,其中有精确的 Token 计数:
{
  "usage": {
    "prompt_tokens": 34,
    "completion_tokens": 89,
    "total_tokens": 123
  }
}
使用上下文缓存时,会返回更多细节:
{
  "usage": {
    "prompt_tokens": 1520,
    "completion_tokens": 85,
    "total_tokens": 1605,
    "prompt_tokens_details": {
      "cached_tokens": 1480,
      "cache_creation_input_tokens": 0
    }
  }
}
使用推理模式时,响应中会包含推理 Token:
{
  "usage": {
    "prompt_tokens": 50,
    "completion_tokens": 300,
    "total_tokens": 350,
    "completion_tokens_details": {
      "reasoning_tokens": 245
    }
  }
}
推理 Token 计入 completion_tokens,按输出 Token 费率计费。对于复杂推理任务,推理 Token 可能会显著增加总 Token 用量。

发送请求前估算 Token 数

在调用 API 之前,可以直接使用分词器估算 Token 数量。Qwen 模型使用兼容 tiktoken 的分词器:
# pip install tiktoken
import tiktoken

# 使用 Qwen 分词器
encoding = tiktoken.get_encoding("o200k_base")
tokens = encoding.encode("Your prompt text here")
print(f"Token count: {len(tokens)}")
Token 估算有助于控制上下文窗口和预估成本。如需精确数值,请以 API 响应中的 usage 字段为准。

视觉 Token

视觉模型(Qwen-VL 系列)将图片和视频帧与文本一起转换为 Token。Token 数量取决于图片分辨率。

图片 Token 计算公式

image_tokens = ceil(height / 28) × ceil(width / 28) / 4 + 2
其中:
  • 图片会被缩放至 max_pixels(默认 1003520 像素)范围内,保持宽高比,尺寸四舍五入到 28 的倍数
  • / 4 对应视觉编码器中的 2×2 像素合并操作
  • + 2<vision_bos><vision_eos> 两个特殊 Token
示例:一张 1024×1024 的图片 ≈ (1008/28) × (1008/28) / 4 + 2 = 326 个 Token

Python 估算图片 Token

import math

def estimate_image_tokens(width, height, max_pixels=1003520, min_pixels=3136):
  """估算 Qwen 视觉模型的图片 Token 数量。"""
  # 缩放至像素预算范围内
  total_pixels = width * height
  if total_pixels > max_pixels:
    scale = math.sqrt(max_pixels / total_pixels)
    width = int(width * scale)
    height = int(height * scale)

  # 取整到 28 的最近倍数
  width = max(28, round(width / 28) * 28)
  height = max(28, round(height / 28) * 28)

  # 计算 Token 数
  return (height // 28) * (width // 28) // 4 + 2

# 示例
print(estimate_image_tokens(1024, 1024))   # ~326 tokens
print(estimate_image_tokens(1920, 1080))   # ~326 tokens
print(estimate_image_tokens(4096, 4096))   # ~326 tokens(缩放后)

高分辨率模式

启用 vl_high_resolution_images 可以以更高保真度处理图片(每个 Token 块对应 28×28 像素,而非默认的等效比率)。这会增加 Token 数量(每张图片最高可达 16,384 个 Token),但能提升细节识别能力,适用于 OCR 或小字识别等场景。

视频 Token

视频输入会被采样为独立帧,每帧使用相同的图片公式计算 Token。视频总 Token 数等于所有采样帧的 Token 之和。帧采样率取决于模型和视频时长。

音频计费单位

音频 API 不使用 Token,而是按时长或字符数计费:
API计费单位说明
语音识别(ASR)音频秒数按输入音频的秒数计费
语音合成(TTS)字符数按输入文本的字符数计费
语音对话音频秒数因模型而异
ASR 和 TTS 的响应不包含 usage.prompt_tokens 字段。当前单价请查看定价页面。

图像与视频生成计费

图像和视频生成 API 同样不使用 Token:
API计费单位说明
图像生成按张计费每张生成图片单独计费,与分辨率无关
视频生成按视频秒数按输出视频的时长和分辨率计费
图像生成 API 的响应中,usage 字段包含 image_count 而非 Token 计数。input_tokensoutput_tokens 字段可能显示为 0

成本估算

文本/视觉 API 调用的成本估算公式:
cost = (input_tokens × 输入单价) + (output_tokens × 输出单价)
缓存 Token 按折扣费率计费(显式缓存按原价的 10% 收费,隐式缓存按原价的 20% 收费)。各模型单价请查看定价,降低成本的方法请查看成本优化

上下文窗口限制

每个模型都有最大上下文窗口,限制总输入 Token 数:
模型最大输入 Token最大输出 Token
qwen3.7-max1M64K
qwen3.7-plus1M64K
qwen3.5-flash1M64K
qwen3-max256K64K
当输入接近上下文限制时,可以考虑:
  • 多轮对话中裁剪历史消息
  • 使用上下文缓存减少重复计算(不会减少 Token 数,但能降低成本和延迟)
  • 将较早的上下文压缩为精简的系统消息

后续阅读