🚀 Prueba Zilliz Cloud, el Milvus completamente gestionado, gratis—¡experimenta un rendimiento 10 veces más rápido! Prueba Ahora>>

milvus-logo
LFAI
  • Home
  • Blog
  • Memoria conversacional en LangChain

Memoria conversacional en LangChain

  • Engineering
June 06, 2023
Yujian Tang

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".

Like the article? Spread the word

Sigue Leyendo