Proiezioni di indici in Ricerca di intelligenza artificiale di Azure

Importante

Le proiezioni di indici sono in anteprima pubblica in condizioni supplementari per l'utilizzo. È disponibile tramite le API REST di portale di Azure, 2023-10-01-Preview, portale di Azure e librerie client beta aggiornate per includere la funzionalità.

Le proiezioni di indici sono un componente di una definizione del set di competenze che definisce la forma di un indice secondario, supportando un modello di indice uno-a-molti, in cui il contenuto di una pipeline di arricchimento può essere usato come destinazione di più indici.

Le proiezioni di indici accettano contenuti arricchiti dall'intelligenza artificiale generati da una pipeline di arricchimento e lo indicizzano in un indice secondario (diverso da quello di destinazione di un indicizzatore per impostazione predefinita) nel servizio di ricerca. Le proiezioni di indici consentono inoltre di modificare la forma dei dati prima di indicizzarli, in modo univoco che consente di separare una matrice di elementi arricchiti in più documenti di ricerca nell'indice di destinazione, altrimenti nota come indicizzazione "uno-a-molti". L'indicizzazione "Uno-a-molti" è utile per gli scenari di suddivisione in blocchi dei dati, in cui potrebbe essere necessario un indice primario per il contenuto non suddiviso in blocchi e un indice secondario per blocchi.

Se in passato sono state usate competenze cognitive, si sa già che i set di competenze creano contenuti arricchiti. I set di competenze spostano un documento attraverso una sequenza di arricchimenti che richiamano trasformazioni atomiche, ad esempio il riconoscimento di entità o la traduzione di testo. Per impostazione predefinita, un documento elaborato all'interno di un set di competenze esegue il mapping a un singolo documento nell'indice di ricerca. Ciò significa che se si esegue la suddivisione in blocchi di un testo di input e quindi si eseguono arricchimenti in ogni blocco, il risultato nell'indice quando viene eseguito il mapping tramite outputFieldMappings è una matrice degli arricchimenti generati. Con le proiezioni di indice, si definisce un contesto in corrispondenza del quale eseguire il mapping di ogni blocco di dati arricchiti al proprio documento di ricerca. In questo modo è possibile applicare un mapping uno-a-molti dei dati arricchiti di un documento all'indice di ricerca.

Definizione delle proiezioni di indici

Le proiezioni di indice vengono definite all'interno di una definizione del set di competenze e vengono definite principalmente come matrice di selettori, in cui ogni selettore corrisponde a un indice di destinazione diverso nel servizio di ricerca. Ogni selettore richiede i parametri seguenti come parte della relativa definizione:

  • targetIndexName: nome dell'indice nel servizio di ricerca in cui viene inserito l'indice dei dati di proiezione dell'indice.
  • parentKeyFieldName: nome del campo nell'indice di destinazione che contiene il valore della chiave per il documento padre.
  • sourceContext: annotazione di arricchimento che definisce la granularità in corrispondenza della quale eseguire il mapping dei dati in singoli documenti di ricerca. Per altre informazioni, vedere Contesto delle competenze e linguaggio di annotazione di input.
  • mappings: matrice di mapping di dati arricchiti ai campi nell'indice di ricerca. Ogni mapping è costituito da:
    • name: nome del campo nell'indice di ricerca in cui devono essere indicizzati i dati,
    • source: percorso di annotazione di arricchimento da cui devono essere estratti i dati.

Ognuno mapping può anche definire in modo ricorsivo i dati con un campo e inputs facoltativosourceContext, simile all'archivio conoscenze o alla competenza shaper. Questi parametri consentono di modellare i dati da indicizzare in campi di tipo Edm.ComplexType nell'indice di ricerca.

L'indice targetIndexName definito nel parametro presenta i requisiti seguenti:

  • Deve essere già stato creato nel servizio di ricerca prima che venga creato il set di competenze contenente la definizione delle proiezioni di indice.
  • Deve contenere un campo con il nome definito nel parentKeyFieldName parametro . Questo campo deve essere di tipo Edm.String, non può essere il campo chiave e deve essere impostato su true.
  • Il campo chiave deve avere la proprietà searchable impostata su true e essere definita con l'analizzatore keyword .
  • I campi devono essere definiti per ognuno degli nameoggetti definiti in mappings, nessuno dei quali può essere il campo chiave.

Di seguito è riportato un esempio di payload per una definizione di proiezioni di indice che è possibile usare per proiettare singoli output di pagine dalla competenza Split come documenti personalizzati nell'indice di ricerca.

"indexProjections": {
    "selectors": [
        {
            "targetIndexName": "myTargetIndex",
            "parentKeyFieldName": "ParentKey",
            "sourceContext": "/document/pages/*",
            "mappings": [
                {
                    "name": "chunk",
                    "source": "/document/pages/*"
                }
            ]
        }
    ]
}

Gestione dei documenti padre

