Phrase Match con Slop in Milvus 2.6: come migliorare l'accuratezza della ricerca full-text a livello di frase
Mentre i dati non strutturati continuano a esplodere e i modelli di IA diventano sempre più intelligenti, la ricerca vettoriale è diventata il livello di reperimento predefinito per molti sistemi di IA - pipeline RAG, ricerca IA, agenti, motori di raccomandazione e altro ancora. Funziona perché cattura il significato: non solo le parole digitate dagli utenti, ma anche l'intento che le sottende.
Una volta che queste applicazioni entrano in produzione, tuttavia, i team spesso scoprono che la comprensione semantica è solo un aspetto del problema del reperimento. Molti carichi di lavoro dipendono anche da regole testuali rigorose, come la corrispondenza con la terminologia esatta, la conservazione dell'ordine delle parole o l'identificazione di frasi che hanno un significato tecnico, legale o operativo.
Milvus 2.6 elimina questa separazione introducendo la ricerca full-text nativa direttamente nel database vettoriale. Grazie agli indici di token e di posizione integrati nel motore principale, Milvus è in grado di interpretare l'intento semantico di una query, rispettando al contempo precisi vincoli a livello di parole chiave e frasi. Il risultato è una pipeline di reperimento unificata in cui il significato e la struttura si rafforzano a vicenda, anziché vivere in sistemi separati.
Phrase Match è una parte fondamentale di questa funzionalità full-text. Identifica sequenze di termini che appaiono insieme e in ordine, fondamentale per individuare modelli di log, firme di errori, nomi di prodotti e qualsiasi testo in cui l'ordine delle parole definisce il significato. In questo post spiegheremo come funziona Phrase Match in Milvus, come slop aggiunge la flessibilità necessaria per i testi del mondo reale e perché queste caratteristiche rendono la ricerca ibrida vettoriale e full-text non solo possibile ma anche pratica all'interno di un unico database.
Che cos'è Phrase Match?
Phrase Match è un tipo di query full-text in Milvus che si concentra sulla struttura, in particolarese una sequenza di parole appare nello stesso ordine all'interno di un documento. Quando non è consentita alcuna flessibilità, la query si comporta in modo rigido: i termini devono apparire uno accanto all'altro e in sequenza. Una query come "robotics machine learning" corrisponde quindi solo quando queste tre parole si presentano come una frase continua.
La sfida è che il testo reale raramente si comporta in modo così ordinato. Il linguaggio naturale introduce rumore: aggettivi aggiuntivi, i log riordinano i campi, i nomi dei prodotti acquistano modificatori e gli autori umani non scrivono pensando ai motori di ricerca. Una corrispondenza rigorosa di una frase si rompe facilmente: una parola inserita, una riformulazione o un termine scambiato possono causare un errore. E in molti sistemi di intelligenza artificiale, soprattutto quelli rivolti alla produzione, la mancanza di una riga di registro o di una frase che fa scattare una regola non è accettabile.
Milvus 2.6 risolve questo problema con un semplice meccanismo: lo slop. Lo slop definisce la quantità di spazio consentito tra i termini della query. Invece di trattare una frase come fragile e inflessibile, lo slop permette di decidere se una parola in più è tollerabile, o due, o anche se un leggero riordino deve essere considerato una corrispondenza. In questo modo, la ricerca per frase si trasforma da un test binario di accettazione-rifiuto in uno strumento di ricerca controllato e regolabile.
Per capire perché questo è importante, immaginate di cercare nei log tutte le varianti del noto errore di rete "connessione resettata dal peer". In pratica, i log potrebbero avere l'aspetto seguente:
connection reset by peer
connection fast reset by peer
connection was suddenly reset by the peer
peer reset connection by ...
peer unexpected connection reset happened
A prima vista, tutte queste varianti rappresentano lo stesso evento. Ma i comuni metodi di recupero fanno fatica:
BM25 si scontra con la struttura.
Considera la query come un insieme di parole chiave, ignorando l'ordine in cui appaiono. Finché "connessione" e "pari" compaiono da qualche parte, BM25 può classificare il documento in modo elevato, anche se la frase è invertita o non è correlata al concetto che si sta cercando.
La ricerca vettoriale si scontra con i vincoli.
Le incorporazioni eccellono nel catturare il significato e le relazioni semantiche, ma non possono imporre una regola come "queste parole devono apparire in questa sequenza". Potreste recuperare messaggi semanticamente correlati, ma non trovare l'esatto schema strutturale necessario per il debug o la conformità.
Phrase Match colma il divario tra questi due approcci. Utilizzando lo slop, è possibile specificare esattamente la variazione accettabile:
slop = 0- Corrispondenza esatta (tutti i termini devono apparire in ordine e in modo contiguo).slop = 1- Consenti una parola in più (Copre le varianti più comuni del linguaggio naturale con un solo termine inserito).slop = 2- Consenti più parole inserite (Gestisce frasi più descrittive o verbose).slop = 3- Consentire il riordino (Supporta frasi invertite o poco ordinate, spesso il caso più difficile nel testo reale).
Invece di sperare che l'algoritmo di valutazione "faccia centro", si dichiara esplicitamente la tolleranza strutturale richiesta dall'applicazione.
Come funziona la corrispondenza delle frasi in Milvus
Basato sulla libreria del motore di ricerca Tantivy, Phrase Match in Milvus è implementato su un indice invertito con informazioni posizionali. Invece di limitarsi a controllare se i termini compaiono in un documento, verifica che compaiano nell'ordine giusto e a una distanza controllabile.
Il diagramma seguente illustra il processo:
1. Tokenizzazione del documento (con posizioni)
Quando i documenti vengono inseriti in Milvus, i campi di testo vengono elaborati da un analizzatore, che divide il testo in token (parole o termini) e registra la posizione di ciascun token all'interno del documento. Ad esempio, doc_1 viene tokenizzato come: machine (pos=0), learning (pos=1), boosts (pos=2), efficiency (pos=3).
2. Creazione dell'indice invertito
Successivamente, Milvus costruisce un indice invertito. Invece di mappare i documenti al loro contenuto, l'indice invertito mappa ogni token ai documenti in cui appare, insieme a tutte le posizioni registrate di quel token all'interno di ciascun documento.
3. Corrispondenza delle frasi
Quando viene eseguita una query di frase, Milvus utilizza innanzitutto l'indice invertito per identificare i documenti che contengono tutti i token della query. Poi convalida ogni candidato confrontando le posizioni dei token per assicurarsi che i termini appaiano nell'ordine corretto ed entro la distanza consentita slop. Solo i documenti che soddisfano entrambe le condizioni vengono restituiti come corrispondenze.
Il diagramma seguente riassume il funzionamento di Phrase Match end-to-end.
Come attivare la corrispondenza per frase in Milvus
Phrase Match funziona su campi di tipo VARCHARil tipo di stringa in Milvus. Per utilizzarla, è necessario configurare lo schema della raccolta in modo che Milvus esegua l'analisi del testo e memorizzi le informazioni posizionali per il campo. Questo si ottiene abilitando due parametri: enable_analyzer e enable_match.
Impostare enable_analyzer e enable_match
Per attivare la corrispondenza delle frasi per un campo VARCHAR specifico, impostare entrambi i parametri su True quando si definisce lo schema del campo. Insieme, indicano a Milvus di:
tokenizzare il testo (tramite
enable_analyzer) ecostruire un indice inverso con offset posizionali (tramite
enable_match).
Phrase Match si basa su entrambi i passaggi: l'analizzatore scompone il testo in token e l'indice di corrispondenza memorizza la posizione di questi token, consentendo di effettuare query efficienti basate su frasi e slop.
Di seguito è riportato un esempio di configurazione dello schema che abilita Phrase Match su un campo text:
from pymilvus import MilvusClient, DataType
schema = MilvusClient.create_schema(enable_dynamic_field=False)
schema.add_field(
field_name=“id”,
datatype=DataType.INT64,
is_primary=True,
auto_id=True
)
schema.add_field(
field_name=‘text’, # Name of the field
datatype=DataType.VARCHAR, # Field data type set as VARCHAR (string)
max_length=1000, # Maximum length of the string
enable_analyzer=True, # Enables text analysis (tokenization)
enable_match=True # Enables inverted indexing for phrase matching
)
schema.add_field(
field_name=“embeddings”,
datatype=DataType.FLOAT_VECTOR,
dim=5
)
Ricerca con Phrase Match: Come lo slop influisce sull'insieme dei candidati
Una volta abilitata la corrispondenza per un campo VARCHAR nello schema della raccolta, è possibile eseguire corrispondenze di frase usando l'espressione PHRASE_MATCH.
Nota: L'espressione PHRASE_MATCH non fa distinzione tra maiuscole e minuscole. Si può usare sia PHRASE_MATCH che phrase_match.
Nelle operazioni di ricerca, la corrispondenza di frase viene comunemente applicata prima della classificazione della somiglianza vettoriale. In primo luogo filtra i documenti in base a vincoli testuali espliciti, restringendo l'insieme dei candidati. I documenti rimanenti vengono quindi riclassificati utilizzando le incorporazioni vettoriali.
L'esempio seguente mostra come diversi valori di slop influenzino questo processo. Regolando il parametro slop, si controlla direttamente quali documenti superano il filtro frase e passano alla fase di classificazione vettoriale.
Si supponga di avere una raccolta denominata tech_articles contenente le seguenti cinque entità:
| doc_id | testo |
|---|---|
| 1 | L'apprendimento automatico aumenta l'efficienza nell'analisi dei dati su larga scala |
| 2 | L'apprendimento di un approccio basato sulle macchine è fondamentale per il progresso dell'IA moderna |
| 3 | Le architetture delle macchine per l'apprendimento profondo ottimizzano i carichi computazionali |
| 4 | La macchina migliora rapidamente le prestazioni del modello per l'apprendimento continuo |
| 5 | L'apprendimento di algoritmi di macchine avanzate espande le capacità dell'IA. |
slop=1
In questo caso, si ammette uno slop di 1. Il filtro viene applicato ai documenti che contengono la frase "learning machine" con una leggera flessibilità.
# Example: Filter documents containing "learning machine" with slop=1
filter_slop1 = "PHRASE_MATCH(text, 'learning machine', 1)"
result_slop1 = client.search(
collection_name=“tech_articles”,
anns_field=“embeddings”,
data=[query_vector],
filter=filter_slop1,
search_params={“params”: {“nprobe”: 10}},
limit=10,
output_fields=[“id”, “text”]
)
Risultati della corrispondenza:
| doc_id | testo |
|---|---|
| 2 | L'apprendimento di un approccio basato sulle macchine è fondamentale per i moderni progressi dell'IA |
| 3 | Le architetture delle macchine per l'apprendimento profondo ottimizzano i carichi computazionali |
| 5 | L'apprendimento di algoritmi automatici avanzati espande le capacità dell'IA |
slop=2
Questo esempio consente uno slop di 2, ovvero sono consentiti fino a due token extra (o termini invertiti) tra le parole "machine" e "learning".
# Example: Filter documents containing "machine learning" with slop=2
filter_slop2 = "PHRASE_MATCH(text, 'machine learning', 2)"
result_slop2 = client.search(
collection_name=“tech_articles”,
anns_field=“embeddings”, # Vector field name
data=[query_vector], # Query vector
filter=filter_slop2, # Filter expression
search_params={“params”: {“nprobe”: 10}},
limit=10, # Maximum results to return
output_fields=[“id”, “text”]
)
Risultati della corrispondenza:
| doc_id | testo |
|---|---|
| 1 | L'apprendimento automatico aumenta l'efficienza nell'analisi dei dati su larga scala |
| 3 | Le architetture delle macchine per l'apprendimento profondo ottimizzano i carichi computazionali |
slop=3
In questo esempio, uno slop di 3 offre una flessibilità ancora maggiore. Il filtro cerca "machine learning" con un massimo di tre posizioni di token tra le parole.
# Example: Filter documents containing "machine learning" with slop=3
filter_slop3 = "PHRASE_MATCH(text, 'machine learning', 3)"
result_slop2 = client.search(
collection_name=“tech_articles”,
anns_field=“embeddings”, # Vector field name
data=[query_vector], # Query vector
filter=filter_slop3, # Filter expression
search_params={“params”: {“nprobe”: 10}},
limit=10, # Maximum results to return
output_fields=[“id”, “text”]
)
Risultati della corrispondenza:
| doc_id | testo |
|---|---|
| 1 | L'apprendimento automatico aumenta l'efficienza nell'analisi dei dati su larga scala |
| 2 | L'apprendimento di un approccio basato sulle macchine è fondamentale per il progresso dell'IA moderna |
| 3 | Le architetture delle macchine per l'apprendimento profondo ottimizzano i carichi computazionali |
| 5 | L'apprendimento di algoritmi automatici avanzati espande le capacità dell'IA |
Suggerimenti rapidi: Cosa bisogna sapere prima di abilitare Phrase Match in Milvus
Phrase Match supporta il filtraggio a livello di frase, ma la sua abilitazione non si limita alla configurazione della query. È utile conoscere le considerazioni associate prima di applicarla in un ambiente di produzione.
L'abilitazione di Phrase Match su un campo crea un indice invertito, che aumenta l'utilizzo dello storage. Il costo esatto dipende da fattori quali la lunghezza del testo, il numero di token unici e la configurazione dell'analizzatore. Quando si lavora con campi di testo di grandi dimensioni o con dati ad alta cardinalità, questo costo aggiuntivo deve essere considerato in anticipo.
La configurazione dell'analizzatore è un'altra scelta critica del progetto. Una volta che un analizzatore è definito nello schema della raccolta, non può essere modificato. Per passare a un analizzatore diverso in un secondo momento è necessario eliminare la raccolta esistente e ricrearla con un nuovo schema. Per questo motivo, la scelta dell'analizzatore deve essere considerata una decisione a lungo termine piuttosto che un esperimento.
Il comportamento di Phrase Match è strettamente legato al modo in cui il testo viene tokenizzato. Prima di applicare un analizzatore a un'intera raccolta, si consiglia di usare il metodo
run_analyzerper ispezionare il risultato della tokenizzazione e confermare che corrisponde alle aspettative. Questo passo può aiutare a evitare sottili discrepanze e risultati di query inaspettati. Per ulteriori informazioni, consultare la sezione Panoramica dell'analizzatore.
Conclusione
Phrase Match è un tipo di ricerca full-text di base che consente di applicare vincoli a livello di frase e di posizione oltre alla semplice corrispondenza delle parole chiave. Operando sull'ordine e sulla prossimità dei token, fornisce un modo prevedibile e preciso per filtrare i documenti in base a come i termini appaiono effettivamente nel testo.
Nei moderni sistemi di reperimento, la corrispondenza di frase viene comunemente applicata prima della classificazione basata su vettori. In primo luogo, limita l'insieme dei candidati ai documenti che soddisfano esplicitamente le frasi o le strutture richieste. La ricerca vettoriale viene quindi utilizzata per classificare questi risultati in base alla rilevanza semantica. Questo schema è particolarmente efficace in scenari come l'analisi dei log, la ricerca di documentazione tecnica e le pipeline RAG, dove è necessario applicare vincoli testuali prima di considerare la somiglianza semantica.
Con l'introduzione del parametro slop in Milvus 2.6, Phrase Match diventa più tollerante nei confronti delle variazioni del linguaggio naturale, pur mantenendo il suo ruolo di meccanismo di filtraggio full-text. Questo rende i vincoli a livello di frase più facili da applicare nei flussi di recupero di produzione.
Provatelo con gli script dimostrativi ed esplorate Milvus 2.6 per vedere come il reperimento consapevole delle frasi si inserisce nel vostro stack.
Avete domande o volete un approfondimento su una qualsiasi funzione dell'ultima versione di Milvus? Unitevi al nostro canale Discord o inviate problemi su GitHub. È anche possibile prenotare una sessione individuale di 20 minuti per ottenere approfondimenti, indicazioni e risposte alle vostre domande tramite Milvus Office Hours.
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word



