Sblocca motori di raccomandazione avanzati con la nuova ricerca per intervallo di Milvus
Introduzione
Nella ricerca per similarità, gli sviluppatori spesso hanno bisogno di aiuto con le limitazioni, in particolare quando bilanciano la qualità e la diversità dei risultati di ricerca. Ecco la nuova funzionalità di Milvus: Range Search. Questo post illustrerà che cos'è Range Search, quando usarla al posto della tradizionale Top-K Search, e approfondirà la sua architettura tecnica e la guida all'uso.
Che cos'è Range Search?
Range Search in Milvus offre un controllo granulare sulla similarità vettoriale nei risultati di ricerca, consentendoti di specificare un intervallo di distanza per i vettori pertinenti. Questa funzionalità affronta i limiti delle ricerche KNN tradizionali nei sistemi di raccomandazione, dove i risultati possono essere troppo simili o troppo diversi rispetto alle tue aspettative.
Quando scegliere range search rispetto a Top-K search?
La ricerca KNN tradizionale presenta due carenze fondamentali:
Raccomandazioni sbilanciate: Può raccomandare elementi troppo simili, influenzando la qualità della raccomandazione. Per esempio, un aggregatore di notizie sportive potrebbe finire per raccomandare a un utente più articoli sulla stessa partita di calcio, semplicemente perché ha letto un articolo sulla partita. Questo potrebbe escludere contenuti diversificati, rendendo le raccomandazioni ripetitive e meno coinvolgenti.
Vincoli di sistema: Il parametro Top-K raggiunge un massimo di 16.384, creando problemi per le query su dati su larga scala e per l'utilizzo delle risorse. Considera uno scenario in cui stai interrogando un dataset di milioni di prodotti. Il limite Top-K di 16.384 significa che potresti perderti migliaia di prodotti pertinenti che potrebbero interessare all'utente, oltre a mettere sotto pressione le risorse del sistema mentre cerca di elaborare e trasmettere questo grande volume di dati.
Range Search risolve questi problemi. Consente un insieme di risultati bilanciato permettendoti di definire un intervallo di distanza per la similarità vettoriale. L'aggiunta di parametri come radius e l'opzionale range_filter offre un controllo più sfumato, eliminando la necessità di filtraggio post-query. Questo controllo sfumato rende Range Search ideale per applicazioni che richiedono un controllo preciso sui risultati di ricerca.
Dettagli tecnici alla base di Range Search
Ora che abbiamo esplorato che cos'è Range Search e quando usarla, approfondiamo la sua architettura e i suoi algoritmi. Questa esplorazione fornirà informazioni critiche sui suoi punti di forza, sui suoi limiti e sulla sua integrazione con librerie di terze parti.
Il flusso di Range Search è costruito sul flusso Search esistente, riutilizzando la maggior parte dei percorsi dati ai livelli superiori. Di seguito è riportato uno schema dei passaggi eseguiti quando viene ricevuta una richiesta di ricerca:
SDK gestisce la richiesta di ricerca: L'SDK riceve una richiesta di ricerca dell'utente contenente parametri come radius e range_filter.
Il proxy genera SearchTask: Alla ricezione della richiesta di ricerca, il proxy crea una SearchTask e la passa al nodo di query.
Da Querynode a Segcore: Il nodo di query invoca l'interfaccia Search in Segcore tramite una chiamata cgo.
Parsing di Segcore: Segcore analizza i parametri in search_param. Se è presente un parametro radius, invoca knowhere::RangeSearch.
Knowhere e librerie di terze parti: Knowhere (il motore di esecuzione vettoriale core di Milvus) instrada quindi la chiamata alla funzione range_search della libreria di terze parti corrispondente in base al tipo di indice.
Tutti gli indici delle librerie di terze parti che supportiamo sono configurati per eseguire Range Search unilaterale. "Unilaterale" significa che accettano solo un singolo parametro 'radius' e restituiscono tutti i risultati non ordinati entro quel raggio. La tabella seguente illustra le strategie di Range Search per diversi tipi di indice.
| Tipo di indice | Strategia di ricerca |
|---|---|
| IDMAP / BIN_IDMAP | Ricerca brute force |
| IVF_xxx / SCANN / BIN_IVF_xxx (aggiornato) | Inizia la ricerca dal bucket più vicino al punto centrale. Interrompi la ricerca quando una delle seguenti condizioni è soddisfatta: 1. Tutti i bucket sono stati cercati 2. Non vengono trovati vettori che soddisfano la condizione in un bucket. |
| HNSW (sviluppato internamente) | Inizia la ricerca dallo strato più alto e identifica il vettore più vicino al target, quindi passa allo strato successivo verso il basso. Continua questo processo strato per strato finché non raggiunge il vicino più prossimo nello strato più basso (1°). Da lì, esegui una ricerca in ampiezza (BFS) a partire da questo vicino più prossimo e continuando finché tutti i punti visitati e i loro vicini in uscita non rientrano nell’intervallo desiderato. |
| DISKANN | Inizia con l_search = min_l_search. Per ogni iterazione, imposta l_search = 2 * l_search. Interrompi la ricerca quando una delle seguenti condizioni è soddisfatta: 1. Il numero di risultati restituiti in un’iterazione è inferiore a l_search / 2 2. l_search > max_l_search. |
Entrambi i tipi di metrica HAMMING e JACCARD offrono pieno supporto per la range search per i tipi di dati binari. Tuttavia, i tipi di metrica SUBSTRUCTURE/SUPERSTRUCTURE sono incompatibili con la range search, poiché la loro semantica si basa su un sistema di valori vero/falso. Per quanto riguarda gli indici di tipo float, quelli che utilizzano le metriche L2, IP e COSINE sono pienamente compatibili con la range search.
La tabella seguente illustra i tipi di indice e di metrica dettagliati compatibili con Range Search.
| L2 | IP | COSINE | HAMMING | JACCARD | SUBSTRUCTURE | SUPERSTRUCTURE | |
|---|---|---|---|---|---|---|---|
| BIN_IDMAP | √ | √ | |||||
| BIN_IVF_FLAT | √ | √ | |||||
| IDMAP | √ | √ | √ | ||||
| IVF_FLAT | √ | √ | √ | ||||
| IVF_PQ | √ | √ | √ | ||||
| IVF_SQ8 | √ | √ | √ | ||||
| HNSW | √ | √ | √ | √ | √ | ||
| SCANN | √ | √ | √ | ||||
| DISKANN | √ | √ | √ |
Come usare Range Search in Milvus
Per usare Range Search in Milvus, dovrai modificare i parametri di ricerca nella tua richiesta di ricerca. Ecco una guida passo passo, incluso un esempio di frammento di codice Python:
Prerequisiti
Assicurati che Milvus sia installato e in esecuzione.
Assicurati di aver creato una collection e di averla indicizzata.
Parametri importanti di Range Search
radius: Questo è un parametro obbligatorio che determina se la richiesta di ricerca eseguirà una ricerca per intervallo o una ricerca regolare.
range_filter: Questo è un parametro opzionale. Se fornito, eseguirà un filtraggio secondario sui risultati. Se non specificato, la funzione restituirà direttamente i risultati.
Configurando questi due parametri, puoi ottimizzare il comportamento delle tue query Range Search per diverse esigenze applicative. Tenendo presente questo, vediamo del codice di esempio per aiutarti a iniziare.
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)
Considerazioni sulle metriche
Ora che sai come usare Range Search, è essenziale considerare l’impatto dei tipi di metrica sulle tue query. A seconda del tipo di metrica che scegli, dovresti controllare il Radius come suggerito nella tabella seguente.
| Metric Type | Radius | Similar | Not 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 |
Inoltre, range_filter dovrebbe seguire queste regole:
Per L2/Hamming/Jaccard, range_filter < radius
Per IP/Cosine, range_filter > radius
Conclusione
Range Search in Milvus non si limita ai motori di raccomandazione; ha applicazioni più ampie in aree come il matching dei contenuti, il rilevamento di anomalie e le attività di ricerca NLP. Sfruttando parametri come radius e range_filter, puoi adattare con precisione le tue query a questi diversi casi d’uso.
Pronto a prendere il controllo delle tue richieste di ricerca? Range Search è ora disponibile in anteprima pubblica su Zilliz Cloud. Passa alla versione beta di Zilliz Cloud oppure scarica Milvus 2.3.x per provarlo. I tuoi feedback sono fondamentali per il suo miglioramento continuo, quindi se riscontri problemi o hai suggerimenti, siamo tutt’orecchi. Miglioriamo Range Search insieme.
Continua a leggere

Migrating Self-Managed Milvus to Zilliz Cloud for >99% Latency Reduction
Step-by-step guide to migrating 50M vectors from self-managed Milvus to Zilliz Cloud using milvus-backup. Achieve >99% query latency reduction with zero data loss.

Expanding Our Global Reach: Zilliz Cloud Launches in Azure Central India
Zilliz Cloud expands to Azure Central India. This new region helps customers meet compliance, reduce latency, and optimize cloud costs when building AI applications.

AI Agents Are Quietly Transforming E-Commerce — Here’s How
Discover how AI agents transform e-commerce with autonomous decision-making, enhanced product discovery, and vector search capabilities for today's retailers.



