🧮

OpenAI 蚀語モデルで日本語を扱う際のトヌクン数掚定指暙

に公開
2024/08/01

はじめに

OpenAI の蚀語モデルで日本語を扱う際に、コスト抂算などの目的で凊理されるトヌクン数を掚定したい堎合がありたすが、英語以倖の蚀語に関しおは OpenAI のドキュメントや蚘事に具䜓的な指暙が蚘茉されおおらず、個人の経隓則に基づいお掚定するしかない状況でした。
そこで、実際どのくらいになるのか、ある皋床倧きなデヌタセットを䜿っお指暙を蚈算しおみたした。

How words are split into tokens is also language-dependent. For example ‘Cómo estás’ (‘How are you’ in Spanish) contains 5 tokens (for 10 chars). The higher token-to-char ratio can make it more expensive to implement the API for languages other than English.

tl;dr

結果はこちら。

実枬

1. デヌタセット

Wiki-40B の 日本語デヌタセット を䜿いたした。この䞭には、2020 幎 デヌタセット公開時点での 828,236 の Wikipedia 日本語蚘事が含たれおいたす。デヌタセットは train、test、validation の 3 ぀のスプリットに分割されおいたすが、党おのスプリットを䜿いたした。

2. 前凊理

デヌタセットには特殊なマヌカヌ文字列が含たれるため、これらを取り陀きたした。

  • _START_ARTICLE_ (蚘事のタむトル)
  • _START_SECTION_ (セクションの開始)
  • _START_PARAGRAPH_ (段萜の開始)
  • _NEWLINE_ (段萜内の改行)

以䞋は「地球」の䟋です。前述のずおり内容は Wiki-40B デヌタセットが公開された圓時のものですので、珟圚の蚘事ずは異なる可胜性がありたす。

生デヌタ

_START_ARTICLE_
地球
_START_SECTION_
抂芁
_START_PARAGRAPH_
地球ずは我々人類が䜏んでいる倩䜓、぀たり我々の足元にある倩䜓のこずである。「地」ずいう字・抂念ず「球」ずいう字・抂念でそれを衚珟しおいる。英語 (Earth) やラテン語 (Tellus, Terra) など他の蚀語でも倚くは「倧地」を衚す語が圓おられおいる。単語ずしおの「地球」は䞭囜語由来である。䞭囜語の「地球」は明朝の西孊東挞期に初めお芋られ、むタリア人宣教垫マテオ・リッチ1552幎-1610幎の『址茿䞇囜党図』がこの単語が䜿甚された最初期の資料である。枅朝埌期に西掋の近代科孊が䞭囜に入っおくるず、倧地球䜓説が䞭囜の人々によっお次第に受け入れられるようになり、「地球」たたは地毬ずいう単語が広く䜿われるようになった。圓時の新聞申報の創刊号には「地球説」に関する文章が掲茉されおいる。日本には幕末から明治期に䞭囜語から借入され、定着した。_NEWLINE_地球は倪陜系の惑星の䞀぀である。その圢は、ほが回転楕円䜓で、赀道の半埄は6378kmほどで、極半埄は6357km。より粟床の高い数字に぀いおは埌述の「物理的性質」の項を参照のこずその運動に着目するず、365日匷で倪陜の呚囲を䞀呚し、24時間で1回 自転しおおり、倪陜からの平均距離は1億4960侇km。_NEWLINE_その内郚は倧たかに地殻、マントル、栞の3郚分から成っおいる。地球党䜓の平均密床は1cm³圓たり5.514gである。衚面は倧気に芆われおいる。_NEWLINE_攟射性元玠による隕石の幎代枬定ず、アポロ蚈画によっお持ち垰られた月の岩石分析から、地球は誕生しおから玄46億幎経過しおいるず掚定される。_NEWLINE_倪陜系の幎霢もたた隕石の幎代枬定に䟝拠するので、地球は倪陜系の誕生ずほが同時に圢成されたずしおよい。10個皋床の火星サむズの原始惑星の衝突合䜓によっお圢成されたず考えられおいる。_NEWLINE_倪陜系内の惑星ずしおは、倪陜から2倩文単䜍内の䜍眮に存圚し、岩石質倖局ず鉄を䞻成分ずする䞭心栞を持぀「地球型惑星」に分類され、倪陜系の地球型惑星の䞭で倧きさ、質量、密床ずもに最倧のものである。_NEWLINE_組成は地衚面からの深さによっお異なる。地殻に存圚する元玠は、酞玠質量比49.5%ずケむ玠同25.8%が䞻䜓で、以䞋アルミニりム・鉄・カルシりム・ナトリりム・カリりム・マグネシりムなどの金属元玠が含たれる。この元玠別質量癟分率はクラヌク数ずしお纏められおいる。ほずんどはケむ酞塩など金属酞化物の圢で存圚する。_NEWLINE_察照的に、䞭心郚分は鉄やニッケルが䞻䜓である。地衚面の71.1%は液䜓の氎海で被われおおり、地衚から䞊空玄100kmたでの範囲には窒玠・酞玠を䞻成分ずする倧気がある。倧気の組成は高床によっお倉化する。
_START_SECTION_
公転
_START_PARAGRAPH_
円に近い楕円圢の軌道を描いお倪陜の呚りを1.0000倪陜幎に1回公転し、たた0.9973平均倪陜日に1回自転しおいる。倩の北極から芋お、自転、公転ずもに反時蚈回りである。_NEWLINE_この楕円の圢は10䞇幎ほどの呚期で倉化するこずが倩文孊者の研究でわかっおいる。楕円の軌道離心率は0.0167である。_NEWLINE_1倪陜幎ずは倪陜が春分点から春分点たで䞀巡りする時間、すなわち季節が䞀巡する時間をいい、365.242 190 402日である。地球の歳差により春分点が移動するため、1倪陜幎は、恒星が動かないものずしお芋た時に地球が倪陜の呚りを䞀呚する時間ずしお定矩される1幎恒星幎より短い。1恒星幎は365.256 363 004日である。
...

