Pular para o conteúdo
15/30Capítulo 15 de 30

Prompt Engineering, medido: o que muda a saída

Sessenta tickets, as mesmas palavras em seis ordens e acurácia de 26,7% a 85,0%. Quatro truques da internet, com barras de erro.

Nesta página

Aqui está um ticket de suporte, e quatro filas para onde ele poderia ir.

TEXT
The label on the parcel has my old surname on it.
    -> billing / technical / shipping / account

Para roteá-lo, você precisa de três coisas no prompt: as definições das filas, o ticket e a instrução para escolher uma. Três blocos. Há seis ordens em que você pode colocá-los, e os blocos contêm exatamente os mesmos caracteres nas seis.

Em sessenta tickets com respostas conhecidas, as seis ordens pontuam entre 26,7 % e 55,0 %. Mova os mesmos dois blocos para fora da vez do usuário e para dentro da vez do sistema, sem mudar nenhuma palavra, e o mesmo modelo pontua 76,7 %. Envolva o ticket em uma tag no estilo XML e ele chega a 85,0 %.

Nada no modelo mudou. Nada na tarefa mudou. Nem uma palavra foi reescrita. Uma variação de cinquenta e oito pontos saiu da organização do mesmo texto.

Essa é a razão de este capítulo existir, e também é a razão de ele ser o assunto mais infestado por cultos de carga da área. Os efeitos são reais e grandes, o que faz toda anedota parecer confirmada; e são instáveis entre modelos e tarefas, o que significa que uma anedota é tudo o que a maior parte dos conselhos realmente é. Então este capítulo tem uma regra, e tudo nele está subordinado a essa regra:

Um prompt é medido, não debatido. Quatro variantes em vinte casos não distinguem nada.

Antes das medições, um fato que explica discretamente metade do que vem a seguir.

O modelo não tem memória. Entre duas chamadas, ele não retém nada — nem sua última pergunta, nem sua própria última resposta, nem o arquivo que você anexou, nem o fato de que você já perguntou duas vezes. Toda chamada começa em uma máquina vazia, e a única coisa que essa máquina sabe é a sequência de tokens que você acabou de entregar a ela.

O que parece memória em uma interface de chat é seu cliente reenviando a conversa inteira, cada turno, desde o início. O modelo lê tudo de novo do zero, toda vez. O Capítulo 13 mediu o custo dessa releitura em um forward pass; o Capítulo 16 transforma isso em uma linha na fatura. O que importa aqui é a consequência para o design: o prompt não é uma mensagem para um sistema que tem estado. Ele é o estado.

Isso aposenta uma família de confusões. “O modelo esqueceu o que eu disse” geralmente significa que aquilo nunca foi enviado. “Ele ignorou minha instrução anterior” geralmente significa que a instrução caiu fora da janela quando o histórico foi truncado. “Ele se comportou diferente em produção” geralmente significa que a produção monta um prompt diferente daquele que você testou. Nenhum desses é um problema do modelo, e nenhum se resolve reescrevendo qualquer coisa.

A afirmação “este prompt é melhor” é uma afirmação sobre uma distribuição, e você não consegue ver uma distribuição olhando para uma saída. O que você precisa é chato: casos com respostas conhecidas, N variantes e um intervalo.

O harness tem cinquenta linhas de TypeScript com o mesmo formato do cliente do Capítulo 14 — uma requisição, um prazo, alguma concorrência, uma contagem. Ele reaparece no Capítulo 19 para avaliar um retriever e no Capítulo 29 como golden set.

bench.tsTS
export type Case = { input: string; expected: string };
export type Variant = { name: string; build: (c: Case) => ChatMessage[] };

async function pooled<T, R>(xs: T[], n: number, f: (x: T) => Promise<R>) {
  const out: R[] = new Array(xs.length);
  let i = 0;
  await Promise.all(
    Array.from({ length: n }, async () => {
      while (i < xs.length) {
        const k = i++;
        out[k] = await f(xs[k]);
      }
    }),
  );
  return out;
}

