다음을 통해 공유


Azure Database for PostgreSQL - 유연한 서버 및 Azure OpenAI를 사용하는 의미 체계 검색

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

이 실습 자습서에서는 Azure Database for PostgreSQL 유연한 서버 및 Azure OpenAI Service를 사용하여 의미 체계 검색 애플리케이션을 빌드하는 방법을 보여 줍니다. 의미 체계 검색은 의미 체계를 기준으로 검색을 수행합니다. 표준 어휘 검색은 쿼리에 제공된 키워드를 기준으로 검색을 수행합니다. 예를 들어 레시피 데이터 세트에는 글루텐 프리, 비건, 유제품, 과일이 없는 또는 디저트와 같은 레이블이 포함되지 않을 수 있지만 이러한 특성은 재료에서 추론할 수 있습니다. 이러한 의미 체계 쿼리를 실행하고 관련 검색 결과를 가져오는 것이 좋습니다.

GenAI 및 유연한 서버를 사용하여 데이터에 대한 의미 체계 검색 기능을 빌드하려면 다음 단계를 수행합니다.

  • 검색 시나리오를 식별합니다. 검색에 포함할 데이터 필드를 식별합니다.
  • 검색에 관련된 모든 데이터 필드에 저장된 값의 포함 항목을 저장할 해당 벡터 필드를 만듭니다.
  • 선택한 데이터 필드의 데이터에 대한 포함을 생성하고 해당 벡터 필드에 포함을 저장합니다.
  • 지정된 입력 검색 쿼리에 대해 포함을 생성합니다.
  • 벡터 데이터 필드를 검색하고 가장 가까운 인접 항목을 나열합니다.
  • 적절한 관련성, 순위 및 개인 설정 모델을 통해 결과를 실행하여 최종 순위를 생성합니다. 이러한 모델이 없는 경우 결과의 순위를 내림차순 내적 순서로 지정합니다.
  • 모델, 결과 품질 및 비즈니스 메트릭(예: CTR(선택 속도) 및 유지 시간을 모니터링합니다. 피드백 메커니즘을 통합하여 데이터 품질, 데이터 최신성 및 개인 설정에서 사용자 환경에 이르는 검색 스택을 디버그하고 개선합니다.

필수 조건

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

Azure OpenAI 서비스 리소스 및 모델을 만들고 배포하고 embeddings 모델 text-embedding-ada-002를 배포합니다. 포함을 만드는 데 필요하므로 배포 이름을 복사합니다.

azure_aipgvector 확장을 사용하도록 설정합니다.

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
    recipe_search(searchQuery text, numResults int)
returns table(
            recipeId int,
            recipe_name text,
            nutrition text,
            score real)
as $$
declare
    query_embedding vector(1536);
begin
    query_embedding := (azure_openai.create_embeddings('text-embedding-ada-002', searchQuery));
    return query
    select
        r.rid,
        r.recipe_name,
        r.nutrition,
        (r.embedding <=> query_embedding)::real as score
    from
        recipes r
    order by score asc limit numResults; -- cosine distance
end $$
language plpgsql;

이제 다음과 같이 검색하는 함수를 호출합니다.

select recipeid, recipe_name, score from recipe_search('vegan recipes', 10);

결과를 살펴봅니다.

 recipeid |                         recipe_name                          |   score
----------+--------------------------------------------------------------+------------
      829 | Avocado Toast (Vegan)                                        | 0.15672222
      836 | Vegetarian Tortilla Soup                                     | 0.17583494
      922 | Vegan Overnight Oats with Chia Seeds and Fruit               | 0.17668104
      600 | Spinach and Banana Power Smoothie                            |  0.1773768
      519 | Smokey Butternut Squash Soup                                 | 0.18031077
      604 | Vegan Banana Muffins                                         | 0.18287598
      832 | Kale, Quinoa, and Avocado Salad with Lemon Dijon Vinaigrette | 0.18368931
      617 | Hearty Breakfast Muffins                                     | 0.18737361
      946 | Chia Coconut Pudding with Coconut Milk                       |  0.1884186
      468 | Spicy Oven-Roasted Plums                                     | 0.18994217
(10 rows)