AI

AIのトークン価格を10分の1にできる「プロンプトキャッシュ」の仕組みとは?


OpenAIのGPTシリーズやAnthropicのClaudeなどの大規模言語モデル(LLM)では、同じプロンプトを繰り返し利用する場合に入力トークンの処理を再利用する「プロンプトキャッシュ」が導入されており、通常の入力トークンと比べて約10分の1の料金で利用できる場合があります。開発者向けサービスを提供するngrokが、プロンプトキャッシュの仕組みを詳しく解説しています。

Prompt caching: 10x cheaper LLM tokens, but how? | ngrok blog
https://ngrok.com/blog/prompt-caching

Anthropicはプロンプトキャッシュについて「プロンプトキャッシュによって、長いプロンプトの場合、レイテンシを最大85%削減できる」と説明しています。以下はngrokが実際にプロンプトキャッシュを使用した場合と使用しない場合の応答速度を比較したグラフで、OpenAIのGPT-5(左)とAnthropicのSonnet 4.5(右)の場合で共に、プロンプトキャッシュを使用した方が「最初のトークン取得までの時間」が大幅に短縮されたことが示されています。


この「キャッシュされたトークン」とは何なのかについて、Anthropicは具体的に説明していません。直感的にはウェブブラウザのキャッシュのように「一度した質問を覚えていて次の機会にそれを素早く再利用できる」と考えられますが、同じプロンプトが繰り返し送信された場合でも多くの場合で異なるレスポンスが返ってくるため、「過去の会話を保存して取り出している」というわけではありません。

そこでngrokは、LLMの仕組みを徹底的に調べることで、データプロバイダーが具体的にどのようなキャッシュを使用しているのか、その用途がどのようなものか、そしてそれがどのようにしてより速くより安価にLLMを使用できるようにしているのかについて解明しています。

まず、LLMは入力された文章をそのまま理解しているのではなく、文章を「トークン」と呼ばれる単位へ分割します。その後、各トークンを数値ベクトルへ変換し、深層学習モデル・Transformerによって、それぞれの単語同士がどのように関係しているのかを計算しています。ngrokは入力数値を出力数値に変換する「数十億もの綿密に配置された演算からなる巨大なグラフ」を、「Tokenizer(トークン生成)」「Embedding(埋め込み)」「Transformer」「Output(出力)」の4つに分けて説明しています。


Tokenizerの仕組みは各AIモデルで異なっていますが、基本的な仕組みとしては「Check out ngrok.ai(ngrok.aiをチェックして)」というプロンプトを「Check/out/ng/rok/.ai」と分割し、それぞれのチャンクにトークンと呼ばれる整数IDを割り当てるというものです。このように単語をそのまま理解しているのではなく、複数のチャンクに分割して理解するような仕組みから、「strawberry(イチゴ)という単語に『r』の文字はいくつ含まれるか」という簡単な問題に回答できないことがあるというLLM特有の問題が指摘されることもあります。

GPT-4やClaudeなどの大規模言語モデルが抱える「ストロベリー問題」とは? - GIGAZINE


トークン化したプロンプトを理解するための仕組みが「埋め込み」です。埋め込みとは複雑な高次元データを数値ベクトルの低次元ベクトル空間にマッピングする表現学習手法で、埋め込みに与える次元数を増やすほど、文を正しく理解するために比較するための次元数も増えます。ngrokはこれを理解するための説明として、以下の図を示しました。左は1次元空間に8つの図形を配置したもので、ごちゃごちゃして理解しにくくなっています。一方で空間を2次元、3次元と増やすことで、8つの図形を明確に区別できるようになります。


こうして正しく理解した入力トークンについてTransformerによって各トークンに割り当てる重みを計算し、文章を理解した上でよりふさわしい回答を提示するのがLLMの仕組みです。

各ノードは、何らかの入力を受け取り、何らかの出力を生成する関数と考えることができます。入力は、特定の出力値が停止を指示するまで、ループ内でLLMに供給されます。プロンプトキャッシュは、この計算結果を保存して再利用する仕組みです。


