OpenAIのコスト削減！最適なGPTモデル選択とトークン数の管理

AI技術の進化とともに、OpenAIのAPIを使用して高度な機能を実現するプロジェクトが増えています。しかし、一方で、APIの利用料金は、トークン数やモデルの性能によって異なります。これにより、コスト管理が重要な要素となってきます。

そこで、本記事では、開発者向けにOpenAIのAPIをコスト効率よく利用するための方法を紹介します。具体的には、トークン数の計算と管理を行い、タスクに適したGPTモデルを選択する方法を解説します。これにより、コストを抑えつつ、最適なパフォーマンスを実現することが可能になります。

さらに、実践的なサンプルコードやTikTokenの使用方法も紹介しますので、すぐにでも活用できる内容を提供します。是非、この記事を参考にして、AI技術を効率的に活用してプロジェクトを成功させましょう。
<h2>GPTモデルの概要とコスト</h2>
「GPTモデルの概要とコスト」のセクションでは、現在利用可能なGPTモデルの概要と、それらのモデルに関連するコストについて説明します。以下に、このセクションでカバーする主な内容を示します。
<h3>GPT (Generative Pre-trained Transformer)の基本概念</h3>
GPTは、自然言語処理タスクにおいて高い性能を持つモデルで、大規模なテキストデータから事前学習された知識を活用します。Transformerアーキテクチャに基づいており、文章生成や質問応答など、多様なタスクに対応可能です。
<h3>GPT-3.5-turbo, GPT-4 8K, GPT-4 32Kの主な特徴と性能</h3>
GPT-3.5-turbo: OpenAIのGPT-3シリーズで、コストパフォーマンスが良く、幅広いタスクに適しています。最大4096トークンまで対応。GPT-4 8K: GPT-4シリーズのモデルで、より高い性能を持ち、最大8192トークンまで対応しています。GPT-4 32K: GPT-4シリーズの最上位モデルで、最高の性能を持ちますが、コストが高くなることが考慮されるべきです。最大32768トークンまで対応。

2023年4月現在の各モデルの比較（1K tokensあたりの料金）
<table>
<thead>
<tr>
<th rowspan="2">モデル</th>
<th rowspan="2">最大トークン数</th>
<th colspan="2">OpenAI API</th>
<th colspan="2">GPT-3.5を1とした場合の料金</th>
</tr>
<tr>
<th>Prompt
(入力)</th>
<th>Completion
(出力)</th>
<th>Prompt
(入力)</th>
<th>Completion
(出力)</th>
</tr>
</thead>
<tbody>
<tr>
<td>GPT-3.5 turbo</td>
<td style="text-align: center;">4096(4k) token</td>
<td colspan="2" style="text-align: center;">$0.002</td>
<td colspan="2" style="text-align: center;">1</td>
</tr>
<tr>
<td>GPT-4 8K context</td>
<td style="text-align: center;">8192(8k) token</td>
<td style="text-align: center;">$0.03</td>
<td style="text-align: center;">$0.06</td>
<td style="text-align: center;">15</td>
<td style="text-align: center;">30</td>
</tr>
<tr>
<td>GPT-4 32K context</td>
<td style="text-align: center;">32768(32k) token</td>
<td style="text-align: center;">$0.06</td>
<td style="text-align: center;">$0.12</td>
<td style="text-align: center;">30</td>
<td style="text-align: center;">60</td>
</tr>
</tbody>
</table>
<h2>最大トークン数とは？</h2>
トークンは、テキストを扱う際の基本単位で、通常は単語や文字の一部に対応します。GPTモデルは、入力と出力のトークン数を計算し、それに基づいてAPI利用料金が決定されます。

最大トークン数は、OpenAI APIに渡すデータの入力トークン数と、GPTからの出力トークン数の合計です。
例えば、gpt-3.5-turbo であれば入力・出力合わせて4096トークンまで使うことが出来ます。例えば、入力が3000トークンで出力が2000トークンの場合、最大数を超えるため出力は1096トークンとなります。

