チュートリアル: セマンティック キャッシュとして Azure Cache for Redis を使用する

このチュートリアルでは、AI を活用した大規模言語モデル (LLM) を備えたセマンティック キャッシュとして Azure Cache for Redis を使用します。 Azure OpenAI Service を使用して、クエリに対する LLM 応答を生成し、Azure Cache for Redis を使用してそれらの応答をキャッシュすることで、より高速な応答を提供し、コストを削減します。

Azure Cache for Redis は組み込みのベクトル検索機能を提供しているため、セマンティック キャッシュを実行することもできます。 同一のクエリや、テキストは同一でなくても意味が似ているクエリに対してキャッシュされた応答を返すことができます。

このチュートリアルでは、次の作業を行う方法について説明します。

  • セマンティック キャッシュ用に構成された Azure Cache for Redis インスタンスを作成する
  • LangChain の一般的な他の Python ライブラリを使用します。
  • Azure OpenAI サービスを使用して、AI モデルからテキストを生成し、結果をキャッシュします。
  • LLM を備えたキャッシュの使用によるパフォーマンスの向上をご覧ください。

重要

このチュートリアルでは、Jupyter Notebook の構築について説明します。 Python コード ファイル (.py) を使用してこのチュートリアルに従うと、"同様" の結果を得ることができますが、結果を確認するには、このチュートリアルのすべてのコード ブロックを .py ファイルに追加し、1 回実行する必要があります。 つまり、セルを実行すると、Jupyter Notebook に中間結果が提供されますが、これは Python コード ファイルで作業するときに予期される動作ではありません。

重要

代わりに完成した Jupyter Notebook で作業を進める場合は、semanticcache.ipynb という名前の Jupyter Notebook ファイルをダウンロードし、新しい semanticcache フォルダーに保存します。

前提条件

Azure Cache for Redis インスタンスを作成する

クイックスタート: Redis Enterprise キャッシュを作成する」ガイドに従います。 [詳細] ページで、RediSearch を追加していること、およびエンタープライズ クラスター ポリシーを選択していることを確認します。 他のすべての設定は、クイックスタートで説明されている既定値にすることができます。

キャッシュが作成されるまで数分かかります。 この間、次の手順に進むことができます。

Screenshot showing the Enterprise tier Basics tab filled out.

開発環境を設定する

  1. ローカル コンピューター上の通常プロジェクトを保存する場所に semanticcache という名前のフォルダーを作成します。

  2. フォルダー内に新しい Python ファイル (tutorial.py) または Jupyter ノートブック (tutorial.ipynb) を作成します。

  3. 必要な Python パッケージをインストールします。

    pip install openai langchain redis tiktoken
    

Azure OpenAI モデルの作成

Azure OpenAI リソースに次の 2 つのモデルがデプロイされていることを確認してください。

  • テキスト応答を提供する LLM。 このチュートリアルでは、GPT-3.5-turbo-instruct モデルを使用します。

  • クエリをベクトルに変換し、過去のクエリと比較できるようにする埋め込みモデル。 このチュートリアルでは、text-embedding-ada-002 (バージョン 2) モデルを使用します。

詳細な手順については、「モデルをデプロイする」を参照してください。 各モデル デプロイに選択した名前を記録します。

ライブラリをインポートして接続情報を設定する

