벡터 임베딩 작업

이 페이지에서는 Cloud SQL을 통해 벡터 임베딩을 사용하는 애플리케이션을 빌드하는 방법을 설명합니다.

MySQL용 Cloud SQL은 벡터 임베딩 스토리지를 지원합니다. 그런 후 벡터 검색 색인을 만들고 Cloud SQL에 저장하는 나머지 데이터와 함께 벡터 임베딩에서 유사성 검색을 수행할 수 있습니다.

벡터 임베딩 스토리지

MySQL용 Cloud SQL을 사용하여 테이블에 벡터 임베딩 열을 만들어서 벡터 임베딩을 저장할 수 있습니다. 특수 벡터 임베딩 열은 VARBINARY 데이터 유형에 매핑됩니다. 테이블의 다른 관계형 데이터와 마찬가지로 기존 트랜잭션 보장으로 테이블의 벡터 임베딩에 액세스할 수 있습니다. 벡터 임베딩 열이 있는 테이블은 정규 InnoDB 테이블이며 따라서 원자성, 일관성, 격리, 내구성(ACID) 속성과 호환됩니다. ACID 속성은 벡터 검색 색인을 조회할 때만 편차가 발생합니다.

테이블에 최대 1개의 벡터 임베딩 열을 만들고 테이블당 하나의 벡터 검색 색인을 만들 수 있습니다. 동일한 열에 저장된 각 벡터 임베딩은 열을 정의할 때 지정한 것과 크기가 정확히 동일해야 합니다. 벡터 임베딩의 크기 상한값은 16,000입니다. 사용 가능한 스토리지와 메모리가 충분하면 동일한 인스턴스에서 별개의 테이블을 사용해서 서로 다른 벡터 임베딩 열과 벡터 검색 색인을 포함할 수 있습니다.

테이블에 저장할 수 있는 벡터 임베딩 수에는 특별히 엄격한 제한이 없지만 벡터 검색 색인에는 메모리가 필요합니다. 따라서 테이블에 저장하는 벡터 임베딩 수를 1,000만 개 이하로 제한하는 것이 좋습니다.

복제는 다른 MySQL InnoDB 열과 마찬가지로 벡터 임베딩에 대해 동일하게 작동합니다.

Cloud SQL은 K-근접 이웃(KNN) 및 근사 최근접 이웃(ANN) 검색 쿼리를 모두 사용하여 유사성 검색을 지원합니다. Cloud SQL 인스턴스에서 두 가지 유형의 벡터 검색을 모두 사용할 수 있습니다. ANN 검색을 위한 벡터 검색 색인을 만들 수 있습니다.

Cloud SQL은 정확한 최근접 이웃 검색으로도 알려진 KNN 벡터 검색을 사용하는 쿼리를 지원합니다. KNN 벡터 검색 수행은 정확한 검색을 제공합니다. 벡터 검색 색인을 만들 필요 없이 KNN 검색을 수행할 수 있습니다. KNN 검색은 테이블 스캔 알고리즘 수행을 기반으로 합니다.

KNN 검색의 경우 Cloud SQL은 또한 다음과 같은 벡터 거리 검색 함수도 지원합니다.

  • 코사인
  • 내적
  • L2 제곱 거리

벡터 검색 거리 함수 사용에 대한 자세한 내용은 벡터 임베딩 거리 쿼리를 참조하세요.

Cloud SQL은 벡터 검색 색인을 생성하여 ANN 검색 생성 및 쿼리를 지원합니다. ANN 벡터 검색 색인을 사용하면 정확한 검색 대신 빠른 성능에 맞게 최적화할 수 있습니다. ANN 검색의 경우 Cloud SQL은 다음 색인 유형을 지원합니다.

  • BRUTE_FORCE: 행이 10,000개 미만인 기본 테이블의 기본 벡터 검색 색인 유형입니다. 이 유형은 원래 데이터 세트의 소규모 하위 집합 내에서 검색을 수행하는 데 가장 적합합니다. 색인에 사용되는 메모리는 데이터 세트 크기와 동일합니다. 이 색인 유형은 디스크에 저장되지 않습니다.
  • TREE_SQ: 행이 10,000개 이상인 기본 테이블의 기본 벡터 검색 색인 유형입니다. 이 유형은 최소 메모리 용량 또는 데이터 세트 크기 중 약 25%를 사용합니다. TREE_SQ 색인은 디스크에 저장됩니다.
  • TREE_AH: 비대칭 해싱 검색 유형 알고리즘을 제공하는 벡터 검색 색인 유형입니다. Cloud SQL에 구현된 대로 이 색인 유형은 메모리 사용량에 맞게 최적화되지 않았으며 저장되지 않습니다.

