Generazione aumentata di recupero (RAG) in Azure AI Search

Il recupero della generazione aumentata (RAG) è un'architettura che aumenta le funzionalità di un modello LLM (Large Language Model) come ChatGPT aggiungendo un sistema di recupero delle informazioni che fornisce dati di base. L'aggiunta di un sistema di recupero delle informazioni consente di controllare i dati a terra usati da un LLM quando formula una risposta. Per una soluzione aziendale, l'architettura RAG significa che è possibile vincolare l'intelligenza artificiale generativa ai contenuti aziendali originati da documenti e immagini vettorializzati e altri formati di dati se si hanno modelli di incorporamento per tale contenuto.

La decisione sul sistema di recupero delle informazioni da usare è fondamentale perché determina gli input per l'LLM. Il sistema di recupero delle informazioni deve fornire:

  • Strategie di indicizzazione che caricano e aggiornano su larga scala, per tutto il contenuto, con la frequenza necessaria.

  • Funzionalità di query e ottimizzazione della pertinenza. Il sistema deve restituire i risultati pertinenti , nei formati in formato breve necessari per soddisfare i requisiti di lunghezza del token degli input LLM.

  • Sicurezza, copertura globale e affidabilità sia per i dati che per le operazioni.

  • Integrazione con modelli di incorporamento per l'indicizzazione e modelli di analisi del linguaggio o modelli di comprensione del linguaggio per il recupero.

Ricerca di intelligenza artificiale di Azure è una soluzione collaudata per il recupero delle informazioni in un'architettura rag. Offre funzionalità di indicizzazione e query, con l'infrastruttura e la sicurezza del cloud di Azure. Tramite il codice e altri componenti, è possibile progettare una soluzione RAG completa che include tutti gli elementi per l'intelligenza artificiale generativa sui contenuti proprietari.

Nota

Novità dei concetti relativi a copilota e RAG? Guarda La ricerca vettoriale e lo stato del recupero dell'arte per le app generative per intelligenza artificiale.

Microsoft include diverse implementazioni predefinite per l'uso di Ricerca di intelligenza artificiale di Azure in una soluzione RAG.

Gli approcci curati semplificano l'avvio, ma per un maggiore controllo sull'architettura è necessaria una soluzione personalizzata. Questi modelli creano soluzioni end-to-end in:

Nella parte restante di questo articolo viene illustrato il modo in cui Ricerca intelligenza artificiale di Azure si integra in una soluzione rag personalizzata.

Un riepilogo generale del modello è simile al seguente:

  • Iniziare con una domanda o una richiesta dell'utente (richiesta).
  • Inviarlo a Ricerca di intelligenza artificiale di Azure per trovare informazioni pertinenti.
  • Inviare i primi risultati della ricerca classificati all'LLM.
  • Usare le funzionalità di comprensione e ragionamento del linguaggio naturale di LLM per generare una risposta al prompt iniziale.

Ricerca di intelligenza artificiale di Azure fornisce input al prompt LLM, ma non esegue il training del modello. Nell'architettura RAG non è disponibile alcun training aggiuntivo. LLM viene sottoposto a training preliminare usando dati pubblici, ma genera risposte aumentate dalle informazioni del retriever.

I modelli RAG che includono Ricerca intelligenza artificiale di Azure hanno gli elementi indicati nella figura seguente.

Diagramma dell'architettura del recupero delle informazioni con ricerca e ChatGPT.

  • Esperienza utente dell'app (app Web) per l'esperienza utente
  • Server app o agente di orchestrazione (livello di integrazione e coordinamento)
  • Ricerca di intelligenza artificiale di Azure (sistema di recupero delle informazioni)
  • Azure OpenAI (LLM per intelligenza artificiale generativa)

L'app Web offre l'esperienza utente, fornendo la presentazione, il contesto e l'interazione dell'utente. Domande o richieste da un utente iniziano qui. Gli input passano attraverso il livello di integrazione, passando prima al recupero delle informazioni per ottenere i risultati della ricerca, ma anche a LLM per impostare il contesto e la finalità.

Il server dell'app o l'agente di orchestrazione è il codice di integrazione che coordina gli handoff tra il recupero delle informazioni e l'LLM. Un'opzione consiste nell'usare LangChain per coordinare il flusso di lavoro. LangChain si integra con Ricerca di intelligenza artificiale di Azure, semplificando l'inclusione di Ricerca di intelligenza artificiale di Azure come retriever nel flusso di lavoro. Il kernel semantico è un'altra opzione.

