Open17

OpenAIトークン数見積もり

nakaokatnakaokat

日本語で10162文字のテキストを使う

$ wc -m example_of_tokenizer_count.txt
   10162 example_of_tokenizer_count.txt
nakaokatnakaokat

GPT-4o はトークナイザーが変わったらしいので調べたい。

nakaokatnakaokat

gpt-3.5-turbo

❯ python check.py
start
model:
gpt-3.5-turbo-0125
object:
chat.completion
usage:
CompletionUsage(completion_tokens=191, prompt_tokens=32, total_tokens=223)
response:
宇宙とは、私たちが住む地球や太陽、星々が存在する広大な空間のことです。無限に広がる宇宙には、惑星、銀河、そしてさらにその先には謎多き暗黒物質やエネルギーが存在するといわれています。宇宙は時間とともに変化し、私たちの知識や技術が進歩することで、ますますその謎が解き明かされつつあります。私たちは宇宙の一部であり、その壮大さと神秘性に心を打たれる存在なのです。
finish

gpt-4o

❯ python check.py
start
model:
gpt-4o-2024-05-13
object:
chat.completion
usage:
CompletionUsage(completion_tokens=70, prompt_tokens=21, total_tokens=91)
response:
宇宙は無限の広がりを持つ空間で、数えきれない星や銀河が存在します。物理法則に従い、ビッグバンで始まり、現在も膨張中です。科学の探求が進む未解明な領域です。
finish
nakaokatnakaokat

gpt-4

python check.py
start
model:
gpt-4-0613
object:
chat.completion
usage:
CompletionUsage(completion_tokens=91, prompt_tokens=32, total_tokens=123)
response:
宇宙は広大な空間で、星や惑星、銀河などの天体が存在します。また、目に見えない暗黒物質やエネルギーが存在していると考えられています。常に膨張しており、新たな発見が待っています。
finish

gpt-4-turbo

start
model:
gpt-4-turbo-2024-04-09
object:
chat.completion
usage:
CompletionUsage(completion_tokens=113, prompt_tokens=32, total_tokens=145)
response:
宇宙は広大で、地球を含む無数の星や惑星、銀河が存在します。誕生は約138億年前のビッグバンにさかのぼります。観測できる範囲内だけでも、約2000億個以上の銀河があり、そのそれぞれに恒星や星系が存在しています。
finish
nakaokatnakaokat
start
message: 日本語で百文字で宇宙について説明してください。
文字数(プロンプト): 23
model: gpt-3.5-turbo-0125
object: chat.completion
response: 宇宙とは、私たちが住む地球を含む広大な宇宙空間のことです。宇宙には星や惑星、銀河など様々な天体が存在し、無限の可能性が広がっています。宇宙は謎に満ちた神秘的な世界であり、私たちがまだ理解し尽くせていない多くの謎が秘められています。人類は宇宙に関する研究を進め、宇宙開発を目指して様々な取り組みが行われています。我々が知るだけでも、宇宙はとても広大かつ複雑な世界であることが伺えます。
文字数(レスポンス): 191
usage:
CompletionUsage(completion_tokens=229, prompt_tokens=30, total_tokens=259)
finish
start
message: 日本語で百文字で宇宙について説明してください。
文字数(プロンプト): 23
model: gpt-4-0613
object: chat.completion
response: 宇宙は無限大の存在で、数々の星や惑星、彗星、銀河が浮遊しています。この広大な領域では、星が誕生し、進化し、死んでいきます。また、その神秘と美しさから、人々に探査の興奮を引き立てます。
文字数(レスポンス): 91
usage:
CompletionUsage(completion_tokens=103, prompt_tokens=30, total_tokens=133)
finish
start
message: 日本語で百文字で宇宙について説明してください。
文字数(プロンプト): 23
model: gpt-4-turbo-2024-04-09
object: chat.completion
response: 宇宙は広大な空間で、星、惑星、彗星、銀河などが存在します。地球もその一部であり、宇宙は未だに拡大を続けています。科学者たちは望遠鏡を使って遠い天体を観察し、宇宙の起源や進化について研究しています。宇宙の大部分は未知であり、多くの謎が残っていますが、その神秘性が人々の探求心をかき立てます。
文字数(レスポンス): 144
usage:
CompletionUsage(completion_tokens=160, prompt_tokens=30, total_tokens=190)
finish
start
message: 日本語で百文字で宇宙について説明してください。
文字数(プロンプト): 23
model: gpt-4o-2024-05-13
object: chat.completion
response: 宇宙は、無限の広がりと無数の天体を含む空間です。ビッグバンから始まり、銀河、恒星、惑星などが形成されました。科学者は宇宙を研究し、その成り立ちや未来について理解を深めています。
文字数(レスポンス): 88
usage:
CompletionUsage(completion_tokens=69, prompt_tokens=20, total_tokens=89)
finish
nakaokatnakaokat

青空文庫の小説で試した

文字数: 10162
GPT-4 (cl100k_base) tokens: 11476
GPT-4o (o200k_base) tokens: 8884, (22.59 % ダウン)

この例だと
11476/10162 ~= 1.13
8884/10162 ~=0.87
なので日本語の文字数に対する効率はGPT-4は113%、GPT-40は87%

nakaokatnakaokat

たまに「政治」などの名詞、「ある」などの動詞が1トークンになっている。

以前のモデルと比べて、トークン分割されているマルチバイト文字は少なくなっている。

nakaokatnakaokat

ローカルでも試す

import tiktoken
# print available models
# print(tiktoken.list_encoding_names())
# get user input or default text
text = input("Enter text: ") or "こんにちは世界"
enc = tiktoken.encoding_for_model("gpt-4o")
tokens = enc.encode(text)
print(f"Tokens: {tokens}")
# decode and print the text
for token in tokens:
    decoded_token = enc.decode([token])
    print(f"{decoded_token}")
# print encoding name
print(f"Encoding: {enc.name}")
# print the number of input characters
print(f"Number of input characters: {len(text)}")
# print the number of tokens
print(f"Number of tokens: {len(tokens)}")

日本語の一般的な単語からなる文章

python tiktoken_count.py
['gpt2', 'r50k_base', 'p50k_base', 'p50k_edit', 'cl100k_base', 'o200k_base']
Enter text: 
Tokens: [95839, 28428]
こんにちは
世界
Encoding: o200k_base
Number of input characters: 7
Number of tokens: 2

jsonっぽい入力

python tiktoken_count.py
Enter text: {"input: "こんにちは世界"}
Tokens: [10848, 2586, 25, 392, 95839, 28428, 18583]
{"
input
:
 "
こんにちは
世界
"}
Encoding: o200k_base
Number of input characters: 19
Number of tokens: 7
nakaokatnakaokat

料金の比較のためにグラフにした。

gpt-4o-mini が圧倒的に安い