Che cos'è il DSPy?

Autore/i:

Joshua Noble

Data Scientist

Che cos'è DSPy?

I modelli linguistici di grandi dimensioni (LLM), i workflow agentici e i database vettoriali sono diventati sempre più potenti e i framework per semplificare lo sviluppo di applicazioni AI hanno acquisito una popolarità sempre maggiore. DSPy è un toolkit che fornisce moduli generici che sostituiscono la prompt engineering e l'input diretto del linguaggio naturale con la configurazione usando il codice Python. 

In generale, lavorare con gli LLM o i foundation models richiede un prompt engineering attento, in cui l'utente modifica i prompt di testo per ottenere l'output corretto. Sebbene questo approccio possa essere efficace, richiede molto tempo, è soggetto a errori e crea toolchain deboli che devono essere aggiornate quando vengono rilasciate nuove versioni di un modello. Framework popolari come i modelli linguistici a catena LangChain per la creazione di applicazioni e LlamaIndex si concentrano sul miglioramento delle funzionalità di ricerca all'interno dei testi. Con questi, gli sviluppatori hanno comunque bisogno di esperienza nella messa a punto dei prompt e del tempo per testare ciascuno per ottenere l'output desiderato. DSPy semplifica questo processo di messa a punto dei prompt con un approccio programmatico per guidare e delimitare il comportamento del modello di linguaggio.

DSPy si concentra sull'automazione dell'ottimizzazione della costruzione del prompt. Per sostituire il prompt hacking e i generatori di dati sintetici una tantum, DSPy fornisce ottimizzatori generali, ossia sono che aggiornano i parametri del suo programma. Ogni volta che modifichi il codice, i dati, le asserzioni o le metriche, puoi compilare nuovamente il programma e DSPy eseguirà l'ottimizzazione per creare nuovi prompt efficaci che si adattino alle sue modifiche.

A volte le persone immaginano che l'ottimizzazione automatica dei prompt significhi creare un sistema in cui gli LLM criticano e migliorano i prompt generati dagli utenti. Questo non è il modo più efficace per utilizzare gli LLM. Il DSPy sfrutta la capacità di generare idee degli LLM per generare i propri prompt, quindi testa tali variazioni utilizzando un set di metriche di valutazione per vedere se risolvono meglio il problema. Se non ottengono prestazioni numeriche migliori su una metrica assegnata dall'utente, i prompt vengono eliminati. È simile a un algoritmo evolutivo in cui i prompt vengono valutati in base all'idoneità e migliorati in modo iterativo.

Casi d'uso di DSPy

DSPy può essere utile in diversi tipi di workflow e scenari. Fra quelli più comunemente usati troviamo la retrieval-augmented generation, la risposta alle domande multi-hop e il riepilogo dei documenti.

Chain of thought

Il chain of thought (CoT) prompting simula processi di ragionamento simili a quelli umani chiedendo al modello di scomporre attività complesse in una sequenza di passaggi logici fino ad arrivare a una risoluzione finale. Queste fasi di ragionamento vengono inserite nella finestra contestuale del modello, fornendogli maggiori basi sull'attività da svolgere e spesso portano a risposte migliori anche in scenari complessi. DSPy aiuta facendo in modo che il modello linguistico generi prompt e strategie di chain of thought, e li testa rispetto al modello linguistico per generare i prompt CoT più efficaci per il modello dato.

Retrieval Augmented Generation (RAG)

La retrieval-augmented generation (RAG) è un approccio che consente agli LLM di attingere a un ampio corpus di conoscenze dalle fonti e interrogare il suo archivio di conoscenze per trovare passaggi o contenuti pertinenti e produrre una risposta affinata. La RAG garantisce che gli LLM possano utilizzare le conoscenze in modo dinamico e in tempo reale anche se non sono originariamente addestrati sull'argomento e fornire risposte corrette. Questa potenza aggiuntiva comporta una maggiore complessità nella configurazione delle pipeline RAG. DSPy offre un approccio semplice alla creazione di pipeline di prompt e alla generazione di prompt efficaci (messa a punto dei prompt) o, nel caso di modelli più piccoli, alla messa a punto dei pesi dei modelli stessi.

