Engenharia de Prompt: técnicas avançadas para aplicação em LLMs
Dentro do campo da Inteligência Artificial, um processo que vem se destacando é a Engenharia de Prompt.
Ele foca na criação estratégica de instruções, ou "prompts", com o objetivo de maximizar a eficiência com que os modelos de IA, especialmente os voltados para o Processamento de Linguagem Natural (PLN), respondem às solicitações dos usuários.
Melhor dizendo, é a arte de fazer perguntas para receber da IA a resposta mais alinhada às suas expectativas ou necessidades. Se você já utilizou alguma IA, como o ChatGPT, deve ter percebido que a forma como você formula uma pergunta pode alterar drasticamente a resposta recebida. É como o João Paulo Faria, nosso mentor do AI 4 TECH sempre pontua: "A qualidade da reposta final de qualquer LLM, vai depender do 'input' fornecido à ferramenta".
Um prompt bem elaborado pode resultar em respostas mais precisas, relevantes e úteis, enquanto um prompt mal construído pode gerar respostas vagas, imprecisas ou completamente irrelevantes.
Portanto, a Engenharia de Prompt envolve não apenas a escolha das palavras corretas, mas também a formulação de perguntas em um contexto apropriado e a aplicação de técnicas específicas para aprimorar a resposta.
Neste artigo, vamos explorar as principais técnicas que podem transformar a forma como interagimos com esses modelos, obtendo "outputs" cada vez mais assertivos para cada projeto. Vamos lá?
1. Zero-shot e Few-shot Prompting
Começando pelo modelo mais básico, temos o zero-shot que basicamente direciona o modelo a realizar uma tarefa sem exemplos adicionais, confiando na capacidade do modelo de entender as instruções diretamente. Já para tarefas um pouco mais complexas, é recomendado avançar para a técnica few-shot prompting, que inclui demonstrações no prompt, melhorando significativamente o desempenho. Vaja exemplo:
Exemplo de Zero-shot Prompting:
Classifique o texto como neutro, negativo ou positivo.
Texto: Acho que as férias foram boas.
Sentimento:
Saída:
Neutro
Exemplo de Few-shot Prompting:
Texto 1: Este filme é ótimo! // Positivo
Texto 2: Este filme é horrível! // Negativo
Texto 3: O filme foi ok. // Neutro
Texto: O filme foi incrível!
Sentimento:
Saída:
Positivo
2. Chain-of-Thought (CoT) Prompting
A técnica de Chain-of-Thought (CoT) envolve a criação de passos intermediários de raciocínio para resolver tarefas complexas. Isso permite que o modelo siga uma linha de pensamento estruturada. Por exemplo:
Exemplo de CoT Prompting:
Os números ímpares neste grupo somam um número par: 4, 8, 9, 15, 12, 2, 1.
A: Somando todos os números ímpares (9, 15, 1) temos 25. A resposta é Falso.
Exemplo de Few-shot CoT Prompting:
Os números ímpares neste grupo somam um número par: 4, 8, 9, 15, 12, 2, 1.
A: Somando todos os números ímpares (9, 15, 1) temos 25. A resposta é Falso.
Os números ímpares neste grupo somam um número par: 15, 32, 5, 13, 82, 7, 1.
A:
Saída:
Somando todos os números ímpares (15, 5, 13, 7, 1) temos 41. A resposta é Falso.
3. Self-Consistency e Generated Knowledge Prompting
Self-Consistency melhora a precisão das respostas ao gerar múltiplos caminhos de raciocínio e selecionar a resposta mais consistente. Já o Generated Knowledge Prompting gera conhecimento adicional como parte do prompt para ajudar o modelo a fazer previsões mais precisas, especialmente em tarefas que exigem conhecimento do mundo real.
Exemplo de Self-Consistency:
Quando eu tinha 6 anos, minha irmã tinha metade da minha idade. Agora eu tenho 70 anos, quantos anos minha irmã tem?
Saídas possíveis:
1. Minha irmã tinha 3 anos. Agora ela tem 70 - 3 = 67 anos.
2. Minha irmã tinha 3 anos. Agora ela tem 70 - 3 = 67 anos.
3. Minha irmã tinha 3 anos. Agora ela tem 70/2 = 35 anos.
A resposta mais consistente é 67 anos.
Exemplo de Generated Knowledge Prompting:
Input: Greece is larger than mexico.
Knowledge: Greece is approximately 131,957 sq km, while Mexico is approximately 1,964,375 sq km, making Mexico 1,389% larger than Greece.
Input: Glasses always fog up.
Knowledge: Condensation occurs on eyeglass lenses when water vapor from your sweat, breath, and ambient humidity lands on a cold surface, cools, and then changes into tiny drops of liquid, forming a film that you see as fog. Your lenses will be relatively cool compared to your breath, especially when the outside air is cold.
Input: A fish is capable of thinking.
Knowledge: Fish are more intelligent than they appear. In many areas, such as memory, their cognitive powers match or exceed those of ’higher’ vertebrates including non-human primates. Fish’s long-term memories help them keep track of complex social relationships.
Input: A common effect of smoking lots of cigarettes in one’s lifetime is a higher than normal chance of getting lung cancer.
Knowledge: Those who consistently averaged less than one cigarette per day over their lifetime had nine times the risk of dying from lung cancer than never smokers. Among people who smoked between one and 10 cigarettes per day, the risk of dying from lung cancer was nearly 12 times higher than that of never smokers.
Input: A rock is the same size as a pebble.
Knowledge: A pebble is a clast of rock with a particle size of 4 to 64 millimetres based on the Udden-Wentworth scale of sedimentology. Pebbles are generally considered larger than granules (2 to 4 millimetres diameter) and smaller than cobbles (64 to 256 millimetres diameter).
4. Prompt Chaining
Prompt Chaining divide tarefas complexas em subtarefas menores, criando uma cadeia de operações de prompt. Esta técnica aumenta a transparência, a controlabilidade e a confiabilidade das respostas dos modelos, sendo especialmente útil para assistentes conversacionais e personalização de aplicativos.
Exemplo de Prompt Chaining para Document QA:
- Prompt 1:
Você é um assistente útil. Sua tarefa é ajudar a responder a uma pergunta dada em um documento. O primeiro passo é extrair citações relevantes da pergunta do documento. Por favor, responda com uma lista de citações usando <citações></citações>.
####
{{documento}}
####
Saída:
<citações>
- Chain-of-thought (CoT) prompting
- Generated knowledge prompting
</citações>
- Prompt 2:
Dadas as citações relevantes (delimitadas por <citações></citações>) extraídas de um documento e o documento original (delimitado por ####), por favor, componha uma resposta para a pergunta.
####
{{documento}}
####
<citações>
- Chain-of-thought (CoT) prompting[27]
- Generated knowledge prompting[37]
</citações>
Saída:
As técnicas de prompting mencionadas no documento incluem:
1. Chain-of-thought (CoT) prompting
2. Generated knowledge prompting
Aqui está uma captura de tela de todo o prompt, incluindo a pergunta que é passada no ambiente "Playground" do LLM, usando a função de usuário:
Output:
<quotes>-
Chain-of-thought (CoT) prompting
Generated knowledge prompting
Least-to-most prompting
Self-consistency decoding
Complexity-based prompting
Self-refine
Tree-of-thought prompting
Maieutic prompting
Directional-stimulus prompting
Textual inversion and embeddings
Using gradient descent to search for prompts
Prompt injection
</quotes>
5. Tree of Thoughts (ToT)
Tree of Thoughts (ToT) utiliza uma árvore de pensamentos para explorar diferentes caminhos de resolução de problemas, combinando isso com algoritmos de busca como BFS (Busca em Largura) e DFS (Busca em Profundidade).
Exemplo de ToT Prompting:
Imagine três especialistas respondendo a esta pergunta. Cada um escreverá um passo de seu pensamento e compartilhará com o grupo.
A pergunta é: Qual é a capital da França?
Saída:
Especialista 1: Paris é a capital da França.
Especialista 2: A capital da França é Paris.
Especialista 3: A cidade de Paris é a capital da França.
6. Multimodal CoT, ART e ReAct Prompting
Multimodal CoT integra texto e visão para tarefas que envolvem múltiplas modalidades. ART (Automatic Reasoning and Tool-use) combina CoT com o uso de ferramentas, enquanto ReAct Prompting gera traços de raciocínio e ações específicas para tarefas de tomada de decisão, melhorando a interpretabilidade e a confiança nos modelos.
Exemplo de ReAct Prompting:
Pergunta: Qual é a faixa de elevação para a área que o setor leste da orogenia do Colorado se estende?
Pensamento 1: Preciso procurar 'orogenia do Colorado'.
Ação 1: Search[orogenia do Colorado]
Observação 1: A orogenia do Colorado foi um episódio de formação de montanhas no Colorado e áreas circunvizinhas.
Pensamento 2: Preciso procurar 'setor leste'.
Ação 2: Lookup[setor leste]
Observação 2: O setor leste se estende até as High Plains.
7. Program-Aided Language Models (PAL)
A técnica Program-Aided Language Models (PAL) utiliza programas como passos intermediários de raciocínio, diferindo do Chain-of-Thought (CoT) ao delegar a solução de problemas a um ambiente de execução programática, como um interpretador Python. Isso é especialmente útil para tarefas que requerem compreensão de datas ou cálculos matemáticos.
Exemplo de PAL para Compreensão de Datas:
Primeiro, configuramos as bibliotecas necessárias:
import openai
from datetime import datetime
from dateutil.relativedelta import relativedelta
import os
from dotenv import load_dotenv
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
Configuramos o modelo:
llm = OpenAI(model_name='text-davinci-003', temperature=0)
Definimos o prompt e a questão:
question = "Hoje é 27 de fevereiro de 2023. Eu nasci exatamente há 25 anos. Qual é a data em que eu nasci no formato DD/MM/YYYY?"
DATE_UNDERSTANDING_PROMPT = """
# Q: 2015 está chegando em 36 horas. Qual é a data uma semana a partir de hoje no formato DD/MM/YYYY?
# Se 2015 está chegando em 36 horas, então hoje é 36 horas antes.
hoje = datetime(2015, 1, 1) - relativedelta(hours=36)
# Uma semana a partir de hoje,
uma_semana_a_partir_de_hoje = hoje + relativedelta(weeks=1)
# A resposta no formato %d/%m/%Y é
uma_semana_a_partir_de_hoje.strftime('%d/%m/%Y')
# Q: A data do show foi marcada para 06/01/1943, mas foi adiada por um dia para hoje. Qual é a data 10 dias atrás no formato DD/MM/YYYY?
# Se o show foi marcado para 06/01/1943, mas foi adiada por um dia para hoje, então hoje é um dia depois.
hoje = datetime(1943, 6, 1) + relativedelta(days=1)
# 10 dias atrás,
dez_dias_atras = hoje - relativedelta(days=10)
# A resposta no formato %d/%m/%Y é
dez_dias_atras.strftime('%d/%m/%Y')
# Q: {question}
""".strip() + '\n'
llm_out = llm(DATE_UNDERSTANDING_PROMPT.format(question=question))
print(llm_out)
A saída será um trecho de código Python que podemos executar:
# Se hoje é 27 de fevereiro de 2023 e eu nasci exatamente há 25 anos, então eu nasci 25 anos antes.
hoje = datetime(2023, 2, 27)
# Eu nasci 25 anos antes,
nascimento = hoje - relativedelta(years=25)
# A resposta no formato %d/%m/%Y é
nascimento.strftime('%d/%m/%Y')
Executamos o código gerado para obter a resposta:
exec(llm_out)
print(nascimento.strftime('%d/%m/%Y'))
Saída:
27/02/1998
8) Retrieval Augmented Generation (RAG)
Por último, mas não menos importante está a RAG. Para tarefas complexas e que exigem conhecimento específico, os modelos de linguagem podem se beneficiar do acesso a fontes externas de conhecimento. A técnica de Retrieval Augmented Generation (RAG) combina um componente de recuperação de informações com um modelo de geração de texto. Isso melhora a consistência factual e a confiabilidade das respostas geradas.
Como funciona?
RAG recebe uma entrada e recupera um conjunto de documentos relevantes de uma fonte (por exemplo, Wikipedia). Esses documentos são concatenados como contexto com o prompt original e alimentados no gerador de texto, que produz a saída final. Isso permite que o modelo acesse as informações mais recentes e precise, mesmo que os dados internos do modelo estejam desatualizados.
Arquitetura de RAG:
- Retrieval Component: Um componente de recuperação que busca documentos relevantes com base na consulta.
- Generator Component: Um modelo gerador que utiliza os documentos recuperados como contexto para gerar uma resposta.
Exemplo de Implementação do RAG:
- Configuração do Modelo:
Python
from transformers import RagTokenizer, RagRetriever, RagTokenForGeneration
tokenizer = RagTokenizer.from_pretrained("facebook/rag-token-nq")
retriever = RagRetriever.from_pretrained("facebook/rag-token-nq")
model = RagTokenForGeneration.from_pretrained("facebook/rag-token-nq")
- Configuração da Consulta:
Python
question = "Quem foi o primeiro presidente dos Estados Unidos?"
inputs = tokenizer(question, return_tensors="pt")
generated = model.generate(input_ids=inputs["input_ids"], max_length=50)
answer = tokenizer.batch_decode(generated, skip_special_tokens=True)
print(answer)
Saída:
CSS
['George Washington foi o primeiro presidente dos Estados Unidos, servindo de 1789 a 1797.']
- Processo de Recuperação e Geração:
- A consulta "Quem foi o primeiro presidente dos Estados Unidos?" é enviada ao componente de recuperação.
- O componente de recuperação busca documentos relevantes da Wikipedia.
- Os documentos recuperados são usados como contexto pelo gerador para criar a resposta final.
Benefícios do RAG:
- Consistência Factual: Acesso a fontes atualizadas de conhecimento melhora a precisão das respostas.
- Flexibilidade: Pode ser ajustado para diferentes fontes de conhecimento.
- Escalabilidade: Pode lidar com uma grande variedade de consultas complexas.
Aplicações de RAG:
- Assistentes Virtuais: Melhoria na precisão e relevância das respostas em assistentes virtuais.
- Educação: Fornecimento de respostas precisas e detalhadas para perguntas educacionais.
- Pesquisa: Ajuda na obtenção de informações precisas e atualizadas para pesquisadores.
Saia do básico na Engenharia de Prompt
Investir na compreensão e aplicação dessas técnicas avançadas de engenharia de prompt pode transformar significativamente a performance dos LLMs em diversas aplicações.
Se você deseja dominar essas técnicas e aplicá-las de forma prática, considere se inscrever no programa AI 4 TECH, uma formação completa que capacita profissionais de tecnologia e de áreas de negócio para implementar AI Generativa em projetos, seja usando plataformas Low Code, como Flowise, ou realizando integrações via código, com Python.
Confira os tópicos que são abordados na aula sobre Engenharia de Prompt:
A ARTE DE SABER PERGUNTAR
- Como aplicar engenharia de prompt (PDLC)
- Conceitos básicos de engenharia de prompt
- Melhores práticas de engenharia de prompt
- Tipos, padrões, técnicas, templates e casos de uso
- Introduzindo novas informações (contexto) via prompt (RAG)
- Como avaliar a qualidade dos prompts (RACCCA Framework)
- Como controlar, versionar e analisar prompts
- Ferramentas para engenharia de prompt
Co-Founder IFTL
Danrley Morais
Empreendedor de tecnologia, com formação em Sistemas de Informação, iniciou sua carreira aos 13 anos como desenvolvedor e desde então atua nos mais variados projetos com desafios de escalabilidade. Aos 20 anos começou a empreender e se tornou sócio LinkApi, onde atuou como CTO liderando o time de produto e engenharia até a aquisição realizada pela Semantix em uma transação que ultrapassou R$ 100 milhões. Atualmente é sócio e CTO na IFTL, palestrante e tech advisor em 4 startups.