Pular para o conteúdo
mnzes

O que é prompt one-shot?

PorDiógenes MenezesAprendendo IA em público

7 min de leitura

Prompt one-shot é dar ao modelo exatamente um exemplo da tarefa antes de pedir a tarefa de verdade. Fica entre o prompt zero-shot, que não dá nenhum exemplo, e o prompt few-shot, que dá vários. O nome vem do “shot” que significa exemplo, e é um dos formatos básicos de prompt baseado em exemplo.

A parte interessante é que um exemplo já muda bastante o resultado, e por um motivo que não é o óbvio. A maioria das pessoas coloca o exemplo achando que está ensinando o modelo a fazer a tarefa. Não é isso que acontece. O que o exemplo faz melhor é mostrar como a resposta deve sair.

instrução da tarefaexemplo únicoentrada → saídaentrada realo promptsaída no formatodo exemploinduz o formato
Figura 1O exemplo fica entre a instrução e a entrada real. É dele que o modelo tira o formato da resposta, não da instrução.

Por que um exemplo já resolve tanta coisa

Pense em como você pediria isso sem exemplo:

Extraia o nome do cliente e o valor do pedido deste e-mail. Responda em JSON com os campos nome e valor. O valor deve ser número, sem símbolo de moeda. Se não encontrar, use null.

Agora com exemplo:

Extraia o nome do cliente e o valor do pedido.

E-mail: “Oi, sou a Marina Costa, queria confirmar o pedido de R$ 1.240,50.” Resposta: {"nome": "Marina Costa", "valor": 1240.50}

E-mail: “…”

O segundo é mais curto e deixa menos coisa em aberto. Você não precisou dizer que o valor vai sem símbolo, nem que o separador decimal é ponto, nem que o JSON não vem dentro de bloco de código. O exemplo mostrou.

Isso é o que chamam de aprendizado em contexto, e vale registrar o que ele não é: o modelo não aprendeu nada de forma permanente. Os pesos dele não mudaram. Na próxima chamada, sem o exemplo, ele volta ao comportamento anterior. O exemplo só ocupou espaço na janela de contexto daquela requisição.

O que exatamente o exemplo ensina

Um exemplo carrega três informações de uma vez, e elas não têm o mesmo peso.

um exemploentrada → saídaformato da saídarespostas possíveisregistro de linguagemfortemédiode carona
Figura 2Um exemplo carrega três coisas ao mesmo tempo. Quando o one-shot falha, quase sempre é porque só duas delas estavam claras.

O formato da saída é o que o exemplo transmite melhor. Estrutura de JSON, tamanho de parágrafo, se tem markdown, se a resposta começa direto ou com uma frase de contexto — tudo isso o exemplo resolve sem você descrever.

O espaço de respostas possíveis vem em segundo. Se o exemplo classifica um ticket como cobrança, o modelo entende que existe um conjunto fechado de categorias, mesmo que você não tenha listado quais.

O registro de linguagem vem junto de carona. Um exemplo escrito de forma seca produz respostas secas. Um exemplo com emoji produz respostas com emoji. Isso costuma ser efeito colateral não intencional.

Há um resultado que vale conhecer aqui, e é contraintuitivo. Um trabalho de 2022 testou o que acontece quando você embaralha os rótulos dos exemplos — associa de propósito a entrada errada à saída errada — e o desempenho cai bem menos do que se espera1. A leitura razoável é que o modelo usa o exemplo mais para calibrar formato e espaço de saída do que para aprender o mapeamento em si.

Isso não é permissão para escrever exemplo errado. É uma pista sobre onde investir atenção: gastar meia hora escolhendo o exemplo semanticamente mais representativo rende menos que garantir que o formato dele está exatamente como você quer a resposta.

Quando um exemplo não basta

O one-shot falha de forma previsível em alguns casos.

Quando existe fronteira ambígua. Se você está classificando ticket entre cobrança e financeiro, um exemplo mostra um dos dois lados. Ele não mostra onde a linha passa. Aqui você precisa de pelo menos um exemplo de cada lado da fronteira, e já saiu do one-shot.

Quando o caso normal e o caso de borda pedem tratamento diferente. Se o e-mail às vezes não tem valor nenhum, e o seu único exemplo tem valor, o modelo vai inventar um número em vez de devolver null. Ele aprendeu que a resposta sempre tem número.

Quando a tarefa é de raciocínio, não de formato. Para problema que exige vários passos, o que ajuda é mostrar o raciocínio, não a resposta. Isso é chain-of-thought, e um exemplo com o raciocínio inteiro escrito costuma ser mais útil que três exemplos só com a resposta final.

Existe também um efeito de calibração que atrapalha: com poucos exemplos, o modelo tende a favorecer o rótulo que apareceu por último ou o que apareceu mais vezes2. Com um exemplo só, esse viés é máximo — não há nada para equilibrar.

Como escolher o exemplo

