見出し画像

GPT3.5 APIで16kトークンを扱えるようになった!...で、16kトークンってどのぐらいの分量の情報なの?という人向けの記事

OpenAIの唐突なアップデートでてんやわんやです(良い意味で)。

世の中function calling一色に染まっていますが、地味にGPT-3.5が16kトークンに対応していたり、4kトークン版の料金が下がったり、GPT-4のウェイティングリストを早期に消し去る宣言が出ていたりと、さらっと凄いことばかりやってのけるのがOpenAIの恐ろしいところです。ちなみに私の元にはまだGPT-4の利用許可が下りておりません。

16kトークンの分量について

地味に嬉しいのがGPT-3.5の16kトークン版のAPIが用意されたことでして、GPT-3.5は高速だけどいい加減4kトークンのコンテキスト制限はつらいなー、という声が日々聞こえていたことと思います。

一気に4倍になったことでざっくり日本語換算で1万6000文字ぐらい扱えるようになったのですが、数字だけだとイマイチ分量が分かりづらいです。新書で大体8〜12万字なので、新書サイズの情報は扱えないことは分かる。

というわけで、青空文庫のデータから「大体16kトークンにギリギリおさまりそう」な小説をセレクトして試してみました。

選定基準は過去に文芸研究会に属していた私のカンです。

実行しているソースコード

import openai

def system_message(source: str) -> str:
    system_message = f"""以下の小説は日本人の作家によって書かれたものです。この内容を踏まえて、ユーザーの質問に答えなさい。

##小説
{source}
"""
    return system_message

def run_conversation(source: str, user_prompt: str) -> str:
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo-16k",
        max_tokens=1000,
        messages=[
            {"role": "system", "content": system_message(source)},
            {"role": "user", "content": user_prompt}
        ],
    )
    return response

run_conversation関数にsourceとして書籍データを投入し、user_promptにユーザープロンプトを投入しています。

太宰治「走れメロス」

走れメロスは青空文庫のデータで10,873文字のテキストデータでした。

この小説の最初から最後までのあらすじを書きなさい。

ユーザープロンプト

試しにユーザープロンプトを投入してみると以下のトークン消費量でした。日本語の文字数よりは少し上振れしています。

プロンプトトークン数:12,187トークン
レスポンストークン数:720トークン
トータルトークン数:12,907トークン

レスポンスで返ってきたのは以下の文章です。しっかりGPTが最初から最後まで読めていることが分かります。

物語は、主人公のメロスが、邪智暴虐の王を打倒するために決意する場面から始まります。メロスは政治には疎く、平穏な牧人の生活を送ってきたが、悪に対しては敏感であった。ある日、メロスは妹の結婚式のために市にやって来ますが、そこで王の悪行を知り、王を除かなければならないと決心します。そして、王城に侵入しようとするも逮捕されてしまいますが、自身の懐中から出てきた短剣が原因で騒ぎが起こります。王の前に引き出されたメロスは、王との対話の中で信頼をかけてくれることを条件に三日間の猶予を乞うため、結婚式を挙げてから戻ることを頼みます。王は猶予を与え、メロスは結婚式を挙げるために村へ帰ります。

しかし、メロスは途中で橋が流れており、友人のセリヌンティウスとの再会も叶いません。さらに山賊に襲われるものの脱出し、疲れ果ててしまいます。しかし、水の泉を見つけて元気を取り戻し、再び走りだします。やがて、絶体絶命の状況でセリヌンティウスと再会し、セリヌンティウスはメロスを信じて縄を解きます。二人は抱き合い喜び合い、しかし王が現れます。王は二人を讃え、自分も仲間に入れてほしいと頼みます。群衆からは喝采が起きますが、メロスは怒ります。

最終的に、メロスは刑場に到着し、セリヌンティウスを助け出します。しかし、結局はセリヌンティウスがメロスを殴り、メロスも報いを返します。二人は抱き合い、群衆の中から歓声が上がります。物語は結末を告げますが、メロスが真の勇者であり、信頼と忠誠の力が勝利をもたらしたことを示しています。

宮沢賢治「セロ弾きのゴーシュ」

セロ弾きのゴーシュは青空文庫で13,010文字のテキストデータでした。

こちらも同じく以下のプロンプトであらすじを要約してもらいます。

この小説の最初から最後までのあらすじを書きなさい。

ユーザープロンプト

この作品でのトークン消費量は以下の通りでした。

プロンプトトークン数:13,224トークン
レスポンストークン数:567トークン
トータルトークン数:13,791トークン