Il sistema di recupero delle informazioni fornisce l'indice ricercabile, la logica di query e il payload (risposta di query). L'indice di ricerca può contenere vettori o contenuti non di filtro. Anche se la maggior parte degli esempi e delle demo include campi vettoriali, non è un requisito. La query viene eseguita usando il motore di ricerca esistente in Ricerca di intelligenza artificiale di Azure, che può gestire le query con parole chiave (o termine) e vettoriali. L'indice viene creato in anticipo, in base a uno schema definito e caricato con il contenuto originato da file, database o archiviazione.

LLM riceve il prompt originale, oltre ai risultati di Ricerca di intelligenza artificiale di Azure. LLM analizza i risultati e formula una risposta. Se LLM è ChatGPT, l'interazione dell'utente potrebbe essere una conversazione avanti e indietro. Se si usa Davinci, il prompt potrebbe essere una risposta completamente composta. Una soluzione di Azure usa probabilmente Azure OpenAI, ma non esiste alcuna dipendenza rigida da questo servizio specifico.

Ricerca di intelligenza artificiale di Azure non fornisce l'integrazione LLM nativa per i flussi di richiesta o la conservazione delle chat, quindi è necessario scrivere codice che gestisce l'orchestrazione e lo stato. È possibile esaminare l'origine demo (Azure-Samples/azure-search-openai-demo) per un progetto di ciò che comporta una soluzione completa. È anche consigliabile usare Azure AI Studio o Azure OpenAI Studio per creare soluzioni di Ricerca di intelligenza artificiale di Azure basate su RAG che si integrano con IMS.

In Ricerca di intelligenza artificiale di Azure tutti i contenuti ricercabili vengono archiviati in un indice di ricerca ospitato nel servizio di ricerca. Un indice di ricerca è progettato per query veloci con tempi di risposta in millisecondi, pertanto esistono strutture di dati interne per supportare tale obiettivo. A tale scopo, un indice di ricerca archivia il contenuto indicizzato e non tutti i file di contenuto come interi PDF o immagini. Internamente, le strutture di dati includono indici invertiti di testo con token, indici vettoriali per incorporamenti e testo non modificato per i casi in cui è necessaria la corrispondenza verbatim ( ad esempio, nei filtri, ricerca fuzzy, query di espressioni regolari).

Quando si configurano i dati per la soluzione RAG, si usano le funzionalità che creano e caricano un indice in Ricerca di intelligenza artificiale di Azure. Un indice include campi che duplicano o rappresentano il contenuto di origine. Un campo di indice può essere un semplice trasferimento (un titolo o una descrizione in un documento di origine diventa un titolo o una descrizione in un indice di ricerca) oppure un campo potrebbe contenere l'output di un processo esterno, ad esempio l'elaborazione di vettori o competenze che genera una rappresentazione o una descrizione di testo di un'immagine.

Poiché probabilmente si conosce il tipo di contenuto da cercare, considerare le funzionalità di indicizzazione applicabili a ogni tipo di contenuto:

Tipo di contenuto Indicizzato come Funzionalità
Testo token, testo non modificato Gli indicizzatori possono estrarre testo normale da altre risorse di Azure, ad esempio Archiviazione di Azure e Cosmos DB. È anche possibile eseguire il push di qualsiasi contenuto JSON in un indice. Per modificare il testo in anteprima, usare analizzatori e normalizzatori per aggiungere l'elaborazione lessicale durante l'indicizzazione. Le mappe sinonimiche sono utili se i documenti di origine mancano terminologia che potrebbero essere usati in una query.
Testo vettori 1 Il testo può essere suddiviso in blocchi e vettorializzato esternamente e quindi indicizzato come campi vettoriali nell'indice.
image token, testo non modificato 2 Le competenze per OCR e Analisi immagini possono elaborare immagini per il riconoscimento del testo o le caratteristiche dell'immagine. Le informazioni sull'immagine vengono convertite in testo ricercabile e aggiunte all'indice. Le competenze hanno un requisito dell'indicizzatore.
image vettori 1 Le immagini possono essere vettorializzate esternamente per una rappresentazione matematica del contenuto dell'immagine e quindi indicizzate come campi vettoriali nell'indice. È possibile usare un modello open source come OpenAI CLIP per vettorizzare testo e immagini nello stesso spazio di incorporamento.

