이 페이지에서는 저장된 임베딩을 사용하여 색인을 생성하고 PostgreSQL용 AlloyDB에서 HNSW
색인을 사용하여 임베딩을 쿼리하는 방법을 설명합니다.
임베딩 저장에 대한 자세한 내용은 벡터 임베딩 저장을 참고하세요.
시작하기 전에
색인 생성을 시작하려면 다음 기본 요건을 완료해야 합니다.
AlloyDB 데이터베이스의 테이블에 임베딩 벡터를 추가해야 합니다.
Google에서 AlloyDB용으로 확장한
pgvector
기반vector
확장 프로그램 버전0.5.0
이상을 설치해야 합니다.CREATE EXTENSION IF NOT EXISTS vector;
HNSW
색인 만들기
AlloyDB는 AlloyDB pgvector
확장 프로그램을 사용하여 스톡 pgvector
에서 사용할 수 있는 그래프 기반 hnsw
색인 생성을 지원합니다. hnsw
색인을 사용하면 최적의 결과를 찾을 때까지 그래프를 통해 지속적으로 쿼리 벡터에 가장 근접한 이웃을 찾는 탐욕적 검색이 수행됩니다. IVF
와 비교할 때 쿼리 성능은 더 빠르지만 빌드 시간은 더 느립니다.
HNSW 알고리즘에 대한 자세한 내용은 HNSW(Hierarchical Navigable Small World) 그래프를 참고하세요.
hnsw
색인을 만들려면 다음 쿼리를 실행합니다.
CREATE INDEX INDEX_NAME ON TABLE
USING hnsw (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (m = NUMBER_OF_CONNECTIONS, ef_construction = 'CANDIDATE_LIST_SIZE');
다음을 바꿉니다.
INDEX_NAME
: 만들려는 색인의 이름(예:my-hnsw-index
)TABLE
: 색인을 추가할 테이블EMBEDDING_COLUMN
:vector
데이터를 저장하는 열DISTANCE_FUNCTION
: 이 색인과 함께 사용할 거리 함수. 다음 중 하나를 선택합니다.L2 거리:
vector_l2_ops
내적:
vector_ip_ops
코사인 거리:
vector_cosine_ops
NUMBER_OF_CONNECTIONS
: 그래프의 노드에서 연결할 수 있는 최대 연결 수. 기본값인16
으로 시작하고 데이터 세트의 크기에 따라 더 큰 값을 실험할 수 있습니다.CANDIDATE_LIST_SIZE
: 그래프 생성 과정에서 유지되는 후보 목록의 크기. 노드에 대한 현재 최적의 최근접 이웃 후보를 지속적으로 업데이트합니다. 이 값은m
값의 두 배 이상으로 설정해야 합니다(예:64
).
색인 생성 진행 상황을 보려면 pg_stat_progress_create_index
뷰를 사용하세요.
SELECT * FROM pg_stat_progress_create_index;
phase
열에는 색인 생성의 현재 상태가 표시되며 색인이 생성되면 building graph
단계가 사라집니다.
목표 재현율과 QPS 균형을 위해 색인을 조정하려면 hnsw
색인 조정을 참조하세요.
쿼리 실행
데이터베이스에 임베딩을 저장하고 색인을 생성한 후 pgvector
쿼리 기능을 사용하여 쿼리를 시작할 수 있습니다.
임베딩 벡터의 의미론적 최근접 이웃을 찾으려면 색인 생성 중에 사용한 것과 동일한 거리 함수를 설정하는 다음 예시 쿼리를 실행하면 됩니다.
SELECT * FROM TABLE
ORDER BY EMBEDDING_COLUMN DISTANCE_FUNCTION_QUERY ['EMBEDDING']
LIMIT ROW_COUNT
다음을 바꿉니다.
TABLE
: 텍스트를 비교할 임베딩이 포함된 테이블INDEX_NAME
: 사용할 색인의 이름(예:my-hnsw-index
)EMBEDDING_COLUMN
: 저장된 임베딩이 포함된 열DISTANCE_FUNCTION_QUERY
: 이 쿼리와 함께 사용할 거리 함수. 색인을 만들 때 사용한 거리 함수에 따라 다음 중 하나를 선택합니다.L2 거리:
<->
내적:
<#>
코사인 거리:
<=>
EMBEDDING
: 의미론적으로 최근접으로 저장된 이웃을 찾으려는 임베딩 벡터ROW_COUNT
: 반환할 행의 개수.가장 일치하는 값 하나만 원하면
1
을 지정합니다.
다른 쿼리 예시에 대한 자세한 내용은 쿼리를 참조하세요.
embedding()
함수를 사용해 텍스트를 벡터로 변환할 수도 있습니다. 이 벡터를 pgvector
의 최근접 이웃 연산자 중 하나에 적용하면, 예를 들어 L2 거리 계산을 위한 <->
연산자를 사용하여 의미론적으로 가장 유사한 임베딩을 가진 데이터베이스 행을 찾을 수 있습니다.
embedding()
에서 real
배열을 반환하므로 pgvector
연산자와 함께 이러한 값을 사용하려면 embedding()
호출을 명시적으로 vector
로 변환해야 합니다.
다음 단계
- ScaNN 색인 만들기
- 벡터 유사성 검색 실행
- 벡터 쿼리 성능 조정
- 벡터 색인 측정항목
- AlloyDB, pgvector, 모델 엔드포인트 관리로 스마트 쇼핑 어시스턴트를 빌드하는 방법 알아보기