top of page

Chatbot più Intelligenti con Python e LangChain: Come Aggiungere Memoria per Prestazioni Superiori

Dopo aver esplorato le basi di LangChain e il suo potente abbinamento con Python nei nostri precedenti articoli, è tempo di addentrarci in una caratteristica che eleva il livello dei nostri chatbot o agenti: la memoria.


Ebbene si, proprio come noi "esseri umani o animali" possiamo dare ai chatbot o agli agenti autonomi una memoria, la quale può essere di diversi tipi e funzioni.


L'integrazione della memoria nei chatbot non solo li rende più intelligenti, ma li rende anche più naturali e utili per gli utenti. In questo articolo, esploreremo come LangChain e Python possono essere utilizzati per integrare la memoria nei chatbot, permettendo loro di ricordare le interazioni passate e di fornire risposte più contestualizzate e pertinenti. Analizzeremo la documentazione ufficiale di LangChain, illustrando passo dopo passo come implementare la memoria nei tuoi chatbot



Serie di articoli su LangChain e python



Cos'è la memoria in LangChain e Python?

La memoria è un elemento fondamentale quando si tratta di chatbot. Ma cosa significa esattamente? Bene, in LangChain, la memoria è strettamente legata al concetto di stato. Quando un utente interagisce con un modello di linguaggio, queste interazioni vengono catturate e storicizzate. Questo processo di cattura e conservazione delle informazioni è essenzialmente ciò che costituisce la memoria in LangChain.


Ora, potresti chiederti: "Come può essere utilizzata questa memoria?" LangChain offre due modi principali per utilizzare la memoria. Uno è attraverso le funzioni autonome, che estraggono informazioni da una sequenza di messaggi. L'altro è attraverso l'uso della memoria all'interno di una catena, che discuteremo più avanti.


Inoltre, la memoria può restituire diverse forme di informazione. Ad esempio, potrebbe restituire gli N messaggi più recenti oppure un riassunto di tutti i messaggi precedenti. Questa informazione può essere una stringa o una lista di messaggi.


Ecco un esempio di codice Python che mostra come creare una struttura di memoria base:


from langchain.memory import ChatMessageHistory

# Crea una nuova istanza di ChatMessageHistory
history = ChatMessageHistory()

# Aggiungi un messaggio dell'utente e un messaggio dell'IA alla storia
history.add_user_message("Ciao!")
history.add_ai_message("Salve, come posso aiutarti oggi?")

# Stampa la storia dei messaggi
print(history.messages)


ChatMessageHistory: Gestione dei messaggi

In LangChain, la gestione dei messaggi avviene tramite la classe ChatMessageHistory. Questa classe è un componente fondamentale del modulo di memoria ed è responsabile della registrazione e della gestione dei messaggi scambiati durante una conversazione tra l'utente e l'IA.


È importante notare che questa classe è utilizzata non solo per conservare i messaggi, ma anche per fornire metodi per aggiungere nuovi messaggi alla conversazione e per estrarre tutti i messaggi esistenti.


L'uso di ChatMessageHistory inizia con la creazione di una nuova istanza della classe. Questa nuova istanza rappresenta una conversazione vuota pronta a contenere messaggi. A partire da qui, l'interazione con ChatMessageHistory avviene principalmente attraverso due metodi: add_user_message e add_ai_message. Questi metodi permettono rispettivamente di aggiungere un messaggio dell'utente e un messaggio dell'IA alla conversazione.


Ogni messaggio aggiunto alla conversazione viene memorizzato in un formato specifico. I messaggi dell'utente vengono memorizzati come istanze della classe HumanMessage, mentre i messaggi dell'IA vengono memorizzati come istanze della classe AIMessage. Queste classi contengono informazioni come il contenuto del messaggio e altre informazioni aggiuntive che potrebbero essere utili per gestire la conversazione.


Una volta che i messaggi sono stati aggiunti alla conversazione, possono essere recuperati utilizzando la proprietà messages di ChatMessageHistory. Questa proprietà restituisce una lista di tutti i messaggi nella conversazione, conservando l'ordine in cui sono stati aggiunti.


Ecco un esempio di come si può utilizzare ChatMessageHistory per gestire i messaggi di una conversazione:


