다음을 통해 공유


Azure Database for PostgreSQL - 유연한 서버에서 Azure OpenAI를 사용하여 벡터 포함 생성

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

Azure OpenAI 포함을 쉽게 호출하여 입력의 벡터 표현을 가져올 수 있습니다. 이 표현은 벡터 유사성 검색에 사용되고 기계 학습 모델에서 사용될 수 있습니다.

필수 조건

  1. azure_ai 확장을 사용하도록 설정하고 구성합니다.
  2. OpenAI 계정을 만들고 Azure OpenAI Service에 대한 액세스를 요청합니다.
  3. 원하는 구독에서 Azure OpenAI에 대한 액세스 권한을 부여합니다.
  4. Azure OpenAI 리소스 만들기 및 모델 배포 권한을 부여합니다.
  5. Azure OpenAI 서비스 리소스와 모델을 만들고 배포합니다. 예를 들어, 포함 모델 text-embedding-ada-002를 배포합니다. 포함을 만드는 데 필요하므로 배포 이름을 복사합니다.

OpenAI 엔드포인트 및 키 구성

Azure OpenAI 리소스의 리소스 관리>키 및 엔드포인트에서 Azure OpenAI 리소스에 대한 엔드포인트와 키를 찾을 수 있습니다. 모델 배포를 호출하려면 엔드포인트와 키 중 하나를 사용하여 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>'); 

azure_openai.create_embeddings

Azure OpenAI API를 호출하여 지정된 입력에 대해 제공된 배포를 사용하여 포함을 만듭니다.

azure_openai.create_embeddings(deployment_name text, input text, timeout_ms integer DEFAULT 3600000, throw_on_error boolean DEFAULT true, max_attempts integer DEFAULT 1, retry_delay_ms integer DEFAULT 1000)
azure_openai.create_embeddings(deployment_name text, input text[], batch_size integer DEFAULT 100, timeout_ms integer DEFAULT 3600000, throw_on_error boolean DEFAULT true, max_attempts integer DEFAULT 1, retry_delay_ms integer DEFAULT 1000)

인수

deployment_name

text 모델이 포함된 Azure OpenAI Studio의 배포 이름입니다.

input

포함이 생성되는 데 사용되는 함수의 오버로드에 따라 단일 텍스트 또는 텍스트 배열 text 또는 text[].

dimensions

integer DEFAULT NULL 결과 출력 포함에 포함해야 하는 차원의 수입니다. text-embedding-3 이상 모델에서만 지원됩니다. azure_ai 확장 버전 1.1.0 이상에서 사용 가능

batch_size

integer DEFAULT 100한 번에 처리할 레코드 수(매개 변수 input 형식이 text[]인 함수의 오버로드에만 사용 가능).

timeout_ms

integer DEFAULT 3600000 작업이 중지된 후의 시간 제한(밀리초)입니다.

throw_on_error

boolean DEFAULT true 오류가 발생하면 함수가 예외를 발생시켜 래핑 트랜잭션이 롤백됩니다.

max_attempts

integer DEFAULT 1 다시 시도 가능한 오류와 함께 실패할 경우 확장에서 Azure OpenAI 포함 만들기를 다시 시도하는 횟수.

retry_delay_ms

integer DEFAULT 1000 다시 시도 가능한 오류와 함께 실패할 때 생성을 포함하기 위해 Azure OpenAI 엔드포인트를 다시 호출하기 전에 확장이 대기하는 시간(밀리초).

반환 형식

선택한 배포에서 처리할 때 입력 텍스트의 벡터 표현과 함께 사용되는 함수의 오버로드에 따라 단일 요소 또는 단일 열 테이블 real[] 또는 TABLE(embedding real[]).

OpenAI를 사용하여 포함을 만들고 이를 벡터 데이터 형식으로 저장

-- Create tables and populate data
DROP TABLE IF EXISTS conference_session_embeddings;
DROP TABLE IF EXISTS conference_sessions;

CREATE TABLE conference_sessions(
  session_id int PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
  title text,
  session_abstract text,
  duration_minutes integer,
  publish_date timestamp
);

-- Create a table to store embeddings with a vector column.
CREATE TABLE conference_session_embeddings(
  session_id integer NOT NULL REFERENCES conference_sessions(session_id),
  session_embedding vector(1536)
);

-- Insert a row into the sessions table
INSERT INTO conference_sessions
    (title,session_abstract,duration_minutes,publish_date) 
VALUES
    ('Gen AI with Azure Database for PostgreSQL flexible server'
    ,'Learn about building intelligent applications with azure_ai extension and pg_vector' 
    , 60, current_timestamp)
    ,('Deep Dive: PostgreSQL database storage engine internals'
    ,' We will dig deep into storage internals'
    , 30, current_timestamp)
    ;

-- Get an embedding for the Session Abstract
SELECT
     pg_typeof(azure_openai.create_embeddings('text-embedding-ada-002', c.session_abstract)) as embedding_data_type
    ,azure_openai.create_embeddings('text-embedding-ada-002', c.session_abstract)
  FROM
    conference_sessions c LIMIT 10;

-- Insert embeddings 
INSERT INTO conference_session_embeddings
    (session_id, session_embedding)
SELECT
    c.session_id, (azure_openai.create_embeddings('text-embedding-ada-002', c.session_abstract))
FROM
    conference_sessions as c  
LEFT OUTER JOIN
    conference_session_embeddings e ON e.session_id = c.session_id
WHERE
    e.session_id IS NULL;

-- Create a HNSW index
CREATE INDEX ON conference_session_embeddings USING hnsw (session_embedding vector_ip_ops);


-- Retrieve top similarity match
SELECT
    c.*
FROM
    conference_session_embeddings e
INNER JOIN
    conference_sessions c ON c.session_id = e.session_id
ORDER BY
    e.session_embedding <#> azure_openai.create_embeddings('text-embedding-ada-002', 'Session to learn about building chatbots')::vector
LIMIT 1;

다음 단계