벡터 검색 색인 업데이트

MySQL용 Cloud SQL은 벡터 검색 색인을 실시간으로 업데이트합니다. 기본 테이블에서 데이터 조작 언어(DML) 작업을 수행하는 트랜잭션은 연관된 벡터 검색 색인에도 변경사항을 전파합니다. 벡터 검색 색인의 변경사항은 다른 모든 트랜잭션에 즉시 표시되며, 이는 READ_UNCOMMITTED 격리 수준을 의미합니다.

트랜잭션을 롤백하면 해당 롤백 변경사항이 벡터 검색 색인에도 표시됩니다.

벡터 검색 색인 복제

MySQL용 Cloud SQL은 모든 읽기 복제본에 벡터 검색 색인을 복제합니다. 복제 필터 및 연쇄 복제본에 대한 벡터 검색 색인 복제는 지원되지 않습니다.

벡터 임베딩 지원을 위한 인스턴스 구성

이 섹션에서는 벡터 임베딩의 스토리지, 색인 생성, 쿼리를 지원하도록 Cloud SQL 인스턴스를 구성하는 방법을 설명합니다.

Cloud SQL Enterprise 버전과 Cloud SQL Enterprise Plus 버전 모두 벡터 임베딩을 지원합니다.

시작하기 전에

  • 인스턴스가 MySQL용 Cloud SQL 버전 8.0.36.R20240401.03_00 이상을 실행해야 합니다.
  • 인스턴스의 총 벡터 임베딩 수에 따라 메모리를 할당할 수 있도록 인스턴스 디스크 공간 및 메모리가 충분해야 합니다.

벡터 임베딩 지원 사용 설정

벡터 임베딩 지원을 사용 설정하려면 MySQL 데이터베이스 플래그를 구성해야 합니다.

gcloud sql instances patch INSTANCE_NAME \
  --database-flags=FLAGS

INSTANCE_NAME을 벡터 임베딩 지원을 사용 설정하려는 인스턴스 이름으로 바꿉니다.

FLAGS에서 인스턴스서 다음 MySQL 플래그를 구성합니다.

  • cloudsql_vector: 벡터 임베딩 스토리지 및 검색 지원을 사용 설정하도록 이 플래그를 on으로 설정합니다. 인스턴스에서 새 벡터 임베딩 열 및 벡터 검색 색인을 만들 수 있습니다.
  • cloudsql_vector_max_mem_size: 선택사항입니다. 인스턴스에 있는 모든 벡터 검색 색인에 대해 최대 메모리 할당(바이트)을 지정합니다. 이 플래그를 지정하지 않는 경우 기본 메모리 할당은 최소 메모리 할당인 1GB입니다. 지정할 양을 계산하는 방법은 벡터 검색 색인의 메모리 할당 구성을 참조하세요.

    이 전용 메모리는 innodb_buffer_pool_size에 할당된 메모리에서 가져옵니다. 사용 가능한 버퍼 풀이 동일 용량만큼 감소됩니다. 이 플래그의 최대 허용 값은 총 innodb_buffer_pool_size50%입니다.

    innodb_buffer_pool_size의 50%보다 큰 값을 지정하면 Cloud SQL이 실제 값을 사용 가능한 크기의 50%로 줄이고 인스턴스에 대해 경고 메시지를 로깅합니다.

플래그를 구성한 후에는 명령어가 다음과 같을 수 있습니다.

gcloud sql instances patch my-instance \
  --database-flags=cloudsql_vector=on,cloudsql_vector_max_mem_size=4294967296

MySQL용 Cloud SQL에서 벡터 임베딩 지원을 구성하기 위한 플래그는 정적 플래그입니다. 플래그를 사용하여 인스턴스를 업데이트하면 구성 변경사항이 적용되도록 인스턴스가 자동으로 다시 시작됩니다.

MySQL에 대해 데이터베이스 플래그를 구성하는 방법은 데이터베이스 플래그 구성을 참조하세요.

벡터 임베딩 지원 중지

벡터 임베딩 지원을 중지하려면 cloudsql_vector 플래그를 off로 설정합니다.

예를 들면 다음과 같습니다.

gcloud sql instances patch INSTANCE_NAME \
  --database-flags=cloudsql_vector=off

INSTANCE_NAME을 벡터 임베딩 지원을 중지하려는 인스턴스 이름으로 바꿉니다.

