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_tokens | integer | 输入 token 数量 |
completion_tokens | integer | 输出 token 数量 |
total_tokens | integer | 总 token 数量 = prompt + completion |
cached_tokens | integer | 命中的缓存 token 数量 |
3. Token 计算方式
3.1 什么会被计算为输入 Token?
输入 Token 包含以下内容:
- 用户消息 (user message):用户发送的提问
- 系统提示 (system message):系统设置的上下文指令
- 历史对话 (conversation history):多轮对话中的历史消息
- 函数定义 (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-FP8 | 1.0 | 2.0 | 0.2 |
| DeepSeek-R1-0528 | 4.0 | 16.0 | 0.8 |
| Qwen3-235B-A22B | 6.0 | 18.0 | 1.2 |
| GLM-4.5 | 2.0 | 6.0 | 0.4 |
4.2 蒸馏模型
| 模型名称 | 输入价格 (元/MTok) | 输出价格 (元/MTok) |
|---|---|---|
| DeepSeek-R1-0528-Qwen3-8B | 0.5 | 1.0 |
| DeepSeek-R1-Distill-Qwen-14B | 1.0 | 3.0 |
4.3 代码模型
| 模型名称 | 输入价格 (元/MTok) | 输出价格 (元/MTok) |
|---|---|---|
| Qwen3-Coder-480B-A35B-Instruct | 8.0 | 24.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
