DSPy è un framework Python open source per creare applicazioni di modelli linguistici di grandi dimensioni (LLM) e perfezionarne le prestazioni tramite codice anziché utilizzando tecniche una tantum per l'ottimizzazione dei prompt. Un programma DSPy fornisce un modo modulare per configurare e mettere a punto le applicazioni LLM, ottimizzando i prompt per ottenere output accurati. Il vantaggio principale di DSPy è che consente di eseguire il prompt engineering e il tracciamento tramite codice Python, anziché dover monitorare personalmente le prestazioni del modello.
La potenza di DSPy risiede nel fatto che utilizza l'AI generativa per generare un linguaggio naturale e poi testare i risultati per creare prompt più efficaci. Ciò consente di creare un sistema di AI in grado di auto-migliorarsi. Supporta un'ampia varietà di interfacce per i modelli di recupero e i modelli linguistici. Puoi eseguire i modelli a livello locale attraverso sistemi come ollama o huggingface oppure utilizzando un'API se stai utilizzando ChatGPT o GPT-4 di OpenAI. DSPy supporta un'ampia varietà di casi d'uso come chain of thought (CoT), Retrieval-augmented generation (RAG) e riepilogo.
In questo tutorial ti mostreremo il workflow per creare un'applicazione di risposta alle domande RAG con DSPy su IBM watsonx. Utilizzerai Llama 3 come modello linguistico e ColBERT come modello di recupero. Avrai a disposizione DSPy per mettere a punto i prompt e aiutare a strutturare diversi approcci alla risposta alle domande, per scoprire come ottenere risposte migliori anche con domande molto complesse.
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 progetto dall'interno del tuo progetto.
Fai clic sulla scheda "Gestisci" e copia l'ID del progetto dalla sezione "Dettagli" della pagina "Generale". Per questo tutorial ti serve questo ID.
Quindi, crea un Jupyter Notebook nell'ambiente di tua scelta. Copia il codice da questo tutorial nel nuovo notebook. In alternativa, puoi scaricare questo notebook da GitHub sul tuo sistema locale e caricarlo nel tuo progetto watsonx.ai come asset.
Crea un'istanza del servizio watsonx.ai Runtime (seleziona la tua regione e scegli il piano Lite, che è un'istanza gratuita).
Genera una chiave API in watsonx.ai Runtime.
Associa il servizio watsonx.ai Runtime al progetto che hai creato in watsonx.ai.
Per utilizzare DSPy, è necessario eseguire una semplice installazione pip. Installerai anche dotenv per gestire le tue variabili d'ambiente:
!pip install dspy-ai python-dotenv;
Importerai quindi le librerie necessarie per il resto di questo tutorial:
Per impostare le credenziali, sono necessari i WATSONX_APIKEY e i PROJECT_ID generati nel passaggio 1. Puoi memorizzarli in un file .env nella tua directory oppure sostituire il testo del placeholder. Imposterai anche l'URL che funge da endpoint dell'API.
Ora configureremo DSPy per funzionare con i modelli watsonx insieme alla classe DSPy LM. Questa classe consente di chiamare le API watsonx sia per generare nuovi prompt che per generare risposte ai prompt che puoi testare. Sotto DSPy viene utilizzata un'altra libreria chiamata LiteLLM per accedere ai servizi watsonx. LiteLLM fornisce un semplice wrapper per chiamare una gamma molto ampia di API LLM utilizzando il formato OpenAI, tra cui Hugging face, Azure e watsonx.
Prima di poter accedere al tuo account watsonx, devi memorizzare un token del servizio watsonx con la chiave API che hai generato nel primo passaggio. Chiama la libreria os per accedere a “https://iam.cloud.ibm.com/identity/token”, recuperare il token e memorizzarlo per utilizzarlo in seguito.
Ora puoi creare un'istanza LanguageModel che utilizza watsonx. Usa il token che hai recuperato in precedenza come chiave API e il modello 'llama-3-8b-instruct' di Meta come modello linguistico. Passa il percorso di quel modello a DSpy affinché lo usi come modello linguistico insieme alla temperatura che desideri che il modello linguistico utilizzi. Ulteriori informazioni sulla configurazione di LiteLLM affinché utilizzi watsonx sono disponibili nei documenti GitHub. In questo caso, 0.7 offre un po' di creatività senza eccessive allucinazioni.
Carica ora il modello di recupero per la R del RAG. Usa ColBERTv2 per caricare gli estratti dal set di dati Wikipedia 2017. ColBert è un modello di recupero rapido e accurato, che consente una ricerca scalabile basata su BERT su grandi raccolte di testo in decine di millisecondi. ColBERT è semplicemente una delle tante opzioni che possono essere utilizzate per recuperare informazioni da un database vettoriale. È paragonabile ad altri database vettoriali come Qdrant, Milvus, Pinecone, Chroma o Weaviate.
I database vettoriali conterranno un insieme specifico di informazioni a cui il modello linguistico potrà accedere rapidamente. In questo caso, utilizzerà una serie di abstract di Wikipedia 2017 per fornire un'ampia gamma di dati che il tuo modello linguistico potrà utilizzare durante la generazione. Questa combinazione di ColBert e del set di dati Wiki 17 è particolarmente utile, perché una versione è ospitata gratuitamente dal team di DSpy per essere utilizzata da chiunque. Fornisce l'accesso a un'ampia gamma di informazioni senza richiedere di inserire dati o creare un proprio sistema di database vettoriale. Uno svantaggio di questo set di dati è che non contiene nulla sugli eventi successivi al 2017, tuttavia ai fini della dimostrazione è molto utile.
Se vuoi eseguire una versione di ColBERT con i tuoi dati o un set di dati aggiornato, qui trovi dei tutorial utili.
Carica quindi il set di dati HotPotQA e dividilo in set di addestramento e test che puoi usare per testare la tua catena di recupero. HotpotQA è un set di dati di risposta alle domande che contiene domande naturali e multi-hop, con una forte supervisione dei fatti di supporto, al fine di fornire sistemi di risposta alle domande più spiegabili.
Ora creiamo una firma che verrà utilizzata per il tuo esempio iniziale. Una firma è una classe che definisce i tipi di input e output di un modulo, per garantire la compatibilità tra i diversi moduli di un programma DSPy. Una firma combina più attività, come l'inserimento di una domanda e l'output di una risposta, nonché il ragionamento dei modelli. La firma che utilizzerai qui accetta solo una domanda e fornisce una risposta:
Ora hai un predittore che puoi testare chiamando il metodo thePredict di DSPy. Questo metodo accetta la classe newBasicQA definita in precedenza e la utilizza quando si passa una domanda a DSPy.
Creiamo ora una domanda che richiede più informazioni per rispondere correttamente, testandola con un'architettura che utilizza solo un modello linguistico. Utilizzerai la funzione generate_answer che hai appena creato per rispondere alla domanda.
Il codice restituisce quanto segue (la tua risposta potrebbe essere diversa):
Orhan Pamuk è stato il vincitore del Premio Nobel per la Letteratura nel 2006, ma non è francese e il framing della risposta non è corretto. Ora amplia il modello con il recupero utilizzando la retrieval-augmented generation e fai in modo che DSPy progetti prompt più accurati per migliorare le prestazioni.
La retrieval-augmented generation (RAG) è un'architettura che ottimizza l'output di un modello linguistico di grandi dimensioni utilizzando riferimenti provenienti da una knowledge base autorevole. In questo modo i dati di addestramento vengono arricchiti con fonti verificate prima che il modello linguistico generi una risposta. Gli LLM sono formati su corpus di grandi dimensioni e utilizzano miliardi di parametri per generare output, ma potrebbero non essere in grado di accedere a informazioni aggiornate o accurate dai loro corpus di addestramento. La RAG estende le già potenti funzionalità degli LLM a un dominio specifico senza richiedere che il modello venga riaddestrato. È un modo potente e potenzialmente conveniente per migliorare gli output degli LLM in modo che rimangano pertinenti, accurati e utili in vari contesti.
In DSPy, utilizziamo un'architettura RAG aggiungendo una fase contestuale nella firma. Questo passaggio raccoglie il contesto dal modello di recupero e lo aggiunge al prompt per il modello linguistico, nella speranza di ottenere una risposta migliore.
La firma newGenerateAnswer può essere utilizzata con il modello RAG. Si passa il modulo GenerateAnswer al modulo "ChainOfThought", in modo che il contesto recuperato e la domanda e la risposta utilizzino un approccio di tipo Chain of Thought.
Aggiorna anche il metodo forward per generare passaggi contestuali dalla RAG e utilizzare tali passaggi contestuali per generare risposte. DSPy chiamerà questo metodo `forward` ogni volta che genera una nuova risposta a una domanda, raccogliendo entrambi i contesti dal set di dati degli abstract di Colbert Wiki 17 e poi passando quel contesto al modello linguistico, in questo caso Llama 3.1. Man mano che viene generata ogni risposta, DSPy confronterà l'output con quello desiderato per assicurarsi che i prompt aiutino il modello a generare le risposte corrette.
Per aiutare DSPy a progettare i prompt migliori per noi, è necessario un set di dati di prova da utilizzare per testare i prompt e poi valutarli.
Per porre le domande del test DSPy, carica il set di dati HotPotQA. HotPotQA è un set di dati con risposta a domande naturali che richiedono più recuperi e inferenze per arrivare alla risposta corretta. È un ottimo strumento per testare la capacità dei modelli di generare dati di supporto per addestrare e testare sistemi di risposta più spiegabili alle domande.
Ad esempio, una domanda dal set di dati è: "Chi ha nominato il presidente Franklin Roosevelt responsabile della trasmissione dei voti del Collegio elettorale al Congresso?" Questa domanda richiede diverse informazioni per fornire una risposta corretta.
Il contesto di supporto proviene dalle pagine di Wikipedia su Robert Digges Wimberly Connor e sulla National Archives and Records Administration.
HotPotQA è raccolto e pubblicato da un team di ricercatori di NLP presso la Carnegie Mellon University, la Stanford University e l'Université de Montreal. Ulteriori informazioni su HotPotQA sono disponibili sul sito GitHub.
Dopo avere caricato il set di dati, è necessario dividerlo in set di addestramento e set di test. Ciò consente di testare la catena di recupero e di aiutare DSPy a individuare i prompt migliori per il modello linguistico.
Successivamente, eseguiremo il bootstrapping di altri esempi per dare a DSPy maggiori opportunità di generare prompt e valutarli. Callingcompile è ciò che utilizza tutta l'architettura che hai configurato, così come il set di dati HotPotQA, per generare e testare prompt e ottenere le migliori prestazioni dal tuo modello linguistico.
Ora che DSPy ha eseguito per te il prompt engineering, potrai testarlo con la domanda specifica sul Premio Nobel del 2006 che hai utilizzato in precedenza. Poiché il modello di recupero utilizza estratti di Wikipedia del 2017, funzionerà al meglio con le conoscenze che potrebbero essere presenti in quel corpus:
Ora ottieni la risposta corretta.
Question: What country was the winner of the Nobel Prize in Literature in 2006 from and what was their name? Predicted Answer: Turkey, Orhan Pamuk
Orhan Pamuk viene dalla Turchia, quindi questa risposta è corretta. La versione compilata di DSPy non solo ha ottenuto la risposta corretta, ma l'ha anche inquadrata correttamente, rispondendo con una risposta breve e chiara. Vediamo il contesto di questa risposta prevista per vedere come il modello è arrivato alla risposta corretta:
pred.context
Questo restituisce:
["Orhan Pamuk | Ferit Orhan Pamuk (generally known simply as Orhan Pamuk; born 7 June 1952) is a Turkish novelist, screenwriter, academic and recipient of the 2006 Nobel Prize in Literature. One of Turkey's most prominent novelists, his work has sold over thirteen million books in sixty-three languages, making him the country's best-selling writer.", '2006 Palanca Awards | The Carlos Palanca Memorial Awards for Literature winners in the year 2006 (rank, title of winning entry, name of author).', "Miguel Donoso Pareja | Miguel Donoso Pareja (July 13, 1931 – March 16, 2015) was an Ecuadorian writer and 2006 Premio Eugenio Espejo Award-winner (Ecuador's National Prize in literature, given by the President of Ecuador)."]
La risposta è nel primo blocco di contesto restituito. È possibile vedere come DSPy ha progettato prompt ottimali esaminando la cronologia del modello linguistico, utilizzando il metodo inspect_history() del modello linguistico.
Questa cronologia è molto lunga poiché include tutti gli esempi del processo di compilazione in cui DSPy ha testato i prompt generati. L'ultima parte della cronologia mostra come il modello è arrivato alla risposta giusta e nel formato corretto:
[[ ## context ## ]]
[1] «Orhan Pamuk | Ferit Orhan Pamuk (generally known simply as Orhan Pamuk; born 7 June 1952) is a Turkish novelist, screenwriter, academic and recipient of the 2006 Nobel Prize in Literature. One of Turkey's most prominent novelists, his work has sold over thirteen million books in sixty-three languages, making him the country's best-selling writer.»
[2] «2006 Palanca Awards | The Carlos Palanca Memorial Awards for Literature winners in the year 2006 (rank, title of winning entry, name of author).»
[3] «Miguel Donoso Pareja | Miguel Donoso Pareja (July 13, 1931 – March 16, 2015) was an Ecuadorian writer and 2006 Premio Eugenio Espejo Award-winner (Ecuador's National Prize in literature, given by the President of Ecuador).»
[[ ## question ## ]]
What country was the winner of the Nobel Prize in Literature in 2006 from and what was their name?
Respond with the corresponding output fields, starting with the field `[[ ## reasoning ## ]]`, then `[[ ## answer ## ]]`, and then ending with the marker for `[[ ## completed ## ]]`.
[31mResponse:[0m
[32m[[ ## reasoning ## ]]
The text mentions the 2006 Nobel Prize in Literature and states that Orhan Pamuk, a Turkish novelist, was the winner.
[[ ## answer ## ]]
Turkey, Orhan Pamuk
[[ ## completed ## ]][0m
Come si può notare, DSPy ha utilizzato il modello per generare il prompt:
Respond with the corresponding output fields, starting with the field
Ciò porta alla risposta corretta e al relativo inquadramento.
In questo tutorial, hai utilizzato DSPy per mettere a punto un agente RAG utilizzando la piattaforma watsonx. Il tuo agente RAG era composto da un modello linguistico, Llama 3 e da un modello di recupero, ColBert. Hai poi utilizzato DSPy per fare prompt engineering per un'attività di risposta alle domande compilando il tuo modello e generando un prompt.
Puoi scoprire di più su DSPy nel suo repository GitHub, dove troverai tutorial, demo e documentazione.