Azure OpenAI に対して正常に呼び出しを行うには、エンドポイントキーが必要です。 さらに、Azure Cache for Redis に接続するためのエンドポイントキーも必要です。

  1. Azure portal で、Azure OpenAI リソースに移動します。

  2. Azure OpenAI リソースの [リソース管理] セクションで、[エンドポイントとキー] を見つけます。 エンドポイントとアクセス キーをコピーします。これらは、API 呼び出しを認証するために両方とも必要です。 エンドポイントの例: https://docs-test-001.openai.azure.comKEY1 または KEY2 を使用できます。

  3. Azure portal で、Azure Cache for Redis リソースの [概要] ページに移動します。 エンドポイントをコピーします。

  4. [設定] セクションで [アクセス キー] を見つけます。 アクセス キーをコピーします。 Primary または Secondary を使用できます。

  5. 次のコードを新しいコード セルに追加します。

       # Code cell 2
    
    import openai
    import redis
    import os
    import langchain
    from langchain.llms import AzureOpenAI
    from langchain.embeddings import AzureOpenAIEmbeddings
    from langchain.globals import set_llm_cache
    from langchain.cache import RedisSemanticCache
    import time
    
    
    AZURE_ENDPOINT=<your-openai-endpoint>
    API_KEY=<your-openai-key>
    API_VERSION="2023-05-15"
    LLM_DEPLOYMENT_NAME=<your-llm-model-name>
    LLM_MODEL_NAME="gpt-35-turbo-instruct"
    EMBEDDINGS_DEPLOYMENT_NAME=<your-embeddings-model-name>
    EMBEDDINGS_MODEL_NAME="text-embedding-ada-002"
    
    REDIS_ENDPOINT = <your-redis-endpoint>
    REDIS_PASSWORD = <your-redis-password>
    
    
  6. API_KEYRESOURCE_ENDPOINT の値を、Azure OpenAI デプロイのキーとエンドポイントの値で更新します。

  7. LLM_DEPLOYMENT_NAMEEMBEDDINGS_DEPLOYMENT_NAME を Azure OpenAI Service にデプロイした 2 つのモデルの名前に設定します。

  8. REDIS_ENDPOINTREDIS_PASSWORD を、Azure Cache for Redis インスタンスのエンドポイントとキーの値で更新します。

    重要

    API キー、エンドポイント、デプロイ名の情報を渡すには、環境変数またはシークレット マネージャー (Azure Key Vault など) を使用することを強くお勧めします。 ここでは、わかりやすくするために、これらの変数をプレーンテキストで設定しています。

  9. コード セル 2 を実行します。

AI モデルを初期化する

次に、LLM と埋め込みモデルを初期化します。

  1. 次のコードを新しいコード セルに追加します。

       # Code cell 3
    
    llm = AzureOpenAI(
        deployment_name=LLM_DEPLOYMENT_NAME,
        model_name="gpt-35-turbo-instruct",
        openai_api_key=API_KEY,
        azure_endpoint=AZURE_ENDPOINT,
        openai_api_version=API_VERSION,
    )
    embeddings = AzureOpenAIEmbeddings(
        azure_deployment=EMBEDDINGS_DEPLOYMENT_NAME,
        model="text-embedding-ada-002",
        openai_api_key=API_KEY,
        azure_endpoint=AZURE_ENDPOINT,
        openai_api_version=API_VERSION
    )
    
  2. コード セル 3 を実行します。

セマンティック キャッシュとして Redis を設定する

次に、LLM のセマンティック キャッシュとして Redis を指定します。

  1. 次のコードを新しいコード セルに追加します。

       # Code cell 4
    
    redis_url = "rediss://:" + REDIS_PASSWORD + "@"+ REDIS_ENDPOINT
    set_llm_cache(RedisSemanticCache(redis_url = redis_url, embedding=embeddings, score_threshold=0.05))
    

    重要

    score_threshold パラメーターの値は、キャッシュされた結果を返すためには 2 つのクエリがどの程度類似している必要があるかを決定します。 数字が小さいほど、より類似したクエリである必要があります。 この値は、アプリケーションに合わせて微調整できます。

  2. コード セル 4 を実行します。

LLM からクエリを実行して応答を得る

最後に、AI が生成した応答を得るために LLM にクエリを実行します。 Jupyter Notebook を使用している場合は、セルの一番上に %%time を追加することで、コードの実行にかかった時間を出力できます。

  1. 次のコードを新しいコード セルに追加して実行します。

    # Code cell 5
    %%time
    response = llm("Please write a poem about cute kittens.")
    print(response)
    

    次のような出力が表示されます。

    Fluffy balls of fur,
    With eyes so bright and pure,
    Kittens are a true delight,
    Bringing joy into our sight.
    
    With tiny paws and playful hearts,
    They chase and pounce, a work of art,
    Their innocence and curiosity,
    Fills our hearts with such serenity.
    
    Their soft meows and gentle purrs,
    Are like music to our ears,
    They curl up in our laps,
    And take the stress away in a snap.
    
    Their whiskers twitch, they're always ready,
    To explore and be adventurous and steady,
    With their tails held high,
    They're a sight to make us sigh.
    
    Their tiny faces, oh so sweet,
    With button noses and paw-sized feet,
    They're the epitome of cuteness,
    ...
    Cute kittens, a true blessing,
    In our hearts, they'll always be reigning.
    CPU times: total: 0 ns
    Wall time: 2.67 s
    

    Wall time は 2.67 秒を示します。 これは、LLM にクエリを実行し、LLM が応答を生成するまでにかかった実際の時間です。

  2. セル 5 をもう一度実行します。 まったく同じ出力が表示されますが、総経過時間 (wall-time) は小さくなります。

    Fluffy balls of fur,
    With eyes so bright and pure,
    Kittens are a true delight,
    Bringing joy into our sight.
    
    With tiny paws and playful hearts,
    They chase and pounce, a work of art,
    Their innocence and curiosity,
    Fills our hearts with such serenity.
    
    Their soft meows and gentle purrs,
    Are like music to our ears,
    They curl up in our laps,
    And take the stress away in a snap.
    
    Their whiskers twitch, they're always ready,
    To explore and be adventurous and steady,
    With their tails held high,
    They're a sight to make us sigh.
    
    Their tiny faces, oh so sweet,
    With button noses and paw-sized feet,
    They're the epitome of cuteness,
    ...
    Cute kittens, a true blessing,
    In our hearts, they'll always be reigning.
    CPU times: total: 0 ns
    Wall time: 575 ms
    

    総経過時間 (wall-time) は 5 分の 1 に短縮され、575 ミリ秒になります。

  3. クエリを Please write a poem about cute kittens から Write a poem about cute kittens に変更し、セル 5 をもう一度実行します。 全く同じ出力と元のクエリより短い総経過時間 (wall-time) が表示されます。 クエリが変更されても、クエリの意味は変わらないため、同じキャッシュ出力が返されました。 これがセマンティック キャッシュの利点です。

