Memoria conversazionale in LangChain
LangChain è un framework robusto per la costruzione di applicazioni LLM. Tuttavia, questa potenza comporta una certa complessità . LangChain offre molti modi per sollecitare un LLM e funzioni essenziali come la memoria conversazionale. La memoria conversazionale offre all'LLM un contesto per ricordare le vostre conversazioni.
In questo post vediamo come utilizzare la memoria conversazionale con LangChain e Milvus. Per seguirci, è necessario che pip
installi quattro librerie e una chiave API OpenAI. Le quattro librerie necessarie possono essere installate eseguendo pip install langchain milvus pymilvus python-dotenv
. Oppure eseguendo il primo blocco del Quaderno di CoLab per questo articolo.
In questo post, impareremo a conoscere:
- Memoria conversazionale con LangChain
- Impostazione del contesto di conversazione
- Prompt della memoria conversazionale con LangChain
- Riassunto della memoria conversazionale con LangChain
Memoria conversazionale con LangChain
Nello stato predefinito, si interagisce con un LLM attraverso singoli prompt. L'aggiunta della memoria per il contesto, o "memoria conversazionale", significa che non è più necessario inviare tutto attraverso un solo prompt. LangChain offre la possibilità di memorizzare le conversazioni già avvenute con un LLM per recuperarle in seguito.
Per impostare una memoria conversazionale persistente con un archivio vettoriale, abbiamo bisogno di sei moduli di LangChain. Per prima cosa, dobbiamo procurarci gli LLM OpenAIEmbeddings
e OpenAI
. Abbiamo anche bisogno di VectorStoreRetrieverMemory
e della versione LangChain di Milvus
per utilizzare un backend di memoria vettoriale. Poi abbiamo bisogno di ConversationChain
e PromptTemplate
per salvare la nostra conversazione e interrogarla.
Le librerie os
, dotenv
e openai
servono principalmente per scopi operativi. Le usiamo per caricare e utilizzare la chiave API di OpenAI. L'ultima fase di configurazione consiste nell'avviare un'istanza locale di Milvus Lite. Per farlo, utilizziamo la libreria default_server
del pacchetto Milvus Python.
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.llms import OpenAI
from langchain.memory import VectorStoreRetrieverMemory
from langchain.chains import ConversationChain
from langchain.prompts import PromptTemplate
from langchain.vectorstores import Milvus
embeddings = OpenAIEmbeddings()
import os
from dotenv import load_dotenv
import openai
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
from milvus import default_server
default_server.start()
Impostazione del contesto di conversazione
Ora che abbiamo impostato tutti i prerequisiti, possiamo procedere alla creazione della memoria di conversazione. Il primo passo è creare una connessione al server Milvus usando LangChain. Poi, usiamo un dizionario vuoto per creare la nostra collezione LangChain Milvus. Inoltre, si passano gli embeddings creati in precedenza e i dettagli della connessione al server Milvus Lite.
Per utilizzare il database vettoriale per la memoria conversazionale, dobbiamo istanziarlo come retriever. In questo caso recuperiamo solo il primo risultato, impostando k=1
. L'ultima fase di impostazione della memoria conversazionale consiste nell'utilizzare l'oggetto VectorStoreRetrieverMemory
come memoria conversazionale attraverso la connessione tra retriever e database vettoriale appena impostata.
Per utilizzare la nostra memoria conversazionale, deve avere un contesto. Diamo quindi alla memoria un contesto. Per questo esempio, forniamo cinque informazioni. Memorizziamo la mia merenda preferita (cioccolato), lo sport (nuoto), la birra (Guinness), il dolce (cheesecake) e il musicista (Taylor Swift). Ogni voce viene salvata nella memoria attraverso la funzione save_context
.
vectordb = Milvus.from_documents(
{},
embeddings,
connection_args={"host": "127.0.0.1", "port": default_server.listen_port})
retriever = Milvus.as_retriever(vectordb, search_kwargs=dict(k=1))
memory = VectorStoreRetrieverMemory(retriever=retriever)
about_me = [
{"input": "My favorite snack is chocolate",
"output": "Nice"},
{"input": "My favorite sport is swimming",
"output": "Cool"},
{"input": "My favorite beer is Guinness",
"output": "Great"},
{"input": "My favorite dessert is cheesecake",
"output": "Good to know"},
{"input": "My favorite musician is Taylor Swift",
"output": "Same"}
]
for example in about_me:
memory.save_context({"input": example["input"]}, {"output": example["output"]})
Prompt della memoria conversazionale con LangChain
È ora di vedere come utilizzare la memoria conversazionale. Iniziamo collegandoci al LLM di OpenAI attraverso LangChain. Utilizziamo una temperatura di 0 per indicare che non vogliamo che il nostro LLM sia creativo.
Poi creiamo un modello. Diciamo al LLM che è impegnato in una conversazione amichevole con un umano e inseriamo due variabili. La variabile history
fornisce il contesto dalla memoria della conversazione. La variabile input
fornisce l'input corrente. Per inserire queste variabili si utilizza l'oggetto PromptTemplate
.
Utilizziamo l'oggetto ConversationChain
per combinare il prompt, l'LLM e la memoria. Ora siamo pronti a verificare la memoria della nostra conversazione dandole alcuni prompt. Iniziamo dicendo all'LLM che il nostro nome è Gary, l'antagonista principale della serie Pokemon (tutto il resto della memoria della conversazione è un fatto che mi riguarda).
llm = OpenAI(temperature=0) # Can be any valid LLM
_DEFAULT_TEMPLATE = """The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.
Relevant pieces of previous conversation:
{history}
(You do not need to use these pieces of information if not relevant)
Current conversation:
Human: {input}
AI:"""
PROMPT = PromptTemplate(
input_variables=["history", "input"], template=_DEFAULT_TEMPLATE
)
conversation_with_summary = ConversationChain(
llm=llm,
prompt=PROMPT,
memory=memory,
verbose=True
)
conversation_with_summary.predict(input="Hi, my name is Gary, what's up?")
L'immagine sottostante mostra come potrebbe essere la risposta attesa dal LLM. In questo esempio, ha risposto dicendo che il suo nome è "AI".
Ora proviamo a testare la memoria finora acquisita. Utilizziamo l'oggetto ConversationChain
creato in precedenza e cerchiamo il mio musicista preferito.
conversation_with_summary.predict(input="who is my favorite musician?")
L'immagine sottostante mostra la risposta attesa dalla Conversation Chain. Poiché abbiamo usato l'opzione verbose, ci mostra anche la conversazione pertinente. Si può notare che la risposta è che la mia artista preferita è Taylor Swift, come previsto.
Poi, verifichiamo il mio dolce preferito, la cheesecake.
conversation_with_summary.predict(input="Whats my favorite dessert?")
Quando chiediamo il mio dolce preferito, possiamo vedere che la Conversation Chain seleziona ancora una volta le informazioni corrette da Milvus. Trova che il mio dolce preferito è la torta al formaggio, come gli ho detto prima.
Ora che abbiamo confermato che possiamo interrogare le informazioni fornite in precedenza, controlliamo un'altra cosa: le informazioni fornite all'inizio della nostra conversazione. Abbiamo iniziato la conversazione dicendo all'intelligenza artificiale che ci chiamavamo Gary.
conversation_with_summary.predict(input="What's my name?")
La nostra verifica finale mostra che la catena di conversazione ha memorizzato la parte relativa al nostro nome nella nostra memoria vettoriale di conversazione. Il risultato è che abbiamo detto di chiamarci Gary.
Riassunto sulla memoria conversazionale di LangChain
In questo tutorial abbiamo imparato a usare la memoria conversazionale in LangChain. LangChain offre l'accesso a backend di vector store come Milvus per la memoria conversazionale persistente. Possiamo usare la memoria conversazionale iniettando la storia nei nostri prompt e salvando il contesto storico nell'oggetto ConversationChain
.
Per questo esempio di esercitazione, abbiamo fornito alla catena di conversazione cinque informazioni su di me e abbiamo finto di essere il principale rivale dei Pokemon, Gary. Poi, abbiamo sottoposto alla Catena di Conversazione delle domande sulla conoscenza a priori che avevamo memorizzato: il mio musicista preferito e il mio dolce. La Catena ha risposto correttamente a entrambe le domande e ha visualizzato le voci pertinenti. Infine, abbiamo chiesto il nostro nome come indicato all'inizio della conversazione e ci ha risposto correttamente che avevamo detto di chiamarci "Gary".
- Memoria conversazionale con LangChain
- Impostazione del contesto di conversazione
- Prompt della memoria conversazionale con LangChain
- Riassunto sulla memoria conversazionale di LangChain
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word