Azure APIMを起点に考えるAPIキャッシュ設計 ── Edge / Gateway / App / AI の役割分担
Azure APIMを起点に考えるAPIキャッシュ設計
Azure API Management (APIM) には通常のレスポンスキャッシュも、AI Gateway の文脈ではセマンティックキャッシュもあります。便利です。便利なのですが、「APIM にキャッシュ機能がある」ことだけで設計を始めると、だいたい途中で苦しくなります。
なぜなら、キャッシュの本質は「どの製品にその機能があるか」ではなく、どの層で・何を・どこまで共有して再利用するかだからです。
Microsoft Learn の Caching guidance、APIM の Caching overview、そして AI gateway in Azure API Management を並べて読むと、この点がかなりはっきり見えてきます。
この記事では Azure を具体例に使いますが、話の軸は Azure 固有ではありません。CDN、API Gateway、分散キャッシュ、ベクトル検索をどう分担させるか、という 一般化可能なキャッシュ設計の考え方 を整理し、その中で APIM がどこで強いのかを見ていきます。
関連記事
キャッシュは「最適化」ではなく「設計」
まずは全体像です。キャッシュを APIM 単体で語るのではなく、階層で捉えたほうが設計判断がぶれません。
| レイヤ | 代表例 | 主な役割 | 何をキーにしやすいか |
|---|---|---|---|
| クライアント | Browser Cache / HTTP Cache | 往復そのものを消す | URL、ETag、Cache-Control |
| Edge / CDN | Azure Front Door / CDN | 地理的分散、静的 GET の吸収 | URL、クエリ、ヘッダー |
| API Gateway | Azure APIM | 認証後・ルーティング後の API 制御 | URL、ヘッダー、任意キー、購読者情報 |
| Application | In-memory / Redis | ビジネスロジックの再利用 | ドメインキー、集約結果 |
| Data | DB cache / Materialized View | I/O 削減 | クエリ、エンティティ ID |
| AI / LLM | Semantic Cache / Embedding Cache | トークン削減、推論短縮 | ベクトル類似度 |
この見方で大事なのは、同じ「キャッシュ」でも判定方法が違うことです。
- HTTP キャッシュは「同じリソースか」を見る
- Key-Value キャッシュは「同じ意味の業務キーか」を見る
- セマンティックキャッシュは「意味的に十分近いか」を見る
なので、設計の出発点は「APIM にキャッシュを置くか?」ではなく、次の問いになります。
その再利用は、Edge で十分か?
Gateway で判断すべきか?
アプリ全体で共有すべきか?
それとも“意味”で再利用したいのか?
APIM が強いのは「Gateway 層の判断」が必要なとき
APIM はキャッシュ製品というより、キャッシュ判断を API 境界で行える製品です。
Gateway 層にいるので、APIM は少なくとも次を見ながら判断できます。
- 誰が呼んでいるか
- どの API / Product / Subscription 経由か
- どのバックエンドへ流すか
- どのポリシーが適用されるか
この性質が、CDN やアプリ内キャッシュにはない強みです。
まずは完全一致のレスポンスキャッシュ
APIM の基本形は cache-lookup / cache-store です。これは 同一の HTTP GET リクエストに対して、完全一致のレスポンスを返す ための仕組みです。
ここでのポイントはかなりストレートです。
- 向いているのは「同じ GET に同じ応答を返しやすい API」
-
vary-by-headerやvary-by-query-parameterでキャッシュキーを調整できる - Caching overview でも、lookup の直後に rate limit を置くことが推奨されている
最後の点は実務で重要です。APIM のキャッシュは best effort で、キャッシュが使えないときはバックエンドへ流れます。つまり、キャッシュは高速化の仕組みであって、バックエンド保護を 100% 代替する仕組みではありません。
実例: AI 利用ポータルの「利用可能モデル一覧 API」を APIM 組み込みキャッシュで吸収する
例えば、社内の AI 利用ポータルが GET /model-catalog?region=japaneast&api-version=2025-01-01 のような API を持っているとします。返す内容は次のようなものです。
- その利用者の契約プランで使えるモデル一覧
- 各モデルの最大トークン数や利用上限の説明
- リージョンごとの提供状況
この種の API は、同じ利用者や同じアプリから何度も呼ばれやすいわりに、内容は秒単位では変わりません。ポータルの画面表示、SDK の初期化、定期的な再読み込みで、同じ GET が短時間に繰り返されがちです。
このとき APIM の組み込みキャッシュが向いています。
- 単一の APIM サービス内で閉じた最適化で十分
- 応答差分が
regionや契約プランなど Gateway 文脈に依存する - 数十秒〜数分の TTL で困らない
- キャッシュが飛んでも、バックエンドにフォールバックできる
例えば次のように、APIM の内蔵キャッシュを明示して短時間キャッシュできます。
<policies>
<inbound>
<base />
<cache-lookup
caching-type="internal"
vary-by-developer="true"
vary-by-developer-groups="false"
downstream-caching-type="none"
must-revalidate="true">
<vary-by-query-parameter>region</vary-by-query-parameter>
<vary-by-query-parameter>api-version</vary-by-query-parameter>
<vary-by-header>Accept</vary-by-header>
</cache-lookup>
<rate-limit calls="20" renewal-period="60" />
</inbound>
<outbound>
<cache-store duration="30" />
<base />
</outbound>
</policies>
この例の勘所は、CDN に寄せるには API ごとの差分が大きいが、Redis を立てるほどでもないという点です。まさに APIM 組み込みキャッシュが気持ちよくハマる領域です。
逆に、利用者ごとに返却内容が細かく変わる場合や、複数 APIM・複数リージョンで同じ一覧を共有したい場合は、内蔵キャッシュだけでは足りなくなります。そのときは外部キャッシュや cache-lookup-value の設計を考えたほうがよいです。
もう一段強いのが「任意キーのキャッシュ」
APIM の面白いところは、cache-lookup-value / cache-store-value で レスポンス全体ではなく、任意の値をキー付きで保持できる ことです。
Microsoft Learn の Custom caching in Azure API Management では、例えば次のようなパターンが紹介されています。
- ユーザープロファイル断片の再利用
- クライアント別のバックエンドバージョン切り替え
- テナント別ルーティング情報の再利用
これは一般化すると、Gateway が「業務的な lookup テーブル」を短期保持する という考え方です。単なる HTTP キャッシュより一段柔らかい。
ただし、ここでも APIM をメタデータストア本体として扱うのは危険です。特に cache-store-value は非同期に保存されるため、即時一貫性が前提の設定ストア として考えないほうが安全です。
APIM の内蔵キャッシュと外部キャッシュは、役割がかなり違う
APIM の公式比較表 をざっくり要約すると、次の整理になります。
| 観点 | APIM 内蔵キャッシュ | 外部キャッシュ |
|---|---|---|
| 導入のしやすさ | 高い。自動で利用開始しやすい | 追加構成が必要 |
| 追加コスト | なし | あり |
| 共有範囲 | 同一 APIM サービス・同一リージョン内が基本 | 複数 APIM / 複数サービスで共有しやすい |
| 永続性 | v2 ティアでは改善、classic では更新時に揮発しうる | 構成次第で永続化しやすい |
| Consumption / self-hosted | 内蔵は使えない | 対応可能 |
| データ preload / purge | 弱い | やりやすい |
| セマンティックキャッシュ | 非対応 | 対応 |
ここで誤解しやすいのは、APIM 内蔵キャッシュは「APIM の中で閉じた最適化」だということです。
同じ APIM サービス内で完結する GET 再利用には十分便利ですが、次の要求が出た瞬間に外部キャッシュを考えたくなります。
- 複数 API / 複数バックエンドで共有したい
- Consumption tier や self-hosted gateway でも同じ戦略を使いたい
- セマンティックキャッシュを使いたい
- preload / purge / 永続化をきちんと制御したい
つまり、APIM 内蔵キャッシュは“Gateway ローカル最適化”、外部キャッシュは “システム全体の再利用基盤” に寄っていきます。
Front Door / CDN と APIM をどう分担するか
API キャッシュでよくある失敗は、「とりあえず Gateway に全部背負わせる」ことです。実際には、Azure Front Door のキャッシュ と APIM は役割が違います。
| 観点 | Front Door / CDN | APIM |
|---|---|---|
| 主な強み | Edge 配置、静的 GET の吸収、広域レイテンシ改善 | 認証後制御、API 単位のポリシー、任意キー設計 |
| キー設計 | URL / クエリ中心 | URL / ヘッダー / 任意キー / 購読者情報 |
| 認証文脈 | 弱い | 強い |
| 向いている対象 | 広く共有できる応答 | API ごとの差異が大きい応答 |
設計ルールとしては次くらいが分かりやすいです。
- 公開 GET で、ほぼ同じバイト列を返すなら Edge を優先する
- 認証後の判断や API ポリシーが絡むなら Gateway を使う
- 複数 API / アプリ横断で使うなら分散キャッシュへ寄せる
Front Door 側の注意点もかなり実務的です。
- キャッシュ対象は基本
GETのみ -
Authorizationヘッダー付きリクエストは、条件を満たさない限りキャッシュされない - クエリ文字列の扱いを明示しないと、思わぬ共有や分裂が起こる
- 動的で個人化された API を雑に Edge キャッシュすると、情報漏えい事故の温床になる
公式ドキュメントでも、静的資産と動的・認証付き API はルートを分けるべきというニュアンスが強いです。Edge は強力ですが、強力ゆえに雑に使うと危険、というやつです。
APIM の次に考えるべきは「共有キャッシュ基盤」
Gateway 層を越えて再利用したくなったら、話は APIM 単体から 分散キャッシュ に移ります。Azure なら今の主役は Azure Managed Redis です。旧来の Azure Cache for Redis 系のドキュメントも多く残っていますが、現行の新規設計では Managed Redis を基準に読むほうが自然です。
ここで大事なのは、Redis を「APIM の外部オプション」としてだけ見ないことです。
Redis が効くのは、次のように 再利用対象が APIM の外側まで広がる ときです。
- APIM とアプリケーションの両方で同じデータを再利用したい
- 複数の API やワーカーで同じ lookup 結果を共有したい
- ローカルキャッシュ + 共有キャッシュの二段構えにしたい
- ベクトル検索やセマンティックキャッシュの基盤にも使いたい
Cache-Aside pattern や Caching guidance が繰り返し言っているのは、要するにこういうことです。
キャッシュは本番データの本体ではない。
失っても再構築できるように設計し、TTL と invalidation を含めて考える。
この原則は Azure 以外でもそのまま通用します。Redis でも Memcached でも、自前 KVS でも本質は同じです。
Azure 固有の補足
Azure で APIM から外部 Redis を使う場合、Use an external Redis-compatible cache in Azure API Management にあるとおり、接続は Redis の connection string ベースです。2026年4月時点でも、APIM から Azure Managed Redis への外部キャッシュ接続では access key 認証を有効化した connection string が必要で、Microsoft Entra ID 認証は使えません。
ここは少しややこしいのですが、Azure Managed Redis 自体は Microsoft Entra ID ベース認証をサポートしています。ただし、APIM の external cache 接続経路ではまだその認証方式を使えない、という切り分けです。
つまり Azure でも、Gateway → 分散キャッシュ間の資格情報管理はまだ設計論点として残る、ということです。ここはかなり現実的な注意点です。
「HTTPキャッシュ → Keyキャッシュ → Semanticキャッシュ」で考える
キャッシュ戦略を整理しやすくするために、次の 3 段階で考えるのが分かりやすいです。
| 種類 | ヒット判定 | 向くケース | 主な注意点 |
|---|---|---|---|
| HTTP レスポンスキャッシュ | URL / ヘッダー / クエリの完全一致 | 典型的な GET API、静的レスポンス | 認証・個人化データの混入 |
| Key キャッシュ | 任意の業務キー | 断片データ、設定、ルーティング、集約結果 | キー設計と無効化 |
| Semantic キャッシュ | ベクトル類似度 | FAQ、初回問い合わせ、定型説明、曖昧検索 | 誤ヒット、鮮度、プライバシー、長い会話ではヒット率が下がりやすい |
この表の良いところは、「なぜ APIM の通常キャッシュだけでは足りないのか」が自然に見えることです。
- 完全一致だけで十分なら
cache-lookup/cache-store - 業務キーで再利用したいなら
cache-lookup-value/cache-store-value - 文字列が違っても意味が近ければよいならセマンティックキャッシュ
ここで初めて、AI Gateway のセマンティックキャッシュが “AI 専用の別世界” ではなく、キャッシュ戦略の延長線上 に見えてきます。
セマンティックキャッシュは「LLM の小技」ではなく、意味一致キャッシュ
セマンティックキャッシュの要点は単純です。
- 入力を embedding でベクトル化する
- そのベクトルを使って近い過去リクエストを探す
- 十分近ければ過去の応答を返し、そうでなければバックエンドを呼ぶ
Embedding は、テキストの意味を浮動小数点ベクトルに写像する仕組みです。Microsoft Learn の Understand embeddings では、コサイン類似度を使って意味の近さを測る考え方が説明されています。
APIM の Enable semantic caching for LLM APIs in Azure API Management を読むと、Azure の具体像は次のようになります。
- Chat Completion 用のバックエンド
- Embeddings 用のバックエンド
- Azure Managed Redis などの外部キャッシュ
- RediSearch によるベクトル近傍検索
-
azure-openai-semantic-cache-lookup/azure-openai-semantic-cache-storeあるいはllm-semantic-cache-*ポリシー
Azure 固有の実装ではこうなりますが、考え方自体は Azure に閉じません。
完全一致ではなく、意味一致で再利用したい。
だから embedding とベクトル検索が必要になる。
これだけです。
ただし、ここで「意味が近いなら広く効くはず」と考えると少し危険です。APIM のセマンティックキャッシュは、会話状態を理解して要約する仕組みではなく、近い過去リクエストをベクトル近傍検索する仕組みです。公式のポリシードキュメントでも、セマンティックキャッシュは現在の要求に対して不正確・古い・安全でない応答を返しうるので、ワークロードごとに慎重に評価すべきだと明記されています。
実例: 社内 FAQ アシスタントで「言い換え」をまとめて吸収する
AI アプリでいちばん分かりやすい利用例は、社内 FAQ やヘルプデスク系のチャットです。
例えば、従業員向けの人事アシスタントに対して、次のような質問が繰り返し来るとします。
- 「有給休暇の申請方法は?」
- 「有休ってどうやって申請するの?」
- 「休暇申請の手順を教えて」
文字列は違いますが、欲しい答えはほぼ同じです。このとき毎回 LLM にフルで問い合わせるのは、トークンも待ち時間ももったいない。ここでセマンティックキャッシュが効きます。
流れはシンプルです。
- アプリがプロンプトを APIM 経由で送る
- APIM が Embeddings API で入力をベクトル化する
- Azure Managed Redis のベクトル検索で、意味的に近い過去質問を探す
- 十分近ければ過去回答を返す
- 見つからなければ LLM を呼び、その応答を新たに保存する
APIM のポリシーは、たとえば次のような形です。
<policies>
<inbound>
<base />
<azure-openai-semantic-cache-lookup
score-threshold="0.05"
embeddings-backend-id="embeddings-backend"
embeddings-backend-auth="system-assigned"
ignore-system-messages="true"
max-message-count="1">
<vary-by>@(context.Subscription.Id)</vary-by>
</azure-openai-semantic-cache-lookup>
<rate-limit calls="10" renewal-period="60" />
</inbound>
<outbound>
<azure-openai-semantic-cache-store duration="300" />
<base />
</outbound>
</policies>
この例でのポイントは次のとおりです。
- 言い換えが多いので、完全一致キャッシュよりヒットしやすい
- FAQ のように答えが比較的安定しているので、再利用しやすい
-
vary-byで購読者やテナント単位に区切れば、別組織への誤共有を避けやすい -
max-message-countは長い会話をうまくキャッシュする魔法ではなく、会話が一定以上に伸びたらキャッシュ判定をスキップするための上限として捉えたほうが安全です。この例では、単発質問や初回質問に寄せるために1にしています - LLM の呼び出し回数を減らせるので、トークンコストとピーク時負荷の両方に効く
一方で、同じ人事アシスタントでも「私の残有休日数を教えて」のようにユーザー固有データを返す質問は別です。この種の問い合わせに同じ設定をそのまま当てると危険です。セマンティックキャッシュを使うなら、少なくともユーザーやテナント文脈で分離するか、場合によってはその操作では無効化したほうが安全です。
会話型チャットでは、そのままだと効きにくい
ここはかなり重要です。セマンティックキャッシュは「会話全体をキャッシュする機能」ではありません。
例えばマルチターンのチャットでは、2ターン目以降のリクエストはたいてい次のようになります。
- 直前までの
user/assistantメッセージを含む - 会話中に確定した条件や状態を含む
- 直前の回答を踏まえた追加質問になる
すると、1ターン目は似ていても、2ターン目以降は会話のコンテキスト全体が少しずつ変わるため、キャッシュ判定の入力も安定しにくくなります。ignore-system-messages="true" で system message を除外しても、user / assistant の履歴そのものは変わり続けるので、長い会話ほどヒット率は落ちやすいです。
ここで max-message-count が出てきますが、これも「会話履歴をいい感じに圧縮して、長い会話でもキャッシュを効かせる機能」ではありません。Microsoft Learn のポリシー定義では、残りの dialog message 数が一定を超えたらキャッシュをスキップするための制御として説明されています。つまり、少なくとも設計上の期待値としては、長い会話にセマンティックキャッシュを広く効かせるための機能ではないと理解したほうが安全です。
要するに、APIM のセマンティックキャッシュは次のように考えると誤解しにくくなります。
- 向いている: FAQ、初回問い合わせ、定型説明、似た質問が何度も来る単発系
- そのままだと向きにくい: 長い会話、状態を引きずるエージェント、個人化された相談、推論途中のやり取り
なので、会話型アプリで使うとしても、まずは 「最初の1問」や「安定した intent が見える局面だけ」 に限定して試すほうが現実的です。
会話アプリで使うなら「会話全体」ではなく「安定部分」を狙う
それでも会話型アプリで活かしたいなら、キャッシュ対象を丸ごとの会話ではなく、会話の中で比較的変わらない部分に寄せるのが定石です。
例えば次のような分担です。
-
初回ターンだけキャッシュする
FAQ、制度説明、製品説明のように最初の質問が繰り返されやすい場面に限定する -
RAG の検索クエリやツール入力をキャッシュする
会話本文ではなく、検索語や外部 API 呼び出しの入力側を再利用する -
アプリ側で state / intent を正規化してからキャッシュする
会話履歴をそのまま投げるのではなく、要約済み state や intent を別途作って安定化する
最後のパターンは強力ですが、これはもう APIM 単体の話ではありません。 会話履歴の要約、状態の圧縮、ノイズ除去はアプリやエージェント側の責務です。APIM はその後段で「安定化された入力」に対して意味一致キャッシュをかける、と考えたほうが実態に近いです。
セマンティックキャッシュは LLM 以外にも効く
セマンティックキャッシュを「チャットボット専用機能」とみなすと、急に使いどころが狭くなります。むしろ重要なのは、“曖昧な入力を受ける API” 全般 に広げて考えることです。
例えば次のようなものです。
- FAQ / ナレッジ検索
- RAG の検索クエリやツール呼び出し入力
- 商品推薦の近似問い合わせ
- 地名・住所・商品名の表記ゆれ吸収
- 曖昧な自然言語検索 API
逆に、次のようなケースは慎重に扱うべきです。
- ユーザーごとに答えが変わる質問
- 機密情報や個人情報を含む問い合わせ
- 鮮度が重要なデータ
- 毎回違う創造性が必要な生成タスク
- 長い会話履歴をそのまま含むマルチターンチャット
- 状態遷移が多い agent loop や tool orchestration
この注意点は Cache-Aside pattern のセマンティックキャッシュに関する注記とも整合しています。意味が近い と 同じ応答を返してよい は、イコールではありません。
Redis と AI Search はどちらが「セマンティックキャッシュの置き場」か
ここで面白いのが、キャッシュと検索の境界が曖昧になっていることです。
- Azure Managed Redis のベクトル検索 は、低レイテンシな近傍検索と再利用に強い
- Azure AI Search の vector search や hybrid search は、検索・知識探索・RAG に強い
両者の役割を乱暴に言うとこうです。
| 問い | 向いているもの |
|---|---|
| 「最近見た“ほぼ同じ問い合わせ”はないか?」 | Redis 系のセマンティックキャッシュ |
| 「知識ベース全体から関連文書を探したい」 | 検索エンジン / ベクトル検索 |
もう少し丁寧に言うと、次の違いがあります。
| 観点 | Redis / セマンティックキャッシュ | AI Search / ベクトル検索 |
|---|---|---|
| 主目的 | 近い過去応答の再利用 | コーパス検索・知識検索 |
| レイテンシ | 低くしやすい | 相対的に重くなりやすい |
| データ寿命 | 短期〜中期の再利用向き | 中長期の知識蓄積向き |
| 典型パターン | キャッシュヒットでバックエンド回避 | 検索結果を LLM に渡す |
| 主な評価軸 | ヒット率、誤ヒット率、TTL | 再現率、関連性、フィルタリング |
この整理をすると、設計判断がかなり楽になります。
- キャッシュは「同じような問い合わせをもう一度解かない」ための仕組み
- 検索は「まだ答えを持っていない問いに関連情報を集める」ための仕組み
見た目は似ていますが、目的が違います。
コスト視点で見ると、キャッシュは“削減装置”になる
キャッシュの話はレイテンシ最適化に見えがちですが、実際には コスト最適化 の意味合いがかなり大きいです。
- Edge キャッシュはオリジントラフィックを減らす
- Gateway キャッシュはバックエンド API 呼び出しを減らす
- 分散キャッシュはアプリや DB の再計算・再取得を減らす
- セマンティックキャッシュは LLM のトークン消費を減らす
ただし、ここで雑に「ヒットすれば安い」と考えるのも危険です。特にセマンティックキャッシュは、次のコストが増えます。
- embedding 呼び出し
- ベクトルストア / Redis の維持
- 誤ヒットを避けるための評価と調整
- 監視、ログ、運用
特に長い会話でヒットしにくいのに毎回 embedding だけは計算されるような設計だと、期待したほど安くならないどころか、評価・運用コストだけが増えることもあります。
なので、キャッシュを導入するときは “どれだけ再利用されるか” を測れること が前提です。
Azure では、APIM の Monitor API Management や AI Gateway のトークンメトリクス/LLM ログを使って、次のような観測ができます。
- キャッシュヒット / ミスの傾向
- バックエンド呼び出し削減量
- API ごとのレイテンシ
- トークン消費量
- どの利用者・どの API がコストを生んでいるか
設計として重要なのは、キャッシュを入れることではなく、ヒット率・誤ヒット率・鮮度・フォールバック時の負荷を見ながら回せることです。
設計判断のためのチェックリスト
実務では、次の順で考えると破綻しにくいです。
1. 同じバイト列を広く返せるか
Yes なら、まず Browser / CDN / Edge を疑います。Edge で止められるものを Gateway まで持ち込むのは、たいてい損です。
2. 認証やサブスクリプションで応答が変わるか
Yes なら Gateway の出番です。APIM のように、呼び出し元と API ポリシーを見ながら制御できる層が向いています。
3. 複数 API / アプリ / サービスで再利用したいか
Yes なら、APIM 内蔵キャッシュだけでは足りません。分散キャッシュに寄せたほうが長生きします。
4. 完全一致でよいか、意味一致が必要か
- 完全一致なら HTTP / Key キャッシュ
- 意味一致なら embedding + ベクトル検索
5. 古い値をどこまで許容できるか
TTL、再検証、無効化、更新イベント。キャッシュの議論はここを飛ばすと事故ります。
6. キャッシュが落ちたときに何が起こるか
APIM の公式ドキュメントが rate limit の併用を強く勧めるのは、まさにこのためです。ミス時にバックエンドが耐えられるか を先に決めておくべきです。
Azure で組むなら、こんな分担がわかりやすい
最後に、Azure で考えるときの素直な分担例を載せます。
Client / Browser
↓
Azure Front Door
- 公開 GET のキャッシュ
- Edge 配置
↓
Azure API Management
- 認証 / 認可
- レート制限
- レスポンスキャッシュ
- 任意キーキャッシュ
- AI Gateway ポリシー
↓
Azure Managed Redis
- 外部キャッシュ
- 複数サービス共有
- セマンティックキャッシュのベース
↓
Backend APIs / App Service / Functions / LLM
↓
Azure Monitor / Log Analytics / Application Insights
- ヒット率、レイテンシ、トークン、ログ観測
この構成の良さは、責務が素直なことです。
- Front Door は「同じものを広く配る」
- APIM は「API 境界で判断する」
- Redis は「システム全体で再利用する」
- LLM / 検索は「まだ解いていない問題を解く」
まとめ
APIM のキャッシュを理解する最短ルートは、APIM の機能一覧だけを見ることではありません。むしろ、キャッシュ全体を次の順で見ることです。
- そもそもどの層で止めるべきか
- 完全一致か、任意キーか、意味一致か
- APIM はその中でどの判断を担当するのか
その視点で整理すると、APIM の役割はかなり明快です。
- Edge ではやりにくい API 文脈付きの再利用を担う
- 認証後・ルーティング後のキャッシュ判断を担う
- AI Gateway では意味一致キャッシュまで広げられるが、主戦場は FAQ や定型問い合わせのような“安定した入力”であり、長い会話を丸ごと効率化する万能策ではない
- ただし、全体最適は APIM 単体ではなく、CDN / 分散キャッシュ / 検索と合わせて設計する
要するに、APIM キャッシュは出発点です。
本質は、どのレイヤで、どの意味で、何をキャッシュするか にあります。
参考リンク
まず見る公式ドキュメントの入口
全体設計
APIM のキャッシュ
- Caching overview
- cache-lookup policy
- cache-store policy
- cache-lookup-value policy
- cache-store-value policy
- Custom caching in Azure API Management
- Use an external Redis-compatible cache in Azure API Management
Edge / CDN
Redis / 分散キャッシュ
セマンティックキャッシュ / ベクトル検索
- AI gateway in Azure API Management
- Enable semantic caching for LLM APIs in Azure API Management
- azure-openai-semantic-cache-lookup policy
- llm-semantic-cache-lookup policy
- llm-semantic-cache-store policy
- Learn how to generate embeddings
- Understand embeddings(concept explanation, Foundry classic)
- Vector search in Azure AI Search
- Create a hybrid query in Azure AI Search
- What are Vector Embeddings and Vector Search in Azure Cache for Redis?
Discussion