token 计数为什么重要
token 是按模型分词器切分后的最小单位,输入上限、输出预留与计费都按 token 计。中文、代码与英文的切分密度差别很大,用字符数折算必然偏差;因此发送前要用目标模型的 tokenizer 或服务端的 tokenize 接口实测,而不是估算。
基本信息
| 计数依据 | 目标模型的分词器 |
|---|---|
| 本地工具 | transformers 的 AutoTokenizer |
| 服务端接口 | 推理引擎提供的 tokenize 接口 |
| 计入范围 | 系统提示、聊天模板、工具描述 |
| 主要用途 | 窗口预算、截断控制与计费 |
典型使用场景
- 长文摘要前确认输入不会超窗口
- 按 token 计费时做成本预估与对账
- RAG 拼接上下文时控制注入内容量
- 为输出预留长度,避免回答中途被截断
- 多轮对话里累计历史长度,接近窗口时提前裁剪而不是等报错
本地计数
本地计数
from transformers import AutoTokenizer
tok = AutoTokenizer.from_pretrained("<模型目录>") # 必须是目标模型的分词器
n = len(tok.encode("你的完整提示词"))
print(n) # 与服务端实际计费数对照一次,确认口径一致
m = len(tok.encode(rendered)) # rendered 是套用聊天模板后的完整文本服务端接口
服务端接口
curl -s http://127.0.0.1:8000/tokenize -H 'Content-Type: application/json' \
-d '{"model": "<模型名>", "prompt": "你好"}'三种口径对比
| 口径 | 特点 | 注意 |
|---|---|---|
| 字符数 | 算起来最省事 | 中文与代码误差大 |
| token 数 | 与上限和计费一致 | 需要目标模型的分词器 |
| 渲染后 token | 含模板与系统提示 | 与实际上限对齐 |
聊天模板、系统提示与工具描述都会占 token:预算要按渲染后的完整输入计算,只算用户问题会明显低估。
同一段文本在不同模型上的 token 数可能差不少:切换模型后窗口上限与计费都要重新核算,别沿用旧数据。
本地计数与服务端计数对不上时,先确认两边用的是同一份分词器与同一段渲染后的文本,再查服务端是否额外拼了停止符等内容。