IVF 색인 만들기

이 페이지에서는 저장된 임베딩을 사용하여 색인을 생성하고 PostgreSQL용 AlloyDB에서 IVF 색인을 사용하여 임베딩을 쿼리하는 방법을 설명합니다. 임베딩 저장에 대한 자세한 내용은 벡터 임베딩 저장을 참고하세요.

시작하기 전에

색인 생성을 시작하려면 다음 기본 요건을 완료해야 합니다.

  • AlloyDB 데이터베이스의 테이블에 임베딩 벡터를 추가해야 합니다.

  • Google에서 AlloyDB용으로 확장한 pgvector 기반 vector 확장 프로그램 버전 0.5.0 이상을 설치해야 합니다.

    CREATE EXTENSION IF NOT EXISTS vector;
    

IVF 색인 만들기

스톡 pgvector는 색인 생성을 통한 근사 최근접 이웃 검색을 지원합니다. AlloyDB는 색인을 만들 때 지정할 수 있는 스칼라 양자화 기능으로 이러한 지원에 추가합니다. 사용 설정 시 스칼라 양자화에서 보다 큰 차원 벡터가 있는 쿼리의 속도를 대폭 향상할 수 있으며, 차원이 최대 8,000개까지 있는 벡터를 저장할 수 있습니다.

pgvector 기반 색인에서 스칼라 양자화를 사용 설정하려면 IVF를 색인 메서드로, SQ8을 양자화기로 지정합니다.

CREATE INDEX INDEX_NAME ON TABLE
  USING ivf (EMBEDDING_COLUMN DISTANCE_FUNCTION)
  WITH (lists = LIST_COUNT, quantizer = 'QUANTIZER');

다음을 바꿉니다.

  • INDEX_NAME: 만들려는 색인의 이름(예: my-ivf-index). 색인 이름은 데이터베이스 전체에서 공유됩니다. 각 색인 이름이 데이터베이스의 각 테이블에 고유해야 합니다.

  • TABLE: 색인을 추가할 테이블

  • EMBEDDING_COLUMN: vector 데이터를 저장하는 열

  • DISTANCE_FUNCTION: 이 색인과 함께 사용할 거리 함수. 다음 중 하나를 선택합니다.

    • L2 거리: vector_l2_ops

    • 내적: vector_ip_ops

    • 코사인 거리: vector_cosine_ops

  • LIST_COUNT: 이 색인과 함께 사용할 목록 수. 이 값을 결정하는 방법에 대한 자세한 내용은 IVF 색인 조정을 참조하세요.

  • QUANTIZER: 사용할 양자화기 유형입니다.

    다음 중 하나로 설정합니다.

    • SQ8: 권장. 쿼리 응답이 더 빠르지만 일부 재현율 손실이 발생하지만 이는 프로덕션 시나리오에 영향을 미치지 않습니다.
    • FLAT: 쿼리 응답이 느리고 메모리 사용량이 많지만 재현율 손실을 무시할 수준으로 줄일 수 있습니다.

    vector 대신 real[] 데이터 유형을 사용하는 임베딩 열에 이 색인을 만들려면 열을 vector 데이터 유형으로 변환합니다.

CREATE INDEX INDEX_NAME ON TABLE
  USING ivf (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)))'}} DISTANCE_FUNCTION)
  WITH (lists = LIST_COUNT, quantizer = 'SQ8');

DIMENSIONS를 임베딩 열의 차원 너비로 바꿉니다. 차원을 찾는 방법에 대한 자세한 내용은 벡터 함수vector_dims 함수를 참조하세요.

색인 생성 진행 상황을 보려면 pg_stat_progress_create_index 뷰를 사용하세요.

SELECT * FROM pg_stat_progress_create_index;

phase 열에는 현재 색인 생성 상태가 표시되고 building postings 단계는 색인 생성이 거의 완료됐음을 나타냅니다.

목표 재현율과 QPS 균형을 위해 색인을 조정하려면 IVF 색인 조정을 참조하세요.

쿼리 실행

데이터베이스에 임베딩을 저장하고 색인을 생성한 후 pgvector 쿼리 기능을 사용하여 쿼리를 시작할 수 있습니다.

임베딩 벡터의 의미론적 최근접 이웃을 찾으려면 색인 생성 중에 사용한 것과 동일한 거리 함수를 설정하는 다음 예시 쿼리를 실행하면 됩니다.

  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 배열을 반환하므로 pgvector 연산자와 함께 이러한 값을 사용하려면 embedding() 호출을 명시적으로 vector로 변환해야 합니다.

다음 단계