다음을 통해 공유


자습서: Azure Database for PostgreSQL 및 Azure OpenAI를 사용하여 권장 사항 시스템 만들기

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

이 실습 자습서에서는 Azure Database for PostgreSQL 및 Azure OpenAI를 사용하여 추천 애플리케이션을 빌드하는 방법을 보여 줍니다. 권장 사항에는 다른 도메인에 애플리케이션이 있습니다. 서비스 공급자는 고객 및 환경에서 수집된 이전 기록 및 상황별 정보를 기반으로 제공하는 제품 및 서비스에 대한 권장 사항을 제공하는 경향이 있습니다.

권장 사항 시스템을 모델링하는 다양한 방법이 있습니다. 이 자습서에서는 가장 간단한 형태인 이전 구매에 해당하는 제품을 기반으로 하는 권장 사항을 살펴봅니다. 이 자습서에서는 의미 체계 검색을 위한 자습서 에서 사용하는 레시피 데이터 세트를 사용합니다. 권장 사항은 고객이 과거에 좋아하거나 검색한 레시피를 기반으로 하는 레시피에 대한 것입니다.

필수 구성 요소

  1. OpenAI 계정을 만들고 Azure OpenAI에 대한 액세스를 요청합니다.
  2. 원하는 구독에서 Azure OpenAI에 대한 액세스 권한을 부여합니다.
  3. Azure OpenAI 리소스 만들기 및 모델 배포 권한을 부여합니다.
  4. Azure OpenAI 리소스 및 모델을 만들고 배포합니다. embeddings 모델 text-embedding-ada-002를 배포합니다. 배포 이름을 복사하세요. 임베딩을 생성하는 데 필요합니다.

azure_ai 및 pgvector 확장 기능 사용

Azure Database for PostgreSQL 유연한 서버에서 azure_aipgvector을 사용하도록 설정하기 전에, 먼저 허용 목록에 추가해야 합니다. 를 실행 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>');

데이터 다운로드

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로 설정합니다. 이 특정 데이터 세트는 Windows-1252 인코딩을 사용하므로 이 단계가 필요합니다.

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)