Conteúdo da trilha
8 minNarração em inglês, legenda em portuguêsPodcast (RSS)
Capítulos
  1. 0:00Abertura
  2. 0:45A ideia
  3. 1:05Como funciona
  4. 1:59As quatro perguntas
  5. 3:27Um desafio
  6. 4:15Os erros comuns
  7. 5:28Experimente
  8. 6:16Em produção
  9. 7:03Fechamento
Transcrição

Abertura

Sexta-feira, cinco da tarde. Alguém do time de produto abre o painel de configurações e edita o prompt do classificador de tickets.

Troca a palavra urgente por alta prioridade, para soar um pouco mais educado. Ninguém roda teste. Afinal, é só texto.

Na segunda, a fila de urgentes está vazia. O código que lia a resposta do modelo procurava a palavra urgente. Metade dos tickets críticos passou o fim de semana inteiro na fila comum.

O prompt era uma interface. Ninguém tratou como uma. Nesta aula, você vai ver o que é tratar assim, e as quatro perguntas que transformam um prompt de rascunho em contrato.

A ideia

Um prompt de produção é um contrato de API entre o seu código e o modelo. Ele tem as mesmas partes de qualquer interface que você já versiona e testa. Você nunca deixaria alguém renomear um campo de uma API pública por um painel, numa sexta à tarde. O prompt merece o mesmo respeito.

Como funciona

Vamos percorrer o contrato. O código que chama sabe exatamente o que manda e o que espera de volta.

A entrada tem um formato definido. Quais variáveis, de que tipo e de onde vêm.

O prompt tem nome, versão e dono. Mudar o prompt é mudar a interface.

A saída segue um schema, com campos fixos, não um texto livre que alguém vai ter que interpretar.

O código valida essa saída antes de usar, igual faria com a resposta de qualquer API externa.

E um conjunto de casos de teste, o eval, roda contra toda versão nova do prompt.

Aquela sexta à tarde quebrou os passos quatro e seis ao mesmo tempo. A palavra na saída fazia parte do contrato. E ninguém tinha um teste que falhasse quando ela mudou.

As quatro perguntas

Antes de qualquer prompt ir para produção, responda quatro perguntas.

Entrada. O que entra, e de onde? No classificador: título e corpo do ticket, em texto simples, com dados pessoais já removidos.

Saída. Que formato sai? Um campo de prioridade que só pode ser urgente ou normal, e um campo de motivo com uma explicação curta.

Versão. Como eu sei qual rodou? Classificador de tickets, versão sete, registrada em todo trace.

Teste. Como eu sei que não piorou? Duzentos tickets rotulados, rodados a cada mudança.

Se alguma resposta for não sei, o prompt ainda é rascunho. Mesmo que já esteja em produção.

E na entrada, escreva também o que não pode entrar. Ticket de banco no Brasil vive trazendo CPF, chave Pix ou pedaço de comprovante. Isso é dado pessoal pela LGPD. O contrato diz que o seu código mascara isso antes da chamada. E o eval tem um caso provando que dado sensível não vaza para o provedor.

Isso vale para os casos de teste também. Repositório privado não cancela a lei. Se um CPF real está num caso de teste, ele vai para o provedor a cada rodada do eval. Mascare o caso também.

Um desafio

Uma pergunta para você. Na segunda, a fila de urgentes está vazia. O trace de sexta diz classificador de tickets, versão sete. Mas o painel de configurações não registra versão nenhuma. O que isso já te diz?

Diz que a mudança passou por fora do contrato. O trace diz versão sete, mas o texto que rodou de fato não é a versão sete do repositório. Você não consegue ligar o que rodou ao arquivo versionado. Então o trace não ajuda a investigar.

E só um eval também não salvaria. Ele testaria o arquivo do repositório, enquanto a produção roda outra coisa. O próximo passo é tirar o prompt do painel, versionar o arquivo e recusar qualquer saída que o schema não conhece.

Os erros comuns

A armadilha mais comum é justamente esse painel de configurações. Parece inofensivo, porque o texto está ali, visível. Na prática, é um deploy sem diff, sem revisão e sem eval.

E quem editou na sexta não foi irresponsável. O caminho que o produto oferecia é que estava errado. Conserte o caminho, não a pessoa.

O outro extremo também quebra. Três cópias do mesmo prompt, em três serviços, cada uma quase igual. Um bug é corrigido numa, e as outras duas ficam desatualizadas. Esse smell se chama scattered prompt strings. A cura é um template versionado só, reaproveitado por todos os serviços.

