次の方法で共有


Azure API Management で LLM API のセマンティック キャッシュを有効にする

適用対象: すべての API Management レベル

LLM API 要求への応答のセマンティック キャッシュを有効にして、バックエンド API に課せられる帯域幅と処理要件を減らし、API コンシューマーが認識する待機時間を短縮します。 セマンティック キャッシュを使用すると、同一のプロンプトに対してキャッシュされた応答を返すことができます。また、テキストが同一でない場合でも、意味が似たプロンプトを返すことができます。 背景については、「 チュートリアル: セマンティック キャッシュとして Azure Managed Redis を使用する」を参照してください。

メモ

この記事の構成手順では、Microsoft Foundry モデルの Azure OpenAI から API Management に追加された API のセマンティック キャッシュを有効にする方法を示します。 同様の手順を適用して、 Azure AI モデル推論 API を通じて利用できる対応する大規模言語モデル (LLM) API またはサードパーティの推論プロバイダーを介して提供される OpenAI 互換モデルのセマンティック キャッシュを有効にすることができます。

前提条件

チャット API のデプロイをテストする

まず、Azure OpenAI デプロイをテストして、チャット完了 API またはチャット API が期待どおりに動作することを確認します。 手順については、「Azure OpenAI API を Azure API Management にインポートする」を参照してください。

たとえば、要求本文にプロンプトを指定して API エンドポイントに POST 要求を送信し、Azure OpenAI チャット API をテストします。 応答には、プロンプトの完了を含める必要があります。 要求の例:

POST https://my-api-management.azure-api.net/my-api/openai/deployments/chat-deployment/chat/completions?api-version=2024-02-01

要求本文:

{"messages":[{"role":"user","content":"Hello"}]}

要求が成功すると、応答にはチャット メッセージの完了が含まれます。

埋め込み API のバックエンドを作成する

次の設定を使用して、埋め込み API デプロイ用の バックエンド リソースを作成します。

  • 名前 - 埋め込みバックエンドなど、選択した名前。 ポリシーでバックエンドを参照するにはこの名前を使用します。

  • Type - カスタム URL を選択します。

  • ランタイム URL - Azure OpenAI での埋め込み API デプロイの URL。 https://my-aoai.openai.azure.com/openai/deployments/embeddings-deployment/embeddings (クエリ パラメーターなし) と同様です。

  • 承認資格情報 - [マネージド ID ] タブに移動します。

    • クライアント ID - [システム割り当て ID] を 選択するか、ユーザー割り当てマネージド ID クライアント ID を入力します。
    • リソース ID - Azure OpenAI の https://cognitiveservices.azure.com/ を入力します。

埋め込みバックエンドをテストする

埋め込みバックエンドをテストするには、Azure OpenAI API の API 操作を作成します。

  1. API の [デザイン] タブで、[操作の追加] を選択します。
  2. [埋め込み] などの表示名を入力し、必要に応じて操作の名前を入力します
  3. [フロントエンド] セクションの [URL][POST] を選択し、パス / を入力します。
  4. [ヘッダー] タブで、名前 Content-Type と値 application/json を持つ必須ヘッダーを追加します。
  5. 保存 を選択します。

API 操作の [受信処理] セクションで、次のポリシーを構成します。 set-backend-service ポリシーで、作成したバックエンドの名前を代入します。

<policies>
    <inbound>
        <set-backend-service backend-id="embeddings-backend" />
        <authentication-managed-identity resource="https://cognitiveservices.azure.com/" />
        [...]
    </inbound>
    [...]
</policies>

[テスト] タブで、api-version などの値を持つ 2024-02-01 クエリ パラメーターを追加して操作をテストします。 有効な要求の本文を指定します。 次に例を示します。

{"input":"Hello"}

要求が成功した場合、応答には入力テキストのベクター表現が含まれます。 応答の例:

{
    "object": "list",
    "data": [{
        "object": "embedding",
        "index": 0,
        "embedding": [
            -0.021829502,
            -0.007157768,
            -0.028619017,
            [...]
        ]
    }]
}

セマンティック キャッシュ ポリシーを構成する

Azure API Management で Azure OpenAI API のセマンティック キャッシュを有効にするには、次のポリシーを適用します。1 つは要求を送信する前にキャッシュを確認し (lookup)、もう 1 つは将来再利用するために応答を格納する (store) ポリシーです。

  • API の [受信処理] セクションに azure-openai-semantic-cache-lookup ポリシーを追加します。 embeddings-backend-id 属性に、作成した埋め込み API バックエンドを指定します。

    メモ

    他の大規模言語モデル API のセマンティック キャッシュを有効にする場合は、代わりに llm-semantic-cache-lookup ポリシーを使用します。

    例:

    <azure-openai-semantic-cache-lookup
        score-threshold="0.15"
        embeddings-backend-id="embeddings-backend"
        embeddings-backend-auth="system-assigned"
        ignore-system-messages="true"
        max-message-count="10">
        <vary-by>@(context.Subscription.Id)</vary-by>
    </azure-openai-semantic-cache-lookup>
    <rate-limit calls="10" renewal-period="60" />
    

    メモ

    キャッシュ検索後に レートリミ ットポリシー(または キー別レートリミ ットポリシー)を追加し、呼び出し数を制限し、キャッシュが利用できない場合にバックエンドサービスの過負荷を防ぎます。

  • API の [送信処理] セクションに azure-openai-semantic-cache-store ポリシーを追加します。

    メモ

    他の大規模言語モデル API のセマンティック キャッシュを有効にする場合は、代わりに llm-semantic-cache-store ポリシーを使用します。

    例:

    <azure-openai-semantic-cache-store duration="60" />
    

キャッシュの確認

セマンティック キャッシュが期待どおりに動作することを確認するには、ポータルのテスト コンソールを使用して、テスト完了操作またはチャット完了操作をトレースします。 後続の試行でキャッシュが使用されていることを確認するには、トレースを調べます。 Azure API Management における API 呼び出しのトレースの詳細を確認する

ルックアップ ポリシーの score-threshold 属性を調整して、格納されている応答を返すために、受信プロンプトがキャッシュされたプロンプトとどの程度一致する必要があるかを制御します。 スコアのしきい値が低いということは、キャッシュされた応答を返すには、プロンプトのセマンティック類似性が高い必要があることを意味します。 しきい値を超えるスコアのプロンプトでは、キャッシュされた応答は使用されません。

たとえば、キャッシュが使用されている場合、[ 出力 ] セクションには、次のスクリーンショットのようなエントリが含まれます。

Azure portal の要求トレースのスクリーンショット。