In questo tutorial, creerai un sistema di agentic RAG LangChain utilizzando il modello IBM Granite-3.0-8B-Instruct ora disponibile su watsonx.ai in grado di rispondere a domande complesse sugli US Open 2024 utilizzando informazioni esterne.
La retrieval-augmented generation (RAG) è una tecnica di elaborazione del linguaggio naturale (NLP) che utilizza il recupero delle informazioni e i modelli generativi per produrre risposte più accurate, pertinenti e contestualizzate. Nelle attività tradizionali di generazione del linguaggio, vengono utilizzati modelli linguistici di grandi dimensioni (LLM) come i Llama Models di Meta o i Granite Models di IBM per costruire risposte in base al prompt di input. Un caso d'uso comune di questi grandi modelli linguistici nel mondo reale sono i chatbot. Quando ai modelli mancano informazioni rilevanti e aggiornate nella loro knowledge base, la RAG è uno strumento potente.
Al centro dei sistemi di agentic RAG ci sono gli agenti di intelligenza artificiale (AI). Un agente AI si riferisce a un sistema o programma in grado di eseguire autonomamente attività per conto di un utente o di un altro sistema, progettando il proprio workflow e utilizzando gli strumenti disponibili. La tecnologia agente implementa l'uso degli strumenti sul backend per ottenere informazioni aggiornate da varie fonti dati, ottimizzare il workflow e creare attività secondarie in modo autonomo per risolvere compiti complessi. Questi strumenti esterni possono includere set di dati esterni, motori di ricerca, API e persino altri agenti. Passo dopo passo, l'agente rivaluta il suo piano d'azione in tempo reale e si corregge da solo.
I framework di agentic RAG sono potenti in quanto possono comprendere più di uno strumento. Nelle applicazioni RAG tradizionali, l'LLM è dotato di un database vettoriale a cui fare riferimento per formare le risposte. Al contrario, le applicazioni di agentic AI non si limitano agli agenti di documenti che eseguono solo il recupero dei dati. Gli agenti RAG possono anche disporre di strumenti per attività come la risoluzione di calcoli matematici, la scrittura di e-mail, l'esecuzione di analisi dei dati e altro ancora. Questi strumenti possono essere complementari al processo decisionale dell'agente. Gli agenti AI sono consapevoli del contesto nel loro ragionamento multifase e possono determinare quando utilizzare gli strumenti appropriati.
Gli agenti AI, o agenti intelligenti, possono lavorare in modo collaborativo anche in sistemi multiagente, che tendono a sovraperformare gli agenti singoli. Questa scalabilità e adattabilità è ciò che distingue gli agenti di agentic RAG dalle pipeline RAG tradizionali.
È necessario un account IBM Cloud per creare un progetto watsonx.ai.
Sebbene sia possibile scegliere tra diversi strumenti, questo tutorial illustra come configurare un account IBM per l'utilizzo di un Jupyter Notebook.
Accedi a watsonx.ai usando il tuo account IBM Cloud.
Crea un progetto watsonx.ai.
Puoi ottenere l'ID del tuo progetto dall'interno del tuo progetto. Fare clic sulla scheda Gestisci. Quindi, copia l'ID del progetto dalla sezione Dettagli della pagina Generale. Per questo tutorial ti serve questo ID.
Crea un Jupyter Notebook.
Questo passaggio aprirà un ambiente Notebook in cui potrai incollare il codice da questo tutorial. In alternativa, puoi scaricare questo notebook sul tuo sistema locale e caricarlo nel tuo progetto watsonx.ai come asset. Per visualizzare altri tutorial su Granite, visita l'IBM Granite Community. Questo Jupyter Notebook insieme ai set di dati utilizzati sono disponibili su GitHub.
Crea un'istanza di servizio watsonx.ai Runtime (seleziona l'area geografica appropriata e scegli il piano Lite, che è un'istanza gratuita).
Genera una chiave API.
Associa l'istanza del servizio watsonx.ai Runtime al progetto che hai creato in watsonx.ai.
Abbiamo bisogno di alcune dipendenze per questo tutorial. Assicurati di importare le seguenti e, se non sono installate, puoi risolvere il problema con una rapida installazione pip.
I framework Python comuni per la creazione di sistemi di agentic AI includono LangChain, LangGraph e LlamaIndex. In questo tutorial useremo LangChain.
Configura le tue credenziali. Memorizza il tuo PROJECT_ID e APIKEY in un file .env separato nello stesso livello della tua directory di questo notebook.
Questo passaggio è importante in quanto produrrà un chiaro esempio del comportamento di un agente con e senza fonti di dati esterne. Iniziamo impostando i nostri parametri.
I parametri del modello disponibili possono essere trovati qui. Abbiamo sperimentato vari parametri del modello, tra cui la temperatura, i nuovi token minimi e massimi e le sequenze di arresto. Scopri di più sui parametri del modello e sul loro significato nei documenti watsonx. È importante impostare qui le nostre stop_sequences per limitare le allucinazioni degli agenti. Questo dice all'agente di smettere di produrre ulteriore output quando incontra particolari sottostringhe. Nel nostro caso, vogliamo che l'agente interrompa la sua risposta al raggiungimento di un'osservazione e non allucini una risposta umana. Quindi, una delle nostre stop_sequences è "Human" e un'altra è l'interruzione dell'osservazione una volta prodotta una risposta finale.
Per questo tutorial, consigliamo di utilizzare il modello IBM Granite-3.0-8B-Instruct come LLM per ottenere risultati simili. Puoi utilizzare liberamente il modello AI che preferisci. I modelli di base disponibili tramite watsonx sono disponibili qui. Lo scopo di questi modelli nelle applicazioni LLM è quello di fungere da motore di ragionamento che decide quali azioni intraprendere.
Imposteremo un template di prompt nel caso in cui desideri fare più domande.
E ora possiamo creare una catena con il nostro prompt e il nostro LLM. Ciò consente al modello generativo di produrre una risposta.
Facciamo un test per vedere come il nostro agente risponde a una query di base.
Output: "Non provare a inventare una risposta.\n\n Lo sport praticato agli US Open è il tennis."
L'agente ha risposto correttamente alla query di base con la risposta corretta. Nella fase successiva di questo tutorial, creeremo uno strumento RAG per consentire all'agente di accedere alle informazioni pertinenti sul coinvolgimento di IBM negli US Open 2024. Come abbiamo visto, i modelli LLM tradizionali non sono in grado di ottenere autonomamente informazioni aggiornate. Verifichiamolo.
Output: "Non inventare una risposta.\n\n Il campionato di tennis degli US Open 2024 non è stato ancora annunciato ufficialmente, quindi la sede non è confermata. Pertanto, non conosco la risposta a questa domanda".
Evidentemente, l'LLM non è in grado di fornirci le informazioni pertinenti. I dati di allenamento utilizzati per questo modello contenevano informazioni precedenti agli US Open del 2024 e senza gli strumenti appropriati, l'agente non ha accesso a queste informazioni.
Il primo passo per creare la knowledge base consiste nell'elencare gli URL da cui estrarremo i contenuti. In questo caso, la nostra fonte di dati verrà raccolta dai nostri contenuti online che riassumono il coinvolgimento di IBM negli US Open 2024. Gli URL pertinenti sono stabiliti nell'elenco degli url.
Quindi, carica i documenti utilizzando LangChain WebBaseLoader per gli URL che abbiamo elencato. Stamperemo anche un documento di esempio per vedere come è stato caricato.
Output: Document(metadata={'source': 'https://www.ibm.com/it-it/case-studies/us-open', 'title': 'U.S. Open | IBM', 'description': 'To help the US Open stay on the cutting edge of customer experience, IBM Consulting built powerful generative AI models with watsonx.', 'language': 'en'}, page_content='\n\n\n\n\n\n\n\n\n\nU.S. Open | IBM\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nHome\n\n\n\n\nCase Studies\n\n\n\nUS Open \n\n\n\n \n\n\n\n \n Acing the US Open digital experience\n\n\n\n\n\n\n \n\n\n \n\n \n\n\n \n \n AI models built with watsonx transform data into insight\n \n\n\n\n\n \n\n\n \n\n\nGet the latest AI and tech insights\n\n\nLearn More\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nFor two weeks at the end of summer, nearly one million people make the journey to Flushing, New York, to watch the best tennis players in the world compete in the US Open Tennis Championships...')
Per dividere i dati in questi documenti in blocchi che possono essere elaborati dall'LLM, possiamo utilizzare uno splitter di testo come RecursiveCharacterTextSplitter . Questo divisore di testo suddivide il contenuto sui seguenti caratteri: ["\n\n", "\n", " ", ""]. Questo viene fatto con l'intenzione di mantenere il testo negli stessi blocchi, come paragrafi, frasi e parole insieme.
Una volta avviato lo splitter di testo, possiamo applicarlo al nostro docs_list.
Il modello di incorporamento che stiamo utilizzando è un modello IBM Slate tramite il servizio di incorporamento watsonx.ai. Inizializziamolo.
Per memorizzare i nostri documenti incorporati, utilizzeremo Chroma DB, un database vettoriale open source.
Per accedere alle informazioni nel database vettoriale, dobbiamo configurare un retriever.
Definiamo lo strumento get_IBM_US_Open_context() che il nostro agente utilizzerà. L'unico parametro di questo strumento è la query dell'utente. La descrizione dello strumento viene annotata anche per informare l'agente sull'uso dello strumento. In questo modo, l'agente sa quando chiamare questo strumento. Questo strumento può essere utilizzato dal sistema agentic RAG per indirizzare la query dell'utente al database vettoriale se riguarda il coinvolgimento di IBM negli US Open del 2024.
Successivamente, imposteremo un nuovo modello di prompt per porre più domande. Questo modello è più complesso. Viene definito un prompt di chat strutturato e può essere utilizzato per creare agenti con più strumenti disponibili. Nel nostro caso, lo strumento che stiamo utilizzando è stato definito nel passaggio 6. Il prompt strutturato della chat sarà composto da un system_prompt, un human_prompt e il nostro strumento RAG.
Innanzitutto, imposteremo il system_prompt. Questo prompt indica all'agente di stampare il suo "processo di pensiero", che include le attività secondarie dell'agente, gli strumenti utilizzati e l'output finale. Questo ci dà insight nella funzione che chiama l'agente. Il prompt indica inoltre all'agente di restituire le risposte in formato JSON Blob.
Nel codice seguente stabiliamo human_prompt. Questo prompt indica all'agente di visualizzare l'input dell'utente seguito dai passaggi intermedi eseguiti dall'agente come parte dell'agent_scratchpad.
Successivamente, stabiliamo l'ordine dei nostri prompt appena definiti nel modello di prompt. Creiamo questo nuovo modello per presentare le caratteristiche del system_prompt seguito da un elenco opzionale di messaggi raccolti nella memoria dell'agente, se presenti, e infine, l'human_prompt che include sia l'input che l'agent_scratchpad.
Ora, finalizziamo il nostro modello di prompt aggiungendo i nomi, le descrizioni e gli argomenti degli strumenti utilizzando un modello di prompt parziale. Ciò consente all'agente di accedere alle informazioni relative a ciascuno strumento, inclusi i casi d'uso previsti. Ciò significa anche che possiamo aggiungere e rimuovere strumenti senza alterare l'intero modello di prompt.
Una caratteristica importante degli agenti AI è la loro memoria. Gli agenti sono in grado di memorizzare le conversazioni passate e le scoperte passate per migliorare l'accuratezza e la pertinenza delle loro risposte in futuro. Nel nostro caso, utilizzeremo ConversationBufferMemory () di LangChain come mezzo di storage.
E ora possiamo creare una catena con lo scratchpad, la memoria, il prompt e l'LLM del nostro agente. La classe AgentExecutor viene utilizzata per eseguire l'agente. Richiede l'agente, i suoi strumenti, error handling approach, i parametri dettagliati e la memoria.
Ora siamo in grado di porre domande all'agente. Ricordiamo la precedente incapacità dell'agente di fornirci informazioni relative agli US Open 2024. Ora che l'agente ha a disposizione il suo strumento RAG, riproviamo a fare le stesse domande.
Output: (alcuni campi della descrizione e del contenuto della pagina sono stati abbreviati per visualizzare brevemente i risultati)
> Entro in una nuova catena di AgentExecutor...
Pensiero: l'umano sta chiedendo dove si è svolto il campionato di tennis degli US Open 2024. Devo scoprire dove si è svolto.
Azione:
```
{
"action": "get_IBM_US_Open_context",
"action_input": "Where was the 2024 US Open Tennis Championship held?"
}
```
Observation[Document(metadata={'description': "IBM and the United States Tennis Association (USTA) announced several watsonx-powered fan features coming to the US Open digital platforms ahead of this year's tournament. These new and enhanced capabilities – a product of collaboration between IBM and the USTA digital team – aim to deliver a more informative and engaging experience for millions of tennis fans around the world.", 'language': 'en-us', 'source': 'https://newsroom.ibm.com/2024-08-15-ibm-and-the-usta-serve-up-new-and-enhanced-generative-ai-features-for-2024-us-open-digital-platforms', 'title': 'IBM and the USTA Serve Up New and Enhanced Generative AI Features for 2024 US Open Digital Platforms'}, page_content="IBM and the USTA Serve Up New and Enhanced Generative AI Features for 2024 US Open Digital Platforms\n-New Match Report summaries offer...")]
Azione:
```
{
"action": "Final Answer",
"action_input": "The 2024 US Open Tennis Championship was held at the USTA Billie Jean King National Tennis Center in Flushing, Queens, New York."
}
```
Observation
> Catena finita.
{'input': 'Where was the 2024 US Open Tennis Championship?',
'history': '',
'output': 'The 2024 US Open Tennis Championship was held at the USTA Billie Jean King National Tennis Center in Flushing, Queens, New York.'}
Ottimo! L'agente ha utilizzato lo strumento RAG disponibile per restituire la sede degli US Open 2024, in base alla richiesta dell'utente. Possiamo persino vedere il documento esatto da cui l'agente sta recuperando le informazioni. Proviamo ora con una query leggermente più complessa. Questa volta, la domanda riguarderà il coinvolgimento di IBM negli US Open 2024.
Output: (alcuni campi della descrizione e del contenuto della pagina sono stati abbreviati per visualizzare brevemente i risultati)
> Entro in una nuova catena di AgentExecutor...
```
{
"action": "get_IBM_US_Open_context",
"action_input": "How did IBM use watsonx at the 2024 US Open Tennis Championship?"
}
```
Observation[Document(metadata={'description': 'To help the US Open stay on the cutting edge of customer experience, IBM Consulting built powerful generative AI models with watsonx.', 'language': 'en', 'source': 'https://www.ibm.com/it-it/case-studies/us-open', 'title': 'U.S. Open | IBM'}, page_content='The US Open is a sprawling, two-week tournament, with hundreds of matches played on 22 different courts. Keeping up with all the action is a challenge, both for tennis fans and the USTA editorial team covering the event...)]
Azione:
```
{
"action": "Final Answer",
"action_input": "IBM used watsonx at the 2024 US Open Tennis Championship to create generative AI-powered features such as Match Reports, AI Commentary, and SlamTracker. These features enhance the digital experience for fans and scale the productivity of the USTA editorial team."
}
```
Observation
> Catena finita.
{'input': 'How did IBM use watsonx at the 2024 US Open Tennis Championship?',
'history': 'Human: Where was the 2024 US Open Tennis Championship?\nAI: The 2024 US Open Tennis Championship was held at the USTA Billie Jean King National Tennis Center in Flushing, Queens, New York.',
'output': 'IBM used watsonx at the 2024 US Open Tennis Championship to create generative AI-powered features such as Match Reports, AI Commentary, and SlamTracker. These features enhance the digital experience for fans and scale the productivity of the USTA editorial team.'}
Ancora una volta, l'agente è riuscito a recuperare con successo le informazioni pertinenti relative alla richiesta dell'utente. Inoltre, l'agente sta aggiornando con successo la sua base di conoscenza man mano che apprende nuove informazioni e ha nuove esperienze, come si vede dall'output della cronologia.
Ora, verifichiamo se l'agente è in grado di determinare quando non è necessario ricorrere a uno strumento per rispondere alla domanda dell'utente. Possiamo verificarlo ponendo all'agente RAG una domanda che non riguarda gli US Open.
Output:
> Entro in una nuova catena di AgentExecutor...
{
"action": "Final Answer",
"action_input": "The capital of France is Paris."
}
Observation
> Catena finita.
{'input': 'What is the capital of France?',
'history': 'Human: Where was the 2024 US Open Tennis Championship?\nAI: The 2024 US Open Tennis Championship was held at the USTA Billie Jean King National Tennis Center in Flushing, Queens, New York.\nHuman: How did IBM use watsonx at the 2024 US Open Tennis Championship?\nAI: IBM used watsonx at the 2024 US Open Tennis Championship to create generative AI-powered features such as Match Reports, AI Commentary, and SlamTracker. These features enhance the digital experience for fans and scale the productivity of the USTA editorial team.',
'output': 'The capital of France is Paris.'}
Come si è visto nella catena di AgentExecutor, l'agente ha riconosciuto di avere le informazioni nella sua base di conoscenza per rispondere a questa domanda senza utilizzare i suoi strumenti.
In questo tutorial hai creato un agente RAG utilizzando LangChain in Python con Watsonx. L'LLM con cui hai lavorato era il modello IBM Granite-3.0-8B-Instruct. L'output del campione è importante in quanto dimostra l'importanza di questo progresso dell'AI generativa. L'Agente AI è riuscito a recuperare con successo le informazioni rilevanti tramite lo strumento get_IBM_US_open_context, aggiornarne la memoria ad ogni interazione e fornire output appropriati. È anche importante notare la capacità dell'agente di determinare se la chiamata dello strumento è appropriata per ogni attività specifica. Quando l'agente disponeva delle informazioni necessarie per rispondere alla query di input, non utilizzava alcuno strumento per rispondere alle domande.
Per ulteriori contenuti sugli agenti AI, ti invitiamo a consultare il nostro tutorial Agente AI che restituisce l'immagine astronomica del giorno di oggi utilizzando l'API open source della NASA e uno strumento di datazione.
Crea, implementa e gestisci assistenti e agenti AI potenti che automatizzano workflow e processi con l'AI generativa.
Costruisci il futuro della tua azienda con soluzioni AI di cui puoi fidarti.
I servizi di AI di IBM Consulting aiutano a reinventare il modo in cui le aziende lavorano con l'AI per la trasformazione.