Regra de qualidade gerada por LLM custa pouco; difícil é mantê-la por anos
Depois de 16 anos construindo plataformas financeiras sobre AWS, a pergunta que eu faço sobre qualidade de dados não é "quem escreve a regra?", é "quem responde por ela às 2h da manhã, quando ela barra uma carga legítima?". O caso da Indegene, publicado em 4 de novembro de 2026, importa por causa dessa segunda pergunta: um agente propõe regras e código, mas só o que passa por aprovação humana entra no repositório central. Combinado com o modo ADVANCED do AWS Glue Data Quality, ele indica para onde o custo está indo: sai da autoria e vai para a manutenção.
Três números para calibrar a decisão
sa-east-1O sinal: gerar regra virou commodity
O Data Quality Agent da Indegene faz parte da NEXT Unified Data Platform. Foi construído com Strands Agents, roda no Amazon Bedrock AgentCore e atende Amazon Redshift e Snowflake atrás de AWS WAF, API Gateway e Cognito, com OAuth 2.0 e validação do JWT a cada requisição. O fluxo tem 10 etapas: fonte, schema, profiling, anomalias contra baseline histórico, gestão de regras existentes, modo de regra (coluna, tabela ou query customizada), sugestões com severidade, revisão, geração e validação de SQL e Python, e gravação no repositório central.
Duas bases de conhecimento dão o contexto. A interna reúne glossários, dicionários de dados, SOPs, orientação regulatória, regras aprovadas, scripts validados, resultados de profiling, anomalias históricas e feedback de especialistas. A externa vem de frameworks aprovados, busca na web e scraping controlado. É isso que permite ao agente sugerir o formato de 10 dígitos para uma coluna de NPI sem que alguém o ensine.
Em setembro de 2026, o Glue Data Quality ganhou o modo ADVANCED, que usa Bedrock sobre metadados e uma amostra aleatória da tabela para gerar regras em DQDL. Quando o próprio plano de dados entrega geração de fábrica, ela deixa de ser diferencial de plataforma.
Um limite do que li: a parte do post que consegui abrir termina na descrição da arquitetura, sem detalhar o mecanismo de validação e sem número de resultado. Por isso não cito ganho percentual aqui.
O que muda para quem desenha a plataforma
ADVANCED pode devolver regras diferentes para a mesma tabela, então geração não pode estar no caminho de execução.Onde a regra gerada erra sem avisar
O risco não é a regra que quebra, é a regra que passa. Regra com erro de sintaxe falha no primeiro run. As abaixo rodam verdes durante meses:
- Semântica invertida: no
CustomSqlcom resultado por linha, registro devolvido pela query conta como aprovado e registro não devolvido como reprovado. Um modelo que escreve a query natural de auditoria,select id from primary where valor < 0, aprova exatamente os registros errados. - Filtro que aprova: com
where, as linhas filtradas saem comoPassedpor padrão. UserowLevelConfiguration.filteredRowLabel=SKIPPED, ou um filtro que não casa com nada parece conformidade. - Composite por coluna: por padrão,
(A) or (B)avalia cada regra na tabela inteira e combina depois. O exemplo da documentação falha nesse modo e passa comcompositeRuleEvaluation.method=ROW.Completeness,Uniqueness,DatasetMatcheReferentialIntegritynem têm suporte no modoROW. - Histórico vazio: sem pontos anteriores,
last(k)devolve 0.0, entãoRowCount > last()passa na primeira execução sem provar nada. - Domínio congelado: regra derivada da amostra, como
ColumnValues "territorio" in [...], trata o valor novo e legítimo como defeito, e pode tratar o defeito antigo como domínio válido.
O exemplo de negócio do post, participação de mercado somando 100% por território, tem a mesma armadilha numérica de uma conciliação financeira: exige tolerância explícita. Uma forma em DQDL, com tolerância que você precisa calibrar: CustomSql "select count(*) from (select territory_id from primary group by territory_id having abs(sum(market_share) - 100) > 0.5) t" = 0.
Onde a aprovação humana separa geração de execução
O diagrama responde a uma pergunta: o que precisa acontecer para uma sugestão do modelo virar regra em produção. É uma simplificação das 10 etapas descritas no post. As setas tracejadas são o retorno assíncrono à base de conhecimento, e é por ali que um erro aprovado pode voltar como sugestão.
- Knowledge bases · internal + external
- Data Quality Agent · Strands + AgentCore
- Data steward · review and edit
- Code validation · SQL + Python
- Rule repository · approved rules
- Redshift, Snowflake · rule execution
- Monitoring and audit · results
A fronteira da amostra é decisão de arquitetura
O modo ADVANCED é prático, e a documentação de proteção de dados é clara sobre o que ele faz. O Athena amostra as linhas pelo workgroup glue-dataquality-sampling, e o Glue não exclui nenhuma coluna da amostra. Metadados e linhas seguem para o Bedrock, que não retém entrada nem saída depois do processamento e não as usa para treinar modelos. Até aqui, para muito cenário, isso basta.
Para dado de profissional de saúde, de paciente ou de cliente bancário, três detalhes mudam a conta:
- Sem máscara na chamada:
ADVANCEDnão aceitaPreProcessingQuery, então oSELECTsem a coluna sensível, que seria a saída óbvia, não está disponível. Aponte o run para uma tabela já mascarada. - Inferência entre Regiões: o run usa geographic cross-Region inference, e o conteúdo amostrado pode sair da Região de origem, dentro do limite geográfico do perfil. Com
sa-east-1fora da lista, o caminho precisa entrar no seu inventário de transferência da LGPD e, se for o caso, na avaliação de BACEN 4.893. - IAM do Bedrock não é o controle: a role de recomendação não precisa de permissão de Bedrock, logo negar
bedrock:InvokeModelnela não garante o bloqueio do envio. O controle útil é fixaraws:SourceArnna tabela, na trust policy, e não dar à role acesso à tabela sensível.
O BASIC também merece atenção. Nas Regiões suportadas, ele tenta enriquecer o ruleset com Bedrock enviando o ruleset e metadados de coluna, sem você habilitar nada. Um ruleset estatístico pode carregar valores reais numa lista ColumnValues ... in [...], então confira isso na sua classificação.
Três caminhos para gerar regras
| Critério | Glue BASIC | Glue ADVANCED | Agente próprio (padrão Indegene) |
|---|---|---|---|
| Contexto da regra | Estatísticas da tabela | Metadados e amostra de linhas | Glossário, SOP, histórico e feedback de especialista |
| Fontes | Tabelas do Data Catalog e jobs ETL | Tabelas do Data Catalog, em 17 Regiões | As que você conectar; no caso, Redshift e Snowflake |
| Dado enviado ao modelo | Ruleset e metadados de coluna, quando há enriquecimento | Metadados e linhas, sem exclusão de coluna | O que seu design permitir, e o controle é seu |
| Custo que fica | Revisar regra estatística | Revisar cada run e pagar Athena | Manter agente, bases, avaliação e tudo acima |
| Use quando | A base é nova e o objetivo é cobrir o estrutural | O dado pode ser amostrado e o catálogo já é o Glue | A regra depende de conhecimento que não está na tabela, em várias plataformas |
Aprovação humana é capacidade, não caixa de seleção
Human-in-the-loop costuma aparecer em diagrama como um ícone de pessoa. Na operação, ele é uma fila. Faça a conta do seu ambiente. No meu cenário hipotético, 200 tabelas com 40 colunas e uma única regra por coluna dão 8.000 regras. A 2 minutos por regra, são 267 horas de revisão antes da primeira execução. Ninguém revisa isso com atenção: em algum ponto da fila, aprovar vira clicar, e o controle continua no papel enquanto deixa de existir na prática.
A severidade por regra, que o agente da Indegene já sugere, é o que torna essa fila administrável. Revise uma a uma o que é crítico, aprove em lote o estrutural de baixo risco com amostragem de auditoria, e descarte sem culpa a regra que ninguém assumiria como dono. Regra sem dono nomeado não deveria entrar no repositório.
Depois vem o custo recorrente. Pelos exemplos da página de preços do Glue, uma avaliação de 5 DPUs por 20 minutos custa cerca de US$ 0,73, a US$ 0,44 por DPU-hora. Em 200 tabelas, diariamente, são cerca de US$ 4.380 por mês, e esse é o menor dos custos. O maior é o alerta falso: cada regra ruim gera investigação, e equipe que investiga alarme falso três vezes para de olhar o quarto. Meça por regra quantas falhas viraram correção real, e aposente a que nunca virou.
Como eu me posicionaria
Trate regra como código: o ruleset aprovado vai para repositório versionado, com hash, dono, severidade e motivo. A execução só lê essa versão, nunca chama o modelo. Isso também resolve o não determinismo: rodar a geração duas vezes não muda o que está em produção.
Teste a regra contra dado com defeito plantado: para cada regra, uma fixture com registros bons e outra com o defeito que ela promete pegar. A regra precisa passar na primeira e falhar na segunda. É o teste que pega o CustomSql invertido, e nenhuma revisão de texto pega com a mesma confiabilidade. As ferramentas de avaliação do Strands ajudam a medir o agente, mas juiz LLM avaliando saída de LLM não substitui executar a regra.
Não confunda plano válido com query segura: o EXPLAIN do Redshift mostra o plano sem executar, e também aceita UPDATE e DELETE. Passar nele prova que a query compila, não que ela só lê. Combine com allowlist de SELECT no parser e role somente leitura.
Separe a identidade de geração da de execução: o post de 5 de novembro sobre AgentCore e Lake Formation mostra o caminho certo para exploração: a query roda sob a role mapeada do usuário, com LF-Tags e data cell filters, e o controle não depende do SQL que o agente escreveu. A execução em produção é outra história. A matriz do Glue marca tabelas com filtro de coluna ou de dados do Lake Formation como não suportadas em vários formatos, então a role de qualidade tende a ter acesso amplo. Trate essa role como principal privilegiado e audite-a como tal.
O que eu não faria
- Gerar regra em tempo de execução: o mesmo dado pode receber regras diferentes entre runs, e a auditoria perde a resposta para "qual regra valia naquele dia?".
- Medir sucesso por número de regras: cobertura por coluna é fácil de inflar, e cada regra a mais é mais uma fonte de alerta para alguém manter.
- Colocar conteúdo da web direto no RAG de regras: página raspada é entrada não confiável. Exija a mesma curadoria da base interna, ou uma regra sugerida pode nascer de um texto que ninguém aprovou.
- Depender de
labelspara severidade em todo lugar: labels de DQDL só existem no Glue ETL, não no Data Quality baseado no Data Catalog. Quem padroniza nisso descobre o buraco no relatório.
A lição do ciclo de retorno
Regras aprovadas e scripts validados entram na base interna. Isso melhora a sugestão seguinte e também dá a uma aprovação ruim um alcance que ela não tinha: o erro deixa de afetar uma tabela e passa a orientar as próximas. Ao revogar uma regra, remova também o vetor dela da base. Quem só apaga do repositório deixa o erro vivo no contexto.
Eu começaria pelo Glue BASIC numa base não sensível e usaria ADVANCED só sobre tabela mascarada, antes de escrever uma linha de agente. Escreveria as fixtures com defeito plantado na primeira semana, porque é o único item desta lista que fica mais caro a cada regra aprovada sem ele. Só partiria para agente próprio quando a regra que importa dependesse de SOP e glossário, em mais de uma plataforma, que é a condição real do caso Indegene. A lição que levo de sistemas financeiros: o custo de um controle automatizado não é o custo de criá-lo, é o de provar anos depois por que ele existe e se ainda funciona.
Minha recomendação
Use o recurso nativo do Glue quando seu catálogo já está nele, a regra se explica pelos dados e a amostra pode ir ao modelo. Construa um agente quando a regra depende de conhecimento fora da tabela, em várias plataformas, e você tem como pagar a manutenção dele. Nos dois casos, não aprove em escala antes de ter dono por regra, teste com defeito plantado e critério de aposentadoria: sem isso, gerar mais rápido só antecipa a dívida.
Referências
Continue lendo
Deep dives de arquitetura, AWS, IA e mercado: direto no seu email. Grátis.
Sem spam · cancele quando quiser
Pergunte ao Fernando sobre isto
Uma resposta focada sobre este artigo, do meu assistente de IA, baseada no meu trabalho.
Participe da conversa
Entre para comentar
Confirme seu e-mail para participar, você também recebe a newsletter. Sem senha.