Realizando Busca de Similaridade de Vetores

Este tópico apresenta como usar o Milvus para pesquisar entidades.

No Milvus, a busca de similaridade de vetores calcula a distância entre o vetor de consulta e os vetores na coleção (usando uma medida de similaridade especificada) e retorna os resultados mais similares. Você pode executar buscas mistas especificando uma expressão booleana para filtrar campos escalares ou de chave primária.

O exemplo a seguir demonstra como realizar a busca de similaridade de vetores em um conjunto de dados contendo 2000 linhas de dados, incluindo ID do livro (chave primária), contagem de palavras (campo escalar) e sinopse do livro (campo de vetor), para simular a busca de livros específicos com base em suas descrições vetorizadas. O Milvus retornará os resultados mais similares com base no vetor de consulta e nos parâmetros de busca que você define.

Carregando a Coleção

Todas as operações de busca e consulta no Milvus são executadas na memória. Antes de realizar a busca de similaridade de vetores, carregue a coleção na memória.

from pymilvus import Collection
colecao = Collection("livro")      # Obtenha a coleção existente.
colecao.load()

Preparando os Parâmetros de Busca

Prepare os parâmetros correspondentes para o cenário de sua busca. O exemplo a seguir define os parâmetros que a busca usará para calcular a distância usando a distância euclidiana e recuperar vetores dos dez clusters mais próximos construídos pelo índice IVF_FLAT.

parametros_busca = {
    "tipo_metrica": "L2",
    "offset": 5,
    "ignorar_crescimento": False,
    "parametros": {"nprobe": 10}
}
Parâmetro Descrição
tipo_metrica O método usado para medir a distância entre vetores durante a busca. Deve ser o mesmo que o método especificado durante o processo de construção do índice. Consulte medidas de similaridade para mais informações.
offset O número de entidades a serem ignoradas durante a busca. A soma desse valor e do limite do método buscar deve ser menor que 16384. Por exemplo, se você deseja consultar os 9º e 10º vizinhos mais próximos do vetor de consulta, defina limite como 2 e offset como 8.
ignorar_crescimento Se deve ignorar segmentos em crescimento durante a busca de similaridade. O valor padrão é False, indicando que a busca inclui segmentos em crescimento.
parametros Parâmetros de busca específicos para o tipo de índice especificado. Consulte índice de vetor para mais informações. Opções possíveis incluem: - nprobe indica o número de unidades de clusterização a serem pesquisadas. Este parâmetro está disponível somente ao configurar tipo_indice para IVF_FLAT, IVF_SQ8 ou IVF_PQ. O valor deve ser menor que o valor nlist especificado durante o processo de construção do índice. - ef indica o intervalo de busca. Este parâmetro está disponível somente ao configurar tipo_indice para HNSW. O valor deve estar entre top_k e 32768. - raio indica o ângulo onde os vetores com menor similaridade estão localizados. - filtro_intervalo indica o filtro usado para filtrar valores de campo de vetor cuja similaridade com o vetor de consulta esteja dentro de um intervalo específico.

Realizando Pesquisa por Vetor

Use o Milvus para pesquisa por vetor. Para buscar em uma partição específica, especifique uma lista de nomes de partição.

O Milvus suporta a definição de um nível de consistência para pesquisas. O exemplo neste tópico define o nível de consistência como "Forte". Você também pode definir o nível de consistência como "Limitado", "Sessão" ou "Eventualmente". Para obter mais informações sobre os quatro níveis de consistência no Milvus, consulte Consistência.

results = collection.search(
    data=[[0.1, 0.2]], 
    anns_field="book_intro", 
    param=search_params,
    limit=10,
    expr=None,
    output_fields=['title'],
    consistency_level="Forte"
)

results[0].ids

results[0].distances