類似性のしきい値を変更する

  1. Please write a poem about cute puppies のように、意味を変えて同様のクエリを実行してみてください。 キャッシュされた結果がここでも返されることに注意してください。 単語 puppies の意味は単語 kittens に十分近いため、キャッシュされた結果が返されます。

  2. 類似性のしきい値は、セマンティック キャッシュがキャッシュされた結果を返すタイミングや、LLM から新しい出力を返すタイミングを決定するために変更できます。 コード セル 4 で、score_threshold0.05 から 0.01 に変更します。

    # Code cell 4
    
    redis_url = "rediss://:" + REDIS_PASSWORD + "@"+ REDIS_ENDPOINT
    set_llm_cache(RedisSemanticCache(redis_url = redis_url, embedding=embeddings, score_threshold=0.01))
    
  3. クエリ Please write a poem about cute puppies の再実行を試みてください。 子犬に特化した新しい出力を受信します。

    Oh, little balls of fluff and fur
    With wagging tails and tiny paws
    Puppies, oh puppies, so pure
    The epitome of cuteness, no flaws
    
    With big round eyes that melt our hearts
    And floppy ears that bounce with glee
    Their playful antics, like works of art
    They bring joy to all they see
    
    Their soft, warm bodies, so cuddly
    As they curl up in our laps
    Their gentle kisses, so lovingly
    Like tiny, wet, puppy taps
    
    Their clumsy steps and wobbly walks
    As they explore the world anew
    Their curiosity, like a ticking clock
    Always eager to learn and pursue
    
    Their little barks and yips so sweet
    Fill our days with endless delight
    Their unconditional love, so complete
    ...
    For they bring us love and laughter, year after year
    Our cute little pups, in every way.
    CPU times: total: 15.6 ms
    Wall time: 4.3 s
    

    キャッシュするクエリを決定する場合に適切な感度が使用されるように、アプリケーションに基づいて類似性のしきい値を微調整する必要があります。

リソースをクリーンアップする

この記事で作成したリソースを引き続き使用する場合は、リソース グループを保持します。

それ以外の場合、リソースを使い終わったら、課金されないように、作成した Azure リソース グループを削除できます。

重要

リソース グループを削除すると、元に戻すことができません。 リソース グループを削除すると、そのリソース グループ内のすべてのリソースは完全に削除されます。 間違ったリソース グループやリソースをうっかり削除しないようにしてください。 リソースを既存のリソース グループ内に作成し、そのリソース グループ内に保持したいリソースが含まれている場合は、リソース グループを削除するのではなく、各リソースを個別に削除できます。

リソース グループを削除するには

  1. Azure portal にサインインし、 [リソース グループ] を選択します。

  2. 削除するリソース グループを選択します。

    多数のリソース グループがある場合は、[任意のフィールドのフィルター...] ボックスを使用し、この記事用に作成したリソース グループの名前を入力します。 結果リストでリソース グループを選びます。

    Screenshot showing a list of resource groups to delete in the working pane.

  3. [リソース グループの削除] を選択します。

  4. リソース グループの削除の確認を求めるメッセージが表示されます。 確認のためにリソース グループの名前を入力し、[削除] を選択します。

    Screenshot showing a form that requires the resource name to confirm deletion.

しばらくすると、リソース グループとそのリソースのすべてが削除されます。