例えばチャットボットでは、システムプロンプトや利用規約、ツール定義など毎回変わらない長文が入力されることがあります。通常であれば、これらはリクエストごとに最初から計算されますが、プロンプトキャッシュでは一度計算した結果を保存しておき、次回以降は同じ部分を再計算せずに利用できます。そのため応答開始までの時間が短縮され、API料金も大幅に削減されます。

以下は、「Mary had a little(メリーさんのひつじの歌い出し)」というプロンプトに対するアクションウェイトの例を表で示したもの。主語は「Mary」という1個しかないので、動詞「had」に「Mary」が100%貢献しています。冠詞「a」に貢献しているのは「Mary」が79%で「had」が21%、というように見ていきます。いずれの場合でも、LLMはこの文章で「Mary」が最も重要だと考えており、そこから「lamb(ひつじ)」という続く単語を推測します。


「Mary had a little」という文章に続けて「lamb」「whose」「flee」と単語を足すことで文章を長くしていった場合、「メリーさんのひつじ」の歌詞に沿った「lamb」には「Mary」が高く貢献しているものの、歌詞から外れた「whose」「flee」には貢献していないと計算されます。このとき、前半の「Mary had a little」の部分には変化がないにもかかわらず、単語を1つ増やすごとに再計算しています。これがLLMの「推論ループ」の動作です。この部分をプロンプトキャッシュにより短縮することで、トークンを大幅に節約できます。


Webブラウザのキャッシュは完成したWebページを保存するのに対し、プロンプトキャッシュはLLM内部で計算された中間状態を保存するといえます。キャッシュされるのは生成された回答ではなく、共通した中間状態のみであるため、同じプロンプトを送信しても異なる回答が生成される可能性があるというわけです。プロンプトキャッシュが使われるのは「同じプロンプトの先頭部分を含むリクエスト」であり、英語では「What is~(~は何ですか?)」などの接頭文部分の計算を省略し、新しく追加された部分だけを処理すればよくなります。

プロンプトキャッシュで保存されるのは、Transformerが各トークンについて生成する「Key」と「Value」と呼ばれる内部データです。Transformerの「Self-Attention」では、Key・Value・Queryを用いて膨大な計算が行われますが、一度計算したKey・Valueは入力内容が変わらない限り再利用できます。そのため、プロンプトキャッシュは「KVキャッシュ」と呼ばれることもあります。

またngrokによると、OpenAIとAnthropicは全く異なるキャッシュを展開しているそうです。OpenAIはキャッシュをすべて自動で管理しており、可能な場合は自動的にキャッシュ済みのデータを利用します。実際にngrokの実験では同じリクエストを送信した直後に再度送信した場合のキャッシュ利用率(ヒット率)は約50%にとどまり、この方法だと応答速度にばらつきが生じる可能性があります。一方でAnthropicはユーザーにより多くの制御権を与え、いつキャッシュを作成しどのくらいの期間保持するかを開発者が指定できます。この機能には追加料金がかかりますが、ngrokの実験ではキャッシュを指定した場合に100%の確率でキャッシュが利用され、長いコンテキストを扱う場合でも応答時間が安定しました。そのため、自動寄りならOpenAI、より細かく制御したいならAnthropicの方式が適している可能性があります。

・関連記事
コストをなんとわずか17分の1に節約できるDeepSeek V4 Proを使ったClaude Codeエージェントループ「deepclaude」 - GIGAZINE

AIモデルは1つに決めない方が安くて高性能、Kimi K3とFable 5の使い分けで最大50倍のコスト効率という実験結果 - GIGAZINE

Claude Codeは指示前の初期データだけで約3万3000トークンを使用、実用構成では約7万5000トークンに - GIGAZINE

「Claude Opus 5」が登場、Claude Fable 5の半額で同等性能を発揮し制限緩め - GIGAZINE

Hugging FaceのCEOがOpenAIのAIによるハッキング事件を受け「徹底的な透明性」を訴える - GIGAZINE

in AI, Posted by log1e_dh

You can read the machine translated English article What is the mechanism behind 'Prompt Cas….