Desbloqueie mecanismos de recomendação avançados com a nova busca por intervalo do Milvus
Introdução
Na busca por similaridade, os desenvolvedores frequentemente precisam de ajuda com limitações, especialmente ao equilibrar a qualidade e a diversidade dos resultados de busca. Conheça o novo recurso do Milvus: Range Search. Este post descreverá o que é Range Search, quando usá-lo em vez da Top-K Search tradicional, e se aprofundará em sua arquitetura técnica e guia de uso.
O que é Range Search?
Range Search no Milvus oferece controle granular sobre a similaridade vetorial nos resultados de busca, permitindo que você especifique um intervalo de distância para vetores relevantes. Esse recurso aborda as limitações das buscas KNN tradicionais em sistemas de recomendação, onde os resultados podem ser muito semelhantes ou muito diversos em comparação com suas expectativas.
Quando escolher range search em vez de Top-K search?
A busca KNN tradicional tem duas deficiências fundamentais:
Recomendações Desequilibradas: Ela pode recomendar itens que são semelhantes demais, afetando a qualidade da recomendação. Por exemplo, um agregador de notícias esportivas pode acabar recomendando vários artigos sobre o mesmo jogo de futebol a um usuário, simplesmente porque ele leu um artigo sobre o jogo. Isso poderia excluir conteúdos diversos, fazendo com que as recomendações pareçam repetitivas e menos envolventes.
Restrições do Sistema: O parâmetro Top-K atinge o máximo em 16.384, causando problemas para consultas de dados em larga escala e utilização de recursos. Considere um cenário em que você está consultando um conjunto de dados com milhões de produtos. O limite de Top-K de 16.384 significa que você pode deixar de encontrar milhares de produtos relevantes que poderiam ser de interesse para o usuário, ao mesmo tempo em que sobrecarrega os recursos do sistema enquanto ele tenta processar e transmitir esse grande volume de dados.
Range Search resolve esses problemas. Ela permite um conjunto equilibrado de resultados ao possibilitar que você defina um intervalo de distância para a similaridade vetorial. Adicionar parâmetros como radius e o range_filter opcional oferece um controle mais refinado, eliminando a necessidade de filtragem pós-consulta. Esse controle refinado torna Range Search ideal para aplicações que exigem controle preciso sobre os resultados de busca.
Detalhes técnicos por trás da Range Search
Agora que exploramos o que é Range Search e quando usá-la, vamos mergulhar em sua arquitetura e algoritmos. Esta exploração fornecerá insights essenciais sobre seus pontos fortes, limitações e integração com bibliotecas de terceiros.
O fluxo de Range Search é construído sobre o fluxo de Search existente, reutilizando a maioria dos caminhos de dados nos níveis superiores. Abaixo está um resumo das etapas realizadas quando uma solicitação de busca é recebida:
SDK Lida com a Solicitação de Busca: O SDK recebe uma solicitação de busca do usuário contendo parâmetros como radius e range_filter.
Proxy Gera SearchTask: Ao receber a solicitação de busca, o proxy cria uma SearchTask e a passa para o nó de consulta.
Querynode para Segcore: O nó de consulta invoca a interface Search no Segcore por meio de uma chamada cgo.
Análise do Segcore: O Segcore analisa os parâmetros em search_param. Se um parâmetro radius estiver presente, ele invoca knowhere::RangeSearch.
Knowhere e Bibliotecas de Terceiros: Knowhere (o mecanismo central de execução vetorial do Milvus) então direciona a chamada para a função range_search da biblioteca de terceiros correspondente com base no tipo de índice.
Todos os índices de bibliotecas de terceiros que oferecemos suporte são configurados para executar Range Search unilateral. "Unilateral" significa que eles aceitam apenas um único parâmetro 'radius' e retornam todos os resultados não ordenados dentro desse raio. A tabela abaixo descreve as estratégias de Range Search para diferentes tipos de índice.
| Tipo de índice | Estratégia de pesquisa |
|---|---|
| IDMAP / BIN_IDMAP | Pesquisa por força bruta |
| IVF_xxx / SCANN / BIN_IVF_xxx (atualizado) | Comece pesquisando a partir do bucket mais próximo do ponto central. Pare a pesquisa quando uma das seguintes condições for atendida: 1. Todos os buckets foram pesquisados 2. Nenhum vetor que atenda à condição é encontrado em um bucket. |
| HNSW (desenvolvido internamente) | Comece a pesquisa a partir da camada mais alta e identifique o vetor mais próximo do alvo; em seguida, prossiga para a próxima camada abaixo. Continue esse processo camada por camada até atingir o vizinho mais próximo na camada mais baixa (1ª). A partir daí, realize uma Pesquisa em Largura (BFS) começando desse vizinho mais próximo e continuando até que todos os pontos visitados e seus vizinhos externos fiquem fora do intervalo desejado. |
| DISKANN | Comece com l_search = min_l_search. Para cada iteração, defina l_search = 2 * l_search. Pare a pesquisa quando uma das seguintes condições for atendida: 1. O número de resultados retornados em uma iteração for menor que l_search / 2 2. l_search > max_l_search. |
Tanto os tipos de métrica HAMMING quanto JACCARD oferecem suporte completo à pesquisa por intervalo para tipos de dados binários. No entanto, os tipos de métrica SUBSTRUCTURE/SUPERSTRUCTURE são incompatíveis com a pesquisa por intervalo, pois sua semântica se baseia em um sistema de valores verdadeiro/falso. Quanto aos índices do tipo float, aqueles que usam as métricas L2, IP e COSINE são totalmente compatíveis com a pesquisa por intervalo.
A tabela abaixo descreve os tipos detalhados de índice e métrica compatíveis com a Pesquisa por Intervalo.
| L2 | IP | COSINE | HAMMING | JACCARD | SUBSTRUCTURE | SUPERSTRUCTURE | |
|---|---|---|---|---|---|---|---|
| BIN_IDMAP | √ | √ | |||||
| BIN_IVF_FLAT | √ | √ | |||||
| IDMAP | √ | √ | √ | ||||
| IVF_FLAT | √ | √ | √ | ||||
| IVF_PQ | √ | √ | √ | ||||
| IVF_SQ8 | √ | √ | √ | ||||
| HNSW | √ | √ | √ | √ | √ | ||
| SCANN | √ | √ | √ | ||||
| DISKANN | √ | √ | √ |
Como usar a Busca por Intervalo no Milvus
Para usar a Busca por Intervalo no Milvus, você precisará modificar os parâmetros de busca na sua solicitação de busca. Aqui está um guia passo a passo, incluindo um exemplo de trecho de código em Python:
Pré-requisitos
Certifique-se de que o Milvus esteja instalado e em execução.
Certifique-se de que você criou uma coleção e a indexou.
Parâmetros importantes da Busca por Intervalo
radius: Este é um parâmetro obrigatório que determina se a solicitação de busca realizará uma busca por intervalo ou uma busca regular.
range_filter: Este é um parâmetro opcional. Se fornecido, realizará uma filtragem secundária nos resultados. Se não for especificado, a função retornará os resultados diretamente.
Ao configurar esses dois parâmetros, você pode ajustar com precisão o comportamento das suas consultas de Busca por Intervalo para diferentes necessidades de aplicação. Com isso em mente, vamos analisar alguns exemplos de código para ajudar você a começar.
default_index = {
"index_type": "HNSW",
"metric_type": "L2",
"params": {"M":48,"efConstruction":500}
}
collection.create_index("float_vector", default_index)
search_params = {
"metric_type": "L2",
"limit": TOPK,
"params": {"ef":32,"range_filter":1.0,"radius":2.0}
}
res = collection.search(vectors[:nq], "float_vector", search_params, limit)
Considerações sobre métricas
Agora que você entende como usar a Busca por Intervalo, é essencial considerar o impacto dos tipos de métrica nas suas consultas. Dependendo do tipo de métrica que você escolher, você deve verificar o Radius conforme sugerimos na tabela abaixo.
| Tipo de métrica | Radius | Similar | Não similar |
|---|---|---|---|
| L2 | [0.0, inf] | 0.0 | inf |
| IP | [-inf, inf] | inf | -inf |
| COSINE | [-1.0, 1.0] | 1.0 | -1.0 |
| HAMMING | [0, n] | 0 | n |
| JACCARD | [0.0, 1.0] | 0.0 | 1.0 |
Além disso, o range_filter deve seguir estas regras:
Para L2/Hamming/Jaccard, range_filter < radius
Para IP/Cosine, range_filter > radius
Conclusão
A Busca por Intervalo no Milvus não se limita a mecanismos de recomendação; ela tem aplicações mais amplas em áreas como correspondência de conteúdo, detecção de anomalias e tarefas de busca em NLP. Ao aproveitar parâmetros como radius e range_filter, você pode adaptar suas consultas com precisão para atender a esses diversos casos de uso.
Pronto para assumir o controle das suas solicitações de busca? A Busca por Intervalo agora está disponível para pré-visualização pública no Zilliz Cloud. Atualize para a versão beta do Zilliz Cloud ou baixe o Milvus 2.3.x para experimentá-la. Suas percepções são essenciais para a melhoria contínua dela, então, se você encontrar algum problema ou tiver sugestões, estamos prontos para ouvir. Vamos melhorar a Busca por Intervalo juntos.
Continue lendo

Zilliz Cloud On-Demand Compute: Pay Only for What You Use
The customer case behind Zilliz Cloud On-Demand: how a $10K vector search bill came down to under $500, and the engineering changes that made it possible.

Announcing VDBBench 1.0: Open-Source VectorDB Benchmarking with Your Real-World Production Workloads
Discover VDBBench 1.0, an open-source tool for benchmarking vector databases with real-world production data, streaming ingestion, and concurrent workloads.

AI Integration in Video Surveillance Tools: Transforming the Industry with Vector Databases
Discover how AI and vector databases are revolutionizing video surveillance with real-time analysis, faster threat detection, and intelligent search capabilities for enhanced security.