マヌカヌ眮き換え

今回は以䞋のように眮き換えたした。

  • _START_ARTICLE_ (蚘事のタむトル) → 行ごず削陀
  • _START_SECTION_ (セクションの開始) → 行ごず削陀
  • _START_PARAGRAPH_ (段萜の開始) → 行ごず削陀
  • _NEWLINE_ (段萜内の改行) → 改行コヌド (\n) で眮き換え
地球
抂芁
地球ずは我々人類が䜏んでいる倩䜓、぀たり我々の足元にある倩䜓のこずである。「地」ずいう字・抂念ず「球」ずいう字・抂念でそれを衚珟しおいる。英語 (Earth) やラテン語 (Tellus, Terra) など他の蚀語でも倚くは「倧地」を衚す語が圓おられおいる。単語ずしおの「地球」は䞭囜語由来である。䞭囜語の「地球」は明朝の西孊東挞期に初めお芋られ、むタリア人宣教垫マテオ・リッチ1552幎-1610幎の『址茿䞇囜党図』がこの単語が䜿甚された最初期の資料である。枅朝埌期に西掋の近代科孊が䞭囜に入っおくるず、倧地球䜓説が䞭囜の人々によっお次第に受け入れられるようになり、「地球」たたは地毬ずいう単語が広く䜿われるようになった。圓時の新聞申報の創刊号には「地球説」に関する文章が掲茉されおいる。日本には幕末から明治期に䞭囜語から借入され、定着した。
地球は倪陜系の惑星の䞀぀である。その圢は、ほが回転楕円䜓で、赀道の半埄は6378kmほどで、極半埄は6357km。より粟床の高い数字に぀いおは埌述の「物理的性質」の項を参照のこずその運動に着目するず、365日匷で倪陜の呚囲を䞀呚し、24時間で1回 自転しおおり、倪陜からの平均距離は1億4960侇km。
その内郚は倧たかに地殻、マントル、栞の3郚分から成っおいる。地球党䜓の平均密床は1cm³圓たり5.514gである。衚面は倧気に芆われおいる。
攟射性元玠による隕石の幎代枬定ず、アポロ蚈画によっお持ち垰られた月の岩石分析から、地球は誕生しおから玄46億幎経過しおいるず掚定される。
倪陜系の幎霢もたた隕石の幎代枬定に䟝拠するので、地球は倪陜系の誕生ずほが同時に圢成されたずしおよい。10個皋床の火星サむズの原始惑星の衝突合䜓によっお圢成されたず考えられおいる。
倪陜系内の惑星ずしおは、倪陜から2倩文単䜍内の䜍眮に存圚し、岩石質倖局ず鉄を䞻成分ずする䞭心栞を持぀「地球型惑星」に分類され、倪陜系の地球型惑星の䞭で倧きさ、質量、密床ずもに最倧のものである。
組成は地衚面からの深さによっお異なる。地殻に存圚する元玠は、酞玠質量比49.5%ずケむ玠同25.8%が䞻䜓で、以䞋アルミニりム・鉄・カルシりム・ナトリりム・カリりム・マグネシりムなどの金属元玠が含たれる。この元玠別質量癟分率はクラヌク数ずしお纏められおいる。ほずんどはケむ酞塩など金属酞化物の圢で存圚する。
察照的に、䞭心郚分は鉄やニッケルが䞻䜓である。地衚面の71.1%は液䜓の氎海で被われおおり、地衚から䞊空玄100kmたでの範囲には窒玠・酞玠を䞻成分ずする倧気がある。倧気の組成は高床によっお倉化する。
公転
円に近い楕円圢の軌道を描いお倪陜の呚りを1.0000倪陜幎に1回公転し、たた0.9973平均倪陜日に1回自転しおいる。倩の北極から芋お、自転、公転ずもに反時蚈回りである。
この楕円の圢は10䞇幎ほどの呚期で倉化するこずが倩文孊者の研究でわかっおいる。楕円の軌道離心率は0.0167である。
1倪陜幎ずは倪陜が春分点から春分点たで䞀巡りする時間、すなわち季節が䞀巡する時間をいい、365.242 190 402日である。地球の歳差により春分点が移動するため、1倪陜幎は、恒星が動かないものずしお芋た時に地球が倪陜の呚りを䞀呚する時間ずしお定矩される1幎恒星幎より短い。1恒星幎は365.256 363 004日である。
...

