Presentazione di Milvus 2.5: ricerca a tutto testo, filtraggio dei metadati più potente e miglioramenti dell'usabilità!
Panoramica
Siamo entusiasti di presentare l'ultima versione di Milvus, la 2.5, che introduce una nuova potente funzionalità: la ricerca full-text, nota anche come ricerca lessicale o per parole chiave. Per chi non lo sapesse, la ricerca full-text consente di trovare i documenti cercando parole o frasi specifiche all'interno di essi, in modo simile a come si cerca su Google. Questo integra le nostre attuali funzionalità di ricerca semantica, che comprendono il significato della vostra ricerca piuttosto che limitarsi a trovare le parole esatte.
Utilizziamo la metrica BM25, standard del settore, per la somiglianza dei documenti e la nostra implementazione si basa su vettori sparsi, che consentono una memorizzazione e un recupero più efficienti. Per chi non ha familiarità con il termine, i vettori sparsi sono un modo di rappresentare il testo in cui la maggior parte dei valori è pari a zero, il che li rende molto efficienti da memorizzare ed elaborare: immaginate un enorme foglio di calcolo in cui solo poche celle contengono numeri e il resto è vuoto. Questo approccio si adatta bene alla filosofia del prodotto Milvus, in cui il vettore è l'entità di ricerca principale.
Un altro aspetto degno di nota della nostra implementazione è la possibilità di inserire e interrogare direttamente il testo, invece di doverlo convertire manualmente in vettori sparsi. In questo modo Milvus fa un passo avanti verso l'elaborazione completa dei dati non strutturati.
Ma questo è solo l'inizio. Con il rilascio della versione 2.5, abbiamo aggiornato la roadmap dei prodotti Milvus. Nelle future iterazioni di Milvus, ci concentreremo sull'evoluzione delle capacità di Milvus in quattro direzioni chiave:
- Elaborazione semplificata dei dati non strutturati;
- Migliore qualità ed efficienza della ricerca;
- Semplificazione della gestione dei dati;
- Riduzione dei costi grazie a progressi algoritmici e di progettazione.
Il nostro obiettivo è costruire un'infrastruttura di dati in grado di memorizzare in modo efficiente e recuperare efficacemente le informazioni nell'era dell'intelligenza artificiale.
Ricerca full-text tramite Sparse-BM25
Sebbene la ricerca semantica abbia in genere una migliore consapevolezza del contesto e una migliore comprensione dell'intento, quando un utente deve cercare specifici nomi propri, numeri di serie o una frase completamente corrispondente, la ricerca full-text con corrispondenza di parole chiave spesso produce risultati più accurati.
Per illustrare questo aspetto con un esempio:
- La ricerca semantica eccelle quando si chiede: "Trova documenti sulle soluzioni di energia rinnovabile".
- La ricerca full-text è migliore quando si chiede: "Trovare documenti che parlano di Tesla Model 3 2024".
Nella nostra versione precedente (Milvus 2.4), gli utenti dovevano preelaborare il testo utilizzando uno strumento separato (il modulo BM25EmbeddingFunction di PyMilvus) sulla propria macchina prima di poterlo cercare. Questo approccio presentava diversi limiti: non era in grado di gestire bene insiemi di dati in crescita, richiedeva fasi di configurazione aggiuntive e rendeva l'intero processo più complicato del necessario. Per i tecnici, le limitazioni principali erano che poteva funzionare solo su una singola macchina; il vocabolario e le altre statistiche del corpus utilizzate per il punteggio BM25 non potevano essere aggiornate man mano che il corpus cambiava; e la conversione del testo in vettori sul lato client è meno intuitiva se si lavora direttamente con il testo.
Milvus 2.5 semplifica tutto. Ora è possibile lavorare direttamente con il testo:
- Memorizzare i documenti di testo originali così come sono
- Effettuare ricerche con query in linguaggio naturale
- Ottenere i risultati in forma leggibile
Dietro le quinte, Milvus gestisce automaticamente tutte le complesse conversioni vettoriali, facilitando il lavoro con i dati di testo. Questo è ciò che chiamiamo il nostro approccio "Doc in, Doc out": voi lavorate con il testo leggibile e noi ci occupiamo del resto.
Implementazione tecnica
Per coloro che sono interessati ai dettagli tecnici, Milvus 2.5 aggiunge la capacità di ricerca full-text attraverso l'implementazione Sparse-BM25 integrata, che comprende:
- Un Tokenizer costruito su tantivy: Milvus si integra ora con il fiorente ecosistema di tantivy.
- Capacità di ingerire e recuperare documenti grezzi: Supporto per l'acquisizione diretta e l'interrogazione di dati testuali.
- Punteggio di rilevanza BM25: Internalizzazione del punteggio BM25, implementato sulla base di vettori sparsi.
Abbiamo scelto di lavorare con l'ecosistema ben sviluppato di tantivy e di costruire il tokenizzatore di testo Milvus su tantivy. In futuro, Milvus supporterà altri tokenizzatori ed esporrà il processo di tokenizzazione per aiutare gli utenti a comprendere meglio la qualità del recupero. Esploreremo anche tokenizzatori basati sul deep learning e strategie di stemmer per ottimizzare ulteriormente le prestazioni della ricerca full-text. Di seguito è riportato un esempio di codice per l'utilizzo e la configurazione del tokenizer:
# Tokenizer configuration
schema.add_field(
field_name='text',
datatype=DataType.VARCHAR,
max_length=65535,
enable_analyzer=True, # Enable tokenizer on this column
analyzer_params={"type": "english"}, # Configure tokenizer parameters, here we choose the english template, fine-grained configuration is also supported
enable_match=True, # Build an inverted index for Text_Match
)
Dopo aver configurato il tokenizer nello schema della raccolta, gli utenti possono registrare il testo nella funzione bm25 tramite il metodo add_function. Questo verrà eseguito internamente al server Milvus. Tutti i flussi di dati successivi, come aggiunte, cancellazioni, modifiche e interrogazioni, possono essere completati operando sulla stringa di testo grezzo, invece che sulla rappresentazione vettoriale. Si veda il seguente esempio di codice per capire come ingerire il testo ed effettuare ricerche full-text con la nuova API:
# Define the mapping relationship between raw text data and vectors on the schema
bm25_function = Function(
name="text_bm25_emb",
input_field_names=["text"], # Input text field
output_field_names=["sparse"], # Internal mapping sparse vector field
function_type=FunctionType.BM25, # Model for processing mapping relationship
)
schema.add_function(bm25_function)
...
# Support for raw text in/out
MilvusClient.insert('demo', [
{'text': 'Artificial intelligence was founded as an academic discipline in 1956.'},
{'text': 'Alan Turing was the first person to conduct substantial research in AI.'},
{'text': 'Born in Maida Vale, London, Turing was raised in southern England.'},
])
MilvusClient.search(
collection_name='demo',
data=['Who started AI research?'],
anns_field='sparse',
limit=3
)
Abbiamo adottato un'implementazione del punteggio di rilevanza BM25 che rappresenta le query e i documenti come vettori sparsi, chiamati Sparse-BM25. Questo sblocca molte ottimizzazioni basate su vettori sparsi, come ad esempio:
Milvus ottiene capacità di ricerca ibrida grazie alla sua implementazione Sparse-BM25 all'avanguardia, che integra la ricerca full-text nell'architettura del database vettoriale. Rappresentando le frequenze dei termini come vettori sparsi, invece dei tradizionali indici invertiti, Sparse-BM25 consente ottimizzazioni avanzate, come l'indicizzazione a grafo, la quantizzazione del prodotto (PQ) e la quantizzazione scalare (SQ). Queste ottimizzazioni riducono al minimo l'utilizzo della memoria e accelerano le prestazioni di ricerca. Simile all'approccio a indice invertito, Milvus supporta l'acquisizione di testo grezzo come input e la generazione interna di vettori sparsi. Questo lo rende in grado di lavorare con qualsiasi tokenizer e di cogliere qualsiasi parola presente nel corpus in continua evoluzione.
Inoltre, il pruning euristico scarta i vettori sparsi di basso valore, migliorando ulteriormente l'efficienza senza compromettere l'accuratezza. A differenza dei precedenti approcci che utilizzano vettori sparsi, questo approccio è in grado di adattarsi a un corpus in crescita e non all'accuratezza del punteggio BM25.
- Creazione di indici a grafo sul vettore sparse, con prestazioni migliori rispetto all'indice invertito su query con testi lunghi, poiché l'indice invertito necessita di più passaggi per completare la corrispondenza dei token nella query;
- Sfruttare le tecniche di approssimazione per accelerare la ricerca con un impatto minimo sulla qualità del recupero, come la quantizzazione del vettore e il pruning euristico;
- unificare l'interfaccia e il modello dei dati per eseguire la ricerca semantica e la ricerca full-text, migliorando così l'esperienza dell'utente.
# Creating an index on the sparse column
index_params.add_index(
field_name="sparse",
index_type="AUTOINDEX", # Default WAND index
metric_type="BM25" # Configure relevance scoring through metric_type
)
# Configurable parameters at search time to speed up search
search_params = {
'params': {'drop_ratio_search': 0.6}, # WAND search parameter configuration can speed up search
}
In sintesi, Milvus 2.5 ha ampliato la sua capacità di ricerca al di là della ricerca semantica introducendo la ricerca full-text, rendendo più facile per gli utenti costruire applicazioni AI di alta qualità. Questi sono solo i primi passi nello spazio della ricerca Sparse-BM25 e prevediamo che in futuro ci saranno ulteriori misure di ottimizzazione da provare.
Filtri di ricerca per la corrispondenza del testo
Una seconda funzione di ricerca testuale rilasciata con Milvus 2.5 è Text Match, che consente all'utente di filtrare la ricerca sulle voci contenenti una specifica stringa di testo. Anche questa funzione si basa sulla tokenizzazione ed è attivata con enable_match=True
.
Vale la pena notare che con Text Match, l'elaborazione del testo della query si basa sulla logica dell'OR dopo la tokenizzazione. Ad esempio, nell'esempio seguente, il risultato restituirà tutti i documenti (utilizzando il campo "text") che contengono "vector" o "database".
filter = "TEXT_MATCH(text, 'vector database')"
Se lo scenario richiede la corrispondenza tra 'vettore' e 'database', è necessario scrivere due corrispondenze di testo separate e sovrapporle con AND per raggiungere l'obiettivo.
filter = "TEXT_MATCH(text, 'vector') and TEXT_MATCH(text, 'database')"
Miglioramento significativo delle prestazioni del filtraggio scalare
La nostra enfasi sulle prestazioni del filtraggio scalare deriva dalla scoperta che la combinazione di recupero vettoriale e filtraggio dei metadati può migliorare notevolmente le prestazioni e l'accuratezza delle query in vari scenari. Questi scenari spaziano da applicazioni di ricerca di immagini, come l'identificazione di casi angolari nella guida autonoma, a scenari complessi di RAG nelle basi di conoscenza aziendali. Pertanto, è molto adatto agli utenti aziendali per essere implementato in scenari di applicazione di dati su larga scala.
In pratica, molti fattori come la quantità di dati da filtrare, l'organizzazione dei dati e le modalità di ricerca possono influire sulle prestazioni. Per risolvere questo problema, Milvus 2.5 introduce tre nuovi tipi di indici: l'indice BitMap, l'indice invertito Array e l'indice invertito dopo la tokenizzazione del campo di testo Varchar. Questi nuovi indici possono migliorare significativamente le prestazioni nei casi d'uso reali.
In particolare:
- BitMap Index può essere utilizzato per accelerare il filtraggio dei tag (gli operatori più comuni includono in, array_contains, ecc.) ed è adatto a scenari con un numero ridotto di dati di categoria di campo (cardinalità dei dati). Il principio consiste nel determinare se una riga di dati ha un determinato valore su una colonna, con 1 per sì e 0 per no, e quindi mantenere un elenco BitMap. Il grafico seguente mostra il confronto dei test sulle prestazioni che abbiamo condotto sulla base dello scenario aziendale di un cliente. In questo scenario, il volume di dati è di 500 milioni, la categoria di dati è 20, i diversi valori hanno proporzioni di distribuzione diverse (1%, 5%, 10%, 50%) e le prestazioni variano anche in base alle diverse quantità di filtraggio. Con un filtraggio del 50%, possiamo ottenere un guadagno di prestazioni di 6,8 volte grazie a BitMap Index. Vale la pena notare che all'aumentare della cardinalità, rispetto all'indice BitMap, l'indice invertito mostrerà prestazioni più equilibrate.
- Text Match si basa sull'Inverted Index dopo la tokenizzazione del campo di testo. Le sue prestazioni superano di gran lunga la funzione Wildcard Match (cioè, like + %) che abbiamo fornito nella versione 2.4. Secondo i risultati dei nostri test interni, i vantaggi di Text Match sono molto evidenti, soprattutto in scenari di query concorrenti, dove può raggiungere un aumento del QPS di 400 volte.
Per quanto riguarda l'elaborazione dei dati JSON, prevediamo di introdurre nelle versioni successive di 2.5.x la creazione di indici invertiti per le chiavi specificate dall'utente e la registrazione delle informazioni di localizzazione predefinite per tutte le chiavi, al fine di accelerare il parsing. Prevediamo che entrambe le aree miglioreranno in modo significativo le prestazioni delle query di JSON e Dynamic Field. Abbiamo in programma di presentare ulteriori informazioni nelle future note di rilascio e nei blog tecnici, quindi rimanete sintonizzati!
Nuova interfaccia di gestione
La gestione di un database non dovrebbe richiedere una laurea in informatica, ma sappiamo che gli amministratori di database hanno bisogno di strumenti potenti. Ecco perché abbiamo introdotto la Cluster Management WebUI, una nuova interfaccia basata sul web accessibile all'indirizzo del cluster sulla porta 9091/webui. Questo strumento di osservabilità fornisce:
- Cruscotti di monitoraggio in tempo reale che mostrano le metriche dell'intero cluster
- Analisi dettagliate della memoria e delle prestazioni per nodo
- Informazioni sui segmenti e tracciamento delle query lente
- Indicatori di salute del sistema e stato dei nodi
- Strumenti di risoluzione dei problemi di facile utilizzo per problemi di sistema complessi.
L'interfaccia è ancora in fase beta, ma la stiamo sviluppando attivamente sulla base del feedback degli amministratori di database. I futuri aggiornamenti includeranno una diagnostica assistita dall'intelligenza artificiale, funzioni di gestione più interattive e funzionalità di osservabilità del cluster migliorate.
Documentazione e esperienza degli sviluppatori
Abbiamo completamente rinnovato la documentazione e l'esperienza SDK/API per rendere Milvus più accessibile, pur mantenendo la profondità per gli utenti esperti. I miglioramenti includono:
- Un sistema di documentazione ristrutturato con una progressione più chiara dai concetti di base a quelli avanzati.
- Tutorial interattivi ed esempi reali che illustrano implementazioni pratiche
- Riferimenti API completi con esempi pratici di codice
- Un design dell'SDK più facile da usare che semplifica le operazioni più comuni
- Guide illustrate che semplificano la comprensione di concetti complessi
- Un assistente alla documentazione potenziato dall'intelligenza artificiale (ASK AI) per risposte rapide.
L'SDK/API aggiornato si concentra sul miglioramento dell'esperienza degli sviluppatori attraverso interfacce più intuitive e una migliore integrazione con la documentazione. Crediamo che noterete questi miglioramenti quando lavorerete con la serie 2.5.x.
Tuttavia, sappiamo che lo sviluppo della documentazione e dell'SDK è un processo continuo. Continueremo a ottimizzare la struttura dei contenuti e il design dell'SDK in base al feedback della comunità. Unitevi al nostro canale Discord per condividere i vostri suggerimenti e aiutarci a migliorare ulteriormente.
Riassunto
Milvus 2.5 contiene 13 nuove funzionalità e diverse ottimizzazioni a livello di sistema, con il contributo non solo di Zilliz ma della comunità open-source. In questo post abbiamo toccato solo alcune di esse e vi invitiamo a visitare la nostra nota di rilascio e i documenti ufficiali per maggiori informazioni!
- Panoramica
- Ricerca full-text tramite Sparse-BM25
- Filtri di ricerca per la corrispondenza del testo
- Miglioramento significativo delle prestazioni del filtraggio scalare
- Nuova interfaccia di gestione
- Documentazione e esperienza degli sviluppatori
- Riassunto
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word