cloudsql_vectoroff로 설정하면 새 벡터 임베딩 열 및 벡터 검색 색인이 생성되지 않도록 방지됩니다. 이 정적 플래그를 구성한 다음에는 구성 변경사항이 적용되도록 인스턴스가 자동으로 다시 시작됩니다.

인스턴스가 다시 시작된 후 MySQL용 Cloud SQL은 다음을 수행합니다.

  • 영구 디스크에서 모든 영구 TREE_SQ 벡터 검색 색인을 삭제합니다.
  • 빌드된 벡터 검색 색인에 대해 데이터 사전 테이블 항목을 보관합니다. 하지만 MySQL용 Cloud SQL은 색인을 다시 빌드하지 않으며 이러한 색인에 검색 쿼리를 수행하면 오류가 반환됩니다.
  • 계속해서 기본 테이블에 벡터 임베딩을 저장합니다. 벡터 임베딩은 액세스 가능한 상태로 유지됩니다.

나중에 인스턴스에 대해 cloudsql_vector 플래그를 다시 사용 설정하면 Cloud SQL이 색인 다시 빌드를 시도하고, 인스턴스는 데이터 사전 테이블의 항목을 기반으로 다시 시작됩니다.

벡터 검색 색인의 메모리 할당 구성

Cloud SQL은 벡터 검색 색인을 빌드하고 메모리에 유지합니다. TREE_SQ 색인 유형은 완전 종료 시에도 지속적으로 유지되며 인스턴스가 다시 시작된 후에 다시 로드됩니다. 런타임 중에는 모든 벡터 검색 색인이 메모리에 유지되어야 합니다.

모든 벡터 검색 색인을 메모리에 유지하는 데 사용할 수 있는 메모리가 Cloud SQL에 충분하도록 보장하기 위해 cloudsql_vector_max_mem_size 데이터베이스 플래그를 사용해서 Cloud SQL을 구성합니다. cloudsql_vector_max_mem_size는 벡터 검색 색인에 대해 Cloud SQL 인스턴스가 할당하는 메모리 양을 결정합니다. 플래그 값을 구성할 때 다음에 유의하세요.

  • 기본값 및 최솟값은 1GB입니다. 상한은 버퍼 풀 크기의 50%입니다.
  • 이 플래그를 설정한 다음에는 구성 변경사항이 적용되도록 인스턴스가 자동으로 다시 시작됩니다.
  • 인스턴스에 구성된 모든 메모리가 사용되었으면 벡터 검색 색인을 만들거나 수정할 수 없습니다.

인스턴스에서 벡터 검색 색인에 할당된 메모리를 업데이트하려면 cloudsql_vector_max_mem_size 플래그의 값을 변경합니다.

gcloud sql instances patch INSTANCE_NAME \
  --database-flags= cloudsql_vector_max_mem_size=NEW_MEMORY_VALUE

다음을 바꿉니다.

  • INSTANCE_NAME: 메모리 할당을 변경하는 인스턴스 이름입니다.
  • NEW_MEMORY_VALUE: 벡터 검색 색인의 업데이트된 메모리 할당(바이트)입니다.

이렇게 변경하면 변경사항이 적용되도록 인스턴스가 자동으로 다시 시작됩니다.

필요한 메모리 계산

색인에 필요한 메모리 양은 색인 유형, 벡터 임베딩 수, 임베딩 크기에 따라 달라집니다. 고려해야 할 두 가지 메모리 요구사항은 다음과 같습니다.

  • 빌드 시간 메모리: 색인 빌드 중 필요한 메모리
  • 색인 메모리: 색인 빌드 후 색인이 차지하는 메모리

특정 색인에서 메모리의 모든 벡터 임베딩을 읽기 위해 필요한 메모리는 해당 데이터 세트 크기입니다. 각 차원이 4바이트 메모리를 사용하는 float로 표현되는 경우 dataset_size를 다음과 같이 결정할 수 있습니다.

dataset_size = <num_embeddings> * (4 * <dimensions>)

예를 들어 각각 768개 차원이 있는 임베딩 수가 100만 개 있으면 dataset_size가 3GB입니다.

이전 예시를 기준으로 여러 다른 색인 유형의 메모리 요구사항은 다음과 같습니다.

색인 유형 빌드 시간 메모리 색인 메모리
TREE_SQ 4GB 1GB
TREE_AH 3.5GB 3.5GB
BRUTE_FORCE 3GB 3GB

TREE_SQ 벡터 검색 색인을 사용하는 경우 런타임 중 지속성을 위해 필요한 메모리도 고려해야 합니다. 구성에 있는 총 메모리 양에 대해 최대 활성 TREE_SQ 벡터 검색 색인에 사용되는 색인 메모리 양을 추가합니다.