1 La funzionalità disponibile a livello generale del supporto vettoriale richiede la chiamata di altre librerie o modelli per la suddivisione in blocchi di dati e la vettorizzazione. Tuttavia, la vettorializzazione integrata (anteprima) incorpora questi passaggi. Per esempi di codice che mostrano entrambi gli approcci, vedere repository azure-search-vectors.

2Le competenze sono il supporto predefinito per l'arricchimento tramite intelligenza artificiale. Per OCR e Analisi immagini, la pipeline di indicizzazione effettua una chiamata interna alle API visione artificiale di Azure. Queste competenze passano un'immagine estratta all'intelligenza artificiale di Azure per l'elaborazione e ricevono l'output come testo indicizzato da Ricerca di intelligenza artificiale di Azure.

I vettori offrono la soluzione migliore per il contenuto diverso (più formati di file e lingue) perché il contenuto è espresso universalmente nelle rappresentazioni matematiche. I vettori supportano anche la ricerca di somiglianza: la corrispondenza sulle coordinate più simili alla query vettoriale. Rispetto alla ricerca di parole chiave (o ricerca di termini) che corrisponde ai termini con token, la ricerca di somiglianza è più sfumata. È una scelta migliore se si verificano ambiguità o requisiti di interpretazione nel contenuto o nelle query.

Quando i dati si trovano in un indice di ricerca, usare le funzionalità di query di Ricerca intelligenza artificiale di Azure per recuperare il contenuto.

In un modello non RAG, le query effettuano un round trip da un client di ricerca. La query viene inviata, viene eseguita su un motore di ricerca e la risposta restituita all'applicazione client. La risposta, o i risultati della ricerca, sono costituiti esclusivamente dal contenuto verbatim trovato nell'indice.

In un modello RAG, le query e le risposte sono coordinate tra il motore di ricerca e l'LLM. La domanda o la query di un utente viene inoltrata sia al motore di ricerca che all'LLM come richiesta. I risultati della ricerca vengono restituiti dal motore di ricerca e vengono reindirizzati a un LLM. La risposta che lo restituisce all'utente è l'intelligenza artificiale generativa, ovvero una somma o una risposta dall'LLM.

Non esiste alcun tipo di query in Ricerca di intelligenza artificiale di Azure, nemmeno semantica o ricerca vettoriale, che compone nuove risposte. Solo l'LLM fornisce intelligenza artificiale generativa. Ecco le funzionalità di Ricerca di intelligenza artificiale di Azure usate per formulare query:

Funzionalità query Scopo Perché usarlo
Sintassi Lucene semplice o completa Esecuzione di query su testo e contenuto numerico non ettore La ricerca full-text è ideale per corrispondenze esatte, anziché corrispondenze simili. Le query di ricerca full-text vengono classificate usando l'algoritmo BM25 e supportano l'ottimizzazione della pertinenza tramite i profili di punteggio. Supporta anche filtri e facet.
Filtri e facet Si applica solo ai campi di testo o numerico (non operatore). Riduce l'area della superficie di ricerca in base ai criteri di inclusione o esclusione. Aggiunge precisione alle query.
Classificazione semantica Classifica nuovamente un set di risultati BM25 usando modelli semantici. Produce didascalia di forma breve e risposte utili come input LLM. Più semplice rispetto ai profili di punteggio e, a seconda del contenuto, una tecnica più affidabile per l'ottimizzazione della pertinenza.
Ricerca vettoriale Esecuzione di query su campi vettoriali per la ricerca di somiglianza, in cui la stringa di query è uno o più vettori. I vettori possono rappresentare tutti i tipi di contenuto, in qualsiasi linguaggio.
Ricerca ibrida Combina una o tutte le tecniche di query precedenti. Le query vector e nonvector vengono eseguite in parallelo e vengono restituite in un set di risultati unificato. I miglioramenti più significativi in termini di precisione e richiamo sono tramite query ibride.

Strutturare la risposta alla query

La risposta di una query fornisce l'input all'LLM, quindi la qualità dei risultati della ricerca è fondamentale per il successo. I risultati sono un set di righe tabulare. La composizione o la struttura dei risultati dipende da:

  • Campi che determinano le parti dell'indice incluse nella risposta.
  • Righe che rappresentano una corrispondenza dall'indice.

