Como escrever requisitos funcionais para agentes de IA

O agente de IA foi construído, testado no ambiente de dev e aprovado pela equipe. No primeiro dia em produção, ele faz exatamente o oposto do que o stakeholder esperava. O que aconteceu? Ninguém escreveu o que "correto" significa. Este artigo ensina como especificar requisitos funcionais para agentes de IA de forma que seja testável, inequívoca e que a IA programadora consiga seguir sem adivinhar.

Por que requisitos importam mais em projetos de IA do que em software tradicional

Em software determinístico, um bug tem comportamento reprodutível. Você consegue debugar, encontrar a linha, corrigir. Em agentes de IA, o comportamento é probabilístico — o mesmo input pode gerar outputs diferentes dependendo do modelo, da versão, do contexto acumulado e até da ordem das mensagens.

Isso significa que "funciona" e "não funciona" não são binários em agentes de IA. Existe um espectro. E sem requisitos claros que definam onde está a linha entre aceitável e inaceitável, o projeto vive em perpétua discussão sobre se o comportamento é correto.

Vou ser direto: em 2026, o principal motivo de retrabalho que vejo em projetos de agentes de IA não é falha técnica — é ambiguidade de requisito. O desenvolvedor implementou o que entendeu; o stakeholder esperava outra coisa; e ninguém descobriu até o go-live.

O que é diferente em requisitos para agentes de IA

Requisitos tradicionais seguem o padrão: "dado X, o sistema deve fazer Y." Funciona bem para software determinístico. Para agentes de IA, esse padrão precisa de extensões:

A estrutura do requisito funcional para agente

Abaixo está a estrutura que uso em projetos. Cada campo tem um motivo de existir — vou explicar cada um.

Template de Requisito Funcional para Agente de IA

Este é o artefato central deste artigo. Copie, adapte ao seu projeto e versione junto com o código.

TEMPLATE — Requisito Funcional para Agente de IA

ID: RF-[NÚMERO]-[MÓDULO]
Exemplo: RF-012-TRIAGEM. Identificador único e rastreável.

Título: [Verbo no infinitivo + objeto claro]
Exemplo: "Classificar ticket de suporte por urgência"

Descrição:
[O quê o agente faz, em linguagem de negócio. 2–5 frases. Sem ambiguidade.]
Exemplo: "Ao receber um ticket de suporte aberto, o agente lê o título e a descrição, e atribui uma das três categorias de urgência: Crítico, Alto ou Normal. A classificação é registrada no campo 'urgência' do ticket no sistema de helpdesk."

Pré-condições:
[O que precisa ser verdade para este requisito ser executado]
- [ ] Ticket existe no sistema com status "Aberto"
- [ ] Título do ticket não está vazio (mínimo 10 caracteres)
- [ ] Agente tem permissão de escrita no campo "urgência"
- [ ] Conexão com a API do helpdesk está disponível

Pós-condições:
[Estado do sistema após execução bem-sucedida]
- [ ] Campo "urgência" do ticket está preenchido com "Crítico", "Alto" ou "Normal"
- [ ] Log de classificação registrado com: ID do ticket, categoria atribuída, confiança do modelo, timestamp
- [ ] Notificação enviada ao responsável se urgência = "Crítico"

Critérios de Aceite:
[Condições verificáveis que definem "funciona corretamente"]
- [ ] Dado um ticket com palavras como "sistema fora do ar", "erro crítico em produção" — o agente classifica como "Crítico" em ≥ 95% dos casos em dataset de teste
- [ ] Dado um ticket com dúvida funcional ou pedido de treinamento — classifica como "Normal" em ≥ 90% dos casos
- [ ] Tempo de resposta (classificação + registro) ≤ 4 segundos no p95
- [ ] Taxa de classificação como "Desconhecido" ≤ 5% nos tickets de produção
- [ ] Nenhum ticket fica sem classificação por mais de 2 minutos após abertura

