0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LLM 送信前のトークン数を計測する Universal Token Counter (UTC) を公開しました

0
Posted at

プロンプト送信前にトークン数を計測する Universal Token Counter (UTC) を公開しました

LLM を使う時、生成そのものより前に気になることがあります。

  • この入力は何トークンあるのか
  • 上限に近いのか
  • どれくらいコストがかかりそうか
  • 日本語だとどのくらい増えるのか

こうした確認は、実際の運用ではかなり重要です。

そこで、OpenAI 互換モデル向けにトークン数を計測する API として
Universal Token Counter (UTC) を公開しました。


なぜトークン数を API として切り出したのか

トークン数の計測自体は、ライブラリを直接使えばできる場面も多いです。
ただ、実際の開発や運用では、次のような事情があります。

  • 複数環境で同じ計測結果を使いたい
  • サーバ側で一元的に見積もりたい
  • ログやメトリクスに組み込みたい
  • UI や管理画面から簡単に呼びたい
  • LLM を呼ぶ前段で共通チェックを入れたい

つまり、単なるローカル関数ではなく、どこからでも呼べるトークン計測の窓口
があると便利です。

UTC は、そうした用途を想定して作った API です。


この API で何ができるのか

Universal Token Counter (UTC) は、OpenAI 互換モデルを指定してテキストの
トークン数を計測する API です。

主な役割は次の通りです。

  • テキストのトークン数を計測する
  • モデルごとのエンコーディング差を吸収する
  • コスト試算の前提値を取得する
  • 多言語テキストの入力サイズを確認する
  • ログや監視で使いやすい形で返す

特に、日本語や多言語テキストで「見た目よりトークン数が多い」問題を事前に
把握したい場面に向いています。


対応モデル

UTC では、モデル名を受け取って対応するエンコーディングで計測します。

README 時点では、少なくとも次のモデルが例示されています。

  • gpt-4o
  • gpt-4.1
  • gpt-4.1-mini
  • gpt-4-turbo
  • gpt-4
  • gpt-3.5-turbo

例えば、

  • gpt-4o / gpt-4.1 系は o200k_base
  • gpt-4 / gpt-3.5-turbo 系は cl100k_base

という形で扱われます。


API のイメージ

エンドポイントは以下です。

POST /utc/v0/token-count

リクエスト例:

{
  "model": "gpt-4o",
  "text": "これはテストです"
}

レスポンス例:

{
  "result": {
    "model": "gpt-4o",
    "encoding": "o200k_base",
    "char_count": 12,
    "token_count": 9,
    "token_per_char": 0.75
  },
  "meta": {
    "input_language": "en",
    "input_size_bytes": 36,
    "token_density": 0.25,
    "model_family": "openai",
    "processing_time_ms": 1.42,
    "utc_timestamp": "2025-01-01T00:00:00Z",
    "version": "0.1.0"
  }
}

resultmeta を分けているので、

  • 実際のトークン数
  • 使用エンコーディング
  • 文字数
  • token density
  • 入力言語
  • 実行時間

を分けて扱いやすくしています。


Python から使う例

Python から使うなら、例えば次のような形です。

import requests

payload = {
    "model": "gpt-4o",
    "text": "これはテストです",
}

res = requests.post(
    "https://universal-token-counter-utc.p.rapidapi.com/utc/v0/token-count",
    json=payload,
    headers={
        "x-rapidapi-key": "YOUR_RAPIDAPI_KEY",
        "x-rapidapi-host": "universal-token-counter-utc.p.rapidapi.com"
    }
)

print(res.json())

実際には、

  • 送信前のプロンプトチェック
  • バッチ処理前のサイズ確認
  • 管理画面上でのコスト見積もり
  • ログや監視の前段

のような使い方が自然だと思います。


Core-first で作っているのも特徴

このリポジトリは、FastAPI の HTTP API だけでなく、Core ロジックを
分離した構成になっています。

つまり、

  • core で純粋なトークン計測ロジックを持ち
  • backend.fastapi_app で HTTP API を提供し
  • 将来的に Lambda や他の実行形態にも載せやすい

という形です。

単に「API が叩ける」だけでなく、実装としても再利用しやすい構造を意識しています。


この API を作った理由

LLM の利用では、「何を送るか」と同じくらい「どれだけ送るか」も重要です。

特に日本語では、

  • 見た目よりトークン数が多い
  • 英語より感覚が掴みにくい
  • 長文化すると急にコストが跳ねる
  • モデルごとに印象が変わる

といったことが起きます。

にもかかわらず、トークン数の確認は後回しにされがちです。
結果として、送ってから気づくことになります。

それなら、送る前に API で測れるようにしてしまった方が扱いやすい。
そう考えて UTC を作りました。


公開先


まとめ

Universal Token Counter (UTC) は、LLM に送る前のトークン数を計測するための API です。

OpenAI 互換モデルを前提に、

  • トークン数の見積もり
  • コスト試算
  • 上限超過チェック
  • 多言語入力のサイズ確認

をしやすくすることを狙っています。

トークン数の確認は地味ですが、LLM 運用ではかなり重要です。
だからこそ、これも API として独立させる価値があると考えています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?