LLM propõe, código determinístico dispõe: como deixo um agente rodar em produção sem medo
TL;DR — Nunca dê ao LLM a ferramenta que causa o efeito colateral. Ele propõe um artefato estruturado; o código determinístico valida e executa. Foi assim que coloquei um agente pra rodar ~200 propostas/mês em produção sem perder o sono.
Todo mundo quer o agente autônomo que faz tudo sozinho. Aí ele posta a resposta errada pro cliente, aprova o reembolso que não devia, ou dispara o e-mail com o valor alucinado — e a confiança evapora. Existe um jeito de ter a inteligência do LLM sem entregar a chave do cofre pra ele.
🎯 O problema real de agente em produção
Um LLM é probabilístico. Isso é ótimo pra gerar e péssimo pra garantir. Se o mesmo componente que decide o que fazer é o que executa a ação, cada alucinação vira um efeito colateral real: um dado gravado, um e-mail enviado, um valor cobrado.
Em ambiente interno, tudo bem experimentar. Em produção, com cliente do outro lado, você precisa de garantia — não de "quase sempre certo".
🔑 O princípio: separar quem propõe de quem executa
A regra que uso é uma frase só:
💡 LLM propõe, código determinístico dispõe.
Na prática: o agente não recebe a tool que causa o efeito colateral. Ele só devolve um artefato estruturado (um JSON validável). O código então valida esse artefato contra regras rígidas e, só se passar, executa.
sequenceDiagram
participant U as Ticket/Input
participant L as LLM (propõe)
participant V as Código determinístico (dispõe)
participant S as Sistema real (Zendesk/DB)
U->>L: contexto
L->>V: artefato estruturado (JSON)
Note over V: hard-rules +<br>salvaguardas anti-alucinação
alt passou na validação
V->>S: executa a ação
else falhou
V-->>U: barra / manda pra revisão humana
end
Repara onde está a seta que toca o sistema real: ela sai do código, nunca do LLM. O LLM sugere; o código é o único com permissão de agir.
🪝 O que isso te dá na prática
| Sem separação | Com "propõe/dispõe" |
|---|---|
| Alucinação vira ação real | Alucinação é barrada antes de executar |
| Difícil de testar (saída é ação) | Fácil de testar (saída é um JSON) |
| Autonomia é tudo-ou-nada | Autonomia sobe em degraus controlados |
| Auditoria = ler logs soltos | Auditoria = o artefato + a regra que passou |
O ganho escondido é o de avaliação: como o LLM só produz um JSON, eu consigo congelar esse JSON e testar o código determinístico de forma repetível — coisa impossível se a "saída" fosse uma ação no mundo.
📚 O que a teoria diz
Michael Albada (Building Applications with AI Agents) trata isso como resiliência e modularidade: um agente sério precisa de tratamento de erro, fallback e componentes plugáveis com interfaces claras — não um LLM cabeado direto no efeito colateral.
E conecta com a ideia de escada de autonomia: você começa em "humano obrigatório", e só promove um fluxo pra rodar sozinho quando a taxa de aceitação das propostas justifica. A separação propõe/dispõe é o que torna essa promoção gradual e reversível — você libera degrau por degrau, não de uma vez.
Chip Huyen (AI Engineering) reforça pelo lado do risco: saída aberta é difícil de avaliar. Ao forçar o LLM a devolver estrutura (o JSON) em vez de ação, você transforma um problema aberto num problema fechado, verificável.
⚠️ O ponto cego honesto
⚠️ Isso reduz a autonomia do agente de propósito — e nem todo caso quer isso. Se o seu problema é aberto, criativo e de baixo risco (brainstorm, rascunho pra humano revisar), amarrar tudo em hard-rules é over-engineering. O padrão brilha quando a ação tem consequência real (grava, cobra, envia, aprova). Escolha a dose pelo risco.
E tem um custo: escrever e manter as regras determinísticas dá trabalho. Você troca "esforço de engenharia" por "garantia". Em produção com cliente, esse trade quase sempre compensa. Num protótipo de fim de semana, talvez não.
🏁 O que fica
Antes de dar uma tool ao seu agente, pergunte: "se ele alucinar bem na hora de usar isso, o que acontece no mundo real?" Se a resposta assusta, tire a tool das mãos dele e ponha o código no meio. O LLM propõe; o código dispõe.
Como você segura seus agentes em produção — dá a tool direto e confia, ou põe uma camada determinística no meio? Conta o teu caso.