Casos de Erro e Comportamento de Fallback:
[O que o agente faz quando algo dá errado]
- Ticket com descrição vazia ou insuficiente (menos de 10 chars): classifica como "Normal" e adiciona tag "revisar-manualmente"
- API do helpdesk indisponível: registra tentativa em fila de retry com até 3 tentativas em backoff exponencial; após 3 falhas, notifica administrador por e-mail
- Confiança do modelo abaixo de 70% (definida pelo score retornado): classifica como "Normal" e marca ticket para revisão humana
- Input com tentativa de prompt injection detectada: ignora conteúdo suspeito, classifica com base no título apenas e registra alerta de segurança

Escopo Negativo (o que este requisito NÃO cobre):
- Este requisito não inclui atribuição de ticket a agente humano específico (ver RF-013)
- Não inclui classificação por produto ou área (ver RF-014)
- Não altera o status do ticket (apenas o campo urgência)

Ferramentas Permitidas:
- leitura_ticket(ticket_id) — leitura do conteúdo do ticket
- atualizar_campo_ticket(ticket_id, campo, valor) — escrita no campo urgência apenas
- enviar_notificacao(destinatario, mensagem) — apenas para urgência Crítico
- registrar_log(dados) — registro de auditoria

Ferramentas Proibidas (neste requisito):
- excluir_ticket() — nunca
- alterar_status_ticket() — apenas RF-015 pode fazer isso
- acesso_dados_cliente() — não necessário para classificação

Dependências:
- RF-010: Autenticação do agente no helpdesk
- RF-011: Recebimento de webhook de novo ticket

Referências:
- ADR-003: Decisão de usar LLM para classificação vs. classificador treinado
- Dataset de teste: /testes/classificacao-urgencia/dataset-v2.jsonl (120 tickets rotulados)
- Responsável de negócio: [Nome] — aprovação dos critérios de aceite em [data]

Versão: 1.2 | Última atualização: 2026-05-05 | Status: Aprovado

Por que cada campo existe — sem enrolação

ID — rastreabilidade não é burocracia

Quando um teste falha, quando um stakeholder reclama, quando você precisa revisar o que foi decidido em março — o ID é o que conecta o requisito ao código, ao teste, ao log e à conversa. Sem ID, você caça contexto por horas. Com ID, leva 30 segundos.

Pré-condições — o contrato de entrada

Agentes falham quando recebem inputs que não estavam previstos. Pré-condições explícitas permitem que o sistema valide antes de chamar o agente, evitando desperdiçar tokens e gerar respostas sem sentido. São também a base para testes de borda.

Pós-condições — o contrato de saída

Sem pós-condições definidas, não existe critério objetivo para dizer que o agente "terminou" a tarefa. Pós-condições são verificáveis automaticamente em testes e em monitoramento de produção.

Critérios de aceite com percentuais — testabilidade real

"O agente deve classificar corretamente" não é testável. "O agente deve classificar como Crítico em ≥ 95% dos casos do dataset de teste" é testável. A diferença parece pequena no papel, mas é enorme na prática: com critérios quantitativos, qualquer desenvolvedor consegue rodar os testes e saber se o requisito passa ou falha.

Casos de erro — o que mais diferencia bons requisitos de IA

Em software convencional, casos de erro são tratados com exceções. Em agentes de IA, o modelo pode "tentar" continuar mesmo quando deveria parar — e aí a coisa fica feia. Casos de erro explícitos definem o comportamento de fallback de forma inequívoca, evitando que o agente improvise em situações para as quais não foi projetado.

Escopo negativo — o que livra de surpresas

Um dos erros mais comuns: o desenvolvedor implementa algo além do escopo porque "parecia lógico". Com escopo negativo explícito, fica claro que a responsabilidade é de outro requisito — e o desenvolvedor não "inventa" funcionalidades que não foram especificadas.

Ferramentas permitidas e proibidas — princípio do menor privilégio

