milvus-logo
LFAI
홈페이지
  • 사용자 가이드

하이브리드 검색

Milvus 2.4부터 다중 벡터 지원과 하이브리드 검색 프레임워크가 도입되어 사용자가 여러 개의 벡터 필드(최대 10개)를 하나의 컬렉션으로 가져올 수 있게 되었습니다. 서로 다른 열에 있는 이러한 벡터는 서로 다른 임베딩 모델에서 비롯되거나 서로 다른 처리 방법을 거친 데이터의 다양한 측면을 나타냅니다. 하이브리드 검색의 결과는 상호 순위 융합(RRF) 및 가중치 점수 등의 순위 재조정 전략을 사용해 통합됩니다. 순위 재조정 전략에 대해 자세히 알아보려면 순위 재조정을 참조하세요.

이 기능은 사진, 음성, 지문 등과 같은 다양한 속성을 기반으로 벡터 라이브러리에서 가장 유사한 사람을 식별하는 등 포괄적인 검색 시나리오에서 특히 유용합니다.

이 튜토리얼에서는 그 방법을 배웁니다:

  • 서로 다른 벡터 필드에서 유사도 검색을 위한 여러 개의 AnnSearchRequest 인스턴스 만들기;

  • 여러 AnnSearchRequest 인스턴스의 검색 결과를 결합하고 순위를 재조정하는 순위 재조정 전략을 구성합니다;

  • 하이브리드 검색을 수행하려면 hybrid_search() 메서드를 사용하여 하이브리드 검색을 수행합니다.

이 페이지의 코드 스니펫은 PyMilvus ORM 모듈을 사용하여 Milvus와 상호 작용합니다. 새로운 MilvusClient SDK가 포함된 코드 스니펫은 곧 제공될 예정입니다.

준비 사항

하이브리드 검색을 시작하기 전에 여러 벡터 필드가 있는 컬렉션이 있는지 확인하세요. 현재 Milvus는 컬렉션당 4개의 벡터 필드를 기본값으로 제공하며, proxy.maxVectorFieldNum 구성을 수정하여 최대 10개까지 확장할 수 있습니다.

아래는 filmVectorposterVector 라는 두 개의 벡터 필드가 있는 test_collection 이라는 컬렉션을 만들고 여기에 임의의 엔티티를 삽입하는 예제입니다.

from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataType
import random

# Connect to Milvus
connections.connect(
    host="127.0.0.1", # 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 인스턴스를 만든 후 결과를 결합하고 순위를 재조정하는 재순위 전략을 구성합니다. 현재 WeightedRankerRRFRanker 의 두 가지 옵션이 있습니다. 재랭크 전략에 대한 자세한 내용은 재랭크하기를 참조하세요.

  • 가중 점수 사용

    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()
    

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 객체에서 동일한 벡터 필드를 사용할 수 있습니다. 하이브리드 검색을 위해 여러 개의 벡터 필드를 가질 필요는 없습니다.

번역DeepL

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
피드백

이 페이지가 도움이 되었나요?