milvus-logo
LFAI
Home
  • Guia do utilizador

Pesquisa híbrida

Desde o Milvus 2.4, introduzimos o suporte multi-vetorial e uma estrutura de pesquisa híbrida, o que significa que os utilizadores podem trazer vários campos vectoriais (até 10) para uma única coleção. Estes vectores em diferentes colunas representam diversas facetas dos dados, provenientes de diferentes modelos de incorporação ou submetidos a métodos de processamento distintos. Os resultados das pesquisas híbridas são integrados usando estratégias de reranking, como o Reciprocal Rank Fusion (RRF) e o Weighted Scoring. Para saber mais sobre as estratégias de reranking, consulte Reranking.

Esta funcionalidade é particularmente útil em cenários de pesquisa abrangente, como a identificação da pessoa mais semelhante numa biblioteca de vectores com base em vários atributos, como imagens, voz, impressões digitais, etc.

Neste tutorial, você aprenderá como:

  • Criar várias instâncias de AnnSearchRequest para pesquisas de similaridade em diferentes campos vetoriais;

  • Configurar uma estratégia de classificação para combinar e classificar os resultados de pesquisa de várias instâncias de AnnSearchRequest;

  • Utilizar o método hybrid_search() para executar uma pesquisa híbrida.

Os trechos de código nesta página usam o módulo ORM do PyMilvus para interagir com o Milvus. Os trechos de código com o novo SDK MilvusClient estarão disponíveis em breve.

Preparativos

Antes de iniciar uma pesquisa híbrida, certifique-se de que tem uma coleção com vários campos vectoriais. Atualmente, o Milvus introduz uma predefinição de quatro campos vectoriais por coleção, que pode ser alargada até um máximo de dez modificando a configuração proxy.maxVectorFieldNum.

Abaixo está um exemplo de criação de uma coleção chamada test_collection com dois campos vectoriais, filmVector e posterVector, e a inserção de entidades aleatórias na mesma.

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)

Etapa 1: criar várias instâncias de AnnSearchRequest

Uma pesquisa híbrida usa a API hybrid_search() para executar várias solicitações de pesquisa ANN em uma única chamada. Cada AnnSearchRequest representa uma única solicitação de pesquisa em um campo vetorial específico.

O exemplo a seguir cria duas instâncias AnnSearchRequest para executar pesquisas de similaridade individuais em dois campos vetoriais.

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]

Parâmetros:

  • AnnSearchRequest (objeto)

    Uma classe que representa um pedido de pesquisa ANN. Cada pesquisa híbrida pode conter de 1 a 1.024 objectos ANNSearchRequest de cada vez.

  • data (lista)

    O vetor de consulta a pesquisar num único AnnSearchRequest. Atualmente, este parâmetro aceita uma lista que contém apenas um único vetor de pesquisa, por exemplo, [[0.5791814851218929, 0.5792985702614121, 0.8480776460143558, 0.16098005945243, 0.2842979317256803]]. No futuro, este parâmetro será expandido para aceitar múltiplos vectores de pesquisa.

  • anns_field (string)

    O nome do campo vetorial a utilizar num único AnnSearchRequest.

  • param (dict)

    Um dicionário de parâmetros de pesquisa para um único AnnSearchRequest. Estes parâmetros de pesquisa são idênticos aos de uma pesquisa de vetor único. Para mais informações, consulte Parâmetros de pesquisa.

  • limit (int)

    O número máximo de resultados de pesquisa a incluir numa única ANNSearchRequest.

    Este parâmetro afecta apenas o número de resultados de pesquisa a devolver num ANNSearchRequest individual e não decide os resultados finais a devolver para uma chamada hybrid_search. Em uma pesquisa híbrida, os resultados finais são determinados pela combinação e classificação dos resultados de várias instâncias do ANNSearchRequest.

Etapa 2: Configurar uma estratégia de ranqueamento