벡터 임베딩이 저장되는 기본 테이블에 DML 작업이 수행될 때마다 벡터 검색 색인이 실시간으로 업데이트됩니다. 이러한 업데이트에 따라 색인 메모리 사용량이 변경되며, DML 작업에 따라 축소 또는 확장될 수 있습니다. 색인의 메모리 사용량은 information_schema.innodb_vector_indexes 테이블을 쿼리하여 모니터링할 수 있습니다. 벡터 검색 색인의 크기를 모니터링하는 방법은 벡터 검색 색인 모니터링을 참조하세요.

읽기 복제본 구성

인스턴스가 유지보수 버전 및 플래그 지원 기준을 충족하는 경우 Cloud SQL이 읽기 복제본에서 벡터 임베딩을 완전히 지원합니다.

벡터 임베딩 지원이 사용 설정된 기본 인스턴스에서 복제본을 만드는 경우 읽기 복제본이 기본 인스턴스에서 벡터 임베딩 지원 설정을 상속합니다. 기존 읽기 복제본 인스턴스에서 벡터 임베딩 지원을 개별적으로 사용 설정해야 합니다.

복제 지연 영향 측면에서 벡터 검색 색인을 만들고 유지보수하는 방법은 일반 MySQL 색인과 동일한 방식으로 수행됩니다.

벡터 검색 색인은 연쇄 복제본에서 지원되지 않습니다.

예시: 단순 ANN 벡터 검색 색인 및 쿼리

다음 예시 연습에서는 Cloud SQL에서 ANN 기반 벡터 검색 색인 및 쿼리를 만드는 단계를 보여줍니다.

  1. 벡터 임베딩을 생성합니다. 벡터 임베딩을 수동으로 만들거나 원하는 텍스트 임베딩 API를 사용할 수 있습니다. Vertex AI를 사용하는 예시는 행 데이터를 기반으로 벡터 임베딩 생성을 참조하세요.

  2. MySQL용 Cloud SQL에서 3개 차원이 있는 벡터 임베딩 열을 포함하는 테이블을 만듭니다.

    CREATE TABLE books (
    id   INTEGER PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(60),
    embedding VECTOR(3) USING VARBINARY
    );
    
  3. 열에 벡터 임베딩을 삽입합니다.

    INSERT INTO books VALUES (
    1,
    'book title',
     string_to_vector('[1,2,3]')
    );
    
  4. 변경사항을 커밋합니다.

    commit;
    
  5. 벡터 검색 색인을 만듭니다. TREE_SQ 또는 TREE_AH 색인을 만드는 경우 테이블에 행이 1,000개 이상 있어야 합니다.

    CALL mysql.create_vector_index('vectorIndex',
                                   'dbname.books',
                                   'embedding',
                                   'index_type=BRUTE_FORCE, distance_measure=L2_SQUARED'
                                   );
    
  6. 최근접 이웃을 가져옵니다.

    SELECT title FROM books
    WHERE
    NEAREST(embedding) TO (string_to_vector('[1,2,3]'));
    

행 데이터를 기반으로 벡터 임베딩 생성

Vertex AI 또는 OpenAI와 같은 텍스트 임베딩 API를 사용하여 지정된 행 데이터에 대해 벡터 임베딩을 생성할 수 있습니다. Cloud SQL 벡터 임베딩에는 모든 텍스트 임베딩 API를 사용할 수 있습니다. 하지만 쿼리 문자열 벡터 생성을 위해 동일한 텍스트 임베딩 API를 사용해야 합니다. 소스 데이터 및 쿼리 벡터화에 대해 서로 다른 API를 조합할 수 없습니다.

예를 들어 다음과 같이 Vertex AI에서 벡터 임베딩을 생성할 수 있습니다.

from vertexai.language_models import TextEmbeddingModel

def text_embedding() -> list:
    """Text embedding with a Large Language Model."""
    model = TextEmbeddingModel.from_pretrained("text-embedding-004")
    embeddings = model.get_embeddings(["What is life?"])
    for embedding in embeddings:
        vector = embedding.values
        print(f"Length of Embedding Vector: {len(vector)}")
    return vector

if __name__ == "__main__":
    text_embedding()

벡터 임베딩 저장

이 섹션에서는 Cloud SQL에서 벡터 임베딩을 저장하기 위한 예시 문을 제공합니다.

벡터 임베딩 열로 새 테이블 만들기

CREATE TABLE books (
  id INTEGER PRIMARY KEY AUTO_INCREMENT,
  title VARCHAR(60),
  embedding VECTOR(3) USING VARBINARY
  );

