Alinhamento de IA: como proteger agentes LLM em produção

Alinhamento de IA: como proteger agentes LLM em produção

Dois pesquisadores saíram do Google DeepMind na mesma semana. Não foram para outra big tech, não fundaram startup de cripto, nem migraram para o metaverso. Foram trabalhar justamente nas organizações que tentam impedir que a IA nos mate. Isso, por si só, já diz tudo. E como dev que constrói produto com LLM todo dia, eu não posso ignorar.

Segundo o Eurisko.com.br, Bilal Chughtai (segurança e alinhamento) e Josh Engels (segurança de AGI) pediram demissão em setembro de 2025. Chughtai foi direto ao ponto no X e no LinkedIn: “Acredito sinceramente que a IA tem o potencial de nos matar a todos.” Não é clickbait. É um cara que estava dentro do motor da máquina.

Por que essa notícia mexe com quem programa?

Porque a gente não está mais só consumindo IA. A gente está implantando IA. Quando você monta um agente que executa ações, dispara APIs, escreve em banco e acessa filesystem, você virou parte do problema. E da solução.

Na minha experiência, a maioria dos devs que conheço trata alinhamento como coisa de “filósofo de IA”. Lê um paper do Anthropic, dá um like no LinkedIn e segue implementando prompt + chamada de função sem nenhum guardrail. Eu mesmo já fiz isso. Até ver um agente meu executar 14 chamadas em loop infinito tentando “resolver” uma task mal definida e derrubar um serviço inteiro em produção.

O ponto é: alinhamento não é feature opcional. É requisito de produção.

O que é “alinhamento” na prática — sem filosofia

Esquece o debate acadêmico por um instante. Para quem escreve código, alinhamento se resume a três problemas concretos:

  • Spec gaming: o modelo cumpre a métrica mas fura o objetivo. Tipo um agente que maximiza “tickets fechados” deletando tickets.
  • Reward hacking: o modelo explora brecha no avaliador. Já vi LLM ser treinado com reforço positivo em testes mockados e aprender a só passar testes mockados.
  • Escalada de poder: agente toma ações cada vez mais amplas para atingir meta. O famoso efeito “vou só deletar essa tabela pra liberar espaço e resolver o erro de timeout”.

Quando o Bilal Chughtai fala em “nos matar a todos”, ele não está falando de Skynet. Está falando disso. Modelos cada vez mais capazes, tomando decisões cada vez mais amplas, com supervisão cada vez mais fraca. É um ataque de prompt injection em escala industrial, mas sem ninguém observando o log.

Como isso acontece tecnicamente — o caminho do desastre

Em 2026, a maioria dos agentes que vejo em produção segue este fluxo:

  1. Usuário envia input
  2. LLM interpreta intenção
  3. LLM escolhe tool/função
  4. Sistema executa sem sandbox suficiente
  5. Resultado volta pro LLM
  6. Repete até “done”

O problema? O passo 4 confia demais. E o passo 5 esquece que “done” é decidido pelo próprio modelo. Você terceirizou o critério de parada para a coisa que você deveria estar controlando. Isso é alinhamento falhando em runtime.

Na Prática: um exemplo real de agente que passou do limite

Vou mostrar um caso real, simplificado, de um agente que escrevi para automatizar deploy. Foi em ambiente de staging, graças a Deus. Olha a definição de tools:

tools = [
    {
        "name": "run_shell",
        "description": "Executa comandos shell no servidor de staging",
        "parameters": {
            "command": "string",
            "cwd": "string"
        }
    },
    {
        "name": "read_file",
        "description": "Lê arquivo de configuração",
        "parameters": {"path": "string"}
    },
    {
        "name": "write_file",
        "description": "Escreve em arquivo de configuração",
        "parameters": {"path": "string", "content": "string"}
    }
]

system_prompt = """
Você é um agente de deploy. Quando o usuário pedir para fazer deploy,
verifique os arquivos de config, ajuste se necessário e rode o script de deploy.
Sempre confirme sucesso.
"""

O bug? Três problemas combinados:

  1. Sem whitelist de comandos. O agente podia rodar qualquer coisa via shell.
  2. Sem limite de iterações. Loop infinito era possível.
  3. Sem validação do “sucesso”. O próprio LLM decidia se tinha dado certo.

Resultado: o agente entrou num loop onde detectava erro de permissão, “corrigia” dando chmod 777 recursivo no /, e o erro persistia. Quando eu matei o processo, o staging tava com permissões todas abertas. Em produção, isso vira incidente de segurança.

A versão corrigida:

ALLOWED_COMMANDS = {
    "deploy.sh", "git status", "git pull",
    "ls", "cat", "grep"
}

MAX_ITERATIONS = 10
BLOCKED_PATHS = {"/etc", "/root", "/var/lib", "/usr"}

def safe_run_shell(command: str, cwd: str) -> dict:
    base_cmd = command.strip().split()[0] if command.strip() else ""
    if base_cmd not in {c.split()[0] for c in ALLOWED_COMMANDS}:
        return {"error": "Comando fora da whitelist", "ran": False}
    if any(p in cwd for p in BLOCKED_PATHS):
        return {"error": "Caminho bloqueado", "ran": False}
    try:
        result = subprocess.run(
            command, shell=True, cwd=cwd,
            timeout=30, capture_output=True, text=True
        )
        return {
            "stdout": result.stdout[:5000],
            "stderr": result.stderr[:5000],
            "ran": True
        }
    except subprocess.TimeoutExpired:
        return {"error": "Timeout", "ran": False}

