Multiagente e Orquestração|INEMA.CLUB-PRO

Aula 4 · 18 min

Gerador × avaliador

O multiagente mais útil tem dois papéis: um faz, outro confere. O gerador sempre diz "pronto"; quem decide é um avaliador separado que olha só o artefato e devolve um parecer. Nesta aula você liga os dois num laço com teto de rodadas, primeiro com um gerador falso que mente e depois com o Claude de verdade.

Começar a aula
Impressora 3D com uma peça recém-impressa e, em frente, uma bancada de medição conferindo uma peça igual.

Nesta aula você vai

  1. 1Por que o avaliador é outro processo, não outro parágrafo do prompt
  2. 2O verificar.mjs do kit como avaliador por código
  3. 3O parecer que volta ao gerador e o teto de rodadas
  4. 4O time de três papéis numa sessão

Objetivo: ligar um gerador a um avaliador separado que só olha o artefato e devolve parecer, com teto de rodadas.

01O laço gerador × avaliador

O gerador nunca dá a própria nota. Clique em cada etapa.

Clique em cada bloco do diagrama para ver o que ele faz.

Concordância entre dois modelos não é prova independente: eles podem dividir a mesma suposição errada. Critério por código vem primeiro.

02O laço em 25 linhas

O avaliador é o verificar.mjs do projeto de treino; o gerador é qualquer comando que lê o pedido no stdin.

gera-avalia.sh · salve em ~/treino-multi/
#!/usr/bin/env bash
# gera-avalia.sh — o gerador faz; o avaliador (outro processo, só o artefato) confere; até MAX rodadas.
# Uso: gera-avalia.sh <goal.md> "<pedido>"
#   GERADOR = comando que lê pedido + parecer no stdin (padrão: claude -p --permission-mode acceptEdits)
#   o avaliador é o verificar.mjs do kit: roda cada critério `comando` → `saída esperada`
set -u
GOAL="${1:?uso: gera-avalia.sh <goal.md> \"<pedido>\"}"; PEDIDO="${2:?pedido}"
GERADOR="${GERADOR:-claude -p --permission-mode acceptEdits}"; MAX="${MAX:-3}"; parecer=""
mkdir -p .gera-avalia
for r in $(seq 1 "$MAX"); do
  printf '%s\n%s\n' "$PEDIDO" "$parecer" | timeout 600 $GERADOR > .gera-avalia/gerador-$r.log 2>&1
  rc=$?
  if [ $rc -ne 0 ]; then   # gerador caiu ou estourou o teto: não avalia sobra de rodada anterior
    echo "rodada $r · gerador falhou (rc=$rc) → REPROVADO"; parecer="A rodada anterior falhou (rc=$rc)."; continue
  fi
  echo "rodada $r · gerador diz: $(tail -1 .gera-avalia/gerador-$r.log)"
  if node runtime/scripts/verificar.mjs "$GOAL" > .gera-avalia/avaliador-$r.log 2>&1; then
    echo "rodada $r · avaliador: $(tail -1 .gera-avalia/avaliador-$r.log) → APROVADO"; exit 0
  fi
  echo "rodada $r · avaliador: $(tail -1 .gera-avalia/avaliador-$r.log) → REPROVADO"
  parecer="O avaliador reprovou. Trecho do parecer: $(grep -A2 '^FALHA' .gera-avalia/avaliador-$r.log)"
done
echo "PARADO: $MAX rodadas sem aprovação"; exit 2
goal-saudacao.md · os critérios (o gerador não edita)
# Goal — saudação

## Critérios de pronto
- [ ] `cat saudacao.txt` → `Olá, comunidade INEMA`
- [ ] `wc -l < saudacao.txt` → `1`
Terminal · ensaio sem cota (gerador falso que erra e depois corrige)
cd ~/treino-multi && chmod +x gera-avalia.sh && rm -f saudacao.txt
E=${TMPDIR:-/tmp}/ensaio-multi/gera; rm -rf $E && mkdir -p $E
cat > $E/gerador-falso.sh <<'SH'
#!/usr/bin/env bash
entrada=$(cat)
case "$entrada" in
  *reprovou*) echo "Olá, comunidade INEMA" > saudacao.txt ;;   # 2ª vez: leu o parecer
  *) printf 'Olá comunidade INEMA\n\n' > saudacao.txt ;;      # 1ª vez: vírgula e linha a mais
esac
echo "Pronto! saudacao.txt criado conforme pedido."
SH
chmod +x $E/gerador-falso.sh
GERADOR=$E/gerador-falso.sh ./gera-avalia.sh goal-saudacao.md "Crie saudacao.txt com uma linha: Olá, comunidade INEMA"
echo "saída: $?"
Terminal · real, com o Claude como gerador
cd ~/treino-multi && rm -f saudacao.txt
./gera-avalia.sh goal-saudacao.md "Crie saudacao.txt com uma linha: Olá, comunidade INEMA" < /dev/null
echo "saída: $?"; cat saudacao.txt
Exemplo do repositório
## ensaio (gerador falso)
rodada 1 · gerador diz: Pronto! saudacao.txt criado conforme pedido.
rodada 1 · avaliador: 0/2 critérios OK → REPROVADO
rodada 2 · gerador diz: Pronto! saudacao.txt criado conforme pedido.
rodada 2 · avaliador: 2/2 critérios OK → APROVADO
saída: 0

## real (Claude como gerador)
rodada 1 · gerador diz: Terminei: criei o `saudacao.txt`. Conferi o arquivo e ele tem uma linha só: `Olá, comunidade INEMA`. Não fiz commit.
rodada 1 · avaliador: 2/2 critérios OK → APROVADO
saída: 0
Olá, comunidade INEMA

Na rodada 1 do ensaio o gerador disse "pronto" com a vírgula faltando e uma linha a mais; o avaliador reprovou os dois critérios. Os títulos com ## separam as duas execuções.

03Dentro da sessão: o time de três papéis

A receita R2 do projeto de treino faz o mesmo laço com subagentes.

1. planejador

Devolve até 5 passos e os critérios no formato comando → saída esperada, mais os riscos que pedem confirmação.

No kit, roda num nível topo; ferramentas Read, Grep, Glob.

04Prática

O ensaio prova o laço; a rodada real prova que ele funciona com um modelo.

E7 · O laço com gerador falso

10 min

Salve gera-avalia.sh e goal-saudacao.md e rode o ensaio. Depois troque o gerador falso por um que nunca corrige.

Pronto quando: o ensaio termina em rodada 2 · avaliador: 2/2 critérios OK → APROVADO e saída: 0; o teimoso termina em PARADO: 3 rodadas sem aprovação e saída: 2.

E8 · O laço com o Claude

10 min

Antes, faça commit do goal (git add goal-saudacao.md && git commit -qm goal), para o git acusar se ele mudar. Rode a versão real. Depois escreva um goal seu, com 2 ou 3 critérios, para uma tarefa pequena do seu projeto, e rode de novo.

Pronto quando: as duas rodadas terminam com → APROVADO e saída: 0 em até 3 rodadas, e git diff --exit-code -- goal-saudacao.md → código 0 (o gerador não mexeu nos critérios).

05Teste da aula

Pergunta 1 de 4

O gerador escreveu "Pronto! criado conforme pedido". O que isso decide?competência

06Em três frases

Dois papéisUm faz, outro confere, em processos separados; o gerador nunca dá a própria nota.
Artefato e parecerO avaliador lê o que ficou em disco e devolve o trecho que falhou ao gerador.
Teto e falhaMAX rodadas e para com 2; rodada com gerador caído é reprovada sem avaliar.

Para ir além

Aula anteriorPróxima aula