Este módulo aborda conceitos e técnicas essenciais para criar prompts eficazes em modelos de IA generativa. A forma como escreves o teu prompt para um LLM também faz diferença. Um prompt bem elaborado pode garantir uma resposta de melhor qualidade. Mas afinal, o que significam termos como prompt e engenharia de prompts? E como posso melhorar o input do prompt que envio para o LLM? São estas as perguntas que vamos tentar responder neste capítulo e no seguinte.
A IA generativa consegue criar novos conteúdos (por exemplo, texto, imagens, áudio, código, etc.) em resposta a pedidos dos utilizadores. Isto é possível graças a Modelos de Linguagem de Grande Escala como a série GPT ("Generative Pre-trained Transformer") da OpenAI, treinados para trabalhar com linguagem natural e código.
Os utilizadores podem agora interagir com estes modelos através de interfaces familiares como o chat, sem precisarem de conhecimentos técnicos ou formação específica. Os modelos são baseados em prompts – o utilizador envia um texto (prompt) e recebe uma resposta da IA (completion). Pode depois "conversar com a IA" de forma iterativa, em várias voltas, ajustando o prompt até que a resposta corresponda ao que pretende.
Os "prompts" tornam-se assim a principal interface de programação para aplicações de IA generativa, indicando aos modelos o que fazer e influenciando a qualidade das respostas. A "Engenharia de Prompts" é uma área de estudo em rápido crescimento, focada no design e otimização de prompts para garantir respostas consistentes e de qualidade em larga escala.
Nesta lição, vamos aprender o que é Engenharia de Prompts, porque é importante e como podemos criar prompts mais eficazes para um determinado modelo e objetivo de aplicação. Vamos perceber os conceitos fundamentais e as melhores práticas para engenharia de prompts – e conhecer um ambiente interativo em Jupyter Notebooks onde podemos ver estes conceitos aplicados a exemplos reais.
No final desta lição seremos capazes de:
- Explicar o que é engenharia de prompts e porque é relevante.
- Descrever os componentes de um prompt e como são utilizados.
- Aprender boas práticas e técnicas para engenharia de prompts.
- Aplicar as técnicas aprendidas a exemplos reais, usando um endpoint da OpenAI.
Engenharia de Prompts: Prática de desenhar e aperfeiçoar inputs para orientar modelos de IA a produzir os resultados desejados. Tokenização: Processo de converter texto em unidades mais pequenas, chamadas tokens, que o modelo consegue compreender e processar. LLMs Ajustados por Instruções: Modelos de Linguagem de Grande Escala (LLMs) que foram ajustados com instruções específicas para melhorar a precisão e relevância das respostas.
A engenharia de prompts é, para já, mais uma arte do que uma ciência. A melhor forma de desenvolver intuição para esta área é praticar bastante e adotar uma abordagem de tentativa e erro, combinando conhecimento do domínio de aplicação com técnicas recomendadas e otimizações específicas do modelo.
O Jupyter Notebook que acompanha esta lição oferece um ambiente sandbox onde podes experimentar o que aprendes – à medida que avanças ou como parte do desafio de código no final. Para executar os exercícios, vais precisar de:
- Uma chave de API do Azure OpenAI – o endpoint do serviço para um LLM implementado.
- Um ambiente de execução Python – onde o Notebook pode ser executado.
- Variáveis de ambiente locais – conclui agora os passos de CONFIGURAÇÃO para te preparares.
O notebook inclui exercícios iniciais – mas és incentivado a acrescentar as tuas próprias secções de Markdown (descrição) e Código (pedidos de prompt) para experimentar mais exemplos ou ideias – e desenvolver a tua intuição para o design de prompts.
Queres ter uma visão geral do que esta lição cobre antes de começares? Consulta este guia ilustrado, que te dá uma ideia dos principais tópicos abordados e dos pontos-chave para refletires em cada um. O roteiro da lição leva-te desde a compreensão dos conceitos e desafios fundamentais até à sua resolução com técnicas e boas práticas relevantes de engenharia de prompts. Repara que a secção "Técnicas Avançadas" neste guia refere-se a conteúdos que serão abordados no próximo capítulo deste curso.
Agora, vamos falar sobre como este tema se relaciona com a nossa missão de startup de trazer inovação em IA para a educação. Queremos criar aplicações de aprendizagem personalizada com IA – por isso, vamos pensar em como diferentes utilizadores da nossa aplicação podem "desenhar" prompts:
- Administradores podem pedir à IA para analisar dados curriculares e identificar lacunas de cobertura. A IA pode resumir os resultados ou visualizá-los com código.
- Educadores podem pedir à IA para gerar um plano de aula para um público-alvo e tema específico. A IA pode construir o plano personalizado num formato definido.
- Alunos podem pedir à IA para os ajudar numa disciplina difícil. A IA pode orientar os alunos com lições, dicas e exemplos adaptados ao seu nível.
Isto é apenas o início. Vê Prompts For Education – uma biblioteca open-source de prompts, curada por especialistas em educação – para teres uma ideia mais ampla das possibilidades! Experimenta alguns desses prompts no sandbox ou no OpenAI Playground para ver o que acontece!
Começámos esta lição por definir Engenharia de Prompts como o processo de desenhar e otimizar inputs de texto (prompts) para garantir respostas consistentes e de qualidade (completions) para um determinado objetivo de aplicação e modelo. Podemos pensar nisto como um processo em 2 etapas:
- desenhar o prompt inicial para um modelo e objetivo específicos
- refinar o prompt de forma iterativa para melhorar a qualidade da resposta
Este é inevitavelmente um processo de tentativa e erro que exige intuição e esforço do utilizador para obter os melhores resultados. Mas porque é importante? Para responder, precisamos primeiro de perceber três conceitos:
- Tokenização = como o modelo "vê" o prompt
- LLMs Base = como o modelo de base "processa" um prompt
- LLMs Ajustados por Instruções = como o modelo consegue agora ver "tarefas"
Um LLM vê os prompts como uma sequência de tokens, e diferentes modelos (ou versões de um modelo) podem tokenizar o mesmo prompt de formas distintas. Como os LLMs são treinados com tokens (e não com texto bruto), a forma como os prompts são tokenizados tem impacto direto na qualidade da resposta gerada.
Para perceberes como funciona a tokenização, experimenta ferramentas como o OpenAI Tokenizer mostrado abaixo. Cola o teu prompt – e vê como é convertido em tokens, prestando atenção ao tratamento de espaços e pontuação. Nota que este exemplo mostra um LLM mais antigo (GPT-3) – se experimentares com um modelo mais recente, podes obter resultados diferentes.
Depois de tokenizado o prompt, a principal função do "LLM Base" (ou modelo de base) é prever o próximo token nessa sequência. Como os LLMs são treinados com enormes conjuntos de dados de texto, têm uma boa noção das relações estatísticas entre tokens e conseguem fazer essa previsão com alguma confiança. Repara que não compreendem o significado das palavras ou tokens do prompt; apenas identificam padrões que podem "completar" com a próxima previsão. Podem continuar a prever a sequência até serem interrompidos pelo utilizador ou por alguma condição pré-definida.
Queres ver como funciona a conclusão baseada em prompts? Introduz o prompt acima no Chat Playground do Azure OpenAI Studio com as definições padrão. O sistema está configurado para tratar prompts como pedidos de informação – por isso deves ver uma resposta que se enquadra nesse contexto.
Mas e se o utilizador quiser ver algo específico que cumpra certos critérios ou objetivos de tarefa? É aqui que entram os LLMs ajustados por instruções.
Um LLM Ajustado por Instruções parte do modelo de base e é ajustado com exemplos ou pares de input/output (por exemplo, "mensagens" em várias voltas) que podem conter instruções claras – e a resposta da IA tenta seguir essa instrução.
Isto recorre a técnicas como Aprendizagem por Reforço com Feedback Humano (RLHF), que treinam o modelo para seguir instruções e aprender com o feedback, produzindo respostas mais adequadas a aplicações práticas e mais relevantes para os objetivos do utilizador.
Vamos experimentar – volta ao prompt acima, mas agora altera a mensagem do sistema para fornecer a seguinte instrução como contexto:
Resume o conteúdo que te for fornecido para um aluno do segundo ano. Mantém o resultado num parágrafo com 3-5 pontos-chave.
Vê como o resultado agora está ajustado para refletir o objetivo e formato pretendidos? Um educador pode usar diretamente esta resposta nos seus slides para essa aula.
Agora que sabemos como os prompts são processados pelos LLMs, vamos falar sobre porque precisamos de engenharia de prompts. A resposta está no facto de que os LLMs atuais apresentam vários desafios que tornam completions fiáveis e consistentes mais difíceis de obter sem investir no design e otimização dos prompts. Por exemplo:
-
As respostas dos modelos são estocásticas. O mesmo prompt provavelmente vai gerar respostas diferentes em modelos ou versões de modelos distintos. E pode até produzir resultados diferentes com o mesmo modelo em momentos diferentes. As técnicas de engenharia de prompts ajudam a minimizar estas variações, fornecendo melhores limites e orientações.
-
Os modelos podem inventar respostas. Os modelos são pré-treinados com conjuntos de dados grandes mas finitos, o que significa que não têm conhecimento sobre conceitos fora desse âmbito. Como resultado, podem gerar respostas que são imprecisas, inventadas ou até contraditórias com factos conhecidos. A engenharia de prompts ajuda os utilizadores a identificar e mitigar estas invenções, por exemplo, pedindo à IA citações ou justificações.
-
As capacidades dos modelos variam. Modelos mais recentes ou gerações diferentes têm capacidades mais avançadas, mas também trazem particularidades e compromissos em termos de custo e complexidade. A engenharia de prompts permite desenvolver boas práticas e fluxos de trabalho que abstraem diferenças e se adaptam a requisitos específicos de cada modelo de forma escalável e fluida.
Vamos ver isto em ação no OpenAI ou Azure OpenAI Playground:
- Usa o mesmo prompt com diferentes implementações de LLM (por exemplo, OpenAI, Azure OpenAI, Hugging Face) – reparaste nas variações?
- Usa o mesmo prompt várias vezes com a mesma implementação de LLM (por exemplo, Azure OpenAI playground) – como diferiram essas variações?
Neste curso, usamos o termo "fabricação" para referir o fenómeno em que os LLMs por vezes geram informação factualmente incorreta devido a limitações no seu treino ou outros fatores. Também podes ter ouvido este fenómeno chamado de "alucinações" em artigos ou estudos. No entanto, recomendamos fortemente o uso do termo "fabricação" para evitar atribuir características humanas a um resultado gerado por máquina. Isto também reforça as diretrizes de IA Responsável do ponto de vista da terminologia, eliminando termos que podem ser considerados ofensivos ou não inclusivos em certos contextos.
Queres perceber como funcionam as fabricações? Pensa num prompt que instrua a IA a gerar conteúdo sobre um tema inexistente (para garantir que não está no conjunto de treino). Por exemplo – experimentei este prompt:
- Compreender as causas e consequências da Guerra Marciana de 2076.
- Analisar o impacto do conflito na sociedade marciana e terrestre.
- Discutir as estratégias militares e diplomáticas utilizadas durante a guerra.
- Refletir sobre as lições aprendidas e possíveis implicações para o futuro.
A Guerra Marciana de 2076 foi um dos eventos mais marcantes do século XXI, alterando profundamente as relações entre Marte e a Terra. Neste plano de aula, vamos explorar os principais acontecimentos, os protagonistas e as consequências deste conflito histórico.
- Colonização de Marte e tensões iniciais com a Terra.
- Disputas por recursos naturais e autonomia marciana.
- Eventos que levaram ao início da guerra em 2076.
- Início das hostilidades e ataques estratégicos.
- Intervenção de alianças internacionais.
- Uso de tecnologia avançada e armas inovadoras.
- Líderes marcianos e terrestres.
- Papel das organizações civis e militares.
- Influência de empresas privadas e cientistas.
- Mudanças políticas e sociais em Marte e na Terra.
- Tratados de paz e reconstrução pós-guerra.
- Impacto na exploração espacial e nas futuras colónias.
- Debate em grupo sobre as causas da guerra.
- Análise de fontes históricas e testemunhos de sobreviventes.
- Simulação de negociações de paz entre Marte e Terra.
- Participação nas discussões e atividades.
- Elaboração de um relatório sobre as consequências da guerra.
- Apresentação de propostas para evitar futuros conflitos interplanetários.
- Documentos históricos e artigos científicos.
- Mapas das batalhas e movimentações militares.
- Entrevistas com especialistas em história marciana.
A Guerra Marciana de 2076 serve como um exemplo importante dos desafios e oportunidades que surgem com a expansão humana para outros planetas. Ao estudar este conflito, podemos aprender a promover a cooperação e evitar os erros do passado. Uma pesquisa na web mostrou-me que existem relatos fictícios (por exemplo, séries de televisão ou livros) sobre guerras em Marte – mas nenhum em 2076. O senso comum também nos diz que 2076 é no futuro e, por isso, não pode estar associado a um evento real.
Então, o que acontece quando executamos este prompt com diferentes fornecedores de LLM?
Resposta 1: OpenAI Playground (GPT-35)
Resposta 2: Azure OpenAI Playground (GPT-35)
Resposta 3: : Hugging Face Chat Playground (LLama-2)
Como era de esperar, cada modelo (ou versão do modelo) produz respostas ligeiramente diferentes devido ao comportamento estocástico e às variações de capacidade dos modelos. Por exemplo, um modelo dirige-se a um público do 8.º ano, enquanto outro assume um estudante do ensino secundário. Mas todos os três modelos geraram respostas que poderiam convencer um utilizador desinformado de que o evento era real.
Técnicas de engenharia de prompts como metaprompting e configuração de temperatura podem reduzir as fabricações dos modelos até certo ponto. Novas arquiteturas de engenharia de prompts também incorporam novas ferramentas e técnicas de forma integrada no fluxo do prompt, para mitigar ou reduzir alguns destes efeitos.
Vamos terminar esta secção percebendo como a engenharia de prompts é usada em soluções reais, analisando um Caso de Estudo: GitHub Copilot.
O GitHub Copilot é o teu "Programador Parceiro de IA" – converte prompts de texto em sugestões de código e está integrado no teu ambiente de desenvolvimento (por exemplo, Visual Studio Code) para uma experiência de utilização fluida. Como documentado na série de blogs abaixo, a versão inicial baseava-se no modelo OpenAI Codex – com os engenheiros a perceberem rapidamente a necessidade de afinar o modelo e desenvolver melhores técnicas de engenharia de prompts para melhorar a qualidade do código. Em julho, lançaram um modelo de IA melhorado que vai além do Codex para sugestões ainda mais rápidas.
Lê os artigos por ordem para acompanhar a evolução do seu conhecimento.
- Maio 2023 | O GitHub Copilot está a ficar melhor a compreender o teu código
- Maio 2023 | Por dentro do GitHub: Trabalhar com os LLMs por trás do GitHub Copilot.
- Jun 2023 | Como escrever melhores prompts para o GitHub Copilot.
- Jul 2023 | .. O GitHub Copilot vai além do Codex com um modelo de IA melhorado
- Jul 2023 | Guia do Programador para Engenharia de Prompts e LLMs
- Set 2023 | Como construir uma app empresarial com LLM: Lições do GitHub Copilot
Também podes explorar o blog de Engenharia para mais artigos como este que mostra como estes modelos e técnicas são aplicados para impulsionar aplicações reais.
Já vimos porque é que a engenharia de prompts é importante – agora vamos perceber como os prompts são construídos para podermos avaliar diferentes técnicas para um design de prompts mais eficaz.
Comecemos pelo prompt básico: um texto enviado ao modelo sem qualquer outro contexto. Eis um exemplo – quando enviamos as primeiras palavras do hino nacional dos EUA à Completion API da OpenAI, esta completa imediatamente a resposta com as linhas seguintes, ilustrando o comportamento básico de previsão.
| Prompt (Entrada) | Completamento (Saída) |
|---|---|
| Oh say can you see | Parece que estás a começar a letra de "The Star-Spangled Banner", o hino nacional dos Estados Unidos. A letra completa é ... |
Agora vamos adicionar contexto e instruções a esse prompt básico. A Chat Completion API permite-nos construir um prompt complexo como um conjunto de mensagens com:
- Pares de entrada/saída que refletem a entrada do utilizador e a resposta do assistente.
- Mensagem de sistema que define o contexto para o comportamento ou personalidade do assistente.
O pedido tem agora o formato abaixo, onde a tokenização capta eficazmente a informação relevante do contexto e da conversa. Agora, alterar o contexto do sistema pode ter tanto impacto na qualidade das respostas como as entradas do utilizador fornecidas.
response = openai.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Who won the world series in 2020?"},
{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
{"role": "user", "content": "Where was it played?"}
]
)Nos exemplos acima, o prompt do utilizador era uma simples consulta de texto que pode ser interpretada como um pedido de informação. Com prompts de instrução, podemos usar esse texto para especificar uma tarefa com mais detalhe, dando uma orientação mais clara à IA. Eis um exemplo:
| Prompt (Entrada) | Completamento (Saída) | Tipo de Instrução |
|---|---|---|
| Escreve uma descrição da Guerra Civil | devolveu um parágrafo simples | Simples |
| Escreve uma descrição da Guerra Civil. Indica datas e eventos importantes e descreve a sua relevância | devolveu um parágrafo seguido de uma lista de datas de eventos importantes com descrições | Complexa |
| Escreve uma descrição da Guerra Civil num parágrafo. Indica 3 pontos-chave com datas e a sua relevância. Indica mais 3 pontos-chave com figuras históricas e as suas contribuições. Devolve o resultado em formato JSON | devolve detalhes mais extensos numa caixa de texto, formatados em JSON que podes copiar para um ficheiro e validar se necessário | Complexa. Formatada. |
Nos exemplos acima, o prompt ainda era bastante aberto, permitindo ao LLM decidir que parte do seu conjunto de dados pré-treinado era relevante. Com o padrão de design de conteúdo principal, o texto de entrada é dividido em duas partes:
- uma instrução (ação)
- conteúdo relevante (que influencia a ação)
Eis um exemplo em que a instrução é "resume isto em 2 frases".
| Prompt (Entrada) | Completamento (Saída) |
|---|---|
| Júpiter é o quinto planeta a contar do Sol e o maior do Sistema Solar. É um gigante gasoso com uma massa mil vezes menor que a do Sol, mas duas vezes e meia a de todos os outros planetas do Sistema Solar juntos. Júpiter é um dos objetos mais brilhantes visíveis a olho nu no céu noturno, e é conhecido pelas civilizações antigas desde antes da história registada. O seu nome vem do deus romano Júpiter.[19] Visto da Terra, Júpiter pode ser suficientemente brilhante para a sua luz refletida projetar sombras visíveis,[20] e é, em média, o terceiro objeto natural mais brilhante no céu noturno, depois da Lua e de Vénus. Resume isto em 2 frases curtas |
Júpiter, o quinto planeta a contar do Sol, é o maior do Sistema Solar e é conhecido por ser um dos objetos mais brilhantes no céu noturno. Com o nome do deus romano Júpiter, é um gigante gasoso cuja massa é duas vezes e meia a de todos os outros planetas do Sistema Solar juntos. |
O segmento de conteúdo principal pode ser usado de várias formas para tornar as instruções mais eficazes:
- Exemplos – em vez de dizer ao modelo o que fazer com uma instrução explícita, dá-lhe exemplos do que fazer e deixa-o inferir o padrão.
- Cues (Indícios) – segue a instrução com um "indício" que prepara a resposta, guiando o modelo para respostas mais relevantes.
- Templates (Modelos) – são 'receitas' repetíveis para prompts com espaços reservados (variáveis) que podem ser personalizados com dados para casos de uso específicos.
Vamos ver estes casos em ação.
Esta é uma abordagem em que usas o conteúdo principal para "alimentar o modelo" com exemplos do resultado desejado para uma determinada instrução, deixando-o inferir o padrão para a saída pretendida. Dependendo do número de exemplos fornecidos, podemos ter zero-shot prompting, one-shot prompting, few-shot prompting, etc.
O prompt passa a ter três componentes:
- Uma descrição da tarefa
- Alguns exemplos do resultado desejado
- O início de um novo exemplo (que se torna uma descrição implícita da tarefa)
| Tipo de Aprendizagem | Prompt (Entrada) | Completamento (Saída) |
|---|---|---|
| Zero-shot | "The Sun is Shining". Translate to Spanish | "El Sol está brillando". |
| One-shot | "The Sun is Shining" => ""El Sol está brillando". "It's a Cold and Windy Day" => |
"Es un día frío y ventoso". |
| Few-shot | The player ran the bases => Baseball The player hit an ace => Tennis The player hit a six => Cricket The player made a slam-dunk => |
Basketball |
Repara como tivemos de dar uma instrução explícita ("Translate to Spanish") no zero-shot prompting, mas ela é inferida no exemplo one-shot. O exemplo few-shot mostra como, ao adicionar mais exemplos, os modelos conseguem fazer inferências mais precisas sem instruções adicionais.
Outra técnica para usar o conteúdo principal é fornecer indícios em vez de exemplos. Neste caso, estamos a dar ao modelo um empurrão na direção certa, começando com um excerto que reflete o formato de resposta desejado. O modelo depois "segue o indício" e continua nesse registo.
| Número de Indícios | Prompt (Entrada) | Completamento (Saída) |
|---|---|---|
| 0 | Júpiter é o quinto planeta a contar do Sol e o maior do Sistema Solar. É um gigante gasoso com uma massa mil vezes menor que a do Sol, mas duas vezes e meia a de todos os outros planetas do Sistema Solar juntos. Júpiter é um dos objetos mais brilhantes visíveis a olho nu no céu noturno, e é conhecido pelas civilizações antigas desde antes da história registada. |
Resumir Isto | Júpiter é o maior planeta do nosso Sistema Solar e o quinto a contar do Sol. É um gigante gasoso com uma massa equivalente a 1/1000 da do Sol, mas é mais pesado do que todos os outros planetas juntos. As civilizações antigas já conheciam Júpiter há muito tempo, e é facilmente visível no céu noturno. |
| 1 | Júpiter é o quinto planeta a contar do Sol e o maior do Sistema Solar. É um gigante gasoso com uma massa equivalente a um milésimo da do Sol, mas duas vezes e meia a de todos os outros planetas do Sistema Solar juntos. Júpiter é um dos objetos mais brilhantes visíveis a olho nu no céu noturno, e é conhecido pelas civilizações antigas desde antes da história registada.
Resumir Isto
O que aprendemos é que Júpiter | é o quinto planeta a contar do Sol e o maior do Sistema Solar. É um gigante gasoso com uma massa equivalente a um milésimo da do Sol, mas duas vezes e meia a de todos os outros planetas juntos. É facilmente visível a olho nu e é conhecido desde a Antiguidade. |
| 2 | Júpiter é o quinto planeta a contar do Sol e o maior do Sistema Solar. É um gigante gasoso com uma massa equivalente a um milésimo da do Sol, mas duas vezes e meia a de todos os outros planetas do Sistema Solar juntos. Júpiter é um dos objetos mais brilhantes visíveis a olho nu no céu noturno, e é conhecido pelas civilizações antigas desde antes da história registada.
Resumir Isto
Top 3 Factos Aprendidos: | 1. Júpiter é o quinto planeta a contar do Sol e o maior do Sistema Solar.
2. É um gigante gasoso com uma massa equivalente a um milésimo da do Sol...
3. Júpiter é visível a olho nu desde a Antiguidade ... |
| | | |
Um modelo de prompt é uma receita pré-definida para um prompt que pode ser guardada e reutilizada conforme necessário, para garantir experiências de utilizador mais consistentes em larga escala. Na sua forma mais simples, é apenas uma coleção de exemplos de prompts como este da OpenAI que fornece tanto os componentes interativos do prompt (mensagens do utilizador e do sistema) como o formato de pedido orientado por API - para facilitar a reutilização.
Numa forma mais complexa, como este exemplo do LangChain, contém espaços reservados que podem ser substituídos por dados de várias fontes (entrada do utilizador, contexto do sistema, fontes de dados externas, etc.) para gerar um prompt de forma dinâmica. Isto permite criar uma biblioteca de prompts reutilizáveis que podem ser usados para garantir experiências de utilizador consistentes programaticamente em escala.
Por fim, o verdadeiro valor dos modelos está na capacidade de criar e publicar bibliotecas de prompts para domínios de aplicação verticalizados - onde o modelo de prompt é agora optimizado para refletir o contexto ou exemplos específicos da aplicação, tornando as respostas mais relevantes e precisas para o público-alvo. O repositório Prompts For Edu é um excelente exemplo desta abordagem, ao reunir uma biblioteca de prompts para o domínio da educação com ênfase em objetivos-chave como planeamento de aulas, desenho curricular, tutoria de alunos, etc.
Se pensarmos na construção de prompts como tendo uma instrução (tarefa) e um alvo (conteúdo principal), então o conteúdo secundário é como contexto adicional que fornecemos para influenciar a resposta de alguma forma. Pode ser parâmetros de afinação, instruções de formatação, taxonomias de tópicos, etc., que ajudam o modelo a ajustar a sua resposta para se adequar aos objetivos ou expectativas do utilizador.
Por exemplo: Dado um catálogo de cursos com metadados extensos (nome, descrição, nível, etiquetas, instrutor, etc.) sobre todos os cursos disponíveis no currículo:
- podemos definir uma instrução para "resumir o catálogo de cursos para o Outono de 2023"
- podemos usar o conteúdo principal para fornecer alguns exemplos do resultado desejado
- podemos usar o conteúdo secundário para identificar as 5 principais "etiquetas" de interesse.
Agora, o modelo pode fornecer um resumo no formato mostrado pelos exemplos - mas se um resultado tiver várias etiquetas, pode dar prioridade às 5 identificadas no conteúdo secundário.
Agora que já sabemos como os prompts podem ser construídos, podemos começar a pensar em como desenhá-los para refletir as melhores práticas. Podemos pensar nisto em duas partes - ter a mentalidade certa e aplicar as técnicas certas.
A Engenharia de Prompts é um processo de tentativa e erro, por isso mantenha três grandes fatores orientadores em mente:
-
Compreensão do Domínio é Importante. A precisão e relevância das respostas depende do domínio em que a aplicação ou utilizador opera. Use a sua intuição e experiência no domínio para personalizar técnicas ainda mais. Por exemplo, defina personalidades específicas do domínio nos seus prompts de sistema, ou use modelos específicos do domínio nos seus prompts de utilizador. Forneça conteúdo secundário que reflita contextos do domínio, ou use pistas e exemplos do domínio para guiar o modelo para padrões de uso familiares.
-
Compreensão do Modelo é Importante. Sabemos que os modelos são estocásticos por natureza. Mas as implementações dos modelos também podem variar em termos do conjunto de dados de treino que usam (conhecimento pré-treinado), das capacidades que oferecem (por exemplo, via API ou SDK) e do tipo de conteúdo para o qual estão otimizados (por exemplo, código vs. imagens vs. texto). Compreenda os pontos fortes e limitações do modelo que está a usar, e use esse conhecimento para priorizar tarefas ou construir modelos personalizados otimizados para as capacidades do modelo.
-
Iteração & Validação são Importantes. Os modelos estão a evoluir rapidamente, tal como as técnicas de engenharia de prompts. Como especialista no domínio, pode ter outro contexto ou critérios para a sua aplicação específica, que podem não se aplicar à comunidade em geral. Use ferramentas e técnicas de engenharia de prompts para "dar o pontapé de saída" na construção de prompts, depois itere e valide os resultados usando a sua própria intuição e experiência. Registe os seus insights e crie uma base de conhecimento (por exemplo, bibliotecas de prompts) que possa ser usada como novo ponto de partida por outros, para iterações mais rápidas no futuro.
Vejamos agora algumas boas práticas recomendadas por profissionais da OpenAI e da Azure OpenAI.
| O quê | Porquê |
|---|---|
| Avalie os modelos mais recentes. | Novas gerações de modelos tendem a ter melhores funcionalidades e qualidade - mas também podem ter custos mais elevados. Avalie o impacto e só depois decida migrar. |
| Separe instruções e contexto | Verifique se o seu modelo/fornecedor define delimitadores para distinguir instruções, conteúdo principal e secundário de forma mais clara. Isto pode ajudar os modelos a atribuir pesos mais precisos aos tokens. |
| Seja específico e claro | Dê mais detalhes sobre o contexto desejado, resultado, comprimento, formato, estilo, etc. Isto melhora a qualidade e consistência das respostas. Guarde receitas em modelos reutilizáveis. |
| Seja descritivo, use exemplos | Os modelos podem responder melhor a uma abordagem de "mostrar e explicar". Comece com uma abordagem zero-shot onde dá apenas uma instrução (sem exemplos) e depois tente few-shot como refinamento, fornecendo alguns exemplos do resultado. Use analogias. |
| Use pistas para iniciar respostas | Dê um empurrão na direção do resultado desejado, fornecendo algumas palavras ou frases iniciais que o modelo possa usar como ponto de partida para a resposta. |
| Reforce a instrução | Por vezes pode ser necessário repetir a instrução ao modelo. Dê instruções antes e depois do conteúdo principal, use uma instrução e uma pista, etc. Itere e valide para ver o que resulta melhor. |
| A ordem importa | A ordem em que apresenta a informação ao modelo pode influenciar o resultado, mesmo nos exemplos de aprendizagem, devido ao viés de recência. Experimente diferentes opções para ver o que funciona melhor. |
| Dê ao modelo uma “escapatória” | Dê ao modelo uma resposta de reserva que possa fornecer caso não consiga completar a tarefa por algum motivo. Isto pode reduzir a probabilidade de respostas falsas ou inventadas. |
Como em qualquer boa prática, lembre-se que os resultados podem variar consoante o modelo, a tarefa e o domínio. Use estas recomendações como ponto de partida e itere para encontrar o que funciona melhor para si. Reavalie constantemente o seu processo de engenharia de prompts à medida que surgem novos modelos e ferramentas, com foco na escalabilidade do processo e na qualidade das respostas.
Parabéns! Chegou ao fim da lição! Está na altura de pôr alguns destes conceitos e técnicas à prova com exemplos reais!
Para o nosso exercício, vamos usar um Jupyter Notebook com exercícios que pode completar de forma interativa. Também pode estender o Notebook com as suas próprias células Markdown e de Código para explorar ideias e técnicas por si.
- (Recomendado) Inicie o GitHub Codespaces
- (Em alternativa) Clone o repositório para o seu dispositivo local e use-o com o Docker Desktop
- (Em alternativa) Abra o Notebook no seu ambiente de execução de Notebooks preferido.
- Copie o ficheiro
.env.copyna raiz do repositório para.enve preencha os valoresAZURE_OPENAI_API_KEY,AZURE_OPENAI_ENDPOINTeAZURE_OPENAI_DEPLOYMENT. Volte à secção Learning Sandbox para saber como.
- Selecione o kernel de execução. Se usar as opções 1 ou 2, basta selecionar o kernel Python 3.10.x por defeito fornecido pelo dev container.
Está tudo pronto para executar os exercícios. Note que aqui não há respostas certas ou erradas - trata-se apenas de explorar opções por tentativa e erro e construir intuição sobre o que funciona para um determinado modelo e domínio de aplicação.
Por este motivo, não há segmentos de Solução de Código nesta lição. Em vez disso, o Notebook terá células Markdown intituladas "A Minha Solução:" que mostram um exemplo de saída para referência.
Qual dos seguintes é um bom prompt seguindo algumas boas práticas razoáveis?
- Mostra-me uma imagem de um carro vermelho
- Mostra-me uma imagem de um carro vermelho da marca Volvo e modelo XC90 estacionado junto a uma falésia com o sol a pôr-se
- Mostra-me uma imagem de um carro vermelho da marca Volvo e modelo XC90
R: 2, é o melhor prompt pois fornece detalhes sobre o "quê" e vai ao pormenor (não é apenas um carro qualquer, mas uma marca e modelo específicos) e também descreve o cenário geral. O 3 é o seguinte melhor, pois também contém bastante descrição.
Vê se consegues usar a técnica da "pista" com o prompt: Completa a frase "Mostra-me uma imagem de um carro vermelho da marca Volvo e ". O que responde o modelo, e como o melhorarias?
Queres aprender mais sobre diferentes conceitos de Engenharia de Prompts? Vai à página de aprendizagem contínua para encontrares outros ótimos recursos sobre este tema.
Segue para a Lição 5 onde vamos explorar técnicas avançadas de prompting!
Aviso Legal: Este documento foi traduzido utilizando o serviço de tradução por IA Co-op Translator. Embora nos esforcemos pela precisão, esteja ciente de que traduções automáticas podem conter erros ou imprecisões. O documento original na sua língua nativa deve ser considerado a fonte autorizada. Para informações críticas, recomenda-se a tradução profissional humana. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas resultantes do uso desta tradução.







