이 게시물은 Couchbase의 복합 벡터 인덱싱을 살펴보는 여러 부분으로 구성된 시리즈 중 세 번째 파트입니다. 이전 포스팅을 놓치셨다면 다음 포스팅도 놓치지 마세요. 1부 그리고 파트 2.
이 시리즈에서 다룰 내용입니다:
- 개념, 용어, 개발자의 동기 부여 등 복합 벡터 인덱스가 중요한 이유에 대해 알아보세요. 스마트 식료품 추천 시스템을 실행 예제로 사용합니다.
- 카우치베이스 인덱싱 서비스 내에서 복합 벡터 인덱스가 구현되는 방식입니다.
- 복합 벡터 쿼리에서 ORDER BY 푸시다운이 작동하는 방식입니다.
- 실제 성능 동작 및 벤치마킹 결과.
푸시다운 기준 주문 - 복합 벡터 인덱스
음식 또는 식료품 앱의 기능을 상상해 보겠습니다:
“누텔라 같은 맛의 초콜릿 스프레드를 추천하며, 고단백질, 저당질 순으로 영양 성분이 높은 순으로 추천합니다.”
이는 단순한 필터링 그 이상입니다.
결합이 필요합니다:
- 의미적 유사성(맛/질감)
- 영양 필터링(당분 및 단백질)
- 맞춤형 주문 전략
해당 SQL++ 쿼리는 다음과 같습니다:
|
1 2 3 4 5 6 7 |
SELECT product_name FROM food WHERE sugars_100g < 20 AND proteins_100g > 10 ORDER BY APPROX_VECTOR_DISTANCE(text_vector, [query_embedding], 'L2'), proteins_100g DESC, sugars_100g ASC LIMIT 10; |
이 단일 쿼리는 우리가 원하는 모든 것을 표현합니다:
- 더 건강한 초콜릿 스프레드
- 누텔라에 가장 가까운 맛의 의미
- 고단백질 선호
- 다음 설탕 줄이기
- 사용자에게 상위 10개만 표시
이제 Couchbase가 이를 매우 효율적으로 실행하는 방법에 대해 자세히 알아보겠습니다.
- 스칼라 필터가 푸시 다운됨
- 스칼라 술어는 복합 벡터 인덱스를 사용하여 인라인으로 평가됩니다.
sugars_100g < 20단백질_100g > 10
approx_vector_distance(...)Couchbase의 ANN(가장 가까운 이웃) 스캔 파이프라인을 활성화합니다.- 벡터 인덱스는 쿼리 임베딩에 가장 가까운 임베딩(이 예에서는 누텔라)을 가진 항목을 찾습니다.
- 내부 작업에 대해서는 이 블로그 시리즈의 2부를 참조하세요.
- 스칼라 술어는 복합 벡터 인덱스를 사용하여 인라인으로 평가됩니다.
- 푸시다운으로 제한 및 주문하기
- 바로 이 지점에서 Couchbase의 효율성이 탁월해집니다.
- 쿼리에 다음이 포함된 경우:
LIMIT
- 카우치베이스는 두 가지를 모두 푸시할 수 있습니다.
LIMIT그리고주문 기준를 인덱스 서비스에 추가합니다. - 이렇게 하면 대량의 중간 결과 집합을 쿼리 서비스로 보내지 않아도 됩니다.
스칼라 및 ANN을 사용한 푸시다운 기준 주문의 작동 방식은 다음과 같습니다.
- 인덱서가 연결된 정렬 키를 빌드합니다.
- 복합 벡터 인덱스 스캔을 수행하는 동안 인덱서는 각 후보 항목에 대한 복합 정렬 키를 구성합니다.
- 연결된 복합 정렬 키는 다음으로 구성됩니다:
- 벡터 키 대신 ANN 거리
- 스칼라
주문 기준필드에 정확한주문 기준시퀀스:단백질_100g (DESC)- 내림차순을 위해 음수 또는 인코딩됨
sugars_100g(ASC)
- 이렇게 하면 사전적으로 비슷한 키가 생성됩니다:
(거리, -단백질_100g, 당류_100g)
- 벡터 필드를 교체하는 이유는 무엇인가요?
- 주문의 경우 거리가 벡터 자체가 아니라 관심 있는 실제 스칼라 값이 되기 때문입니다.
- 이렇게 하면 인덱서가 후보를 정렬할 수 있습니다.
- 인덱서는 상위 K 항목만 유지 관리
- 인덱서가 ANN 후보를 스캔할 때, K 크기의 우선순위 힙을 유지합니다(
K = 제한). - 각 후보는 연결된 키를 사용하여 평가됩니다.
- 힙이 크기 K를 초과하면 가장 나쁜 항목이 퇴거됩니다.
- 마지막에는 상단
LIMIT항목이 남아 있습니다.
- 인덱서가 ANN 후보를 스캔할 때, K 크기의 우선순위 힙을 유지합니다(
즉,
- 대규모 결과 세트가 생성되지 않습니다.
- 쿼리 노드에서 전체 정렬이 수행되지 않습니다.
- ANN + 스칼라 랭킹 + LIMIT가 모두 한 곳에서 이루어집니다.
- 인덱서는 상위 10개 항목만 쿼리 서비스로 스트리밍합니다.
결과가 쿼리 노드에 도달할 때쯤이면 이미 쿼리가 완료된 상태입니다:
- 필터링됨
- 의미론적 순서
- 스칼라 주문
- 제한으로 잘라내기
쿼리 노드에는 할 일이 거의 남아 있지 않습니다.
이것은 하이브리드 시맨틱 + 스칼라 랭킹을 위한 Couchbase에서 가능한 가장 빠른 실행 경로입니다.
스칼라와 벡터를 주문 기준으로 혼합하는 유연성
- 카우치베이스의 종합 벡터 인덱스의 가장 강력한 측면 중 하나는 개발자가 단일 순위 전략에 얽매이지 않는다는 점입니다.
- “벡터 거리로만” 정렬하도록 강제하는 많은 벡터 데이터베이스와 달리, Couchbase에서는 단일 ORDER BY 절 내에서 스칼라 필드와 벡터 유사성 측정값을 자유롭게 혼합, 재정렬, 순열할 수 있습니다.
다음은 누텔라 같은 음식 검색에 대한 네 가지 의미 있는 주문 순열입니다.
- 시맨틱 우선(맛 유사성 우위)
- 사용 사례: “누텔라 같은” 맛이 순위를 지배하기를 원합니다.
|
1 2 3 4 |
ORDER BY APPROX_VECTOR_DISTANCE(...), proteins_100g DESC, sugars_100g ASC LIMIT 10; |
- 단백질 우선(건강한 선택이 우선)
- 사용 사례: 영양이 맛보다 우선시되는 피트니스 중심 애플리케이션에 적합합니다.
|
1 2 3 4 |
ORDER BY proteins_100g DESC, APPROX_VECTOR_DISTANCE(...), sugars_100g ASC LIMIT 10; |
-
-
- 사용 사례: 당뇨병 환자에게 적합한 검색 또는 당분 저감 식단.설탕 우선(사용자가 다른 무엇보다도 낮은 설탕을 원함)
-
|
1 2 3 4 |
ORDER BY sugars_100g ASC, proteins_100g DESC, APPROX_VECTOR_DISTANCE(...) LIMIT 10; |
-
- 복잡한 하이브리드 순위
- 사용 사례: 시맨틱 폴백 및 동점자를 사용한 상태 우선 검색.
- 복잡한 하이브리드 순위
|
1 2 3 4 5 |
ORDER BY calories_100g ASC, APPROX_VECTOR_DISTANCE(...), proteins_100g DESC, sugars_100g ASC LIMIT 10; |
개발자를 위한 마지막 팁
-
-
- 카우치베이스는 ANN 유사도, 스칼라 필터링, 사용자 지정 ORDER BY, LIMIT 푸시다운을 복합 벡터 인덱스 내부에서 직접 결합합니다.
- 이를 통해 빠르고 우아한 단일 SQL++ 쿼리를 사용하여 영양에 최적화된 누텔라 맛 추천과 같은 실제 지능형 검색 기능을 구축할 수 있습니다.
- 카우치베이스는 단순히 인덱스에 벡터만 저장하는 것이 아닙니다. 벡터를 효율적으로 쿼리하고 대규모로 구조화된 데이터와 결합할 수 있습니다.
-