벡터 임베딩으로 검색 및 필터링

이 페이지에서는 벡터 임베딩을 쿼리하는 다양한 방법을 설명합니다. ANN 및 KNN 유사성 검색에 관한 개요는 벡터 검색을 참고하세요.

근사 최근접 이웃 (ANN) 검색

ANN 검색을 실행하려면 SELECTORDER BY 절에서 approx_distance 함수를 사용합니다. ANN 검색에는 LIMIT 절을 사용해야 합니다. SELECT 목록에 approx_distance를 배치하여 거리 값을 가져올 수도 있습니다.

ANN 쿼리에는 다음 문법을 사용합니다.

# Ordering by distance
SELECT title
FROM books
ORDER BY approx_distance(embedding, string_to_vector('[1,2,3]'), 'distance_measure=l2_squared')
LIMIT 4;

# Selecting the distance value
SELECT
  approx_distance(
    embedding_name,
    string_to_vector('[1,2,3]'),
    'distance_measure=cosine,num_leaves_to_search=3')
    dist
FROM table
ORDER BY dist
LIMIT limit_value;

approx_distance 함수는 다음 옵션을 사용합니다.

  • embedding: 기본 테이블의 벡터 임베딩 열 이름을 사용합니다.
  • string_to_vector 또는 vector_to_string: 벡터를 문자열로, 문자열을 벡터로 변환하여 벡터를 사람이 읽을 수 있도록 만듭니다.
  • distance_measure: 벡터 유사 검색에 사용할 거리 측정값을 지정합니다. 이 값은 색인을 만들 때 distance_measure 매개변수에 설정한 값과 일치해야 합니다. 이 매개변수는 필수항목입니다. 이 매개변수의 가능한 값은 다음과 같습니다.
    • COSINE
    • L2_SQUARED
    • DOT_PRODUCT
  • num_leaves_to_search: 선택사항입니다. ANN 벡터 유사성 검색을 위해 프로빙할 리프 수를 지정합니다. 리프 수를 지정하지 않으면 Cloud SQL은 테이블 크기, 벡터 색인의 리프 수, 기타 요소를 기반으로 생성된 값을 사용합니다. 이 값은 information_schema.innodb_vector_indexes에서 확인할 수 있습니다. 특정 워크로드의 검색 품질과 성능 간에 최적의 균형을 이루도록 num_leaves_to_search를 미세 조정하는 것이 좋습니다. 이 값을 늘리면 성능에 영향을 미치지만 재현율이 향상됩니다.

다음 예에서는 approx_distance를 사용하여 l2_squared 거리 측정값을 사용하여 가장 가까운 상위 K개 행을 찾고 거리순으로 결과를 정렬하는 방법을 보여줍니다.

# Ordering by distance
SELECT title
FROM books
ORDER BY approx_distance(embedding, string_to_vector('[1,2,3]'),
                         'distance_measure=l2_squared')
LIMIT 4;

# Selecting the distance value
SELECT
    approx_distance
        (embedding, string_to_vector('[1,2,3]'),
         'distance_measure=l2_squared') dist
FROM table
ORDER BY dist
LIMIT 4;

approx_distance 쿼리의 결과 필터링

approx_distance 함수를 벡터가 아닌 조건자로 쿼리 결과를 필터링하는 WHERE 조건과 함께 사용하여 후처리 필터링을 실행할 수 있습니다. approx_distance 함수는 필터를 적용하기 전에 평가되므로 반환되는 결과 수는 비결정론적입니다.

예를 들면 다음 쿼리의 경우 다음과 같습니다.

SELECT id FROM products WHERE price < 100
ORDER BY approx(embedding, @query_vector,'distance_measure=cosine')
LIMIT 11;

approx_distance 함수는 가격과 관계없이 쿼리 벡터의 최근접 이웃 11개를 반환합니다. 후 필터링에서 가격이 100보다 작은 제품이 선택됩니다. 모든 최근접 이웃의 가격이 100보다 낮을 수 있으므로 쿼리의 결과는 11개입니다. 또는 최근접 이웃 중 가격이 100보다 작은 항목이 없으면 반환되는 행이 0개입니다.

