Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Creare un chatbot AI

Come creare un chatbot AI. Utilizziamo il framework LangGraph integrato in Langchain per interagire con il nostro modello generativo
Come creare un chatbot AI. Utilizziamo il framework LangGraph integrato in Langchain per interagire con il nostro modello generativo
Link copiato negli appunti

Con quanto abbiamo trattato finora su messaggi e LangGraph, abbiamo il background tecnico per poter creare un chatbot AI.

Parliamo di chatbot intendendo un programma che riceve messaggi da un utente e vi dialoga rispondendo, in questo ambito, con le potenzialità di un modello di Intelligenza Artificiale generativa. Il meccanismo di base - al di là degli aspetti di input, output e invocazione di un LLM che ormai conosciamo - consiste nel mantenere una lista di messaggi, sia dell'LLM sia dell'utente, in modo che ad ogni risposta il chatbot prenda atto dello storico della conversazione. Potenzialmente, il chatbot deve essere in grado di gestire più conversazioni contemporaneamente escogitando un modo per distinguere liste di messaggi diversi per conversazioni differenti.

In questa lezione, creeremo un chatbot sfruttando ciò che sappiamo su un'architettura LangGraph più altri aspetti che conosceremo qui.

Struttura dell'esempio

Quando si pensa a programmare su LangGraph dobbiamo per prima cosa identificare i nodi. Dovendo gestire una chat ci servirà un nodo per ricevere l'input utente, uno per sottoporlo insieme a tutti i messaggi storici all'LLM ed uno per formattare l'output.

Un'applicazione di questo tipo si basa essenzialmente su una struttura ciclica che in LangGraph è facilmente realizzabile con gli archi che ricollegano il nodo finale ad uno precedente di ripartenza. Quello però che ci servirà è un cosiddetto arco condizionale, una specie di if, in cui l'arco deciderà in base ad una funzione di valutazione verso quale nodo procedere.

Nuovi elementi:MessagesState e il checkpointer

Nell'uso di LangGraph sappiamo che è fondamentale definire una classe che rappresenta lo stato del grafo. Possiamo definirla come vogliamo ma in questo caso ne usiamo una, perfetta per chatbot, che si chiama MessagesState. Questa contiene un unico elemento, messages, in cui si preoccupa di accodare tutti i messaggi che scambieremo con l'LLM. Ci eviterà insomma di gestire noi una lista con un continuo accodamento di nuovi messaggi. Questa lista formerà il contesto su cui lavorerà, per ogni risposta, il modello.

Il checkpointer serve invece a gestire il salvataggio in memoria (volatile o persistente) dello stato del grafo. Ne esistono di molti tipi. Noi in questo esempio ne useremo uno ideale per iniziare, il MemorySaver, che salva lo stato del grafo in memoria volatile. Ne esistono molte altre versioni che salvano su memoria persistente come database Redis o Sqlite. Al momento dell'invocazione, tra l'altro, passeremo un elemento config che contiene l'identificatore thread_id che permetterà di associare tutti i messaggi con un'unica chat per poterla distinguere in casi di multiutenza in cui il chatbot porterà avanti più chat contemporanee usando per ognuna un thread_id differente.

Il codice per creare un chatbot AI

Quello che segue è il codice del nostro chatbot:

from langgraph.checkpoint.memory import MemorySaver
from langgraph.graph import MessagesState, StateGraph
from langchain.chat_models import init_chat_model
from langchain_core.messages import HumanMessage
# Predisponiamo il modello
model = init_chat_model(
    model="gpt-4.1-nano",
    model_provider="openai"
)
# funzioni
def utente_chiede(state: MessagesState) -> MessagesState:
    messaggio_utente = input("Tu: ")
    return {"messages": [HumanMessage(content=messaggio_utente)]}
def risposta_AI(state: MessagesState) -> MessagesState:
    risposta = model.invoke(state["messages"])
    print(f"AI: {risposta.content}")
    return {"messages": [risposta]}
def continuare(state: MessagesState) -> str:
    # qui si decide se il dialogo prosegue
    ultimo_msg = state['messages'][-1].content
    if ultimo_msg.lower() in ("basta", "fine", "chiudi"):
        return "FINE"
    return "CONTINUA"
