Azure Database for PostgreSQL - フレキシブル サーバーと Azure OpenAI を使用したレコメンデーション システム
適用対象: Azure Database for PostgreSQL - フレキシブル サーバー
この実践的なチュートリアルでは、Azure Database for PostgreSQL フレキシブル サーバーと Azure OpenAI Service を使用して、レコメンダー アプリケーションを構築する方法について説明します。 レコメンデーションは、さまざまな分野に応用されています。サービス プロバイダーでは、提供する製品やサービスに関するレコメンデーションを、顧客と環境から収集した以前の履歴やコンテキスト情報に基づいて提供する傾向があります。
レコメンデーション システムのモデル化には、さまざまな方法があります。 この記事では、最もシンプルなレコメンデーション、つまり以前の購入などに対応した製品に基づくレコメンデーションについて説明します。 このチュートリアルでは、セマンティック検索に関する記事で使用されているレシピ データセットを使用します。レコメンデーションは、顧客が以前に "いいね!" を付けるか検索したレシピに基づくレシピを対象にしています。
前提条件
- Open AI アカウントを作成して、Azure OpenAI Service へのアクセスを要求します。
- 目的のサブスクリプションでの権利を Azure OpenAI に与えます。
- Azure OpenAI リソースを作成し、モデルをデプロイするためのアクセス許可を付与します。
Azure OpenAI Service リソースとモデルを作成およびデプロイし、埋め込みモデル text-embedding-ada-002 をデプロイします。 埋め込みを作成するために必要なデプロイ名をコピーします。
azure_ai
拡張機能と pgvector
拡張機能を有効にする
Azure Database for PostgreSQL フレキシブル サーバー インスタンスで azure_ai
と pgvector
を有効にする前に、それらを許可リストに追加 (「PostgreSQL 拡張機能の使用方法」で説明) し、さらに SHOW azure.extensions;
を実行して、追加が適切であることを確認する必要があります。
その後、ターゲット データベースに接続して CREATE EXTENSION コマンドを実行することで、拡張機能をインストールできます。 拡張機能を使用できるようにしたいデータベースごとに、このコマンドを個別に繰り返す必要があります。
CREATE EXTENSION azure_ai;
CREATE EXTENSION pgvector;
OpenAI エンドポイントとキーを設定する
Azure AI サービスの [リソース管理]>[キーとエンドポイント] で、Azure AI リソースのエンドポイントとキーを見つけることができます。 このエンドポイントといずれかのキーを使用して、azure_ai
拡張機能を有効にしてモデル デプロイを起動します。
select azure_ai.set_setting('azure_openai.endpoint','https://<endpoint>.openai.azure.com');
select azure_ai.set_setting('azure_openai.subscription_key', '<API Key>');
データをダウンロードおよびインポートする
- Kaggle からデータをダウンロードします。
- サーバーに接続し
test
データベースを作成して、その中に、データをインポートする先のテーブルを作成します。 - データをインポートします。
- 埋め込み列をテーブルに追加します。
- 埋め込みを生成する。
- 検索。
テーブルの作成
CREATE TABLE public.recipes(
rid integer NOT NULL,
recipe_name text,
prep_time text,
cook_time text,
total_time text,
servings integer,
yield text,
ingredients text,
directions text,
rating real,
url text,
cuisine_path text,
nutrition text,
timing text,
img_src text,
PRIMARY KEY (rid)
);
データをインポートする
クライアント ウィンドウで次の環境変数を設定して、エンコードを utf-8 に設定します。 この手順は、この特定のデータセットが WIN1252 エンコードを使用するため必要です。
Rem on Windows
Set PGCLIENTENCODING=utf-8;
# on Unix based operating systems
export PGCLIENTENCODING=utf-8
作成したテーブルにデータをインポートします。注意すべき点として、このデータセットにはヘッダー行が含まれています。
psql -d <database> -h <host> -U <user> -c "\copy recipes FROM <local recipe data file> DELIMITER ',' CSV HEADER"
埋め込みを格納する列を追加する
ALTER TABLE recipes ADD COLUMN embedding vector(1536);
埋め込みの生成
azure_ai 拡張機能を使用して、データの埋め込みを生成します。 次の例では、いくつかの異なるフィールドを連結してベクトル化します。
WITH ro AS (
SELECT ro.rid
FROM
recipes ro
WHERE
ro.embedding is null
LIMIT 500
)
UPDATE
recipes r
SET
embedding = azure_openai.create_embeddings('text-embedding-ada-002', r.recipe_name||' '||r.cuisine_path||' '||r.ingredients||' '||r.nutrition||' '||r.directions)
FROM
ro
WHERE
r.rid = ro.rid;
処理する行がなくなるまで、コマンドを繰り返します。
ヒント
LIMIT
をいろいろ試してください。 値が大きい場合、Azure OpenAI が強制したスロットリングが原因で、ステートメントが途中で失敗することがあります。 失敗した場合は、少なくとも 1 分間待ってから、コマンドをもう一度実行します。
利便性のため、データベースに検索機能を作成します。
create function
recommend_recipe(sampleRecipeId int, numResults int)
returns table(
out_recipeName text,
out_nutrition text,
out_similarityScore real)
as $$
declare
queryEmbedding vector(1536);
sampleRecipeText text;
begin
sampleRecipeText := (select
recipe_name||' '||cuisine_path||' '||ingredients||' '||nutrition||' '||directions
from
recipes where rid = sampleRecipeId);
queryEmbedding := (azure_openai.create_embeddings('text-embedding-ada-002',sampleRecipeText));
return query
select
distinct r.recipe_name,
r.nutrition,
(r.embedding <=> queryEmbedding)::real as score
from
recipes r
order by score asc limit numResults; -- cosine distance
end $$
language plpgsql;
ここでは、単純に関数を呼び出してレコメンデーションを検索します。
select out_recipename, out_similarityscore from recommend_recipe(1, 20); -- search for 20 recipe recommendations that closest to recipeId 1
次に、結果を調べます。
out_recipename | out_similarityscore
---------------------------------------+---------------------
Apple Pie by Grandma Ople | 0
Easy Apple Pie | 0.05137232
Grandma's Iron Skillet Apple Pie | 0.054287136
Old Fashioned Apple Pie | 0.058492836
Apple Hand Pies | 0.06449003
Apple Crumb Pie | 0.07290977
Old-Fashioned Apple Dumplings | 0.078374185
Fried Apple Pies | 0.07918481
Apple Pie Filling | 0.084320426
Apple Turnovers | 0.08576391
Dutch Apple Pie with Oatmeal Streusel | 0.08779895
Apple Crisp - Perfect and Easy | 0.09170883
Delicious Cinnamon Baked Apples | 0.09384012
Easy Apple Crisp with Pie Filling | 0.09477234
Jump Rope Pie | 0.09503954
Easy Apple Strudel | 0.095167875
Apricot Pie | 0.09634114
Easy Apple Crisp with Oat Topping | 0.09708358
Baked Apples | 0.09826993
Pear Pie | 0.099974394
(20 rows)
次のステップ
Azure Database for PostgreSQL フレキシブル サーバーと Azure OpenAI を使用したセマンティック検索の実行方法について学習しました。