Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Nota
Azure AI Search è disponibile tramite il portale di Azure, le API REST e Azure SDK. È inoltre alla base di Foundry IQ, il livello di conoscenza gestito che trasforma il contenuto aziendale in knowledge base riutilizzabili e con riconoscimento delle autorizzazioni per gli agenti nel portale di Microsoft Foundry.
Nota
strictPostFilter è attualmente in anteprima. Questa anteprima viene fornita senza un contratto di servizio e non è consigliata per i carichi di lavoro di produzione. Alcune funzionalità potrebbero non essere supportate o potrebbero avere funzionalità limitate. Per ulteriori informazioni, consultare Condizioni aggiuntive per l'utilizzo di Microsoft Azure per le anteprime.
prefilter e postfilter sono disponibili a livello generale nella versione più recente dell'API REST stabile.
In Azure AI Search è possibile usare un'espressione filter per aggiungere criteri di inclusione o esclusione a una query vector. È anche possibile specificare una modalità di filtro che applica il filtro:
- Prima dell'esecuzione della query, nota come prefiltraggio.
- Dopo l'esecuzione della query, nota come postfiltrazione.
- Dopo aver identificato i risultati principali globali
k, noti come postfiltro rigoroso (anteprima).
Questo articolo usa REST per l'illustrazione. Per esempi di codice in altri linguaggi e soluzioni end-to-end che includono query vettoriali, vedere il repository azure-search-vector-samples GitHub.
È anche possibile usare Search Explorer nel portale di Azure per eseguire query sul contenuto vettoriale. Nella visualizzazione JSON è possibile aggiungere filtri e specificare la modalità filtro.
Funzionamento del filtro nelle query vettoriali
Azure AI Search utilizza l'algoritmo HNSW (Hierarchical Navigable Small World) per la ricerca ANN (Approximate Nearest Neighbor) approssimativa, archiviando grafi HNSW in più frammenti. Ogni partizione contiene una parte dell'intero indice.
I filtri si applicano ai filterable campi nonvettoriali, o campi stringa o numerici, per includere o escludere documenti di ricerca in base ai criteri di filtro. I campi vettoriali stessi non sono filtrabili, ma è possibile usare filtri su altri campi nello stesso indice per restringere i documenti considerati per la ricerca vettoriale. Se l'indice non dispone di campi di testo o numerici appropriati, verificare la presenza di metadati del documento che potrebbero essere utili per filtrare, ad esempio LastModified o CreatedBy proprietà.
Il vectorFilterMode parametro controlla dove vengono applicate le operazioni di filtro durante le fasi della ricerca, che influisce sul modo in cui i risultati vengono filtrati in base a un subset di elementi (ad esempio per categoria, tag o altri attributi) e influisce sulla latenza, il richiamo e la velocità effettiva. Esistono tre modalità:
preFilterapplica il filtro durante l'attraversamento HNSW in ogni partizione. Questa modalità massimizza il recupero, ma può percorrere più il grafo, aumentando il carico della CPU e la latenza per i filtri altamente selettivi.postFilteresegue l'attraversamento e il filtro HNSW per ogni partizione in modo indipendente, interseca i risultati a livello di partizione e quindi aggrega i risultati migliorikda ogni partizione in un valorekglobale. Questa modalità può creare falsi negativi per filtri altamente selettivi o valori di piccole dimensionik.strictPostFilter(anteprima) trova i risultati principali globalikprima di applicare il filtro. Questa modalità ha il rischio più elevato di restituire falsi negativi per i filtri altamente selettivi e i valori di piccole dimensionik.
Per altre informazioni su queste modalità, vedere Impostare la modalità filtro.
Definire un filtro
I filtri determinano l'ambito delle query vettoriali e vengono definiti usando Documenti - Ricerca post (API REST). A meno che non si voglia usare una funzionalità di anteprima, usare la versione stabile più recente delle API REST del servizio di ricerca per formulare la richiesta.
Questa API REST fornisce:
-
filterper i criteri. -
vectorFilterModeper specificare quando il filtro viene applicato durante la query vettoriale. Per le modalità supportate, vedere Impostare la modalità filtro.
POST https://{search-endpoint}/indexes/{index-name}/docs/search?api-version={api-version}
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,
. . . // Trimmed for readability
-0.02178128,
-0.00086512347
],
"fields": "contentVector",
"k": 50
}
]
}
In questo esempio, l'incorporamento del vettore è destinato al contentVector campo e i criteri di filtro si applicano a category, un campo di testo filtrabile. Poiché viene usata la preFilter modalità , il filtro viene applicato prima che il motore di ricerca esegua la query, pertanto solo i documenti nella Databases categoria vengono considerati durante la ricerca vettoriale.
Impostare la modalità filtro
Il vectorFilterMode parametro determina quando e come viene applicato il filtro rispetto all'esecuzione di query vettoriali. È possibile usare le modalità seguenti:
-
preFilter(scelta consigliata) postFilter-
strictPostFilter(anteprima)
Nota
preFilter è l'impostazione predefinita per gli indici creati dopo circa il 15 ottobre 2023. Per gli indici creati prima di questa data, postFilter è l'impostazione predefinita. Per usare preFilter e altre funzionalità di vettore avanzate, ad esempio la compressione vettoriale, è necessario ricreare l'indice.
È possibile testare la compatibilità inviando una query vettoriale con "vectorFilterMode": "preFilter" nella versione dell'API 2023-10-01-preview REST o successiva. Se la query non riesce, l'indice non supporta preFilter.
Il prefiltro applica filtri prima dell'esecuzione della query, riducendo il set candidato per l'algoritmo di ricerca vettoriale. I risultati principalik vengono quindi selezionati da questo set filtrato.
In una query vettoriale è preFilter la modalità predefinita perché favorisce il richiamo e la qualità rispetto alla latenza.
Funzionamento di questa modalità
In ogni shard, applicare il predicato del filtro durante l'attraversamento HNSW, espandendo il grafico fino a trovare
kcandidati.Produrre i migliori
krisultati locali prefiltrati per shard.Aggregare i risultati filtrati in un set di risultati principali
kglobale.
Effetto di questa modalità
L'algoritmo di attraversamento amplia l'ambito di ricerca per identificare più candidati filtrati, soprattutto se il filtro è selettivo. In questo modo si ottengono i risultati di primo livellok più simili in tutti gli shard. Ogni partizione identifica i k risultati che soddisfano il predicato del filtro.
La prefiltrazione garantisce che k i risultati vengano restituiti se presenti nell'indice. Per i filtri altamente selettivi, ciò può causare l'attraversamento di una parte significativa del grafico, aumentando i costi di calcolo e la latenza riducendo al contempo la velocità effettiva. Se il filtro è altamente selettivo (ha pochissime corrispondenze), è consigliabile usare exhaustive: true per eseguire ricerche complete.
Tabella di confronto
| Modalità | Richiamo (risultati filtrati) | Costo computazionale | Rischio di falsi negativi | Quando usare |
|---|---|---|---|---|
preFilter |
Molto alto | Più alto (aumenta con la selettività e la complessità dei filtri) | Nessun rischio |
Impostazione predefinita consigliata per tutti gli scenari, in particolare quando il richiamo è critico (domini di ricerca sensibili), quando si usano filtri selettivi o quando si usa un numero ridotto kdi . |
postFilter |
Da medio a alto (diminuisce con la selettività del filtro) | Simile a non filtrato, ma aumenta con complessità del filtro | Moderare (può perdere corrispondenze per shard) | Opzione per i filtri che non sono troppo selettivi e per le query più elevatek . |
strictPostFilter |
Più basso (diminuisce più rapidamente con la selettività del filtro) | Simile a non filtrato | Massimo (può restituire zero risultati per filtri selettivi o piccoli k) |
Un'opzione per le applicazioni di ricerca sfaccettata in cui la visualizzazione di più risultati dopo l'applicazione di un filtro influisce sull'esperienza dell'utente più del rischio di falsi negativi. Non usare con valori k piccoli. |
Test di benchmark della prefiltrazione e del postfiltro
Importante
Questa sezione si applica al prefiltro e al postfiltro, non al postfiltro rigoroso.
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, 1.536 dimensioni)
- Medio (1 milione di documenti, indice da 25 GB, 1.536 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 2023-11-01 sintassi .
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, non alla complessità del filtro.
I risultati sono stati misurati nelle query al secondo (QPS).
Punti Chiave
Il prefiltramento è quasi sempre più lento rispetto al postfiltro, tranne per gli indici di piccole dimensioni in cui le prestazioni sono approssimativamente uguali.
Nei set di dati più grandi, il prefiltramento è l'ordine di grandezza più lento.
Perché il prefiltro è il valore predefinito se è quasi sempre più lento? La prefiltrazione garantisce che i risultati
kvengano restituiti se presenti nell'indice, in cui la distorsione favorisce il richiamo e la precisione rispetto alla velocità.Usare la postfiltrazione se:
Dare priorità alla velocità rispetto alla selezione (il postfiltro può restituire meno risultati di
k).Usare filtri che non sono eccessivamente selettivi.
Disporre di indici di dimensioni sufficienti in modo che le prestazioni di prefiltrazione non siano accettabili.
Dettagli
Dato un set di dati con 100.000 vettori a 1.536 dimensioni:
Quando si filtrano più di 30% del set di dati, i prefiltri e i postfiltri erano confrontabili.
Quando si filtrano meno di 0,1% del set di dati, il prefiltro era di circa 50% più lento rispetto al postfiltro.
Dato un set di dati con 1 milione di vettori a 1.536 dimensioni:
Quando si filtrano più di 30% del set di dati, il prefiltramento è di circa 30% più lento.
Quando si filtrano meno di 2% del set di dati, il filtro preliminare era circa sette volte più lento.
Dato un set di dati con 1 miliardo di vettori a 96 dimensioni:
Quando si filtrano più di 5% del set di dati, il prefiltramento era di circa 50% più lento.
Quando si filtrano meno di 10% del set di dati, il prefiltro era circa sette volte più lento.
Il grafico seguente mostra il QPS relativo del prefiltro, calcolato come QPS prefiltro diviso per QPS postfiltro.
L'asse verticale rappresenta le prestazioni relative del prefiltro rispetto al postfiltro, espresso come rapporto di QPS (query al secondo). Per esempio:
- Il valore
0.0indica che il prefiltro è 100% più lento rispetto al postfiltro. - Il valore
0.5indica che il prefiltro è 50% più lento. - Un valore di
1.0indica che il prefiltro e il post filtro sono equivalenti.
L'asse orizzontale rappresenta la velocità di filtro o la percentuale di documenti candidati dopo l'applicazione del filtro. Ad esempio, una frequenza di 1.00% indica che i criteri di filtro hanno selezionato l'uno per cento del corpus di ricerca.