Il nostro scopo in questa guida consiste nel realizzare applicazioni in cui l'aspetto "risolutivo" sia attuato da un'Intelligenza Artificiale fornita da un modello. L'applicazione potrà essere in tutto e per tutto un normalissimo programma con o senza interfaccia grafica destinato alla produzione su web oppure desktop o da riga di comando. Avrà però come caratteristica distintiva la possibilità di richiamare librerie specifiche per l'interrogazione di una AI.
Ciò, come si immagina, arricchirà il tutto di potenzialità molto innovative. Come la previsione di risultati, la generazione di contenuti di vario genere, abilità di dialogo umanoidi permettendo di costruire chatbot, applicazioni di ricerca tra documenti e molto altro.
LangChain e applicazioni AI
Il linguaggio Python ed il suo sistema di librerie offrono già tutto il necessario ma quello che ci manca è un framework, una sorta di strato applicativo, all'interno del quale immergere tutte le componenti. Per questo ruolo scegliamo ed impariamo ad usare LangChain.
Una peculiarità di LangChain è la capacità di stabilire collegamenti tra le componenti in modo che ognuna di esse possa svolgere il proprio ruolo riuscendo a collaborare con le altre. Questa sorta di pipeline sono dette chain ovvero catene e tale aspetto è così iconico da apparire anche nel nome del framework stesso.
Il suo ecosistema
L'ecosistema di LangChain può essere ben rappresentato visualizzando l'immagine presente sul sito ufficiale del progetto e che riportiamo qui di seguito:

Figura 1. Ecosistema di LangChain
Possiamo interagire con LangChain sia in Python (una delle scelte più comuni e quella che praticheremo noi in questa guida) sia in Javascript. Come si vede dall'immagine, il framework è costituito da tre elementi principali:
- LangChain: rappresenta lo strato di base, open source e applicativo in cui trovare tutti gli elementi core, le integrazioni per accedere ai diversi LLM nonché librerie di terze parti;
- LangGraph: si focalizza sulla realizzazione di agenti dotati di persistenza e sul controllo dello stato e altre caratteristiche che permettono di incrementare molto le potenzialità di LangChain;
- LangSmith: offre un sottosistema dedicato in particolare a debugging, test e monitoraggio.
Come si vede, le aree in viola rappresentano delle zone sottoposte a politiche commerciali sebbene tutto ciò che impareremo per produrre applicazioni sia open source e, ove necessario, valuteremo eventuali regole di pricing e fasce gratuite.
LangChain e aspetti operativi
Esistono molti motivi per utilizzare LangChain. Tra questi vi è sicuramente la modularità della piattaforma che offre componenti per ogni punto dello sviluppo e del controllo dell'applicazione. Sarà possibile scegliere gli elementi che ci servono, installarli con un semplice comando pip
per la gestione delle dipendenze ed farli interagire tra loro facendo in modo che ognuno invochi i metodi dell'altro o utilizzando, in forma estremamente stringata, il linguaggio LCEL (LangChain Expression Language). Esso permetterà alle varie componenti di invocarsi a vicenda e di sfruttare una sintassi molto concisa per esprimere le chain mediante operatore pipe (|) il cui overload farà in modo che l'output di un elemento costituisca l'input del successivo.
Ad esempio, dovessimo individuare tre componenti (rappresentate qui con termini generici a livello simbolico) prompt
per la gestione dell'input, llm
per l'interazione con il modello linguistico e output
per la gestione dell'output, potremmo costruire una chain in questo modo:
chain= prompt | llm | output
per poterla poi invocare e attivare una sorta di catena di montaggio con:
chain.invoke("...")
Ciò passando la nostra query ovvero la richiesta per l'LLM come argomento di invoke
.
Passare una richiesta dal programma Python ad un LLM
Molto del lavoro che faremo ci vedrà muovere tra il blocco di base LangChain/LangGraph (orientiamoci sempre guardando la figura) e le Integrations ovvero dei package che permettono di integrare l'architettura che stiamo costruendo con delle "potenzialità" esterne. In primis gli LLM.
Ad esempio, quello che impareremo sin da subito consisterà nel passare una richiesta dal nostro programma Python ad un LLM (supponiamo quello di OpenAI) e riceveremo una risposta. Questo verrà fatto grazie all'integrazione langchain-openai
una libreria che si installa con:
pip install -qU langchain-openai
E mette a disposizione una classe come ChatOpenAI
:
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o-mini")
Ciò sarà sufficiente a passare una nostra richiesta a OpenAI con:
llm.invoke("...")
Questo non vuole essere una spiegazione tecnica (nella prossima lezione lo faremo davvero!). Vogliamo solo dimostrare le possibilità di interconnessione che le Integrations offrono mettendo a disposizione semplici oggetti Python che apriranno ponti di collegamento con AI rese disponibili da provider remoti o locali con un sistema intelligente come Ollama.
Come precederemo
Nel prosieguo delle lezioni studieremo singole componenti di LangChain muovendoci dall'interrogazione di un LLM, punto centrale di un'app basata su AI. Aggiungendo via via altri elementi per muoverci verso artefatti software sempre più completi. Questo per la creazione di applicazioni moderne, la definizione di Tool (strumenti attivati "d'iniziativa" dall'LLM ma programmati da noi o messi a disposizione da terze parti), gli importantissimi Agent di cui si parla molto e che fonderanno insieme LLM e Tool nonché strutture di ricerca tra documenti per arrivare alla produzione di RAG (Retrieval Augmented Generation).
Insomma, abbiamo tutti i concetti necessari per iniziare un percorso ricco di potenzialità e soddisfazioni.