이 문서에서는 저장된 임베딩을 사용하여 색인을 생성하고 임베딩을 쿼리하는 방법을 보여줍니다. 임베딩 저장에 대한 자세한 내용은 벡터 임베딩 저장을 참조하세요.
AlloyDB를 사용하면 ScaNN
, IVF
, IVFFlat
, HNSW
색인을 만들 수 있습니다.
시작하기 전에
색인 생성을 시작하려면 다음 기본 요건을 완료해야 합니다.
AlloyDB 데이터베이스의 테이블에 임베딩 벡터를 추가해야 합니다.
Google에서 AlloyDB용으로 확장한
pgvector
기반vector
확장 프로그램 버전0.5.0
이상을 설치해야 합니다.CREATE EXTENSION IF NOT EXISTS vector;
ScaNN
색인을 생성하려면vector
확장 프로그램 외에alloydb_scann
확장 프로그램을 설치하세요.CREATE EXTENSION IF NOT EXISTS alloydb_scann;
색인 만들기
데이터베이스의 테이블에 대해 다음 색인 유형 중 하나를 만들 수 있습니다.
ScaNN
색인 만들기
AlloyDB alloydb_scann
는
가용성이 높은 PostgreSQL 데이터베이스를 구현하는 Google에서 개발한 PostgreSQL 확장 프로그램
[ScaNN
algorithm](https://github.com/google-research/google-research/blob/master/scann/docs/algorithms.md).
ScaNN
색인은 근사
최근접 이웃 검색 색인 빌드 시간이 짧고
HNSW
에 비해 메모리 사용량이 적습니다. 또한 워크로드에 따라
워크로드에 따라 HNSW
와 비교합니다.
AlloyDB 데이터베이스의 테이블 ScaNN
색인을 생성하려고 하면
비어 있거나 파티션을 나눈 테이블에서 색인을 생성하려 하면 문제가 발생할 수 있습니다. 자세한 내용은
생성된 오류에 대한 자세한 내용은 ScaNN 색인 오류 문제 해결을 참고하세요.
2단계 트리 ScaNN
색인
ScaNN 알고리즘을 사용하여 열에 2단계 트리 색인을 적용하려면 다음 안내를 따르세요.
저장된 벡터 임베딩이 포함된 열에 적용하려면 다음 DDL 쿼리를 실행하세요.
CREATE INDEX INDEX_NAME ON TABLE
USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (num_leaves=NUM_LEAVES_VALUE);
다음을 바꿉니다.
INDEX_NAME
: 색인 이름생성(예:
my-scann-index
) 색인 이름이 공유됩니다.데이터베이스 전체에서 각 색인 이름이 데이터베이스의 각
데이터베이스의 테이블에
TABLE
: 색인을 추가할 테이블EMBEDDING_COLUMN
:vector
을 저장하는 열인지하지 못할 수 있습니다
DISTANCE_FUNCTION
: 사용할 거리 함수이 색인과 일치합니다. 다음 중 하나를 선택합니다.
L2 거리:
l2
내적:
dot_product
코사인 거리:
cosine
NUM_LEAVES_VALUE
: 적용할 파티션 수이 색인에 포함됩니다. 1~1048576 사이의 값으로 설정합니다. 추가 정보
이 값을 결정하는 방법에 관한 자세한 내용은
ScaNN
색인 조정을 참고하세요.
3단계 트리 ScaNN
색인
ScaNN 알고리즘을 사용하여 열에 3단계 트리 색인을 만들려면 다음 안내를 따르세요.
저장된 벡터 임베딩이 포함된 열에 적용하려면 다음 DDL 쿼리를 실행하세요.
CREATE INDEX INDEX_NAME ON TABLE
USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (num_leaves=NUM_LEAVES_VALUE, max_num_levels = MAX_NUM_LEVELS);
다음을 바꿉니다.
MAX_NUM_LEVELS
: K-평균 클러스터링 트리의 최대 수준 수입니다.K-평균 클러스터링 트리입니다. 2단계 트리 기반 양자화의 경우
1
(기본값)로 설정하고양자화의 경우 로 설정하고 3단계 트리 기반 양자화의 경우
2
로 설정합니다.
색인을 만든 후
[지정된 텍스트로 최근접 이웃 쿼리 작성]의 안내에 따라 색인을 사용하는 최근접 이웃 검색어를 실행할 수 있습니다.
지정된 텍스트로 쿼리합니다](#query).
색인 파라미터는 QPS와
회상도 ScaNN
색인 조정에 관한 자세한 내용은 [ScaNN
색인 조정]을 참고하세요.
index](/alloydb/omni/containers/15.7.0/docs/ai/tune-indexes).
real[]
데이터 유형을 사용하는 임베딩 열에 이 색인을 만들려면
vector
대신 vector
데이터 유형을 사용하는 임베딩 열에 이 색인을 만들려면 열을 vector
데이터 유형으로 변환합니다.
CREATE INDEX INDEX_NAME ON TABLE
USING scann (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)) DISTANCE_FUNCTION)
WITH (num_leaves=NUM_LEAVES_VALUE, max_num_levels = MAX_NUM_LEVELS);
DIMENSIONS
을 임베딩 열의 차원 너비로 바꿉니다.
임베딩 열입니다. 차원을 찾는 방법에 대한 자세한 내용은
[벡터vector_dims
functions](https://github.com/pgvector/pgvector?tab=readme-ov-file#vector-functions).
색인 생성 진행 상황을 보려면 pg_stat_progress_create_index
뷰를 사용하세요.
SELECT * FROM pg_stat_progress_create_index;
phase
열에는 현재 색인 생성 상태가 표시되고
색인이 생성되면 building index: tree training
단계가 사라집니다.
목표 재현율과 QPS 균형을 위해 색인을 조정하려면 ScaNN
색인 조정을 참조하세요.
색인이 생성된 테이블 분석
ScaNN
색인을 만든 후 ANALYZE
명령어를 실행하여 데이터에 대한 통계를 업데이트합니다.
ANALYZE TABLE;
쿼리 실행
데이터베이스에 임베딩을 저장하고 색인을 생성한 후
[pgvector
쿼리
functionality](https://github.com/pgvector/pgvector#querying). 다음 명령어를 실행할 수 없습니다.
alloydb_scann
확장 프로그램을 사용하여 대량 검색어를 실행할 수 없습니다.
임베딩 벡터의 의미론적 최근접 이웃을 찾으려면
다음 예시 쿼리를 실행하면 됩니다.
색인 생성 중에
SELECT * FROM TABLE
ORDER BY EMBEDDING_COLUMN DISTANCE_FUNCTION_QUERY ['EMBEDDING']
LIMIT ROW_COUNT
다음을 바꿉니다.
TABLE
: 텍스트를 비교할 임베딩이 포함된 테이블문자 메시지를 보낼 수 있습니다.
INDEX_NAME
: 사용할 색인의 이름입니다.예를 들면
my-scann-index
입니다.EMBEDDING_COLUMN
: 저장된임베딩은
DISTANCE_FUNCTION_QUERY
: 이 쿼리와 함께 사용할 거리 함수쿼리 사용된 거리 함수에 따라 다음 중 하나를 선택합니다.
색인을 만드는 동안
L2 거리:
<->
내적:
<#>
코사인 거리:
<=>
EMBEDDING
: 의미론적으로 최근접으로 저장된 이웃을 찾으려는 임베딩 벡터의미론적 이웃을 반환합니다.
ROW_COUNT
: 반환할 행의 개수.가장 일치하는 값 하나만 원하면
1
을 지정합니다.
다른 쿼리 예시에 대한 자세한 내용은 다음을 참고하세요.
embedding()
함수를 사용해
텍스트를 벡터로 변환합니다. 벡터를
pgvector
최근접 이웃 연산자(예: L2 거리의 경우 <->
)에 적용하여 의미상 가장 유사한 임베딩이 있는 데이터베이스 행을 찾습니다.
가장 의미상 유사한 임베딩을 반환합니다.
embedding()
에서 real
배열을 반환하므로 연산자와 함께 이러한 값을 사용하려면 embedding()
호출을 명시적으로 로 변환해야 합니다.
pgvector
와 함께 이러한 값을 사용하려면 embedding()
호출을 vector
로 변환해야 합니다.
연산자
CREATE EXTENSION IF NOT EXISTS google_ml_integration;
CREATE EXTENSION IF NOT EXISTS vector;
SELECT * FROM TABLE
ORDER BY EMBEDDING_COLUMN::vector
<-> embedding('MODEL_IDVERSION_TAG', 'TEXT')
LIMIT ROW_COUNT
다음을 바꿉니다.
MODEL_ID
: 쿼리할 모델의 ID입니다.Vertex AI Model Garden을 사용하는 경우
text-embedding-005
를 모델 ID로 지정합니다. 이는 AlloyDB가 텍스트 임베딩에 사용할 수 있는 클라우드 기반 모델입니다. 자세한 내용은 텍스트 임베딩을 참고하세요.(선택사항)
VERSION_TAG
: 쿼리할 모델의 버전 태그. 태그 앞에@
를 추가합니다.Vertex AI에
text-embedding
영어 모델 중 하나를 사용하는 경우 예를 들어text-embedding-005
와 같은 버전 태그를 지정하세요. 버전 태그는 모델 버전에 나와 있습니다.버전 태그를 지정하는 것이 좋습니다. 버전 태그를 지정하지 않으면 AlloyDB는 항상 최신 모델 버전을 사용하게 되며, 이로 인해 예기치 않은 결과가 발생할 수 있습니다.
TEXT
: 벡터 임베딩으로 변환할 텍스트입니다.