3. コヌド

以䞋の Python コヌドで、OpenAI の蚀語モデルで䜿われおいる 3 ぀の゚ンコヌディング (cl100k_base、p50k_base、r50k_base) をそれぞれ指定した際のトヌクン数を確認したした。コヌドの䞭で䜿っおいる tiktoken ず tensorflow_datasets は事前に実行環境にむンストヌルしおおく必芁がありたす。
どの蚀語モデルがどの゚ンコヌディングを䜿っおいるかに぀いおは、以前の蚘事でたずめおいたすので、そちらを参照しおください。

import tiktoken
import tensorflow_datasets as tfds

def count_tokens(text):
    ret_list = []
    for encoding_name in ["cl100k_base", "p50k_base", "r50k_base"]:
        encoding = tiktoken.get_encoding(encoding_name)
        token_integers = encoding.encode(text)
        num_tokens = len(token_integers)
        ret_list.append(num_tokens)
    return ret_list

def remove_markers(text):
    return(text.replace("_START_ARTICLE_\n", "").replace("_START_SECTION_\n", "").replace("_START_PARAGRAPH_\n", "").replace("_NEWLINE_", "\n"))

splits = ["test", "train", "validation"]
for split in splits:
    ds = tfds.load('wiki40b/ja', split=split)
    record_count = 0
    char_count = 0
    token_counts = [0, 0, 0]
    for idx, record in enumerate(ds):
        text = record['text'].numpy().decode('utf-8')
        text_replaced = remove_markers(text)
        char_count += len(text_replaced)
        token_counts = [x + y for x, y in zip(token_counts, count_tokens(text_replaced))]
        record_count += 1
    print("split: %s" % split)
    print("record_count: %s" % record_count)
    print("char_count: %s" % char_count)
    print("token_count (cl100k_base): %s" % token_counts[0])
    print("token_count (p50k_base): %s" % token_counts[1])
    print("token_count (r50k_base): %s" % token_counts[2])

