다음을 통해 공유


Azure Database for PostgreSQL - 유연한 서버 및 Azure OpenAI를 사용한 권장 시스템

적용 대상: Azure Database for PostgreSQL - 유연한 서버

이 실습 자습서에서는 Azure Database for PostgreSQL 유연한 서버 및 Azure OpenAI Service를 사용하여 추천 애플리케이션을 빌드하는 방법을 보여 줍니다. 권장 사항은 다양한 영역에 적용됩니다. 서비스 공급자는 고객과 환경에서 수집한 이전 기록과 상황별 정보를 기반으로 자신이 제공하는 제품 및 서비스에 대한 권장 사항을 제공하는 경향이 있습니다.

권장 시스템을 모델링하는 방법에는 여러 가지가 있습니다. 이 문서에서는 가장 간단한 형태, 즉 사전 구매에 해당하는 하나의 제품을 기반으로 한 권장 사항을 살펴봅니다. 이 자습서에서는 의미 체계 검색 문서에 사용된 레시피 데이터 세트를 사용하며 고객이 이전에 좋아했거나 검색한 레시피를 기반으로 레시피를 권장합니다.

필수 조건

  1. OpenAI 계정을 만들고 Azure OpenAI Service에 대한 액세스를 요청합니다.
  2. 원하는 구독에서 Azure OpenAI에 대한 액세스 권한을 부여합니다.
  3. Azure OpenAI 리소스 만들기 및 모델 배포 권한을 부여합니다.

Azure OpenAI 서비스 리소스 및 모델을 만들고 배포하고 embeddings 모델 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 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에서 적용한 제한으로 인해 문이 중간에 실패할 수 있습니다. 실패하면 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)