2
respostas

No inte 3 LangChain com Python : Interação com o chat

meu código:

import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.chat_history import InMemoryChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory

load_dotenv()
api_key = os.getenv("OPENAI_API_KEY")

modelo = ChatOpenAI(
    model="llama3",
    api_key='ollama',
    base_url="http://localhost:11434/v1"
)

prompt_sugestao = ChatPromptTemplate.from_messages(
    [
        ("system", "Você é um guia de vaigem especializado em destinos brasileiros. Apresente-se como Sr. Passeios"),
        ("placeholder", "{historico}"),
        ("human", "{query}")
    ]
)

cadeia = prompt_sugestao | modelo | StrOutputParser

memoria = {}
sessao = "aula_langchain_alura"

def historico_por_sessao(sessao: str):
    if sessao not in memoria:
        memoria[sessao] = InMemoryChatMessageHistory()
    return memoria[sessao]

lista_perguntas = [
    "Quero visitar um lugar no Brasil, famoso por praias e cultura. Pode sugerir?",
    "Qual a melhor época do ano para ir?"
]

cadeia_com_memoria = RunnableWithMessageHistory(
    runnable=cadeia,
    get_session_history=historico_por_sessao,
    input_messages_key="query",
    history_messages_key="historico"
)

for pergunta in lista_perguntas:
    resposta = cadeia_com_memoria.invoke(
        {
            "query": pergunta
        },
        config={"session_id": sessao}
    )
    print("Usuário: ", pergunta)
    print("AI: ", resposta, "\n")
2 respostas

recebo o seguinte erro:

