05-02-01 — ReAct: raciocinar e agir em loop
TL;DR
ReAct (Reasoning + Acting) é o padrão fundamental de agente: o LLM alterna entre pensar (Thought), agir (Action) e observar o resultado (Observation) até resolver a tarefa. É a base de praticamente todos os frameworks de agentes modernos.
Origem: o paper de Yao et al. (2022)
ReAct foi proposto no paper "ReAct: Synergizing Reasoning and Acting in Language Models" (Yao et al., NeurIPS 2022 Workshop). A ideia central: combinar chain-of-thought (raciocínio interno) com ações externas num loop interativo.
Antes do ReAct, os LLMs raciocinavam (chain-of-thought) OU agiam (tool use), mas não os dois de forma integrada e iterativa.
O breakthrough: ReAct mostrou que dar ao LLM espaço para "pensar em voz alta" antes de cada ação melhora drasticamente a qualidade das decisões e reduz erros em tarefas complexas.
O loop Thought → Action → Observation
sequenceDiagram
participant U as Usuário
participant L as LLM
participant T as Tool/Ambiente
U->>L: "Qual o CEO da Vale e sua formação?"
Note over L: Thought: Preciso buscar quem é o CEO da Vale
L->>T: Action: search("CEO Vale 2024")
T->>L: Observation: "Gustavo Pimenta, CEO desde jan/2025..."
Note over L: Thought: Tenho o nome. Agora preciso da formação acadêmica
L->>T: Action: search("Gustavo Pimenta formação acadêmica")
T->>L: Observation: "Engenharia pela USP, MBA pela Wharton..."
Note over L: Thought: Tenho tudo. Posso responder.
L->>U: Final Answer: "Gustavo Pimenta é o CEO da Vale desde jan/2025. Formado em Engenharia pela USP com MBA pela Wharton."
Como o prompt ReAct é estruturado
O prompt instrui o LLM a sempre seguir o formato:
Thought: [raciocínio sobre o que fazer a seguir]
Action: [nome_da_ferramenta]
Action Input: [argumentos para a ferramenta]
Observation: [resultado retornado pela ferramenta]
... (repete até ter resposta final)
Final Answer: [resposta para o usuário]
Exemplo em Python (com LangChain)
from langchain.agents import create_react_agent, AgentExecutor
from langchain_openai import ChatOpenAI
from langchain.tools import DuckDuckGoSearchRun
from langchain import hub
# Carrega o prompt ReAct padrão do LangChain Hub
prompt = hub.pull("hwchase17/react")
# Define as ferramentas disponíveis
tools = [DuckDuckGoSearchRun()]
# Cria o agente ReAct
llm = ChatOpenAI(model="gpt-4o", temperature=0)
agent = create_react_agent(llm, tools, prompt)
# Executor com limite de iterações
executor = AgentExecutor(
agent=agent,
tools=tools,
max_iterations=5, # Guardrail: máximo de steps
verbose=True # Mostra Thought/Action/Observation
)
result = executor.invoke({
"input": "Qual o CEO da Vale e sua formação acadêmica?"
})
print(result["output"])
Vantagens e limitações
| Vantagem | Limitação |
|---|---|
| Raciocínio transparente e auditável | Mais tokens por step (custo maior) |
| Adapta-se ao resultado das ações | Pode entrar em loops infinitos |
| Reduz alucinações vs. resposta direta | Latência maior (múltiplos round-trips) |
| Fácil de debugar (logs de Thought) | Qualidade depende muito do modelo base |
Loop infinito: Sempre defina
max_iterations ou equivalente. Sem limite, um agente ReAct com uma ferramenta que retorna resultados ambíguos pode loopear indefinidamente — e cada iteração consome tokens.
No Semantic Kernel: O padrão ReAct é implementado pelo
FunctionChoiceBehavior e o planner do SK. O Azure AI Foundry usa ReAct internamente nos agentes do Azure AI Agent Service. O ChatCompletionAgent do SK implementa o loop de forma nativa.
Como isso se conecta
Fontes
- Yao et al. — "ReAct: Synergizing Reasoning and Acting in Language Models" (2022) — paper original do ReAct.
- LangChain — ReAct Agent docs — implementação de referência em Python.
- Microsoft — Semantic Kernel Agent Chat — implementação do loop de agente no SK.
- LangChain Blog — ReAct Agent (2023) — tutorial prático com exemplos.