from langchain.memory import ChatMessageHistory

# Crea una nuova istanza di ChatMessageHistory
history = ChatMessageHistory()

# Aggiungi alcuni messaggi alla storia
history.add_user_message("Ciao, come stai?")
history.add_ai_message("Sto bene, grazie! E tu?")

# Stampa tutti i messaggi nella storia
for message in history.messages:
    print(message.content)


ConversationBufferMemory: Salvare e recuperare i messaggi

La classe ConversationBufferMemory è un'altra parte importante del modulo di memoria in LangChain. Questa classe funge da contenitore per una conversazione, e fornisce metodi per aggiungere messaggi alla conversazione e per caricare le variabili di memoria.


A differenza di ChatMessageHistory, ConversationBufferMemory non solo conserva i messaggi, ma li estrae anche in una forma utilizzabile. In particolare, ConversationBufferMemory può estrarre i messaggi come una stringa unica o come una lista di messaggi. Questo può essere utile in diverse situazioni, ad esempio quando si desidera presentare all'utente un riassunto della conversazione, o quando si desidera analizzare i messaggi individualmente.


L'uso di ConversationBufferMemory è molto simile a quello di ChatMessageHistory. Iniziamo creando una nuova istanza di ConversationBufferMemory, poi utilizziamo i metodi add_user_message e add_ai_message per aggiungere messaggi alla conversazione. Questi metodi funzionano esattamente come i loro corrispettivi in ChatMessageHistory.


Una volta che i messaggi sono stati aggiunti, possiamo utilizzare il metodo load_memory_variables per estrarre i messaggi. Questo metodo restituisce un dizionario con i messaggi estratti. Se abbiamo scelto di estrarre i messaggi come una stringa, il dizionario conterrà una stringa unica con tutti i messaggi. Se invece abbiamo scelto di estrarre i messaggi come una lista, il dizionario conterrà una lista di messaggi.

Ecco un esempio di come si può utilizzare ConversationBufferMemory per salvare e recuperare i messaggi di una conversazione:


from langchain.memory import ConversationBufferMemory

# Crea una nuova istanza di ConversationBufferMemory
memory = ConversationBufferMemory()

# Aggiungi alcuni messaggi alla memoria
memory.chat_memory.add_user_message("Ciao, come stai?")
memory.chat_memory.add_ai_message("Sto bene, grazie! E tu?")

# Carica le variabili di memoria e stampa i messaggi
memory_variables = memory.load_memory_variables({})
print(memory_variables['history'])


Utilizzo della memoria in una Catena o Chain

Le classi ChatMessageHistory e ConversationBufferMemory sono fondamentali per gestire i messaggi all'interno di una singola conversazione. Tuttavia, in molti casi, potrebbe essere necessario gestire più conversazioni contemporaneamente. In LangChain, questo può essere ottenuto utilizzando il concetto di "catena".



Ogni catena ha un'istanza di ConversationBufferMemory associata, che viene utilizzata per gestire i messaggi all'interno della catena. Questo permette di gestire facilmente conversazioni complesse e di mantenere un contesto coerente tra diverse conversazioni.


L'uso di ConversationBufferMemory in una catena è molto simile al suo uso in una conversazione singola. Iniziamo creando una nuova catena e una nuova istanza di ConversationBufferMemory. Poi, come prima, utilizziamo i metodi add_user_message e add_ai_message per aggiungere messaggi alla conversazione. Infine, utilizziamo il metodo load_memory_variables per estrarre i messaggi.


Ecco un esempio di come si può utilizzare ConversationBufferMemory in una catena:


from langchain.llms import OpenAI
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory

# Crea una nuova istanza di OpenAI e ConversationBufferMemory
llm = OpenAI(temperature=0)
memory = ConversationBufferMemory()

# Crea una nuova catena
conversation = ConversationChain(llm=llm, verbose=True, memory=memory)

# Inizia una nuova conversazione nella catena
conversation.predict(input="Ciao, come stai?")

In questo esempio, creiamo una nuova catena con un modello di linguaggio OpenAI e una nuova istanza di ConversationBufferMemory. Poi, iniziamo una nuova conversazione nella catena utilizzando il metodo predict.





Applicazione della Memoria in un Progetto di Marketing con LangChain

