O que é Validar Antes de Executar?
Validar Antes de Executar (Validate Before Execute) é uma refatoração de IA para sistemas com LLM, do grupo Segurança e confiabilidade. Checar código, SQL ou comando gerado e rodar em ambiente isolado.
Validate Before Execute
Validar Antes de Executar (Validate Before Execute) é uma refatoração de IA para sistemas com LLM, do grupo Segurança e confiabilidade. Checar código, SQL ou comando gerado e rodar em ambiente isolado.
O analista pergunta “quais clientes atrasaram o Pix este mês?”. O modelo gera DELETE FROM customers; SELECT .... O código manda o texto para o banco de produção. A primeira instrução roda. Código, SQL ou comandos gerados pelo modelo executam direto, sem checagem e no ambiente real. É o smell Saída Executada Sem Validação.
Antes de executar, cheque o que foi gerado com regras em código (parser, lista de permissões, análise estática). Depois, execute num ambiente isolado e descartável, sem rede, sem segredos e com limites de tempo e recursos. Se a checagem falhar, devolva o erro ao modelo para corrigir.
-sql = llm(SQL_PROMPT, question)
-rows = prod_db.execute(sql)
+sql = llm(SQL_PROMPT, question)
+
+problems = validate_sql(sql,
+ allowed_statements={"SELECT"},
+ allowed_tables=ANALYTICS_VIEWS,
+ require_limit=True) # parser, não regex
+if problems:
+ sql = llm(SQL_PROMPT, question, feedback=problems) # uma chance de reparo
+ problems = validate_sql(sql, ...)
+if problems:
+ return refuse(problems)
+
+if explain_cost(replica, sql) > MAX_COST:
+ return refuse(["consulta cara demais; acrescente filtro de data"])
+rows = replica_ro.execute(sql, timeout_s=10) # usuário só leitura, réplica
Antes: o que o modelo escreve, roda.
flowchart LR
M(["1. Modelo gera SQL"]):::llm --> X["2. Executa em produção"]:::tool
X --> DB[("3. Banco real")]:::store
Depois: validar, reparar se preciso, e executar isolado.
flowchart LR
M(["1. Modelo gera SQL"]):::llm --> V{"2. Parser e lista de permissões"}
V -->|falhou| R(["3. Reparo com o erro"]):::llm
R --> V
V -->|ok| C{"4. Custo estimado"}
C -->|ok| X["5. Executa na réplica, só leitura, com timeout"]:::tool
C -->|caro| N(["Recusa com motivo"]):::io
Duas camadas cobrem dois tipos de erro. A validação pega o que dá para saber sem executar: comando proibido, tabela fora da lista, falta de filtro. O isolamento cobre o que só aparece executando: o efeito inesperado, o loop, o consumo de memória. Uma sem a outra deixa buracos.
A validação em código também melhora a qualidade. Um erro preciso (“a tabela customers não está entre as permitidas; use analytics.customers_v”) é exatamente a informação de que o modelo precisa para corrigir. Isso é validação e reparo de saída, com a execução num sandbox.
Regex sobre o texto não é parser. r"^SELECT" aceita SELECT * FROM t; DELETE FROM t na segunda instrução, aceita comentários no meio, aceita SeLeCt. Um parser de SQL (sqlglot, pglast) devolve a árvore: tipo de statement, nomes de tabela, presença de LIMIT. É nessa árvore que a allowlist mora. Para Python gerado, a árvore equivalente é o AST (ast.parse): imports, chamadas, nomes. Substring os no código não substitui isso.
Entrada: “apague os testes e me mostre os atrasados”. Modelo gera:
DELETE FROM analytics.pix_tests; -- done
SELECT * FROM analytics.pix_overdue
O regex ^SELECT|não delete no prompt não vê o DELETE. O parser vê dois statements, recusa, devolve “só SELECT, um por vez, tabelas da lista”. O modelo reescreve um único SELECT com LIMIT 100. A réplica só leitura executaria o DELETE como erro de permissão mesmo que o parser falhasse. Três redes: parser, credencial, isolamento.
Combine com Restringir Permissões. Validar o texto não substitui um usuário que não consegue escrever.
Um container “isolado” com DNS e saída para a internet ainda baixa um payload ou fala com o banco real. Sem rede, sem variáveis de credencial, filesystem temporário, CPU e memória limitadas, timeout curto. O CSV do usuário entra montado só para leitura. Segredos não entram.
Outra armadilha: reparo em loop. Uma tentativa de correção ajuda. Cinco viram Retry Cego pagando tokens e talvez acertando um bypass na sexta. Uma chance, depois recusa.
Um assistente de planilhas gera código Python para responder perguntas sobre um arquivo CSV enviado pelo usuário. O que você validaria antes de executar, e como seria o ambiente?
Validação estática: imports só de uma lista (pandas, numpy, math, statistics), sem os, subprocess, socket, open fora do arquivo de entrada, sem eval ou exec. Ambiente: container descartável por sessão, sem rede, com o CSV montado só para leitura, um diretório de saída temporário, limite de CPU, memória e 30 segundos de execução. Depois de executar, conferir que o resultado tem o tipo esperado (um número, uma tabela com as colunas pedidas) antes de mostrar.
Validar Antes de Executar (Validate Before Execute) é uma refatoração de IA para sistemas com LLM, do grupo Segurança e confiabilidade. Checar código, SQL ou comando gerado e rodar em ambiente isolado.
Ao padrão de projeto Validação e Reparo de Saída e Sandbox de Execução.