Agente ReAct do zero com Gemini e LangGraph

O LangGraph é um framework para criar aplicativos de LLM com estado, o que o torna uma boa opção para construir agentes ReAct (raciocínio e ação).

Os agentes ReAct combinam o raciocínio do LLM com a execução de ações. Eles pensam, usam ferramentas e agem de forma iterativa com base em observações para alcançar as metas do usuário, adaptando a abordagem de maneira dinâmica. Introduzido em "ReAct: Synergizing Reasoning and Acting in Language Models" (2023), esse padrão tenta espelhar a solução de problemas flexível e semelhante à humana em fluxos de trabalho rígidos.

O LangGraph oferece um agente ReAct pré-criado ( create_react_agent), que é útil quando você precisa de mais controle e personalização para suas implementações do ReAct. Este guia mostra uma versão simplificada.

Os agentes de modelos do LangGraph são gráficos que usam três componentes principais:

  • State: estrutura de dados compartilhada (normalmente TypedDict ou Pydantic BaseModel) que representa o snapshot atual do aplicativo.
  • Nodes: codifica a lógica dos agentes. Eles recebem o estado atual como entrada, realizam algum cálculo ou efeito colateral e retornam um estado atualizado, como chamadas de LLM ou de ferramentas.
  • Edges: define o próximo Node a ser executado com base no State atual, permitindo lógica condicional e transições fixas.

Se você ainda não tiver uma chave de API, acesse o Google AI Studio.

pip install langgraph langchain-google-genai geopy requests

Defina sua chave de API na variável de ambiente GEMINI_API_KEY.

import os

# Read your API key from the environment variable or set it manually
api_key = os.getenv("GEMINI_API_KEY")

Para entender melhor como implementar um agente ReAct usando o LangGraph, este guia mostra um exemplo prático. Você vai criar um agente cujo objetivo é usar uma ferramenta para encontrar o clima atual de um local especificado.

Para esse agente de clima, o State vai manter o histórico de conversas em andamento (como uma lista de mensagens) e um contador (como um número inteiro) para o número de etapas realizadas, para fins ilustrativos.

O LangGraph fornece uma função auxiliar, add_messages, para atualizar listas de mensagens de estado. Ela funciona como um redutor, recebendo a lista atual, além das novas mensagens, e retorna uma lista combinada. Ela processa atualizações por ID de mensagem e usa um comportamento "somente anexar" para mensagens novas e não vistas.

from typing import Annotated,Sequence, TypedDict

from langchain_core.messages import BaseMessage
from langgraph.graph.message import add_messages  # helper function to add messages to the state

class AgentState(TypedDict):
    """The state of the agent."""
    messages: Annotated[Sequence[BaseMessage], add_messages]
    number_of_steps: int

Em seguida, defina sua ferramenta de clima.

from langchain_core.tools import tool
from geopy.geocoders import Nominatim
from pydantic import BaseModel, Field
import requests

geolocator = Nominatim(user_agent="weather-app")

class SearchInput(BaseModel):
    location:str = Field(description="The city and state, e.g., San Francisco")
    date: