トークンをカウントする

AI

Linuxの標準コマンドだけでOpenAIの公式なトークン数と完全に一致させるのは困難です。なぜなら、トークナイズ(文章をトークンに分割する処理)のルールがモデルごとに複雑だからです。

しかし、「近い近似値」を素早く計算する便利なコマンドと、「正確な値」を計算するためのコマンドラインツールの作り方があります。

方法1:【推奨】簡易的だが精度の高い近似値を出すコマンド

これが最も手軽で、かつ単語数(wc -w)よりずっと正確な方法です。英単語・日本語・記号をいい感じに分割して数えます。

コマンド:

grep -oE '\w+|[^\w\s]' | wc -l

解説:

このコマンドは、テキストを以下のルールで分割し、その行数(=トークン数に近い値)を数えています。

  • \w+: 1文字以上の英数字(単語)
  • |: OR
  • [^\w\s]: 英数字でもスペースでもない1文字(つまり、句読点や記号)

使い方:

  1. 直接テキストを渡す場合:Bashecho "Hello world! これは日本語のテストです。" | grep -oE '\w+|[^\w\s]' | wc -l 出力例: 15(実際の gpt-4o では19トークンなので、あくまで近似値です)
  2. ファイルの内容をカウントする場合:Bashcat your_file.txt | grep -oE '\w+|[^\w\s]' | wc -l

この方法は、特に英語圏のテキストに対して、単語数 + 記号の数 という考え方でトークン数にかなり近い値を算出できます。

方法2:【非推奨】単語数を数えるだけの不正確な方法

最もシンプルですが、トークンの概念とは異なるため精度は低いです。参考までにご紹介します。

コマンド:

wc -w

使い方:

Bash

echo "Hello world! tokenization is complex." | wc -w

出力例: 5

なぜ不正確か?

tokenization は1単語ですが、OpenAIのトークナイザーでは token と ization のように2つ以上のトークンに分割されることが多いため、実際のトークン数よりもかなり少なくカウントされてしまいます。


方法3:【正確】tiktokenを使った専用コマンドを作成する

これが最も正確な方法です。OpenAIの公式ライブラリ tiktoken を使い、指定したモデルの正確なトークン数を計算する自作コマンドを作成します。

一度準備すれば、その後は非常に便利です。

ステップ1: tiktoken のインストール

まず、Pythonとpipがインストールされている環境で、tiktoken をインストールします。

pip install tiktoken

# ワンライナーで実行(gpt-4モデルでテキストカウント)
python -c "import tiktoken; enc=tiktoken.encoding_for_model('gpt-4'); print(len(enc.encode('あなたのテキスト')))"

ステップ2: カウント用スクリプトの作成

tokencount という名前のファイルを作成し、以下の内容を貼り付けます。

#!/usr/bin/env python3
import sys
import argparse
import tiktoken

# デフォルトのモデルを設定
DEFAULT_MODEL = "gpt-4o"

def count_tokens(text, model):
    """指定されたモデルのエンコーディングを使用してトークンをカウントする"""
    try:
        encoding = tiktoken.encoding_for_model(model)
    except KeyError:
        print(f"エラー: モデル '{model}' が見つかりません。代わりに 'cl100k_base' を使用します。", file=sys.stderr)
        encoding = tiktoken.get_encoding("cl100k_base")
    
    token_count = len(encoding.encode(text))
    return token_count

def main():
    parser = argparse.ArgumentParser(
        description="標準入力から受け取ったテキストのOpenAIトークン数を計算します。",
        formatter_class=argparse.RawTextHelpFormatter
    )
    parser.add_argument(
        "-m", "--model",
        type=str,
        default=DEFAULT_MODEL,
        help=f"""トークナイズに使用するモデル名。
利用可能なモデル例:
- gpt-4o
- gpt-4-turbo
- gpt-3.5-turbo
デフォルト: {DEFAULT_MODEL}"""
    )
    args = parser.parse_args()

    # パイプやリダイレクトからテキストを読み込む
    text_to_tokenize = sys.stdin.read()
    
    if not text_to_tokenize:
        # テキストが空の場合は0を出力
        print(0)
        return

    num_tokens = count_tokens(text_to_tokenize, args.model)
    print(num_tokens)

if __name__ == "__main__":
    main()

ステップ3: 実行権限の付与

作成したスクリプトに実行権限を与えます。

chmod +x tokencount

ステップ4: パスが通ったディレクトリに配置

tokencount ファイルを /usr/local/bin など、パスが通っているディレクトリに移動させると、どこからでもコマンドとして呼び出せるようになります。

sudo mv tokencount /usr/local/bin/

使い方

これで tokencount コマンドが完成しました。パイプ | でテキストを渡して使います。

  • gpt-4o (デフォルト) でカウント:Bashecho "Hello world! これは日本語のテストです。" | tokencount 出力例: 19
  • モデルを指定してカウント (gpt-3.5-turbo):Bashcat my_prompt.txt | tokencount --model gpt-3.5-turbo またはBashcat my_prompt.txt | tokencount -m gpt-3.5-turbo

APIレスポンスから直接取得(実際の消費トークン)

APIを呼び出した際のレスポンス内のusageフィールドを抽出します。

curl + jq

API_KEY="sk-xxxx"
curl https://api.openai.com/v1/chat/completions \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-4o",
    "messages": [{"role": "user", "content": "こんにちは!"}]
  }' | jq '.usage.total_tokens'

特徴

  • 実際の消費トークンを取得: メタデータを含む正確な値
  • 制約: 都度APIコールが必要(コスト発生)
  • 監視向け: 下記でトークン使用量をSQLiteDBに記録可能:
  # サンプルコード(token_logger.py)
  from token_logger import log_token_usage
  log_token_usage(response)  # APIレスポンスを渡す

注意事項

  1. 日本語の特殊性:
    • 英語より20~50%トークン数が増加(漢字の分割処理のため)
    • 例: echo "麒麟" | tiktoken4トークン(通常の2文字の倍)
  2. ストリーミング応答時:
    APIレスポンスにusageフィールドが含まれないため、自前で計算必須
  3. GUIツール代替:
    対話型で可視化したい場合はOpenAI公式Tokenizerが便利(ブラウザ上で色分け表示)

まとめ

日常的な開発では、まず方法1で当たりをつけ、APIに渡す直前の処理などで厳密な数が必要な場合は方法3を使う、という使い分けがおすすめです。

方法コマンド精度手軽さおすすめの用途
方法1 (grep)grep -oE '\w+|[^\w\s]' | wc -l高い近似値◎ 非常に手軽ちょっとしたテキスト長をざっくり把握したいとき
方法2 (wc)wc -w低い○ 最も手軽非推奨(参考程度)
方法3 (tiktoken)tokencount (自作)正確△ 要準備正確なコスト計算やAPI利用前の最終確認

コメント

タイトルとURLをコピーしました