Componente de memoria basado en base de datos vectorial
El VectorStoreRetrieverMemory
almacena recuerdos en una base de datos vectorial y devuelve los contenidos más similares cada vez que se consulta datos históricos de memoria.
Aquí, "documento" se refiere a fragmentos de mensajes de diálogo anteriores.
from datetime import datetime
from langchain_openai import OpenAIEmbeddings
from langchain_openai import OpenAI
from langchain.memory import VectorStoreRetrieverMemory
from langchain.chains import ConversationChain
from langchain_core.prompts import PromptTemplate
Inicialización de la base de datos vectorial
Diferentes bases de datos vectoriales tienen pasos de inicialización ligeramente diferentes. Aquí tienes un ejemplo usando Faiss.
import faiss
from langchain.docstore import InMemoryDocstore
from langchain_community.vectorstores import FAISS
tamaño_incrustación = 1536 # Dimensionalidad del vector
índice = faiss.IndexFlatL2(tamaño_incrustación)
función_incrustación = OpenAIEmbeddings().embed_query
vectorstore = FAISS(función_incrustación, índice, InMemoryDocstore({}), {})
Creación de VectorStoreRetrieverMemory
Creación del componente VectorStoreRetrieverMemory utilizando la base de datos vectorial.
retriever = vectorstore.as_retriever(search_kwargs=dict(k=1))
memoria = VectorStoreRetrieverMemory(retriever=retriever)
memoria.save_context({"input": "Mi comida favorita es la pizza"}, {"output": "Bueno saberlo"})
memoria.save_context({"input": "Mi deporte favorito es el fútbol"}, {"output": "..."})
memoria.save_context({"input": "No me gusta los Celtics"}, {"output": "ok"})
print(memoria.load_memory_variables({"prompt": "¿Qué deporte debería ver?"})["history"])
input: Mi deporte favorito es el fútbol
output: ...
Uso del componente de memoria a través de Chain
A continuación, se muestra un ejemplo de cómo utilizar el componente de memoria. Puedes establecer el parámetro "verbose=True" para imprimir los mensajes interactivos con el modelo.
llm = OpenAI(temperatura=0) # Puede ser cualquier LLM válido, aquí elegimos openai
_TEMPLATE_POR_DEFECTO = """Aquí hay una conversación amigable entre humanos e IA. La IA es conversadora y proporciona muchos detalles específicos de su contexto. Si la IA no sabe la respuesta a la pregunta, dirá sinceramente que no lo sabe.
Partes relevantes de la conversación previa:
{history}
(Si no es relevante, no es necesario usar esta información)
Conversación actual:
Humano: {input}
IA:"""
PLANTILLA = PromptTemplate(
input_variables=["history", "input"],
template=_TEMPLATE_POR_DEFECTO
)
conversación_con_resumen = ConversationChain(
llm=llm,
prompt=PLANTILLA,
memoria=memoria,
verbose=True
)
conversación_con_resumen.predict(input="Hola, mi nombre es Perry, ¿qué tal?")
> Entrando en una nueva cadena de ConversationChain...
Prompt después de formatear:
Aquí hay una conversación amigable entre humanos e IA. La IA es conversadora y proporciona muchos detalles específicos de su contexto. Si la IA no sabe la respuesta a la pregunta, dirá sinceramente que no lo sabe.
Partes relevantes de la conversación previa:
Entrada: Mi comida favorita es la pizza.
Salida: Bueno saberlo.
(Si no es relevante, no es necesario usar esta información)
Conversación actual:
Humano: Hola, mi nombre es Perry, ¿qué tal?
IA:
> Cadena finalizada.
"Hola Perry, estoy genial. ¿Y tú?"
conversación_con_resumen.predict(input="¿Cuál es mi deporte favorito?")
> Entrando en una nueva cadena de ConversationChain...
Prompt después de formatear:
Aquí hay una conversación amigable entre humanos e IA. La IA es conversadora y proporciona muchos detalles específicos de su contexto. Si la IA no sabe la respuesta a la pregunta, dirá sinceramente que no lo sabe.
Partes relevantes de la conversación previa:
Entrada: Mi deporte favorito es el fútbol.
Salida: ...
(Si no es relevante, no es necesario usar esta información)
Conversación actual:
Humano: ¿Cuál es mi deporte favorito?
IA:
> Cadena finalizada.
'Me dijiste anteriormente que tu deporte favorito es el fútbol.'