Skip to content

Token 计费规则详解

本文档详细介绍白山智算平台 LLM API 的 Token 计费规则,帮助您更好地理解费用构成和控制成本。


1. 计费组成

调用 LLM API 时,费用由以下三部分组成:

计费类型说明计费规则
输入费用 (Input)用户发送的 prompt、system message、历史对话等按实际输入的 token 数量计费
输出费用 (Output)模型生成的回复内容按实际输出的 token 数量计费
缓存费用 (Cached)命中缓存的重复请求仅收取缓存读取费(低于输入价格)

计算公式

总费用 = 输入费用 + 输出费用 + 缓存费用

其中:
- 输入费用 = 输入 token 数 × 输入单价
- 输出费用 = 输出 token 数 × 输出单价
- 缓存费用 = 缓存 token 数 × 缓存单价

2. API 返回的 Usage 字段

每次 API 响应中都会返回 usage 字段,包含详细的 Token 统计:

json
{
  "id": "chatcmpl-xxx",
  "choices": [...],
  "usage": {
    "prompt_tokens": 150,
    "completion_tokens": 85,
    "total_tokens": 235,
    "cached_tokens": 0
  }
}

字段说明

字段类型说明
prompt_tokensinteger输入 token 数量
completion_tokensinteger输出 token 数量
total_tokensinteger总 token 数量 = prompt + completion
cached_tokensinteger命中的缓存 token 数量

3. Token 计算方式

3.1 什么会被计算为输入 Token?

输入 Token 包含以下内容:

  1. 用户消息 (user message):用户发送的提问
  2. 系统提示 (system message):系统设置的上下文指令
  3. 历史对话 (conversation history):多轮对话中的历史消息
  4. 函数定义 (function definitions):Function Calling 中定义的工具 schema

3.2 Token 计算示例

单轮对话

json
{
  "model": "DeepSeek-R1-0528",
  "messages": [
    {"role": "system", "content": "你是一个专业助手"},
    {"role": "user", "content": "请介绍一下北京的历史"}
  ]
}
  • System prompt: ~10 tokens
  • User message: ~12 tokens
  • 输入总计: ~22 tokens

多轮对话

json
{
  "model": "DeepSeek-R1-0528",
  "messages": [
    {"role": "system", "content": "你是一个专业助手"},
    {"role": "user", "content": "请推荐北京景点"},
    {"role": "assistant", "content": "推荐故宫、长城、颐和园..."},
    {"role": "user", "content": "哪个最适合冬天去?"}
  ]
}
  • System + 历史对话全部计入输入
  • 每次请求的输入量会随对话轮数增加

3.3 字符到 Token 的估算

通常可以使用以下估算规则:

  • 英文:1 token ≈ 4 个字符 ≈ 0.75 个单词
  • 中文:1 token ≈ 1.5-2 个汉字

准确 Token 数量以 API 返回的 usage.prompt_tokens 为准。


4. 模型价格示例

不同模型有不同的定价策略,以下是部分模型的价格参考:

4.1 通用大语言模型

模型名称输入价格 (元/MTok)输出价格 (元/MTok)缓存价格 (元/MTok)
Qwen3-32B-FP81.02.00.2
DeepSeek-R1-05284.016.00.8
Qwen3-235B-A22B6.018.01.2
GLM-4.52.06.00.4

4.2 蒸馏模型

模型名称输入价格 (元/MTok)输出价格 (元/MTok)
DeepSeek-R1-0528-Qwen3-8B0.51.0
DeepSeek-R1-Distill-Qwen-14B1.03.0

4.3 代码模型

模型名称输入价格 (元/MTok)输出价格 (元/MTok)
Qwen3-Coder-480B-A35B-Instruct8.024.0

以上价格仅供参考,实际价格请以控制台显示为准。


5. 计费示例

示例 1:普通对话请求

请求

json
{
  "model": "Qwen3-32B-FP8",
  "messages": [
    {"role": "user", "content": "用Python写一个快速排序算法"}
  ],
  "max_tokens": 500
}

响应 usage

json
{
  "prompt_tokens": 15,
  "completion_tokens": 320,
  "total_tokens": 335,
  "cached_tokens": 0
}

费用计算

  • 输入费用:15 × (1.0 / 1,000,000) = 0.000015 元
  • 输出费用:320 × (2.0 / 1,000,000) = 0.00064 元
  • 总计:约 0.000655 元

示例 2:缓存命中请求

请求(重复请求):

json
{
  "model": "Qwen3-32B-FP8",
  "messages": [
    {"role": "user", "content": "用Python写一个快速排序算法"}
  ]
}

