Corrispondenza di fraseCompatible with Milvus 2.5.17+
La corrispondenza per frase consente di cercare i documenti che contengono i termini della query come una frase esatta. Per impostazione predefinita, le parole devono apparire nello stesso ordine e direttamente adiacenti l'una all'altra. Ad esempio, una query per "robotics machine learning" corrisponde a un testo come "...typical robotics machine learning models...", dove le parole "robotics", "machine" e "learning" appaiono in sequenza senza altre parole tra loro.
Tuttavia, negli scenari reali, una corrispondenza rigida delle frasi può essere troppo rigida. Si potrebbe voler abbinare un testo come "...modelli di apprendimento automatico ampiamente adottati nella robotica...". In questo caso, le stesse parole chiave sono presenti ma non affiancate o nell'ordine originale. Per gestire questo problema, la corrispondenza di frasi supporta il parametro slop, che introduce una certa flessibilità. Il valore slop definisce quanti spostamenti di posizione sono consentiti tra i termini della frase. Ad esempio, con un slop di 1, una query per "machine learning" può corrispondere a un testo come "...machine deep learning...", dove una parola ("deep") separa i termini originali.
Panoramica
Grazie alla libreria del motore di ricerca Tantivy, la corrispondenza di frase funziona analizzando le informazioni sulla posizione delle parole all'interno dei documenti. Il diagramma seguente illustra il processo:
Flusso di lavoro Phrase Match
Tokenizzazione del documento: Quando si inseriscono i documenti in Milvus, il testo viene suddiviso in token (singole parole o termini) mediante un analizzatore, con informazioni di posizione registrate per ogni token. Ad esempio, doc_1 viene tokenizzato in ["macchina" (pos=0), "apprendimento" (pos=1), "boost" (pos=2), "efficienza" (pos=3)]. Per ulteriori informazioni sugli analizzatori, consultare la sezione Panoramica sugli analizzatori.
Creazione di indici invertiti: Milvus crea un indice inverso, mappando ogni token al documento o ai documenti in cui compare e alla posizione del token in quei documenti.
Corrispondenza delle frasi: quando viene eseguita una query di frasi, Milvus cerca ogni token nell'indice invertito e controlla le loro posizioni per determinare se appaiono nell'ordine e nella prossimità corretti. Il parametro
slopcontrolla il numero massimo di posizioni consentite tra i token corrispondenti:slop = 0 significa che i token devono apparire nell'ordine esatto e immediatamente adiacenti (cioè, senza parole aggiuntive in mezzo).
- Nell'esempio, solo doc_1 ("macchina" a pos=0, "apprendimento" a pos=1) corrisponde esattamente.
slop = 2 consente fino a due posizioni di flessibilità o riarrangiamento tra i token corrispondenti.
Ciò consente di invertire l'ordine ("macchina per imparare") o di avere un piccolo spazio tra i token.
Di conseguenza, doc_1, doc_2 ("learning" a pos=0, "machine" a pos=1) e doc_3 ("learning" a pos=1, "machine" a pos=2) corrispondono tutti.
Abilitare la corrispondenza di frase
La corrispondenza per frase funziona con il tipo di campo VARCHAR, il tipo di dati stringa di Milvus. Per abilitare la corrispondenza di frase, configurare lo schema della raccolta impostando entrambi i parametri enable_analyzer e enable_match su True, in modo simile alla corrispondenza di testo.
Impostare enable_analyzer e enable_match
Per abilitare la corrispondenza di frasi per un campo specifico VARCHAR, impostare entrambi i parametri enable_analyzer e enable_match su True quando si definisce lo schema del campo. Questa configurazione indica a Milvus di tokenizzare il testo e di creare un indice invertito con le informazioni posizionali necessarie per una corrispondenza efficiente delle frasi.
Ecco un esempio di definizione dello schema per abilitare la corrispondenza delle frasi:
from pymilvus import MilvusClient, DataType
# Create a schema for a new collection
schema = MilvusClient.create_schema(enable_dynamic_field=False)
schema.add_field(
field_name="id",
datatype=DataType.INT64,
is_primary=True,
auto_id=True
)
# Add a VARCHAR field configured for phrase matching
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
)
Opzionale: Configurare un analizzatore
L'accuratezza della corrispondenza delle frasi dipende in modo significativo dall'analizzatore utilizzato per la tokenizzazione dei dati di testo. Analizzatori diversi si adattano a lingue e formati di testo diversi, influenzando la tokenizzazione e la precisione posizionale. La selezione di un analizzatore appropriato per il vostro caso d'uso specifico ottimizzerà i risultati della corrispondenza delle frasi.
Per impostazione predefinita, Milvus utilizza l'analizzatore standard, che tokenizza il testo in base agli spazi bianchi e alla punteggiatura, rimuove i token più lunghi di 40 caratteri e converte il testo in minuscolo. Per l'uso predefinito non sono richiesti parametri aggiuntivi. Per ulteriori informazioni, consultare l'Analizzatore standard.
Se l'applicazione richiede un analizzatore specifico, è necessario configurarlo con il parametro analyzer_params. Ad esempio, ecco come configurare l'analizzatore english per la corrispondenza di frasi nel testo inglese:
# Define analyzer parameters for English-language tokenization
analyzer_params = {
"type": "english"
}
# Add the VARCHAR field with the English analyzer enabled
schema.add_field(
field_name='text', # Name of the field
datatype=DataType.VARCHAR, # Field data type set as VARCHAR
max_length=1000, # Maximum length of the string
enable_analyzer=True, # Enables text analysis
analyzer_params=analyzer_params, # Specifies the analyzer configuration
enable_match=True # Enables inverted indexing for phrase matching
)
Milvus supporta diversi analizzatori adatti a lingue e casi d'uso diversi. Per informazioni dettagliate, consultare la sezione Panoramica degli analizzatori.
Utilizzare la corrispondenza delle frasi
Una volta attivata la corrispondenza per un campo VARCHAR nello schema della raccolta, è possibile eseguire corrispondenze di frasi utilizzando l'espressione PHRASE_MATCH.
L'espressione PHRASE_MATCH non fa distinzione tra maiuscole e minuscole. Si può usare sia PHRASE_MATCH che phrase_match.
Sintassi dell'espressione PHRASE_MATCH
Utilizzare l'espressione PHRASE_MATCH per specificare il campo, la frase e la flessibilità opzionale (slop) durante la ricerca. La sintassi è:
PHRASE_MATCH(field_name, phrase, slop)
field_name: Il nome del campoVARCHARsu cui eseguire le corrispondenze di frase.phrase: La frase esatta da cercare.slop(opzionale): Un numero intero che specifica il numero massimo di posizioni consentite nei token di corrispondenza.0(predefinito): Corrisponde solo alle frasi esatte. Esempio: Un filtro per "machine learning" corrisponderà esattamente a "machine learning", ma non a "machine boosts learning" o "learning machine".1: Consente variazioni minime, ad esempio un termine in più o un piccolo spostamento di posizione. Esempio: Un filtro per "machine learning" corrisponderà a "machine boosts learning" (un token tra "machine" e "learning") ma non a "learning machine" (termini invertiti).2: Permette una maggiore flessibilità, includendo l'ordine inverso dei termini o fino a due token tra di essi. Esempio: Un filtro per "machine learning" corrisponderà a "machine learning" (termini invertiti) o "machine quickly boosts learning" (due token tra "machine" e "learning").
Esempio di set di dati
Supponiamo di avere una raccolta denominata tech_articles contenente le seguenti cinque entità:
|
|
|---|---|
1 |
"L'apprendimento automatico aumenta l'efficienza dell'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 |
"Le macchine migliorano rapidamente le prestazioni dei modelli per l'apprendimento continuo". |
5 |
"L'apprendimento di algoritmi macchina avanzati espande le capacità dell'IA". |
Query con corrispondenza di frase
Quando si utilizza il metodo query(), PHRASE_MATCH agisce come un filtro scalare. Vengono restituiti solo i documenti che contengono la frase specificata (con lo slop consentito).
Esempio: slop = 0 (corrispondenza esatta)
Questo esempio restituisce i documenti che contengono la frase esatta "machine learning" senza alcun token aggiuntivo in mezzo.
# Match documents containing exactly "machine learning"
filter = "PHRASE_MATCH(text, 'machine learning')"
result = client.query(
collection_name="tech_articles",
filter=filter,
output_fields=["id", "text"]
)
Risultati di corrispondenza attesi:
|
|
|---|---|
1 |
"L'apprendimento automatico aumenta l'efficienza nell'analisi dei dati su larga scala". |
Solo il documento 1 contiene la frase esatta "machine learning" nell'ordine specificato senza token aggiuntivi.
Ricerca con corrispondenza di frase
Nelle operazioni di ricerca, PHRASE_MATCH viene utilizzato per filtrare i documenti prima di applicare il ranking di similarità vettoriale. Questo approccio in due fasi restringe dapprima l'insieme dei candidati tramite la corrispondenza testuale e poi li classifica nuovamente in base alle incorporazioni vettoriali.
Esempio: slop = 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:
|
|
|---|---|
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 macchina avanzati espande le capacità dell'IA". |
Esempio: 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:
|
|
|---|---|
1 |
"L'apprendimento automatico aumenta l'efficienza nell'analisi dei dati su larga scala". |
3 |
"Le architetture di macchine per l'apprendimento profondo ottimizzano i carichi computazionali". |
Esempio: 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:
|
|
|---|---|
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 macchina avanzati espande le capacità dell'IA". |
Considerazioni
L'abilitazione della corrispondenza delle frasi per un campo attiva la creazione di un indice invertito, che consuma risorse di archiviazione. Considerare l'impatto sullo storage quando si decide di abilitare questa funzione, poiché varia in base alle dimensioni del testo, ai token unici e all'analizzatore utilizzato.
Una volta definito un analizzatore nello schema, le sue impostazioni diventano permanenti per quella raccolta. Se si decide che un analizzatore diverso è più adatto alle proprie esigenze, si può decidere di abbandonare la raccolta esistente e crearne una nuova con la configurazione dell'analizzatore desiderato.
Le prestazioni della corrispondenza delle frasi dipendono dal modo in cui il testo viene tokenizzato. Prima di applicare un analizzatore all'intera raccolta, utilizzare il metodo
run_analyzerper esaminare il risultato della tokenizzazione. Per ulteriori informazioni, consultare la sezione Panoramica dell'analizzatore.Regole di escape nelle espressioni di
filter:I caratteri racchiusi tra doppi apici o apici singoli all'interno delle espressioni vengono interpretati come costanti di stringa. Se la costante di stringa include caratteri di escape, i caratteri di escape devono essere rappresentati con una sequenza di escape. Ad esempio, utilizzare
\\per rappresentare\,\\tper rappresentare una tabulazione\te\\nper rappresentare una newline.Se una costante di stringa è racchiusa da apici singoli, un apice singolo all'interno della costante deve essere rappresentato come
\\'mentre un doppio apice può essere rappresentato come"o\\". Esempio:'It\\'s milvus'.Se una costante di stringa è racchiusa da doppi apici, un doppio apice all'interno della costante deve essere rappresentato come
\\"mentre un apice singolo può essere rappresentato come'o\\'. Esempio:"He said \\"Hi\\"".