Poiché le proiezioni di indici generano in modo efficace documenti "figlio" per ogni documento "padre" che viene eseguito attraverso un set di competenze, sono disponibili anche le opzioni seguenti per gestire l'indicizzazione dei documenti "padre".

  • Per mantenere i documenti padre e figlio in indici separati, è sufficiente assicurarsi che per la definizione dell'indicizzatore targetIndexName sia diverso da quello definito nel selettore di proiezione dell'indice targetIndexName .

  • Per indicizzare documenti padre e figlio nello stesso indice, è necessario assicurarsi che lo schema per l'indice di destinazione funzioni sia con la definizione dell'indicizzatore fieldMappingsoutputFieldMappings che con la definizione dell'indicizzatore e con il selettore di proiezione dell'indice mappings . È quindi sufficiente fornire lo stesso targetIndexName per la definizione dell'indicizzatore e il selettore di proiezione dell'indice.

  • Per ignorare i documenti padre e solo indicizzare i documenti figlio, è comunque necessario specificare una targetIndexName nella definizione dell'indicizzatore ( è sufficiente specificare la stessa operazione eseguita per il selettore di proiezione dell'indice). Definire quindi un oggetto separato parameters accanto alla selectors definizione con una projectionMode chiave impostata su skipIndexingParentDocuments, come illustrato di seguito:

    "indexProjections": {
        "selectors": [
            ...
        ],
        "parameters": {
            "projectionMode": "skipIndexingParentDocuments"
        }
    }
    

La versione 2023-10-01-Preview dell'API REST può essere usata per creare proiezioni di indici tramite aggiunte a un set di competenze.

Ciclo di vita del contenuto

Se l'origine dati dell'indicizzatore supporta il rilevamento delle modifiche e l'eliminazione, il processo di indicizzazione può sincronizzare gli indici primari e secondari per rilevare tali modifiche.

Ogni volta che si esegue l'indicizzatore e il set di competenze, le proiezioni di indice vengono aggiornate se il set di competenze o i dati di origine sottostanti sono stati modificati. Tutte le modifiche prelevate dall'indicizzatore vengono propagate tramite il processo di arricchimento alle proiezioni nell'indice, assicurandosi che i dati proiettati siano una rappresentazione corrente del contenuto nell'origine dati di origine.

Nota

Anche se è possibile modificare manualmente i dati nei documenti proiettati usando l'API push dell'indice, tutte le modifiche verranno sovrascritte nella chiamata alla pipeline successiva, presupponendo che il documento nei dati di origine venga aggiornato.

Valore chiave proiettato

Ogni documento di proiezione dell'indice contiene una chiave di identificazione univoca generata dall'indicizzatore per garantire l'univocità e consentire il corretto funzionamento del rilevamento delle modifiche ed eliminazione. Questa chiave contiene i segmenti seguenti:

  • Hash casuale per garantire l'univocità. Questo hash viene modificato se il documento padre viene aggiornato tra le esecuzioni dell'indicizzatore.
  • Chiave del documento padre.
  • Percorso di annotazione di arricchimento che identifica il contesto da cui è stato generato il documento.

Ad esempio, se si suddivide un documento padre con il valore chiave "123" in quattro pagine e ognuna di queste pagine viene proiettata come documento proprio tramite proiezioni di indice, la chiave per la terza pagina di testo sarà simile a "01f07abfe7ed_123_pages_2". Se il documento padre viene quindi aggiornato per aggiungere una quinta pagina, la nuova chiave per la terza pagina potrebbe, ad esempio, essere "9d800bdacc0e_123_pages_2", poiché il valore hash casuale cambia tra le esecuzioni dell'indicizzatore anche se il resto dei dati di proiezione non è stato modificato.

Modifiche o aggiunte

Se un documento padre viene modificato in modo che i dati all'interno di un documento di indice proiettato vengano modificati (ad esempio se una parola è stata modificata in una determinata pagina ma non sono state aggiunte nuove pagine nette), i dati nell'indice di destinazione per tale proiezione specifica vengono aggiornati in modo da riflettere tale modifica.

Se un documento padre viene modificato in modo che siano presenti nuovi documenti figlio proiettati che non erano presenti in precedenza (un esempio sarebbe se al documento siano state aggiunte una o più pagine di testo), tali nuovi documenti figlio vengono aggiunti alla successiva esecuzione dell'indicizzatore.

In entrambi questi casi, tutti i documenti proiettati vengono aggiornati in modo da avere un nuovo valore hash nella chiave, indipendentemente dal fatto che il contenuto specifico sia stato aggiornato.

Deletions

Se un documento padre viene modificato in modo che un documento figlio generato dalle proiezioni di indice non esista più (un esempio è se un testo viene abbreviato in modo che ci siano meno blocchi rispetto a prima), il documento figlio corrispondente nell'indice di ricerca viene eliminato. Anche i documenti figlio rimanenti ottengono la chiave aggiornata per includere un nuovo valore hash, anche se il contenuto non è stato modificato in altro modo.

Se un documento padre viene eliminato completamente dall'origine dati, i documenti figlio corrispondenti vengono eliminati solo se l'eliminazione viene rilevata da un dataDeletionDetectionPolicy oggetto definito nella definizione dell'origine dati. Se non si dispone di un dataDeletionDetectionPolicy documento configurato ed è necessario eliminare un documento padre dall'origine dati, è necessario eliminare manualmente i documenti figlio se non sono più necessari.