Memória de conversação em LangChain
LangChain é uma estrutura robusta para construir aplicações LLM. No entanto, com esse poder vem um pouco de complexidade. A LangChain oferece muitas maneiras de solicitar um LLM e recursos essenciais como a memória de conversação. A memória de conversação oferece contexto para que o LLM se lembre do seu bate-papo.
Nesta publicação, veremos como usar a memória de conversação com a LangChain e o Milvus. Para acompanhar, precisa de pip
instalar quatro bibliotecas e uma chave da API OpenAI. As quatro bibliotecas necessárias podem ser instaladas executando pip install langchain milvus pymilvus python-dotenv
. Ou executando o primeiro bloco no Notebook do CoLab para este artigo.
Neste post, vamos aprender sobre:
- Memória de conversação com LangChain
- Configurar o contexto da conversação
- Como ativar a memória de conversação com a LangChain
- Resumo da memória de conversação com LangChain
Memória de conversação com LangChain
No estado predefinido, interage com um LLM através de prompts únicos. Adicionar memória para contexto, ou "memória de conversação", significa que já não tem de enviar tudo através de um único comando. A LangChain oferece a capacidade de armazenar a conversa que já teve com um LLM para recuperar essa informação mais tarde.
Para configurar uma memória de conversação persistente com um armazenamento vetorial, precisamos de seis módulos da LangChain. Primeiro, temos de obter o OpenAIEmbeddings
e o OpenAI
LLM. Também precisamos de VectorStoreRetrieverMemory
e da versão LangChain de Milvus
para utilizar um backend de armazenamento vetorial. Depois, precisamos de ConversationChain
e PromptTemplate
para guardar a nossa conversa e consultá-la.
As bibliotecas os
, dotenv
e openai
são principalmente para fins operacionais. Nós as usamos para carregar e usar a chave da API OpenAI. A etapa final de configuração é criar uma instância local do Milvus Lite. Fazemos isso usando o default_server
do pacote 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()
Configurando o contexto da conversa
Agora que temos todos os nossos pré-requisitos configurados, podemos prosseguir para criar nossa memória de conversação. Nosso primeiro passo é criar uma conexão com o servidor Milvus usando LangChain. Em seguida, usamos um dicionário vazio para criar a nossa coleção LangChain Milvus. Além disso, passamos os embeddings que criámos acima e os detalhes da ligação ao servidor Milvus Lite.
Para utilizar a base de dados vetorial para a memória de conversação, temos de a instanciar como um recuperador. Neste caso, só recuperamos o primeiro resultado, definindo k=1
. O último passo da configuração da memória de conversação é utilizar o objeto VectorStoreRetrieverMemory
como a nossa memória de conversação através da ligação do recuperador e da base de dados vetorial que acabámos de configurar.
Para usar nossa memória de conversação, ela precisa ter algum contexto. Por isso, vamos dar algum contexto à memória. Para este exemplo, damos cinco informações. Vamos guardar o meu snack preferido (chocolate), desporto (natação), cerveja (Guinness), sobremesa (cheesecake) e músico (Taylor Swift). Cada entrada é guardada na memória através da função 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"]})
Solicitar a memória de conversação com LangChain
Está na altura de ver como podemos usar a nossa memória de conversação. Comecemos por nos ligarmos ao LLM do OpenAI através da LangChain. Usamos uma temperatura de 0 para indicar que não queremos que a nossa LLM seja criativa.
De seguida, criamos um modelo. Dizemos ao LLM que está envolvido numa conversa amigável com um humano e inserimos duas variáveis. A variável history
fornece o contexto da memória de conversação. A variável input
fornece o input atual. Utilizamos o objeto PromptTemplate
para inserir estas variáveis.
Utilizamos o objeto ConversationChain
para combinar o nosso prompt, LLM e memória. Agora estamos prontos para verificar a memória da nossa conversa, dando-lhe algumas instruções. Começamos por dizer ao LLM que o nosso nome é Gary, o principal rival da série Pokemon (tudo o resto na memória de conversação é um facto sobre mim).
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?")
A imagem abaixo mostra o que poderia ser uma resposta esperada do MLT. Neste exemplo, ele respondeu dizendo que o seu nome é "IA".
Agora vamos testar a memória até agora. Utilizamos o objeto ConversationChain
que criámos anteriormente e consultamos o meu músico favorito.
conversation_with_summary.predict(input="who is my favorite musician?")
A imagem abaixo mostra uma resposta esperada da cadeia de conversação. Como usamos a opção verbose, ela também nos mostra a conversa relevante. Podemos ver que ela retorna que meu artista favorito é Taylor Swift, como esperado.
Em seguida, vamos verificar a minha sobremesa favorita - cheesecake.
conversation_with_summary.predict(input="Whats my favorite dessert?")
Quando consultamos a minha sobremesa favorita, podemos ver que a cadeia de conversação escolhe mais uma vez a informação correta do Milvus. Descobre que a minha sobremesa favorita é cheesecake, como lhe disse anteriormente.
Agora que confirmámos que podemos consultar a informação que demos anteriormente, vamos verificar mais uma coisa - a informação que fornecemos no início da nossa conversa. Começámos a nossa conversa dizendo à IA que o nosso nome era Gary.
conversation_with_summary.predict(input="What's my name?")
A nossa verificação final indica que a cadeia de conversação guardou a informação sobre o nosso nome na nossa memória de conversação do vetor de armazenamento. Devolve que dissemos que o nosso nome é Gary.
Resumo da memória de conversação LangChain
Neste tutorial, aprendemos como usar a memória de conversação em LangChain. LangChain oferece acesso a backends de armazenamento vetorial como Milvus para memória conversacional persistente. Podemos usar a memória de conversação injetando histórico em nossos prompts e salvando o contexto histórico no objeto ConversationChain
.
Para este exemplo de tutorial, demos à cadeia de conversação cinco factos sobre mim e fingimos ser o principal rival do Pokemon, o Gary. Depois, fizemos perguntas à cadeia de conversação sobre o conhecimento a priori que armazenámos - o meu músico favorito e a minha sobremesa. O sistema respondeu corretamente a ambas as perguntas e fez aparecer as entradas relevantes. Por fim, perguntámos-lhe qual era o nosso nome no início da conversa, e ela respondeu corretamente que tínhamos dito que o nosso nome era "Gary".
- Memória de conversação com LangChain
- Configurando o contexto da conversa
- Solicitar a memória de conversação com LangChain
- Resumo da memória de conversação LangChain
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word