E tem um mais discreto. Digamos que o schema pede prioridade e motivo. Em 4% dos casos, o modelo devolve só a prioridade. E o código preenche um motivo padrão em silêncio e segue. É a mesma fragilidade de procurar a palavra urgente no texto. Saída incompleta tem que falhar na validação, e ir para um retry ou uma fila de revisão. Se o campo é mesmo opcional, diga isso no schema.

Experimente

Agora pegue um prompt seu e escreva o contrato dele, em cinco minutos, num arquivo bem ao lado do prompt. Um nome, uma versão, um dono.

O que entra, e o que precisa ficar de fora.

Se você não conseguiu preencher a saída sem hesitar, o seu código provavelmente interpreta texto livre. Isso é um smell chamado free text handoff.

E se não tem nada para colocar ao lado de eval, isso é untested prompt.

Depois, compare o contrato com o código que consome a saída. Se o código procura uma palavra em português e o contrato promete um valor em inglês, você acabou de achar o bug de sexta antes de ele acontecer. E a correção não é traduzir o schema. É ler só o campo validado e apagar a busca pela palavra.

Em produção

Então, o que muda na prática? O prompt mora no repositório, num arquivo próprio. Não espalhado como texto pelo código.

Mudança de prompt passa por revisão, como qualquer outra mudança de código.

A saída nunca é lida procurando uma palavra no texto. Ela é lida de um campo.

E toda chamada registra a versão do prompt no trace, para você saber o que rodou quando algo dá errado.

E uma mudança pequena também segue o ritual. Digamos que o produto quer um resumo de cinco frases em vez de três. Você sobe a versão, roda o eval e só publica se a checagem de tamanho continuar passando. O objetivo não é um prompt que nunca muda. É um prompt que dá para mudar com teste, e com caminho de volta.

Fechamento

Então, a ideia para levar. Tratar o prompt como interface não torna o modelo determinístico. Deixa o resto do sistema pronto para quando ele não for. E faz o seu time perder o medo de mexer nele.

Na próxima aula, a gente vê o que acontece quando essa interface cresce e ninguém poda: o prompt inchado, em que cada incidente deixou uma regra. Até lá.

Fundamento

Prompt como interface

The prompt as an interface

Prompt como interface (The prompt as an interface) é um fundamento de engenharia de IA para quem trabalha com LLMs. Tratar o prompt como contrato de API: entrada, saída, versão e teste.

Elemento
05/13
Nível
Iniciante
Leitura
4 min
Atualizado
Nesta página 5
  1. 01A situação
  2. 02O conceito
  3. 03Experimente
  4. 04O que isso muda
  5. 05Teste seu entendimento
  6. ··Perguntas rápidas

A situação

Sexta-feira, 17h. Alguém do time de produto edita o prompt do classificador de tickets direto no painel de configuração: troca “urgente” por “prioritário” para ficar mais educado. Ninguém roda nenhum teste, porque “é só texto”.

Na segunda, a fila de urgências está vazia. O código que lia a saída procurava a palavra urgente. Metade dos chamados críticos ficou o fim de semana inteiro na fila comum.

O prompt era uma interface. Ninguém tratou como uma.

O conceito

Um prompt de produção é um contrato de API entre o seu código e o modelo. Ele tem as mesmas partes de qualquer interface que você já versiona e testa:

flowchart LR
  C["1. Código chamador"]:::tool --> IN(["2. Entrada tipada"]):::io
  IN --> P(["3. Prompt versionado"]):::llm
  P --> OUT(["4. Saída com schema"]):::io
  OUT --> V["5. Validação"]:::tool
  V --> C
  E[("6. Eval")]:::store -.->|"testa"| P
  1. O código que chama sabe exatamente o que manda e o que espera receber.
  2. A entrada tem formato definido: quais variáveis, de que tipo, de onde vêm.
  3. O prompt tem nome, versão e dono. Mudar o prompt é mudar a interface.
  4. A saída segue um schema, e não um texto livre que alguém precisa interpretar.
  5. O código valida a saída antes de usar, como faria com a resposta de qualquer API externa.
  6. Um conjunto de casos de teste roda contra cada versão do prompt.

A sexta-feira das 17h quebrou o item 4 e o item 6 ao mesmo tempo. A palavra na saída era parte do contrato, e ninguém tinha um teste que falhasse quando ela mudasse.

Trate a mudança como você trataria um campo a menos num JSON de API. Ninguém edita o contrato no painel do cliente às 17h e espera o fim de semana. O prompt merece o mesmo ritual: diff, revisão, eval, versão no trace. Se o trace não diz qual texto rodou, a segunda-feira vira adivinhação.

