비트셋으로 벡터 유사도 검색의 다양성을 구현하는 방법
비트셋 표지 이미지
Milvus 2.0의 출시와 함께 벡터 데이터베이스의 다양한 필수 기능들이 새롭게 제공됩니다. 새로운 기능 중 시간 이동, 속성 필터링, 삭제 작업은 이 세 가지 기능이 하나의 공통 메커니즘인 비트셋으로 이루어지기 때문에 서로 연관성이 있습니다.
따라서 이 글에서는 Milvus에서 비트셋의 개념을 명확히 하고 삭제 작업, 시간 이동, 속성 필터링을 지원하기 위해 어떻게 작동하는지 세 가지 예를 통해 설명하고자 합니다.
비트셋이란 무엇인가요?
비트셋은 특정 데이터 정보를 표현하는 데 사용할 수 있는 비트 숫자("0"과 "1")의 배열입니다. 비트셋을 사용하면 특정 유형의 데이터를 정수, 부동 소수점 또는 문자로 저장하는 것과 달리 간결하고 효율적으로 저장할 수 있습니다. 비트셋은 부울 논리에서 작동하며, 출력 값이 유효하거나 유효하지 않은지 여부에 따라 각각 "1"과 "0"으로 표시됩니다. "1"은 유효를, "0"은 무효를 나타냅니다. 비트셋은 매우 효율적이고 저장 공간을 절약할 수 있으므로 속성 필터링, 삭제 작업, 시간 여행 등 다양한 기능을 구현하는 데 사용할 수 있습니다.
0.7.0 버전부터 Milvus에 비트셋 개념이 도입되어 삭제 기능을 사용할 수 있게 되었습니다. 보다 구체적으로, 비트셋은 세그먼트의 각 행이 삭제되었는지 여부를 표시하는 데 사용됩니다. 삭제된 엔티티는 해당 비트셋에 "1"로 표시되며, 결과적으로 삭제된 엔티티는 검색 또는 쿼리 중에 계산되지 않습니다.
Milvus 2.0 버전에서는 속성 필터링 및 시간 여행과 같은 더 많은 기능을 사용할 수 있도록 비트셋의 적용 범위가 확장되었습니다. 비트셋의 일반적인 원리는 동일하게 유지됩니다. 즉, 엔티티가 해당 비트셋에서 "1"로 표시되면 검색 또는 쿼리 중에 해당 엔티티는 무시됩니다. 비트셋은 Milvus에서 3가지 기능을 활성화하는 데 사용됩니다:
- 속성 필터링
- 데이터 삭제
- 시간 여행을 통한 쿼리
Milvus에서 비트셋은 어떻게 작동하나요?
아래 예시는 Milvus에서 비트셋이 어떻게 작동하는지 설명하기 위해 사용되었습니다.
전제 조건
8개의 엔티티가 있는 세그먼트가 있고 아래 그림에 표시된 순서대로 일련의 데이터 조작 언어(DML) 이벤트가 발생한다고 가정해 보겠습니다.
- 타임스탬프
ts
가 100일 때 각각primary_keys
가 [1, 2, 3, 4]인 엔티티 4개가 삽입됩니다. primary_keys
이 [5, 6, 7, 8]인 나머지 4개 엔티티는 타임스탬프ts
가 200일 때 삽입됩니다.primary_keys
이 [7, 8]인 엔티티는 타임스탬프ts
가 300일 때 삭제됩니다.primary_keys
이 [1, 3, 5, 7]인 엔티티만 속성 필터링 조건을 충족합니다.
DML 이벤트
사례 1
사용자가 time_travel
에 설정한 값이 150이라고 가정해 보겠습니다. 즉, 사용자는 ts
= 150일 때 Milvus에 저장된 데이터에 대한 쿼리를 수행합니다. 비트셋 생성 프로세스는 그림 1에 설명되어 있습니다.
초기 필터링 단계에서 filter_bitset
의 결과는 [1, 0, 1, 0, 1, 0, 1, 0, 1, 0]이므로 엔티티 [1, 3, 5, 7]은 유효한 필터링 결과이며 비트셋에 "1"로 표시되어야 합니다. 그러나 엔티티 [4, 5, 6, 7]은 ts
이 150일 때 벡터 데이터베이스에 삽입되지도 않았습니다. 따라서 이 네 개의 엔티티는 필터링 조건에 관계없이 "0"으로 표시되어야 합니다. 이제 비트셋 결과는 [1, 0, 1, 0, 0, 0, 0, 0, 0]이 되어야 합니다. Milvus에서 비트셋 계산의 일반적인 원칙은 비트셋에서 "1"로 표시된 엔티티는 검색 또는 쿼리 중에 무시되는 것이므로, 시간 여행 및 속성 필터링 후의 비트셋 결과를 삭제 비트맵과 결합하기 위해서는 비트셋 결과를 반전시켜야 합니다. filter_bitset
의 반전된 결과는 [0, 1, 0, 1, 1, 1, 1, 1, 1]이 되어야 합니다.
삭제 비트셋 del_bitset
의 경우 초기값은 [0, 0, 0, 0, 0, 0, 0, 1, 1]이어야 합니다. 그러나 엔티티 7과 8은 ts
이 300이 될 때까지 삭제되지 않습니다. 따라서 ts
이 150일 때 엔티티 7과 8은 여전히 유효합니다. 결과적으로 시간 여행 후 del_bitset
값은 [0, 0, 0, 0, 0, 0, 0, 0, 0]이 되어야 합니다.
이제 시간 여행과 속성 필터링 후에 두 개의 비트셋이 생겼습니다: filter_bitset
[0, 1, 0, 1, 1, 1, 1, 1, 1] 및 del_bitset
[0, 0, 0, 0, 0, 0, 0]. 이 두 비트셋을 "OR" 이진 논리 연산자와 결합합니다. result_bitset
의 최종 값은 [0, 1, 0, 1, 1, 1, 1, 1, 1]입니다. 즉, 다음 검색 또는 쿼리 단계에서는 엔티티 1과 3만 계산됩니다.
그림 1
사례 2
사용자가 time_travel
에 설정한 값이 250이라고 가정해 보겠습니다. 즉, 사용자는 ts
= 250일 때 Milvus에 저장된 데이터에 대해 쿼리를 수행합니다. 비트셋 생성 과정은 그림 2에 설명되어 있습니다.
사례 1과 마찬가지로 초기 속성 필터링 단계의 결과 filter_bitset
는 [1, 0, 1, 0, 1, 0, 0, 1, 0]이 되어야 합니다.
ts
= 250일 때 모든 엔티티 [1, 2, 3, 4, 5, 6, 7, 8]이 벡터 데이터베이스에 삽입됩니다. 따라서 filter_bitset
의 이전 결과는 동일하게 유지됩니다. 다시 filter_bitset
의 결과를 뒤집으면 [0, 1, 0, 1, 0, 1, 0, 1, 0, 1]이 됩니다.
삭제 비트셋 del_bitset
의 경우 초기값은 [0, 0, 0, 0, 0, 0, 0, 1, 1]이 되어야 합니다. 그러나 엔티티 7과 8은 ts
이 300이 될 때까지 삭제되지 않았습니다. 따라서 ts
이 250일 때 엔티티 7과 8은 여전히 유효합니다. 결과적으로 시간 여행 후 del_bitset
값은 [0, 0, 0, 0, 0, 0, 0, 0, 0]이 되어야 합니다.
이제 시간 여행과 속성 필터링 후에 두 개의 비트셋이 생겼습니다: filter_bitset
[0, 1, 0, 1, 0, 1, 0, 1] 및 del_bitset
[0, 0, 0, 0, 0, 0, 0]. 이 두 비트셋을 "OR" 이진 논리 연산자와 결합합니다. result_bitset
의 최종 값은 [0, 1, 0, 1, 0, 1, 0, 1, 0, 1]입니다. 즉, 다음 검색 또는 쿼리 단계에서는 [1, 3, 5, 7] 엔티티만 계산됩니다.
그림 2
사례 3
사용자가 time_travel
에 설정한 값이 350이라고 가정해 보겠습니다. 즉, 사용자는 ts
= 350일 때 Milvus에 저장된 데이터에 대한 쿼리를 수행합니다. 비트셋 생성 과정은 그림 3에 설명되어 있습니다.
사례 1, 2와 마찬가지로 초기 속성 필터링 단계의 결과 filter_bitset
는 [0, 1, 0, 1, 0, 1, 0, 0, 1]입니다.
ts
= 350일 때 모든 엔티티 [1, 2, 3, 4, 5, 6, 7, 8]이 벡터 데이터베이스에 삽입됩니다. 따라서 filter_bitset
의 최종 반전 결과는 [0, 1, 0, 1, 0, 1, 0, 0, 1]로 사례 2와 동일합니다.
삭제 비트셋 del_bitset
의 경우 ts
= 350일 때 엔티티 7과 8이 이미 삭제되었으므로 del_bitset
의 결과는 [0, 0, 0, 0, 0, 0, 1, 1]이 되어야 합니다.
이제 시간 여행과 속성 필터링 후 두 개의 비트셋이 생겼습니다: filter_bitset
[0, 1, 0, 1, 0, 1, 0, 1] 및 del_bitset
[0, 0, 0, 0, 0, 0, 1, 1]. 이 두 비트셋을 "OR" 이진 논리 연산자와 결합합니다. result_bitset
의 최종 값은 [0, 1, 0, 0, 1, 0, 1, 1, 1]입니다. 즉, 다음 검색 또는 쿼리 단계에서는 [1, 3, 5] 엔티티만 계산됩니다.
그림 3
다음 단계는 무엇인가요?
2.0의 새로운 기능 시리즈 블로그에서는 새로운 기능의 설계에 대해 설명하고자 합니다. 이 블로그 시리즈에서 자세히 읽어보세요!
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word