响应 usage

json
{
  "prompt_tokens": 15,
  "completion_tokens": 0,
  "total_tokens": 15,
  "cached_tokens": 15
}

费用计算

  • 缓存费用:15 × (0.2 / 1,000,000) = 0.000003 元
  • 总计:约 0.000003 元(仅原费用的 0.5%)

示例 3:多轮对话

请求(第 5 轮对话):

json
{
  "model": "DeepSeek-R1-0528",
  "messages": [
    {"role": "system", "content": "你是一个编程助手"},
    {"role": "user", "content": "写一个快速排序"},
    {"role": "assistant", "content": "def quick_sort..."},
    {"role": "user", "content": "改成冒泡排序"},
    {"role": "assistant", "content": "def bubble_sort..."},
    {"role": "user", "content": "哪个效率更高?"}
  ]
}

响应 usage

json
{
  "prompt_tokens": 450,
  "completion_tokens": 80,
  "total_tokens": 530,
  "cached_tokens": 0
}

费用计算

  • 输入费用:450 × (4.0 / 1,000,000) = 0.0018 元
  • 输出费用:80 × (16.0 / 1,000,000) = 0.00128 元
  • 总计:约 0.00308 元

6. 缓存计费详解

6.1 缓存工作原理

系统会自动对请求进行缓存处理,当检测到相同请求时,直接返回缓存结果。

缓存命中条件

  • 模型相同
  • 消息内容完全相同
  • 参数配置相同(temperature、top_p 等)

6.2 缓存费用优势

场景普通计费缓存计费节省比例
重复问题100%~5%95%
固定模板100%~5%95%
多轮上下文100%100%0%

6.3 缓存适用场景

  • 客服机器人:常见问题解答
  • 内容生成:固定模板的文案生成
  • 代码补全:重复的代码提示
  • 智能提示:输入自动补全

7. 如何查看用量明细

7.1 控制台查看

登录白山智算平台控制台,进入 "用量统计" 页面,可以查看:

  • 每日/每周/每月调用量
  • 各模型的 Token 消耗统计
  • 费用明细报表
  • 缓存节省金额

7.2 API 返回查看

每次 API 调用后,可从响应中获取用量数据:

python
import requests

url = "https://api.edgefn.net/v1/chat/completions"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
data = {
    "model": "Qwen3-32B-FP8",
    "messages": [{"role": "user", "content": "你好"}]
}

response = requests.post(url, headers=headers, json=data)
result = response.json()

# 获取用量信息
usage = result.get("usage", {})
print(f"输入Token: {usage['prompt_tokens']}")
print(f"输出Token: {usage['completion_tokens']}")
print(f"缓存Token: {usage.get('cached_tokens', 0)}")
print(f"总计费用: {(usage['prompt_tokens'] * 1.0 + usage['completion_tokens'] * 2.0) / 1000000} 元")

8. 成本优化建议

8.1 减少输入 Token

  • 精简 system prompt,避免冗长指令
  • 定期清理不再需要的对话历史
  • 使用摘要功能压缩历史记录

8.2 合理设置 max_tokens

  • 根据实际需求设置输出上限,避免无谓消耗
  • 如果不需要完整回复,可适当降低上限

8.3 利用缓存

  • 重复性问题使用相同 prompt
  • 固定格式的生成任务可复用请求

8.4 选择合适模型

场景推荐模型
简单对话轻量级模型(如 8B)
复杂推理高性能模型(如 R1)
代码生成代码专用模型
成本敏感蒸馏/量化模型

9. 常见问题

Q1: Token 数是如何计算的?

Token 计算由模型内置的分词器执行,不同模型可能略有差异。API 返回的 usage 字段中的数量为实际计费依据。

Q2: 为什么实际 Token 数与估算差异较大?

中英文混合、特殊符号、数字等内容会影响分词结果。建议以 API 返回的准确数值作为计费依据。

Q3: 缓存一定会命中吗?

不一定。缓存命中需要请求内容完全一致,包括:模型、消息内容、参数配置。即使微小的差异也会导致缓存未命中。

Q4: 免费额度是否包含缓存费用?

免费额度按实际消耗计算,包含输入、输出和缓存费用。缓存命中的消耗同样计入免费额度。

Q5: 如何查看缓存节省的金额?

在控制台 "用量统计" 页面,可查看 "缓存节省" 专项统计,显示通过缓存功能节省的费用总额。


联系方式:技术支持请发送邮件至 support@baishan.com文档最后更新时间:2025-08-28

贵州白山云科技