Na prática, o que funciona:

  1. Pegue um caso médio. Não o mais simples, que ensina pouco, nem o mais estranho, que ensina o modelo a tratar tudo como exceção.
  2. Escreva a resposta exatamente como você quer receber. Se você não quer bloco de código em volta do JSON, o exemplo não pode ter bloco de código.
  3. Se existe caso vazio, mostre o caso vazio. Um exemplo em que o campo vem null vale mais que uma frase dizendo “use null se não encontrar”.
  4. Teste com o exemplo trocado. Se a qualidade muda muito ao trocar o exemplo por outro equivalente, a sua tarefa é sensível a exemplo e você provavelmente precisa de few-shot.

O passo 4 é o que quase ninguém faz e é o mais informativo. Rodar o mesmo conjunto de 20 entradas com três exemplos diferentes leva alguns minutos e responde direto se one-shot é suficiente.

O custo

Um exemplo é a opção mais barata depois do zero-shot. Vale colocar isso em número, porque a decisão costuma ser tomada no escuro.

Tokens de entrada Quando escolher
Zero-shot ~80 Formato livre, tarefa comum
One-shot ~200 Formato importa, sem caso ambíguo
Few-shot (5) ~600 Fronteiras ambíguas, muitas classes

Os números são de uma tarefa de extração real e servem só para mostrar a ordem de grandeza. O que interessa é a proporção: sair de zero para um exemplo costuma custar pouco e resolver o problema mais comum, que é formato. Sair de um para cinco triplica o custo de entrada e só se paga quando existe ambiguidade real para desfazer.

Se o volume for alto e o prompt for estável, vale olhar prompt caching antes de cortar exemplo para economizar: o exemplo entra no prefixo estável e passa a ser cobrado uma fração do preço.

Não confunda com one-shot learning

Os dois termos apareceram em contextos diferentes e não significam a mesma coisa.

One-shot learning é anterior aos LLMs e vem de visão computacional. A ideia é treinar um modelo que reconheça uma classe nova a partir de um único exemplo rotulado — e ali há treino de verdade, com atualização de pesos.

Prompt one-shot não treina nada. Os pesos ficam congelados, o exemplo vive na janela de contexto e desaparece quando a requisição termina. A confusão é comum o suficiente para valer um artigo próprio.

Footnotes

  1. Min et al. (2022) mostraram que substituir os rótulos corretos por rótulos aleatórios degrada bem menos do que se esperava, sugerindo que a demonstração serve principalmente para especificar formato e espaço de rótulos.

  2. Zhao et al. (2021) descrevem esse viés e propõem calibrar a saída antes de usá-la.

Perguntas frequentes

Qual a diferença entre prompt one-shot e few-shot?
One-shot dá um exemplo, few-shot dá vários. A diferença prática não é a quantidade: com um exemplo o modelo copia o padrão que ele vê, com vários ele consegue inferir onde estão as fronteiras entre casos. Se a sua tarefa tem casos ambíguos, um exemplo não mostra a fronteira e o few-shot ganha.
Quando prompt one-shot é melhor que zero-shot?
Quando o formato da resposta importa mais que o conteúdo. Zero-shot descreve o que você quer com palavras, e descrever formato com palavras é impreciso. Um exemplo resolve isso sem ambiguidade. Se a tarefa é aberta e o formato é livre, o exemplo só gasta contexto.
Como escolher o exemplo do one-shot?
Escolha um caso médio, não o mais fácil nem o mais difícil. O exemplo fácil ensina pouco, e o exemplo excepcional ensina o modelo a tratar todo caso como excepcional. Se a sua entrada real tem campo vazio ou dado faltando às vezes, o exemplo precisa mostrar o que fazer nesse caso.
O exemplo do one-shot precisa estar correto?
A resposta do exemplo precisa estar no formato certo. O conteúdo importa menos do que parece: experimentos mostram que o modelo extrai principalmente o formato e o espaço de respostas possíveis, e tolera erro no rótulo. Mas isso é sobre o que degrada menos, não uma licença para colocar exemplo errado.
Prompt one-shot funciona com imagem?
Funciona, e o par de referência é imagem mais descrição em vez de texto mais texto. O custo muda de patamar: uma imagem de exemplo consome bem mais contexto que um exemplo textual, então o cálculo de quando vale a pena é diferente.
One-shot prompting é a mesma coisa que one-shot learning?
Não. One-shot learning é uma área de machine learning em que o modelo aprende uma classe nova a partir de um exemplo, atualizando pesos. Prompt one-shot não treina nada: os pesos ficam congelados e o exemplo só ocupa a janela de contexto daquela chamada.

Referências

  1. Brown, T. et al.. Language Models are Few-Shot Learners (2020)arXiv:2005.14165
  2. Min, S. et al.. Rethinking the Role of Demonstrations: What Makes In-Context Learning Work? (2022)arXiv:2202.12837
  3. Zhao, Z. et al.. Calibrate Before Use: Improving Few-Shot Performance of Language Models (2021)arXiv:2102.09690