Memória LLM

A maioria das aplicações baseadas em LLM têm uma interface de chat similar ao WeChat. Uma função importante do processo de diálogo de IA é a capacidade de fazer referência a informações faladas anteriormente na conversa, assim como no processo de diálogo humano, sem precisar repetir o conteúdo anterior. Os humanos automaticamente relembram informações históricas.

A capacidade de armazenar informações históricas da conversa no campo LLM geralmente é referida como "Memória", assim como os humanos têm a capacidade de lembrar. LangChain encapsula vários componentes de função de memória, que podem ser usados separadamente ou integrados de forma fluida em uma cadeia.

Os componentes de memória precisam implementar duas operações básicas: ler e escrever.

Para vários componentes de tarefas de cadeias de LangChain, se você habilitar a função de Memória, ele executará uma lógica semelhante da seguinte forma:

  1. Ao receber a entrada inicial do usuário, a tarefa da cadeia tentará consultar informações históricas relevantes do componente de memória, em seguida, concatenará as informações históricas e a entrada do usuário em prompts para passar para o LLM.
  2. Ao receber o conteúdo retornado do LLM, ele automaticamente armazenará o resultado no componente de memória para facilitar a consulta na próxima vez.

O processo de implementação da capacidade de memória no LangChain é mostrado no diagrama abaixo: Processo de Memória

Integrando Componentes de Memória no Sistema

Antes de usar os componentes de memória, você precisa considerar as seguintes duas perguntas:

  • Como armazenar dados de mensagens históricas
  • Como consultar dados históricos de mensagens

Armazenamento: Lista de Mensagens de Chat

Se estiver usando o modelo de Chat, os dados da conversa são uma lista de mensagens de chat. LangChain suporta vários mecanismos de armazenamento para armazenar dados históricos de mensagens, sendo o mais simples armazená-los na memória. Na prática, o método mais comumente usado é armazená-los em um banco de dados.

Consulta: Como Consultar Mensagens de Conversa Históricas Relevantes

Para implementar a capacidade de memória do LLM, o núcleo é concatenar o conteúdo da mensagem histórica como informações de contexto nos prompts. Dessa forma, o LLM pode se referir às informações de contexto ao responder perguntas.

Armazenar dados de mensagens históricas é relativamente fácil, e um aspecto mais desafiador é como consultar mensagens históricas relevantes para o conteúdo da conversa atual. A principal razão para a necessidade de consultar mensagens históricas relacionadas à conversa atual é devido ao limite máximo de tokens do LLM; não podemos incluir todo o conteúdo da conversa histórica em prompts para alimentar a IA.

Estratégias comuns de consulta de mensagens históricas incluem:

  • Apenas consultar as N mensagens mais recentes como informações de contexto para prompts
  • Usar IA para resumir mensagens históricas, com o resumo servindo como informações de contexto para prompts
  • Alavancar um banco de dados de vetores para consultar mensagens históricas similares à conversa atual como informações de contexto para prompts

Exemplo de Uso do Componente LangChain

Vamos dar uma olhada em como o componente de Memória no LangChain se parece. Aqui, vamos introduzir o conhecimento básico de interagir com o componente de Memória.

Primeiro, vamos ver como usar o ConversationBufferMemory na cadeia de tarefas. ConversationBufferMemory é um componente de memória muito simples que pode apenas armazenar uma lista de mensagens de chat na memória e passá-las para um novo modelo de prompt de conversa.

from langchain.memory import ConversationBufferMemory

memória = ConversationBufferMemory()
memória.chat_memory.add_user_message("oi!")
memória.chat_memory.add_ai_message("e aí?")
  • Observação: LangChain fornece vários componentes de Memória com uso semelhante.

A seguir, vejamos como usar o componente de Memória na cadeia. Abaixo, vamos introduzir como o LLM e o ChatModel, dois modelos encapsulados no LangChain, usam o componente de Memória.

Exemplo de Uso do LLM usando o Componente de Memória

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 = """Você é um ótimo chatbot tendo uma conversa com um humano.

Conversa anterior:
{chat_history}

Nova pergunta: {question}
Resposta do AI:"""
prompt = PromptTemplate.from_template(template)

memória = ConversationBufferMemory(memory_key="chat_history")
conversa = LLMChain(
    llm=llm,
    prompt=prompt,
    verbose=True,
    memory=memória
)
conversa({"question": "oi"})
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(
            "Você é um chatbot legal conversando com um humano."
        ),
        MessagesPlaceholder(variable_name="chat_history"),
        HumanMessagePromptTemplate.from_template("{question}")
    ]
)
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)

conversa = LLMChain(
    llm=llm,
    prompt=prompt,
    verbose=True,
    memory=memory
)
conversa({"question": "oi"})