【OpenAI】API利用料を節約したい…!トークンシステムについて調べてみた

こんにちは、第2開発部の高山です。

近年のトレンドと言えばなんといってもAI生成ですよね。 最近発表された動画生成モデルのSoraや、画像の読み取りに対応したGPT-4 Turbo with visionなど。 日々AI技術の進歩に驚かされております。

有料にはなりますが、私たち一般ユーザーでもOpenAIのAPIを利用すれば簡単にアプリにChatGPTによるAI生成機能を盛り込むことができる時代になりました。

料金システムはリクエストのテキスト量に基づいた「トークン」という単位に応じた従量課金制で、 詳しくはOpenAIの公式ぺージに記載されています。

…が、パッと見ただけではどれくらいかかってくるのか見当がつきません。

本記事では「トークンって何?」というところからはじめ、 特に日本語を用いた場合、どれくらいのトークンが消費されるのかも実際にAPIを呼んで調べてみたので、その内容をご紹介します。

これから利用してみたいと考えている方の参考になれば幸いです。

OpenAIのAPIについて

トークンって何?

まず、「トークン」とは何者なのでしょうか?

ざっくりいうと、単語を分割したものです。 OpenAIはこのトークンの消費量に応じた利用料金を請求します。

入力したテキストが何トークンになるかはOpenAIの下記のページから確認することができます。 https://platform.openai.com/tokenizerplatform.openai.com

トークンの目安

目安として、

  • 日本語なら1文字1トークン

  • 英語なら1単語1トークン

としてざっくり見積もることはできますが、 「Sequences」のように2トークン以上になる英単語もあれば、「こんにちは」などの1トークンで済む日本語もあります。

TokenIDsの項目に切り替えると、各単語が数値に置き換えられていることが確認できます。 実際にAIに入力する際は、このTokenIDの値を用いているようです。

トークンあたりの利用料金

OpenAIの利用料金は、2024年2月現在、以下になります。

モデル 入力(/ 1K tokens) 出力(/ 1K tokens)
GPT-3.5 Turbo $0.0005 $0.0015
GPT-4 Turbo $0.01 $0.03
GPT-4 $0.03 $0.06

https://openai.com/pricing

GPT4は高性能ですがコストが高く、GPT3.5の方が圧倒的に安く利用できます。 (20倍!) 簡単な内容を扱う場合は、部分的にでもGPT3.5の利用を検討する必要がありそうですね。

GPT-4 Turboは昨年11月に発表されたモデルで、GPT-4よりも高性能で安価に利用できます。 特に理由がなければTurboを使えば良さそうです。

注目すべきは、すべてのモデルで入力は出力より高く料金設定されている点です。 APIに送信する文章のトークンを少なくすることが料金節約において重要になってきそうです。

実際にAPIを呼んでみた

さて、日本語のアプリでAI生成機能を実装する場合、生成結果は日本語で受け取りたいことが多いと思います。

そこで気になったのが、「日本語で直接指示する場合」と、「英語で指示し、日本語で結果を受け取る場合」 どちらの消費トークンが少なくなるかという点です。実際にPostmanでAPIを呼んで比較してみました!

「日本語」vs 「英語」どちらの消費トークンが少ないのか

まず、日本語と英語ではどちらの消費トークンが少なくなるかを確認してみます。

ここはシンプルに、「こんにちは」と、「hello」でリクエストを投げて確認してみます。

この場合、前者は日本語、後者は英語で回答が返ってきます。 レスポンスは以下のようになりました。

質問:「こんにちは」
回答:「こんにちは!何かお手伝いできることがありますか?」
質問:「hello」
回答:「Hello! How can I assist you today?」
質問のトークン 回答のトークン
日本語 1 19
英語 1 9

「こんにちは」「hello」がそれぞれ1トークンのはずなのですが、Postmanに表示されているレスポンス値では、質問の消費トークン数が8と表示されていました。

7トークンは直接の質問文以外の要素で消費されているようです。以降、この7トークンは無視して比較します。

では、別のリクエストを投げてみましょう。日本の首都を教えてもらいました。

質問:「日本の首都を教えてください。」
回答:「日本の首都は東京です。」
質問:「Tell me the capital of Japan.」
回答:「The capital of Japan is Tokyo.」
質問のトークン 回答のトークン
日本語 12 11
英語 7 7

まだ簡単なリクエストですが、基本的には英語で質問したほうが消費トークンは少なくなりそうなことがわかりました。

「日本語で直接指示を出す」 VS 「英語で質問し、日本語で出力する」

英語で質問することで消費トークンが節約できるとしても、上記の例だと回答も英語になってしまいます。 再度アプリ内で翻訳するというのも二度手間なので、出力結果は日本語の方が都合いいですよね。

では、「英語で質問」し、「日本語で出力させる」場合はどうなるのでしょうか。

まずは先ほどの首都の質問を英語で投げ、日本語で回答させてみました。

質問:「Tell me the capital of Japan. Please write your full answer in Japanese.」
回答:「日本の首都は東京です。」
質問のトークン 回答のトークン
日本語→日本語 12 11
英語→日本語 15 11

このような簡単な例だと日本語で質問したほうがわずかに消費トークンは少なく済みました。

ただし、日本語で出力させるための指示文を含めても質問のトークン数に3トークンの差しかありません。さらに条件が複雑になってくると逆転してきそうですね。

実際にアプリで生成された値を使う場面を想定して少し複雑な条件を与えてみます。

文字列からオブジェクトを生成するために、 GPTからの回答を指定したフォーマットに格納するようにプロンプトを作成しました。文字数を節約するため、ここからは命令口調にしてみます。

この程度の条件の指示文であれば何度かリクエストしていると同じような回答がでてくるので、似たものが出るまで何度か試してみました。

質問:「一意の答えがあるクイズを1つ出題しろ。返信は次のフォーマットにしろ。クイズ本文:{本文の文字列}\n答え:{答えの文字列}\n解説:{解説の文字列}」
回答:「クイズ本文:日本の首都はどこですか?\n答え:東京\n解説:日本の首都は東京です。これは1868年(明治元年)に江戸から東京に改名され、日本の政治、経済、文化の中心として機能している都市です。」
質問:「Submit one quiz with a unique answer. All replies should be in Japanese and formatted as follows クイズ本文:{body string}\n答え:{answer string}\n解説:{explanation string}」
回答:「クイズ本文:日本の首都はどこですか?\n答え:東京\n解説:日本の首都は東京です。明治時代に江戸から改名され、今日に至るまで政治、経済、文化の中心地として栄えています。」
質問のトークン 回答のトークン
日本語→日本語 75 94
英語→日本語 48 84

先ほどの首都の質問はわずかに日本語→日本語のパターンの方がトークン数は少なくなっていましたが、 今度は英語→日本語のパターンが27トークンも少なく済むという結果になりました!

まとめ

質問文の条件が長く複雑になってくる場合は、「英語で質問し、日本語で出力させる」という方法でトークンの節約が可能な場合がありそうですね。

仮に上記のクイズ生成の場合、入力文のみを比較すると1万回のクイズ生成で$2.7(約400円)の差が生まれます。

回答の品質や文章量にもばらつきが出てくるはずなので一概には言えませんが、必要に応じて英語での生成を検討してみるのも良いのではないでしょうか。

KENTEMでは、様々な拠点でエンジニアを大募集しています!
建設×ITにご興味頂いた方は、是非下記のリンクからご応募ください。
hrmos.co hrmos.co hrmos.co hrmos.co hrmos.co hrmos.co hrmos.co hrmos.co