I campi vengono visualizzati nei risultati della ricerca quando l'attributo è "recuperabile". Una definizione di campo nello schema dell'indice ha attributi e determina se un campo viene usato in una risposta. Solo i campi "recuperabili" vengono restituiti nei risultati della query full-text o vettoriale. Per impostazione predefinita, vengono restituiti tutti i campi "recuperabili", ma è possibile usare "select" per specificare un subset. Oltre a "recuperabile", non vi sono restrizioni sul campo. I campi possono essere di qualsiasi lunghezza o tipo. Per quanto riguarda la lunghezza, non esiste un limite massimo di lunghezza del campo in Ricerca di intelligenza artificiale di Azure, ma esistono limiti per le dimensioni di una richiesta API.

Le righe sono corrispondenze alla query, classificate per pertinenza, somiglianza o entrambe. Per impostazione predefinita, i risultati sono limitati alle prime 50 corrispondenze per la ricerca full-text o le corrispondenze k-nearest-neighbor per la ricerca vettoriale. È possibile modificare le impostazioni predefinite per aumentare o ridurre il limite massimo di 1.000 documenti. È anche possibile usare i parametri di paging superiore e ignorare il paging per recuperare i risultati come una serie di risultati di paging.

Classificazione per pertinenza

Quando si lavora con processi complessi, una grande quantità di dati e le aspettative per le risposte in millisecondi, è fondamentale che ogni passaggio aggiunga valore e migliora la qualità del risultato finale. Sul lato del recupero delle informazioni, l'ottimizzazione della pertinenza è un'attività che migliora la qualità dei risultati inviati all'LLM. Nei risultati devono essere inclusi solo i documenti di corrispondenza più rilevanti o più simili.

La pertinenza si applica alla ricerca di parole chiave (non ctor) e alle query ibride (sui campi non di filtro). In Ricerca di intelligenza artificiale di Azure non esiste alcuna ottimizzazione della pertinenza per le query di ricerca e vettore di somiglianza. La classificazione BM25 è l'algoritmo di classificazione per la ricerca full-text.

L'ottimizzazione della pertinenza è supportata tramite funzionalità che migliorano la classificazione BM25. Questi approcci includono:

  • Profili di punteggio che aumentano il punteggio di ricerca se le corrispondenze vengono trovate in un campo di ricerca specifico o in altri criteri.
  • Classificazione semantica che classifica nuovamente un set di risultati BM25, usando modelli semantici da Bing per riordinare i risultati per una migliore semantica per la query originale.

In confronto e test di benchmark, le query ibride con campi di testo e vettore, integrate con la classificazione semantica sui risultati classificati in BM25, producono i risultati più rilevanti.

Codice di esempio di una query di Ricerca di intelligenza artificiale di Azure per scenari RAG

Il codice seguente viene copiato dal file retrievethenread.py da un sito demo. content Produce per l'LLM dai risultati della ricerca di query ibrida. È possibile scrivere una query più semplice, ma questo esempio include la ricerca vettoriale e la ricerca di parole chiave con reranking semantico e controllo ortografico. Nella demo questa query viene usata per ottenere il contenuto iniziale.

# Use semantic ranker if requested and if retrieval mode is text or hybrid (vectors + text)
if overrides.get("semantic_ranker") and has_text:
    r = await self.search_client.search(query_text,
                                  filter=filter,
                                  query_type=QueryType.SEMANTIC,
                                  query_language="en-us",
                                  query_speller="lexicon",
                                  semantic_configuration_name="default",
                                  top=top,
                                  query_caption="extractive|highlight-false" if use_semantic_captions else None,
                                  vector=query_vector,
                                  top_k=50 if query_vector else None,
                                  vector_fields="embedding" if query_vector else None)
else:
    r = await self.search_client.search(query_text,
                                  filter=filter,
                                  top=top,
                                  vector=query_vector,
                                  top_k=50 if query_vector else None,
                                  vector_fields="embedding" if query_vector else None)
if use_semantic_captions:
    results = [doc[self.sourcepage_field] + ": " + nonewlines(" . ".join([c.text for c in doc['@search.captions']])) async for doc in r]
else:
    results = [doc[self.sourcepage_field] + ": " + nonewlines(doc[self.content_field]) async for doc in r]
content = "\n".join(results)

Codice di integrazione e llms

