Memoria LLM

La mayoría de las aplicaciones basadas en LLM tienen una interfaz de chat similar a WeChat. Una función importante del proceso de diálogo de IA es la capacidad de hacer referencia a la información hablada previamente en la conversación, al igual que en el proceso de diálogo humano, sin necesidad de repetir el contenido anterior. Los humanos recuerdan automáticamente la información histórica.

La capacidad de almacenar información histórica de conversaciones en el campo LLM generalmente se denomina "Memoria", al igual que los humanos tienen la capacidad de recordar. LangChain encapsula varios componentes de funciones de memoria, que se pueden utilizar por separado o integrados sin problemas en una cadena.

Los componentes de memoria deben implementar dos operaciones básicas: leer y escribir.

Para varios componentes de tareas de cadena de LangChain, si se habilita la función de Memoria, ejecutará lógica similar a lo siguiente:

  1. Al recibir la entrada inicial del usuario, la tarea de cadena intentará buscar información histórica relevante en el componente de memoria, luego concatenará la información histórica y la entrada del usuario en indicaciones para pasar a LLM.
  2. Al recibir el contenido devuelto por LLM, almacenará automáticamente el resultado en el componente de memoria para consultas fáciles la próxima vez.

El proceso de implementar la capacidad de memoria en LangChain se muestra en el siguiente diagrama: Proceso de memoria

Integración de Componentes de Memoria en el Sistema

Antes de usar los componentes de memoria, es necesario considerar las siguientes dos preguntas:

  • Cómo almacenar datos de mensajes históricos
  • Cómo consultar datos de mensajes históricos

Almacenamiento: Lista de Mensajes de Chat

Si se utiliza el modelo de Chat, los datos de conversación son una lista de mensajes de chat. LangChain admite varios motores de almacenamiento para guardar datos de mensajes históricos, siendo el más simple guardarlo en la memoria. En la práctica, el método más comúnmente utilizado es almacenarlo en una base de datos.

Consulta: Cómo Consultar Mensajes de Conversación Históricos Relevantes

Para implementar la capacidad de memoria de LLM, lo fundamental es concatenar el contenido del mensaje histórico como información de fondo en las indicaciones. De esta manera, LLM puede referirse a la información de fondo al responder preguntas.

Almacenar datos de mensajes históricos es relativamente fácil y un aspecto más desafiante es cómo consultar mensajes históricos relevantes al contenido de la conversación actual. La razón principal por la que se necesita consultar mensajes históricos relacionados con la conversación actual es debido al límite máximo de tokens de LLM; no podemos incluir todo el contenido histórico de la conversación en las indicaciones para alimentar a la IA.

Las estrategias comunes de consulta de mensajes históricos incluyen:

  • Solo consultar los N mensajes más recientes como información de fondo para las indicaciones
  • Utilizar la IA para resumir mensajes históricos, con el resumen sirviendo como información de fondo para las indicaciones
  • Aprovechar una base de datos de vectores para consultar mensajes históricos similares a la conversación actual como información de fondo para las indicaciones

Ejemplo de Uso del Componente LangChain

Veamos cómo se ve el componente Memoria en LangChain. Aquí, presentaremos los conocimientos básicos de interactuar con el componente Memoria.

Primero, veamos cómo usar ConversationBufferMemory en la cadena de tareas. ConversationBufferMemory es un componente de memoria muy simple que puede almacenar solo una lista de mensajes de chat en la memoria y pasarlos a una nueva plantilla de indicaciones de conversación.

from langchain.memory import ConversationBufferMemory

memory = ConversationBufferMemory()
memory.chat_memory.add_user_message("¡Hola!")
memory.chat_memory.add_ai_message("¿Qué tal?")
  • Nota: LangChain proporciona varios componentes de memoria con un uso similar.

A continuación, veamos cómo utilizar el componente de Memoria en la cadena. A continuación, presentaremos cómo los modelos encapsulados LLM y ChatModel en LangChain utilizan el componente de Memoria.

Ejemplo de LLM utilizando el componente de 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 = """Eres un gran chatbot que conversa con un humano.

Conversación anterior:
{chat_history}

Nueva pregunta: {question}
Respuesta de la IA:"""
prompt = PromptTemplate.from_template(template)

memory = ConversationBufferMemory(memory_key="chat_history")
conversation = LLMChain(
    llm=llm,
    prompt=prompt,
    verbose=True,
    memory=memory
)
conversation({"question": "¡Hola!"})
from langchain_openai import ChatOpenAI
from langchain.prompts import (
    ChatPromptTemplate,
    MessagesPlaceholder,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
)
from langchain.chains import LLMChain
from langchain.memory import ConversationBufferMemory

llm = ChatOpenAI()
prompt = ChatPromptTemplate(
    messages=[
        SystemMessagePromptTemplate.from_template(
            "Eres un amigable chatbot que está teniendo una conversación con un humano."
        ),
        MessagesPlaceholder(variable_name="chat_history"),
        HumanMessagePromptTemplate.from_template("{question}")
    ]
)
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)

conversation = LLMChain(
    llm=llm,
    prompt=prompt,
    verbose=True,
    memory=memory
)
conversation({"question": "hola"})