기존 테이블에 벡터 임베딩 열 추가

ALTER TABLE books
ADD COLUMN embedding
VECTOR(3) USING VARBINARY;

벡터 임베딩 삽입

INSERT INTO books (
  title,
  embedding
  ) VALUES (
    'book title',
    string_to_vector('[1,2,3]')
);

여러 벡터 임베딩 삽입

INSERT INTO books (
  title,
  embedding
  ) VALUES (
    'book title',
    string_to_vector('[1,2,3]')),
     ('book title', string_to_vector('[4,5,6]')
);

벡터 임베딩 삽입/업데이트(upsert)

INSERT INTO books (
  id,
  title,
  embedding
  ) VALUES (
    1,
    'book title',
     string_to_vector('[1,2,3]')
     )
ON DUPLICATE KEY UPDATE embedding = string_to_vector('[1,2,3]');

벡터 임베딩 업데이트

UPDATE books
SET embedding = string_to_vector('[1,2,3]')
WHERE id = 1;

벡터 임베딩 삭제

DELETE FROM books
WHERE embedding = string_to_vector('[1,2,3]');

벡터 검색 색인 작업

기본적으로 정확한 검색을 제공하는 정확한 최근접 이웃 검색을 수행할 수 있습니다. 또한 속도와 검색을 절충한 ANN 검색을 사용하도록 색인을 추가할 수 있습니다. 일반적인 색인과 달리 근사 색인을 추가하면 쿼리에 대해 다른 결과가 표시됩니다.

권장사항

이 섹션에서는 벡터 검색 색인 작업을 위한 권장사항을 제공합니다. 모든 워크로드가 서로 다르며 그에 따라 조정이 필요할 수 있습니다.

  • 벡터 검색 색인을 만들기 전에 테이블에 데이터를 로드해야 합니다. 기본 테이블에는 행이 최소 1,000개 이상 있어야 합니다. 이러한 요구사항은 TREE_SQTREE_AH 검색 색인 유형에만 적용됩니다. 사용 가능한 데이터 포인트가 더 있으면 색인 분할 및 학습 효율이 향상됩니다.
  • 색인의 메모리 사용량을 모니터링합니다. 인스턴스에 메모리가 부족하면 색인을 만들거나 빌드할 수 없습니다. 기존 색인에 대해 기준점에 도달한 후 Cloud SQL이 MySQL 오류 로그에 정기적으로 경고를 기록합니다. information_schema.innodb_vector_indexes 테이블에서 메모리 사용량을 볼 수 있습니다.
  • 기본 테이블에 주요 DML 변경이 수행된 경우 벡터 검색 색인을 다시 빌드합니다. 빌드 시간에 색인의 초기 크기 및 색인의 현재 크기를 가져오려면 information_schema.innodb_vector_indexes 테이블을 쿼리합니다.
  • 일반적으로 파티션 수를 내부적으로 계산하도록 두는 것이 좋습니다. 파티션 수를 지정하려는 사용 사례에서는 파티션당 데이터 포인트를 100개 이상으로 설정해야 합니다.

벡터 검색 색인 작업 중 읽기 전용 기본 테이블

세 가지 벡터 검색 색인 작업(만들기, 수정, 삭제) 기간 동안 기본 테이블은 읽기 전용 모드로 설정됩니다. 이러한 작업 중에는 기본 테이블에 대해 DML이 허용되지 않습니다.

지속성, 종료, 유지보수 영향

TREE_SQ 유형을 사용하는 벡터 검색 색인만 인스턴스에 대한 완전 종료 후 디스크에 저장됩니다. TREE_AHBRUTE_FORCE 유형을 사용하는 벡터 검색 색인은 메모리에만 유지됩니다.

인스턴스 완전 종료 후에는 인스턴스가 다시 시작될 때 Cloud SQL이 벡터 검색 색인을 다시 로드합니다. 하지만 비정상 종료 또는 불완전 종료 다음에는 Cloud SQL이 벡터 검색 색인을 다시 빌드해야 합니다. 예를 들어 인스턴스에 비정상 종료와 백업 및 복원에서 복구, PITR(point-in-time recovery) 또는 고가용성(HA) 장애 조치가 발생할 때마다 Cloud SQL가 벡터 검색 색인을 다시 빌드합니다. 이러한 이벤트가 발생하면 다음 작업이 수행됩니다.

  • 다시 빌드가 백그라운드에서 자동으로 수행됩니다.
  • 다시 빌드하는 동안 기본 테이블은 읽기 전용 모드입니다.
  • 자동 다시 빌드 시 특정 제한 시간 내에 테이블에 잠금을 설정하지 못하면 다시 빌드가 실패합니다. 대신 색인을 수동으로 다시 빌드해야 할 수 있습니다.

