하이브리드 검색
Milvus 2.4부터 다중 벡터 지원과 하이브리드 검색 프레임워크가 도입되어 사용자가 여러 개의 벡터 필드(최대 10개)를 하나의 컬렉션으로 가져올 수 있게 되었습니다. 서로 다른 열에 있는 이러한 벡터는 서로 다른 임베딩 모델에서 비롯되거나 서로 다른 처리 방법을 거친 데이터의 다양한 측면을 나타냅니다. 하이브리드 검색의 결과는 상호 순위 융합(RRF) 및 가중치 점수 등의 순위 재조정 전략을 사용해 통합됩니다. 순위 재조정 전략에 대해 자세히 알아보려면 순위 재조정을 참조하세요.
이 기능은 사진, 음성, 지문 등과 같은 다양한 속성을 기반으로 벡터 라이브러리에서 가장 유사한 사람을 식별하는 등 포괄적인 검색 시나리오에서 특히 유용합니다.
이 튜토리얼에서는 그 방법을 배웁니다:
서로 다른 벡터 필드에서 유사도 검색을 위한 여러 개의
AnnSearchRequest
인스턴스 만들기;여러
AnnSearchRequest
인스턴스의 검색 결과를 결합하고 순위를 재조정하는 순위 재조정 전략을 구성합니다;하이브리드 검색을 수행하려면
hybrid_search()
메서드를 사용하여 하이브리드 검색을 수행합니다.
이 페이지의 코드 스니펫은 PyMilvus ORM 모듈을 사용하여 Milvus와 상호 작용합니다. 새로운 MilvusClient SDK가 포함된 코드 스니펫은 곧 제공될 예정입니다.
준비 사항
하이브리드 검색을 시작하기 전에 여러 벡터 필드가 있는 컬렉션이 있는지 확인하세요. 현재 Milvus는 컬렉션당 4개의 벡터 필드를 기본값으로 제공하며, proxy.maxVectorFieldNum 구성을 수정하여 최대 10개까지 확장할 수 있습니다.
아래는 filmVector
과 posterVector
라는 두 개의 벡터 필드가 있는 test_collection
이라는 컬렉션을 만들고 여기에 임의의 엔티티를 삽입하는 예제입니다.
from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataType
import random
# Connect to Milvus
connections.connect(
host="10.102.7.3", # Replace with your Milvus server IP
port="19530"
)
# Create schema
fields = [
FieldSchema(name="film_id", dtype=DataType.INT64, is_primary=True),
FieldSchema(name="filmVector", dtype=DataType.FLOAT_VECTOR, dim=5), # Vector field for film vectors
FieldSchema(name="posterVector", dtype=DataType.FLOAT_VECTOR, dim=5)] # Vector field for poster vectors
schema = CollectionSchema(fields=fields,enable_dynamic_field=False)
# Create collection
collection = Collection(name="test_collection", schema=schema)
# Create index for each vector field
index_params = {
"metric_type": "L2",
"index_type": "IVF_FLAT",
"params": {"nlist": 128},
}
collection.create_index("filmVector", index_params)
collection.create_index("posterVector", index_params)
# Generate random entities to insert
entities = []
for _ in range(1000):
# generate random values for each field in the schema
film_id = random.randint(1, 1000)
film_vector = [ random.random() for _ in range(5) ]
poster_vector = [ random.random() for _ in range(5) ]
# create a dictionary for each entity
entity = {
"film_id": film_id,
"filmVector": film_vector,
"posterVector": poster_vector
}
# add the entity to the list
entities.append(entity)
collection.insert(entities)
1단계: 여러 개의 AnnSearchRequest 인스턴스 만들기
하이브리드 검색은 hybrid_search()
API를 사용하여 한 번의 호출로 여러 개의 ANN 검색 요청을 수행합니다. 각 AnnSearchRequest
은 특정 벡터 필드에 대한 단일 검색 요청을 나타냅니다.
다음 예에서는 두 개의 벡터 필드에 대해 개별 유사도 검색을 수행하는 AnnSearchRequest
인스턴스 두 개를 만듭니다.
from pymilvus import AnnSearchRequest
# Create ANN search request 1 for filmVector
query_filmVector = [[0.8896863042430693, 0.370613100114602, 0.23779315077113428, 0.38227915951132996, 0.5997064603128835]]
search_param_1 = {
"data": query_filmVector, # Query vector
"anns_field": "filmVector", # Vector field name
"param": {
"metric_type": "L2", # This parameter value must be identical to the one used in the collection schema
"params": {"nprobe": 10}
},
"limit": 2 # Number of search results to return in this AnnSearchRequest
}
request_1 = AnnSearchRequest(**search_param_1)
# Create ANN search request 2 for posterVector
query_posterVector = [[0.02550758562349764, 0.006085637357292062, 0.5325251250159071, 0.7676432650114147, 0.5521074424751443]]
search_param_2 = {
"data": query_posterVector, # Query vector
"anns_field": "posterVector", # Vector field name
"param": {
"metric_type": "L2", # This parameter value must be identical to the one used in the collection schema
"params": {"nprobe": 10}
},
"limit": 2 # Number of search results to return in this AnnSearchRequest
}
request_2 = AnnSearchRequest(**search_param_2)
# Store these two requests as a list in `reqs`
reqs = [request_1, request_2]
매개변수
AnnSearchRequest
(객체)ANN 검색 요청을 나타내는 클래스입니다. 각 하이브리드 검색에는 한 번에 1개에서 1,024개의
ANNSearchRequest
개체가 포함될 수 있습니다.data
(목록)단일
AnnSearchRequest
에서 검색할 쿼리 벡터입니다. 현재 이 매개변수는 단일 쿼리 벡터만 포함된 목록(예:[[0.5791814851218929, 0.5792985702614121, 0.8480776460143558, 0.16098005945243, 0.2842979317256803]]
)을 허용합니다. 향후 이 매개변수는 여러 쿼리 벡터를 허용하도록 확장될 예정입니다.anns_field
(문자열)단일
AnnSearchRequest
에 사용할 벡터 필드의 이름입니다.param
(딕셔너리)단일
AnnSearchRequest
에 대한 검색 매개변수 딕셔너리입니다. 이러한 검색 매개변수는 단일 벡터 검색의 매개변수와 동일합니다. 자세한 내용은 검색 매개변수를 참조하세요.limit
(int)단일
ANNSearchRequest
에 포함할 검색 결과의 최대 개수입니다.이 매개변수는 개별
ANNSearchRequest
내에서 반환할 검색 결과의 수에만 영향을 미치며hybrid_search
호출에 대해 반환할 최종 결과는 결정하지 않습니다. 하이브리드 검색에서는 여러ANNSearchRequest
인스턴스의 결과를 결합하고 순위를 재조정하여 최종 결과를 결정합니다.
2단계: 재랭크 전략 구성하기
AnnSearchRequest
인스턴스를 만든 후 결과를 결합하고 순위를 재조정하는 재순위 전략을 구성합니다. 현재 WeightedRanker
과 RRFRanker
의 두 가지 옵션이 있습니다. 재랭크 전략에 대한 자세한 내용은 재랭크하기를 참조하세요.
가중 점수 사용
WeightedRanker
은 지정된 가중치로 각 벡터 필드 검색 결과에 중요성을 할당하는 데 사용됩니다. 일부 벡터 필드를 다른 필드보다 우선순위를 지정하면WeightedRanker(value1, value2, ..., valueN)
에서 이를 결합된 검색 결과에 반영할 수 있습니다.from pymilvus import WeightedRanker # Use WeightedRanker to combine results with specified weights # Assign weights of 0.8 to text search and 0.2 to image search rerank = WeightedRanker(0.8, 0.2)
WeightedRanker
을 사용할 때는 주의하세요:- 각 가중치 값은 0(가장 중요하지 않음)에서 1(가장 중요함)까지의 범위로 최종 집계 점수에 영향을 미칩니다.
WeightedRanker
에 제공된 가중치 값의 총 개수는 생성한AnnSearchRequest
인스턴스 수와 같아야 합니다.
상호 순위 융합(RFF) 사용
# Alternatively, use RRFRanker for reciprocal rank fusion reranking from pymilvus import RRFRanker rerank = RRFRanker()
3단계: 하이브리드 검색 수행
AnnSearchRequest
인스턴스와 순위 재조정 전략이 설정되면 hybrid_search()
방법을 사용하여 하이브리드 검색을 수행합니다.
# Before conducting hybrid search, load the collection into memory.
collection.load()
res = collection.hybrid_search(
reqs, # List of AnnSearchRequests created in step 1
rerank, # Reranking strategy specified in step 2
limit=2 # Number of final search results to return
)
print(res)
매개변수
reqs
(목록)검색 요청 목록으로, 각 요청은
ANNSearchRequest
객체입니다. 각 요청은 다른 벡터 필드와 다른 검색 매개변수 집합에 대응할 수 있습니다.rerank
(객체)하이브리드 검색에 사용할 재순위 전략입니다. 가능한 값:
WeightedRanker(value1, value2, ..., valueN)
및RRFRanker()
.재랭크 전략에 대한 자세한 내용은 재랭크하기를 참조하세요.
limit
(int)하이브리드 검색에서 반환할 최종 결과의 최대 개수입니다.
출력은 다음과 유사합니다:
["['id: 844, distance: 0.006047376897186041, entity: {}', 'id: 876, distance: 0.006422005593776703, entity: {}']"]
제한
일반적으로 각 컬렉션에는 기본적으로 최대 4개의 벡터 필드가 허용됩니다. 그러나
proxy.maxVectorFieldNum
구성을 조정하여 컬렉션의 최대 벡터 필드 수를 확장할 수 있는 옵션이 있으며, 컬렉션당 최대 10개의 벡터 필드로 제한됩니다. 자세한 내용은 프록시 관련 구성을 참조하세요.컬렉션에서 부분적으로 인덱싱되거나 로드된 벡터 필드는 오류가 발생합니다.
현재 하이브리드 검색의 각
AnnSearchRequest
에는 하나의 쿼리 벡터만 포함할 수 있습니다.
FAQ
하이브리드 검색은 어떤 시나리오에서 권장되나요?
하이브리드 검색은 높은 정확도가 요구되는 복잡한 상황, 특히 엔티티가 여러 개의 다양한 벡터로 표현될 수 있는 경우에 이상적입니다. 이는 문장과 같은 동일한 데이터가 서로 다른 임베딩 모델을 통해 처리되거나 개인의 이미지, 지문, 음성 등 복합적인 정보가 다양한 벡터 형식으로 변환되는 경우에 적용됩니다. 이러한 벡터에 가중치를 부여하면 그 영향력이 결합되어 기억력을 크게 향상시키고 검색 결과의 효율성을 높일 수 있습니다.
가중치 랭킹러는 서로 다른 벡터 필드 간의 거리를 어떻게 정규화하나요?
가중치 랭커는 각 필드에 할당된 가중치를 사용하여 벡터 필드 간의 거리를 정규화합니다. 가중치에 따라 각 벡터 필드의 중요도를 계산하여 가중치가 높은 필드의 우선순위를 지정합니다. 일관성을 보장하기 위해 ANN 검색 요청 전체에 동일한 메트릭 유형을 사용하는 것이 좋습니다. 이 방법을 사용하면 더 중요하다고 판단되는 벡터가 전체 순위에 더 큰 영향을 미치게 됩니다.
코히어 랭커나 BGE 랭커와 같은 대체 랭커를 사용할 수 있나요?
현재는 제공된 랭커만 지원됩니다. 향후 업데이트를 통해 추가 랭커를 포함할 계획이 진행 중입니다.
여러 개의 하이브리드 검색 작업을 동시에 수행할 수 있나요?
예, 여러 하이브리드 검색 연산의 동시 실행이 지원됩니다.
하이브리드 검색을 수행하기 위해 여러 AnnSearchRequest 객체에서 동일한 벡터 필드를 사용할 수 있나요?
예. 기술적으로 하이브리드 검색을 위해 여러 AnnSearchRequest 객체에서 동일한 벡터 필드를 사용할 수 있습니다. 하이브리드 검색을 위해 여러 개의 벡터 필드를 가질 필요는 없습니다.