Ciclos de correção e validação
Corrija saídas malformadas.
Ciclos de correção e validação é uma aula grátis de AI Prompt Engineering no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de AI Prompt Engineering, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de AI Prompt Engineering inclui 4 aulas no total.
Por que existem ciclos de reparo
Mesmo com esquemas, a saída pode falhar: JSON truncado por um limite de tokens, campos extras inventados, uma cadeia de caracteres onde era exigido um número ou uma regra de negócio violada. Um ciclo de reparo detecta a falha e a envia de volta ao modelo para que ele a corrija.
Essa é a rede de segurança que transforma uma taxa de sucesso de 98% em uma de 99,9%.
Ciclo de validação e reparo
O ciclo canônico é: gerar, validar e, se for inválido, solicitar novamente com o erro específico, até um número limitado de tentativas.
def generate_valid(prompt, schema, max_tries=3):
msgs = [{'role': 'user', 'content': prompt}]
for _ in range(max_tries):
out = call_model(msgs)
ok, err = validate(out, schema)
if ok:
return out
msgs.append({'role': 'assistant', 'content': out})
msgs.append({'role': 'user',
'content': 'Invalid. Fix this error and resend JSON only: ' + err})
raise ValueError('repair budget exhausted')Erros específicos são melhores que erros genéricos
A qualidade do reparo depende da precisão do retorno. 'JSON inválido' ajuda pouco; 'O campo de avaliação deve ser um número inteiro entre 1 e 5, mas recebeu 7' quase sempre corrige o problema em uma única interação.
Envie ao modelo a mensagem exata de erro do seu validador (caminho e motivo).
def validate(obj, schema):
v = jsonschema.Draft202012Validator(schema)
errs = sorted(v.iter_errors(obj), key=lambda e: e.path)
if not errs:
return True, None
msg = '; '.join(f"{list(e.path)}: {e.message}" for e in errs)
return False, msgValidação em camadas
A validação tem níveis; verifique primeiro o mais barato:
- Sintática — pode ser analisada como JSON?
- Estrutural — corresponde ao esquema?
- Semântica — os valores satisfazem as regras de negócio e os invariantes entre campos?
Um desconto não pode exceder o subtotal, mesmo que ambos sejam números válidos; essa é uma verificação semântica.
def semantic_ok(o):
return o['discount'] <= o['subtotal'] and o['total'] == o['subtotal'] - o['discount']Pré-reparo determinístico
Antes de gastar com uma chamada ao modelo, tente correções determinísticas e baratas para defeitos comuns:
- Remova os delimitadores de código Markdown.
- Extraia o objeto JSON mais externo do texto ao redor.
- Remova vírgulas finais.
Só recorra ao reparo pelo modelo se a limpeza determinística falhar.
def extract_json(text):
text = text.strip().removeprefix('json').strip()
start, end = text.find('{'), text.rfind('}')
if start != -1 and end != -1:
return text[start:end + 1]
return textComo lidar com truncamento
Se finish_reason == 'length', o JSON foi cortado; reparar o fragmento é inútil. Em vez disso, aumente max_tokens, reduza o conteúdo solicitado ou transmita a resposta e solicite uma continuação. Diferencie o truncamento de uma saída malformada, pois eles exigem respostas opostas.
if resp.choices[0].finish_reason == 'length':
# do NOT feed truncated JSON back; regenerate with more room
return retry_with(max_tokens=resp_max * 2)Limite o ciclo
O reparo sem limite representa um risco de custo e latência, e um modelo travado pode entrar em um ciclo infinito. Sempre limite o número de tentativas, adicione um orçamento por solicitação e defina uma alternativa (degrade graciosamente, coloque em uma fila para revisão humana ou retorne um valor padrão seguro).
try:
data = generate_valid(prompt, schema, max_tries=3)
except ValueError:
log_for_review(prompt)
data = SAFE_DEFAULTReparo dentro de chamadas de ferramentas
Em chamadas de funções, o canal de reparo é o resultado da ferramenta. Retorne um erro estruturado e o modelo se corrigirá na interação seguinte, sem necessidade de um ciclo separado.
msgs.append({'role': 'tool', 'tool_call_id': call.id,
'content': json.dumps({'error': 'amount must be positive', 'got': args['amount']})})
# next model turn will re-issue the call with a corrected argumentIdempotência e efeitos colaterais
Quando um ciclo de reparo envolve uma ação (e não apenas geração), garanta que as novas tentativas sejam idempotentes. Use chaves de idempotência para que uma chamada repetida não faça uma cobrança duplicada nem duplique um registro. Valide antes de confirmar efeitos colaterais, nunca depois.
Monitore as taxas de reparo
A taxa de reparo é um indicador antecipado de qualidade. Uma taxa crescente significa uma regressão nas instruções, um esquema rígido demais ou uma deriva do modelo. Registre o número de tentativas por sucesso e os principais caminhos de erro, e envie um alerta quando esses valores aumentarem muito.
metrics.histogram('llm.repair.attempts', tries)
metrics.increment('llm.repair.error', tags={'path': top_error_path})Combine restrições com reparo
O fluxo mais robusto combina várias camadas de proteção: decodificação restrita ou modo de esquema estrito para minimizar falhas, limpeza determinística para correções baratas e um ciclo limitado de reparo pelo modelo para os poucos problemas restantes. Nenhuma camada isolada é suficiente.
Verificação rápida
A API retorna o motivo de finalização length com um JSON cortado. Qual é a resposta correta?
Recapitulação
Fluxos de reparo robustos:
- Valide em níveis: sintático, estrutural e semântico.
- Envie ao modelo erros precisos no nível do caminho.
- Tente a limpeza determinística antes de pagar por uma chamada ao modelo.
- Detecte o truncamento separadamente e gere novamente.
- Limite as tentativas, garanta a idempotência e monitore as taxas de reparo.
Você concluiu a geração estruturada. Próximo curso: barreiras de proteção e validação da saída.
Aprenda AI Prompt Engineering com um tutor de IA — grátis
Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.
- Cursos
- 53
- Aulas
- 199
Perguntas Frequentes
A aula “Ciclos de correção e validação” é grátis?
Sim — o texto completo de “Ciclos de correção e validação” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de AI Prompt Engineering, atualize para CoddyKit PRO. O curso de AI Prompt Engineering inclui 4 aulas no total.
O que vou aprender em “Ciclos de correção e validação”?
Corrija saídas malformadas. Você pratica AI Prompt Engineering com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar AI Prompt Engineering?
Nenhuma experiência prévia é necessária. AI Prompt Engineering no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Ciclos de correção e validação”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de AI Prompt Engineering?
Sim. Cada aula de AI Prompt Engineering inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Por que usar saída estruturada
- Esquema JSON em solicitações
- Esquemas de ferramentas e funções
- Ciclos de correção e validação