export async function runVariant(v: Variant, cases: Case[], concurrency = 6) {
  const hits = await pooled(cases, concurrency, async (c) => {
    const answer = await complete(v.build(c));      
    return answer.trim().toLowerCase() === c.expected;
  });
  return { name: v.name, hits, k: hits.filter(Boolean).length, n: cases.length };
}

O número que volta não é o resultado. Isto é:

stats.tsTS
/** 95 % Wilson score interval for a proportion. Chapter 4 derives it. */
export function wilson(k: number, n: number, z = 1.96) {
  const p = k / n;
  const d = 1 + (z * z) / n;
  const centre = (p + (z * z) / (2 * n)) / d;
  const half = (z * Math.sqrt((p * (1 - p)) / n + (z * z) / (4 * n * n))) / d;
  return [Math.max(0, centre - half), Math.min(1, centre + half)] as const;
}

O Capítulo 4 apresentou o argumento e este capítulo o desconta. Dezessete acertos em vinte são 85 %, e seu intervalo de 95 % vai de 64 % a 95 %. Uma variante que pontua 13 em 20 — 65 %, o que parece claramente pior — tem um intervalo de 43 % a 82 %. Esses dois intervalos se sobrepõem por quase toda a sua extensão. Vinte casos não conseguem diferenciar um bom prompt de um mediano, e a maior parte dos conselhos publicados sobre prompt foi validada com menos.

Sessenta casos, que é o que este capítulo usa, ainda não é muito. É o bastante para ver efeitos grandes e honesto o bastante para admitir quando não consegue ver os pequenos — e ele vai admitir isso várias vezes abaixo.

Três blocos — as regras R, o ticket T, a instrução I — concatenados em uma única mensagem do usuário. Todas as seis permutações, conteúdo idêntico byte a byte, sessenta casos cada.

ordem dos três blocoscorretosacurácia, Wilson 95 %
regras, instrução, ticket33/6055,0 % [42,5, 66,9]
regras, ticket, instrução30/6050,0 % [37,7, 62,3]
ticket, regras, instrução22/6036,7 % [25,6, 49,3]
instrução, ticket, regras21/6035,0 % [24,2, 47,6]
instrução, regras, ticket17/6028,3 % [18,5, 40,8]
ticket, instrução, regras16/6026,7 % [17,1, 39,0]

Do melhor ao pior são 28,3 pontos, e os intervalos não se sobrepõem, então esta não é uma história sobre ruído. Como cada braço é pontuado nos mesmos sessenta itens, a pergunta mais precisa é a pareada: nos casos em que dois braços discordam, quão desequilibrada é a divisão? Passar da pior ordem para a melhor virou 21 casos para certo e 4 para errado — probabilidade pareada exata de 0,0009.3

Leia a tabela pelo seu formato, não pelo vencedor. As duas melhores linhas terminam com o ticket; as duas piores enterram a instrução no meio ou a deixam atrás dos dados. Esse é o mesmo fenômeno que Liu et al. chamaram de Lost in the Middle: material nas bordas de um prompt é usado com mais confiabilidade do que material no centro.4 O Capítulo 16 precifica a janela e o Capítulo 24 mede o efeito corretamente em comprimento, onde o meio colapsa como descrito e a recuperação no fim extremo não reaparece. Aqui, a regra prática surge sozinha: tarefa no topo, dados no final, nada importante no meio.

Agora mova as mesmas palavras entre turnos. O Capítulo 11 estabeleceu que o chat template não é uma decoração em volta do modelo, mas parte dele — <|im_start|>system e <|im_start|>user são tokens reais que o modelo viu milhões de vezes durante o fine-tuning, exatamente nessas posições. Então deve importar de que lado desses marcadores sua instrução cai, e importa:

