I large language model (LLM) come OpenAI GPT, Google BERT e Meta LLaMA stanno rivoluzionando ogni settore grazie alla loro capacità di generare quasi qualsiasi testo tu possa immaginare, dal copy di marketing al codice per data science fino alla poesia. Sebbene ChatGPT abbia attirato gran parte dell’attenzione grazie alla sua interfaccia chat intuitiva, ci sono molte altre opportunità per sfruttare gli LLM integrandoli in altro software.
Per esempio, DataLab include un Assistente AI che ti permette di scrivere o migliorare il codice e il testo della tua analisi, e i corsi interattivi di DataCamp includono una funzione "spiega il mio errore" per aiutarti a capire dove hai sbagliato. Queste funzionalità sono alimentate da GPT e accessibili tramite l’API di OpenAI.
LangChain fornisce un framework sopra diverse API per LLM. È progettato per rendere sviluppatori software e data engineer più produttivi quando integrano AI basata su LLM nelle loro applicazioni e pipeline di dati.
Questo tutorial illustra i problemi che LangChain risolve e i suoi principali casi d’uso, così potrai capire perché e dove usarlo. Prima della lettura, è utile comprendere l’idea di base di un LLM. Il tutorial Come l’NLP sta cambiando il futuro della data science è un buon punto per rinfrescare le tue conoscenze.
Quali problemi risolve LangChain?
Esistono sostanzialmente due flussi di lavoro per interagire con gli LLM.
- Il "chatting" consiste nello scrivere un prompt, inviarlo all’AI e ricevere una risposta testuale.
- L’"embedding" consiste nello scrivere un prompt, inviarlo all’AI e ricevere in risposta un array numerico.
Sia i flussi di chatting che di embedding presentano alcuni problemi che LangChain cerca di affrontare.
I prompt sono pieni di testo boilerplate
Uno dei problemi sia con il chatting che con l’embedding è che creare un buon prompt richiede molto più che definire un semplice compito da svolgere. Devi anche descrivere la personalità e lo stile di scrittura dell’AI e includere istruzioni per favorire l’accuratezza fattuale. Cioè, potresti voler scrivere un prompt semplice che descriva un compito:
Write an outline for a 500-word blog post targeted at teenagers about the health benefits of doing yoga.
Tuttavia, per ottenere una buona risposta, devi scrivere qualcosa di più simile a:
You are an expert sports scientist. Your writing style is casual but terse.
Write an outline for a 500-word blog post targeted at teenagers about the health benefits of doing yoga.
Only include factually correct information. Explain your reasoning.
Gran parte di questo testo boilerplate nel prompt sarà lo stesso da un prompt all’altro. Idealmente, vuoi scriverlo una volta e farlo includere automaticamente in qualunque prompt desideri.
LangChain risolve il problema del testo boilerplate nei prompt fornendo prompt template. Questi combinano l’input utile del prompt (in questo caso, il testo sullo scrivere un post sul blog riguardo allo yoga) con il boilerplate (lo stile di scrittura e la richiesta di informazioni fattualmente corrette).
Le risposte sono non strutturate
Nei flussi di chatting, la risposta del modello è semplicemente testo. Tuttavia, quando l’AI è utilizzata all’interno di un software, spesso è auspicabile avere un output strutturato su cui poi poter programmare. Per esempio, se l’obiettivo è generare un dataset, vorresti che la risposta fosse fornita in un formato specifico come CSV o JSON.
Supponendo di riuscire a scrivere un prompt che porti l’AI a fornire costantemente una risposta in un formato adatto, ti serve un modo per gestire quell’output. LangChain fornisce strumenti di output parser proprio a questo scopo.
È difficile passare da un LLM all’altro
Sebbene GPT abbia un enorme successo, ci sono molti altri LLM disponibili. Programmando direttamente contro l’API di un’azienda, vincoli il tuo software a quell’ecosistema. È del tutto plausibile che, dopo aver costruito le tue funzionalità AI su GPT, ti accorga che per il tuo prodotto servono capacità multilingue più solide. Potresti quindi voler passare a Polyglot o passare dall’uso di un’AI all’inclusione dell’AI nel tuo prodotto e richiedere un modello più compatto come StableLM di Stability AI.
LangChain fornisce una classe LLM, e questa astrazione rende molto più semplice sostituire un modello con un altro o persino utilizzare più modelli all’interno del tuo software.
Gli LLM hanno una memoria corta
La risposta di un LLM è generata in base alla conversazione precedente (sia i prompt dell’utente sia le sue risposte precedenti). Tuttavia, gli LLM hanno una memoria piuttosto breve. Anche il più avanzato GPT-4 predefinisce una memoria di 8.000 token (circa 6.000 parole).
In un flusso di chatting, se la conversazione supera i limiti di memoria, le risposte dell’AI possono diventare incoerenti (poiché non ha ricordo dell’inizio della conversazione). I chatbot sono un esempio in cui questo può essere un problema. Idealmente, vuoi che il chatbot ricordi l’intera conversazione con il cliente per non fornire informazioni contraddittorie.
LangChain risolve il problema della memoria fornendo strumenti di cronologia dei messaggi. Questi ti permettono di reinviare i messaggi precedenti all’LLM per ricordargli di cosa si stava parlando.
È difficile integrare l’uso degli LLM nelle pipeline
Quando sono usate in pipeline di dati o in applicazioni software, le AI sono spesso solo una parte di una funzionalità più ampia. Per esempio, potresti voler recuperare dei dati da un database, passarli all’LLM, quindi elaborare la risposta e inviarla a un altro sistema.
LangChain fornisce strumenti per flussi di tipo pipeline tramite chain e agent. Le chain sono oggetti semplici che essenzialmente concatenano diversi componenti (per pipeline lineari). Gli agent sono più sofisticati e permettono, tramite logica di business, di scegliere come i componenti devono interagire. Per esempio, potresti voler avere una logica condizionale in base all’output di un LLM per decidere quale sarà il passo successivo.
Passare dati all’LLM è complicato
La natura testuale degli LLM fa sì che spesso non sia del tutto chiaro come passare i dati al modello. Il problema ha due parti.
Per prima cosa, devi archiviare i dati in un formato che ti permetta di controllare quali porzioni del dataset verranno inviate all’LLM. (Per dataset rettangolari come un DataFrame o una tabella SQL, in genere vuoi inviare i dati una riga alla volta.)
In secondo luogo, devi stabilire come includere quei dati nel prompt. L’approccio più semplice è includere direttamente il dataset nel prompt ("prompt stuffing"), ma sono disponibili opzioni più sofisticate.
LangChain risolve la prima parte del problema con gli index. Questi forniscono funzionalità per importare dati da database, file JSON, pandas DataFrame, file CSV e altri formati e archiviarli in un formato adatto a servirli riga per riga a un LLM.
LangChain fornisce chain correlate agli index per risolvere la seconda parte del problema e offre classi per quattro tecniche per passare dati all’LLM.
Il prompt stuffing inserisce l’intero dataset nel prompt. È molto semplice ma funziona solo quando hai un dataset piccolo.
La map-reduce divide i dati in blocchi, chiama l’LLM con un prompt iniziale su ciascun blocco di dati (la parte "map"), quindi richiama l’LLM, questa volta con un prompt diverso che include le risposte del primo giro di prompt. È appropriato ogni volta che penseresti di usare un comando "group by".
Refine è un approccio iterativo in stile bayesiano, in cui esegui un prompt sul primo blocco di dati, poi per ciascun blocco aggiuntivo usi un prompt che chiede all’LLM di affinare il risultato in base al nuovo dataset. Questo approccio funziona bene se stai cercando di far convergere la risposta verso un output specifico.
Map-rerank è una variante della map-reduce. La prima parte del flusso è la stessa: suddivide i dati in blocchi e chiama un prompt su ciascun blocco. La differenza è che chiedi all’LLM di fornire un punteggio di confidenza per la sua risposta, così da poter classificare gli output. Questo approccio funziona bene per compiti di tipo raccomandazione in cui il risultato è una singola risposta "migliore".
Quali linguaggi di programmazione sono supportati da LangChain?
LangChain può essere usato da JavaScript tramite il pacchetto node langchain. È adatto per integrare l’AI nelle applicazioni web.
Può essere usato anche da Python tramite il pacchetto langchain (PyPI, conda). È adatto per includere l’AI in pipeline di dati o software basato su Python.
Quali sono i principali casi d’uso di LangChain?
LangChain può essere usato ovunque potresti voler usare un LLM. Qui tratteremo diversi esempi legati ai dati, spiegando quali funzionalità di LangChain sono rilevanti.
Interrogare dataset in linguaggio naturale
Uno dei casi d’uso più trasformativi degli LLM per l’analisi dei dati è la capacità di scrivere query SQL (o l’equivalente codice Python o R) usando il linguaggio naturale. Questo rende l’analisi esplorativa dei dati accessibile a chi non ha competenze di coding.
Esistono diverse varianti del flusso di lavoro. Per dataset piccoli, puoi far generare i risultati direttamente all’LLM. Ciò comporta il caricamento dei dati in un formato appropriato usando i document loader di LangChain, il passaggio dei dati all’LLM tramite chain correlate agli index e l’analisi della risposta usando un output parser.
Più comunemente, passeresti all’LLM i dettagli della struttura dei dati (come nomi delle tabelle, nomi e tipi delle colonne e informazioni come quali colonne hanno valori mancanti) e gli chiederesti codice SQL/Python/R. Poi eseguiresti il codice risultante. Questo flusso è più semplice, perché non richiede il passaggio dei dati, anche se LangChain è comunque utile perché può modularizzare i passaggi.
Un’altra variante sarebbe includere una seconda chiamata all’LLM per fargli interpretare i risultati. Questo tipo di flusso, che prevede chiamate multiple all’LLM, è dove LangChain aiuta davvero. In questo caso, puoi usare gli strumenti di cronologia dei messaggi per assicurarti che l’interpretazione dei risultati sia coerente con la struttura dei dati che hai fornito in precedenza.
Interagire con le API
Per casi d’uso sui dati come la creazione di una pipeline, includere l’AI di un LLM è spesso parte di un flusso più lungo che coinvolge altre chiamate API. Per esempio, potresti voler usare un’API per recuperare dati azionari o per interagire con una piattaforma cloud.
Le funzionalità di chain e agent di LangChain, che ti permettono di collegare questi passaggi in sequenza (e usare ulteriore logica di business per pipeline ramificate), sono ideali per questo caso d’uso.
Costruire un chatbot
I chatbot sono uno dei casi d’uso più popolari dell’AI, e l’AI generativa ha un grande potenziale per chatbot dal comportamento più realistico. Tuttavia, può essere macchinoso controllarne la personalità e far sì che ricordino il contesto della conversazione.
I prompt template di LangChain ti danno controllo sia sulla personalità del chatbot (tono di voce e stile di comunicazione) sia sulle risposte che fornisce.
Inoltre, gli strumenti di cronologia dei messaggi sono utili per fornire al chatbot una memoria più lunga rispetto alle poche centinaia o migliaia di parole che gli LLM offrono di default, consentendo maggiore coerenza all’interno di una conversazione o anche tra conversazioni multiple.
Altri usi
Questo tutorial tocca solo la superficie delle possibilità. Esistono molti altri casi d’uso degli LLM per i professionisti dei dati. Che tu sia interessato a creare un assistente personale, riassumere report o rispondere a domande su documenti di supporto o una knowledge base, LangChain fornisce un framework per includere l’AI in qualsiasi pipeline o applicazione dati tu possa immaginare.
Fai un passo in più
I contenuti su LangChain arriveranno presto su DataCamp. Nel frattempo, puoi approfondire uno dei casi d’uso trattati qui seguendo il corso Building Chatbots in Python.