hit = results[0][0]
hit.entity.get('title')
Parâmetro Descrição
data Vetores usados para a pesquisa.
anns_field Nome do campo a ser pesquisado.
param Parâmetros de pesquisa específicos para o índice. Para mais informações, consulte Índice de Vetores.
limit Número de resultados a serem retornados. Esse valor, mais o offset em param, deve ser inferior a 16.384.
expr Expressão booleana para filtragem de propriedades. Para mais informações, consulte Regras de Expressão Booleana.
output_fields (opcional) Nomes dos campos a serem retornados. Os campos de vetorizadores não são atualmente suportados.
consistency_level (opcional) Nível de consistência para a pesquisa.

Verifique os valores de chave primária e as distâncias dos vetores mais similares.

results[0].ids
results[0].distances

Após a conclusão da pesquisa, libere a coleção carregada no Milvus para reduzir o consumo de memória.

collection.release()

Limitações

Recurso Limite Máximo
Comprimento do nome da coleção 255 caracteres
Número de partições em uma coleção 4.096
Número de campos em uma coleção 256
Número de shards em uma coleção 256
Dimensão do vetor 32.768
Top K 16.384
Vetores de entrada 16.384

Realizando Pesquisa Mista

A pesquisa mista é essencialmente uma pesquisa por vetor com filtragem de atributos. Ao especificar uma expressão booleana usada para filtrar campos escalares ou campos de chave primária, as pesquisas podem ser limitadas sob condições específicas.

O exemplo a seguir demonstra como realizar uma pesquisa mista baseada na regular pesquisa por vetor. Digamos que você queira pesquisar por determinados livros com base em resumos vetorizados, mas deseja pesquisar apenas dentro de uma faixa específica de contagem de palavras. Então, você pode especificar uma expressão booleana nos parâmetros de pesquisa para filtrar o campo word_count. O Milvus buscará apenas vetores similares dentro das entidades que correspondem à expressão.

Ao especificar uma expressão booleana, você pode filtrar os campos escalares de entidades durante a pesquisa por vetor. O exemplo a seguir limita o escopo da pesquisa para vetores dentro do intervalo de valor de word_count especificado.

Também é possível usar campos dinâmicos na expressão de filtragem e usar campos de saída na solicitação de pesquisa. Por exemplo, consulte o padrão dinâmico.

search_param = {
  "data": [[0.1, 0.2]],
  "anns_field": "book_intro",
  "param": {"metric_type": "L2", "params": {"nprobe": 10}, "offset": 0},
  "limit": 10,
  "expr": "word_count <= 11000",
}
res = collection.search(**search_param)

Verifique os resultados retornados.

assert len(res) == 1
hits = res[0]
assert len(hits) == 2
print(f"- Total de resultados: {len(hits)}, ids dos resultados: {hits.ids} ")
print(f"- Principal resultado id: {hits[0].id}, distância: {hits[0].distance}, pontuação: {hits[0].score} ")

Realizando Pesquisa de Intervalo

A pesquisa de intervalo é um método de filtragem de resultados de pesquisa com base na distância entre o vetor de consulta e os valores do campo de vetor. Diferentes métricas de distância podem ser usadas para medir a distância.

Ao realizar uma pesquisa de intervalo, o Milvus primeiro conduz a pesquisa de similaridade vetorial. Em seguida, ele executa a filtragem de vetor com base nas condições de distância especificadas e retorna os vetores cuja distância está dentro de uma faixa específica.

O exemplo a seguir demonstra como realizar uma pesquisa de intervalo com base na pesquisa regular por vetor.

Carregando a Coleção

Todas as operações de pesquisa e consulta no Milvus são executadas na memória. Antes de realizar a pesquisa de similaridade vetorial, a coleção precisa ser carregada na memória.

from pymilvus import Collection
collection = Collection("book")      # Obtenha uma coleção existente
collection.load()

Configurando Intervalos de Filtro de Vetores

Em comparação com a busca de vetor regular, a busca por intervalo no Milvus é controlada pela introdução de dois novos parâmetros, raio e filtro_de_intervalo, para obter os resultados da busca desejados dentro de um intervalo específico.

