チュートリアル: セマンティック キャッシュとして 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 サブスクリプション - 無料アカウントを作成します
目的の Azure サブスクリプションで Azure OpenAI に付与されたアクセス。現在、Azure OpenAI へのアクセスを申請する必要があります。 Azure OpenAI へのアクセスを申請するには、https://aka.ms/oai/access のフォームに入力してください。
Jupyter Notebook (オプション)
text-embedding-ada-002 (バージョン 2) および gpt-35-turbo-instruct モデルがデプロイされた Azure OpenAI リソース。 これらのモデルは現在、特定のリージョンでのみ使用できます。 モデルをデプロイする手順については、リソースのデプロイ ガイドを参照してください。
Azure Cache for Redis インスタンスを作成する
「クイックスタート: Redis Enterprise キャッシュを作成する」ガイドに従います。 [詳細] ページで、RediSearch を追加していること、およびエンタープライズ クラスター ポリシーを選択していることを確認します。 他のすべての設定は、クイックスタートで説明されている既定値にすることができます。
キャッシュが作成されるまで数分かかります。 この間、次の手順に進むことができます。
開発環境を設定する
ローカル コンピューター上の通常プロジェクトを保存する場所に semanticcache という名前のフォルダーを作成します。
フォルダー内に新しい Python ファイル (tutorial.py) または Jupyter ノートブック (tutorial.ipynb) を作成します。
必要な 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 に接続するためのエンドポイントとキーも必要です。
Azure portal で、Azure OpenAI リソースに移動します。
Azure OpenAI リソースの [リソース管理] セクションで、[エンドポイントとキー] を見つけます。 エンドポイントとアクセス キーをコピーします。これらは、API 呼び出しを認証するために両方とも必要です。 エンドポイントの例:
https://docs-test-001.openai.azure.com
。KEY1
またはKEY2
を使用できます。Azure portal で、Azure Cache for Redis リソースの [概要] ページに移動します。 エンドポイントをコピーします。
[設定] セクションで [アクセス キー] を見つけます。 アクセス キーをコピーします。
Primary
またはSecondary
を使用できます。次のコードを新しいコード セルに追加します。
# 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>
API_KEY
とRESOURCE_ENDPOINT
の値を、Azure OpenAI デプロイのキーとエンドポイントの値で更新します。LLM_DEPLOYMENT_NAME
とEMBEDDINGS_DEPLOYMENT_NAME
を Azure OpenAI Service にデプロイした 2 つのモデルの名前に設定します。REDIS_ENDPOINT
とREDIS_PASSWORD
を、Azure Cache for Redis インスタンスのエンドポイントとキーの値で更新します。重要
API キー、エンドポイント、デプロイ名の情報を渡すには、環境変数またはシークレット マネージャー (Azure Key Vault など) を使用することを強くお勧めします。 ここでは、わかりやすくするために、これらの変数をプレーンテキストで設定しています。
コード セル 2 を実行します。
AI モデルを初期化する
次に、LLM と埋め込みモデルを初期化します。
次のコードを新しいコード セルに追加します。
# 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 )
コード セル 3 を実行します。
セマンティック キャッシュとして Redis を設定する
次に、LLM のセマンティック キャッシュとして Redis を指定します。
次のコードを新しいコード セルに追加します。
# 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 つのクエリがどの程度類似している必要があるかを決定します。 数字が小さいほど、より類似したクエリである必要があります。 この値は、アプリケーションに合わせて微調整できます。コード セル 4 を実行します。
LLM からクエリを実行して応答を得る
最後に、AI が生成した応答を得るために LLM にクエリを実行します。 Jupyter Notebook を使用している場合は、セルの一番上に %%time
を追加することで、コードの実行にかかった時間を出力できます。
次のコードを新しいコード セルに追加して実行します。
# 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 が応答を生成するまでにかかった実際の時間です。セル 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 ミリ秒になります。
クエリを
Please write a poem about cute kittens
からWrite a poem about cute kittens
に変更し、セル 5 をもう一度実行します。 全く同じ出力と元のクエリより短い総経過時間 (wall-time) が表示されます。 クエリが変更されても、クエリの意味は変わらないため、同じキャッシュ出力が返されました。 これがセマンティック キャッシュの利点です。
類似性のしきい値を変更する
Please write a poem about cute puppies
のように、意味を変えて同様のクエリを実行してみてください。 キャッシュされた結果がここでも返されることに注意してください。 単語puppies
の意味は単語kittens
に十分近いため、キャッシュされた結果が返されます。類似性のしきい値は、セマンティック キャッシュがキャッシュされた結果を返すタイミングや、LLM から新しい出力を返すタイミングを決定するために変更できます。 コード セル 4 で、
score_threshold
を0.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))
クエリ
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 リソース グループを削除できます。
重要
リソース グループを削除すると、元に戻すことができません。 リソース グループを削除すると、そのリソース グループ内のすべてのリソースは完全に削除されます。 間違ったリソース グループやリソースをうっかり削除しないようにしてください。 リソースを既存のリソース グループ内に作成し、そのリソース グループ内に保持したいリソースが含まれている場合は、リソース グループを削除するのではなく、各リソースを個別に削除できます。
リソース グループを削除するには
Azure portal にサインインし、 [リソース グループ] を選択します。
削除するリソース グループを選択します。
多数のリソース グループがある場合は、[任意のフィールドのフィルター...] ボックスを使用し、この記事用に作成したリソース グループの名前を入力します。 結果リストでリソース グループを選びます。
[リソース グループの削除] を選択します。
リソース グループの削除の確認を求めるメッセージが表示されます。 確認のためにリソース グループの名前を入力し、[削除] を選択します。
しばらくすると、リソース グループとそのリソースのすべてが削除されます。