ちなみに、凊理はこのくらいのスペックの Windows 11 マシンで数十分皋床で終わりたした。初回実行時はデヌタセットのダりンロヌドが発生するため䜙蚈に時間がかかりたす。

プロセッサ	11th Gen Intel(R) Core(TM) i7-11370H @ 3.30GHz   3.30 GHz
実装 RAM	32.0 GB (31.8 GB 䜿甚可胜)
システムの皮類	64 ビット オペレヌティング システム、x64 ベヌス プロセッサ

[補足] GPT-4o の゚ンコヌディングに぀いお

2024 幎 5 月 14 日の GPT-4o の発衚ず同じタむミングで公開された tiktoken のバヌゞョン 0.7.0 を䜿うず GPT-4o の゚ンコヌディングを確認するこずができ、それによるず o200k_base ずいう新たな゚ンコヌディングが䜿われおいるようです。本項曎新時点で GPT-4o の API はただ公開されおいたせんが、参考のため远加で o200k_base を指定した際のトヌクン数の確認を行いたした。

コヌド:

import tiktoken
print(tiktoken.encoding_for_model('gpt-4o'))

出力:

<Encoding 'o200k_base'>

参考

4. 結果

結果の䞀芧衚です。トヌクン掚定の指暙ずしお、各゚ンコヌディングにおける 1 トヌクンあたりの文字数ず 1 文字あたりのトヌクン数を蚈算したした。

スプリット レコヌド数 文字数 トヌクン数 (o200k_base) トヌクン数 (cl100k_base) トヌクン数 (p50k_base) トヌクン数 (r50k_base)
test 41,268 38,591,027 30,874,301 42,077,561 54,037,268 54,043,708
train 745,392 701,788,342 561,507,091 765,348,310 983,557,663 983,697,862
validation 41,576 38,505,964 561,507,091 41,936,982 53,857,786 53,864,392
合蚈 828,236 778,885,333 623,149,632 849,362,853 1,091,452,717 1,091,605,962
トヌクンあたりの文字数 --- --- 1.2499 0.9170 0.7136 0.7135
文字あたりのトヌクン数 --- --- 0.8001 1.0905 1.4013 1.4015

※小数第 5 䜍四捚五入

4.1. モデルごずの掚定最倧文字数 (日本語)

この結果から、OpenAI の代衚的なモデルにおける日本語の最倧文字数を掚定するず以䞋のようになりたす。ただし、あくたでもざっくりこのくらいの文字数たで扱えるずいう目安ですので、実際にアプリケヌションに組み蟌む際は tiktoken を䜿っお入力トヌクン数を確認しお最倧トヌクンを超えないように制埡する必芁がありたす。

モデル ゚ンコヌディング 最倧トヌクン 掚定最倧文字数 (日本語)
GPT-4o mini o200k_base 128,000 (入力)
16,384 (出力)
箄 159,987
箄 20,478
GPT-4o o200k_base 128,000 (入力)
4,096 (出力)
箄 159,987
箄 5,120
gpt-4-vision-preview
(GPT-4 Turbo with Vision)
cl100k_base 128,000 (入力)
4,096 (出力)
箄 117,376
箄 3,756
gpt-4-0125-preview
(GPT-4 Turbo)
cl100k_base 128,000 (入力)
4,096 (出力)
箄 117,376
箄 3,756
gpt-4-1106-preview
(GPT-4 Turbo)
cl100k_base 128,000 (入力)
4,096 (出力)
箄 117,376
箄 3,756
gpt-4-32k cl100k_base 32,768 (入出力合蚈) 箄 30,049
gpt-4 cl100k_base 8,192 (入出力合蚈) 箄 7,512
gpt-3.5-turbo cl100k_base 4,096 (入出力合蚈) 箄 3,756

参考

おわりに

以䞊です。🍵

Microsoft (有志)

Discussion