Para funcionar foi necessário fazer alguma modificações:
- estou sem créditos de OpenAI, então usei mesma interface mas com ollama
- 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)