onde as mesmas palavras ficamcorretosacurácia, Wilson 95 %
regras e instrução na vez do sistema, ticket sozinho na vez do usuário46/6076,7 % [64,6, 85,6]
regras na vez do sistema, instrução e ticket na vez do usuário44/6073,3 % [61,0, 82,9]
regras e instrução na vez do sistema, instrução repetida depois do ticket42/6070,0 % [57,5, 80,1]
os três blocos em uma única vez do usuário33/6055,0 % [42,5, 66,9]

Mover as regras e a instrução através da fronteira do template comprou 21,7 pontos — 19 casos ganhos, 6 perdidos, probabilidade pareada 0,0146 — sem mudar um caractere delas. Esta é a resposta concreta para system prompt versus user prompt: eles não são duas maneiras de dizer a mesma coisa. São duas posições de token diferentes em uma estrutura na qual o modelo foi treinado, e a posição de sistema é onde pertencem as instruções que se aplicam à conversa inteira.

Observe também a terceira linha. Repetir a instrução depois do ticket — um truque amplamente recomendado — pontuou abaixo de declará-la uma vez. Neste modelo, nesta tarefa, dizer duas vezes foi pior do que dizer uma.

Delimitadores, e a lição estatística escondida neles

Link para a seção: Delimitadores, e a lição estatística escondida neles

Mesmo prompt, melhor posicionamento, sessenta casos. A única coisa que muda é o que envolve o texto do ticket.

como o ticket é delimitadocorretosacurácia, Wilson 95 %
uma tag no estilo XML51/6085,0 % [73,9, 91,9]
nada48/6080,0 % [68,2, 88,2]
um cabeçalho Markdown47/6078,3 % [66,4, 86,9]
um rótulo, Ticket:46/6076,7 % [64,6, 85,6]
cercas com hash45/6075,0 % [62,8, 84,2]
triple backticks44/6073,3 % [61,0, 82,9]
aspas duplas40/6066,7 % [54,1, 77,3]

Uma dispersão de dezoito pontos causada por pontuação. Mas olhe os dois intervalos extremos: [73,9, 91,9] e [54,1, 77,3]. Eles se sobrepõem. Pela leitura grosseira — compare as barras de erro, e se elas se tocarem, não diga nada — esta tabela não prova nada.

A leitura grosseira está errada aqui, e entender por quê vale mais do que a tabela. Toda variante foi pontuada nos mesmos sessenta tickets, então as duas medições não são amostras independentes; elas são pareadas. A maior parte da largura de cada intervalo vem de uma fonte de incerteza que os dois braços compartilham — se estes sessenta tickets são representativos — e essa fonte se cancela quando você os compara entre si. Faça a pergunta pareada em vez disso e a resposta fica nítida: passar das aspas duplas para a tag XML virou 12 casos para certo e 1 para errado, probabilidade pareada 0,0034. Essa é uma diferença real.

E então o mesmo teste esvazia a manchete. A tag XML venceu o rótulo simples Ticket: por 8,3 pontos, que é o número que um post de blog colocaria no título. Pareado: 6 ganhos, 1 perdido, probabilidade 0,1250. Não estabelecido. Sete casos é o que sustenta aquela melhoria famosa.

Então há duas perguntas com dois instrumentos diferentes, e confundi-las é como conselhos sobre prompt dão errado nas duas direções ao mesmo tempo:

Quão bom é este prompt? O intervalo de Wilson sobre sua própria acurácia. Amplo, a menos que você tenha centenas de casos. Este é o número que você reporta a alguém decidindo se deve lançar.

B é melhor que A? O teste pareado sobre os casos em que eles discordam. Muito mais sensível, porque a dificuldade compartilhada do conjunto se cancela. Este é o número que você usa para decidir entre dois candidatos.