Depois de criar instâncias de AnnSearchRequest, configure uma estratégia de reclassificação para combinar e reclassificar os resultados. Atualmente, há duas opções: WeightedRanker e RRFRanker. Para obter mais informações sobre estratégias de ranqueamento, consulte Ranqueamento.

  • Usar pontuação ponderada

    O WeightedRanker é usado para atribuir importância aos resultados de cada pesquisa de campo vetorial com pesos especificados. Se der prioridade a alguns campos vectoriais em detrimento de outros, WeightedRanker(value1, value2, ..., valueN) pode refletir isso nos resultados de pesquisa combinados.

    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)  
    

    Ao usar WeightedRanker, observe que:

    • Cada valor de peso varia de 0 (menos importante) a 1 (mais importante), influenciando a pontuação agregada final.
    • O número total de valores de ponderação fornecidos em WeightedRanker deve ser igual ao número de instâncias de AnnSearchRequest que criou.
  • Use a Fusão de classificação recíproca (RFF)

    # Alternatively, use RRFRanker for reciprocal rank fusion reranking
    from pymilvus import RRFRanker
    
    rerank = RRFRanker()
    

Com as instâncias AnnSearchRequest e a estratégia de reranking definidas, use o método hybrid_search() para executar a pesquisa híbrida.

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

Parâmetros:

  • reqs (lista)

    Uma lista de pedidos de pesquisa, em que cada pedido é um objeto ANNSearchRequest. Cada pedido pode corresponder a um campo vetorial diferente e a um conjunto diferente de parâmetros de pesquisa.

  • rerank (objeto)

    A estratégia de reordenação a utilizar para a pesquisa híbrida. Valores possíveis: WeightedRanker(value1, value2, ..., valueN) e RRFRanker().

    Para mais informações sobre estratégias de classificação, consulte Classificação.

  • limit (int)

    O número máximo de resultados finais a devolver na pesquisa híbrida.

A saída é semelhante à seguinte:

["['id: 844, distance: 0.006047376897186041, entity: {}', 'id: 876, distance: 0.006422005593776703, entity: {}']"]

Limites

  • Normalmente, cada coleção tem uma permissão predefinida de até 4 campos vectoriais. No entanto, você tem a opção de ajustar a configuração proxy.maxVectorFieldNum para expandir o número máximo de campos vetoriais em uma coleção, com um limite máximo de 10 campos vetoriais por coleção. Consulte Configurações relacionadas a proxy para saber mais.

  • Campos vetoriais parcialmente indexados ou carregados em uma coleção resultarão em um erro.

  • Atualmente, cada AnnSearchRequest numa pesquisa híbrida pode transportar apenas um vetor de consulta.

PERGUNTAS FREQUENTES

  • Em que cenário a pesquisa híbrida é recomendada?

    A pesquisa híbrida é ideal para situações complexas que exigem uma elevada precisão, especialmente quando uma entidade pode ser representada por vários vectores diferentes. Isto aplica-se a casos em que os mesmos dados, como uma frase, são processados através de diferentes modelos de incorporação ou quando a informação multimodal (como imagens, impressões digitais e impressões de voz de um indivíduo) é convertida em vários formatos vectoriais. Ao atribuir pesos a estes vectores, a sua influência combinada pode enriquecer significativamente a recuperação e melhorar a eficácia dos resultados da pesquisa.

  • Como é que um classificador ponderado normaliza as distâncias entre diferentes campos vectoriais?

    Um classificador ponderado normaliza as distâncias entre campos vectoriais utilizando pesos atribuídos a cada campo. Calcula a importância de cada campo vetorial de acordo com o seu peso, dando prioridade aos que têm pesos mais elevados. É aconselhável utilizar o mesmo tipo de métrica nos pedidos de pesquisa ANN para garantir a consistência. Este método garante que os vectores considerados mais significativos têm uma maior influência na classificação geral.

  • É possível utilizar classificadores alternativos como o Cohere Ranker ou o BGE Ranker?

    Atualmente, apenas são suportados os classificadores fornecidos. Estão em curso planos para incluir classificadores adicionais em futuras actualizações.

  • É possível efetuar várias operações de pesquisa híbrida ao mesmo tempo?

    Sim, é suportada a execução simultânea de várias operações de pesquisa híbrida.

  • Posso utilizar o mesmo campo vetorial em vários objectos AnnSearchRequest para efetuar pesquisas híbridas?

    Tecnicamente, é possível utilizar o mesmo campo de vetor em vários objectos AnnSearchRequest para pesquisas híbridas. Não é necessário ter vários campos de vetor para uma pesquisa híbrida.

Traduzido porDeepL

Try Managed Milvus for Free

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

Get Started
Feedback

Esta página foi útil?