Linuxの標準コマンドだけでOpenAIの公式なトークン数と完全に一致させるのは困難です。なぜなら、トークナイズ(文章をトークンに分割する処理)のルールがモデルごとに複雑だからです。
しかし、「近い近似値」を素早く計算する便利なコマンドと、「正確な値」を計算するためのコマンドラインツールの作り方があります。
方法1:【推奨】簡易的だが精度の高い近似値を出すコマンド
これが最も手軽で、かつ単語数(wc -w
)よりずっと正確な方法です。英単語・日本語・記号をいい感じに分割して数えます。
コマンド:
grep -oE '\w+|[^\w\s]' | wc -l
解説:
このコマンドは、テキストを以下のルールで分割し、その行数(=トークン数に近い値)を数えています。
\w+
: 1文字以上の英数字(単語)|
: OR[^\w\s]
: 英数字でもスペースでもない1文字(つまり、句読点や記号)
使い方:
- 直接テキストを渡す場合:Bash
echo "Hello world! これは日本語のテストです。" | grep -oE '\w+|[^\w\s]' | wc -l
出力例: 15(実際の gpt-4o では19トークンなので、あくまで近似値です) - ファイルの内容をカウントする場合:Bash
cat 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 (デフォルト) でカウント:Bash
echo "Hello world! これは日本語のテストです。" | tokencount
出力例:19
- モデルを指定してカウント (gpt-3.5-turbo):Bash
cat 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レスポンスを渡す
注意事項
- 日本語の特殊性:
- 英語より20~50%トークン数が増加(漢字の分割処理のため)
- 例:
echo "麒麟" | tiktoken
→ 4トークン(通常の2文字の倍)
- ストリーミング応答時:
APIレスポンスにusage
フィールドが含まれないため、自前で計算必須 - GUIツール代替:
対話型で可視化したい場合はOpenAI公式Tokenizerが便利(ブラウザ上で色分け表示)
まとめ
日常的な開発では、まず方法1で当たりをつけ、APIに渡す直前の処理などで厳密な数が必要な場合は方法3を使う、という使い分けがおすすめです。
方法 | コマンド | 精度 | 手軽さ | おすすめの用途 |
方法1 (grep) | grep -oE '\w+|[^\w\s]' | wc -l | 高い近似値 | ◎ 非常に手軽 | ちょっとしたテキスト長をざっくり把握したいとき |
方法2 (wc) | wc -w | 低い | ○ 最も手軽 | 非推奨(参考程度) |
方法3 (tiktoken) | tokencount (自作) | 正確 | △ 要準備 | 正確なコスト計算やAPI利用前の最終確認 |
コメント