Memoria LLM
La maggior parte delle applicazioni basate su LLM hanno un'interfaccia di chat simile a WeChat. Una funzione importante del processo di dialogo AI è la capacità di fare riferimento alle informazioni precedentemente comunicate nella conversazione, proprio come nel processo di dialogo umano, senza dover ripetere il contenuto precedente. Gli esseri umani richiamano automaticamente le informazioni storiche.
La capacità di memorizzare informazioni storiche della conversazione nel campo LLM è generalmente indicata come "Memoria", proprio come gli esseri umani hanno la capacità di ricordare. LangChain racchiude vari componenti di funzioni di memoria, che possono essere utilizzati separatamente o integrati in modo trasparente in una catena.
I componenti di memoria devono implementare due operazioni di base: lettura e scrittura.
Per vari componenti di attività di catena di LangChain, se si attiva la funzione di Memoria, eseguirà logicamente operazioni simili come segue:
- Quando riceve l'input iniziale dell'utente, l'attività della catena cercherà di consultare informazioni storiche rilevanti dal componente di memoria, quindi concatenare le informazioni storiche e l'input dell'utente in prompt da passare a LLM.
- Quando riceve il contenuto restituito da LLM, lo memorizzerà automaticamente nel componente di memoria per facilitare la successiva consultazione.
Il processo di implementazione della capacità di memoria in LangChain è mostrato nel diagramma sottostante:
Integrazione dei Componenti di Memoria nel Sistema
Prima di utilizzare i componenti di memoria, è necessario considerare le seguenti due domande:
- Come memorizzare i dati dei messaggi storici
- Come consultare i dati dei messaggi storici
Archiviazione: Elenco dei Messaggi di Chat
Se si utilizza il modello di Chat, i dati della conversazione sono un elenco di messaggi di chat. LangChain supporta vari motori di archiviazione per memorizzare dati storici dei messaggi, con il metodo più semplice che consiste nel memorizzarli in memoria. In pratica, il metodo più comunemente utilizzato è memorizzarli in un database.
Consultazione: Come Consultare i Messaggi di Conversazione Storici Rilevanti
Per implementare la capacità di memoria di LLM, il nucleo è concatenare il contenuto del messaggio storico come informazioni di background nei prompt. In questo modo, LLM può fare riferimento alle informazioni di background nel rispondere alle domande.
Memorizzare i dati dei messaggi storici è relativamente semplice, e un aspetto più impegnativo è come consultare i messaggi storici rilevanti per il contenuto attuale della conversazione. Il motivo principale per la necessità di consultare i messaggi storici relativi alla conversazione attuale è dovuto al limite massimo dei token di LLM; non possiamo inserire tutto il contenuto della conversazione storica nei prompt da alimentare all'AI.
Le comuni strategie di consultazione dei messaggi storici includono:
- Consultare solo gli N messaggi più recenti come informazioni di background per i prompt
- Utilizzare l'IA per riassumere i messaggi storici, con il riassunto come informazioni di background per i prompt
- Sfruttare un database vettoriale per consultare i messaggi storici simili alla conversazione attuale come informazioni di background per i prompt
Esempio di Utilizzo del Componente LangChain
Diamo un'occhiata a come appare il componente Memoria in LangChain. Qui presenteremo le conoscenze di base sull'interazione con il componente Memoria.
Prima di tutto, vediamo come utilizzare il ConversationBufferMemory nella catena di attività. ConversationBufferMemory è un componente di memoria molto semplice che può solo memorizzare un elenco di messaggi di chat in memoria e passarli a un nuovo modello di prompt di conversazione.
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory()
memory.chat_memory.add_user_message("ciao!")
memory.chat_memory.add_ai_message("come va?")
- Nota: LangChain fornisce vari componenti di Memoria con un utilizzo simile.
Successivamente, vediamo come utilizzare il componente Memoria nella catena. Di seguito, presenteremo come LLM e ChatModel, due modelli incapsulati in LangChain, utilizzano il componente Memoria.
Esempio di utilizzo di LLM con il componente Memoria
from langchain_openai import OpenAI
from langchain_core.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain.memory import ConversationBufferMemory
llm = OpenAI(temperature=0)
template = """Sei un ottimo chatbot che ha una conversazione con un umano.
Conversazione precedente:
{chat_history}
Nuova domanda: {question}
Risposta dell'AI:"""
prompt = PromptTemplate.from_template(template)
memory = ConversationBufferMemory(memory_key="chat_history")
conversation = LLMChain(
llm=llm,
prompt=prompt,
verbose=True,
memory=memory
)
conversation({"question": "ciao"})
Esempio di ChatModel che utilizza il componente Memory
da langchain_openai import ChatOpenAI
da langchain.prompts import (
ChatPromptTemplate,
MessagesPlaceholder,
SystemMessagePromptTemplate,
HumanMessagePromptTemplate,
)
da langchain.chains import LLMChain
da langchain.memory import ConversationBufferMemory
llm = ChatOpenAI()
prompt = ChatPromptTemplate(
messages=[
SystemMessagePromptTemplate.from_template(
"Sei un simpatico chatbot che sta conversando con un essere umano."
),
MessagesPlaceholder(variable_name="chat_history"),
HumanMessagePromptTemplate.from_template("{question}")
]
)
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
conversazione = LLMChain(
llm=llm,
prompt=prompt,
verbose=True,
memory=memory
)
conversazione({"question": "ciao"})