def fine_conversazione(state: MessagesState) -> MessagesState:
    print(f"Conversazione terminata! Dopo {len(state['messages'])} messaggi")
    return state
# Preparazione del grafo
workflow = StateGraph(MessagesState)
# Aggiungiamo i nodi
workflow.add_node("richiesta", utente_chiede)
workflow.add_node("ragionamento", risposta_AI)
workflow.add_node("fine", fine_conversazione)
workflow.set_entry_point("richiesta")
# decidiamo se la conversazione prosegue
workflow.add_conditional_edges(
    "richiesta",
    continuare,
    {
        "CONTINUA": "ragionamento",
        "FINE": "fine"
    }
)
workflow.add_edge("ragionamento", "richiesta")
workflow.set_finish_point("fine")
app = workflow.compile(checkpointer=MemorySaver())
config = {"configurable": {"thread_id": "chat_di_prova"}}
print("Inizia la conversazione (scrivi 'basta', 'fine' o 'chiudi' per terminare)")
messaggi_iniziali = []
stato_finale = app.invoke({"messages": messaggi_iniziali}, config)

Notiamo che tutti i messaggi saranno gestiti tramite l'elemento messages predefinito in MessagesState e che il messaggio più recente sarà sempre quello con indice -1 trattandosi dell'ultimo accodato.

Un aspetto fondamentale è l'arco condizionale che rivediamo qui:

workflow.add_conditional_edges(
    "richiesta",
    continuare,
    {
        "CONTINUA": "ragionamento",
        "FINE": "fine"
    }
)

All'uscita del nodo etichettato come richiesta, lo stato verrà passato alla funzione continuare, in cui in base al contenuto dello stato sarà prodotta una stringa di risposta ("CONTINUA" o "FINE") con cui si deciderà dove dirottare l'esecuzione. Questo meccanismo è ciò che permetterà all'utente di interrompere la chat digitando basta, fine o chiudi.

Un esempio di sessione di dialogo con il chatbot AI

Ecco un esempio di sessione di dialogo (con alcune risposte abbreviate per comodità):

Inizia la conversazione (scrivi 'basta', 'fine' o 'chiudi' per terminare)
Tu: ciao
AI: Ciao! Come posso aiutarti oggi?
Tu: Parliamo di vacanze
AI: Ottimo! Le vacanze sono sempre un argomento piacevole. Dove ti piacerebbe andare o quale tipo di vacanza ti interessa?
 Mare, montagna, città d'arte o qualcosa di avventuroso?
Tu: Se mi piace il Sud Italia e amo il mare quali posti mi consiglieresti?
AI: Se ami il Sud Italia e il mare, ci sono tantissimi luoghi meravigliosi che potresti visitare!
 Ecco alcune delle destinazioni più belle:
1. **Costiera Amalfitana (Campania)** – Famosa per i suoi paesaggi mozzafiato, i borghi pittoreschi come Positano, Amalfi e
 Ravello, e il mare cristallino. È un vero gioiello per chi ama il mare e i panorami suggestivi.
2. **Sicilia** – Regala spiagge incantevoli come quelle
 ...
 ...
Se vuoi, posso aiutarti a pianificare un itinerario più dettagliato o darti altre idee!
Tu: Mi hai dato ottime idee grazie!
AI: Sono felice che ti siano piaciute le idee! Se hai bisogno di ulteriori consigli su dove andare, cosa fare o
 dove trovare le migliori spiagge, sono qui per aiutarti. Buona pianificazione e spero che le tue vacanze nel
 Sud Italia siano indimenticabili!
Tu: fine
Conversazione terminata! Dopo 9 messaggi

Qui c'è tutto il fulcro di quello che può essere un chatbot, tipologia di software dai mille usi. Se lo scopo di questa guida è imparare a realizzare applicazioni su AI possiamo dire che già la base di un prototipo ce l'abbiamo!

Se vuoi aggiornamenti su Creare un chatbot AI inserisci la tua email nel box qui sotto:

Compilando il presente form acconsento a ricevere le informazioni relative ai servizi di cui alla presente pagina ai sensi dell'informativa sulla privacy.

Ti consigliamo anche