Condividi tramite


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 a contenuti aziendali originati da documenti e immagini vettorializzati e altri formati di dati se si hanno dei modelli di incorporamento per tali contenuti.

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 risultati pertinenti, nei formati brevi 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

Non si ha familiarità con i concetti di copilota e RAG? Guardare Ricerca vettoriale e 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:

Se gli strumenti e i modelli non soddisfano i requisiti dell'applicazione, è possibile creare una soluzione RAG personalizzata usando le API di Azure AI Search. 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).
  • Inviarla a Ricerca di intelligenza artificiale di Azure per trovare informazioni pertinenti.
  • Restituire i risultati della ricerca classificati in alto a un 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, in questo caso Azure AI Search.

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. Le soluzioni comuni includono 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. LlamaIndex e Semantic Kernel sono altre opzioni.

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 azure AI 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 interi 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:

Content type 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 le mappe sinonimi sono utili se nei documenti di partenza manca la terminologia che potrebbe essere utilizzata in una query.
Testo vettori 1 Il testo può essere suddiviso in blocchi e vettorizzato in una pipeline dell'indicizzatore oppure gestito 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 in una pipeline dell'indicizzatore o gestite esternamente per una rappresentazione matematica del contenuto dell'immagine e quindi indicizzate come campi vettoriali nell'indice. È possibile usare Visione di Azure AI multimodale o un modello open source come OpenAI CLIP per vettorizzare testo e immagini nello stesso spazio di incorporamento.

1 Ricerca di intelligenza artificiale di Azure offre la suddivisione dei dati integrata e la vettorizzazione, ma è necessario prendere una dipendenza da indicizzatori e set di competenze. Se non è possibile usare un indicizzatore, il kernel semantico di Microsoft o altre offerte della community può essere utile con una soluzione stack completa. Per esempi di codice che mostrano entrambi gli approcci, vedere repository azure-search-vectors.

2 Competenze sono il supporto predefinito per l'intelligenza artificiale applicata. 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. Le competenze vengono usate anche per la suddivisione in blocchi di dati integrata (competenza Suddivisione testo) e l'incorporamento integrato (competenze che chiamano l'integrazione di Visione artificiale di Azure, Azure OpenAI e i modelli nel catalogo dei modelli di Azure AI Studio).

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 viene 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 vettore 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.
Classificatore semantico Classifica nuovamente un set di risultati BM25 usando modelli semantici. Produce sottotitoli in formato 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 vettoriali e non vettoriali 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 degli 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 "seleziona" 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 vicini più prossimi 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.

Ottimizzare la pertinenza e il richiamo

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 migliori 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.

Ecco alcuni suggerimenti per massimizzare la pertinenza e il richiamo:

  • Le query ibride che combinano la ricerca con parole chiave (non vettoriali) e la ricerca vettoriale offrono il richiamo massimo quando gli input sono gli stessi. In una query ibrida, se si raddoppia lo stesso input, una stringa di testo e il relativo equivalente vettore generano query parallele per le parole chiave e la ricerca di somiglianza, restituendo le corrispondenze più rilevanti da ogni tipo di query in un set di risultati unificato.

  • Le query ibride possono anche essere estese. È possibile eseguire ricerche di somiglianza su contenuto dettagliato in blocchi e ricerca di parole chiave su nomi, tutti nella stessa richiesta.

  • L'ottimizzazione della pertinenza è supportata tramite:

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

Codice di esempio per un flusso di lavoro RAG

Il codice Python seguente illustra i componenti essenziali di un flusso di lavoro RAG in Ricerca di intelligenza artificiale di Azure. È necessario configurare i client, definire una richiesta di sistema e fornire una query. Il prompt indica all'LLM di usare solo i risultati della query e come restituire i risultati. Per altri passaggi basati su questo esempio, vedere questa guida introduttiva di Rag.

Per il cloud Azure per enti pubblici, modificare l'endpoint API nel provider di token in "https://cognitiveservices.azure.us/.default".

# Set up the query for generating responses
from azure.identity import DefaultAzureCredential
from azure.identity import get_bearer_token_provider
from azure.search.documents import SearchClient
from openai import AzureOpenAI

credential = DefaultAzureCredential()
token_provider = get_bearer_token_provider(credential, "https://cognitiveservices.azure.com/.default")
openai_client = AzureOpenAI(
    api_version="2024-06-01",
    azure_endpoint=AZURE_OPENAI_ACCOUNT,
    azure_ad_token_provider=token_provider
)

search_client = SearchClient(
    endpoint=AZURE_SEARCH_SERVICE,
    index_name="hotels-sample-index",
    credential=credential
)

# This prompt provides instructions to the model. 
# The prompt includes the query and the source, which are specified further down in the code.
GROUNDED_PROMPT="""
You are a friendly assistant that recommends hotels based on activities and amenities.
Answer the query using only the sources provided below in a friendly and concise bulleted manner.
Answer ONLY with the facts listed in the list of sources below.
If there isn't enough information below, say you don't know.
Do not generate answers that don't use the sources below.
Query: {query}
Sources:\n{sources}
"""

# The query is sent to the search engine, but it's also passed in the prompt
query="Can you recommend a few hotels near the ocean with beach access and good views"

# Retrieve the selected fields from the search index related to the question
search_results = search_client.search(
    search_text=query,
    top=5,
    select="Description,HotelName,Tags"
)
sources_formatted = "\n".join([f'{document["HotelName"]}:{document["Description"]}:{document["Tags"]}' for document in search_results])

response = openai_client.chat.completions.create(
    messages=[
        {
            "role": "user",
            "content": GROUNDED_PROMPT.format(query=query, sources=sources_formatted)
        }
    ],
    model="gpt-35"
)

print(response.choices[0].message.content)

Codice di integrazione e LLM

Una soluzione RAG che include Ricerca di intelligenza artificiale di Azure può sfruttare le funzionalità predefinite di suddivisione in blocchi e vettorizzazione dei dati, oppure è possibile creare delle piattaforme personalizzate usando piattaforme come Semantic Kernel, LangChain o LlamaIndex.

I notebook nel repository demo sono un ottimo punto di partenza perché mostrano i modelli per l'integrazione LLM. Gran 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.

Come iniziare

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 funzionalità come 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