Nel mondo della tecnologia moderna, l'intelligenza artificiale (IA) sta rivoluzionando il modo in cui interagiamo con i sistemi informatici. Una delle applicazioni più interessanti dell'IA è la creazione di chatbot avanzati, in grado di comprendere e rispondere a domande in modo naturale e contestualizzato. In questo articolo vedremo come creare un chatbot usando LangChain ed OpenAI (GPT).
Nel precedente articolo della nostra guida, abbiamo già visto come utilizzare LangChain con Ollama per realizzare una semplice applicazione capace di rispondere ai prompt degli utenti. In questo tutorial, riprenderemo l’argomento e creeremo un chatbot che possa fornire risposte contestualizzate, basate sull’intera conversazione, migliorando l’interazione e l’esperienza dell’utente.
Implementazione di un ChatBot con LangChain
La prima cosa da fare è installare il modulo di LangChain per l’integrazione con OpenAI. Questo modulo fornisce le funzionalità necessarie per connettersi e interagire con i modelli GPT di OpenAI:
pip install -qU langchain-openai
Come nel tutorial precedente, utilizzeremo un ChatPromptTemplate
per definire il system prompt. Il nostro obiettivo è realizzare un chatbot che aiuti gli utenti a pianificare un viaggio.
Di seguito i passaggi chiave:
- Invece di usare Ollama, questa volta utilizzeremo
ChatOpenAI
, il connettore specifico per OpenAI. - Inseriremo un
MessagesPlaceholder
, che sarà successivamente sostituito dall’elenco dei messaggi che costituiscono la conversazione. Questo placeholder è essenziale per mantenere il contesto della conversazione.
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
llm = ChatOpenAI(model="gpt-3.5-turbo")
prompt = ChatPromptTemplate.from_messages(
[
( "system", "You are an assistant who helps users plan trips.",),
MessagesPlaceholder(variable_name="messages"),
]
)
chain = prompt | llm
Per gestire la storicità della conversazione, useremo l’oggetto ChatMessageHistory
, che rappresenta una lista di messaggi. Questo ci permetterà di tenere traccia dei messaggi scambiati durante la sessione di chat.
Inoltre, per simulare il workflow di una chat, creeremo un ciclo che terminerà solo quando l’utente inserirà il comando “exit”. Questo ciclo permetterà al chatbot di continuare a rispondere fino a quando l’utente non decide di chiudere la conversazione.
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_community.chat_message_histories import ChatMessageHistory
llm = ChatOpenAI(model="gpt-3.5-turbo")
prompt = ChatPromptTemplate.from_messages(
[
( "system", "You are an assistant who helps users plan trips.",),
MessagesPlaceholder(variable_name="messages"),
]
)
chain = prompt | llm
history = ChatMessageHistory()
while(True):
message = input("User: ")
if(message.lower() == "exit"):
break
history.add_user_message(message)
response = chain.invoke({"messages": history.messages})
history.add_ai_message(response.content)
print("AI: " + response.content)
Il cuore del programma è il metodo invoke
. Questo metodo prende in input la history dei messaggi e la sostituisce al placeholder definito in precedenza. In questo modo, il modello GPT può generare risposte tenendo conto dell’intera conversazione.
Non resta dunque che testare il nostro chatbot con qualche richiesta:
User: Hi, I need help planning a trip
AI: Of course! I'd be happy to help you plan your trip. Where are you thinking of going and what kind of trip are you interested in?
User: I would like to go to Mexico!
AI: That's great! Mexico is a beautiful country with so much to offer. What specific cities or regions are you interested in visiting in Mexico? And do you have any particular activities or attractions in mind that you'd like to include in your itinerary?
...
User: exit
In questo tutorial, abbiamo esplorato come utilizzare LangChain con OpenAI e i prompt template per creare catene di linguaggio dinamiche e personalizzate. LangChain offre una grande flessibilità e potenza, permettendo di costruire applicazioni di elaborazione del linguaggio naturale complesse e scalabili.