Objetivo: ao final, o consultor reconhece os cinco padrões clássicos, sabe qual problema de projeto cada um resolve, e adota a regra de começar simples.
| Padrão | Quando | Caso no Meridiano |
|---|---|---|
| Encadeamento | Etapas naturais e você quer inspecionar o meio | Rascunhar FS → revisar contra a spec → corrigir |
| Roteamento | Entradas de dificuldade muito diferente | Chamado simples → Haiku 4.5; complexo → Opus 5 |
| Paralelização (fatiamento) | Itens independentes | Analisar os 34 RICEFW ao mesmo tempo |
| Paralelização (votação) | Uma passagem só perde coisa | Três leituras de risco da mesma FS, agregadas |
| Orquestrador-trabalhadores | Subtarefas descobertas na execução | "Levantar impacto desta mudança" — os objetos afetados só aparecem investigando |
| Avaliador-otimizador | Critério de qualidade escrevível | Gerar cenário de teste → checar cobertura → completar |
def rotear(chamado: str) -> str:
triagem = client.messages.create(
model="claude-haiku-4-5", # barato: 1 dólar por milhão de entrada
max_tokens=16,
system="Responda apenas SIMPLES ou COMPLEXO.",
messages=[{"role": "user", "content": chamado}],
)
nivel = next(b.text for b in triagem.content if b.type == "text").strip()
modelo = "claude-haiku-4-5" if nivel == "SIMPLES" else "claude-opus-5"
return responder(chamado, modelo=modelo)
A economia depende inteiramente da proporção. Se 70% dos chamados são simples, 70% do volume roda a um quinto do preço de entrada, e a triagem custa quase nada. Se a proporção for outra, o padrão pode não pagar — e descobrir isso é medição, não intuição: você já tem o dataset do módulo 3.6.3 para responder.
Um cuidado: o roteador é ele mesmo um classificador, e classificador erra. Rotear um chamado complexo para o modelo barato produz resposta ruim, e sua avaliação precisa medir o fluxo inteiro, não cada modelo em separado.
import asyncio
from anthropic import AsyncAnthropic
aclient = AsyncAnthropic()
async def analisar(ricefw):
r = await aclient.messages.create(
model="claude-opus-5",
max_tokens=4000,
messages=[{"role": "user", "content": f"Analise o risco de: {ricefw}"}],
)
return next(b.text for b in r.content if b.type == "text")
async def analisar_todos(lista):
return await asyncio.gather(*(analisar(r) for r in lista))
Duas formas, com propósitos diferentes:
| Paralelização | Orquestrador-trabalhadores | |
|---|---|---|
| Subtarefas | Conhecidas ao escrever o código | Criadas em tempo de execução |
| Número de chamadas | Previsível | Variável |
| Custo | Estimável | Não |
| Exemplo | "Analise cada um dos 34 RICEFW" | "Levante o impacto desta mudança" |
Se você sabe as subtarefas na hora de escrever, use paralelização — é mais simples, mais barata e o custo é estimável. O orquestrador só se justifica quando a decomposição depende da entrada.
def gerar_com_revisao(spec, max_rodadas=3):
saida = gerar(spec)
for _ in range(max_rodadas):
nota, criticas = avaliar(saida, RUBRICA) # a rubrica do módulo 3.6.4
if nota >= 4:
return saida, nota
saida = corrigir(saida, criticas)
return saida, nota # devolve o melhor obtido, com a nota
Três detalhes que fazem esse padrão funcionar em produção:
nota >= 4 é.E a ligação com o módulo 3.6 é literal: RUBRICA é o mesmo texto do grader da aula 3.6.4. Escrever a rubrica uma vez serve para duas coisas — medir a qualidade e corrigi-la dentro do laço.
Regra Wayon Todo padrão com laço — avaliador-otimizador, orquestrador — roda com teto de iterações e teto de gasto por execução, declarados no código, não no combinado. E antes de subir de padrão, é preciso mostrar com a avaliação do módulo 3.6 que a versão mais simples não atende. Complexidade de orquestração é custo de sustentação que a Wayon paga por anos.
📖 Building effective agents · Graders — aula 3.6.4
Paralelização reduz tempo de parede, não o número de tokens — o custo total é praticamente o mesmo.
Correto, e é justamente o padrão menos usado apesar do retorno.
Mais passos costumam significar mais chamadas, não menos custo.
Correto. Custo estimável e desenho mais simples que o orquestrador.
Quantidade não é o critério: o critério é se as subtarefas são conhecidas antes da execução.
Encadeamento serializa análises independentes sem necessidade.
max_tokens da chamada, que esgota e interrompe o laçomax_tokens limita uma resposta, não o número de iterações.
Não há garantia de convergência — pode oscilar sem atingir o critério.
Correto. "Até ficar bom" não é critério; o teto e a nota-alvo são.
Mais granular não é mais correto aqui — o que vai ao usuário é o resultado do fluxo.
Correto. Um chamado complexo mandado para o modelo barato é falha do sistema, não de nenhum dos dois modelos.
Podem, e frequentemente devem — mas isso não substitui avaliar o fluxo.
Correto. Cada padrão acrescenta chamadas, latência e pontos de falha.
Quantidade sugere paralelização, mas não decide entre os cinco.
Flexibilidade cobra custo variável e depuração difícil; não é ponto de partida.