(venv) ➜ langchain-python-openai git:(main) ✗ python3 main_chat.py
sys:1: LangChainPendingDeprecationWarning: RunnableWithMessageHistory is deprecated. Use LangGraph's built-in persistence instead.
Traceback (most recent call last):
File "/home/mayron-souza/Documents/estudos/alura/langchain-python-openai/main_chat.py", line 49, in
resposta = cadeia_com_memoria.invoke(
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mayron-souza/Documents/estudos/alura/langchain-python-openai/venv/lib/python3.12/site-packages/langchain_core/runnables/base.py", line 5734, in invoke
return self.bound.invoke(
^^^^^^^^^^^^^^^^^^
File "/home/mayron-souza/Documents/estudos/alura/langchain-python-openai/venv/lib/python3.12/site-packages/langchain_core/runnables/base.py", line 5734, in invoke
return self.bound.invoke(
^^^^^^^^^^^^^^^^^^
File "/home/mayron-souza/Documents/estudos/alura/langchain-python-openai/venv/lib/python3.12/site-packages/langchain_core/runnables/base.py", line 3268, in invoke
input_ = context.run(step.invoke, input_, config)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mayron-souza/Documents/estudos/alura/langchain-python-openai/venv/lib/python3.12/site-packages/langchain_core/runnables/base.py", line 5734, in invoke
return self.bound.invoke(
^^^^^^^^^^^^^^^^^^
File "/home/mayron-souza/Documents/estudos/alura/langchain-python-openai/venv/lib/python3.12/site-packages/langchain_core/runnables/base.py", line 5048, in invoke
return self._call_with_config(
^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mayron-souza/Documents/estudos/alura/langchain-python-openai/venv/lib/python3.12/site-packages/langchain_core/runnables/base.py", line 2106, in call_with_config
context.run(
File "/home/mayron-souza/Documents/estudos/alura/langchain-python-openai/venv/lib/python3.12/site-packages/langchain_core/runnables/config.py", line 430, in call_func_with_variable_args
return func(input, **kwargs) # type: ignore[call-arg]
^^^^^^^^^^^^^^^^^^^^^
File "/home/mayron-souza/Documents/estudos/alura/langchain-python-openai/venv/lib/python3.12/site-packages/langchain_core/runnables/base.py", line 4916, in invoke
output = output.invoke(
^^^^^^^^^^^^^^
File "/home/mayron-souza/Documents/estudos/alura/langchain-python-openai/venv/lib/python3.12/site-packages/langchain_core/runnables/base.py", line 5734, in invoke
return self.bound.invoke(
^^^^^^^^^^^^^^^^^^
File "/home/mayron-souza/Documents/estudos/alura/langchain-python-openai/venv/lib/python3.12/site-packages/langchain_core/runnables/base.py", line 3268, in invoke
input
= context.run(step.invoke, input
, config)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mayron-souza/Documents/estudos/alura/langchain-python-openai/venv/lib/python3.12/site-packages/langchain_core/runnables/base.py", line 5048, in invoke
return self._call_with_config(
^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mayron-souza/Documents/estudos/alura/langchain-python-openai/venv/lib/python3.12/site-packages/langchain_core/runnables/base.py", line 2106, in _call_with_config
context.run(
File "/home/mayron-souza/Documents/estudos/alura/langchain-python-openai/venv/lib/python3.12/site-packages/langchain_core/runnables/config.py", line 430, in call_func_with_variable_args
return func(input, **kwargs) # type: ignore[call-arg]
^^^^^^^^^^^^^^^^^^^^^
File "/home/mayron-souza/Documents/estudos/alura/langchain-python-openai/venv/lib/python3.12/site-packages/langchain_core/runnables/base.py", line 4905, in _invoke
output = call_func_with_variable_args(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mayron-souza/Documents/estudos/alura/langchain-python-openai/venv/lib/python3.12/site-packages/langchain_core/runnables/config.py", line 430, in call_func_with_variable_args
return func(input, **kwargs) # type: ignore[call-arg]
^^^^^^^^^^^^^^^^^^^^^
File "/home/mayron-souza/Documents/estudos/alura/langchain-python-openai/venv/lib/python3.12/site-packages/langchain_core/load/serializable.py", line 115, in init
super().init(*args, **kwargs)
TypeError: BaseModel.init() takes 1 positional argument but 2 were given

Olá, Mayron. Como vai?

Analisando o seu código e a trilha do erro (stack trace), identifiquei o detalhe que está causando esse problema na execução. A sua lógica geral de integração com o Ollama local está excelente, mas há um pequeno erro de sintaxe na criação da sua cadeia (pipeline).

O erro TypeError: BaseModel.init() takes 1 positional argument but 2 were given está acontecendo porque você passou a classe StrOutputParser diretamente na composição da cadeia, quando, na verdade, o LangChain espera receber uma instância dessa classe (ou seja, ela precisa ter os parênteses).

Para corrigir o problema, basta alterar a linha onde a variável cadeia é declarada.

Como está no seu código:

cadeia = prompt_sugestao | modelo | StrOutputParser

Como deve ficar:

cadeia = prompt_sugestao | modelo | StrOutputParser()

Apenas adicionando os parênteses (), o LangChain conseguirá invocar o interpretador de saída corretamente, e o seu código voltará a funcionar.

Agregando valor ao seu estudo:
Notei que no seu terminal apareceu a seguinte mensagem: LangChainPendingDeprecationWarning: RunnableWithMessageHistory is deprecated. Use LangGraph's built-in persistence instead.

Isso não é um erro que impede o código de rodar, é apenas um aviso (warning). O ecossistema do LangChain é atualizado muito rápido e, recentemente, eles decidiram que toda a parte de memória e persistência de histórico de chat passará a ser gerenciada por uma biblioteca irmã chamada LangGraph.

Para o escopo atual do seu curso e aprendizado, você pode seguir utilizando o RunnableWithMessageHistory sem problemas! No entanto, para projetos futuros de produção, será uma boa prática dar uma olhada na documentação do LangGraph para implementar a memória da forma mais moderna recomendada por eles.

Parabéns pela iniciativa de rodar o Llama 3 localmente com a interface do OpenAI, é uma ótima maneira de testar IA sem custos com API.

Espero que possa ter lhe ajudado!