색인 다시 빌드에 필요한 시간에 따라 종료에 필요한 시간이 증가하고, 인스턴스에 필요한 유지보수 및 업데이트 시간도 증가할 수 있습니다.

벡터 검색 색인 만들기

벡터 검색 색인을 만드는 명령문에는 다음 구문이 사용됩니다.

CALL mysql.create_vector_index('INDEX_NAME',
                                'DB_NAME.TABLE_NAME',
                                'COLUMN_NAME',
                                'PARAMETERS'
                              );

예를 들면 다음과 같습니다.

CALL mysql.create_vector_index('vectorIndex',
                                'db.books',
                                'embedding',
                                'index_type=TREE_SQ, distance_measure=l2_squared'
                               );

지정한 색인 이름은 데이터베이스 내에서 고유해야 합니다.

벡터 검색 색인 매개변수

검색 색인 만들기(및 검색 색인 수정) 함수는 쉼표로 구분된 키-값 쌍으로 지정할 수 있는 여러 매개변수를 지원합니다. 모든 검색 색인 만들기 함수 매개변수는 선택사항입니다. 빈 문자열 또는 NULL을 지정할 경우 해당 색인에 대해 기본 매개변수 값이 구성됩니다.

  • distance_measure: 지원되는 값은 L2_SQUARED, COSINE, DOT_PRODUCT입니다. 기본값은 L2_SQUARED입니다.
  • num_neighbors: ANN 쿼리 중 기본적으로 반환할 이웃 수입니다. 또한 검색 쿼리를 수행할 때 이 매개변수를 재정의할 수 있습니다. 기본값은 10입니다.
  • index_type: 빌드할 색인 유형을 지정합니다. 유효한 값은 BRUTE_FORCE, TREE_SQ, TREE_AH입니다.

    • BRUTE_FORCE는 행 수가 10,000개 미만인 테이블의 기본값입니다.
    • TREE_SQ는 행 수가 10,000개 이상인 테이블의 기본값입니다.

    TREE_AH 또는 TREE_SQ 색인 유형을 지정하려면 기본 테이블 크기의 행 수가 1,000개보다 많아야 합니다.

  • num_parititions: 빌드할 K-평균 클러스터 수를 지정합니다. 이 매개변수는 index_type를 구성한 경우에만 허용됩니다. 이 옵션은 BRUTE_FORCE에 적용할 수 없습니다. TREE_SQ 또는 TREE_AH 색인 유형을 지정할 경우 기본 테이블 크기가 num_partitions * 100보다 크거나 같아야 합니다.

벡터 검색 색인 수정

CALL mysql.alter_vector_index('DB_NAME.INDEX_NAME', 'PARAMETERS');

alter_vector_index 함수는 명시적으로 벡터 검색 색인을 다시 빌드하기 위해 사용됩니다. 이 함수를 사용하려면 색인이 이미 있어야 합니다. 다음 사용 사례의 경우 색인을 다시 빌드해야 할 수 있습니다.

  • 다른 옵션으로 색인을 다시 빌드해야 할 수 있습니다. 예를 들어 다른 색인 유형 또는 다른 거리 측정을 사용해야 할 수 있습니다.
  • 기본 테이블에 주요 DML 변경이 수행되어 색인을 다시 빌드해야 할 수 있습니다. 예를 들어 기본 테이블의 현재 데이터를 기반으로 벡터 검색 색인을 보존해야 합니다.

색인을 다시 빌드하기 위한 모든 매개변수는 색인을 만드는 데 사용할 수 있는 것과 동일하며, 선택사항입니다. 색인을 다시 빌드할 때 빈 문자열 또는 NULL을 지정하는 경우 색인 생성 시 지정된 매개변수를 기반으로 색인이 다시 빌드됩니다. 색인 생성 시 매개변수를 제공하지 않으면 기본 매개변수 값이 사용됩니다.

기존 벡터 검색 색인은 수정 작업 중에 사용할 수 있습니다. 여전히 색인에 대해 검색 쿼리를 수행할 수 있습니다.

벡터 검색 색인 삭제

벡터 검색 색인이 있는 테이블에서는 DDL 작업을 수행할 수 없습니다. 테이블에서 DDL 작업을 수행하려면 먼저 벡터 검색 색인을 삭제해야 합니다.

CALL mysql.drop_vector_index('DB_NAME.INDEX_NAME');

벡터 임베딩 쿼리

