Componente de Memória Baseado em Banco de Dados de Vetores
O VectorStoreRetrieverMemory
armazena memórias em um banco de dados de vetores e retorna os K conteúdos mais semelhantes cada vez que os dados de memória histórica são consultados.
Aqui, "documento" refere-se a fragmentos de mensagens 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
Inicializando o Banco de Dados de Vetores
Diferentes bancos de dados de vetores têm etapas de inicialização ligeiramente diferentes. Aqui está um exemplo usando o Faiss.
import faiss
from langchain.docstore import InMemoryDocstore
from langchain_community.vectorstores import FAISS
tamanho_incorporação = 1536 # Dimensionalidade do vetor
índice = faiss.IndexFlatL2(tamanho_incorporação)
função_incorporação = OpenAIEmbeddings().embed_query
vectorstore = FAISS(função_incorporação, índice, InMemoryDocstore({}), {})
Criando VectorStoreRetrieverMemory
Criando o componente VectorStoreRetrieverMemory usando o banco de dados de vetores.
retriever = vectorstore.as_retriever(search_kwargs=dict(k=1))
memória = VectorStoreRetrieverMemory(retriever=retriever)
memória.save_context({"input": "Minha comida favorita é pizza"}, {"output": "Bom saber"})
memória.save_context({"input": "Meu esporte favorito é futebol"}, {"output": "..."})
memória.save_context({"input": "Eu não gosto dos Celtics"}, {"output": "ok"}) #
print(memória.load_memory_variables({"prompt": "Qual esporte devo assistir?"})["histórico"])
Entrada: Meu esporte favorito é futebol
Saída: ...
Usando o Componente de Memória via Cadeia
Abaixo está um exemplo de como usar o componente de memória. Você pode definir o parâmetro "verbose=True" para imprimir os prompts interativos com o modelo.
llm = OpenAI(temperatura=0) # Pode ser qualquer LLM válido, aqui escolhemos openai
_MODELO_PADRÃO = """Aqui está uma conversa amigável entre humanos e IA. A IA é falante e fornece muitos detalhes específicos de seu contexto. Se a IA não souber a resposta para a pergunta, ela dirá sinceramente que não sabe.
Partes relevantes da conversa anterior:
{historia}
(Se irrelevante, você não precisa usar esta informação)
Conversa atual:
Humano: {entrada}
IA:"""
PROMPT = PromptTemplate(
variáveis_de_entrada=["história", "entrada"],
modelo=_MODELO_PADRÃO
)
conversa_com_resumo = ConversationChain(
llm=llm,
prompt=PROMPT,
memória=memória,
verbose=True
)
conversa_com_resumo.predict(entrada="Oi, meu nome é Perry, o que está acontecendo?")
> Entrando em nova cadeia de ConversationChain...
Prompt após formatação:
Aqui está uma conversa amigável entre humanos e IA. A IA é falante e fornece muitos detalhes específicos de seu contexto. Se a IA não souber a resposta para a pergunta, ela dirá sinceramente que não sabe.
Partes relevantes da conversa anterior:
Entrada: Minha comida favorita é pizza.
Saída: É bom saber.
(Se irrelevante, você não precisa usar esta informação)
Conversa atual:
Humano: Oi, meu nome é Perry, o que está acontecendo?
IA:
> Cadeia finalizada.
"Oi Perry, estou ótimo. E você?"
conversa_com_resumo.predict(entrada="Qual é o meu esporte favorito?")
> Entrando em nova cadeia de ConversationChain...
Prompt após formatação:
Aqui está uma conversa amigável entre humanos e IA. A IA é falante e fornece muitos detalhes específicos de seu contexto. Se a IA não souber a resposta para a pergunta, ela dirá sinceramente que não sabe.
Partes relevantes da conversa anterior:
Entrada: Meu esporte favorito é futebol.
Saída: ...
(Se irrelevante, você não precisa usar esta informação)
Conversa atual:
Humano: Qual é o meu esporte favorito?
IA:
> Cadeia finalizada.
'Você me disse antes que seu esporte favorito é futebol.'