共用方式為


使用適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器和 Azure OpenAI 的建議系統

適用於:適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器

本實際操作教學課程示範如何使用 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器和 Azure OpenAI 服務來建置推薦應用程式。 建議可套用在不同的領域 – 服務提供者通常會根據先前從客戶和環境收集的記錄和內容資訊,為其提供的產品和服務提供建議。

建議系​​統建模有多種不同的方法。 本文會探索最簡單的方法 – 基於先前的購買對一樣產品提出建議。 本教學課程會使用語意搜尋文章中所使用的食譜資料集,並會根據客戶先前喜歡或搜尋的食譜做出建議。

必要條件

  1. 建立 OpenAI 帳戶,並 要求 Azure OpenAI Service 的存取
  2. 在所需的訂用帳戶中授與 Azure OpenAI 的存取權。
  3. 授與 建立 Azure OpenAI 資源及部署模型 的權限。

建立及部署 Azure OpenAI 服務資源和模型,部署內嵌模型 文字內嵌-ada-002。 複製部署名稱,因為需要用以建立內嵌。

啟用 azure_aipgvector 延伸模組

在適用於 PostgreSQL 的 Azure 資料庫彈性伺服器執行個體上啟用 azure_aipgvector 之前,您必須先將它們新增至您的允許清單 (如如何使用 PostgreSQL 延伸模組所述),並執行 SHOW azure.extensions; 來檢查是否已正確新增。

然後,您可以連線到目標資料庫並執行 CREATE EXTENSION 命令來安裝延伸模組。 您需要為每個您希望延伸模組可用的資料庫分別重複該命令。

CREATE EXTENSION azure_ai;
CREATE EXTENSION vector;

設定 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 所施加的節流而中途失敗。 如果失敗,請至少等候一分鐘,然後再次執行命令。

為了方便起見,請在資料庫中建立搜尋函式:

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)