이 섹션에서는 벡터 임베딩을 쿼리할 수 있는 여러 방법 예시를 보여줍니다.

벡터 임베딩 보기

SELECT vector_to_string(embedding) FROM books;

벡터 임베딩에 대한 정확한 이웃 검색 가져오기

SELECT id,cosine_distance(embedding,
   string_to_vector('[1,2,3]')) dist
FROM books
ORDER BY dist
LIMIT 10;

벡터 임베딩에 대한 근사 이웃 검색 가져오기

SELECT title FROM books
WHERE
NEAREST(embedding) TO (string_to_vector('[1,2,3]'), 'num_neighbors=10');

ANN 검색 수행은 2개 매개변수를 지원합니다. 둘 다 선택사항입니다.

  • num_partitions: ANN 벡터 검색을 프로빙할 파티션 수를 지정합니다. 파티션 수를 지정하지 않으면 테이블 크기, 벡터 검색 색인의 파티션 수, 기타 요소를 기반으로 생성된 값이 검색에 사용됩니다.
  • num_neighbors: 반환할 이웃 수를 지정합니다. 이 값은 벡터 검색 색인 생성 시간에 설정된 값을 재정의합니다.

벡터 임베딩 필터링

추가 열을 조건자로 사용해서 벡터 임베딩 쿼리 결과의 필터링을 미세 조정할 수 있습니다. 예를 들어 printyear 열을 추가하는 경우 특정 연도 값을 쿼리에 필터로 추가할 수 있습니다.

SELECT title FROM books
WHERE
NEAREST(embedding) TO (string_to_vector('[1,2,3]'))
AND printyear > 1991;

벡터 임베딩 거리 쿼리

이 섹션에서는 KNN 검색에 사용 가능한 벡터 거리 함수 예시를 보여줍니다.

코사인 거리 가져오기

SELECT cosine_distance(embedding, string_to_vector('[3,1,2]'))
AS distance FROM books WHERE id=10;

내적 거리 가져오기

SELECT dot_product(embedding, string_to_vector('[3,1,2]'))
AS distance FROM books WHERE id=10;

L2 제곱 거리 가져오기

SELECT l2_squared_distance(embedding, string_to_vector('[3,1,2]'))
AS distance FROM books WHERE id=10;

특정 거리 내 행 가져오기

SELECT * FROM books
WHERE l2_squared_distance(embedding, string_to_vector('[1,2,3]')) < 10;

ORDER BYLIMIT를 조합할 수 있습니다.

SELECT id, vector_to_string(embedding),
       l2_squared_distance(embedding, string_to_vector('[1,2,3]')) dist
FROM books ORDER BY dist LIMIT 10;

벡터 검색 색인 모니터링

인스턴스에서 모든 벡터 검색 색인에 대한 실시간 정보를 가져오려면 information_schema.innodb_vector_indexes 테이블을 사용합니다.

테이블을 보려면 다음 명령어를 실행합니다.

SELECT * FROM information_schema.innodb_vector_indexes;

샘플 출력은 다음과 같이 표시될 수 있습니다.

*************************** 1. row ***************************
       INDEX_NAME: test.t4_index
       TABLE_NAME: test.t4_bf
       INDEX_TYPE: BRUTE_FORCE
     DIST_MEASURE: SquaredL2Distance
           STATUS: Ready
            STATE: INDEX_READY_TO_USE
       PARTITIONS: 0
SEARCH_PARTITIONS: 0
     INITIAL_SIZE: 40000
     CURRENT_SIZE: 40000
          QUERIES: 0
        MUTATIONS: 0
     INDEX_MEMORY: 160000
   DATASET_MEMORY: 0

information_schema.innodb_vector_indexes 테이블에서 다음을 볼 수 있습니다.

  • 잠재적으로 생성될 수 있는 옵션. 즉, 쿼리에 대해 프로빙할 num_partitions 또는 파티션 수입니다.
  • STATESTATUS 열은 색인의 현재 상태를 알려줍니다. 빌드 단계 중 상태 열은 벡터 검색 색인의 빌드 단계 진행 상황을 나타냅니다.
  • INITIAL_SIZE 열은 색인 생성 중 테이블 크기를 제공합니다. 이 크기를 CURRENT_SIZE와 비교해서 기본 테이블에서 DML로 인해 생성 시점으로부터 색인이 변경된 정도를 파악할 수 있습니다.
  • QUERIESMUTATIONS 열은 색인 사용 상태에 대한 실시간 통계를 제공합니다.
  • INDEX_MEMORYDATASET_MEMORY 열은 색인의 메모리 소비 정보를 제공합니다. INDEX_MEMORY

    색인에서 소비된 메모리 양을 나타내고 DATASET_MEMORY는 빌드 시간 중 소비된 추가 메모리 양을 나타냅니다.

