A differenza dei sistemi tradizionali basati su grandi modelli linguistici (LLM) che sono limitati dai loro dati di addestramento, la generazione aumentata da recupero (RAG) migliora significativamente la generazione di testo incorporando informazioni esterne pertinenti. Questo approccio consente ai modelli di accedere a una base di conoscenze più ampia e aggiornata, superando le lacune intrinseche dei dati con cui sono stati inizialmente formati.
L'RAG agentico fa un ulteriore passo avanti, sfruttando sistemi autonomi integrati con LLM e meccanismi di recupero. Questi sistemi avanzati sono in grado di prendere decisioni, adattarsi a requisiti mutevoli ed eseguire compiti di ragionamento complessi in modo dinamico. Ciò li rende particolarmente adatti per applicazioni che richiedono flessibilità, accuratezza e la capacità di interagire con diverse fonti di dati.
Guida al workshop: Costruire un agente RAG
Questa guida presenta un workshop auto-guidato progettato per la creazione di un agente RAG. Partecipando, si acquisiranno competenze e strumenti essenziali:
- Una comprensione approfondita dei principi fondamentali dell'RAG agentico, incluso NVIDIA Nemotron, una famiglia di modelli aperti con dati e pesi accessibili a tutti.
- La conoscenza pratica di come costruire sistemi RAG agentici utilizzando LangGraph, un framework robusto per lo sviluppo di applicazioni basate su agenti.
- Un ambiente di sviluppo completo e portatile, pronto all'uso, che semplifica l'installazione e la configurazione.
- Il proprio sistema RAG agentico personalizzato, pronto per essere condiviso come un NVIDIA Launchable, una soluzione che permette di distribuire facilmente applicazioni e modelli.
Per coloro che preferiscono un approccio visivo, è disponibile anche una video walkthrough che accompagna passo dopo passo l'intero processo.
Video di accompagnamento
- Video 1. Costruire un agente RAG con NVIDIA Nemotron
Apertura del workshop
Per iniziare, è possibile avviare il workshop come un NVIDIA Launchable. Questo processo è semplificato e richiede pochi passaggi:
Figura 1. Cliccare sul pulsante 'Deploy Now' per distribuire l'NVIDIA DevX Workshop nel cloud.
Una volta che l'ambiente Jupyter Lab è operativo, localizzare la sezione NVIDIA DevX Learning Path nel Launcher di Jupyterlab. Selezionare il riquadro Agentic RAG per aprire le istruzioni del laboratorio e iniziare.
Figura 2. Cliccare sul riquadro "Agentic RAG" nella sezione NVIDIA DevX Learning Path per aprire le istruzioni del laboratorio.
Configurazione dei segreti
Per seguire questo workshop, sarà necessario raccogliere e configurare alcuni "segreti" del progetto, ovvero chiavi API o credenziali necessarie per accedere a vari servizi.
- NGC API Key: Questa chiave abilita l'accesso al software, ai modelli, ai container e ad altre risorse NVIDIA, fondamentali per il funzionamento dell'agente.
- (opzionale) LangSmith API Key: Questa chiave connette il workshop alla piattaforma di LangChain, utile per il tracciamento e il debugging del proprio agente AI. Sebbene non sia strettamente necessaria per il funzionamento di base, è altamente raccomandata per lo sviluppo e l'ottimizzazione.
È possibile utilizzare il riquadro Secrets Manager sotto NVIDIA DevX Learning Path del Launcher di Jupyterlab per configurare queste chiavi API per l'ambiente di sviluppo del workshop. Dopo averle inserite, verificare nella scheda dei log che i segreti siano stati aggiunti con successo, garantendo così che l'ambiente sia correttamente autenticato e pronto all'uso.
Figura 3. Utilizzare il riquadro "Secrets Manager" nella sezione NVIDIA DevX Learning Path per configurare i segreti del progetto (chiavi API).
Introduzione all'architettura RAG
Una volta che l'ambiente del workshop è stato configurato, il passo successivo è comprendere l'architettura del sistema RAG agentico che si andrà a costruire. L'RAG è un approccio rivoluzionario che migliora le capacità degli LLM incorporando informazioni esterne pertinenti durante la generazione del testo di output.
I modelli linguistici tradizionali generano risposte basandosi esclusivamente sulla conoscenza acquisita dai loro dati di addestramento. Questo può essere un fattore limitante, specialmente quando si tratta di informazioni in rapida evoluzione, di domini di conoscenza altamente specializzati o di dati aziendali riservati. In tali scenari, la conoscenza "stagnante" del modello può portare a risposte obsolete, imprecise o incomplete.
L'RAG, d'altra parte, è uno strumento potente per generare risposte basate su dati non strutturati pertinenti recuperati da una base di conoscenza esterna. Questo significa che il modello non è più confinato alla sua memoria interna, ma può attivamente cercare e integrare informazioni fresche e specifiche al momento della richiesta dell'utente.
Figura 4. Tradizionalmente, l'RAG utilizza un prompt utente per recuperare documenti contestualmente pertinenti, fornendoli come contesto all'LLM per una risposta più informata.
Il flusso tipico per un sistema RAG è il seguente:
- Prompt: Un utente genera una query in linguaggio naturale. Questo è il punto di partenza per l'intero processo.
- Modello di embedding: Il prompt viene convertito in vettori numerici. Questi vettori rappresentano il significato semantico del prompt, consentendo un confronto efficiente con altri contenuti.
- Ricerca nel database vettoriale: Dopo che il prompt dell'utente è stato trasformato in un vettore, il sistema esegue una ricerca in un database vettoriale. Questo database è riempito con "chunk" di documenti indicizzati semanticamente, il che consente un recupero rapido di frammenti di dati contestualmente rilevanti.
- Modello di reranking: I frammenti di dati recuperati vengono ulteriormente riordinati per dare priorità ai dati più pertinenti. Questo passaggio è cruciale per filtrare il "rumore" e presentare all'LLM solo le informazioni più utili.
- LLM: L'LLM genera risposte informate dai dati recuperati. Con il contesto aggiuntivo e filtrato, il modello è in grado di produrre risposte più accurate, aggiornate e specifiche.
Questo approccio garantisce che il modello linguistico possa accedere a informazioni aggiornate e specifiche che vanno oltre i suoi dati di addestramento, rendendolo più versatile ed efficace in una vasta gamma di applicazioni.
Comprendere l'architettura dell'agente ReAct
A differenza delle applicazioni tradizionali basate su LLM, gli agenti possono scegliere dinamicamente strumenti, incorporare un ragionamento complesso e adattare il loro approccio di analisi in base alla situazione specifica. Questa flessibilità è ciò che distingue gli agenti dai semplici generatori di testo.
Figura 5. Un agente ReAct può ragionare in modo iterativo e richiamare strumenti definiti dall'utente per generare una risposta di maggiore qualità basata sull'RAG.
Gli Agenti ReAct sono una semplice architettura agentica che utilizza "ragionamento e azione" (reasoning and acting) tramite la chiamata di strumenti supportata dagli LLM. Se l'LLM richiede qualsiasi chiamata a strumenti dopo aver ricevuto il prompt, questi strumenti vengono eseguiti, aggiunti alla cronologia della chat e rispediti al modello per essere invocati nuovamente. Questo ciclo iterativo consente all'agente di affinare la sua comprensione e la sua risposta.
L'RAG funziona bene, ma ha dei limiti perché l'LLM non può determinare come vengono recuperati i dati, controllare la qualità dei dati o scegliere tra diverse fonti di dati. L'RAG agentico porta il concetto di RAG un ulteriore passo avanti, combinando i punti di forza degli LLM, come la comprensione del linguaggio, il ragionamento contestuale e la generazione flessibile, con l'uso dinamico degli strumenti e meccanismi di recupero avanzati, come la ricerca semantica, il recupero ibrido, il reranking e la selezione delle fonti di dati. La creazione di un Agente ReAct per l'RAG richiede semplicemente di fornirgli la Catena di Recupero (Retrieval Chain) come strumento, in modo che l'agente possa decidere quando e come cercare informazioni.
Figura 6. La pipeline completa dell'RAG agentico coinvolgerà l'aggiunta dell'agente ReAct alla Catena di Recupero dove sono memorizzati i documenti contestuali.
L'RAG agentico impiega un'architettura di agente ReAct in cui l'LLM di ragionamento decide sistematicamente se recuperare informazioni tramite la chiamata di strumenti o rispondere direttamente, attivando la pipeline di recupero solo quando è necessario un contesto aggiuntivo per affrontare meglio la richiesta dell'utente. Questa capacità decisionale rende l'agente significativamente più efficiente e preciso.
Apprendimento e implementazione del codice
Ora che sono stati compresi i concetti, è il momento di immergersi nell'implementazione tecnica. Si inizierà con i componenti fondamentali prima di costruire il sistema RAG agentico completo. I passaggi chiave includono:
- Modelli: Definizione e configurazione dei modelli linguistici e di embedding.
- Strumenti: Creazione degli strumenti che l'agente utilizzerà per interagire con l'ambiente e le fonti di dati.
- Ingestione dei dati: Caricamento delle informazioni che costituiranno la base di conoscenza esterna.
- Text Splitting: Suddivisione dei documenti in frammenti più piccoli e gestibili per un recupero efficiente.
- Ingestione del database vettoriale: Memorizzazione degli embedding dei documenti in un database ottimizzato per la ricerca semantica.
- Recuperatore e Reranker di documenti: Componenti per recuperare i documenti pertinenti e ordinarli per rilevanza.
- Creazione dello strumento di recupero: Incorporazione del processo di recupero come uno strumento utilizzabile dall'agente.
- Configurazione dell'agente: Definizione della logica e del comportamento dell'agente ReAct.
Fondamenta: i modelli
Il workshop si basa sugli endpoint NVIDIA NIM per i modelli principali che alimentano l'agente. NVIDIA NIM offre capacità di inferenza ad alte prestazioni, essenziali per la reattività e l'efficienza degli agenti AI, incluse:
- Binding degli strumenti: Supporto nativo per la chiamata di funzioni, consentendo agli LLM di interagire senza problemi con strumenti esterni.
- Output strutturato: Supporto integrato per i modelli Pydantic, garantendo che gli output del modello siano coerenti e facilmente interpretabili dalle applicazioni.
- Operazioni asincrone: Pieno supporto async/await per l'elaborazione concorrente, migliorando la capacità di risposta e la scalabilità dell'agente.
- Affidabilità aziendale: Infrastruttura di inferenza di livello produzione, che garantisce stabilità e prestazioni anche in scenari complessi e con carichi elevati.
Questo esempio mostra il connettore LangChain ChatNVIDIA che utilizza NVIDIA NIM per interagire con il modello:
from langchain_nvidia_ai_endpoints import ChatNVIDIA
LLM_MODEL = "nvidia/nvidia-nemotron-nano-9b-v2"
llm = ChatNVIDIA(model=LLM_MODEL, temperature=0.6, top_p=0.95, max_tokens=8192)
Per garantire la qualità dell'applicazione basata su LLM, è cruciale che l'agente riceva istruzioni chiare per definire il processo decisionale, rimuovere l'ambiguità e specificare come deve trattare i documenti recuperati. Un esempio significativo da code/rag_agent.py è fornito come segue:
SYSTEM_PROMPT = (
"You are an IT help desk support agent.\n"
"- Use the 'company_llc_it_knowledge_base' tool for questions likely covered by the internal IT knowledge base.\n"
"- Always write grounded answers. If unsure, say you don't know.\n"
"- Cite sources inline using [KB] for knowledge base snippets.\n"
"- If the knowledge base doesn't contain sufficient information, clearly state what information is missing.\n"
"- Keep answers brief, to the point, and conversational."
)
Questo prompt illustra alcuni principi chiave per un prompting affidabile degli LLM in applicazioni basate su RAG:
- Specifiche del ruolo: Una chiara definizione dell'expertise e delle responsabilità dell'agente, in questo caso, un agente di supporto IT.
- Utilizzo degli strumenti: Istruzioni precise su quali strumenti utilizzare per compiti specifici, come l'uso della base di conoscenza interna per domande pertinenti.
- Fondamento: Sottolineare l'importanza di fornire risposte basate su fonti affidabili e l'importanza di ammettere l'incertezza quando non si possiede la risposta.
- Citazione delle fonti: Fornire linee guida per citare le fonti (es. "[KB]") per garantire trasparenza e tracciabilità delle informazioni.
- Stile di comunicazione: Specificare lo stile di comunicazione desiderato, che sia breve, conciso e conversazionale, per migliorare l'esperienza dell'utente.
Nel file code/rag_agent.py, definiamo i modelli necessari affinché l'agente del servizio di assistenza IT possa rispondere alle query degli utenti utilizzando la base di conoscenza. Questi modelli sono la spina dorsale dell'intelligenza dell'agente:
- Il LLM Model, Nemotron Nano 9b V2, è il modello di ragionamento primario utilizzato per generare le risposte. È responsabile della comprensione del prompt dell'utente, dell'applicazione della logica e della formulazione della risposta finale.
- Il NVIDIA NeMo Retriever Embedding Model, Llama 3.2 EmbedQA 1b V2, viene utilizzato per convertire i documenti in rappresentazioni di embedding vettoriali. Questi embedding sono essenziali per la ricerca semantica, consentendo al sistema di trovare rapidamente i documenti più rilevanti nella base di conoscenza.
- Il NeMo Retriever Re... (il testo originale si interrompe qui)