Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

[Projeto] Faça como eu fiz: Chat com memória

Para funcionar foi necessário fazer alguma modificações:

  1. estou sem créditos de OpenAI, então usei mesma interface mas com ollama
  2. O placeholder substitui por MessagesPlaceholder


import os
from dotenv import load_dotenv
from langchain_ollama import ChatOllama
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.output_parsers import StrOutputParser
from langchain_core.chat_history import InMemoryChatMessageHistory
from langchain_core.runnables import RunnableWithMessageHistory

# Carrega as variáveis de ambiente do arquivo .env
load_dotenv()  

# O Ollama utiliza a base_url para se conectar ao serviço
OLLAMA_HOST = os.getenv("OLLAMA_BASE_URL", "http://localhost:11434/v1")
OLLAMA_API_KEY =  os.getenv("OLLAMA_API_KEY")
OLLAMA_MODEL_IN_USE = os.getenv("OLLAMA_MODEL_IN_USE")

# padrao OPENAI com OLLAMA
# Inicialização do modelo usando interface openAI inves de ollama
modelo = ChatOpenAI(
    model=OLLAMA_MODEL_IN_USE,
    openai_api_base=OLLAMA_HOST , 
    openai_api_key=OLLAMA_API_KEY, # O Ollama aceita qualquer texto como chave aqui
)

# Ajuste no prompt utilizando o MessagesPlaceholder correto do LangChain
prompt_sugestao = ChatPromptTemplate.from_messages(
    [
        ("system", "Você é um guia de viagem especializado em destinos brasileiros. Apresente-se como Sr. Passeios"),
        MessagesPlaceholder(variable_name="historico"),
        ("human", "{query}")
    ]
)

# Construção da cadeia (Chain)
cadeia = prompt_sugestao | modelo | StrOutputParser()

# Dicionário que simula o armazenamento/Multiton em memória
memoria = {}
sessao = "aula_langchain_basics"

# Função que recupera ou cria o histórico por sessão (Factory/GetOrCreate)
def historico_por_sessao(id_sessao: str):
    if id_sessao not in memoria:
        memoria[id_sessao] = InMemoryChatMessageHistory()
    return memoria[id_sessao]

# Perguntas de teste para validar o contexto/memória
lista_perguntas = [
    "Quero visitar um lugar no Brasil, famoso por praias e cultura. Pode sugerir?",
    "Qual a melhor época do ano para ir?" # Esta pergunta depende da resposta anterior
]

# Acoplamento da memória à cadeia de execução
cadeia_com_memoria = RunnableWithMessageHistory(
    runnable=cadeia,
    get_session_history=historico_por_sessao,
    input_messages_key="query",
    history_messages_key="historico"
)

# Execução do loop simulando a interação contínua
for pergunta in lista_perguntas:
    resposta = cadeia_com_memoria.invoke(
        {"query": pergunta},
        config={"configurable": {"session_id": sessao}} # Correção na estrutura do config
    )
    print("Usuário:", pergunta)
    print("AI:", resposta)
    print("-" * 50)
1 resposta

Fala, Marcelo! Tudo bom?

Agradeço por trazer sua solução para o fórum!

Curti demais como trabalhou a integração do Ollama com LangChain, destacou o ajuste no MessagesPlaceholder para o prompt e ainda reforçou a importância de manter o histórico de sessão com memória. Essa abordagem mostra domínio técnico, atenção aos detalhes de configuração e foco em garantir que a interação contínua funcione de forma fluida.

E algumas boas práticas que você pode adotar são:

  • Centralizar variáveis de ambiente: manter todas as configurações em arquivos .env bem documentados.
  • Expandir cenários de teste: incluir perguntas mais complexas para validar a robustez da memória e do contexto.
  • Validar compatibilidade de modelos: testar diferentes modelos Ollama para garantir performance e consistência.

Continue postando as suas soluções! Além de ganhar pontos de XP na plataforma, você pode ajudar outros estudantes no fórum.

Ah, uma pergunta: você considera mais interessante evoluir esse projeto adicionando suporte a múltiplos modelos simultâneos ou investir primeiro em melhorar a interface de interação com o usuário?

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!