次の方法で共有


Azure Database for PostgreSQL - フレキシブル サーバーと Azure OpenAI を使用したレコメンデーション システム

適用対象: Azure Database for PostgreSQL - フレキシブル サーバー

この実践的なチュートリアルでは、Azure Database for PostgreSQL フレキシブル サーバーと Azure OpenAI Service を使用して、レコメンダー アプリケーションを構築する方法について説明します。 レコメンデーションは、さまざまな分野に応用されています。サービス プロバイダーでは、提供する製品やサービスに関するレコメンデーションを、顧客と環境から収集した以前の履歴やコンテキスト情報に基づいて提供する傾向があります。

レコメンデーション システムのモデル化には、さまざまな方法があります。 この記事では、最もシンプルなレコメンデーション、つまり以前の購入などに対応した製品に基づくレコメンデーションについて説明します。 このチュートリアルでは、セマンティック検索に関する記事で使用されているレシピ データセットを使用します。レコメンデーションは、顧客が以前に "いいね!" を付けるか検索したレシピに基づくレシピを対象にしています。

前提条件

  1. Open AI アカウントを作成して、Azure OpenAI Service へのアクセスを要求します。
  2. 目的のサブスクリプションでの権利を Azure OpenAI に与えます。
  3. Azure OpenAI リソースを作成し、モデルをデプロイするためのアクセス許可を付与します。

Azure OpenAI Service リソースとモデルを作成およびデプロイし、埋め込みモデル text-embedding-ada-002 をデプロイします。 埋め込みを作成するために必要なデプロイ名をコピーします。

azure_ai 拡張機能と pgvector 拡張機能を有効にする

Azure Database for PostgreSQL フレキシブル サーバー インスタンスで azure_aipgvector を有効にする前に、それらを許可リストに追加 (「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>'); 

データをダウンロードおよびインポートする

  1. Kaggle からデータをダウンロードします。
  2. サーバーに接続し test データベースを作成して、その中に、データをインポートする先のテーブルを作成します。
  3. データをインポートします。
  4. 埋め込み列をテーブルに追加します。
  5. 埋め込みを生成する。
  6. 検索。

テーブルの作成

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 を使用したセマンティック検索の実行方法について学習しました。