Agentes com acesso irrestrito a ferramentas são agentes de risco. Definir explicitamente quais ferramentas cada requisito pode usar é a implementação do princípio do menor privilégio em nível de requisito. Se o agente tiver acesso apenas ao que precisa para aquela tarefa, o raio de impacto de um erro é controlado.

Exemplo real: agente de qualificação de lead

Para tornar concreto, veja como o template se aplica a um caso B2B comum — um agente que qualifica leads recebidos por formulário antes de passá-los ao CRM:

ID: RF-007-QUALIFICACAO

Título: Qualificar lead recebido por formulário

Critérios de Aceite (resumo):

  • Lead com cargo C-level + empresa > 50 funcionários: classificar como "Quente" em ≥ 92% dos casos de teste
  • Lead com e-mail de domínio gratuito (gmail, hotmail) sem cargo informado: classificar como "Frio" em ≥ 90%
  • Latência de qualificação ≤ 8 segundos (inclui consulta de CNPJ na Receita Federal)
  • Nenhum lead fica sem qualificação por mais de 5 minutos após submissão

Caso de Erro crítico: API da Receita Federal indisponível → qualificar com dados do formulário apenas, sinalizar como "Qualificação parcial — validar CNPJ manualmente", não bloquear fluxo

Os 4 erros mais comuns ao escrever requisitos para IA

1. Requisitos subjetivos sem métrica

"O agente deve ser educado e prestativo." Como você testa isso? Quem decide se foi educado o suficiente? Substitua por: "O agente não deve usar linguagem negativa ou acusatória — avaliado por checklist de 10 itens com score mínimo de 8/10 em amostragem mensal de 50 respostas."

2. Ignorar os casos em que o agente deve recusar

Todo agente precisa saber quando dizer "não consigo" ou "isso está fora do meu escopo". Se você não especifica esses casos, o agente vai tentar resolver de qualquer forma — e vai inventar. Especifique explicitamente: "Quando a pergunta não se relacionar ao domínio X, o agente deve responder: 'Esta questão está fora do meu escopo. Você pode contatar [canal Y].'"

3. Misturar requisito funcional com requisito técnico

"O agente deve usar o modelo GPT-4o com temperatura 0.2." Isso é decisão técnica, não requisito funcional. O requisito funcional define o comportamento observável; a decisão técnica sobre como implementar vai em ADR (veja como escrever ADRs para IA).

4. Não envolver a área de negócio na aprovação dos critérios de aceite

Critérios de aceite escritos apenas por engenheiros costumam refletir o que é fácil de medir, não o que importa para o negócio. A aprovação do stakeholder de negócio nos critérios de aceite é o contrato que evita "mas eu esperava outra coisa" depois do go-live.

A relação com a abordagem SPEC-driven

Requisitos funcionais são um dos três documentos centrais da arquitetura SPEC-driven para projetos de IA. O SPEC-driven coloca documentação como código — versionada, revisada, parte do processo de desenvolvimento.

Na prática: os requisitos funcionais vivem no repositório junto com o código. Cada mudança de comportamento do agente implica uma atualização no requisito correspondente. O DoD (Definition of Done) do projeto inclui "requisito atualizado e aprovado" como critério obrigatório antes de qualquer merge.

O TASKS.md referencia os IDs dos requisitos em cada tarefa — assim qualquer desenvolvedor sabe exatamente qual comportamento está sendo implementado, sem precisar adivinhar.

Conclusão: ambiguidade é o inimigo do agente

Agentes de IA amplificam ambiguidade. Uma instrução vaga para um humano produz uma pergunta de esclarecimento. A mesma instrução vaga para um agente produz um comportamento inventado que pode ter efeito externo — e que vai ser descoberto em produção, no pior momento.

Requisitos funcionais bem escritos não são burocracia. São o contrato que permite que a equipe técnica, o time de negócio e a própria IA programadora estejam na mesma página sobre o que "correto" significa. Sem esse contrato, cada um vai trabalhar com sua própria definição — e o resultado é o projeto que nunca termina porque nunca está "certo o suficiente".