Milvus의 새로운 범위 검색으로 고급 추천 엔진을 활용하세요
소개
유사도 검색에서 개발자들은 특히 검색 결과의 품질과 다양성의 균형을 맞출 때 제한 사항과 관련해 도움이 필요한 경우가 많습니다. Milvus의 새로운 기능인 Range Search를 소개합니다. 이 게시물에서는 Range Search가 무엇인지, 기존 Top-K Search 대신 언제 사용해야 하는지 설명하고, 기술 아키텍처와 사용 가이드를 자세히 살펴봅니다.
Range Search란 무엇인가요?
Milvus의 Range Search는 검색 결과에서 벡터 유사도에 대한 세밀한 제어를 제공하여 관련 벡터에 대한 거리 범위를 지정할 수 있게 해줍니다. 이 기능은 추천 시스템에서 기존 KNN 검색의 한계를 해결합니다. 기존 방식에서는 결과가 기대에 비해 너무 유사하거나 너무 다양할 수 있습니다.
Top-K search 대신 range search를 선택해야 하는 경우는 언제인가요?
기존 KNN 검색에는 두 가지 근본적인 단점이 있습니다:
불균형한 추천: 너무 유사한 항목을 추천하여 추천 품질에 영향을 줄 수 있습니다. 예를 들어 스포츠 뉴스 애그리게이터는 사용자가 특정 축구 경기 관련 기사 하나를 읽었다는 이유만으로 같은 축구 경기에 대한 여러 기사를 추천하게 될 수 있습니다. 이는 다양한 콘텐츠를 밀어내어 추천이 반복적이고 덜 흥미롭게 느껴지게 할 수 있습니다.
시스템 제약: Top-K 매개변수는 최대 16,384로 제한되어 대규모 데이터 쿼리와 리소스 활용에 문제를 일으킵니다. 수백만 개의 제품 데이터셋을 쿼리하는 시나리오를 생각해 보세요. Top-K 제한이 16,384라는 것은 사용자에게 흥미로울 수 있는 수천 개의 관련 제품을 놓칠 수 있음을 의미하며, 동시에 시스템이 이 대용량 데이터를 처리하고 전송하려고 하면서 시스템 리소스에도 부담을 줍니다.
Range Search는 이러한 문제를 해결합니다. 벡터 유사도에 대한 거리 범위를 정의할 수 있게 하여 균형 잡힌 결과 집합을 제공합니다. radius 및 선택적 range_filter와 같은 매개변수를 추가하면 더 정교한 제어가 가능해져, 쿼리 후 필터링이 필요 없어집니다. 이러한 세밀한 제어 덕분에 Range Search는 검색 결과에 대한 정밀한 제어가 필요한 애플리케이션에 이상적입니다.
Range Search의 기술적 세부 사항
이제 Range Search가 무엇인지와 언제 사용하는지 살펴보았으니, 그 아키텍처와 알고리즘을 자세히 알아보겠습니다. 이 탐구는 그 강점, 한계, 그리고 서드파티 라이브러리와의 통합에 대한 중요한 인사이트를 제공합니다.
Range Search 흐름은 기존 Search 흐름을 기반으로 구축되어, 상위 수준에서 대부분의 데이터 경로를 재사용합니다. 아래는 검색 요청이 수신될 때 수행되는 단계의 개요입니다:
SDK가 검색 요청 처리: SDK는 radius 및 range_filter와 같은 매개변수가 포함된 사용자 검색 요청을 수신합니다.
Proxy가 SearchTask 생성: 검색 요청을 수신하면 proxy는 SearchTask를 생성하여 query node에 전달합니다.
Querynode에서 Segcore로: query node는 cgo 호출을 통해 Segcore의 Search 인터페이스를 호출합니다.
Segcore 파싱: Segcore는 search_param의 매개변수를 분석합니다. radius 매개변수가 있으면 knowhere::RangeSearch를 호출합니다.
Knowhere 및 서드파티 라이브러리: 그런 다음 Knowhere(Milvus 핵심 벡터 실행 엔진)는 인덱스 유형에 따라 해당 서드파티 라이브러리의 range_search 함수로 호출을 라우팅합니다.
지원하는 모든 서드파티 라이브러리 인덱스는 단방향 Range Search를 수행하도록 구성되어 있습니다. "단방향"이란 단일 'radius' 매개변수만 허용하고 해당 반경 내의 정렬되지 않은 모든 결과를 반환한다는 의미입니다. 아래 표는 다양한 인덱스 유형에 대한 Range Search 전략을 설명합니다.
| 인덱스 유형 | 검색 전략 |
|---|---|
| IDMAP / BIN_IDMAP | 브루트 포스 검색 |
| IVF_xxx / SCANN / BIN_IVF_xxx (업데이트됨) | 중심점에 가장 가까운 버킷부터 검색을 시작합니다. 다음 조건 중 하나가 충족되면 검색을 중지합니다: 1. 모든 버킷을 검색함 2. 버킷에서 조건을 충족하는 벡터를 찾지 못함 |
| HNSW (자체 개발) | 최상위 레이어에서 검색을 시작하여 대상에 가장 가까운 벡터를 식별한 다음, 다음 하위 레이어로 진행합니다. 최하위(1번째) 레이어에서 최근접 이웃에 도달할 때까지 레이어별로 이 과정을 계속합니다. 그 지점부터 이 최근접 이웃에서 시작하여 방문한 모든 지점과 그 외부 이웃이 원하는 범위를 벗어날 때까지 너비 우선 검색(BFS)을 수행합니다. |
| DISKANN | l_search = min_l_search로 시작합니다. 각 반복에서 l_search = 2 * l_search로 설정합니다. 다음 조건 중 하나가 충족되면 검색을 중지합니다: 1. 반복에서 반환된 결과 수가 l_search / 2보다 작음 2. l_search > max_l_search. |
HAMMING 및 JACCARD 메트릭 유형은 모두 이진 데이터 유형에 대한 범위 검색을 완전히 지원합니다. 그러나 SUBSTRUCTURE/SUPERSTRUCTURE 메트릭 유형은 의미 체계가 true/false 값 시스템을 기반으로 하므로 범위 검색과 호환되지 않습니다. float 유형 인덱스의 경우, L2, IP 및 COSINE 메트릭을 사용하는 인덱스는 범위 검색과 완전히 호환됩니다.
아래 표는 범위 검색과 호환되는 자세한 인덱스 및 메트릭 유형을 설명합니다.
| L2 | IP | COSINE | HAMMING | JACCARD | SUBSTRUCTURE | SUPERSTRUCTURE | |
|---|---|---|---|---|---|---|---|
| BIN_IDMAP | √ | √ | |||||
| BIN_IVF_FLAT | √ | √ | |||||
| IDMAP | √ | √ | √ | ||||
| IVF_FLAT | √ | √ | √ | ||||
| IVF_PQ | √ | √ | √ | ||||
| IVF_SQ8 | √ | √ | √ | ||||
| HNSW | √ | √ | √ | √ | √ | ||
| SCANN | √ | √ | √ | ||||
| DISKANN | √ | √ | √ |
Milvus에서 Range Search를 사용하는 방법
Milvus에서 Range Search를 사용하려면 검색 요청의 검색 매개변수를 수정해야 합니다. 다음은 샘플 Python 코드 스니펫을 포함한 단계별 가이드입니다.
전제 조건
Milvus가 설치되어 실행 중인지 확인하세요.
컬렉션을 생성하고 인덱싱했는지 확인하세요.
중요한 Range Search 매개변수
radius: 검색 요청이 범위 검색을 수행할지 일반 검색을 수행할지를 결정하는 필수 매개변수입니다.
range_filter: 선택적 매개변수입니다. 제공되면 결과에 대해 2차 필터링을 수행합니다. 지정하지 않으면 함수가 결과를 직접 반환합니다.
이 두 매개변수를 구성하면 다양한 애플리케이션 요구 사항에 맞게 Range Search 쿼리의 동작을 세밀하게 조정할 수 있습니다. 이를 염두에 두고, 시작하는 데 도움이 될 샘플 코드를 살펴보겠습니다.
default_index = {
"index_type": "HNSW",
"metric_type": "L2",
"params": {"M":48,"efConstruction":500}
}
collection.create_index("float_vector", default_index)
search_params = {
"metric_type": "L2",
"limit": TOPK,
"params": {"ef":32,"range_filter":1.0,"radius":2.0}
}
res = collection.search(vectors[:nq], "float_vector", search_params, limit)
메트릭 고려 사항
이제 Range Search를 사용하는 방법을 이해했으므로, 메트릭 유형이 쿼리에 미치는 영향을 고려하는 것이 중요합니다. 선택한 메트릭 유형에 따라 아래 표에서 제안한 대로 Radius를 확인해야 합니다.
| 메트릭 유형 | Radius | 유사함 | 유사하지 않음 |
|---|---|---|---|
| L2 | [0.0, inf] | 0.0 | inf |
| IP | [-inf, inf] | inf | -inf |
| COSINE | [-1.0, 1.0] | 1.0 | -1.0 |
| HAMMING | [0, n] | 0 | n |
| JACCARD | [0.0, 1.0] | 0.0 | 1.0 |
또한 range_filter는 다음 규칙을 따라야 합니다.
L2/Hamming/Jaccard의 경우, range_filter < radius
IP/Cosine의 경우, range_filter > radius
결론
Milvus의 Range Search는 추천 엔진에만 국한되지 않으며, 콘텐츠 매칭, 이상 탐지, NLP 검색 작업과 같은 영역에서 더 폭넓게 활용될 수 있습니다. radius 및 range_filter와 같은 매개변수를 활용하면 이러한 다양한 사용 사례에 맞게 쿼리를 정확하게 조정할 수 있습니다.
검색 요청을 직접 제어할 준비가 되셨나요? Range Search는 이제 Zilliz Cloud에서 공개 프리뷰로 사용할 수 있습니다. Zilliz Cloud 베타 버전으로 업그레이드하거나 Milvus 2.3.x 다운로드를 통해 직접 사용해 보세요. 여러분의 인사이트는 지속적인 개선의 핵심이므로, 문제가 발생하거나 제안 사항이 있다면 언제든지 들려주세요. 함께 Range Search를 더 좋게 만들어 봅시다.
계속 읽기

How to Choose the Best Embedding Model for RAG in 2026: 10 Models Benchmarked
We benchmarked 10 embedding models on cross-modal, cross-lingual, long-document, and dimension compression tasks. See which one fits your RAG pipeline.

Migrating from S3 Vectors to Zilliz Cloud: Unlocking the Power of Tiered Storage
Learn how Zilliz Cloud bridges cost and performance with tiered storage and enterprise-grade features, and how to migrate data from AWS S3 Vectors to Zilliz Cloud.

Bringing AI to Legal Tech: The Role of Vector Databases in Enhancing LLM Guardrails
Discover how vector databases enhance AI reliability in legal tech, ensuring accurate, compliant, and trustworthy AI-powered legal solutions.