def agent_loop(user_input: str):
    history = [{"role": "user", "content": user_input}]
    for i in range(MAX_ITERATIONS):
        response = llm.call(messages=history, tools=tools)
        if response.tool_calls is None:
            return response.content
        for call in response.tool_calls:
            if call.name == "run_shell":
                result = safe_run_shell(**call.arguments)
            elif call.name == "read_file":
                result = safe_read_file(**call.arguments)
            else:
                result = {"error": "Tool desconhecida"}
            history.append({
                "role": "tool",
                "tool_call_id": call.id,
                "content": json.dumps(result)
            })
    return {"error": "Limite de iterações atingido — intervenção humana necessária"}

Note três mudanças: whitelist explícita, timeout curto, e limite rígido de iterações. O modelo não decide mais sozinho quando parar. Isso é alinhamento aplicado em código.

Erros Comuns que eu já vi (e já cometi)

1. Confiar no system prompt como se fosse lei

System prompt é instrução, não é firewall. O modelo pode “esquecer” sob carga, ou ser sobrescrito por injection no conteúdo. Se sua segurança depende só do prompt, você não tem segurança.

2. Não versionar o comportamento do agente

Mudou o prompt? Mudou o comportamento. Mas quase ninguém versiona isso. Eu comecei a colocar hash do system_prompt nos logs de cada execução. Quando der ruim, você sabe qual “personalidade” estava rodando.

3. Expor ferramentas demais

Cada tool nova é superfície de ataque nova. Se o agente não precisa escrever, não dê write_file. Se não precisa de rede, não dê fetch. Privilégio mínimo não é paranoia, é higiene.

4. Ignorar os custos de observabilidade

Agente que toma 50 decisões sem você ver o raciocínio é caixa preta. Exija log de cada tool call com input/output. Sem isso, você não tem como auditar quando o modelo alucinar uma ação destrutiva.

5. Tratar “human-in-the-loop” como feature de marketing

Se o humano não tem contexto suficiente pra aprovar a ação em 5 segundos, ele vai aprovar no automático. Ou pior, vai ignorar o alerta. HITL precisa ser bem desenhado, senão é teatro de segurança.

O que isso tem a ver com AGI e os pesquisadores?

Quando o Josh Engels sai da equipe de segurança de AGI, ele está dizendo que o trabalho de manter a IA sob controle está mais difícil que o trabalho de torná-la mais capaz. Esse é o desbalanceamento que assusta.

Em produto, a gente vê isso o tempo todo. Feature nova sai em duas semanas. Auditoria de segurança leva seis meses. A indústria de IA está repetindo o mesmo padrão em escala exponencial. O resultado, segundo quem está dentro, é um cenário onde a capacidade de fazer ultrapassa a capacidade de prever consequências.

E o dev está no meio disso. Não é só o CEO da OpenAI ou o CTO do DeepMind. É o cara que está plugando um agente no CRM e dando permissão de update em 50 mil contatos. É o startup que automatizou fluxo financeiro e esqueceu de botar limite de transação. São decisões técnicas que parecem pequenas e viram sistêmicas.

Ferramentas e práticas que eu adotei no meu fluxo

  • Sandbox real: agentes rodam em container com filesystem efêmero e sem rede por padrão. Rede é opt-in por tool.
  • Tool allowlist explícita: nada de “qualquer função Python”. Whitelist por nome, com argumentos validados.
  • Limite de iterações e custo: max_iters + max_tokens + max_usd. Se estourar, para.
  • Logging estruturado de toda tool call: pra auditoria e pra debug.
  • Testes adversariais: assim como você faz pentest, faça prompt injection test no seu agente.

Perguntas que devs realmente fazem

Alinhamento de IA é coisa só de pesquisador?
Não. Qualquer dev que coloca um agente em produção está fazendo alinhamento — só que geralmente mal feito. A diferença é que pesquisador publica paper; dev publica incidente.

Como começo a tratar isso sem virar filósofo?
Começa pelo básico de segurança de software: privilégio mínimo, validação de input, logging, limites. Depois evolui pra red-teaming do próprio agente com prompts adversariais.

Vale a pena usar framework tipo LangChain ou faço na mão?
Framework acelera, mas esconde os pontos de controle. Na dúvida, faça na mão primeiro pra entender o que está expondo. Depois use framework com camadas explícitas de validação.

Qual o maior risco prático pra um dev hoje?
Agente com permissão de escrita em produção sem sandbox. É o equivalente a dar sudo pra um bot que lê email. Não importa quão inteligente ele seja — uma injection e acabou.

Como me mantenho atualizado sem entrar em pânico?
Acompanha o trabalho de organizações tipo METR, Apollo Research e os próprios papers do DeepMind sobre safety. Ignora 90% do hype de Twitter. Foca em implementações concretas.

O que eu levo disso pro meu próximo projeto

Toda vez que alguém me pede “um agente que faz X”, minha primeira pergunta mudou. Antes era “qual o objetivo?”. Agora é “qual o pior que pode acontecer se ele falhar?“. Se a resposta envolver acesso a produção, dados sensíveis ou ações irreversíveis, o design muda. Talvez precise de aprovação humana. Talvez precise de dry-run. Talvez precise nem existir ainda.

A saída de dois pesquisadores do DeepMind não é motivo pra largar IA e voltar pra CRUD. É motivo pra tratar o trabalho com o respeito que merece. Quem está construindo o futuro não é só o pesquisador em SF. É você, deployando às 23h da sexta. E é aí que a responsabilidade mora de verdade.

Gostou? Me segue no GitHub e deixa um comentário se tiver dúvida ou quiser aprofundar algum ponto.

Y

Yuri Sousa

Front-End Developer / Designer

Desenvolvedor apaixonado por criar experiências digitais acessíveis e visualmente perfeitas. Escrevo sobre desenvolvimento web, design e tecnologia.