ReAct Agent com LangGraph e LangChain
Essa é a primeira aula de uma Playlist com um curso completo de LangChain e LangGraph. A profundidade e a quantidade de aulas só dependerá do seu engajamento.
A maior parte do curso vai focar em LangGraph, mas em vários momentos vamos usar recursos do LangChain para atingir nossos objetivos. Principalmente as ferramentas que ele já traz prontas e que tornam o trabalho com o LangGraph muito mais fácil.
Por isso, antes de avançar, vamos entender a diferença entre os dois para não ficar nenhuma dúvida sobre o papel de cada um.
Em vídeo (requerido)
O texto a seguir só fará sentido se você assistir ao vídeo abaixo:
LangChain vs LangGraph
LangChain
O LangChain é uma caixa de ferramentas gigante para trabalhar com LLMs. Ele tenta resolver quase tudo: integração com diferentes modelos e providers, banco de dados, RAG, ferramentas externas (tools), encadeamento de chamadas com o LCEL (LangChain Expression Language), e muito mais.
O próprio nome já entrega a ideia: a parte "chain" vem de chains (correntes, cadeias, encadeamento). Ou seja, você monta uma sequência de passos onde a saída de um vira a entrada do próximo. Um fluxo típico fica assim:
Prompt -> LLM -> Solução -> FIM
Isso funciona bem para pipelines lineares e previsíveis. Mas quando o problema exige condições, loops ou estado persistente, até dá pra forçar no LangChain, só que o código fica pesado e difícil de depurar.
É aí que entra o LangGraph, feito para lidar diretamente com grafos de execução mais complexos, de forma clara e controlada.
LangGraph
O LangGraph nasceu para resolver justamente as limitações do LangChain quando o fluxo deixa de ser linear. Aqui a ideia principal não é só "chain", mas sim graph (grafo), onde você pode controlar o caminho que a execução vai seguir.
Com o LangGraph você consegue criar fluxos que:
têm condições (se a LLM pedir uma tool, segue por um caminho; se não, segue por outro),
suportam loops controlados (repetir até a resposta estar ok, por exemplo),
e mantêm estado persistente ao longo da conversa.
Na prática, você monta um grafo de execução em que cada nó é um passo (um LLM, uma função, uma tool) e cada aresta define a lógica de transição entre eles. Isso dá muito mais clareza e previsibilidade do que tentar forçar tudo dentro de uma chain.
Resumindo: enquanto o LangChain brilha em pipelines lineares e simples, o LangGraph é feito sob medida para agentes e fluxos complexos, onde você precisa de controle fino sobre cada decisão.
Isso é só uma parte teórica para você saber que existem diferenças entre ambos, mas vamos falar muito sobre os detalhes ao longo das aulas.
Um Chat Simples Com LangChain
Na maioria das aulas vamos usar pelo menos um LLM para executar qualquer tarefa que precisarmos.
Com o LangChain, você pode escolher qualquer LLM e provider de sua preferência, seja pago, gratuito, local ou online.
Ollama (local)
Quando estou testando alguma coisa com LLMs nos meus códigos, prefiro usar modelos locais com Ollama (ou similares). Isso me permite fazer testes mais complexos sem estourar o limite de tokens gratuitos ou gastar demais com APIs pagas.
Se você também quiser usar Ollama, já fiz um vídeo sobre isso no canal:
Google AI Studio (API gratuita)
Nem todo mundo tem hardware suficiente para rodar um modelo local. Geralmente isso exige uma boa CPU/GPU e bastante espaço em disco e memória. Mesmo quando o hardware dá conta, pode ser que o modelo não esteja otimizado para a sua máquina e acabe rodando de forma tão lenta que inviabiliza os testes.
Nesses casos, a alternativa são APIs externas (gratuitas ou pagas).
No momento em que escrevo este texto, a Google oferece uma API Key gratuita para desenvolvedores e entusiastas. Isso permite usar os modelos Gemini, suficientes para nossos testes. Você pode gerar a chave no link:
API paga
Se você não conseguir usar nenhuma das opções anteriores, sempre existe a possibilidade de usar uma API paga. Geralmente, o custo inicial não é alto (no momento em torno de 5 dólares de créditos mínimos).
Basta criar uma conta em um provider como Google, Anthropic, OpenAI ou outro, adicionar créditos e obter sua API Key.
Links diretos para geração de chave:
Variáveis de ambiente e o arquivo .env
Se optar por uma API externa (paga ou gratuita), é importante carregar suas variáveis de ambiente de forma segura.
Crie um arquivo chamado .env na raiz do seu projeto com o seguinte conteúdo:
ANTHROPIC_API_KEY="VALOR"
OPENAI_API_KEY="VALOR"
GOOGLE_API_KEY="VALOR"Para carregar esse arquivo, você pode usar o pacote python-dotenv ou deixar o uv cuidar disso automaticamente:
uv run --env-file=".env" caminho/do/arquivo.pyDepois de carregar o .env, teste se as variáveis estão acessíveis com:
import os
print(f"{os.getenv('GOOGLE_API_KEY', 'Não configurado')=}")
print(f"{os.getenv('ANTHROPIC_API_KEY', 'Não configurado')=}")
print(f"{os.getenv('OPENAI_API_KEY', 'Não configurado')=}")Se os valores aparecerem corretamente, está tudo certo.
IMPORTANTE: nunca versionar o arquivo .env nem expor suas API Keys no GitHub. Adicione o .env ao .gitignore do projeto para evitar problemas de segurança.
Chat simples com LangChain: Primeiro teste
A primeira coisa é instalar o LangChain (langchain) e os providers que você pretende usar. Esse pacote já depende de outros internos como langchain-core, langgraph, pydantic e vários outros.
Instalação do(s) pacote(s)
uv add "langchain[ollama]" -U --pre # para usar Ollama local
uv add "langchain[google-genai]" -U --pre # para modelos Gemini (Google)
uv add "langchain[openai]" -U --pre # para modelos da OpenAI
uv add "langchain[anthropic]" -U --pre # para modelos da AnthropicSobre as flags:
-U- força upgrade se o pacote já estiver instalado.--pre- necessário enquanto o LangChain está em transição para a versão 1 (pré-release no momento em que escrevo). Se a versão estável já tiver saído quando você ler isso,--prepode ser omitido.
Você não precisa instalar todos os providers, apenas os que pretende usar. Se quiser instalar todos de uma vez:
uv add "langchain[ollama,google-genai,openai,anthropic]" -U --preExemplo de como fica no pyproject.toml:
dependencies = [
"langchain[anthropic,google-genai,ollama,openai]>=1.0.0a6",
]Testando tudo e criando dois chats manualmente
Vou manter as partes de código em pastas separadas para as aulas. Essas pastas podem ter um ou vários arquivos.
A nomenclatura de pastas será src/examples/exNNN, onde NNN representa a sequência em que a aula foi criada (001, 002, 003, ..., 999). Espero que eu não passe de 999 exemplos haha.
Para essa aula, nada mais justo do que começarmos com ex001, então acesse:
Deixei os comentários no código.
E só para você não ficar na mão, também criei um segundo exemplo mostrando um chat com SystemMessage, HumanMessage e AIMessage. Isso nos permite montar um histórico bem rústico em um loop para conversarmos com o modelo sem que ele tenha amnésia (fique esquecendo do que estamos falando). Acesse:
Vou terminar esse texto por aqui (continuamos nos códigos acima).