A constatação geral — de que modelos são forte e imprevisivelmente sensíveis a escolhas de formatação sem conteúdo semântico — não é nova. Sclar et al. variaram nada além de separadores, espaçamento e caixa em dezenas de tarefas e encontraram dispersões de acurácia amplas o bastante para inverter rankings publicados de modelos.5 A consequência prática não é “use tags XML”. É que formatação é um hyperparameter, não custa nada varrer, e qualquer comparação de dois modelos que fixa um formato está comparando formatos tanto quanto modelos.

In-context learning — mostrar ao modelo exemplos resolvidos no prompt e fazê-lo generalizar a partir deles sem nenhuma atualização de weights — é a capacidade que tornou o GPT-3 famoso.6 A pergunta prática nunca é se funciona. É por quantos exemplos vale a pena pagar.

Os exemplos entram como turnos anteriores reais, alternando usuário e assistant, porque essa é a estrutura na qual o template foi treinado. Cada k foi executado com cinco sorteios aleatórios diferentes de um pool separado de dezesseis tickets rotulados:

exemplosacurácia médiapior e melhor sorteiodispersão entre sorteios
076,7 %
178,7 %78,3 – 80,0 %1,7 pontos
283,7 %80,0 – 86,7 %6,7 pontos
481,7 %78,3 – 86,7 %8,3 pontos
883,7 %78,3 – 88,3 %10,0 pontos
1689,3 %85,0 – 93,3 %8,3 pontos

Dois exemplos compraram sete pontos. Os seis exemplos seguintes não compraram nada mensurável — 83,7, depois 81,7, depois 83,7, uma sequência que vagueia dentro do próprio ruído. Dezesseis compraram mais cinco e meio. A curva não é uma subida suave; é um degrau, um platô e um degrau.

A coluna que mais importa é a última. Em k = 8, quais oito exemplos você por acaso escolheu moveram a acurácia em 10 pontos — mais do que todo o ganho de passar de dois exemplos para oito. E a linha de baixo é a versão mais nítida disso: em k = 16 o pool se esgota, então todas as cinco execuções contêm exatamente os mesmos dezesseis exemplos, diferindo apenas na ordem em que aparecem. Só a ordem moveu a acurácia em 8,3 pontos.

Esse é o resultado que Lu et al. relataram e ele sobrevive em todo lugar onde foi procurado: a ordenação dos exemplos é um hyperparameter genuíno, com efeitos comparáveis à quantidade de exemplos.7 Então o conselho honesto sobre few-shot prompting não é um número. É:

Comece em zero e adicione exemplos só contra uma medição

Link para a seção: Comece em zero e adicione exemplos só contra uma medição

Os dois primeiros geralmente valem a pena. Além disso, você está chutando, e o chute custa tokens em cada chamada pelo resto da vida do produto.

Dois exemplos bem escolhidos vencem oito escolhidos sem cuidado. Se seus exemplos vieram do topo de uma planilha, essa é a variável a varrer antes de adicionar mais.

É grátis, é um efeito real e, diferentemente da maior parte deste capítulo, não exige reescrita para testar.

Quatro exemplos que são todos do mesmo rótulo ensinam o modelo o rótulo, não a tarefa. O colapso deste modelo para qualquer fila listada por último é a mesma falha com outra roupa.

Agora o folclore. Cada uma destas é uma única frase acrescentada ao início de um system prompt que, no resto, é idêntico, nos mesmos sessenta casos.

frase adicionada ao system promptcorretosacurácia, Wilson 95 %pareado contra baseline
nada adicionado46/6076,7 % [64,6, 85,6]
“Respire fundo e trabalhe neste problema com cuidado.”47/6078,3 % [66,4, 86,9]+4 / −3, p = 1,000
“Isso é muito importante para minha carreira.”46/6076,7 % [64,6, 85,6]+5 / −5, p = 1,000
“Você é um especialista de classe mundial em operações de suporte ao cliente, com vinte anos de experiência.”42/6070,0 % [57,5, 80,1]+3 / −7, p = 0,344
“Vou te dar uma gorjeta de $200 se você responder corretamente.”41/6068,3 % [55,8, 78,7]+1 / −6, p = 0,125
“Você será penalizado por cada ticket que enviar para a fila errada.”25/6041,7 % [30,1, 54,3]+3 / −24, p < 0,001

Quatro das cinco não fizeram nada. Não “fizeram um pouco”; nada que sessenta casos pareados consigam ver. A persona especialista e o suborno pontuaram abaixo do baseline intocado, e mesmo essas quedas falham no teste pareado — são ruído apontando ladeira abaixo.

A terceira linha é aquela para observar com calma. “Isso é muito importante para minha carreira” produziu exatamente a mesma acurácia, 46 de 60 — e dez das sessenta respostas mudaram, cinco em cada direção. A estatística resumida foi idêntica e o comportamento não. Se sua avaliação é um único número sobre um conjunto pequeno, uma mudança que reescreve um sexto das suas saídas pode parecer uma mudança que não fez nada, e você vai lançá-la acreditando que foi grátis.

E então a ameaça, que é a única frase que mexeu no ponteiro e mexeu 35 pontos para baixo, virando 24 casos de certos para errados. Isso não é artefato de arredondamento; é um comportamento de modelo diferente. A lição não é “nunca ameace um modelo”. É que enquadramento emocional não é inerte. Ele desloca a distribuição, às vezes com força, em uma direção que ninguém consegue prever lendo a frase — exatamente por isso precisa ser medido, não raciocinado.

Uma ressalva que este capítulo deve a você: essas cinco frases foram testadas em um modelo pequeno e uma tarefa. Algumas têm suporte publicado em outros lugares — “respire fundo” saiu de um artigo que procurou instruções de alta pontuação em vez de inventá-las, o que é uma afirmação diferente e melhor do que a que circulou depois.8 O que generaliza não são as frases. É que a lista que sobreviveu em posts de blog e a lista que sobrevive à medição são duas listas diferentes, e a única maneira de saber qual delas você tem em mãos é rodar o bench.

Uma regra que todo mundo repete — diga o que você quer, não o que você não quer — com a ausência habitual de um número. Aqui está o número. O mesmo requisito de formato, escrito de três maneiras, com o modelo gerando livremente para que a conformidade possa ser observada:

como a regra de formato é escritaa saída foi exatamente uma palavra permitidamédia de output tokens
“Responda com uma palavra.”10/60 (16,7 %)2,6
“Não explique. Não escreva uma frase. Não adicione pontuação.”1/60 (1,7 %)14,0
as duas juntas41/60 (68,3 %)2,3

Três proibições foram piores do que uma instrução, e fizeram o modelo escrever cinco vezes mais texto — o oposto exato das três ao mesmo tempo. Adicionar de volta a frase positiva o resgatou para 68 %.

O mecanismo não é misterioso quando você lembra do Capítulo 8. O modelo escolhe um próximo token a partir de uma distribuição condicionada por tudo o que veio antes, e uma proibição coloca a coisa proibida dentro desse condicionamento. Não há operador para negação; há um contexto em que uma palavra agora aparece.

O que é diretamente mensurável. Pegue o prompt baseline e adicione uma linha: Do not use the shipping queue for software problems. Depois olhe apenas para os quarenta e cinco tickets que não são tickets de envio:

shipping escolhidoprobabilidade média em shippingacurácia geral
baseline11,1 % dos 45 casos0,13176,7 % [64,6, 85,6]
depois de proibi-lo pelo nome37,8 %0,37451,7 % [39,3, 63,8]

Nomear uma fila para descartá-la fez o modelo escolhê-la três vezes mais, quase triplicou a massa de probabilidade que ele atribuiu a ela e custou 25 pontos de acurácia geral — 16 casos perdidos contra 1 ganho, probabilidade pareada 0,0003.