O raio especifica o ângulo mínimo no qual os vetores são considerados similares. Um filtro_de_intervalo opcional pode ser utilizado em conjunto com o raio para filtrar os valores do campo do vetor com base na similaridade com o vetor de consulta dentro de um intervalo específico. Ambos os parâmetros raio e filtro_de_intervalo têm um tipo de dado FLOAT. A configuração desses dois parâmetros equilibra efetivamente a precisão e eficiência da busca.

Tipicamente, a similaridade é medida pela distância entre o valor do campo do vetor e o vetor de consulta. A seleção de diferentes métricas de distância terá um impacto significativo na configuração do raio e filtro_de_intervalo.

Por exemplo, no caso da distância L2, os resultados da busca devem ser filtrados com base nos valores do campo do vetor com uma distância menor que raio. Isso ocorre porque na distância L2, distâncias menores indicam maior similaridade. Com esse conhecimento, se você deseja filtrar alguns dos vetores mais similares, pode especificar um valor efetivo de filtro_de_intervalo que seja menor que o raio.

parametros_de_busca = {
    "tipo_de_métrica": "L2",
    "parâmetros": {
        "raio": 10.0,
        "filtro_de_intervalo" : 5.0
    }
}

No caso da distância IP, o cenário é diferente. Com a distância IP, uma distância maior significa maior similaridade. Portanto, em contraste com a distância L2, os valores de raio e filtro_de_intervalo na distância IP são opostos. Em outras palavras, ao usar filtro_de_intervalo para filtrar alguns dos vetores mais similares com base na distância IP, o valor efetivo de filtro_de_intervalo deve ser maior que raio, e a distância dos vetores resultantes deve ser maior que raio mas menor ou igual a filtro_de_intervalo.

parametros_de_busca = {
    "tipo_de_métrica": "IP",
    "parâmetros": {
        "raio": 0.8,
        "filtro_de_intervalo" : 1.0
    }
}

Realizando Busca por Intervalo

Ao especificar raio e filtro_de_intervalo com base no tipo de medição de distância, você pode definir o intervalo dos vetores de resultados a serem retornados.

Realize a busca por intervalo em similaridade dentro do intervalo de 5.0 e 10.0 com base na distância L2:

parametro_de_busca = {
  "dados": [[0.1, 0.2]], # Vetor de consulta
  "campo_de_anúncios": "introdução_do_livro", # Campo a ser pesquisado
  "param": { "tipo_de_métrica": "L2", "parâmetros": { "nprobe": 10, "raio": 10.0, "filtro_de_intervalo" : 5.0 }, "deslocamento": 0 },
  "limite": 2,
  "campos_de_saída": ["int64", "float"]  # Campos a serem retornados
}

res = coleção.buscar(**parametro_de_busca)

Realize a busca por intervalo em similaridade dentro do intervalo de 1.0 e 0.8 com base na distância IP:

parametro_de_busca = {
  "dados": [[0.1, 0.2]], # Vetor de consulta
  "campo_de_anúncios": "introdução_do_livro", # Campo a ser pesquisado
  "param": {"tipo_de_métrica": "IP", "parâmetros": { "nprobe": 10, "raio": 0.8, "filtro_de_intervalo" : 1.0 }, "deslocamento": 0 },
  "limite": 2,
  "campos_de_saída": ["int64", "float"]  # Campos a serem retornados
}

res = coleção.buscar(**parametro_de_busca)

Resumo

No Milvus, a busca por intervalo pode retornar resultados de vetor que são similares dentro do intervalo de distância especificado. Essa funcionalidade é habilitada pela especificação de raio e filtro_de_intervalo nos parâmetros de busca. A tabela abaixo resume a configuração desses dois parâmetros para diferentes tipos de medição de distância.

Tipo de Medição de Distância Configuração
L2 e outras distâncias filtro_de_intervalo <= distância < raio
Distâncias do tipo IP e cosseno raio < distância <= filtro_de_intervalo