이 페이지에서는 벡터 임베딩을 쿼리하는 다양한 방법을 설명합니다. ANN 및 KNN 유사성 검색에 관한 개요는 벡터 검색을 참고하세요.
근사 최근접 이웃 (ANN) 검색
ANN 검색을 실행하려면 SELECT
및 ORDER 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 쿼리를 실행하는 단계를 보여줍니다.
- 벡터 임베딩을 생성합니다. 벡터 임베딩을 수동으로 만들거나 원하는 텍스트 임베딩 API를 사용할 수 있습니다. Vertex AI를 사용하는 예시는 행 데이터를 기반으로 벡터 임베딩 생성을 참고하세요.
Cloud SQL에서 3개 차원이 있는 벡터 임베딩 열을 포함하는 테이블을 만듭니다.
CREATE TABLE books( id INTEGER PRIMARY KEY AUTO_INCREMENT, title VARCHAR(60), embedding VECTOR(3) USING VARBINARY);
열에 벡터 임베딩을 삽입합니다.
INSERT INTO books VALUES ((1, 'book title', string_to_vector('[1,2,3]')));
변경사항을 커밋합니다.
commit;
L2_squared
함수를 사용하여 벡터 색인을 만들어 거리를 측정합니다.CREATE VECTOR INDEX vectorIndex ON dbname.books(embeddings) USING SCANN QUANTIZER = SQ8 DISTANCE_MEASURE = l2_squared;
다음 문법을 사용하여 검색 결과 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;
다음 단계
- Cloud SQL의 벡터 검색에 관한 개요를 읽어보세요.
- 인스턴스에서 벡터 임베딩을 사용 설정 및 중지하는 방법을 알아보세요.
- 벡터 임베딩을 생성하는 방법을 알아봅니다.
- 벡터 색인을 만드는 방법 알아보기
- 벡터 임베딩에서 검색하는 방법을 알아보세요.