Per capire come utilizzare la memoria in un progetto di marketing con LangChain, consideriamo l'esempio di un chatbot progettato per rispondere alle domande dei clienti.

Per prima cosa, importiamo le classi necessarie. Useremo ConversationBufferMemory per gestire la memoria della conversazione e LLMChain per gestire la catena di produzione del linguaggio:



from langchain.memory import ConversationBufferMemory
from langchain import OpenAI, LLMChain, PromptTemplate

Dobbiamo poi creare un template di sollecitazione che preveda una conversazione tra il chatbot e un umano. Questo template avrà due variabili di input: una per l'input effettivo dell'utente e una per l'input proveniente dalla classe di memoria. È importante che le chiavi nel PromptTemplate e nel ConversationBufferMemory corrispondano (chat_history):



template = """Sei un chatbot esperto di marketing che sta avendo una conversazione con un umano. Il tuo scopo è quello di rispondere solo alle domande inerenti ai nostri prodotti [Borse, Magliette] e indirizzare i clienti sulle pagine prodotto [urlBorlse.com , urlMagliette.com]

{chat_history}
Umano: {human_input}
Chatbot:"""

prompt = PromptTemplate(
    input_variables=["chat_history", "human_input"], 
    template=template
)
memory = ConversationBufferMemory(memory_key="chat_history")

Ora possiamo creare la nostra LLMChain, specificando il modello del linguaggio (llm), il template del prompt (prompt), la modalità verbosa (verbose), e la memoria (memory):



llm_chain = LLMChain(
    llm=OpenAI(), 
    prompt=prompt, 
    verbose=True, 
    memory=memory,
)

Con la catena configurata, possiamo iniziare a fare previsioni. Ad esempio, potremmo iniziare una conversazione con l'input "Ciao":



llm_chain.predict(human_input="Ciao")

La risposta del chatbot potrebbe essere:



"Ciao, come stai oggi? Posso aiutarti a scegliere cosa preferisci tra Borse e Magliette ?" 

Se poi chiediamo


"Tutto bene grazie, sai dove posso trovare informazioni sulle Borse ?"


la catena di memoria ricorderà la conversazione precedente e la includerà nel prompt per la prossima previsione. In questo modo, il chatbot sarà in grado di gestire una conversazione coerente e continuativa con gli utenti, migliorando così l'efficacia delle sue interazioni in un contesto di marketing.



Conclusioni sulla gestione della memoria con LangChian

In conclusione, la memoria è un componente fondamentale di un chatbot, e LangChain fornisce diverse strutture e strumenti per gestire la memoria in modo efficace. Attraverso l'uso di classi come ChatMessageHistory e ConversationBufferMemory, è possibile catturare e conservare le interazioni dell'utente con l'IA, e utilizzare queste informazioni per guidare le risposte future dell'IA. Spero che queste informazioni ti aiutino a costruire chatbot più intelligenti e capaci!


PCR (5).gif
PCR (4).gif
PCR.gif
PCR.gif
PCR.gif
PCR.gif
PCR (5).gif
3.gif
Vediamo se riesci a cliccarmi ! Nascondo una Sorpresa... (2).png

Ciao 

🤗 Articoli consigliati dalla nostra
Intelligenza Artificiale in base ai tuoi interessi

Correlazione Alta

Correlazione Media

Correlazione Bassa

Iscriviti

VUOI DIVENTARE UN MEMBRO DI INTELLIGENZA ARTIFICIALE ITALIA GRATUITAMENTE E TRARNE I SEGUENTI BENEFICI?

Corsi Gratis

più di 150 lezioni online

Dataset Gratis

più di 150o dataset

Ebook Gratis

più di 10 libri da leggere

Editor Gratis

un editor python online

Progetti Gratis

più di 25 progetti python

App Gratis

4 servizi web con I.A.

Unisciti Ora a oltre
1.000.000
di lettori e appassionanti d'I.A.

Tutto ciò che riguarda l'intelligenza Artificiale, in unico posto, in italiano e gratis.

MEGLIO DI COSI' NON SI PUO' FARE

Dopo l'iscrizione riceverai diversi Regali

VUOI SCRIVERE ARTICOLI INSIEME A NOI.

Grazie

bottom of page