As quatro perguntas de um contrato

Antes de colocar um prompt em produção, responda:

Pergunta Exemplo de resposta
Entrada: o que entra e de onde? Título e corpo do ticket, texto puro, já sem dados pessoais
Saída: em que formato sai? priority: urgent ou normal; reason: string
Versão: como eu sei qual rodou? ticket-classifier@v7, gravado em cada trace
Teste: como eu sei que não piorou? 200 tickets rotulados, rodados em toda mudança

Se alguma resposta é “não sei”, o prompt ainda é um rascunho, mesmo que esteja em produção.

Na entrada, anote também o que não entra. Tickets de banco e de marketplace no Brasil costumam trazer CPF, chave Pix e trechos de comprovante. Isso é dado pessoal sob a LGPD. O contrato diz se o código mascara antes, e o eval inclui um caso em que o dado sensível não pode vazar para o provedor.

O que muda na prática

  • O prompt mora no repositório, em arquivo próprio, e não espalhado em strings no meio do código.
  • Mudar o prompt passa por revisão, como qualquer mudança de código.
  • A saída nunca é lida com if "urgente" in resposta. É lida de um campo de schema.
  • Cada chamada registra a versão do prompt no trace, para você saber o que rodou quando algo deu errado.

A armadilha mais comum é o painel de configuração. Ele parece inofensivo porque o texto está visível. Na prática ele é um deploy sem diff, sem revisão e sem eval. A pessoa que editou às 17h não era maliciosa; o caminho que o produto ofereceu é que era o errado.

O outro extremo também quebra. Três cópias do mesmo prompt em três serviços, cada uma “quase igual”. Um bug se corrige numa e as outras duas ficam. Esse é o smell Prompts Espalhados, vizinho de Prompt Sem Versão.

Checagem +20 XP de primeiraNa segunda-feira a fila de urgências está vazia. O trace da sexta mostra a versão ticket-classifier@v7. O painel de configuração não grava versão. O que isso já diz?

Experimente

Pegue um prompt seu e escreva o contrato dele em 5 minutos, num arquivo ao lado do prompt:

name: ticket-classifier
version: 7
owner: time-de-suporte
input:
  title: string
  body: string        # sem dados pessoais
output:
  priority: urgent | normal
  reason: string
eval: evals/ticket-classifier.jsonl   # casos rotulados

Se você não conseguiu preencher output sem hesitar, o seu código provavelmente interpreta texto livre. Esse é o smell Passagem em Texto Livre. Se não tem nada para pôr em eval, é o smell Prompt Sem Eval.

Compare o contrato com o código que consome a saída. Se o código procura uma palavra em português e o contrato promete um enum em inglês, você acabou de achar o bug da sexta-feira antes dele acontecer.

Checagem +20 XP de primeiraO contrato diz priority: urgent | normal. O código ainda faz if 'urgente' in texto. Qual mudança vem primeiro?

O que isso muda

  • A saída vira dado: Saída Estruturada é a ferramenta para isso.
  • Mudança vira experimento medido: O que é um eval mostra como montar os casos.
  • O prompt ganha casa própria: o padrão Registro de Templates organiza nome, versão e variáveis.
  • O time para de ter medo de mexer, porque cada mudança tem teste e tem volta.

Tratar prompt como interface não deixa o modelo determinístico. Deixa o resto do sistema preparado para ele não ser.

Teste seu entendimento

Checagem +20 XP de primeiraProduto quer mudar 'resuma em 3 frases' para 'resuma em 5 frases' no prompt de um e-mail de cobrança. O eval tem 80 casos com rubrica de tamanho. Qual sequência está no contrato?

Checagem +20 XP de primeiraUm bot de atendimento de banco manda o corpo do ticket ao modelo. Um caso de eval ainda contém um CPF real. O que o contrato da entrada pede agora?

Checagem +20 XP de primeiraDois serviços classificam o mesmo ticket com prompts 'quase iguais', um em cada repositório. Um recebeu a correção de 'urgente'. O outro não. Qual smell está na frente?

Checagem +20 XP de primeiraO schema pede priority e reason. Em 4% dos casos o modelo devolve só priority. O código usa um valor padrão para reason e segue. O contrato está inteiro?

Perguntas rápidas

O que é Prompt como interface?

Prompt como interface (The prompt as an interface) é um fundamento de engenharia de IA para quem trabalha com LLMs. Tratar o prompt como contrato de API: entrada, saída, versão e teste.

Para ir além

Relações

Buscar