Técnicas de engenharia de prompt
Zero/one/few shot-learning, instruction prompting e chain of thoughts
Me siga no X | Me siga no LinkedIn | Apoie a Newsletter | Solicite uma consultoria
Qualquer pessoa que tenha utilizado aplicações que fazem uso de modelos de linguagem grandes (LLMs, na sigla em inglês) sabe que a engenharia de prompt é um processo informal e, por vezes, difícil.
Pequenas mudanças em um prompt podem causar mudanças significativas na saída do modelo. Ademais, é difícil saber o impacto que a alteração de um prompt terá e o comportamento d o modelo.
A natureza frágil da engenharia de prompt é uma dura realidade quando pensamos em criar aplicações com LLMs. Se não podemos prever como nosso modelo se comportará, como podemos construir um sistema confiável em torno desse modelo?
Dado essa característica dos LLMs, encontrar técnicas que tornem esses modelos mais precisos e confiáveis se tornou um recente tópico de popular.
Nessa newsletter já discutimos um pouco sobre engenharia de prompt em outro texto. Neste texto, porém, vamos nos aprofundar em algumas técnicas específicas:
Zero shot learning
Few shot learning
Instruction prompting
Chain of thought
📚 Você é dev e quer aprender um pouco mais sobre a criação de aplicações baseadas em LLM?
Eu criei um curso que aborda aspectos teóricos e práticos do desenvolvimento de aplicações baseadas em LLMs. Alguns dos tópicos cobertos:
🟠 O que são e como criar embeddings
🟡 Como selecionar partes relevantes nos seus documentos
🔵 Como integrar essas partes documentos com uma LLM
Engenharia de prompt
Engenharia de Prompts são técnicas para se comunicar com LLMs a fim de direcionar seu comportamento para resultados desejados, sem precisar atualizar os pesos do modelo.
O prompt define o contexto da conversação, avisa ao LLM qual informação é importante, bem como que tipo de saída é esperada. Engenharia de prompt, por sua vez, é o processo de ajustar ou melhorar as respostas geradas pelo LLM, de forma a obter resultados mais desejáveis. Em outras palavras, engenharia de prompt é a capacidade de programar LLMs via prompts.
Dado que elaborar adequadamente o conteúdo do prompt é importante para se obter bons resultados, testar e explorar diversos prompts se tornou uma área de pesquisa, exigindo experimentação e uso de heuristicas.
No entanto, o processo de descobrir os melhores prompts se baseia em heurísticas e experimentação, por exemplo, através de versionamento dos prompts ao longo do tempo e testando diferentes ideias para ver o que funciona.
Existem uma variedade de elementos que podem ser opcionalmente adicionados no prompt. Alguns desses elementos são:
Dados de entrada: Aqui fornecemos os dados reais que o LLM vai processar.
Exemplos: Às vezes, incluir exemplos específicos pode ajudar o modelo a entender melhor o que você deseja.
Formato: Quando estamos trabalhando em um prompt mais elaborado, é interessante adicionar marcadores para determinar o formato, indicando, por exemplo, o começo/fim da pergunta, um exemplo de resposta, etc.
Contexto: Os LLMs têm uma janela de contexto predefinida que estabelece um limite para o número total de tokens que podem ser processados de uma única vez. Embora o tamanho da janela de contexto varia entre modelos, precisamos considerar que só podemos incluir uma quantidade limitada de informações em nosso prompt. Por ex, no GPT-4, o limite máximo é de 32k tokens.
Técnicas de engenharia de prompt
As técnicas de engenharia de prompt permitem que usuários otimizem a interação com os LLMs, potencializando as chances de produzir resultados úteis.
Zero-shot learning
O zero-shot learning é uma técnica simples em que o objetivo é realizar tarefas sem a necessidade de exemplos de treinamento direto para essas tarefas. De maneira mais técnica, zero-shot learning consiste em reconhecer novas categorias de instancias sem exemplos de treinamento.
Devido à enorme quantidade de dados de pré-treinamento que observam, os LLMs são frequentemente bastante capazes de resolver tarefas com pouca instrução. Ou seja, eles podem aproveitar sua base de conhecimento para resolver uma (relativamente) grande quantidade de tarefas. Um exemplo está no prompt abaixo.
traduza para o Português:
'today is a good day' =>
No entanto, o que devemos fazer caso o zero-shot learning não resolva nossa tarefa?
Em muitos cenários, podemos aprimorar o desempenho de um LLM ao fornecer informações mais específicas e concretas. Em particular, temos a opção de incorporar exemplos de saída desejada ao prompt, possibilitando que o modelo reproduza padrões a partir dos dados apresentados no prompt.
Dessa forma, o modelo pode aprender a inferir relações e comportamentos com maior precisão, tornando-se mais adaptado às nuances da tarefa.
One-shot e few-shot learning
Além de apenas uma descrição de tarefa, podemos melhorar nosso prompt com bons exemplos de entrada e a saída esperada. Essa técnica forma a base do one-shot e do few-shot learning, que tentam melhorar o desempenho do LLM fornecendo exemplos explícitos de comportamento correto. A diferença entre o one-shot e o few-shot está justamente na quantidade de exemplos fornecidos.
O objetivo do one-shot e do few-shot learning é melhorar a capacidade de um LLM compreender e executar tarefas específicas, com base em um número reduzido de exemplos de treinamento. Em vez de depender exclusivamente de instruções gerais ou conhecimento prévio, o few-shot learning inclui um pequeno conjunto de exemplos direcionados no prompt.
A seguir, há um exemplo do one-shot.
traduza para o Português:
olá mundo => hello world
today is a good day =>
Em seguida, há outro exemplo usando o few-shot.
traduza para o Português:
olá mundo => hello world
que dia é hoje? => what day is today?
quem comeu meu queijo? => who ate my cheese?
today is a good day =>
Como resultado, o modelo se torna mais apto a lidar com tarefas similares, mesmo quando sua experiência em relação a essas tarefas é limitada.
Se usado adequadamente, o few-shot learning pode ser muito eficaz, conforme ilustrado pela figura abaixo. De acordo com os autores, a acurácia da técnica de few-shot learning não só tem desempenho melhor que suas contra-partes, one-shot e zero-shot, mas também melhora drasticamente a media que o tamanho do modelo também aumenta.
Instruction prompting
Embora interessante, o few-shot learning apresenta uma desvantagem: os exemplos consomem tokens. Considerando que a janela de contexto de um LLM é limitada, talvez queiramos explorar prompts que não consumam tantos tokens.
Prompt por instrução (ou instruction prompting) é uma técnica simples que delimita partes do prompt. Estudos experimentais apontaram que o uso de instruction prompts ajudam na generalização de novas tarefas.
Um exemplo está a seguir:
### Instrução
Responsa a pergunta abaixo, imaginando que você é Ariano Suassuna
## Pergunta
Qual o papel da escrita na carreira de um profissional do conhecimento?
## Resposta
Além da delimitação do prompt, há ainda outras dicas que podem ser utilizadas:
Assim como o restante do nosso prompt, a instrução deve ser específica e detalhada.
Devemos evitar dizer ao LLM o que ele não deve fazer. Em vez disso, devemos focar em dizer ao LLM o que ele deve fazer.
Utilize uma estrutura de entrada com delimitadores claros. Outros delimitadores podem ser utilizados, mas seja consistente com seus usos.
Chain of thoughts
A técnica de instrução Chain of thoughts (CoT) é uma abordagem simples para melhorar o desempenho de um LLM em tarefas em que algum raciocínio é necessário. Em uma CoT, o usuário fornece uma série de etapas intermediárias em linguagem natural que ajudam a direcionar a saída final.
O CoT é inspirado no processo de pensamento comum para resolução tarefas complicadas. Para essas tarefas, costumeiramente decompomos o problema em etapas intermediárias e resolver cada uma antes de fornecer a resposta final, por exemplo: “Jane dá 2 flores para sua mãe, e fica com 10... então, se ela der 3 flores para seu pai, e fica com 7... logo a resposta é 7”. Veja o exemplo original abaixo, apresentado no artigo que introduziu a técnica.
O benefício do CoT é mais evidente em tarefas de raciocínio complicadas, quando se utilizam modelos grandes (por exemplo, com mais de 50 bilhões de parâmetros). Tarefas simples tendem a ter ganhos menores ao se utilizar o CoT.
Combinações do CoT
Após a introdução da técnica do CoT, diversas outras variantes foram apresentadas. Algumas dessas variações são combinações das técnicas de engenharia de prompt. Por exemplo, neste artigo, os autores compararam o uso de zero-shot e few-shot com o uso de CoT na construção dos prompts.
Neste trabalho, os autores perceberam um bom desempenho do uso de zero-shot (prompt sem instruções) junto com CoT. De acordo com os autores, “Despite the simplicity, our Zero-shot-CoT successfully generates a plausible reasoning path in a zero-shot manner and reaches the correct answer in a problem where the standard zero-shot approach fails. Importantly, our Zero-shot-CoT is versatile and task-agnostic, unlike most prior task-specific prompt engineering in the forms of examples (few-shot) or templates (zero-shot) [Liu et al., 2021b]: it can facilitate step-by-step answers across various reasoning tasks, including arithmetic, commonsense reasoning, and other logical reasoning tasks, without modifying the prompt per task.”
A engenharia de prompt está evoluindo
Esse texto apresentou uma visão geral dos avanços recentes na engenharia de prompts, descrevendo alguma das diferentes técnicas para elaboração de prompts que podem ser úteis.
No entanto, deve-se observar que o tópico da engenharia de prompts é tanto novo quanto está em rápida evolução. Novas pesquisas são divulgadas quase todos os dias, e muitas ideias de ponta são compartilhadas apenas online em vez de serem publicadas formalmente.
Parece claro nesse momento que, para acompanhar estes avanços, é importante fazer se ambientar com a literatura científica da área. Neste texto de blog, por exemplo, quatro artigos científicos foram citados. São eles:
“Large Language Models are Zero-Shot Reasoners”, Kojima et al.
“Chain-of-Thought Prompting Elicits Reasoning in Large Language Models”, Wei et al.
“Cross-Task Generalization via Natural Language Crowdsourcing Instructions”, Mishra et al.
“Language Models are Few-Shot Learners”, Brown et al.
Finalmente, é provável que esse tópico se transforme significativamente nos próximos meses, ampliando assim quais problemas podem ser resolvidos com LLMs.
Se você chegou até aqui, aproveito para compartilhar:
Estou realizando a palestra “5 coisas que todo dev deveria saber sobre GenAI” em empresas e universidades. Caso você queria agendar uma palestra, entre em contato!
Por fim, não se esqueça de compartilhar o texto com outros colegas que poderiam ter interesse nesse texto!