Azure OpenAIではGPT系の自然言語処理モデルを使用してさまざまなタスクを処理することができます。
APIを使用するために料金が発生しますが、リクエストごとにどの程度の料金が発生するのかを知る必要があります。またモデル毎の上限トークンを考慮してアプリを設計する必要があります。
本記事ではトークンの考え方と計算方法について解説します。
概要
Azure OpenAI Serviceでは、価格を以下のページで確認することができます。
azure.microsoft.com
text-to-imgのDALL-Eを除いて、1000トークンあたりの価格が表示されているのが分かります。
主に使用されるChatGPT系モデルの2023年4月時点での料金は以下の通りです。
モデル名 | プロンプト (1,000 トークンあたり) | 完了 (1,000 トークンあたり) |
---|---|---|
ChatGPT (gpt-3.5-turbo) | ¥0.265011 | ¥0.265011 |
GPT-4(8K コンテキスト) | ¥3.976 | ¥7.951 |
GPT-4(32K コンテキスト) | ¥7.951 | ¥15.901 |
消費するトークン数によって料金が決定します。
またadaやdavinchiなどのモデルによっても価格が異なります。
また費用に限らず、モデル毎に一度に処理可能なトークン数が決まっているため、GPTを使用するサービスにおいてトークン数の計算は必須事項になります。 learn.microsoft.com
トークンとは?
トークンとは単語を分割したものと考えることができます。
例えば以下のようにHow to use api.
と入力したケースを考えます。後に紹介する公式のトークン計算サイトを使用して図示したものが下に示されていますが、単語ごとに色分けされています。この1つの固まりがトークンです。
Token Idsの項目に切り替えると、それぞれの単語が番号に置き換えられていることが分かります。
入力した言葉はこのような数値に変換されてAIに入力されています。
実際に消費されるトークン数は?
トークンという単位を扱っていますが、実際にリクエストを送信したときに、これをどのくらい消費するのかについては書かれていません。
理由としては、裏側で形態素解析(日本語を単語のパーツに分割する)処理を行っているためです。単に日本語1文字=1トークンとして処理されているわけではないため、入力する文字列によって消費トークンが異なります。
とはいえざっくりとした基準は分かるので、日本語を入力した場合におおむねどのくらいのトークン数になるのかを、後ほど実例で示したいと思います。
トークンを計算する
ブラウザから計算する
OpenAI社が計算用のサイトを提供しているため、すぐにトークン数を知りたい場合はこちらから計算することができます。
先ほど図で示したようなトークンの計測のほか、入力した文章に対して色分けしてくれたり、置き換えられるトークンの数値を確認できます。
対応しているtokenizerは確認できませんでしたが、ChatGPT系のcl100k_baseではなく、p50k_baseもしくはr50k_baseで計算を行っているようです。
platform.openai.com
プログラム上で計算する
以下2つのライブラリのいずれかを使用して計算できます。
tiktokenの使用にはPython3.8以上のバージョンが必要になります。
pip install tiktoken==0.3.3 pip install transformers==4.28.1
tiktoken
tiktokenはGPT系のトークン数計算に対応しています。 以下のソースコードからトークン数を計算することができます。
import tiktoken chat="" encoding_2 = tiktoken.encoding_for_model("gpt2") encoding_35 = tiktoken.encoding_for_model("gpt-3.5-turbo-0301") encoding_4 = tiktoken.encoding_for_model("gpt-4-0314") encoding_d2 = tiktoken.encoding_for_model("text-davinci-002") def calc_token_tiktoken(chat, encoding_name): encoding = tiktoken.get_encoding(encoding_name) num_tokens = len(encoding.encode(chat)) return num_tokens print("tiktokenで計測したGPT2のトークン数 :", calc_token_tiktoken(chat, encoding_2.name)) print("tiktokenで計測したGPT3.5のトークン数:", calc_token_tiktoken(chat, encoding_35.name)) print("tiktokenで計測したGPT4のトークン数 :", calc_token_tiktoken(chat, encoding_4.name)) print("tiktokenで計測したtext-davinchi002のトークン数", calc_token_tiktoken(chat, encoding_d2.name))
各モデルとtokenizerについては、Githubのソースコードから一覧を確認することができました。
github.com
GPT2TokenizerFast
GPT2TokenizerFastではGPT2のトークン数計算に対応しています。
Pythonのバージョン3.8未満の環境で使用したい場合は、tiktokenが使えないためこちらを使う必要があります。ただしGPT2の計算方法なので、正確に見積もりができない可能性があります。
以下のソースコードからトークン数を計算できます。
from transformers import GPT2TokenizerFast def calc_token(moji): tokenizer = GPT2TokenizerFast.from_pretrained("gpt2") return len(tokenizer.encode(moji)) chat="" print("GPT2TokenizerFastで計測したトークン数:",calc_token(chat))
その他
.NET系、C#からもChatGPTではないGPT-3系モデルであればトークン数を計算することができます。
AI.Dev.OpenAI.GPTと検索して、nugetパッケージを導入します。
以下のソースコードからトークン数を計測できます。
using AI.Dev.OpenAI.GPT; List<int> tokens = GPT3Tokenizer.Encode(text); Console.WriteLine(tokens.Count);
トークン消費数の例
実際に日本語を入力してトークン数を計算した際の例を示します。
以下の文章を使ってトークン数を計算してみます。
こんにちは。私の名前はJBS太郎です。JBSに所属している架空の社員です。
結果は次の通りです。
日本語の長さ: 37 GPT2TokenizerFastで計測したトークン数: 52 tiktokenで計測したGPT2のトークン数 : 52 tiktokenで計測したGPT3.5のトークン数: 33 tiktokenで計測したGPT4のトークン数 : 33 tiktokenで計測したtext-davinchi002のトークン数 52
Webのほうからトークン数を計測したところ、52トークンとなっていました。
もう少し長い文章を入力してみます。
日本語の長さ: 747 GPT2TokenizerFastで計測したトークン数: 890 tiktokenで計測したGPT2のトークン数 : 890 tiktokenで計測したGPT3.5のトークン数: 693 tiktokenで計測したGPT4のトークン数 : 693 tiktokenで計測したtext-davinchi002のトークン数 890
890トークンで計算結果は一致しています。
結論
ChatGPTとそれ以外のモデルで、トークン数の計算に差異があることが分かりました。
日本語でChatGPTを使用する場合、おおむね1トークン≒1文字程度と考えることができそうです。
また実際の計算にはPythonのtiktokenライブラリを使うのがよく、ChatGPT以外のモデルであればGPT2TokenizerFastや、C#などの他の言語でも計算可能であることが分かりました。
余談ですが、今回はタイトルを「Azure OpenAI」としましたが、通常のOpenAI APIでも同様の計算で見積もりができるはずです。
おわりに
今回はGPTのトークン数について調査しました。
実際にトークンについて計算することは、プログラム設計やコスト見積もりの際に必ず行わなければならない重要なポイントとなりますので、実際にプログラムやブラウザから計算を行ってみてください。
今回の記事が皆様のお役に立てれば幸いです。