旧字体は基本的にトークン数が大きくなる傾向なので「走れメロス」は結構トークン数が上振れしていましたが、宮沢賢治の文章は比較的平易な表現で書かれていることから文字数とトークン数の差はそこまでありませんでした。レスポンス結果は以下の通りです。

物語は、セロ弾きのゴーシュという男性が町の活動写真館でセロを弾く仕事をしているところから始まります。ゴーシュは上手ではなく、楽団のメンバーからいじめられています。ある日、楽団が町の音楽会のための練習をしている中、ゴーシュも一生懸命セロを弾いていますが、楽長から叱られてしまいます。

翌日、ゴーシュは黒いセロの包みを持って帰宅し、夜遅くまで練習をします。すると、扉を叩く音があり、部屋に入ってきたのは三毛猫のような猫でした。猫はゴーシュのセロの演奏を聞きたいと言い、ゴーシュは快く演奏を披露します。猫は喜んで聞いていましたが、窓にぶつかってしまいました。その後、猫が出て行くと、次に小熊がやってきて同じように演奏を披露しました。

数日後、金星音楽団の公演が行われ、ゴーシュも演奏することになります。ゴーシュは虎狩りの曲を一生懸命に演奏し、会場は沸き立ちます。演奏後、ゴーシュは楽屋に戻り、仲間たちから賞賛されます。

物語は、ゴーシュが自宅に戻り、黙々と練習を続ける場面で終わります。ゴーシュは自分の演奏が他の動物たちの病気を治す効果があると知り、喜びとともにますます練習に励みます。

紀貫之「土佐日記」

旧字体でトークン数がかさむとするなら、いわゆる古典の名作はどうでしょう。土佐日記は青空文庫で14,897文字のテキストデータです。ただ、テキストデータ中にかなりの量「1字下げ」みたいな指令文字が入っているためにトークン数上限を超えてしまっていたので、そのあたりはノイズとして削除した12,825文字のテキストデータで検証しました。

こちらも同じく以下のプロンプトであらすじを要約してもらいます。

この小説の最初から最後までのあらすじを書きなさい。

ユーザープロンプト

この作品でのトークン消費量は以下の通りでした。

プロンプトトークン数:14,761トークン
レスポンストークン数:574トークン
トータルトークン数:15,335トークン

さすが古典、トークン数がしっかり上振れしていますね。しかし、そもそもGPTは日本の古典を読めるのだろうか・・・?

この小説は「土佐日記」という作品であり、紀貫之によって書かれました。物語は、主人公が船で日本各地を旅する様子を描いています。

物語は、主人公が旅立つ日から始まります。彼は船に乗り込み、和泉の国まで旅し、八木の康教という人物と出会います。その後、講師の馬や守という人々との出会いや別れを経て、主人公は大湊、浦戸、大津などを経由して京都に近づきます。

途中で海賊に襲われたり、風や浪に苦しめられたりしながらも、主人公は旅を続けます。彼は島々や川の美しさを楽しみながら、船上で人々と交流し、詩や歌を交えることもあります。そして、主人公は山崎に到着し、船を降りて京都に向かいます。

京都に到着した主人公は、親しい人々と再会し、京都の名所を訪れます。彼は桂川の月や川原での柳の木などを楽しんでいます。しかし、彼の心にはひとりの女性への思いがあり、彼が宿泊する家に戻った時も彼女のことを思いながら詩や歌を詠みます。

物語の終わりには、主人公が船から降り、京都に留まる決意をする場面が描かれます。彼は深く感謝し、喜びを振りまいています。物語では主人公の旅が終わりますが、彼の心には旅の思い出が残り、それによって彼の人生が変わっていくことが示唆されています。

しっかり読めていたようです。これで高校生の古文の勉強が捗りますね。

所感

与謝野晶子の「みだれ髪」あたりが15,517文字だったので、文字数ギリギリデータとして採用できるかなと思ったら18,345トークン消費したため全然アウトでした。やはり旧字体というか、古典表現のものはトークン数を消費しがちです。

ここから分かることは、ちょっとした短編であればまるっと読み込ませてGPTに分析してもらうことができる、ということでして、長編でもそれなりに関連する記述をグラウンディングでプロンプトに与えてあげれば正確な要約を返すことができそうです。

少なくとも、一般的なブログ記事は長くても1万文字程度だと思いますので、ブログ記事の要約は何も考えずに可能になったということですね。英語であればもっと文字数を処理できるので、英語でのまとまった資料も気にせずに処理に回すことが可能そうです。

現場からは以上です。


この記事が気に入ったらサポートをしてみませんか?