Não pense em um elefante, medido. A reescrita é sempre a mesma: substitua a proibição pela regra positiva que a torna desnecessária. Não “não use envio para problemas de software”, mas “use envio apenas quando houver um pacote físico envolvido”.

O contraexemplo honesto: chain of thought que custa e não paga

Link para a seção: O contraexemplo honesto: chain of thought que custa e não paga

O Capítulo 12 construiu chain of thought corretamente — primeiro como técnica de prompting,910 depois como algo treinado com recompensas verificáveis — e terminou com um aviso que deixou para este capítulo: dizer a um modelo para pensar passo a passo deixa de ajudar quando o modelo raciocina por conta própria, e pode prejudicar. Aqui está esse aviso com uma tabela embaixo, em uma tarefa na qual é fácil presumir que pensar mais deve ser melhor.

Os dois braços são lidos com o mesmo instrumento, na mesma posição. A única diferença é se uma chain of thought que o próprio modelo escreveu fica primeiro no contexto.

braçocorretosacurácia, Wilson 95 %output tokens extras por caso
sem chain of thought37/6061,7 % [49,0, 72,9]0
chain of thought, até 60 tokens34/6056,7 % [44,1, 68,4]53,1
chain of thought, até 200 tokens34/6056,7 % [44,1, 68,4]97,7

A acurácia caiu e o custo subiu, e a própria regra deste capítulo se aplica ao próprio resultado deste capítulo: a queda é 7 casos ganhos contra 10 perdidos, probabilidade pareada 0,629, o que não está estabelecido. O que está estabelecido é que ela produziu noventa e oito output tokens extras por chamada e não comprou nada mensurável com eles. A incerteza está inteiramente do lado do benefício. A conta é certa.

Uma cadeia que falha é mais instrutiva do que uma que funciona. Solicitado a raciocinar sobre “Sua integração com o Slack parou de postar mensagens depois de terça-feira”, o modelo escreveu:

TEXT
1. Check if the issue persists on Monday.
2. Verify if there are any updates or changes in your Slack setup that
   might affect message posting.
3. If no update has been made since Tuesday, check for any recent system
   restarts or downtime affecting Slack functionality.
4. If you have recently installed new software or updated your
   environment, ensure it's compatible with Slack version.
5. Contact Slack support for further assistance or troubleshooting steps.

Esse é um conselho competente de troubleshooting, e não é a tarefa. Quando solicitado a pensar, o modelo derivou para o gênero que “pense passo a passo sobre este ticket de suporte” mais se parece nos dados de treinamento — e então respondeu a uma pergunta de classificação com quinhentos caracteres de raciocínio não relacionado no próprio contexto. Chain of thought ajuda em problemas com estado intermediário que vale computar: aritmética, buscas multi-hop, satisfação de restrições. Roteamento de uma frase para um de quatro baldes não tem estado intermediário. Não há nada para a cadeia segurar, então tudo o que ela faz é adicionar texto plausível ao qual a decisão final precisa sobreviver.

Duas consequências práticas. Primeiro, para um modelo treinado para raciocinar — os modelos RLVR do Capítulo 12 — a instrução é pior do que redundante: ela pode substituir a cadeia longa que o modelo teria produzido por uma curta, com cara de prompt. E amostrar várias cadeias e votar, que é o que self-consistency faz,11 não consegue resgatar uma tarefa sem nada sobre o que discordar: multiplica o custo pelo número de amostras para desempatar empates que não existem. O Capítulo 12 mediu essa troca onde ela se aplica. Segundo, observe o custo do próprio andaime de comparação. Forçar a resposta para uma linha Final queue: derrubou o braço sem raciocínio de 76,7 % para 61,7 %. Quinze pontos, pagos para tornar os dois braços comparáveis. Estrutura que existe para sua conveniência também não é grátis.

