CLAUDE LABEN
SUNSET — 旧 Workbench と実験的プロンプトツール API の廃止は明日8月17日です。残り1日となりましたLATEST — 最新は8月15日の v2.1.233 です。GitLab のマージリクエスト URL が --worktree と claude agents で扱えるようになり、MR は !N 形式で表示されますSECURITY — Windows で NT の \??\ デバイスプレフィックスを含むパスが UNC 検証をすり抜ける問題が直りました。NTLM 資格情報が漏れる経路が塞がれていますTODO — Opus 4.8・Sonnet 5・Fable 5・Mythos 5 以降では TodoWrite と Task 系ツールが既定で無効になりました。CLAUDE_CODE_ENABLE_TODO_TOOLS=1 で戻せますFORK — 8月14日の v2.1.232 で subagent_type: 'fork' が既定になり、会話全体とプロンプトキャッシュをそのまま引き継げるようになっていますMENTION — プロンプトで @ を打つと別のセッションを名前で呼び出せます。SendMessage がそのセッションへ直接届きますSUNSET — 旧 Workbench と実験的プロンプトツール API の廃止は明日8月17日です。残り1日となりましたLATEST — 最新は8月15日の v2.1.233 です。GitLab のマージリクエスト URL が --worktree と claude agents で扱えるようになり、MR は !N 形式で表示されますSECURITY — Windows で NT の \??\ デバイスプレフィックスを含むパスが UNC 検証をすり抜ける問題が直りました。NTLM 資格情報が漏れる経路が塞がれていますTODO — Opus 4.8・Sonnet 5・Fable 5・Mythos 5 以降では TodoWrite と Task 系ツールが既定で無効になりました。CLAUDE_CODE_ENABLE_TODO_TOOLS=1 で戻せますFORK — 8月14日の v2.1.232 で subagent_type: 'fork' が既定になり、会話全体とプロンプトキャッシュをそのまま引き継げるようになっていますMENTION — プロンプトで @ を打つと別のセッションを名前で呼び出せます。SendMessage がそのセッションへ直接届きます
ブログ一覧

Claude Prompt Caching を使いこなす — API コストを大幅に削減する実践ガイド

Claude APIPrompt Cachingコスト削減個人開発API活用

Claude API を使ったアプリ開発において、最もコストに直結するのがトークン使用量です。特に、会話履歴や長いシステムプロンプトを毎回送り続けると、思った以上にコストが積み上がってしまいます。

そこで活躍するのが Prompt Caching(プロンプトキャッシング) という機能です。Anthropic が提供するこの仕組みを使うことで、繰り返し送信するコンテキストのコストを最大 90% 削減できます。

個人でアプリ開発をしている筆者も、この機能を実装してから月々の API コストが明らかに変わりました。今回はその仕組みと実践的な使い方を紹介したいと思います。


Prompt Caching とは

Prompt Caching は、Claude API に対して送信したプロンプトの一部を**Anthropic のサーバー側にキャッシュ(一時保存)**しておく機能です。

通常の API 呼び出しでは、システムプロンプトや会話履歴を含む全テキストが毎回トークンとしてカウントされます。しかし Prompt Caching を使うと、一度送ったコンテキストはキャッシュとして保存され、次回以降は大幅に安い「キャッシュリードトークン」として課金されます。

料金の比較は以下のとおりです(Claude Sonnet 系の場合)。

  • 通常の入力トークン: 約 $3 / 100万トークン
  • キャッシュ書き込みトークン: 通常より 25% 高い(初回のみ)
  • キャッシュリードトークン: 通常の約 10% のコスト

たとえば、1,000 トークンのシステムプロンプトを 1 日 100 回送信する場合、キャッシングなしでは 100,000 トークン分の費用がかかります。Prompt Caching を活用すれば、2 回目以降はキャッシュリードになるため、実質 10,000 トークン相当のコストで済む計算です。


どんな場合に効果が大きいか

Prompt Caching が特に効果を発揮するのは、以下のようなユースケースです。

長いシステムプロンプトを持つチャットボット: カスタマーサポートや社内ナレッジベース検索のように、詳細なルールや背景情報をシステムプロンプトに含める場合、毎回のやり取りでそのコストが発生します。キャッシングで大幅に削減できます。

コードベースの解析ツール: ソースコードを何度も参照させながら質問するような開発支援ツールでは、コードのコンテキストをキャッシュしておくことで効率が上がります。

多段階の RAG(Retrieval-Augmented Generation): 外部ドキュメントを取得してプロンプトに挿入するパターンでは、同じドキュメントを複数のクエリに使い回す場合にキャッシングが効きます。

会話履歴が長くなるアプリ: チャット形式のアプリで会話が長くなるほど、毎ターンの入力トークンが増えます。会話の前半部分をキャッシュ対象に設定することでコストを抑えられます。


実装方法