WHERE 조건의 필터가 매우 선택적일 것으로 예상되는 경우 정확한 검색 (KNN)이 충분한 수의 행을 반환하는 데 더 나은 옵션일 수 있습니다.

ANN 검색의 대체 상태 확인

ANN 검색이 KNN 검색으로 대체되는 경우도 있습니다. 여기에는 다음이 포함됩니다.

  • 기본 테이블에 벡터 색인이 없습니다.
  • 기본 테이블에 벡터 색인이 있지만 approx_distance 검색 옵션의 distance_measure 매개변수와 다른 거리 측정법을 사용합니다.
  • 벡터 색인이 손상되었거나 현재 트랜잭션에 표시되지 않습니다.
  • 지정된 LIMIT가 10,000보다 큽니다.
  • 지정된 LIMIT가 없는 경우
  • 현재 쿼리에는 동일한 기본 테이블에 대한 approx_distance 호출이 두 개 이상 포함되어 있습니다.
  • 옵티마이저는 KNN을 사용하는 것이 더 효율적이라고 계산합니다.

이러한 모든 경우 정확한 검색이 실행되었음을 나타내는 경고와 그 이유가 클라이언트로 푸시됩니다.

mysql 클라이언트에서 다음 명령어를 사용하여 대체 상태를 확인합니다.

SHOW global status LIKE '%cloudsql_vector_knn_fallback%';

ANN을 사용하려는데 KNN으로 대체되는 경우 쿼리 실행 속도가 느려질 수 있습니다. 대체로 전환되는 이유를 파악하고 ANN이 대신 사용되도록 변경할지 평가해야 합니다.

예: 벡터 색인 만들기 및 ANN 쿼리 실행

다음 예시 연습에서는 Cloud SQL에서 벡터 색인을 만들고 ANN 쿼리를 실행하는 단계를 보여줍니다.

  1. 벡터 임베딩을 생성합니다. 벡터 임베딩을 수동으로 만들거나 원하는 텍스트 임베딩 API를 사용할 수 있습니다. Vertex AI를 사용하는 예시는 행 데이터를 기반으로 벡터 임베딩 생성을 참고하세요.
  2. 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. L2_squared 함수를 사용하여 벡터 색인을 만들어 거리를 측정합니다.

    CREATE
      VECTOR INDEX vectorIndex
    ON dbname.books(embeddings)
    USING SCANN QUANTIZER = SQ8 DISTANCE_MEASURE = l2_squared;
    
  6. 다음 문법을 사용하여 검색 결과 4개로 LIMIT를 사용하여 ANN 검색을 실행합니다.

    SELECT title
    FROM books
    ORDER BY approx_distance(embedding, string_to_vector('[1,2,3]'), 'distance_measure=l2_squared')
    LIMIT 4;
    
    SELECT approx_distance(embedding, string_to_vector('[1,2,3]'), 'distance_measure=cosine') dist
    FROM books
    ORDER BY dist
    LIMIT 4;
    

K-최근접 이웃 (KNN) 검색

K-최근접 이웃 검색을 실행하려면 SELECT 문에 거리 측정 옵션과 벡터 변환 함수(string_to_vector 또는 vector_to_string)와 함께 vector_distance 함수를 사용합니다. 다음 구문을 사용하세요.

SELECT vector_distance(string_to_vector('[1,2,3]'),
                      string_to_vector('[1,2,3]'),
                      'Distance_Measure=dot_product');

값 [1,2,3] 을 데이터의 임베딩 값으로 바꿉니다.

다음 예에서는 이 쿼리를 cosine_distance 함수와 string_to_vector 벡터 변환 함수와 함께 사용하는 방법을 보여줍니다.

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

KNN 쿼리에서 코사인 거리 가져오기

Cloud SQL cosine_distance 함수를 사용하여 코사인을 사용하여 거리를 계산합니다.

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

KNN 쿼리에서 내적 거리 가져오기

Cloud SQL dot_product 함수를 사용하여 내적을 사용하여 거리를 계산합니다.

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

KNN 쿼리에서 L2 제곱 거리 가져오기

Cloud SQL l2_squared_distance 함수를 사용하여 L2 제곱을 사용하여 거리를 계산합니다.

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

다음 단계