Uma última medição, porque é a pergunta que todo mundo faz depois do primeiro resultado surpreendente. Sessenta prompts, greedy decoding, executados repetidamente:

  • A mesma chamada repetida com tudo fixo retornou probabilidades idênticas bit a bit. Determinística.
  • A mesma chamada em batch com vizinhos diferentes — batch sizes 1, 4, 12, 30 e 60 — retornou probabilidades que diferiam em até 0,0128. O rótulo escolhido nunca mudou, em 0 de 60 casos.

O rótulo sobreviveu porque tinha espaço para isso: nos sessenta casos, a menor lacuna entre as duas filas no topo foi 0,0459, três vezes e meia o drift. A estabilidade não era uma propriedade do algoritmo. Era uma margem, e margens acabam. O Capítulo 17 é onde está a razão aritmética e onde os controles de sampling que alargam e estreitam essas lacunas são desmontados. A razão de plantar isso aqui é que ela limita o que qualquer medição de prompt pode significar: o bench mede um sistema reproduzível apenas até uma tolerância, e uma diferença de dois pontos entre variantes fica dentro dessa tolerância em um dia ruim.

Tudo acima é um humano escolhendo uma variante e uma máquina a avaliando. O próximo passo óbvio é deixar a máquina escolher as variantes também.

APE faz exatamente isso: um modelo propõe instruções candidatas, elas são pontuadas em exemplos held-out, e as melhores sobrevivem.8 As instruções que ele encontra frequentemente são coisas que nenhum humano escreveria, e esse é o ponto — a busca é sobre o que pontua, não sobre o que soa profissional.

DSPy vai além e é a ideia mais útil para um produto.12 Você declara o que cada etapa de um pipeline recebe e retorna, e o framework compila isso em prompts, selecionando demonstrações e otimizando instruções contra sua métrica. Mude o modelo e você recompila em vez de reescrever. O prompt deixa de ser código-fonte que alguém ajusta manualmente e se torna um artefato gerado contra uma métrica, que é o que deveria ter sido desde o início.

Nenhum dos dois remove a necessidade do bench. Ambos fazem dele a única coisa de que você precisa, porque um otimizador sem métrica não otimiza nada.

Resta a disciplina. Prompts pertencem ao controle de versão, em arquivos, ao lado do código que os envia — não em uma linha de banco de dados que alguém editou numa terça-feira. Eles precisam de um identificador de versão armazenado junto de cada saída que produziram, ou no dia em que algo regredir você não conseguirá descobrir o que mudou. Eles precisam do bench em integração contínua, porque um prompt é a única parte do seu sistema que um fornecedor pode invalidar silenciosamente ao implantar um novo modelo. E eles precisam de casos: não cem casos inteligentes, apenas os vinte chatos que quebraram no trimestre passado, guardados para sempre. O bench é o entregável. O prompt é um subproduto dele.

Tudo neste capítulo foi medido em acurácia. Cada uma dessas variantes também tem um preço.

O system prompt que comprou 21,7 pontos é enviado em toda chamada, para sempre. Os dois exemplos que compraram sete pontos são enviados em toda chamada, para sempre. Os dezesseis que compraram doze são enviados em toda chamada, para sempre, e têm aproximadamente dez vezes o comprimento da pergunta que o usuário de fato fez. A chain of thought que não comprou nada produziu noventa e oito tokens extras por requisição, e output tokens são do tipo caro.

Nada disso é visível em uma tabela de acurácias, e tudo isso é visível em uma fatura.

O Capítulo 16 é sobre a unidade em que essas decisões são de fato denominadas. O token como unidade de cobrança, a context window como orçamento em vez de memória, por que uma conversa de quarenta turnos custa muito mais do que quarenta vezes o primeiro turno, pelo que o prompt caching paga e não paga, e por que a ordem do seu prompt decide se o cache acerta — o que acaba sendo uma segunda razão, inteiramente econômica, para colocar o material estável primeiro e o material variável por último.