Le pipeline RAG possono essere ottimizzate con il DSPy in due modi: utilizzando esempi etichettati o utilizzando esempi di bootstrapping. Gli esempi etichettati sono semplicemente preesistenti, gli esempi etichettati manualmente vengono utilizzati per addestrare direttamente il modello studente. Nel contesto DSPy, bootstrapping significa utilizzare una modalità linguistica in un paradigma insegnante-studente. L'insegnante genera nuovi esempi di formazione sulla base di alcuni prompt forniti dall'utente. Questi esempi di bootstrapping vengono poi utilizzati insieme o al posto degli esempi etichettati manualmente per addestrare il modulo studente finché non fornisce le risposte corrette. I prompt che generano le risposte corrette vengono quindi aggiornati in modo iterativo in tutta la pipeline DSPy.

Risposta alle domande sul multi-hop

Molte volte, una singola query di ricerca non è sufficiente per un'attività di domande e risposte complessa. Il popolare set di dati HotPot Question Answering è costituito da domande che richiedono l'analisi e il recupero di più domande prima di poter rispondere. Ad esempio: "Bill Nelson ha volato come Payload Specialist su uno space shuttle lanciato per la prima volta in che anno?" Questa risposta richiede di sapere che Bill Nelson ha volato sullo Space Shuttle Columbia e poi essere in grado di determinare che il Columbia è stato lanciato per la prima volta nel 1981.

L'approccio standard a questa sfida nella letteratura aumentata di recupero è la costruzione di un sistema di ricerca multi-hop. Si tratta di sistemi in grado di leggere i risultati recuperati e di generare ulteriori domande per raccogliere informazioni aggiuntive quando necessario prima di arrivare a una risposta definitiva. Utilizzando DSPy è possibile creare lo stesso sistema in poche righe di codice in un modo robusto che consente di aggiornare i modelli ed eseguire nuovamente la pipeline.

Riepilogo

Il riassunto riepiloga un testo più lungo in una versione più breve, pur mantenendone le informazioni chiave e le idee principali. È una competenza fondamentale per un LLM, le cui applicazioni spaziano dalla creazione di abstract di articoli alla generazione di report concisi a partire da documenti lunghi.

La valutazione della qualità delle sintesi prodotte dai modelli linguistici presenta sfide significative. A differenza delle attività con risposte chiare (giuste o sbagliate), la qualità della sintesi è spesso soggettiva e dipende dal contesto. Il modello deve bilanciare la conservazione delle informazioni con la sintesi, preservando il tono e l'intento del testo originale e garantire l'accuratezza dei fatti senza introdurre errori. L'adattamento a diversi tipi di materiale di partenza e scopi riassuntivi rappresenta un'ulteriore sfida. Il DSPy consente di utilizzare dati etichettati per adattare i prompt di riepilogo e ottenere le migliori risposte possibili.

Concetti in DSPy

DSPy ha un vocabolario e una terminologia propri, e imparare alcuni di questi termini chiave ti aiuterà a fare chiarezza sull'architettura generale.

Compilazione: questo processo è il modo in cui il DSPy traduce un programma basato su Python in istruzioni che un modello linguistico può comprendere ed eseguire in modo efficiente. 

Firma: si tratta di una classe che definisce i tipi di input e output di un modulo, garantendo la compatibilità tra i diversi moduli in un programma DSPy. Alcuni esempi di firme sono attività come l'inserimento di una domanda, l'output del ragionamento e della risposta o l'acquisizione di un documento di input che dà come output un riassunto.