인스턴스에 생성된 검색 벡터 색인 목록을 확인하려면 mysql.vector_indexes 데이터 사전 테이블을 볼 수 있습니다.

테이블을 보려면 다음 명령어를 실행합니다.

SELECT * FROM mysql.vector_indexes;

샘플 출력:

*************************** 1. row ***************************
   index_name: test.index1
   table_name: test.t1
  column_name: j
index_options: index_type=BRUTE_FORCE, distance_measure=L2_SQUARED
       status: ACTIVE
  create_time: 2024-04-08 22:46:21
  update_time: 2024-04-08 22:46:21
1 row in set (0.00 sec)

제한사항

  1. 벡터 임베딩 열은 테이블당 하나만 있을 수 있습니다.
  2. 벡터 검색 색인은 테이블당 하나만 있을 수 있습니다.
  3. 벡터 임베딩에는 차원이 최대 16,000개까지 포함될 수 있습니다.
  4. 벡터 임베딩 열이 있는 테이블에서는 InnoDB 테이블 수준 파티셔닝이 지원되지 않습니다.
  5. 인스턴스가 비정상 종료로부터 다시 시작되는 경우 Cloud SQL이 벡터 검색 색인을 자동으로 다시 빌드합니다.
    1. 벡터 검색 색인을 다시 빌드할 때는 기본 테이블이 읽기 전용입니다.
    2. 지정된 시간 내에 Cloud SQL이 테이블에 잠금을 설정하지 못하면 색인에 대한 자동 다시 빌드가 실패할 수 있습니다.
    3. 색인에 대한 자동 다시 빌드가 실패하면 색인을 수동으로 다시 빌드해야 합니다.
  6. 벡터 임베딩 열을 추가하려면 테이블에 기본 키가 있어야 합니다. Cloud SQL은 BIT, BINARY, VARBINARY, JSON, BLOB, TEXT 유형 또는 공간 데이터 유형의 기본 키를 지원하지 않습니다. 복합 기본 키에는 이러한 유형이 포함될 수 없습니다.
  7. 벡터 검색 색인이 테이블에 있으면 DDL 작업이 허용되지 않습니다. 기본 테이블에서 DDL 작업을 수행하기 전에 벡터 검색 색인을 삭제해야 합니다.
  8. InnoDB 이외의 테이블 또는 임시 테이블에서는 벡터 임베딩이 지원되지 않습니다.
  9. 벡터 임베딩 열은 생성된 열일 수 없습니다.
  10. NEAREST..TO 조건자는 AND 또는 OR을 사용하여 다른 "스칼라" 조건자와 조합될 수 있습니다. 테이블의 스칼라 조건자는 벡터 조건자가 적용된 후에 평가됩니다.
  11. NEAREST..TO 조건자는 SELECT 문에서만 지원됩니다. 다른 DML 문은 NEAREST..TO를 지원하지 않습니다.
  12. 서브 쿼리는 NEAREST..TO에서 지원되지 않습니다. 벡터 검색 색인이 있으면 기본 테이블의 기본 키에 상수를 추가할 수 없습니다.
  13. 사전 필터링은 거리 함수를 통해서만 그리고 LIMIT와 함께 ORDER BY를 사용해서만 가능합니다.

    예를 들어 다음 테이블을 만든다고 가정해보세요.

    CREATE TABLE books
    (
    bookid          INT PRIMARY KEY,
    title           VARCHAR(1000),
    author          VARCHAR(100),
    printyear       int,
    country         VARCHAR(100),
    bvector         VECTOR(1536) USING VARBINARY
    //bvector is embedding vector of book's plot,genre,reviews etc
    );

    이 경우에는 사전 필터링을 위해 다음 쿼리를 사용할 수 있습니다.

    //select query to obtain books by specific author and having similar plot-genre-reviews
    SELECT bookid, title, author,l2_squared_distance(bvector, qvector) dist
    FROM books where author='cloudsql' ORDER BY dist LIMIT 10

    사후 필터링은 NEAREST..TO 및 거리 함수에서 지원됩니다.

문제 해결

비정상 종료 시 색인이 자동으로 다시 빌드됩니다. 다시 빌드가 진행될 때는 다음 두 가지 제한사항이 있습니다.

  1. 색인을 만드는 동안 기본 테이블이 읽기 전용 모드입니다.
  2. 색인을 다시 만드는 동안에는 기존 색인에 대한 ANN 쿼리가 실패합니다.

다음 단계