在一个 API 中对 GPT、Claude 和 Llama 进行令牌计数
使用单个 POST 请求对 15 个 LLM 模型中的令牌进行计数和截断。 防止上下文窗口溢出并在每次 API 调用之前估算成本。
您向 GPT-4o 发送提示,响应会在句子中间中断。 你检查账单并发现 一个批处理作业消耗了 40 美元,因为输入量比您预期的大 3 倍。 你贴一个长的 将文档导入 Claude 并收到错误:超出上下文窗口。 这些问题每一处都有痕迹 回到同一个根本原因; 在发送之前您并不知道您的文本包含多少个令牌。
令牌计数是每个 LLM 集成所需的飞行前检查。 字符数对你没有帮助。 字数统计可以让您大致了解情况,但分词器会根据模型以不同的方式分割文本。 您需要您所调用的模型的准确计数。
为什么字符计数不是令牌计数
法学硕士不处理原始字符。 他们使用标记器将文本分解为标记,这是一个 在大型语料库上训练的子词片段的词汇。 从文本到标记的映射是 不明显且特定于模型。
一些例子说明了为什么计算字符会误导您:
-
“我不能” 在 GPT-4 中分为 3 个代币:
I,can,'t。 那是 7 个字符,但 3 个标记。 - “反体制分裂主义” 是一个单词,但有 6-8 个标记,具体取决于 模型。 分词器将其分解成它可以识别的子字片段。
- “你好” 是 1 个代币。 “ 你好” (带有前导空格)可能是 2 个标记,因为空格有自己的标记。
- 代码片段 标记化与散文不同。 大括号、分号和 每个缩进都会消耗令牌。 一个 500 个字符的函数很容易花费 200 多个代币。
GPT 模型使用 BPE(字节对编码)和 cl100k_base 或 o200k_base 词汇表。 克劳德使用 类似但不同的 BPE 分词器。 Llama 使用 SentencePiece。 同一个段落产生不同的结果 令牌计数涵盖所有三个。
通过一次 API 调用计算令牌数量
将您的文字发送至 botoi /v1/token/count 与目标模型的端点。 应用程序编程接口
返回估计的标记计数以及字符和字数。
curl -X POST https://api.botoi.com/v1/token/count \\
-H "Content-Type: application/json" \\
-d '{
"text": "The quick brown fox jumps over the lazy dog. This sentence is used to test tokenizers across different language models.",
"model": "gpt-4o"
}'
回复:
{
"success": true,
"data": {
"tokens": 24,
"model": "gpt-4o",
"method": "estimated",
"characters": 116,
"words": 20
}
}
响应告诉您这个 20 个单词的句子在 GPT-4o 中需要 24 个令牌。 你还得到
characters 和 words 以供快速参考。 这 method 领域
表示所使用的计数方法。
按型号划分的令牌计数
根据您的目标模型,相同的文本会产生不同的标记计数。 这
model 参数接受主要系列的 15 个型号。 这是他们的比较方式
对于相同的输入:
| 模型 | 分词器 | 上下文窗口 | 代币(同文) |
|---|---|---|---|
| GPT-4O | o200k_base (BPE) | 128K | 24 |
| GPT-3.5-涡轮 | cl100k_base (BPE) | 16K | 24 |
| 克劳德 3.5 十四行诗 | 克劳德·BPE | 20万 | 25 |
| 近距离4工作 | 克劳德·BPE | 20万 | 25 |
| 骆驼-3.2 | 句子片段 | 128K | 24 |
| Gemini-2.0-flash | 句子片段 | 1M | 24 |
| 米斯塔拉尔 | 句子片段 (BPE) | 32K | 24 |
对于短英语句子来说差异很小,但随着输入长度的增加而增加。 非英语 文本、代码和结构化数据(JSON、XML)可以显示更大的变化。 始终用 您计划拨打的具体型号。
将文本截断至标记限制
当提示超出上下文窗口时,您需要在不中断单词中间的情况下对其进行修剪。
这 /v1/token/truncate 端点将文本剪切到单词边界处的目标标记计数。
curl -X POST https://api.botoi.com/v1/token/truncate \\
-H "Content-Type: application/json" \\
-d '{
"text": "You are a helpful assistant. Summarize the following document in three bullet points. The document discusses the impact of renewable energy adoption on global carbon emissions over the past decade, with specific focus on solar and wind installations in Europe and Southeast Asia.",
"max_tokens": 20,
"model": "claude-3.5-sonnet"
}'
回复:
{
"success": true,
"data": {
"truncated": "You are a helpful assistant. Summarize the following document in three bullet points. The",
"tokens": 18,
"was_truncated": true,
"model": "claude-3.5-sonnet",
"max_tokens": 20,
"original_tokens": 48
}
}
最初的提示是 48 个令牌。 API 将其截断为 18 个代币(在 20 个代币预算内)
在干净的字边界处。 这 was_truncated flag 告诉您文本是否被修改。
这 original_tokens 字段显示全文包含多少个标记。
这对于将系统提示纳入紧张的代币预算、修剪聊天历史记录以保持不变非常有用。 在上下文窗口中,并在将文档发送到嵌入 API 之前对其进行分块。
为 LLM 通话建立飞行前检查
最高价值的集成:计算令牌的函数,与模型的上下文进行比较 窗口,如果提示太长则截断。 这可以防止静默截断和 API 错误。
const MODEL_LIMITS = {
"gpt-4o": 128000,
"gpt-4o-mini": 128000,
"claude-3.5-sonnet": 200000,
"claude-4-sonnet": 200000,
"llama-3.2": 128000,
};
async function countTokens(text, model = "gpt-4o") {
const res = await fetch("https://api.botoi.com/v1/token/count", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ text, model }),
});
const { data } = await res.json();
return data.tokens;
}
async function truncateText(text, maxTokens, model = "gpt-4o") {
const res = await fetch("https://api.botoi.com/v1/token/truncate", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ text, max_tokens: maxTokens, model }),
});
const { data } = await res.json();
return data;
}
async function preflightCheck(prompt, model = "gpt-4o") {
const limit = MODEL_LIMITS[model];
if (!limit) throw new Error("Unknown model: " + model);
const tokens = await countTokens(prompt, model);
// Reserve 20% of the context window for the model's response
const inputBudget = Math.floor(limit * 0.8);
if (tokens <= inputBudget) {
return { safe: true, tokens, limit, model };
}
// Truncate to fit within the input budget
const result = await truncateText(prompt, inputBudget, model);
return {
safe: false,
original_tokens: tokens,
truncated_tokens: result.tokens,
truncated_text: result.truncated,
limit,
model,
};
}
// Usage
const prompt = buildPromptFromChatHistory(messages);
const check = await preflightCheck(prompt, "claude-3.5-sonnet");
if (!check.safe) {
console.log(
"Prompt truncated from " +
check.original_tokens + " to " +
check.truncated_tokens + " tokens"
);
prompt = check.truncated_text;
}
const response = await callLLM(prompt, "claude-3.5-sonnet");
该函数为模型的响应保留 20% 的上下文窗口。 如果输入合适,则 不变地通过。 如果太大,则会被截断为输入预算。 你总是 确切地知道您发送了多少令牌。
将此围绕在您的申请中的每个 LLM 调用中。 它添加一个 HTTP 请求(如果截断则添加两个) 需要)并消除了一整类生产故障。
现实世界的用例
- API 调用之前的成本估算。 计算一批提示中的令牌,乘以 通过模型的每个代币价格,并在承诺之前了解总成本。 这个 Node.js 函数 只需几行即可完成:
async function estimateCost(text, model = "gpt-4o") {
const tokens = await countTokens(text, model);
// Price per 1M input tokens (March 2026 pricing)
const rates = {
"gpt-4o": 2.50,
"gpt-4o-mini": 0.15,
"claude-3.5-sonnet": 3.00,
"claude-4-sonnet": 4.00,
"llama-3.2": 0.00, // self-hosted
};
const rate = rates[model] || 0;
const cost = (tokens / 1_000_000) * rate;
return {
tokens,
model,
estimated_cost_usd: cost.toFixed(6),
};
}
// Check cost before sending a large document
const estimate = await estimateCost(longDocument, "gpt-4o");
console.log(estimate);
// { tokens: 14320, model: "gpt-4o", estimated_cost_usd: "0.035800" }
- 提示尺寸验证。 拒绝或修剪用户提交的超出您权限的提示 应用程序的代币预算。 防止单个长输入消耗整个速率限制。
- 用于嵌入的分块文档。 将长文档分割成适合的块 在嵌入模型的令牌限制内(通常为 512 或 8,192 个令牌)。 计算每个令牌的数量 chunk 以确保没有超出限制。
- 聊天记录管理。 随着对话的增长,较旧的消息会推动总数 超过上下文窗口的令牌计数。 计算每条消息后的累积令牌总数,并 当您接近限制时,删除最旧的消息。
- CI/CD 管道防护装置。 将令牌计数步骤添加到您的部署管道中。 如果 提示模板超过定义的阈值,在达到生产之前构建失败。
要点
- 令牌数量因型号而异。 GPT、Claude 和 Llama 对同一文本进行标记 不同。 计数时务必指定目标型号。
-
两个端点涵盖了整个工作流程。
/v1/token/count告诉你 尺寸。/v1/token/truncate修剪以适合。 两者都支持 15 种模型。 - 飞行前检查可防止生产故障。 在每个 LLM 之前计算代币 调用以避免响应被截断、上下文窗口错误和意外成本。
- 无需帐户。 免费套餐允许每分钟 5 个请求,无需注册。 获取 API 密钥以获得更高的容量 botoi.com/api。
这 完整的 API 文档 涵盖受支持模型和其他开发人员实用程序端点的完整列表。
FAQ
- 一个词中有多少个标记?
- 平均而言,1 个英语单词约等于 1.3 个标记。 诸如“the”或“is”之类的简短常用词就是一个标记。 较长或不常见的单词(例如“authentication”)分为 2-4 个子词标记。 确切的计数取决于模型的标记器。
- GPT 中的代币是什么?
- 标记是模型作为单个单元处理的文本块。 GPT 模型使用字节对编码 (BPE) 分词器,将文本分割成子字片段。 常见的单词保持完整,而罕见或长的单词则分成更小的片段。 标点符号和空格也被标记化。
- 如何在 API 调用之前计算令牌?
- 使用可选模型参数(gpt-4o、claude-3.5-sonnet、llama-3 等)将文本发送到 POST https://api.botoi.com/v1/token/count。 API 在单个响应中返回估计的标记计数、字数和字符数。
- 不同的法学硕士以相同的方式标记文本吗?
- 否。GPT 模型使用 cl100k_base 或 o200k_base 编码。 Claude 使用类似但不同的 BPE 分词器。 Llama 使用 SentencePiece。 同一个句子在不同模型中产生不同的标记计数。 始终使用您计划调用的特定模型来计算令牌。
- 当超出模型的上下文窗口时会发生什么?
- 当输入超出上下文窗口时,大多数 LLM API 都会返回错误。 有些会默默地截断输入,这可能会切断关键指令或上下文。 预先检查令牌计数并截断以适合可以防止这两种故障模式。
开始使用 botoi 构建
150+ 个 API 端点,涵盖查询、文本处理、图片生成和开发者工具。免费套餐,无需信用卡。