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="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 인스턴스를 만든 후 결과를 결합하고 순위를 재조정하는 재순위 전략을 구성합니다. 현재 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 객체에서 동일한 벡터 필드를 사용할 수 있습니다. 하이브리드 검색을 위해 여러 개의 벡터 필드를 가질 필요는 없습니다.

번역DeepLogo

피드백

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