Una soluzione RAG che include Ricerca di intelligenza artificiale di Azure richiede altri componenti e codice per creare una soluzione completa. Mentre le sezioni precedenti illustrano il recupero delle informazioni tramite Ricerca di intelligenza artificiale di Azure e quali funzionalità vengono usate per creare ed eseguire query su contenuto ricercabile, questa sezione introduce l'integrazione e l'interazione LLM.

I notebook nei repository demo rappresentano un ottimo punto di partenza perché mostrano modelli per passare i risultati della ricerca a un LLM. La maggior parte del codice in una soluzione RAG è costituita da chiamate a LLM, quindi è necessario sviluppare una conoscenza del funzionamento di tali API, che non rientra nell'ambito di questo articolo.

Il blocco di cella seguente nel notebook chat-read-retrieve-read.ipynb mostra le chiamate di ricerca nel contesto di una sessione di chat:

# Execute this cell multiple times updating user_input to accumulate chat history
user_input = "Does my plan cover annual eye exams?"

# Exclude category, to simulate scenarios where there's a set of docs you can't see
exclude_category = None

if len(history) > 0:
    completion = openai.Completion.create(
        engine=AZURE_OPENAI_GPT_DEPLOYMENT,
        prompt=summary_prompt_template.format(summary="\n".join(history), question=user_input),
        temperature=0.7,
        max_tokens=32,
        stop=["\n"])
    search = completion.choices[0].text
else:
    search = user_input

# Alternatively simply use search_client.search(q, top=3) if not using semantic ranking
print("Searching:", search)
print("-------------------")
filter = "category ne '{}'".format(exclude_category.replace("'", "''")) if exclude_category else None
r = search_client.search(search, 
                         filter=filter,
                         query_type=QueryType.SEMANTIC, 
                         query_language="en-us", 
                         query_speller="lexicon", 
                         semantic_configuration_name="default", 
                         top=3)
results = [doc[KB_FIELDS_SOURCEPAGE] + ": " + doc[KB_FIELDS_CONTENT].replace("\n", "").replace("\r", "") for doc in r]
content = "\n".join(results)

prompt = prompt_prefix.format(sources=content) + prompt_history + user_input + turn_suffix

completion = openai.Completion.create(
    engine=AZURE_OPENAI_CHATGPT_DEPLOYMENT, 
    prompt=prompt, 
    temperature=0.7, 
    max_tokens=1024,
    stop=["<|im_end|>", "<|im_start|>"])

prompt_history += user_input + turn_suffix + completion.choices[0].text + "\n<|im_end|>" + turn_prefix
history.append("user: " + user_input)
history.append("assistant: " + completion.choices[0].text)

print("\n-------------------\n".join(history))
print("\n-------------------\nPrompt:\n" + prompt)

Come iniziare

  • Usare Azure AI Studio per creare un indice di ricerca.

  • Usare Azure OpenAI Studio e "bring your own data" per sperimentare richieste su un indice di ricerca esistente in un playground. Questo passaggio consente di decidere quale modello usare e illustra il funzionamento dell'indice esistente in uno scenario rag.

  • L'acceleratore di soluzioni "Chat with your data" (Chat with your data) creato dal team di Ricerca di intelligenza artificiale di Azure consente di creare una soluzione RAG personalizzata.

  • I modelli di app chat aziendali distribuiscono risorse, codice e dati di base di esempio usando documenti fittizi del piano di integrità per Contoso e Northwind. Questa soluzione end-to-end offre un'app di chat operativa in meno di 15 minuti. Il codice per questi modelli è la demo azure-search-openai-demo in diverse presentazioni. I collegamenti seguenti forniscono versioni specifiche della lingua:

  • Esaminare i concetti e le strategie di indicizzazione per determinare come inserire e aggiornare i dati. Decidere se usare la ricerca vettoriale, la ricerca di parole chiave o la ricerca ibrida. Il tipo di contenuto che è necessario cercare e il tipo di query da eseguire determina la progettazione dell'indice.

  • Esaminare la creazione di query per altre informazioni sulla sintassi e i requisiti delle richieste di ricerca.

Nota

Alcune funzionalità di Ricerca intelligenza artificiale di Azure sono destinate all'interazione umana e non sono utili in un modello rag. In particolare, è possibile ignorare il completamento automatico e i suggerimenti. Altre funzionalità, ad esempio facet e orderby, potrebbero essere utili, ma potrebbero non essere comuni in uno scenario di rag.

Vedi anche