다음을 통해 공유


Azure Database for PostgreSQL - 유연한 서버에 대해 diskann 확장을 사용하도록 설정하고 사용하는 방법(미리 보기)

DiskANN은 모든 규모에서 효율적인 벡터 검색을 위한 확장 가능한 근사 근사 검색 알고리즘입니다. 수십억 개의 지점 데이터 세트에 대해서도 높은 회수율, 높은 QPS(초당 쿼리 수) 및 낮은 쿼리 대기 시간을 제공합니다. 이렇게 하면 대용량 데이터를 처리할 수 있는 강력한 도구입니다. Microsoft의 DiskANN에 대해 자세히 알아보기

Azure Database for PostgreSQL 유연한 서버에 대한 확장은 pg_diskann 효율적인 벡터 인덱싱 및 검색을 위해 DiskANN을 사용하기 위한 지원을 추가합니다.

pg_diskann 미리 보기 기능에 등록

pg_diskann Azure Database for PostgreSQL - 유연한 서버의 경우 사용자가 미리 보기 양식을 통해 등록해야 합니다. 등록하려면 아래 단계를 따릅니다.

  1. 미리 보기 양식 열기
  2. 모든 관련 세부 정보를 입력합니다. 사용하려면 Azure 구독 ID가 필요합니다.

참고 항목

미리 보기 양식을 작성하면 요청이 승인되는 데 다소 시간이 소요됩니다. 확인이 전자 메일로 전송됩니다.

확장 사용 pg_diskann

Azure Database for PostgreSQL 유연한 서버 인스턴스에서 사용하도록 설정 pg_diskann 하려면 PostgreSQL 확장을 사용하는 방법에 설명된 대로 허용 목록에 추가하고 실행SHOW azure.extensions;하여 올바르게 추가되었는지 확인해야 합니다.

서버 매개 변수에서 pg_diskann 선택하는 스크린샷

Important

이 미리 보기 기능은 새로 배포된 Azure Database for PostgreSQL 유연한 서버 인스턴스에만 사용할 수 있습니다.

그런 다음 대상 데이터베이스에 연결하고 CREATE EXTENSION 명령을 실행하여 확장을 설치할 수 있습니다. 확장 기능을 사용하려는 모든 데이터베이스에 대해 개별적으로 명령을 반복해야 합니다.

CREATE EXTENSION IF NOT EXISTS pg_diskann CASCADE;

이 명령은 PostgreSQL 데이터베이스에 아직 설치되지 않은 경우 사용하도록 설정합니다 pgvector .

참고 항목

현재 연결된 데이터베이스에서 확장을 제거하려면 DROP EXTENSION vector;를 사용합니다.

인덱스 액세스 방법 사용 diskann

확장이 설치되면 벡터 데이터가 포함된 테이블 열에 인덱스를 만들 diskann 수 있습니다. 예를 들어 테이블 열 my_tableembedding 인덱을 만들려면 다음 명령을 사용합니다.

CREATE TABLE my_table (
 id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
 embedding public.vector(3)
 -- other columns
);
-- insert dummy data
INSERT INTO my_table (embedding) VALUES
('[1.0, 2.0, 3.0]'),
('[4.0, 5.0, 6.0]'),
('[7.0, 8.0, 9.0]');
-- create a diskann index by using Cosine distance operator
CREATE INDEX my_table_embedding_diskann_idx ON my_table USING diskann (embedding vector_cosine_ops)

인덱스 옵션

인덱 diskann스 생성 시 다양한 매개 변수를 지정하여 동작을 제어할 수 있습니다. 현재 제공되는 옵션은 다음과 같습니다.

  • max_neighbors: 그래프의 노드당 최대 가장자리 수입니다. (기본값: 32)
  • l_value_ib: 인덱스 빌드 중 검색 목록의 크기(기본값: 50)
CREATE INDEX my_table_embedding_diskann_custom_idx ON my_table USING diskann (embedding vector_cosine_ops)
WITH (
 max_neighbors = 48,
 l_value_ib = 100
 );

인덱스 검색(l_value_is)에 대한 L 값은 전체 연결 또는 트랜잭션당(트랜잭션 블록 내에서 사용)에 대해 SET LOCAL 설정할 수 있습니다.

SET diskann.l_value_is = 100;
SELECT * FROM my_table ORDER BY embedding <=> '[1,2,3]' LIMIT 5; -- uses 100 candidates

Postgres는 DiskANN 인덱스를 사용할 시기를 자동으로 결정합니다. 항상 인덱스를 사용하려는 시나리오가 있는 경우 다음 명령을 사용합니다.

SET LOCAL enable_seqscan TO OFF;
SELECT * FROM my_table ORDER BY embedding <=> '[1,2,3]' LIMIT 5; -- forces the use of index

인덱싱 진행

PostgreSQL 12 이상에서는 pg_stat_progress_create_index를 사용하여 인덱싱 진행률을 확인할 수 있습니다.

SELECT phase, round(100.0 * blocks_done / nullif(blocks_total, 0), 1) AS "%" FROM pg_stat_progress_create_index;

DiskANN 인덱스를 빌드하는 단계는 다음과 같습니다.

  1. initializing
  2. loading tuples

Warning

경우에 따라 인덱스 빌드 시간이 느려질 수 있습니다.

인덱스 액세스 함수 선택

벡터 형식을 사용하면 저장된 벡터에서 세 가지 유형의 검색을 수행할 수 있습니다. 데이터베이스가 쿼리를 실행할 때 인덱스를 고려할 수 있도록 인덱스에 대한 올바른 액세스 함수를 선택해야 합니다.

pg_diskann 는 다음 거리 연산자를 지원합니다.

  • vector_l2_ops: <-> 유클리드 거리
  • vector_cosine_ops: <=> 코사인 거리
  • vector_ip_ops: <#> 내부 제품