O bench e cada tabela foram produzidos com Qwen/Qwen2.5-0.5B-Instruct sob greedy decoding, então se reproduzem exatamente. A documentação da Hugging Face sobre chat templates é a referência para o que os marcadores de template do Capítulo 11 realmente expandem, e para o fato de que um modelo enviado com o template errado é uma falha real e recorrente. Para os efeitos de posição e formato em escala de produção em vez de escala de laboratório, as citações acima são as fontes primárias; os guias de prompting dos fornecedores são úteis por seus exemplos e devem ser lidos sabendo que nenhum deles publica um intervalo.

  1. Anthropic, Effective context engineering for AI agents (29 de setembro de 2025), pela distinção entre prompt e contexto usada neste capítulo e desenvolvida no Capítulo 24.

  2. Zhao, Z., Wallace, E., Feng, S., Klein, D. and Singh, S. Calibrate Before Use: Improving Few-Shot Performance of Language Models. arXiv:2102.09690 (2021). Viés de rótulo majoritário, recência e common-token, e por que a rotação no bench deste capítulo não é opcional.

  3. McNemar, Q. Note on the sampling error of the difference between correlated proportions or percentages. Psychometrika 12(2), pp. 153–157 (1947). As comparações pareadas neste capítulo usam a forma binomial exata em vez da aproximação qui-quadrado, porque as contagens discordantes são pequenas.

  4. Liu, N. F. et al. Lost in the Middle: How Language Models Use Long Contexts. arXiv:2307.03172 (2023). Citado aqui pelo efeito de posição; medido em comprimento no Capítulo 24.

  5. Sclar, M., Choi, Y., Tsvetkov, Y. and Suhr, A. Quantifying Language Models' Sensitivity to Spurious Features in Prompt Design. arXiv:2310.11324 (2023). Separadores e espaçamento sozinhos movem acurácia o suficiente para reordenar leaderboards de modelos.

  6. Brown, T. B. et al. Language Models are Few-Shot Learners. arXiv:2005.14165 (2020). O artigo que apresentou in-context learning como uma capacidade em vez de uma curiosidade; a seção 3 é a fonte do vocabulário zero-shot / one-shot / few-shot que todo mundo usa hoje.

  7. Lu, Y., Bartolo, M., Moore, A., Riedel, S. and Stenetorp, P. Fantastically Ordered Prompts and Where to Find Them: Overcoming Few-Shot Prompt Order Sensitivity. arXiv:2104.08786 (2021). O resultado reproduzido na tabela few-shot acima.

  8. Zhou, Y. et al. Large Language Models Are Human-Level Prompt Engineers. arXiv:2211.01910 (2022). Prompt engineering automático por proposta e pontuação. A instrução tão citada “respire fundo” vem de Yang, C. et al., Large Language Models as Optimizers, arXiv:2309.03409 (2023), que a encontrou por busca em uma tarefa com um modelo — uma afirmação que não sobreviveu intacta à viagem para posts de blog. 2

  9. Wei, J. et al. Chain-of-Thought Prompting Elicits Reasoning in Large Language Models. arXiv:2201.11903 (2022).

  10. Kojima, T., Gu, S. S., Reid, M., Matsuo, Y. and Iwasawa, Y. Large Language Models are Zero-Shot Reasoners. arXiv:2205.11916 (2022). O resultado “vamos pensar passo a passo”, e vale a leitura para ver como as condições eram estreitas.

  11. Wang, X. et al. Self-Consistency Improves Chain of Thought Reasoning in Language Models. arXiv:2203.11171 (2022). Medido com seu custo anexado no Capítulo 12.

  12. Khattab, O. et al. DSPy: Compiling Declarative Language Model Calls into Self-Improving Pipelines. arXiv:2310.03714 (2023).

Pronto para deixar a LIA escolher por você?

Crie com todos os modelos de IA em um só lugar — comece grátis hoje.