また、入力トークン数はOpenAI APIをコールせずに計算することが出来ますが、出力トークンは実行するまでわかりません。
そのためにも、コストを最適化させるためにはトークン数の制御が重要となります。
<h2>OpenAIのコスト最適化</h2>
OpenAIの利用料を最適化するには以下の考えが必要となります。
<ol>
 	<li>GPT-3.5 turboなら$0.002と安価だが、GPT-4なら安くても15倍以上の料金が発生する</li>
 	<li>最大トークン数を超えると、適切な出力が得られなかったり、エラーが発生して無駄なコストが発生する</li>
</ol>
この2つをプログラムで制御することでコストを最適化します。コストを考えない場合、GPT-4の方が高性能ですが本記事ではコストのみで最適化を行います。

プログラムの大きな考え方としては
<ul>
 	<li>入力サイズはtiktokenでカウントする</li>
 	<li>出力サイズは事前にはわからないので、最大トークン数の一定の割合を最大入力サイズとして利用し、その割合を変数で指定できるようにする</li>
 	<li>入力された最大入力サイズに合わせてモデルを切り替える</li>
</ul>
<h2>プログラム実装</h2>
以下が実装するプログラムとなります。
最初の openai.api_key と最大トークン数の何割を入力に使うかの input_ratio の2つを設定するだけで使えます。

```python
import openai
from tiktoken import Tokenizer, TokenizerMixin
from tiktoken.models import TokenizerModel

openai.api_key = "your_api_key"

# tiktokenによるトークン数計算の関数
def count_tokens(text):
    tokenizer = Tokenizer(TokenizerModel())
    tokens = tokenizer.tokenize(text)
    return len(tokens)

# 入力メッセージ
messages = [
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "Who won the world series in 2020?"},
]

input_text = "\n".join([f"{msg['role']}:{msg['content']}" for msg in messages])

# 入力トークン数の計算
num_input_tokens = count_tokens(input_text)

# 最大トークン数に対する入力トークン数の割合 (0.0〜1.0の範囲で指定)
input_ratio = 0.5

# 各モデルの最大トークン数と最大入力トークン数
models = [
    {"name": "gpt-3.5-turbo", "max_tokens": 4096, "max_input_tokens": int(4096 * input_ratio)},
    {"name": "gpt-4-8k", "max_tokens": 8192, "max_input_tokens": int(8192 * input_ratio)},
    {"name": "gpt-4-32k", "max_tokens": 32768, "max_input_tokens": int(32768 * input_ratio)},
]

# 適切なモデルを選択
selected_model = None
for model in models:
    if num_input_tokens ＜= model["max_input_tokens"]:
        selected_model = model["name"]
        break

if selected_model:
    response = openai.ChatCompletion.create(
        model=selected_model,
        messages=messages,
    )
    generated_text = response.choices[0].message["content"].strip()
    print(f"Using {selected_model}: {generated_text}")
else:
    print("Error: Input token count exceeds the limit of all available models.")
```

<h2>まとめ</h2>
本記事では、OpenAI APIをコスト効率良く利用する方法について解説しました。GPT-3.5-turbo、GPT-4 8K、GPT-4 32Kといったモデルの特徴とコストを比較し、トークン数の計算と管理を行い、タスクに適したモデルを選択する方法を紹介しました。また、実践的なサンプルコードやTikTokenの使用方法も提供しました。

将来的には、GPTシリーズのモデルがさらに進化し、より高性能で効率的なモデルが登場することが予想されます。このような状況に対応するためには、API利用においても柔軟にモデル選択やトークン数の管理ができるよう、開発者は常に技術の進歩に注意を払い、最新の情報を取り入れることが重要です。

また、AI技術の発展に伴い、より多くの業界やアプリケーションでGPTモデルが活用されることが期待されます。そのため、コストと性能のバランスを適切に取りながら、独自のビジネスやプロジェクトに適したGPTモデルを活用することが、今後の成功につながるでしょう。