コストを設計する ── PT・Intelligent Prompt Routing・Prompt Caching を使い分ける
「PoC の月数千円が、本番で月数百万円」
サードパーティのコスト最適化ブログでよく見かける警句がある。少しだけ和訳すると、こうだ。
Token Rates Hide a $350/Month Trap. (トークン単価表には、月 350 ドルの罠が隠れている)
── Cloud Burn, “Amazon Bedrock Pricing: Token Rates Hide a $350/Month Trap”(サードパーティブログによる主張)
PoC では「Sonnet で何でも答えさせて」「max_tokens も適当で」「キャッシュも何もなしで」月数千円だったものが、本番でユーザーが増えた瞬間に 月数百万円規模になる ── これは Bedrock の界隈で「日常的に起きる」事象だ。原因はだいたい同じで、(1) すべて Sonnet で叩いている、(2) max_tokens 未設定で TPM クォータを無駄食いしている、(3) Knowledge Bases の S3・OpenSearch Serverless・ベクトルストアの周辺費を見落としている、(4) 「保険」で Provisioned Throughput を買って 30 % しか使っていない、のどれかに収まる。
この章では、helpdesk-ai のコストを 設計レベルで 最適化する方法を体系化する。ポイントは、「動いてから直す」のではなく、Day 1 から課金モデルを選んでおく ことだ。LLM のコストは、ある日急にスパイクするのではなく、設計判断の積み重ねでじわじわと膨らむ。だから、設計を直さないと、コードをいじっても効かない。
対象:ch14 までで helpdesk-ai が動いている読者 難易度:★★★★☆ 読了時間:約 30 分 触る AWS リソース:Bedrock 課金モデル全般、Application Inference Profile、Intelligent Prompt Routing、Prompt Caching、Batch Inference
Bedrock の課金モデル全体像
最初に、Bedrock がどんな課金モデルを提供しているのかを横並びで把握する。AWS の他サービスに比べて種類が多いので、ここを押さえずに最適化に入っても効果が出ない。
| 課金モデル | 価格水準 | コミット | 主な用途 |
|---|---|---|---|
| On-Demand(Standard) | 基準価格 | なし | 通常の対話・API 呼び出し |
| Batch Inference | −50 % | なし | 24 時間以内に終わればよい非同期処理 |
| Provisioned Throughput | 時間課金(Model Unit) | なし / 1 ヶ月 / 6 ヶ月 | 高稼働率な定常ワークロード |
| Priority Tier | +75 % | 期間コミット | レイテンシ最優先のミッションクリティカル |
| Flex Tier | −50 % | なし | コスト優先・レイテンシ許容 |
| Cross-Region Inference | 追加料金なし(Global で約 −10 %) | なし | スロットル回避・冗長化 |
これに加えて、ペイ・パー・コール系の周辺機能が乗る。Intelligent Prompt Routing は $1.00 / 1,000 requests、Guardrails は機能ごとに $0.10〜$0.17 / 1,000 text units、Rerank は $0.001 / request 程度だ(research 02 §4.7)。
これら全部を「とりあえず全部使ってみる」のは禁物だ。helpdesk-ai のような社内 LLM アプリでは、まずは On-Demand + Cross-Region Inference Profile で素直に動かして、トラフィックの形(ピーク時 RPM、平均トークン数、再利用されるコンテキストの有無)を観測してから、削るポイントを順番に決めていく。順番は後で「コスト最適化 4 段ロケット」として整理する。
Provisioned Throughput を「保険」で買わない
最初に潰しておくべきアンチパターンが Provisioned Throughput(PT)の無駄買い だ。これは ch17 でアンチパターン #1 として再登場するが、その伏線は今ここで張る。
PT は「Model Unit(MU)」と呼ばれる単位を 時間課金 で確保する仕組みだ。EC2 Reserved Instance に近い概念で、コミット期間で割引が乗る。具体価格は最新モデルでは「営業窓口経由」とされているものが多く(research 02 §4.4)、公表されている範囲では Cohere Command Provisioned が約 $49.50/h(コミットなし)、Llama 2 のレガシー例で 1 ヶ月コミット $21.18/h、6 ヶ月コミット $13.08/h といった水準だ。
PT を On-Demand と比べると、稼働率 80〜85 % が損益分岐 になる(research 04 §5.1)。逆に言えば、それより低い稼働率では PT のほうが必ず高くつく。
xychart-beta
title "PT vs On-Demand 月額コスト(イメージ)"
x-axis "平均稼働率(%)" [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
y-axis "相対コスト(On-Demand 100%基準)" 0 --> 200
line "On-Demand" [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
line "Provisioned Throughput(1ヶ月コミット)" [85, 85, 85, 85, 85, 85, 85, 85, 85, 85]
注:上図は損益分岐 80〜85 % という事実関係を可視化した 概念図 であり、特定モデル・特定 SKU の実価格を示すものではない。実際の損益分岐点はモデル・コミット期間・割引率で変動する。
この図から読むべきは「稼働率が低いほど、PT は On-Demand より高くなる」という単純な事実だ。にもかかわらず、「将来のピーク時に備えて」「保険として」PT を買ってしまうチームが後を絶たない。日本の事例でも「高額なため何度も再トライが出来ずに実際の選択は断念した」という声が classmethod の DevelopersIO に出ている。
判断ロジックは次の通り、稼働率の見立てを 3 段階で振り分ける とよい。
flowchart TD
A[まず On-Demand + CRIS で運用<br/>Application Inference Profile で実測]
A --> B{平均稼働率は?}
B -- "< 60%" --> C[On-Demand のまま<br/>PT は不要]
B -- "60% 〜 80%" --> D["On-Demand + Flex Tier<br/>もしくは Prompt Caching で吸収"]
B -- ">= 80%" --> E[1 ヶ月 PT で検証<br/>→ 安定したら 6 ヶ月 PT]
style C fill:#e0f7e0
style D fill:#fff4e0
style E fill:#ffe0e0
helpdesk-ai の現実的な稼働率を考えてみよう。社員 1,000 人規模の社内ヘルプデスクで、ピーク時間帯(朝礼後・昼休み後)の RPM が 50、それ以外は 5〜10。これは「業務時間中だけ立ち上がる」典型的なパターンで、平均稼働率は 20〜30 % にも届かない ことが多い。この水準で PT を買うのは、明らかに損だ。On-Demand で済む。
逆に、SaaS としてマルチテナント運用していて、24 時間 RPM が安定して 200〜500 出ているようなプロダクトは、PT 検討の対象になる。その場合も いきなり 6 ヶ月コミットを買わない。まず 1 ヶ月コミットで稼働率の見通しが立ってから 6 ヶ月に切り替える、というのが鉄則だ。
// ❌ 悪い例:PoC 段階で「将来のピークに備えて」PT を購入
// 稼働率の見通しがないまま 1 ヶ月コミット → 30% 稼働で On-Demand 比 2 倍コスト
import {
BedrockClient,
CreateProvisionedModelThroughputCommand,
} from "@aws-sdk/client-bedrock";
const bedrockMgmt = new BedrockClient({ region: "us-east-1" });
await bedrockMgmt.send(
new CreateProvisionedModelThroughputCommand({
modelUnits: 4, // 「とりあえず」で 4 MU 確保
provisionedModelName: "helpdesk-ai-pt",
modelId: "anthropic.claude-sonnet-4-5-v1:0",
commitmentDuration: "OneMonth", // 早期解約しても 1 ヶ月分は請求される
}),
);
// ✅ 良い例:まず On-Demand + CRIS で 1〜2 ヶ月運用し、
// Application Inference Profile で実測した稼働率が 80% を継続的に超えてから PT 検討
// (PT 購入コードは「実測のあとに書く」もの)
PT を買うべきかどうかの実測手順は 付録 B のコスト見積もりワークシート で具体的に扱う。ここでは「保険で買うな」というメッセージだけ持ち帰ってほしい。
Intelligent Prompt Routing で Haiku に振る
PT の話の次は、本番でいちばん効くテクニックである Intelligent Prompt Routing に進む。
Intelligent Prompt Routing は、Bedrock が 同じファミリー内の 2 つのモデル(例:Claude Haiku ↔ Sonnet、Llama 3 8B ↔ 70B、Nova Lite ↔ Pro)の間で、プロンプトの複雑度に応じて 動的にルーティングする マネージドな仕組みだ。Anthropic / Meta Llama / Amazon Nova の各ファミリー内で利用できる。
数値を 1 つ覚えてほしい。RAG ユースケースの AWS 実測で、平均 63.6 % のコスト削減。そして 87 % のリクエストが Haiku にルーティングされた(research 04 §3.1, §5.6)。「Sonnet が 100 % 必要だ」と思っているタスクの多くは、実は Haiku で十分な解像度で解けている、というのが Anthropic と AWS の主張だ。
ルーター自体の追加料金は $1.00 / 1,000 requests。1,000 リクエストあたり 1 ドル、つまり 1 リクエストあたり 0.001 ドル(約 0.15 円)の追加料金で、入出力の単価を Sonnet の 1/3〜1/5 にあたる Haiku 価格に落とせる可能性がある。helpdesk-ai のような「FAQ 寄り:複雑判断 = 8:2」みたいなトラフィック分布では、これは効く。
// src/handlers/chat.ts ── Intelligent Prompt Routing を使う
import {
BedrockRuntimeClient,
ConverseCommand,
} from "@aws-sdk/client-bedrock-runtime";
const bedrock = new BedrockRuntimeClient({
region: "us-east-1",
maxAttempts: 5,
retryMode: "adaptive",
});
// ❌ 悪い例:すべての問い合わせを Sonnet 固定で叩く(`modelId` に
// `us.anthropic.claude-sonnet-4-5` のような単一モデル ID をそのまま渡す)。
// 「経費精算の上限は?」のような FAQ も Sonnet で処理されるため、
// 月コストの 40〜60% が無駄になる。
// ✅ 良い例:Anthropic ファミリーの Prompt Router に向ける
// Haiku で十分なクエリは Haiku、判断が必要なクエリは Sonnet に自動振り分け
const ROUTER_ID =
"arn:aws:bedrock:us-east-1:123456789012:default-prompt-router/anthropic.claude:1";
export async function askHelpdesk(userText: string) {
const res = await bedrock.send(
new ConverseCommand({
modelId: ROUTER_ID, // モデル ID の代わりに Prompt Router の ARN を渡す
messages: [{ role: "user", content: [{ text: userText }] }],
inferenceConfig: {
maxTokens: 2000, // max_tokens は必ず明示(ch06 / ch13 と同じ規律)
temperature: 0.2,
},
}),
);
// どのモデルに振られたかは trace 経由で取得できる
// res.trace?.promptRouter?.invokedModelId に Haiku / Sonnet のどちらか
return {
text: res.output?.message?.content?.[0]?.text ?? "",
invokedModel: res.trace?.promptRouter?.invokedModelId,
usage: res.usage,
};
}
注意点が 2 つある。(1) ファミリーをまたぐルーティングはできない。Anthropic ↔ Nova のような切り替えは別の自前ロジックを書く必要がある。(2) ストリーミング・Tool Use との組み合わせは制約がある(ConverseStream API での挙動はモデル世代によって違うので公式 docs を確認)。本番では「素直な対話チャネル」だけをルーターに通し、Tool Use を伴う Agent 系の呼び出しは Sonnet 固定にする、というハイブリッド構成が手堅い。
そして「63.6 % 削減」の数値はあくまで AWS が公表した RAG ユースケースの実測値 であって、自分のアプリで同じ効果が出ると約束されているわけではない。実測してから判断する。Application Inference Profile に tag を付けて Cost Explorer で比較するのがいちばん早い(後述)。
Prompt Caching ── ヒット率 30 % が損益分岐
3 つめの武器が Prompt Caching だ。これは Claude 4 系(Opus / Sonnet / Haiku)で対応している、「再利用される共通コンテキスト をキャッシュする」機能だ(具体的なバージョン番号は流動的なので、対応世代は最新の公式 docs を要確認)。
仕組みはシンプルで、長く再利用するブロック(システムプロンプト、Few-shot 例、長文の RAG コンテキストなど)に キャッシュポイント を打つと、次の呼び出しで一致するキャッシュがあれば、その部分の入力トークン料金が 10 % に下がる(最大 90 % オフ)。
ただし無料ではない。キャッシュ書き込みコストが、5 分 TTL で通常入力単価の 1.25 倍、1 時間 TTL で 2 倍 かかる。つまりキャッシュは「書き込んで、何度も読まれて」初めて元が取れる仕組みになっている。
この「何度も読まれて」の境目が、ヒット率 30 % 以上 と言われている水準だ(research 04 §5.7、CURATE §1.3)。ただし AWS 公式の「30 % 以上」という明示的記述は見つかっておらず、これは サードパーティブログ(Caylent、dev.to 等)の概算 として扱うべき数値だ。それでも実務的な肌感としてはおおむね正しい。ヒット率が 30 % を割ると、書き込みコストが浮いた読み込みコストを上回って 逆にコスト増 になる、という構造は変わらない。
本書の方針:本書では以降の章(第 13 章観測、第 17 章アンチパターン、第 18 章エピローグ)でも「Prompt Caching の損益分岐はヒット率 30%」を目安値として参照する。これは上記のとおりサードパーティブログ概算であり、AWS 公式の保証値ではない。実プロジェクトでは CloudWatch メトリクスで実測し、自身のワークロードでの損益分岐点を確認すること。
// src/handlers/chat.ts ── Prompt Caching を使う
import {
BedrockRuntimeClient,
ConverseCommand,
} from "@aws-sdk/client-bedrock-runtime";
const bedrock = new BedrockRuntimeClient({ region: "us-east-1" });
// helpdesk-ai のシステムプロンプト:会社の規程要約 + ロール定義 + Few-shot 例
// だいたい 4,000 〜 8,000 トークン。これを毎回送ると、ユーザー発話より大きい
const SYSTEM_PROMPT = `
あなたは「helpdesk-ai」、社内ヘルプデスクの AI アシスタントです。
(中略:会社規程の要約 4,000 トークンほど)
出力フォーマットは次の Few-shot 例に従ってください:
(中略:Few-shot 例 2,000 トークンほど)
`.trim();
export async function askWithCache(userText: string) {
const res = await bedrock.send(
new ConverseCommand({
modelId: "us.anthropic.claude-sonnet-4-5",
system: [
{ text: SYSTEM_PROMPT },
// cachePoint をブロックの末尾に打つ
// → ここまでが「再利用されるプレフィックス」として 5 分間キャッシュされる
{ cachePoint: { type: "default" } },
],
messages: [{ role: "user", content: [{ text: userText }] }],
inferenceConfig: { maxTokens: 2000, temperature: 0.2 },
}),
);
// usage に cacheReadInputTokens / cacheWriteInputTokens が返るので、
// ヒット率の計測はここから組める
const usage = res.usage as {
inputTokens: number;
outputTokens: number;
cacheReadInputTokens?: number;
cacheWriteInputTokens?: number;
};
return {
text: res.output?.message?.content?.[0]?.text ?? "",
usage,
};
}
helpdesk-ai でキャッシュが効きやすいのは、次のような場所だ。
- システムプロンプト:会社規程の要約・ロール定義・出力フォーマット定義など、ユーザー横断で共通の部分
- 長文 RAG コンテキスト:同じドキュメントを引いてくる確率が高いトピック(人気の FAQ)
- Few-shot 例:意図分類や引用フォーマットの統一に使う数例
逆に効かないのは、ユーザーごとに完全に異なるパーソナルデータ(個人別の勤怠サマリなど)。これは毎回 cache miss するだけで終わる。
実装上の指針として:
- ch07 で書いた Streaming + Tool Use のループの中では、システムプロンプトと共通の Tool 定義 にキャッシュポイントを打つ
- ch08 で書いた Knowledge Bases ベースの RAG では、取得した context ブロックの先頭 にキャッシュポイントを打って、同じドキュメントが再利用されたときにヒットを狙う
- TTL は基本 5 分。1 時間 TTL は書き込みコストが 2 倍なので、よほどヒット率に確信があるとき限定
ヒット率は Application Inference Profile + CloudWatch メトリクス で測る。これは ch13 で観測の話をしたときに触れた InputTokenCount / CacheReadInputTokens の比から逆算できる。30 % を継続的に切るようなら、その箇所のキャッシュは 外す べきだ。
Batch Inference ── 24 時間以内でいい仕事は半額で
ここまで対話系の最適化を見てきたが、helpdesk-ai のような社内 AI アプリには 「リアルタイムに返す必要がない仕事」 がそこそこある。たとえば、
- 毎晩の問い合わせログを要約してダッシュボード化する ナイトリーサマリ
- 新しく追加された社内規程 PDF を メタデータ付きで分類・タグ付け する(ドキュメントエンリッチメント)
- LLM-as-a-Judge 用の 評価データセット を一括生成する
- Knowledge Bases のベクトル DB を作り直すときの 埋め込みバックフィル
- コンテンツモデレーションの キュー処理
これらは「24 時間以内に終われば困らない」性質の処理だ。Bedrock の Batch Inference を使えば、On-Demand の 50 % オフ で実行できる。仕組みは S3 にプロンプトの JSONL を投入してジョブを起動 → 結果が S3 に書き戻る、というシンプルな非同期パイプラインだ。SLA は「24 時間以内」。
// eval/run-batch.ts ── 評価データセット生成を Batch Inference で
import {
BedrockClient,
CreateModelInvocationJobCommand,
} from "@aws-sdk/client-bedrock";
const bedrockMgmt = new BedrockClient({ region: "us-east-1" });
await bedrockMgmt.send(
new CreateModelInvocationJobCommand({
jobName: "helpdesk-ai-eval-dataset-2026-06-04",
modelId: "anthropic.claude-haiku-4-5-v1:0",
roleArn: "arn:aws:iam::123456789012:role/BedrockBatchRole",
inputDataConfig: {
s3InputDataConfig: {
s3Uri: "s3://helpdesk-ai-batch/in/eval-prompts.jsonl",
},
},
outputDataConfig: {
s3OutputDataConfig: {
s3Uri: "s3://helpdesk-ai-batch/out/",
},
},
}),
);
ナイトリーサマリのような定常 Batch ジョブは コスト効果がそのまま月額に乗る。helpdesk-ai でナイトリーサマリ・ドキュメントエンリッチメント・評価データセット生成を Batch に寄せるだけで、該当部分のコストが半分 になる。これは設計判断 1 つで効く類の節約だ。
Service Tiers の選び方
課金モデルの一覧表で出てきた Service Tiers にも軽く触れておく。Tier の選択は「速さとコストのトレードオフ」を一発で決めるレバーだ。
| Tier | 価格 | 特徴 | helpdesk-ai での使い所 |
|---|---|---|---|
| Priority | Standard の +75 % | 出力 TPS が 25 % 改善(公式) | 「とにかく速さ最優先」の場面のみ。通常は不要 |
| Standard | 通常価格 | 一般的なワークロード | helpdesk-ai のデフォルト |
| Flex | Standard の −50 % | レイテンシは許容、コスト優先 | Batch にできない非対話系。例:内部ツールの定期エンリッチメント |
| Reserved | 保証スループット | TPM 保証が必要 | 高負荷 SaaS の本番枠 |
helpdesk-ai のような社内アプリでは、「Standard を基本、Batch に寄せられるものは Batch、レイテンシ許容できる定期実行は Flex」 という構成が現実的だ。Priority は「秒単位のレイテンシが SLA で縛られる」ような特殊ケース以外、原則使わない。+75 % は重い。
Cross-Region Inference のコスト効果
ch10 で AgentCore を組んだ時にも触れたが、Cross-Region Inference(CRIS)はコスト面でも効く。整理しておく。
- Geographic CRIS(
us./eu./jp./apac.など):データ主権を遵守したい場合に使う。追加料金なし。クォータは各リージョン独立で持つので、実質的にスロットル耐性が上がる - Global CRIS(
global.):全コマーシャルリージョン横断。約 10 % のコスト削減 +スループット最大化。データ主権制約が緩い
「約 10 % 削減 & スループット最大化」は AWS 公式の data point だ(research 04 §5.3)。helpdesk-ai が国内の社内アプリで、社員データを日本国外に出してはいけない場合は jp. Geographic CRIS 一択。海外グループ会社も含めて公開する場合や、社内データの国外流出が許容される PoC 段階では Global CRIS を試す価値がある。
ここで重要なのは「データレジデンシー要件を確認せずに Global CRIS に流す」ことが ch17 のアンチパターン #2 につながる点だ。コスト 10 % のために規制違反になっては元も子もない。設計時点でデータ分類を済ませておく。
Application Inference Profiles でコストを可視化する
ここまでの最適化は、「測れていなければ効いたかどうかわからない」 という共通の弱点を持つ。最適化の前にやることは、Application Inference Profile(AIP)でコストを分離可視化する ことだ。これは ch13 観測の章でも触れたが、コスト視点で改めて整理する。
AIP は 追加料金なし で作れる「コスト追跡用の論理プロファイル」だ。Cross-Region Inference Profile の上にラッパとして作り、tag を付与する。これによって Cost Explorer / Cost and Usage Report(CUR)で テナント別・機能別・実験ブランチ別 にコストを分離できる。
// infra/create-app-profile.ts
import {
BedrockClient,
CreateInferenceProfileCommand,
} from "@aws-sdk/client-bedrock";
const bedrockMgmt = new BedrockClient({ region: "us-east-1" });
// helpdesk-ai の「FAQ 応答」用プロファイル
await bedrockMgmt.send(
new CreateInferenceProfileCommand({
inferenceProfileName: "helpdesk-ai-faq",
description: "FAQ-style queries for helpdesk-ai",
modelSource: {
// Cross-Region Inference Profile をベースに
copyFrom: "arn:aws:bedrock:us-east-1::inference-profile/us.anthropic.claude-sonnet-4-5",
},
tags: [
{ key: "App", value: "helpdesk-ai" },
{ key: "Feature", value: "faq" },
{ key: "Env", value: "prod" },
],
}),
);
// 「人事 API を叩く Agent」用プロファイル
await bedrockMgmt.send(
new CreateInferenceProfileCommand({
inferenceProfileName: "helpdesk-ai-agent",
description: "Tool-using agent for helpdesk-ai",
modelSource: {
copyFrom: "arn:aws:bedrock:us-east-1::inference-profile/us.anthropic.claude-sonnet-4-5",
},
tags: [
{ key: "App", value: "helpdesk-ai" },
{ key: "Feature", value: "agent" },
{ key: "Env", value: "prod" },
],
}),
);
呼び出し側は、modelId の代わりに作成した AIP の ARN を渡すだけだ。あとは CUR を Feature タグで分割集計するだけで、「FAQ がいくら、Agent がいくら」が一目でわかる。Intelligent Prompt Routing の効果測定も、Router を入れた AIP と入れていない AIP を並走させて A/B 比較するのがいちばん正確だ。
AIP の真価は、「マルチテナント・マルチアプリで誰がいくら使っているか」を WAF みたいなレベルで可視化できる こと。SaaS で複数テナント抱える場合は Tenant タグも追加する。「うちのテナントのコストが今月急に伸びてる」が即座に検知できる。
helpdesk-ai のコスト最適化 ── 4 段ロケット
ここまでの武器を、どの順番で使うか。実装現場で何度も使ってきた整理が 「コスト最適化 4 段ロケット」 だ。
flowchart TD
Stage1[<b>第1段:モデル選定</b><br/>Haiku で済む 40-60% を<br/>Sonnet で叩かない] --> Stage2
Stage2[<b>第2段:Prompt Caching</b><br/>システムプロンプト・Few-shot・<br/>RAG コンテキストにキャッシュ] --> Stage3
Stage3[<b>第3段:Batch 化</b><br/>ナイトリーサマリ・エンリッチメント・<br/>評価データセット生成を Batch へ] --> Stage4
Stage4[<b>第4段:PT or Flex Tier</b><br/>稼働率 80%+ を確認後 PT、<br/>レイテンシ許容なら Flex Tier]
style Stage1 fill:#cce7ff
style Stage2 fill:#cce7ff
style Stage3 fill:#cce7ff
style Stage4 fill:#ffd9cc
順番が大事だ。第 1 段(モデル選定)と第 2 段(キャッシュ)は、ほとんどの helpdesk-ai 規模のアプリで効く。Intelligent Prompt Routing の AWS 実測 63.6 % 削減はここに乗る数字だ。第 3 段(Batch 化)は、ナイトリージョブを抱えているなら必ずやる。第 4 段(PT / Flex)は、稼働率と SLA に確信が持てるまで触らない。第 4 段を先にやろうとして失敗するのが、PT 無駄買いの正体だ。
helpdesk-ai に当てはめると、初期構成はこうなる。
| 仕事の種類 | 課金モデル | モデル選択 |
|---|---|---|
| FAQ 応答(リアルタイム) | On-Demand + Cross-Region + Intelligent Prompt Routing + Prompt Caching | Anthropic Router → Haiku / Sonnet |
| 人事 API を叩く Agent(リアルタイム) | On-Demand + Cross-Region + Prompt Caching | Sonnet 固定(Tool Use の安定性優先) |
| ナイトリーサマリ | Batch Inference | Haiku |
| 規程 PDF のエンリッチメント | Batch Inference | Haiku |
| 評価データセット生成 | Batch Inference | Sonnet(質優先) |
| ベクトル埋め込みバックフィル | Batch Inference | Titan Embed v2 |
Application Inference Profile で各タスクに tag を付け、毎月の CUR で「想定通りの比率になっているか」を確認する。これだけで、PoC のときに気付かなかったコスト構造が見えるようになる。
実際の数値で考える
抽象論で終わらせないために、公開されている実数を 3 つだけ並べておく。
- Pfizer(VOX):研究者の検索時間を 年 16,000 時間削減 + インフラコスト 55 % 削減。SageMaker + Bedrock の組み合わせ事例(AWS Case Study)
- CyberAgent / ABEMA:サッカー中継のゴールシーン検出からハイライト動画と SNS 投稿を自動生成、1 人あたり業務量を大幅減(AWS 導入事例)
- タキヒヨー:Bedrock + GenU を 4 部門展開、月 450 時間以上の工数削減、デザイン部門は 1 作品 2 時間の効率化(AWS 導入事例)
「インフラコスト 55 % 削減」のような数字は、本章で示した 4 段ロケットを順番にやれば、「夢の数字」ではなく「やった人が普通に到達する数字」 だ。逆に何もしなければ、Cloud Burn が警告したような「PoC 月数千円 → 本番月数百万円」が普通に起きる。差分は、すべて設計判断にある。
これら定量数値の中で、サードパーティブログ(doit.com、cloudburn.io 等)由来の「複合最適化で 40〜60 % 削減」や「PT 適切利用で 30〜40 % 削減」といった概算は AWS 公式の保証値ではない ので、自社で再現する前提で参考値として読んでほしい。
次の Part 4 へ
helpdesk-ai はこれで 「動く」から「Production Ready」までの設計をひととおり一周 したことになる。Converse API(ch06)から始めて、Streaming + Tool Use(ch07)、Knowledge Bases(ch08)、Bedrock Agents(ch09)、AgentCore(ch10)、Guardrails(ch11)、評価(ch12)、観測(ch13)、セキュリティ(ch14)、そして本章のコスト設計(ch15)。helpdesk-ai は完成だ。
ここから Part 4 では視点を変える。他社が実際に何をやってきて、何で失敗しているか を見ていく。
- 第 16 章では、住信 SBI ネット銀行・セゾンテクノロジー・Toyota・Pfizer など、国内 4 社・海外 3 社の事例 を読み解く。Pfizer のインフラコスト 55 % 削減・住信 SBI の AgentCore Runtime 採用判断・Toyota の v1 RAG から v2 AgentCore への移行など、本シリーズで扱った機能がどう組み合わさったかを実例で確認する
- 第 17 章では、9 つのアンチパターン を「症状 / 根本原因 / 脱出法」で整理する。本章で予告した PT 無駄買い・コスト見積もり失敗 はここで再登場し、ch11 で触れた Mask モード・ch13 で触れた
max_tokens・ch14 で触れた VPC Endpoint 欠落と並ぶ - 第 18 章のエピローグでは、Production Ready の 15 の判断ポイント として全体を回収する
そして、本章で触れた コスト見積もりワークシート は付録 B で具体的な手順に落とす。CUR の SQL クエリ例、Application Inference Profile の構築 IaC、P95 ベースの月額試算スプレッドシートのテンプレートまで揃える予定だ。「PoC の請求書が本番で 10 倍になる」のを防ぐ実務テンプレートとして使ってほしい。
章末まとめ
- Bedrock の課金モデルは 6 系統(On-Demand / Batch / PT / Priority / Flex / CRIS)。設計時点で「どの仕事をどのモデルに乗せるか」を決めるのが Production Ready の条件
- Provisioned Throughput の損益分岐は 80〜85 % 稼働率。60 % 未満は On-Demand 一択、60〜80 % は Flex / Prompt Caching で吸収、80 %+ で初めて PT 検討。「保険」で買うのは ch17 アンチパターン #1
- Intelligent Prompt Routing は AWS 実測で RAG 用途 63.6 % 削減、87 % が Haiku ルーティング。$1 / 1,000 requests の追加料金で、Sonnet 単価を Haiku 単価に近づけられる
- Prompt Caching はヒット率 30 % 以上で初めて元が取れる(サードパーティブログ概算)。書き込み 1.25 倍(5 分)/ 2 倍(1 時間)のコスト構造を念頭に、システムプロンプト・Few-shot・RAG コンテキストに絞って打つ
- Batch Inference は On-Demand の 50 % オフ、24 時間以内 SLA。ナイトリーサマリ・エンリッチメント・評価データセット生成・埋め込みバックフィルは原則 Batch
- Application Inference Profile は追加料金なしで tag によるコスト分離可視化を実現する。マルチテナント・マルチ機能の SaaS では必須
- コスト最適化 4 段ロケット:(1) モデル選定 → (2) Prompt Caching → (3) Batch 化 → (4) PT or Flex。順番が大事で、第 4 段を先にやると失敗する
- 次章からは Part 4。helpdesk-ai は完成、ここからは他社事例とアンチパターンから振り返る