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 chamadahybrid_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 doANNSearchRequest
.
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 deAnnSearchRequest
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()
Etapa 3: Executar uma pesquisa híbrida
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)
eRRFRanker()
.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.