GPTはモデル4以降、長いコンテキストウインドウに対応を進めてきたり、構造化データ出力によって出力の型を指定するなどの対応を進めてきました。 扱いが柔軟になってくる反面、問題となって出てきやすいのが入力時のコストです。
Open AIとしても本課題へのソリューション提供を進めているようで、パフォーマンス改善・コスト削減のための機能として、2024年5月ころにBatch APIが、そして2024年10月に今回取り上げるPrompt Cachingがリリースされました。
以下、概要をご紹介します。
目次:
OpenAI: Prompt Cachingとは
Prompt Cachingとは、プロンプト内で繰り返し使用されたプロンプトがキャッシュ情報としてLLMインフラ側で保存され、再度、同一の内容を含むプロンプトを送付した際に該当部分の処理が高速化・また費用が削減されるという仕組みです。
OpenAI API の Prompt Caching の概要|npaka
利用可能モデルはminiを含むGPT-4o, およびo1モデルとのこと。金額は全モデルでインプットコストがおよそ半額となるようです。
また、特別な設定は不要で、自動的にキャッシュの仕組みが適用されるとのこと。
反面、手動でキャッシュ可否をON/OFFしたり、キャッシュをクリアさせたりということは現時点では不可のようです。
プロンプトの先頭に指定した静的な部分がキャッシュされる
キャッシュされる部分について、Prompt Cachingについての公式ドキュメントの掲載がわかりやすかったので転載します。
プロンプトの全箇所から類似の箇所を抽出してキャッシュされるわけではなく、「プロンプト冒頭に設置された同一のテキスト」のみがキャッシュ対象として認識されるようです。
Cache hits are only possible for exact prefix matches within a prompt.
Structure prompts with static or repeated content at the beginning and dynamic content at the end.
Prompt Cachingのその他ポイント
Prompt Cachingのその他ポイントとしては下記。
- 何も設定しなくても、自動的に適用される
- テキストメッセージ(Messages)のみならず、Images, Tool usage, Structured Output(構造化データ出力)などのオプション情報をキャッシュ可能
- 1,024トークン以上の入力プロンプトに対してキャッシュが適用される
- キャッシュさせたい静的な部分はプロンプト冒頭にまとめて記載しておく必要がある
- Batch APIとの併用は不可
- 5~10 分間操作が行われないとクリアされ、最後に使用されてから1時間以内に削除される
- ピーク時間帯にはキャッシュ削除が頻繁に行われるため、キャッシュヒット率を高めたい場合にはピーク時間帯以外での利用が推奨
- キャッシュされたデータはRate Limitsとは無関係。Rate Limitsとしては通常どおりカウントされる。
5. Do cached prompts contribute to TPM rate limits? - Yes, as caching does not affect rate limits.
6. Is discounting for Prompt Caching available on Scale Tier and the Batch API? - Discounting for Prompt Caching is not available on the Batch API but is available on Scale Tier. With Scale Tier, any tokens that are spilled over to the shared API will also be eligible for caching.
OpenAIのプロンプトキャッシュは、特別な設定をしなくても自動的に適用されます。APIレスポンスの
usage
フィールドを確認することで、キャッシュの使用状況を把握できます。
Scale Tierでは利用可能ですが、Batch APIでは利用できません。
GPTモデル、プロンプトキャッシュ機能がついに登場!【OpenAI DevDay速報】|そら ☁️ AI × Dify 自動化オタク📱
実際にコードから確認してみる
具体的には、下記のようなコードからキャッシュ量が確認できます。
下記コードではcontentに入力したプロンプトのトークン数が1,024に達しないため適用はされませんが、長いテキストで静的な部分として入力したテキストはキャッシュされ、2回目以降にプロンプトキャッシュとして利用されます。
from openai import OpenAI
client = OpenAI()
# GPTへ生成指示テキストを送信、レスポンスを取得
result = client.beta.chat.completions.parse(
model="gpt-4o-mini",
messages=[{
"role": "user",
"content": """前半にキャッシュさせたい静的なテキストをまとめて入力。
以降は動的なテキストとして入力。"""
}])
# キャッシュされたプロンプトトークン数を確認
print(result.usage.prompt_tokens_details['cached_tokens'])
AzureもOpenAIのプロンプトキャッシュ機能に対応済
AzureもOpenAIのプロンプトキャッシュ機能に対応済です。
Azure OpenAI Service でのプロンプト キャッシュ - Azure OpenAI | Microsoft Learn
出力に繰り返し内容や予測が可能な場合、Predicted Outpusが利用可能
予測される出力パターンをあらかじめ渡してあげて、その予測出力のなかの一部のみ、GPTに生成させるPredicted Outputsという機能があるようです。
Predicted Outputsも費用削減やパフォーマンス改善に役立つ機能とのことですが、なかなか使いどころが難しそう。場合によってはパフォーマンスは改善するが、コストは増えてしまうというケースもありそうとのこと。
参考: OpenAIのPredicted Outputsを試す
この記事の気になる箇所を読み返す:
Category: AI・LLM
Tags: