Aggiungere un filtro in una query vettore in Azure AI Search
È possibile definire una richiesta di query vettore che include un'espressione filtro per aggiungere criteri di inclusione o esclusione alle query. In questo articolo viene spiegato come:
Questo articolo usa REST per l'illustrazione. Per esempi di codice in altri linguaggi, vedere il repository GitHub azure-search-vector-samples per soluzioni end-to-end che includono query vettoriali.
Inoltre è possibile usare Esplora ricerche nel portale di Azure per eseguire query sul contenuto del vettore. Se si usa la visualizzazione JSON, è possibile aggiungere filtri e specificare la modalità filtro.
Funzionamento del filtro in una query vettore
I filtri si applicano a campi non vettore filterable
, che siano un campo stringa o numerico, per includere o escludere i documenti di ricerca in base ai criteri di filtro. Sebbene un campo vettore non sia filtrabile, i filtri possono essere applicati ad altri campi nello stesso indice, includendo o escludendo i documenti che contengono anche i campi vettore.
I filtri vengono applicati prima o dopo l'esecuzione della query, in base al parametro vectorFilterMode
.
Definire un filtro
I filtri determinano l'ambito di una query vettoriale. I filtri vengono impostati su e eseguono l'iterazione su stringhe nonvector e campi numerici attribuiti come filterable
nell'indice, ma lo scopo di un filtro determina quale viene eseguita la query vettoriale: l'intero spazio ricercabile o il contenuto di un risultato di ricerca.
Se non si dispone di campi di origine con valori di testo o numerici, verificare la presenza di metadati del documento, ad esempio le proprietà LastModified o CreatedBy, che potrebbero risultare utili in un filtro di metadati.
2024-07-01 è la versione stabile per questa API. Le sue caratteristiche sono:
vectorFilterMode
per le modalità di filtro prefiltro (impostazione predefinita) o postfiltro.filter
fornisce i criteri.
Nell'esempio seguente il vettore è una rappresentazione di questa stringa di query: "what Azure services support full text search" (quali servizi Azure supportano la ricerca full text?). La query è destinata al campo contentVector
. Il vettore effettivo ha 1536 incorporamenti, quindi viene tagliato in questo esempio per favorirne la leggibilità.
I criteri di filtro vengono applicati a un campo di testo filtrabile (category
in questo esempio) prima che il motore di ricerca esegua la query vettoriale.
POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2024-07-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
"count": true,
"select": "title, content, category",
"filter": "category eq 'Databases'",
"vectorFilterMode": "preFilter",
"vectorQueries": [
{
"kind": "vector",
"vector": [
-0.009154141,
0.018708462,
. . .
-0.02178128,
-0.00086512347
],
"exhaustive": true,
"fields": "contentVector",
"k": 5
}
]
}
Impostare il parametro vectorFilterMode
Il parametro di query vectorFilterMode determina se il filtro viene applicato prima o dopo l'esecuzione della query vettore.
Usare la modalità prefiltro
Il prefiltro applica filtri prima dell'esecuzione della query, riducendo la superficie di ricerca su cui l'algoritmo di ricerca vettoriale cerca contenuto simile.
In una query vettoriale, preFilter
è l'impostazione predefinita.
Usare la modalità postfiltro
Il post-filtro applica filtri dopo l'esecuzione della query, restringendo i risultati della ricerca.
Test di benchmark delle modalità di filtro vettoriale
Per comprendere le condizioni in cui una modalità filtro offre prestazioni migliori rispetto all'altra, è stata eseguita una serie di test per valutare i risultati delle query su indici di piccole, medie e grandi dimensioni.
- Piccolo (100.000 documenti, indice da 2,5 GB, 1536 dimensioni)
- Medio (1 milione di documenti, indice da 25 GB, 1536 dimensioni)
- Grandi dimensioni (1 miliardo di documenti, indice da 1,9 TB, 96 dimensioni)
Per i carichi di lavoro di piccole e medie dimensioni, è stato usato un servizio Standard 2 (S2) con una partizione e una replica. Per il carico di lavoro di grandi dimensioni è stato usato un servizio Standard 3 (S3) con 12 partizioni e una replica.
Gli indici hanno una costruzione identica: un campo chiave, un campo vettore, un campo di testo e un campo filtrabile numerico. L'indice seguente viene definito usando la sintassi 2023-11-03.
def get_index_schema(self, index_name, dimensions):
return {
"name": index_name,
"fields": [
{"name": "id", "type": "Edm.String", "key": True, "searchable": True},
{"name": "content_vector", "type": "Collection(Edm.Single)", "dimensions": dimensions,
"searchable": True, "retrievable": True, "filterable": False, "facetable": False, "sortable": False,
"vectorSearchProfile": "defaulthnsw"},
{"name": "text", "type": "Edm.String", "searchable": True, "filterable": False, "retrievable": True,
"sortable": False, "facetable": False},
{"name": "score", "type": "Edm.Double", "searchable": False, "filterable": True,
"retrievable": True, "sortable": True, "facetable": True}
],
"vectorSearch": {
"algorithms": [
{
"name": "defaulthnsw",
"kind": "hnsw",
"hnswParameters": { "metric": "euclidean" }
}
],
"profiles": [
{
"name": "defaulthnsw",
"algorithm": "defaulthnsw"
}
]
}
}
Nelle query è stato usato un filtro identico per le operazioni di prefiltro e postfiltro. È stato usato un filtro semplice per garantire che le variazioni delle prestazioni fossero dovute alla modalità di filtro e non alla complessità del filtro.
I risultati sono stati misurati nelle query al secondo (QPS).
Risultati
La prefiltrazione è quasi sempre più lenta rispetto alla postfiltrazione, tranne per gli indici di piccole dimensioni in cui le prestazioni sono approssimativamente uguali.
Nei set di dati più grandi, la prefiltrazione è l'ordine di grandezza più lento.
Perché è quindi prefiltro il valore predefinito se è quasi sempre più lento? La prefiltrazione garantisce che i risultati
k
vengano restituiti se presenti nell'indice, in cui la distorsione favorisce il richiamo e la precisione rispetto alla velocità.La postfiltrazione è destinata ai clienti che:
- velocità del valore rispetto alla selezione (la postfiltrazione può restituire meno dei risultati
k
) - usare filtri che non sono eccessivamente selettivi
- hanno indici di dimensioni sufficienti in modo che le prestazioni di prefiltrazione non siano accettabili
- velocità del valore rispetto alla selezione (la postfiltrazione può restituire meno dei risultati
Dettagli
Dato un set di dati con 100.000 vettori a 1536 dimensioni:
- Quando si filtra più del 30% del set di dati, la prefiltrazione e la postfiltrazione erano confrontabili.
- Quando si filtra meno dello 0,1% del set di dati, la prefiltrazione è stata circa il 50% più lenta rispetto alla postfiltrazione.
Dato un set di dati con 1 milione di vettori a 1536 dimensioni:
- Quando si filtra più del 30% del set di dati, la prefiltrazione è stata circa il 30% più lenta.
- Quando si filtra meno del 2% del set di dati, la prefiltrazione era circa sette volte più lenta.
Dato un set di dati con 1 miliardo di vettori a 96 dimensioni:
- Quando si filtra più del 5% del set di dati, la prefiltrazione era circa il 50% più lenta.
- Quando si filtra meno del 10% del set di dati, la prefiltrazione era circa sette volte più lenta.
Il grafico seguente mostra il QPS relativo del prefiltro, calcolato come QPS prefiltro diviso per QPS postfiltro.
L'asse verticale è QPS di prefiltrazione su QPS di postfiltrazione. Ad esempio, un valore pari a 0,0 indica che la prefiltrazione è più lenta del 100%, 0,5 sull'asse verticale significa che la prefiltrazione è più lenta del 50%, 1,0 significa prefiltrazione e postfiltrazione sono equivalenti.
L'asse orizzontale rappresenta la velocità di filtro o la percentuale di documenti candidati dopo l'applicazione del filtro. Ad esempio, 1.00%
significa che il 1% del corpus di ricerca è stato selezionato dai criteri di filtro.