Memoria conversacional en LangChain
LangChain es un framework robusto para construir aplicaciones LLM. Sin embargo, esa potencia viene acompañada de una gran complejidad. LangChain proporciona muchas maneras de incitar a un LLM y características esenciales como la memoria conversacional. La memoria conversacional ofrece contexto para que el LLM recuerde tu charla.
En este artículo, veremos cómo utilizar la memoria conversacional con LangChain y Milvus. Para seguir adelante, necesitas pip
instalar cuatro bibliotecas y una clave API OpenAI. Las cuatro bibliotecas que necesitas se pueden instalar ejecutando pip install langchain milvus pymilvus python-dotenv
. O ejecutando el primer bloque del CoLab Notebook para este artículo.
En este post, aprenderemos sobre:
- Memoria conversacional con LangChain
- Configuración del contexto de conversación
- Prompting de la Memoria Conversacional con LangChain
- Resumen de la Memoria Conversacional con LangChain
Memoria Conversacional con LangChain
En el estado por defecto, se interactúa con un LLM a través de prompts simples. Añadir memoria contextual o "memoria conversacional" significa que ya no tienes que enviarlo todo a través de un solo prompt. LangChain ofrece la posibilidad de almacenar la conversación que ya has mantenido con un LLM para recuperar esa información más adelante.
Para configurar una memoria conversacional persistente con un almacén vectorial, necesitamos seis módulos de LangChain. En primer lugar, debemos obtener los LLM OpenAIEmbeddings
y OpenAI
. También necesitamos VectorStoreRetrieverMemory
y la versión LangChain de Milvus
para utilizar un backend de almacén vectorial. Después necesitamos ConversationChain
y PromptTemplate
para guardar nuestra conversación y consultarla.
Las bibliotecas os
, dotenv
, y openai
son principalmente para fines operativos. Las utilizamos para cargar y utilizar la clave API de OpenAI. El último paso de configuración es crear una instancia local de Milvus Lite. Lo hacemos utilizando default_server
del paquete 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()
Configuración del contexto de conversación
Ahora que tenemos todos nuestros prerrequisitos configurados, podemos proceder a crear nuestra memoria conversacional. Nuestro primer paso es crear una conexión con el servidor Milvus utilizando LangChain. A continuación, utilizamos un diccionario vacío para crear nuestra colección LangChain Milvus. Además, pasamos las incrustaciones que creamos anteriormente y los detalles de conexión para el servidor Milvus Lite.
Para utilizar la base de datos vectorial para la memoria conversacional, necesitamos instanciarla como recuperador. En este caso, sólo recuperamos el primer resultado, estableciendo k=1
. El último paso en la configuración de la memoria conversacional es utilizar el objeto VectorStoreRetrieverMemory
como nuestra memoria conversacional a través del recuperador y la conexión a la base de datos vectorial que acabamos de configurar.
Para usar nuestra memoria conversacional, tiene que tener algo de contexto en ella. Así que vamos a darle contexto a la memoria. Para este ejemplo, damos cinco datos. Guardemos mi tentempié favorito (chocolate), deporte (natación), cerveza (Guinness), postre (tarta de queso) y músico (Taylor Swift). Cada entrada se guarda en la memoria a través de la función 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"]})
Activación de la memoria conversacional con LangChain
Es hora de ver cómo podemos utilizar nuestra memoria conversacional. Empecemos por conectarnos a la LLM de OpenAI a través de LangChain. Usamos una temperatura de 0 para indicar que no queremos que nuestro LLM sea creativo.
A continuación, creamos una plantilla. Le decimos al LLM que está manteniendo una conversación amistosa con un humano e insertamos dos variables. La variable history
proporciona el contexto de la memoria conversacional. La variable input
proporciona la entrada actual. Utilizamos el objeto PromptTemplate
para insertar estas variables.
Usamos el objeto ConversationChain
para combinar nuestro prompt, LLM y memoria. Ahora estamos listos para verificar la memoria de nuestra conversación dándole algunos prompt. Comenzamos diciéndole al LLM que nuestro nombre es Gary, el principal rival en la serie Pokemon (todo lo demás en la memoria de la conversación es un hecho sobre mí).
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?")
La imagen de abajo muestra cómo podría ser una respuesta esperada del LLM. En este ejemplo, ha respondido diciendo que se llama "AI".
Ahora vamos a probar la memoria hasta ahora. Usamos el objeto ConversationChain
que creamos antes y hacemos una consulta sobre mi músico favorito.
conversation_with_summary.predict(input="who is my favorite musician?")
La imagen de abajo muestra una respuesta esperada de la Cadena de Conversación. Como usamos la opción verbose, también nos muestra la conversación relevante. Podemos ver que devuelve que mi artista favorita es Taylor Swift, como era de esperar.
A continuación, busquemos mi postre favorito: tarta de queso.
conversation_with_summary.predict(input="Whats my favorite dessert?")
Cuando preguntamos por mi postre favorito, podemos ver que la Cadena de Conversación, una vez más, recoge la información correcta de Milvus. Comprueba que mi postre favorito es la tarta de queso, como le dije antes.
Ahora que hemos confirmado que podemos consultar la información que hemos dado antes, vamos a comprobar una cosa más: la información que hemos dado al principio de nuestra conversación. Empezamos la conversación diciéndole a la IA que nos llamábamos Gary.
conversation_with_summary.predict(input="What's my name?")
La última comprobación nos indica que la cadena de conversación almacenó la información sobre nuestro nombre en la memoria de conversación de nuestro almacén vectorial. Nos devuelve que dijimos que nos llamábamos Gary.
Resumen de la Memoria Conversacional LangChain
En este tutorial, hemos aprendido a utilizar la memoria conversacional en LangChain. LangChain ofrece acceso a vector store backends como Milvus para memoria conversacional persistente. Podemos utilizar la memoria conversacional inyectando historia en nuestros prompts y guardando el contexto histórico en el objeto ConversationChain
.
Para este tutorial de ejemplo, le dimos a la cadena de conversación cinco datos sobre mí y fingimos ser el principal rival de Pokemon, Gary. A continuación, lanzamos a la Cadena de Conversación preguntas sobre el conocimiento a priori que habíamos almacenado: mi músico favorito y mi postre. Respondió correctamente a ambas preguntas y mostró las entradas correspondientes. Por último, le preguntamos por nuestro nombre al principio de la conversación, y respondió correctamente que habíamos dicho que nos llamábamos "Gary".
- Memoria Conversacional con LangChain
- Configuración del contexto de conversación
- Activación de la memoria conversacional con LangChain
- Resumen de la Memoria Conversacional 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