Prompt Caching の有効化はとてもシンプルです。API リクエストの content ブロックに cache_control パラメータを追加するだけです。

import anthropic
 
client = anthropic.Anthropic()
 
response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    system=[
        {
            "type": "text",
            "text": """あなたは丁寧で正確な日本語カスタマーサポートアシスタントです。
            以下のルールに従ってください:
            1. 常に敬語を使う
            2. 明確に答えられない場合は正直に伝える
            3. ...(長い指示内容)...""",
            "cache_control": {"type": "ephemeral"}  # ここがポイント
        }
    ],
    messages=[
        {"role": "user", "content": "返品ポリシーについて教えてください"}
    ]
)

cache_control: { type: "ephemeral" } を付けたブロックは、最長 5 分間キャッシュされます。5 分以内に同じシステムプロンプトで API を呼び出すと、キャッシュリードとして処理されます。


キャッシュの境界を意識した設計

Prompt Caching を効果的に使うには、キャッシュされる部分とされない部分を意識して設計することが大切です。

キャッシュは「prefix」として機能します。つまり、プロンプトの先頭から cache_control を付けたブロックまでがキャッシュ対象になります。以下のような順序で組み立てると効果的です。

[キャッシュ対象] システムプロンプト(変わらない部分)
[キャッシュ対象] 共通のコンテキスト(ドキュメント、コードなど)
[毎回変わる] 会話履歴(最新数ターン)
[毎回変わる] ユーザーの最新メッセージ

変わらない部分をプロンプトの先頭にまとめ、そこに cache_control を付けるのがポイントです。


Node.js / TypeScript での実装例

JavaScript / TypeScript 環境では以下のように書けます。

import Anthropic from "@anthropic-ai/sdk";
 
const client = new Anthropic();
 
const systemPrompt = `
あなたは技術的なドキュメントを日本語で解説するアシスタントです。
...(長い指示)...
`;
 
async function askWithCaching(userMessage: string) {
  const response = await client.messages.create({
    model: "claude-sonnet-4-6",
    max_tokens: 2048,
    system: [
      {
        type: "text",
        text: systemPrompt,
        cache_control: { type: "ephemeral" },
      },
    ],
    messages: [{ role: "user", content: userMessage }],
  });
 
  // キャッシュ利用状況を確認
  const usage = response.usage;
  console.log("Cache creation tokens:", usage.cache_creation_input_tokens);
  console.log("Cache read tokens:", usage.cache_read_input_tokens);
  console.log("Input tokens:", usage.input_tokens);
 
  return response.content[0].type === "text" ? response.content[0].text : "";
}

response.usage の中に cache_creation_input_tokens(新規キャッシュ作成)と cache_read_input_tokens(キャッシュ利用)が返ってくるので、実際にキャッシュが効いているかどうかを確認できます。


実際に使ってみた感想

個人で壁紙アプリや癒し系アプリのサポート機能に Claude API を組み込んでいますが、Prompt Caching を導入してから API コストの変化がはっきり分かりました。

特に効果が大きかったのは、アプリの FAQ やヘルプドキュメントを丸ごとシステムプロンプトに組み込んだサポートチャット機能です。以前は 1 回のやり取りごとに 2,000〜3,000 トークンのシステムプロンプトが課金されていましたが、Prompt Caching 導入後はキャッシュリードがほとんどを占めるようになり、コストが大幅に改善しました。

実装の手間も非常に少なく、既存のコードに cache_control フィールドを追加するだけです。コスト最適化の観点から、Claude API を使っている方にはぜひ試してみてほしい機能です。


注意点とベストプラクティス

いくつか気をつけたい点もあります。

キャッシュは 5 分で失効する: キャッシュの有効期間は最長 5 分です。バッチ処理のように間隔が空く場合は、キャッシュが切れるたびに書き込みコストが発生します。リアルタイムの会話アプリのような短い間隔でのリクエストに向いています。

最小トークン数の要件がある: キャッシュを作成するには、対象ブロックが一定のトークン数以上である必要があります(Claude Sonnet 系は 1,024 トークン以上)。短いシステムプロンプトでは効果が出ないので、長いコンテキストと組み合わせましょう。

Beta ヘッダーが必要なモデルもある: 古いバージョンの Claude モデルではベータヘッダー(anthropic-beta: prompt-caching-2024-07-31)が必要な場合があります。最新の SDK を使っていれば自動的に処理されます。


まとめ

Prompt Caching は、Claude API を本格的に活用するうえで欠かせない機能の一つです。実装コストが低い割に、コスト削減効果は大きく、特に同じコンテキストを繰り返し使うアプリケーションでは大幅な改善が見込めます。

個人開発で API コストを気にしている方は、ぜひ一度試してみてください。「こんなに簡単にコストを下げられるのか」と驚くはずです。

Prompt Caching の詳細な仕様や最新情報は Anthropic の公式ドキュメント で確認できます。