Implementare la generazione di aumento del recupero usando indici vettoriali in Azure Cosmos DB basato su vCore per MongoDB
Usando sia Azure OpenAI che Azure Cosmos DB basato su vCore per MongoDB, è possibile implementare un sistema di generazione aumentata (RAG) di recupero. Questo sistema combina le funzionalità di ricerca vettoriale di Azure Cosmos DB per MongoDB basate su vCore con i modelli avanzati di intelligenza artificiale di Azure OpenAI per fornire risposte dettagliate in base ai risultati della ricerca. Questo approccio migliora significativamente la qualità e la pertinenza delle risposte generate dall'IA usando i propri dati.
Configurare Azure Cosmos DB basato su vCore per MongoDB per la ricerca vettoriale
La prima parte di un sistema rag (Retrieval Augmented Generation) prevede di porre una domanda e cercare elementi simili in base alla somiglianza del vettore. In altre parole, la domanda viene convertita in un vettore numerico e il sistema cerca i dati per gli elementi più simili a questo vettore.
Questo processo richiede innanzitutto di configurare Azure Cosmos DB per MongoDB basato su vCore per supportare la ricerca vettoriale. Questa configurazione prevede tre passaggi principali:
- Aggiungere campi vettoriali ai documenti per archiviare i relativi incorporamenti di dati di testo.
- Generare incorporamenti dai dati di testo del documento e archiviarli nei campi vettoriali.
- Creare indici vettoriali per questi campi vettoriali.
Verrà ora esaminato ogni passaggio.
Aggiungere campi vettoriali ai documenti
Per iniziare, aggiungere campi vettoriali ai documenti di Azure Cosmos DB per MongoDB basati su vCore. Questi campi sono fondamentali perché archiviano dati vettoriali altamente dimensionali. Questi campi vettoriali vengono popolate usando incorporamenti generati dai dati di testo del documento. Una volta popolati, gli indici vettoriali vengono quindi creati da questi campi vettoriali.
Generare incorporamenti
Prima di poter sfruttare i vantaggi degli indici vettoriali, è necessario generare incorporamenti per alcuni campi di testo archiviati nei documenti del database. Gli incorporamenti vettoriali sono rappresentazioni numeriche dei dati di testo, che consentono ai sistemi di intelligenza artificiale di eseguire un confronto efficiente della somiglianza tra documenti. Ad esempio, un vettore di incorporamento generato per alcuni campi di testo potrebbe essere simile al seguente:
[0.123, 0.234, 0.345, ...]
Si supponga di avere la raccolta di prodotti nel database di venditaAdventure Works Bike Shop. È possibile generare incorporamenti per i campi categoria e descrizione del documento di raccolta. Azure OpenAI consente di generare questi incorporamenti dai dati di testo dei campi. Dopo la generazione, è possibile archiviare tali incorporamenti nei campi vettoriali del documento.
Per creare incorporamenti di campi vettoriali, è possibile usare Python di Azure OpenAI o Node.js SDK tra gli altri linguaggi. Ad esempio, è possibile usare i frammenti di codice seguenti per generare incorporamenti per il testo nel campo categoria usando l'API di Azure OpenAI:
Pitone
response = AzureOpenAIClient.embeddings.create(
input=categoryText,
model=embeddings_deployment)
Node.js
const response = await AzureOpenAIClient.getEmbeddings(embeddingsDeployment, categoryText);
Questi comandi chiamano l'API di Azure OpenAI per generare incorporamenti numerici per la variabile categoryText usando un modello specificato, ad esempio GPT4. Dopo aver generato gli incorporamenti del documento, è possibile archiviarlo nei campi vettoriali usando il comando insert o update di una raccolta MongoDB.
Creare indici vettoriali
Prima di poter eseguire ricerche vettoriali per ottenere i risultati necessari per il sistema RAG, è necessario creare degli indici vettoriali in questi campi vettoriali. Questi indici consentono di eseguire ricerche vettoriali efficienti per recuperare elementi simili in base alla somiglianza del vettore. Esistono due tipi di indici vettoriali disponibili in Azure Cosmos DB per MongoDB: HNSW (Gerarchica Navigable Small World) e indici IVF (Inverted File). È possibile scegliere il tipo di indice in base ai requisiti dell'applicazione.
Ad esempio, per creare un indice vettoriale usando l'algoritmo HNSW , è possibile usare il comando MongoDB seguente:
db.command({
"createIndexes": "exampleCollection",
"indexes": [
{
"name": "VectorSearchIndex",
"key": {
"contentVector": "cosmosSearch"
},
"cosmosSearchOptions": {
"kind": "vector-hnsw",
"m": 16,
"efConstruction": 64,
"similarity": "COS",
"dimensions": 3
}
}
]
});
Questo comando MongoDB crea un indice vettoriale denominato VectorSearchIndex nell'insieme exampleCollection dal campo vettore contentVector . È possibile usare un comando simile per creare un indice vettoriale usando l'algoritmo IVF . Questo esempio viene visitato nell'esercizio del modulo. Dopo aver creato gli indici vettoriali, è ora possibile usarli per eseguire ricerche di somiglianza nel database di Azure Cosmos DB per MongoDB basato su vCore. Il database Azure Cosmos DB per MongoDB basato su vCore è ora pronto per eseguire ricerche vettoriali.
Eseguire la ricerca vettoriale
Dopo aver creato gli indici vettoriali, è possibile eseguire ricerche vettoriali per recuperare elementi simili in base alla somiglianza del vettore. Il processo di ricerca prevede due passaggi principali:
Incorporare una query: convertire una domanda in linguaggio normale in un vettore usando le stesse funzioni di incorporamento usate per creare gli incorporamenti dei campi vettoriali. Ad esempio, se l'input è una domanda come Quale tipo di biciclette si vende? si genererà l'incorporamento della domanda usando la stessa funzione API OpenAI di Azure usata per creare la categoria o gli incorporamenti della descrizione del documento.
Ricerca: usare l'incorporamento generato (detto anche vettore di query) per cercare elementi simili nel database. L'algoritmo di ricerca confronta il vettore di query con i dati vettoriali archiviati nel database per trovare gli elementi più simili. Per eseguire una ricerca vettoriale, è possibile usare il comando di aggregazione MongoDB seguente:
db.exampleCollection.aggregate([
{
"$search": {
"cosmosSearch": {
"vector": "queryVector",
"path": "contentVector",
"k": 2,
"efSearch": 40
},
}
}
]);
Il risultato della ricerca vettoriale restituisce gli elementi più simili in base al vettore di query. In questo comando contentVector sarà il nome del campo vettoriale. Questi risultati sono solo una matrice di documenti con i punteggi di somiglianza più alti. Tuttavia, è possibile migliorare ulteriormente l'esperienza utente integrando Azure OpenAI per generare risposte dettagliate in base ai risultati della ricerca. Questa integrazione è l'ultimo passaggio del sistema Di generazione aumentata di recupero (RAG).
Integrare Azure OpenAI
Mentre i risultati della ricerca vettoriale forniscono elementi pertinenti, è possibile migliorare ulteriormente l'esperienza utente integrando Azure OpenAI per generare risposte dettagliate in base ai risultati della ricerca vettoriale. I modelli avanzati di intelligenza artificiale di Azure OpenAI possono fornire risposte con riconoscimento del contesto che integrano i risultati della ricerca vettoriale.
Cosa è quindi necessario fare per integrare Azure OpenAI con i risultati della ricerca vettoriale? Creare prima di tutto un prompt strutturato che Azure OpenAI può usare per generare risposte dettagliate in base ai risultati della ricerca vettoriale. Il prompt strutturato combina gli elementi seguenti:
- La query originale usata nella ricerca vettoriale - Ad esempio, Che tipo di biciclette vendete?
-
Richiesta di sistema definita dall'utente : il prompt di sistema fornisce una descrizione chiara del processo, che descrive in dettaglio le attività che l'intelligenza artificiale deve gestire, ad esempio, potrebbe definirne il ruolo di helper presso Adventure Works Bike Shop. Descrive come l'IA deve rispondere alle domande, assicurandosi che tutte le risposte siano pertinenti e restituite in un formato semplice da seguire. Il prompt di sistema potrebbe avere i componenti seguenti:
- Descrizione del lavoro: A cosa dovrebbe servire l'IA, ad esempio, "come assistente presso Adventure Works Bike Shop, sei responsabile di rispondere alle domande dei clienti sulle biciclette che vendiamo".
- Formattazione delle risposte di intelligenza artificiale: il prompt indica all'intelligenza artificiale esattamente come formattare le risposte, ad esempio usando elenchi con spaziatura specifica. Questa formattazione mantiene le informazioni chiare e coerenti per consentire agli utenti di comprendere facilmente.
- Limitazione delle risposte di interazione con intelligenza artificiale: il prompt potrebbe includere un elenco di argomenti che l'intelligenza artificiale deve essere in grado di discutere, ad esempio i tipi di biciclette, i prezzi e la disponibilità. L'elenco è fondamentale e garantisce che l'IA rimanga in tema e fornisca informazioni pertinenti.
- Gestione dell'incertezza: il prompt consente all'IA di sapere come gestire le situazioni in cui potrebbe non avere informazioni sufficienti per fornire una risposta. L'intelligenza artificiale può suggerire frasi come "Non so" o incoraggiare gli utenti a condurre la propria ricerca. Questa sezione può aiutare l'IA a gestire meglio le situazioni di incertezza.
- Altre istruzioni: il prompt può includere altre istruzioni, ad esempio come fornire altre risorse agli utenti o come gestire domande non appropriate. Quindi, qualsiasi altra operazione che si vuole far eseguire all'intelligenza artificiale, sarà necessario includerla nel prompt di sistema. Queste istruzioni consentono all'intelligenza artificiale di offrire un'esperienza coerente e utile per gli utenti.
- Risultati della ricerca vettoriale: i risultati della ricerca vettoriale forniscono gli elementi più simili nei dati in base al vettore di query. Poiché i risultati della ricerca vettoriale restituiti sono gli interi documenti stessi, è consigliabile scegliere i campi più rilevanti da includere nella richiesta, ad esempio la categoria o la descrizione della bicicletta. L'intelligenza artificiale può usare queste informazioni per generare risposte dettagliate in base ai risultati della ricerca vettoriale. Ad esempio, se i risultati della ricerca vettoriale restituiscono Mountain Bikes e Road Bikes, l'intelligenza artificiale può fornire informazioni dettagliate su questi tipi di biciclette.
Esistono molti modi programmatici per generare il prompt. La chiave consiste nel strutturarla in modo da fornire istruzioni chiare all'intelligenza artificiale su come generare risposte in base ai risultati della ricerca vettoriale. Si visita un metodo di questo tipo nell'esercizio del modulo.
Dopo aver definito il prompt strutturato, è possibile usare i frammenti di codice seguenti per generare risposte usando Azure OpenAI:
Pitone
response = AzureOpenAICompletionClient.chat.completions.create(
model=completion_deployment, messages=structuredPrompt)
Node.js
const response = await AzureOpenAICompletionClient.getChatCompletions(completionDeployment, structuredPrompt);
Questi comandi chiamano l'API di Azure OpenAI per generare risposte dettagliate in base al prompt strutturato, usando un modello specificato per fornire informazioni con riconoscimento del contesto che integrano i risultati della ricerca vettoriale.
Questa configurazione combina i dati dei clienti di Azure Cosmos DB basati su vCore per MongoDB con i modelli di intelligenza artificiale di Azure OpenAI per formare il sistema RAG (Retrieval Augmented Generation). Integrando la ricerca vettoriale, consente all'intelligenza artificiale di estrarre informazioni precise e rilevanti da Azure Cosmos DB basato su vCore per MongoDB per risposte avanzate. Questo approccio migliora significativamente la qualità e la pertinenza delle risposte generate dall'IA usando i propri dati.