Ottimizzatore: questo componente di DSPy mette a punto il programma compilato per il modello di linguaggio specifico che stai utilizzando, ad esempio GPT3.5-Turbo, GPT-4.0 o Llama 3.1. Gli ottimizzatori garantiscono la massimizzazione delle prestazioni e della precisione del programma. Nelle versioni precedenti di DSPy, venivano chiamati teleprompter. I programmi DSPy sono costituiti da più chiamate a modelli linguistici che vengono impilate insieme come moduli DSPy. Ogni modulo DSPy ha tre tipi di parametri interni: i pesi LM, le istruzioni da seguire e le dimostrazioni memorizzate del comportamento di input/output.

Quando viene fornita una metrica, DSPy crea prompt ottimizzati utilizzando tutti i pesi, le istruzioni e il comportamento del modello con algoritmi di ottimizzazione multistadio. Questi possono combinare la discesa del gradiente (per i pesi dei modelli linguistici) e l'ottimizzazione discreta basata su modelli linguistici, ovvero per creare o aggiornare istruzioni e per creare o convalidare dimostrazioni. Le dimostrazioni DSPy sono simili agli esempi few-shot, ma sono molto più potenti. Possono essere creati da zero, e il tuo programma e la loro creazione e selezione possono essere ottimizzati in molti modi efficaci.

In molti casi, la compilazione porta a prompt migliori rispetto alla scrittura umana perché gli ottimizzatori possono provare più cose in modo molto più sistematico e adattare le metriche in modo più rispetto a un essere umano.

Pipeline: una "pipeline" è il modo in cui il DSPy si riferisce a una sequenza di moduli connessi che collaborano per svolgere un compito complesso. Ad esempio, una pipeline potrebbe riassumere un articolo, tradurlo da una lingua di origine a una lingua di destinazione e quindi generare domande su di esso in una lingua di destinazione.

Metriche: DSPy definisce diverse metriche per misurare le prestazioni dell'output. Poniamo ad esempio che tu abbia bisogno che l'output corrisponda esattamente alla tua etichetta. In altri casi, una corrispondenza parziale potrebbe essere la soluzione più adatta. Una metrica comunemente utilizzata fornita da DSPy è la semantica F1, che misura quanto dell'informazione contenuta nell'etichetta è presente nella risposta e quanti pochi dati estranei non presenti nella risposta target etichettata sono presenti nella risposta. Se hai bisogno di un modo diverso per misurare le prestazioni, puoi anche fornire le tue metriche personalizzate.

Utilizzo di DSPy

Per iniziare a usare il DSPy è sufficiente chiamare pip install dspy-ai. Non è richiesto alcun hardware particolare poiché la maggior parte dei modelli può essere utilizzata nel cloud tramite un’API o eseguita localmente. Il DSPy può essere eseguito localmente o su ambienti notebook in hosting come Google Colab o watson Studio.

Una tipica pipeline DSPy per retrieval-augmented generation consiste di un modello linguistico e un modello di recupero. Ad esempio, per lavorare con OpenAI GPT-3.5 Turbo come modello linguistico e ColBERTV2 retriever come modello di recupero, dovremmo configurare DSPy come segue:

