RLM 2027 · Capítulo 16 de 24 · 14 min
Impedir que o erro de uma folha chegue à resposta final
Decidir onde verificar cada leitura, como agregar sem esconder contradição e quando uma pergunta precisa de revisão humana antes de sair.
Este capítulo faz parte do curso gratuito RLM 2027. Para marcar como concluído e salvar o progresso, abra este capítulo na página do curso.
Com as instruções plantadas contidas, sobra o erro que ninguém plantou por maldade. Um laudo registra o parâmetro em miligramas por litro quando o método mede microgramas. Uma data de coleta sai do reconhecimento de texto com o ano trocado. Duas versões da mesma condicionante trazem prazos diferentes. Numa árvore de chamadas, cada um desses defeitos nasce numa folha e sobe até o raiz como se fosse fato.
Não conter esse erro custa uma resposta errada com tom de certeza. O modelo raiz não vê o documento, só o valor que a subchamada devolveu; se a folha errou, o raiz agrega o erro com a mesma confiança dos acertos, e Helena assina o relatório. Para um cliente com licença de operação em jogo, uma condicionante dada como cumprida sem estar é o pior erro possível do sistema.
Ao terminar, você conhece os caminhos por onde o erro sobe numa execução recursiva, sabe onde pôr cada verificação (na folha, na agregação e no raiz) e decide o que a resposta faz quando as partes discordam. O caso mostra quanto essas travas custam e quanto seguram, medido com falhas inseridas de propósito numa cópia do acervo.
Por onde o erro sobe numa árvore de chamadas
Leitura errada na folha é o primeiro caminho. Folha: a subchamada que lê um pedaço do material e não chama mais ninguém, como o estagiário que confere um único laudo. Ela devolve um valor curto, e o raiz, que não viu o documento, não tem como saber se o valor bate com o texto. O desenho que poupa o contexto do raiz é o mesmo que o deixa cego para o erro da folha.
Código com defeito é o segundo. O raiz escreve Python, e um defeito produz variável vazia, lista cortada ou contagem errada sem que nada quebre. Com sub-RLMs, o problema se multiplica: no artigo de Zhang, Kraska e Khattab, o Qwen3-Coder caiu no OOLONG de 48,0 na profundidade 1 para 26,0 na profundidade 2, e os autores atribuem a queda a erros de sintaxe que se propagam para os sub-RLMs. No CodeQA, o mesmo modelo acertou mais sem subchamadas (66,0) do que com qualquer profundidade.
Confundir plano com resposta vem em terceiro. Os autores relatam que distinguir a resposta final do pensamento é frágil: às vezes o modelo entrega o plano como se fosse o resultado. No artigo, a execução termina com FINAL ou FINAL_VAR; no DSPy, com SUBMIT; na biblioteca rlms 0.1.3, quando o código grava a resposta em answer["content"] e marca answer["ready"] = True. Quando o modelo chama o encerramento cedo demais, a resposta sai bem formatada e incompleta, e nada no texto avisa que faltou metade da exploração.
Pensar demais é o quarto caminho. A reprodução de Daren Wang, com 20 amostras por condição e execução única, viu o S-NIAH cair de 100% na base para 85% com RLM de profundidade 1 e 70% com profundidade 2 no DeepSeek v3.2. O Kimi K2 foi de 86,6% no OOLONG para 60,0% e 55,0%. O autor descreve colapso de formato e explosão de latência e de tokens quando a profundidade cresce.
Quando a recursão piora o resultado: números publicados
48,0 → 26,0
Qwen3-Coder no OOLONG, profundidade 1 para 2
Artigo do RLM v3; erros de sintaxe propagados
100% → 70%
DeepSeek v3.2 no S-NIAH, base para profundidade 2
Reprodução com 20 amostras por condição
86,6% → 55,0%
Kimi K2 no OOLONG, base para profundidade 2
Mesma reprodução, contextos de até 65 mil tokens
26,0 → 5,6
GPT-5.2 em MATH do LongCoT-mini, sem dicas
Modelo base contra RLM de profundidade 1
Fonte: Zhang, Kraska e Khattab, arXiv 2512.24601 v3 (maio de 2026); Wang, arXiv 2603.02615 (março de 2026)
Resta o quinto caminho, o teto. Quando a execução para em max_iters, a extração de fallback monta uma resposta com o que houver nas variáveis, e essa resposta não diz que está incompleta. O SRLM, da Apple, acrescenta uma observação incômoda: dentro da janela nativa do modelo, o RLM com recursão muitas vezes degrada em relação à base, e os autores concluem que a recursão em si não é o principal motor do desempenho.
Parte desses caminhos vem de modelos que não foram feitos para o papel. Quando os autores do artigo montaram dados de treino a partir de trajetórias do RLM com Qwen3-Coder-480B, 16% dos turnos usavam FINAL de forma errada e 13% usavam FINAL_VAR errado, e foi preciso uma correção programática antes de treinar. Se um modelo desse porte erra o encerramento nessa proporção, o sistema em produção precisa contar com o erro em vez de torcer contra ele.
- Etapa 1 de 5: Documento com defeito
Laudo com a unidade trocada, esquecido no acervo há anos
- Etapa 2 de 5: Folha lê e devolve um valor
Arsênio 12 mg/L, sem o trecho que o sustenta
- Etapa 3 de 5: Código do raiz agrega
Compara com o limite da condicionante; o defeito vira uma linha da contagem
- Etapa 4 de 5: Raiz encerra com SUBMIT
Resposta limpa, sem sinal de qual valor veio de onde
- Etapa 5 de 5: Relatório ao cliente
Condicionante dada como descumprida pelo motivo errado
A reação instintiva é acrescentar mais uma camada de modelo para revisar. Armadilha comum: subir a profundidade ou pôr um segundo modelo para conferir o resultado final, que também não vê os documentos. O revisor lê a mesma resposta limpa que o raiz produziu e herda a mesma cegueira. A tabela do artigo mostra que profundidade extra não melhora de forma consistente e, no Qwen3-Coder, piora.
Onde verificar e o que fazer quando as partes discordam
Uma regra organiza a contenção: cada nível só aceita do nível de baixo o que puder conferir. Na folha, isso significa devolver o valor junto com o identificador do documento e o trecho literal que o sustenta. Na agregação, significa contar e comparar com código determinístico, sem pedir a um modelo que some. No raiz, significa entregar a resposta com a lista de evidências, que o processo hospedeiro confere antes de liberar.
Contradição é informação, e o sistema não deve resolvê-la sozinho. Quando dois laudos do mesmo ponto de coleta e da mesma data trazem valores incompatíveis, a resposta certa para Helena mostra os dois, com os documentos, e marca a pergunta como “laudos contraditórios”, exatamente o que a pergunta de negócio da Veredas pede. Pedir ao modelo que escolha o valor mais provável transforma uma dúvida verificável num número com cara de fato.
Leitura dupla é a trava mais cara e deve entrar só onde decide. Se um valor vai definir que uma condicionante está vencida, uma segunda subchamada lê o mesmo trecho com outro pedido, e o código só aceita o valor quando as duas leituras concordam. Aplicada a tudo, a leitura dupla dobraria o custo das subchamadas; aplicada só aos valores decisivos, custa centavos por pergunta.
Menos código livre também reduz a superfície do erro. O λ-RLM troca o código livre por combinadores prontos (dividir, espiar, mapear, filtrar, reduzir) e deixa o modelo só nas folhas; nos modelos abertos testados, venceu o RLM padrão em 29 de 36 comparações. O RLM padrão ainda ganhou no CodeQA com modelos fortes em código, como o Llama 405B, com 62,1% contra 55,7%. Agregar em código fixo, fora das mãos do modelo, segue a mesma ideia em escala menor.
Cinco modos de falha, onde nascem e o que os contém
| Modo de falha | Onde nasce | Sinal no rastro | Contenção |
|---|---|---|---|
| Leitura errada | Folha | Valor sem trecho que o sustente | Evidência literal conferida por código |
| Código com defeito | Raiz ou sub-RLM | Variável vazia; contagem menor que a do índice | Conferir contagens contra o índice do acervo |
| Plano entregue como resposta | Raiz | SUBMIT cedo, poucas voltas, nenhuma evidência | Exigir lista de evidências na assinatura |
| Pensar demais | Profundidade maior que 1 | Voltas e tokens muito acima da mediana | Profundidade 1 e tetos por execução |
| Resposta de fallback | Teto de voltas | Voltas iguais a max_iters | Marcar como pendente e mandar à revisão |
No processo hospedeiro, a conferência da evidência cabe em poucas linhas. Ela não julga se o valor está certo, só se o trecho citado existe no documento indicado. Parece pouco, e segura dois modos de falha de uma vez: a leitura inventada e o plano entregue como resposta, que chega sem evidência nenhuma.
import re
def _normal(s: str) -> str:
# Ignora espaços repetidos e caixa, que a conversão de PDF costuma bagunçar.
return re.sub(r"\s+", " ", s).strip().lower()
def conferir_evidencias(pred) -> dict:
"""Confere, fora do modelo, se cada trecho citado existe no documento indicado."""
falhas = []
for item in pred.evidencias:
doc_id, _, trecho = item.partition(" | ")
texto = ACERVO.texto(doc_id.strip()) or ""
if not trecho or _normal(trecho) not in _normal(texto):
falhas.append(doc_id.strip())
return {
"liberar": bool(pred.evidencias) and not falhas, # sem evidência, não sai
"revisar": falhas,
}Duas formas de lidar com laudos que discordam
Deixar o modelo reconciliar
Coluna a evitar
- Raiz recebe dois valores e escolhe o mais provável
- Resposta sai com um número só
- Documento de origem some da resposta
- Erro de unidade vira fato no relatório
Expor a contradição
Coluna recomendada
- Código compara os valores e detecta a divergência
- Resposta traz os dois valores e os dois documentos
- Pergunta sai marcada como laudos contraditórios
- Helena decide com o trecho de cada laudo na tela
Como a Veredas plantou falhas e mediu o que chegava à resposta
Caio voltou à cópia do acervo e inseriu 20 falhas nos documentos-chave das 30 perguntas de cruzamento que Helena tinha separado. Oito laudos ganharam unidade trocada, de microgramas para miligramas por litro. Seis datas de coleta tiveram o ano alterado, imitando erro de reconhecimento de texto. Seis condicionantes ganharam uma segunda versão, com prazo diferente, em outro documento do mesmo processo. Como alguns documentos eram chave de mais de uma pergunta, as 20 falhas atingiam as 30.
Rodadas com a configuração otimizada e as defesas contra instrução plantada, as 30 perguntas deram um resultado ruim. Em 13, a falha chegou à resposta final sem nenhum sinal: a contagem de condicionantes vencidas mudou, ou um par de laudos contraditórios virou um valor só. Em 9, a resposta ficou certa por acaso, porque a falha estava num documento que o raiz não chegou a usar. Em 8, o modelo notou a divergência e a mencionou, cada vez num formato.
Nem a checagem de evidência da rodada anterior ajudou. Ela confere se o trecho existe, e o trecho existia: estava escrito errado no próprio documento. Essa foi a lição que Helena mais repetiu depois. Verificar a citação prova que o sistema leu o que diz ter lido; a correção do documento fica fora do alcance dessa checagem.
Três travas entraram. A leitura de cada documento passou a devolver valor, unidade, data e trecho literal, e o código de agregação passou a comparar, para cada ponto de coleta, os valores de todas as fontes antes de contar. Diferença de ordem de grandeza entre laudos do mesmo ponto, típica de unidade trocada, prazos diferentes para a mesma condicionante e datas de coleta posteriores ao protocolo do próprio laudo viram a marca de contradição. Os valores que decidem se uma condicionante está vencida passam por leitura dupla.
Com as travas, a falha chegou calada à resposta em 3 das 30 perguntas. Em 9, a pergunta saiu marcada como contraditória, com os dois documentos lado a lado para Helena. As outras 18 ficaram corretas, sem marca. As três que escaparam eram datas alteradas dentro de um intervalo plausível, que nenhuma regra de código distinguia de uma data verdadeira sem outro documento para comparar.
A marca de revisão mudou o trabalho de Helena. Cada pergunta marcada chega com os trechos lado a lado e um campo para a decisão dela, que volta ao acervo como anotação e passa a valer nas próximas perguntas. Em duas semanas de uso interno, as marcas somaram 11 de cada 100 perguntas, e Helena levava cerca de 4 minutos em cada uma. Ela fez a conta: 4 minutos de revisão custam menos que uma condicionante dada como cumprida no relatório errado.
Veredas: 30 perguntas de cruzamento com 20 falhas inseridas
| Desfecho | Sem as travas | Com as travas |
|---|---|---|
| Falha chegou à resposta sem sinal | 13 | 3 |
| Divergência exposta | 8, cada uma num formato | 9, marcadas e com os dois documentos |
| Resposta correta sem marca | 9 | 18 |
| Custo médio por pergunta nas 120 | US$ 0,409 | US$ 0,412 |
| Acertos no conjunto limpo | 93 de 120 | 93 de 120 |
Cenário ilustrativo, numa cópia do acervo: 8 unidades trocadas, 6 datas alteradas e 6 condicionantes duplicadas com prazos diferentes.
Quase nada mudou no custo. A comparação entre fontes e a checagem de datas são código, sem token. A leitura dupla disparou em média 4 vezes por pergunta de cruzamento, no GPT-5-mini, a cerca de US$ 0,0032 cada (8 mil tokens a US$ 0,25 e 600 a US$ 2 por milhão): US$ 0,013 por pergunta de cruzamento. Espalhado pelas 120 perguntas, são US$ 0,003 a mais, e a média foi de US$ 0,409 para US$ 0,412.
Rodado o conjunto limpo das 120 perguntas, a acurácia ficou em 93, e quatro respostas certas passaram a sair com marca de revisão por divergências reais do acervo. Eram dois pares de laudos do mesmo ponto de coleta com valores incompatíveis, que ninguém tinha notado em anos de processo. Helena levou os dois pares ao cliente como achado, e o laboratório reemitiu um dos laudos.
No cenário da Veredas, o erro de folha passou a subir com etiqueta: 3 falhas caladas em 30, contra 13, com o custo médio praticamente igual. Conte, nas 120 execuções do rastro, quantas vezes o raiz escreveu código com erro ou chamou SUBMIT antes de juntar as evidências; o critério é ter esse número por tipo de pergunta antes de discutir se vale treinar um modelo para o papel de raiz.
Seu caderno neste capítulo
Abrir o caderno completoSelecione um trecho do capítulo para destacar ou anotar. No teclado, selecione com Shift e as setas e use Alt+Shift+D para destacar ou Alt+Shift+N para anotar.
Salvo neste navegador. Entre na sua conta para levar o caderno a outros aparelhos.
Entre na sua conta para compartilhar o que aprendeu e convidar alguém para estudar com você.
Voltar ao capítulo anterior: Isolar o código gerado e tratar cada documento como dado
Todos os capítulos de RLM 2027
- 01Descobrir onde o modelo encontra cada informação que usa
- 02Medir o limite real do contexto e dividir o problema
- 03Guardar o acervo numa variável e deixar o modelo programar a leitura
- 04Desenhar a árvore de chamadas e decidir a profundidade
- 05Explorar o acervo antes de decidir onde cortar
- 06Processar as partes e juntar as respostas sem perder a evidência
- 07Comparar contexto longo, RAG e compactação antes de escolher o RLM
- 08Situar agentes, híbridos e RLM numa matriz de decisão
- 09Julgar um benchmark antes de acreditar no número dele
- 10Comparar métodos nas mesmas condições e ler os resultados contrários
- 11Preparar o acervo e rodar a biblioteca oficial rlm
- 12Montar o protótipo com dspy.RLM e auditar o rastro de cada resposta
- 13Decompor o custo de uma execução e pôr teto em cada parte
- 14Baixar o custo por pergunta e vigiar o que a média esconde
- 15Isolar o código gerado e tratar cada documento como dado
- 16Impedir que o erro de uma folha chegue à resposta final
- 17Treinar um modelo pequeno para decidir quando delegar
- 18Provar uma auto-melhoria antes de acreditar nela
- 19Julgar as apostas de recursão aprendida e execução previsível
- 20Mapear híbridos, imagem e trabalho prolongado com evidência e lacuna
- 21Ler 2027 por sinais observáveis em vez de apostar numa previsão
- 22Escolher onde o RLM entra primeiro e decidir o piloto
- 23Definir o problema e construir quatro alternativas comparáveis
- 24Avaliar as alternativas e dizer em quais condições o RLM compensa