AI 规划 / CLEARBYTE

AI 令牌与字数:先测量请求,再估算费用

令牌是特定模型分词器产生的单位,并不等于固定字数或字符数。精确计算文本时,应使用匹配的分词器和设置;完整 API 请求还要考虑消息结构与支持的工具,再将估计值与服务返回的实际用量比较。

本指南内容

字数统计适合检查文章长度,却不能可靠判断 AI 请求能否装入某个模型上下文,也不能直接计算费用。同样的可见文本,在不同分词器中可能被拆成不同单元;完整请求的内容通常也远多于最新一条消息中粘贴的文字。

以下流程把原始文本测量、完整请求测量和计费用量分开。它提供离线计数示例与可填写的工作表,不会为未实际运行的模型编造精确令牌结果。保存输入和测量条件,比套用一个看起来方便的换算系数更有价值。

分别理解词、Unicode 字符与令牌

可见的一个词可能对应一个令牌、多个子词令牌,也可能与空格和标点一起组合。Hugging Face 的分词器入门介绍了按词、按字符和子词等方法。语言、拼写、代码、空白及分词器词表都可能影响最终拆分,不能仅凭文章看起来长短相近就认为令牌数相近。

Unicode 字符数又回答另一类问题。有些字符需要多个代码单元或字节,一个可见符号也可能由多个 Unicode 码点组成。这些数量与模型令牌之间都没有通用精确换算。“每个令牌若干字符”只能是针对某类样本的粗略经验,不是所有语言共同遵守的规则。

根据实际任务选择测量方式
任务适用测量边界
检查文章长度词数或 Unicode 字符数无法据此确定模型令牌数
为某个分词器测量文本文件使用该分词器及设置得到令牌 ID可能不包含聊天格式和请求额外内容
估算结构化 API 请求服务支持的计数方式或准确请求格式可能与最终用量不同
核对计费实际用量字段及当前计费定义不能替代另一服务的请求估算

用已知分词器测量本地文本

对于采用 Hugging Face tokenizers 格式的分词器,可加载匹配的本地 tokenizer.json,再编码 UTF-8 文本文件。记录模型或分词器标识、文件修订版本、软件包版本及特殊令牌设置。示例使用已发布的 tokenizers 0.23.2 API,关闭填充与截断,并在计数时不额外添加特殊令牌。

分词器文件应来自目标模型的官方分发。示例不会下载模型、把文本上传到服务器,也不会复现托管聊天 API 的完整请求格式。只有分词器与设置确实匹配当前测量问题,结果才有意义。若模型依赖其他预处理或聊天模板,也应另行纳入完整请求检查。

# Example environment: tokenizers==0.23.2
from pathlib import Path
from importlib.metadata import version
from tokenizers import Tokenizer

# Use the matching tokenizer.json already saved locally.
tokenizer = Tokenizer.from_file("tokenizer.json")
tokenizer.no_padding()
tokenizer.no_truncation()
text = Path("sample.txt").read_text(encoding="utf-8")
encoded = tokenizer.encode(text, add_special_tokens=False)
print("tokenizers version:", version("tokenizers"))
print("raw-text tokens:", len(encoded.ids))
# Record tokenizer identity/revision separately.
# This is not a complete chat-request or billing count.

规划上下文时包含完整请求

聊天请求除了最新用户消息,还可能包含系统指令、对话历史、检索段落、工具定义和格式信息。聊天模板可能在角色和消息边界周围插入控制令牌。因此,只计算最后粘贴的一段文字,通常不足以描述整个请求输入。

使用托管服务时,在相关输入类型受支持的前提下,可采用其官方请求计数功能。Claude 文档说明了结构化输入计数,也列出需要依靠真实用量报告的情形。应根据供应商注明的估算边界解释结果,尤其是包含工具、图片或文档的请求,不能默认所有输入都按普通文字处理。

不要把凭证和敏感客户文本粘贴进来源不明的在线计数器。本地分词器可以帮助测量原始文字,而供应商端点会把提交内容发送给该供应商。测量前先判断数据适合哪条路径,不能因为工具名称含有“计数”就默认它不会上传。

建立能够复现的比较工作表

选择能代表应用的样本,例如客服消息、代码片段、表格,以及实际支持语言的文本。保存精确输入字节,避免比较时意外改变换行、标点或空白。若样本被编辑,就应视为另一次测量,而不是把新结果与旧输入混为一谈。

每个样本都记录分词器及修订版本、特殊令牌设置、原始文本计数,以及可取得的完整请求估计。尚未测量的单元格应留作未测,而不是用猜测比例填满。两个分词器给出不同计数,只说明这些样本在这些设置下不同,不代表它们的语言质量高低。

运行指定分词器后填写的空白测量表
样本分词器及修订版本原始文本令牌数完整请求计数或估计
客服消息记录准确标识本地实际测量使用受支持请求格式测量
代码片段记录准确标识本地实际测量使用受支持请求格式测量
第二种语言文本记录准确标识本地实际测量使用受支持请求格式测量

增加输入前,先为输出预留空间

简化规划假设:选定模型针对当前请求类型允许输入输出合计 32,000 令牌。为输出预留 4,000,再保留 2,000 规划余量,输入预算剩 26,000。若指令、历史和工具占用 8,000,则可供检索内容使用的空间为 18,000。

这些是明确的假设数字,不是任何当前模型的实际规格。不同服务可能以不同方式定义上下文、输出、推理和工具用量。先核对模型约定,再把自己的真实数量输入上下文预算计算器。能够装入窗口,并不代表加入的每段文字都有用;还应依据任务挑选和检查检索内容。

Hypothetical planning budget:
32,000 combined context
− 4,000 output reserve
− 2,000 planning buffer
= 26,000 input budget

26,000 − 8,000 instructions/history/tools
= 18,000 available for retrieved content

把估计值与实际用量、费用对照

完成一次小规模真实测试后,保存服务返回的用量字段,与同一请求的估计比较。根据文档分别处理缓存输入、输出、推理或其他计费类别。若估计漏掉工具定义,修改字数换算比例并不能真正解释偏差,应先补全被漏掉的请求组成。

在 AI 令牌费用计算器中输入实际令牌数及自己核实的当前价格。输入和输出分开,保留价格单位,例如每百万令牌的费用。有用的费用表能够由实测用量和明确单价复算,不依赖通用的字数到令牌换算。

比较不同测试时,还应注明是否使用了同样的请求结构与缓存条件。相同的用户问题并不意味着发送了相同历史和工具定义,单看最终回答的字数也无法解释完整费用。保留脱敏后的结构说明与用量记录,才能区分输入改变、输出改变和计费类别改变。

常见问题

一个令牌总是四个字符吗?

不是。这最多是某些文本与分词器的粗略经验。语言、代码、标点、空白和分词器设计都会影响结果,不能把它当成精确限制。

为什么本地文本计数与 API 用量不同?

完整请求可能包含原始样本没有的格式、指令、历史、工具和输入类型,分词器或特殊令牌设置也可能不同。应比较相同的完整请求及供应商定义。

本站字数工具能计算精确模型令牌数吗?

不能。它报告词数和 Unicode 字符等文本指标。模型令牌应使用匹配分词器或官方支持的计数方法,再将测量结果交给费用与上下文工具。

来源与定义

方法核验日期: