コンテンツへスキップ
Tutorial

1 つの API で GPT、Claude、Llama のトークン カウンティング

| 7 min read

1 回の POST リクエストで、15 個の LLM モデルにわたるトークンをカウントして切り捨てます。 コンテキスト ウィンドウのオーバーフローを防止し、API 呼び出しの前にコストを見積もります。

AI model comparison dashboard
Photo by Possessed Photography on Unsplash

GPT-4o にプロンプ​​トを送信すると、応答が文の途中で途切れてしまいます。 請求書を確認すると、 入力が予想よりも 3 倍大きかったため、バッチ ジョブは 40 ドルを消費しました。 長いものを貼り付けます ドキュメントを Claude に送信すると、エラーが発生します: コンテキスト ウィンドウを超えました。 これらの問題のすべてが痕跡を残します 同じ根本原因に戻ります。 送信する前には、テキストに含まれるトークンの数がわかりませんでした。

トークン カウンティングは、すべての LLM 統合に必要なプリフライト チェックです。 文字数は役に立ちません。 単語数はおおよその目安になりますが、トークナイザーはモデルに応じてテキストを異なる方法で分割します。 呼び出しているモデルの正確な数が必要です。

文字数がトークン数ではない理由

LLM は生の文字を処理しません。 彼らはトークナイザーを使用してテキストをトークンに分割します。 大規模なコーパスでトレーニングされたサブワード部分の語彙。 テキストからトークンへのマッピングは次のとおりです。 明白ではなく、モデル固有です。

文字数を数えることが誤解を招く理由を示す例をいくつか示します。

  • "私はできません" GPT-4 では 3 つのトークンに分割されます。 Ican't。 これは 7 文字ですが、トークンは 3 つです。
  • 「反体制主義」 は 1 つの単語ですが、内容に応じて 6 ~ 8 個のトークンが含まれます。 モデル。 トークナイザーはそれを認識するサブワード部分に分割します。
  • "こんにちは" 1トークンです。 " こんにちは" (先頭にスペースあり) 空白は独自のトークンを取得するため、2 つのトークンになります。
  • コードスニペット 散文とは異なる方法でトークン化します。 中括弧、セミコロン、および インデントごとにトークンが消費されます。 500 文字の関数には、簡単に 200 以上のトークンが必要になります。

GPT モデルは、cl100k_base または o200k_base ボキャブラリで BPE (バイトペア エンコーディング) を使用します。 クロードが使う 似ていますが、別個の BPE トークナイザーです。 ラマは SentencePiece を使用します。 同じ段落が異なるものを生み出す トークンの数は 3 つすべてでカウントされます。

1 回の API 呼び出しでトークンをカウントする

テキストをボットイに送信してください /v1/token/count ターゲットモデルのエンドポイント。 API 文字数と単語数とともに推定トークン数を返します。

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 200K 25
クローズ4ワーク クロード・BPE 200K 25
ラマ-3.2 センテンスピース 128K 24
ジェミニ-2.0-フラッシュ センテンスピース 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 リクエストを 1 つ追加します (切り捨ての場合は 2 つ)。 必要)、生産上のあらゆる種類の障害を排除します。

実際の使用例

  • 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 トークン)。 ごとにトークンを数える チャンクを変更して、制限を超えるものが存在しないことを確認します。
  • チャット履歴管理。 会話が増えると、古いメッセージが合計を押し上げます コンテキスト ウィンドウを通過した後のトークン数。 各メッセージの後に累積トークンの合計をカウントし、 制限に近づくと、最も古いメッセージが削除されます。
  • CI/CD パイプライン ガード。 デプロイメントパイプラインにトークンカウントステップを追加します。 もし プロンプト テンプレートが定義されたしきい値を超えると、本番環境に到達する前にビルドが失敗します。

重要なポイント

  • トークン数はモデルによって異なります。 GPT、Claude、Llama が同じテキストをトークン化する 違う。 カウントの際は必ず対象機種を指定してください。
  • 2 つのエンドポイントがワークフロー全体をカバーします。 /v1/token/count あなたに言います サイズ。 /v1/token/truncate フィットするようにトリミングします。 どちらも 15 モデルをサポートします。
  • プリフライトチェックにより、生産上の障害を防ぎます。 すべての LLM の前にトークンをカウントする 応答の切り捨て、コンテキスト ウィンドウ エラー、予期せぬコストを回避するために呼び出します。
  • アカウントは必要ありません。 無料枠では、サインアップなしで 1 分あたり 5 件のリクエストが可能です。 より大容量の API キーを取得するには、 botoi.com/api

完全な API ドキュメント サポートされているモデルと追加の開発者ユーティリティ エンドポイントの完全なリストをカバーしています。

FAQ

単語にはトークンがいくつありますか?
平均して、1 つの英語の単語は約 1.3 トークンに相当します。 「the」や「is」などの一般的な短い単語は 1 つのトークンです。 「認証」などの長い単語または一般的ではない単語は、2 ~ 4 つのサブワード トークンに分割されます。 正確な数はモデルのトークナイザーによって異なります。
GPT のトークンとは何ですか?
トークンは、モデルが単一の単位として処理するテキストの塊です。 GPT モデルは、テキストをサブワード部分に分割するバイト ペア エンコーディング (BPE) トークナイザーを使用します。 一般的な単語はそのまま残りますが、まれな単語や長い単語は小さな断片に分割されます。 句読点と空白もトークン化されます。
API 呼び出しの前にトークンをカウントするにはどうすればよいですか?
オプションのモデル パラメーター (gpt-4o、claude-3.5-sonnet、llama-3 など) を指定して、テキストを POST https://api.botoi.com/v1/token/count に送信します。 API は、単一の応答で推定トークン数、単語数、および文字数を返します。
異なる LLM は同じ方法でテキストをトークン化しますか?
いいえ、GPT モデルは cl100k_base または o200k_base エンコーディングを使用します。 クロードは、似ていますが異なる BPE トークナイザーを使用しています。 ラマは SentencePiece を使用します。 同じ文でもモデル間で異なるトークン数が生成されます。 呼び出す予定の特定のモデルを使用してトークンを常にカウントしてください。
モデルのコンテキスト ウィンドウを超えるとどうなりますか?
ほとんどの LLM API は、入力がコンテキスト ウィンドウを超えるとエラーを返します。 入力をサイレントに切り詰めるものもあります。これにより、重要な指示やコンテキストが遮断される可能性があります。 トークン数を事前にチェックし、適合するように切り詰めることで、両方の障害モードを防止します。

botoiで開発を始めよう

150以上のAPIエンドポイント。検索、テキスト処理、画像生成、開発者ユーティリティに対応。無料プラン、クレジットカード不要。