import dspy
turbo = dspy.OpenAI(model=’gpt-3.5-turbo’)
colbertv2_wiki17_abstracts = dspy.ColBERTv2(url=’http://20.102.90.50:2017/wiki17_abstracts’)
# set the language model and the retrieval model
dspy.settings.configure(lm=turbo, rm=colbertv2_wiki17_abstracts)

 

Creazione delle firme

Le firme sono modelli che consentono di configurare la struttura dei campi di input e output per il modello linguistico e il modello di recupero. Ad esempio, questo frammento di codice mostra la sintassi per dare al modello linguistico un prompt con contesto e al modello di recupero un prompt con la struttura:

class GenerateAnswer(dspy.Signature):
    “””Answer questions with short factoid answers.”””
    context = dspy.InputField(desc=”may contain relevant facts”)
    question = dspy.InputField()
    answer = dspy.OutputField(desc=”often between 1 and 5 words”)

Includiamo piccole descrizioni per il contesto e i campi di risposta in modo che definiscano linee guida più solide su ciò che il modello riceverà e genererà.

Compilazione

Una volta definite le firme, puoi eseguire il programma e creare prompt ottimali per la tua attività utilizzando un ottimizzatore appropriato. In DSPy questo processo è chiamato compilazione: la compilazione di un programma aggiornerà i parametri memorizzati in ciascun modulo. Nella maggior parte degli scenari, ciò avviene principalmente sotto forma di raccolta e selezione di dimostrazioni ottimali da includere nel prompt.

Per la compilazione sono richiesti:

• Un set di addestramento o esempi bootstrap.

• Una metrica per la convalida. In uno scenario RAG, questo sarebbe un modo per misurare l’accuratezza della risposta prevista e se il contesto recuperato contiene la risposta.

• Un ottimizzatore specifico per generare i prompt da testare. Ad esempio, l’ottimizzatore BootstrapFewShot può essere utilizzato per generare prompt poi testarli.

Per compilare un programma DSPy, dovrai configurare i modelli che desideri utilizzare e passarli al metodo di compilazione dell’ottimizzatore selezionato. Ad esempio, un programma per un’applicazione RAG conterrà un modello linguistico e un modello di recupero, i quali verranno passati al metodo di compilazione e utilizzati dall’ottimizzatore per impostare il contesto per la generazione del linguaggio.

Quindi si definisce una metrica per valutare sia il modello di recupero che quello linguistico. Quella definizione delle metriche verrebbe poi data a un ottimizzatore come l’ottimizzatore BootstrapFewShot o LabeledFewShot da utilizzare per valutare i prompt generati dal modello linguistico. Infine, l’ottimizzatore compila un modulo personalizzato contenente il metodo di inoltro definito dall’utente insieme a un set di dati di addestramento.

La selezione dell’ottimizzatore da utilizzare richiede in genere una sperimentazione, ma ci sono alcune linee guida:

• Se hai pochissimi esempi (circa 10), puoi iniziare con BootstrapFewShot per generare nuovi dati di addestramento.

• Se hai più dati, ad esempio 50 esempi o più, prova BootstrapFewShotWithRandomSearch per generare nuovi dati di addestramento su parti casuali dei tuoi.

• Se hai bisogno di un programma molto efficiente, puoi mettere a punto un piccolo LLM per la tua attività con BootstrapFinetune.

Valutazione e iterazione

Dopo aver compilato il programma e confrontato le metriche, potresti essere soddisfatto dei risultati oppure scoprire che qualcosa nel programma finale o nei risultati non ti soddisfa in base alle metriche scelte. Lo sviluppo iterativo è fondamentale. DSPy fornisce gli strumenti per farlo in modo incrementale attraverso l’iterazione sui dati, l’aggiornamento della struttura del programma, le metriche scelte e l’ottimizzatore scelto.

Per saperne di più

DSPy è open source, quindi puoi ispezionare il codice e vedere i progressi dello sviluppo. I documenti sul sito StanfordNLP su Github contengono la documentazione e diversi tutorial e demo dettagliate su come iniziare con DSPy.

Soluzioni correlate
IBM® watsonx.ai

Addestra, convalida, adatta e implementa le funzionalità di AI generativa, foundation model e machine learning con IBM watsonx.ai, uno studio aziendale di nuova generazione per builder AI. Crea applicazioni AI in tempi ridotti e una minima quantità di dati.

Esplora watsonx.ai
Soluzioni di intelligenza artificiale

Metti l'AI al servizio della tua azienda con l'esperienza leader di settore e il portfolio di soluzioni di IBM nel campo dell'AI.

Esplora le soluzioni AI
Consulenza e servizi per l'intelligenza artificiale (AI)

I servizi di AI di IBM Consulting aiutano a reinventare il modo in cui le aziende lavorano con l'AI per la trasformazione.

Esplora i servizi AI
Prossimi passi

Attraverso l'AI, IBM Concert scopre insight di importanza chiave sulle operazioni e fornisce raccomandazioni specifiche per migliorare le applicazioni. Scopri come Concert può migliorare il tuo business.

Esplora Concert Esplora le soluzioni di automazione dei processi aziendali