Promoção da engenharia
Este guia compartilha estratégias e táticas para obter melhores resultados a partir de grandes modelos de linguagem (às vezes referidos como modelos GPT), como o GPT-4. Os métodos descritos aqui às vezes podem ser combinados para um efeito maior. Encorajamos a experimentação para encontrar os métodos que funcionam melhor para você.
Algumas das demonstrações aqui atualmente funcionam apenas com o nosso modelo mais capaz, gpt-4
. Em geral, se você perceber que um modelo falha em uma tarefa e um modelo mais capaz estiver disponível, muitas vezes vale a pena tentar novamente com o modelo mais capaz.
Dicas: Este tutorial é uma tradução do Guia de Engenharia de Dicas oficial da OpenAI. O tutorial explica a estratégia/táticas de escrever palavras de dicas e como instruir o LLM a retornar o resultado desejado através da inscrição.
Seis estratégias para obter melhores resultados
Escrever instruções claras
Esses modelos não podem ler a sua mente. Se as saídas forem muito longas, peça por respostas breves. Se as saídas forem muito simples, peça por escrita de nível especialista. Se você não gostar do formato, demonstre o formato que gostaria de ver. Quanto menos o modelo tiver que adivinhar o que você quer, mais provável é que você consiga.
Táticas:
- Incluir detalhes na sua consulta para obter respostas mais relevantes
- Pedir para o modelo adotar uma persona
- Usar delimitadores para indicar claramente partes distintas da entrada
- Especificar os passos necessários para completar uma tarefa
- Fornecer exemplos
- Especificar o comprimento desejado da saída
Fornecer texto de referência
Os modelos de linguagem podem inventar respostas falsas com confiança, especialmente quando solicitados sobre tópicos esotéricos ou para citações e URLs. Da mesma forma que uma folha de anotações pode ajudar um aluno a se sair melhor em um teste, fornecer texto de referência para esses modelos pode ajudar a responder com menos fabricações.
Táticas:
- Instruir o modelo a responder usando um texto de referência
- Instruir o modelo a responder com citações de um texto de referência
Dividir tarefas complexas em subtarefas mais simples
Assim como é uma boa prática em engenharia de software decompor um sistema complexo em um conjunto de componentes modulares, o mesmo é válido para tarefas submetidas a um modelo de linguagem. Tarefas complexas tendem a ter taxas de erro mais altas do que tarefas mais simples. Além disso, tarefas complexas frequentemente podem ser redefinidas como um fluxo de trabalho de tarefas mais simples, onde as saídas das tarefas anteriores são usadas para construir as entradas das tarefas posteriores.
Táticas:
- Usar classificação de intenção para identificar as instruções mais relevantes para uma consulta do usuário
- Para aplicações de diálogo que exigem conversas muito longas, resumir ou filtrar diálogos anteriores
- Resumir documentos longos de forma segmentada e construir um resumo completo de forma recursiva
Dar ao modelo tempo para "pensar"
Se solicitado a multiplicar 17 por 28, você pode não saber instantaneamente, mas ainda consegue trabalhar nisso com o tempo. Da mesma forma, os modelos cometem mais erros de raciocínio ao tentar responder imediatamente, ao invés de deliberar sobre uma resposta. Solicitar uma "cadeia de pensamento" antes de uma resposta pode ajudar o modelo a raciocinar de forma mais confiável em direção a respostas corretas.
Táticas:
- Instruir o modelo a trabalhar em sua própria solução antes de chegar a uma conclusão
- Usar um monólogo interno ou uma sequência de consultas para esconder o processo de raciocínio do modelo
- Perguntar ao modelo se ele perdeu algo em passagens anteriores
Utilizar ferramentas externas
Compense as fraquezas do modelo fornecendo a ele as saídas de outras ferramentas. Por exemplo, um sistema de recuperação de texto (às vezes chamado de RAG ou geração aumentada de recuperação) pode informar o modelo sobre documentos relevantes. Um mecanismo de execução de código como o Interprete de Código da OpenAI pode ajudar o modelo a fazer cálculos matemáticos e executar código. Se uma tarefa pode ser feita de forma mais confiável ou eficientemente por uma ferramenta em vez de por um modelo de linguagem, repasse-a para obter o melhor dos dois mundos.
Táticas:
- Utilizar busca baseada em embeddings para implementar recuperação eficiente de conhecimento
- Utilizar a execução de código para realizar cálculos mais precisos ou chamar APIs externas
- Dar ao modelo acesso a funções específicas
Testar mudanças sistematicamente
Melhorar o desempenho é mais fácil se você puder medi-lo. Em alguns casos, uma modificação em uma prompt pode alcançar um desempenho melhor em alguns exemplos isolados, mas levar a um desempenho geral pior em um conjunto mais representativo de exemplos. Portanto, para ter certeza de que uma mudança é positiva para o desempenho, pode ser necessário definir um conjunto de testes abrangente (também conhecido como "avaliação").
Tática:
- Avaliar as saídas do modelo em relação a respostas de referência padrão
Táticas
Cada uma das estratégias listadas acima pode ser implementada com táticas específicas. Estas táticas são destinadas a fornecer ideias para tentar. Elas de forma alguma são completamente abrangentes, e você deve se sentir à vontade para tentar ideias criativas que não estejam representadas aqui.
Descrição do exemplo de palavra de comando
Todos sabemos que a API do modelo de chat que chama a OpenAI tem três tipos de mensagens, SISTEMA, USUÁRIO e ASSISTENTE, e as funções dessas três mensagens são as seguintes:
Tipo de mensagem (correspondente ao parâmetro de função da api) | Descrição |
---|---|
SISTEMA | A mensagem do sistema ajuda a definir o comportamento do assistente. Por exemplo, você pode modificar a personalidade do assistente ou fornecer instruções específicas sobre como ele deve se comportar ao longo da conversa. No entanto, observe que a mensagem do sistema é opcional e o comportamento do modelo sem uma mensagem do sistema provavelmente será semelhante ao uso de uma mensagem genérica, como "Você é um assistente prestativo." |
USUÁRIO | Uma mensagem do usuário é uma questão de entrada do usuário. |
ASSISTENTE | As mensagens de ajuda representam o que o GPT retorna. |
Os exemplos de palavras de comando neste tutorial serão explicados no seguinte formato:
// Mensagem do SISTEMA
Isso mostra como definir a palavra de comando da mensagem do SISTEMA.
// Mensagem do USUÁRIO
Isso mostra como definir a palavra de comando da mensagem do USUÁRIO.
// Mensagem do ASSISTENTE
Isso demonstra o que o GPT pode retornar.
Estratégia: Escreva instruções claras
Tática: Inclua detalhes em sua consulta para obter respostas mais relevantes
Para obter uma resposta altamente relevante, certifique-se de que as solicitações forneçam quaisquer detalhes ou contexto importantes. Caso contrário, você estará deixando a decisão para o modelo adivinhar o que você quer dizer.
Pior | Melhor |
Como adiciono números no Excel? | Como faço para somar uma linha de valores em dólar no Excel? Eu quero fazer isso automaticamente para uma planilha inteira com todos os totais terminando à direita em uma coluna chamada "Total". |
Quem é o presidente? | Quem foi o presidente do México em 2021 e com que frequência ocorrem as eleições? |
Escreva código para calcular a sequência de Fibonacci. | Escreva uma função TypeScript para calcular eficientemente a sequência de Fibonacci. Comente o código liberalmente para explicar o que cada parte faz e por que foi escrito dessa maneira. |
Resuma as notas da reunião. | Resuma as notas da reunião em um único parágrafo. Em seguida, escreva uma lista em markdown dos palestrantes e cada um de seus pontos-chave. Finalmente, liste as próximas etapas ou tarefas sugeridas pelos palestrantes, se houver alguma. |
Tática: Peça para o modelo adotar uma persona
A mensagem do sistema pode ser usada para especificar a persona usada pelo modelo em suas respostas.
// Mensagem do SISTEMA
Quando peço ajuda para escrever algo, você responderá com um documento que contenha pelo menos uma piada ou comentário divertido em cada parágrafo.
// Mensagem do USUÁRIO
Escreva uma nota de agradecimento ao meu fornecedor de parafusos de aço por fazer a entrega no prazo e com aviso prévio curto. Isso possibilitou que entregássemos um pedido importante.
Tática: Use delimitadores para indicar claramente partes distintas da entrada
Delimitadores como aspas triplas, tags XML, títulos de seção, etc., podem ajudar a demarcar partes de texto a serem tratadas de forma diferente.
// Mensagem do USUÁRIO
Resuma o texto delimitado por aspas triplas com um haicai.
"""insira o texto aqui"""
// Mensagem do SISTEMA
Você receberá um par de artigos (delimitado com tags XML) sobre o mesmo tópico. Primeiro, resuma os argumentos de cada artigo. Em seguida, indique qual deles faz um melhor argumento e explique o motivo.
// Mensagem do USUÁRIO
<article> insira o primeiro artigo aqui </article>
<article> insira o segundo artigo aqui </article>
// Mensagem do SISTEMA
Você receberá um resumo de tese e um título sugerido para ela. O título da tese deve dar ao leitor uma boa ideia do tópico da tese, mas também deve ser chamativo. Se o título não atender a esses critérios, sugira 5 alternativas.
// Mensagem do USUÁRIO
Resumo: insira o resumo aqui
Título: insira o título aqui
Para tarefas diretas como essas, o uso de delimitadores pode não fazer diferença na qualidade de saída. No entanto, quanto mais complexa for a tarefa, mais importante é desambiguar os detalhes da tarefa. Não faça o modelo trabalhar para entender exatamente o que você está pedindo a ele.
Tática: Especificar as etapas necessárias para concluir uma tarefa
Algumas tarefas são melhor especificadas como uma sequência de passos. Escrever os passos explicitamente pode facilitar o modelo a segui-los.
// Mensagem do SISTEMA
Use as seguintes instruções passo a passo para responder às entradas do usuário.
Passo 1 - O usuário irá fornecer a você um texto entre aspas triplas. Resuma este texto em uma frase com um prefixo que diz "Resumo: ".
Passo 2 - Traduza o resumo do Passo 1 para Espanhol, com um prefixo que diz "Tradução: ".
// Mensagem do USUÁRIO
"""insira o texto aqui"""
Tática: Fornecer exemplos
Fornecer instruções gerais que se aplicam a todos os exemplos geralmente é mais eficiente do que demonstrar todas as permutações de uma tarefa por exemplo, mas em alguns casos fornecer exemplos pode ser mais fácil. Por exemplo, se pretende que o modelo copie um estilo específico de responder a consultas de usuário que é difícil de descrever explicitamente. Isso é conhecido como "few-shot" prompting.
// Mensagem do SISTEMA
Responda em um estilo consistente.
// Mensagem do USUÁRIO
Me ensine sobre a paciência.
// Mensagem do ASSISTENTE
O rio que esculpe o vale mais profundo flui de uma fonte modesta; a mais grandiosa sinfonia tem origem numa única nota; a tapeçaria mais intricada começa com um fio solitário.
// Mensagem do USUÁRIO
Me ensine sobre o oceano.
Tática: Especificar o comprimento desejado da saída
Você pode pedir ao modelo para produzir saídas que tenham um comprimento alvo específico. O comprimento alvo pode ser especificado em termos de contagem de palavras, frases, parágrafos, marcadores, etc. No entanto, observe que instruir o modelo para gerar um número específico de palavras não funciona com alta precisão. O modelo pode gerar saídas de forma mais confiável com um número específico de parágrafos ou marcadores.
// Mensagem do USUÁRIO
Resuma o texto delimitado por aspas triplas em cerca de 50 palavras.
"""insira o texto aqui"""
// Mensagem do USUÁRIO
Resuma o texto delimitado por aspas triplas em 2 parágrafos.
"""insira o texto aqui"""
// Mensagem do USUÁRIO
Resuma o texto delimitado por aspas triplas em 3 marcadores.
"""insira o texto aqui"""
Estratégia: Fornecer texto de referência
Tática: Instruir o modelo a responder usando um texto de referência
Se pudermos fornecer ao modelo informações confiáveis que são relevantes para a consulta atual, então podemos instruir o modelo a usar as informações fornecidas para compor sua resposta.
// Mensagem do SISTEMA
Use os artigos fornecidos delimitados por aspas triplas para responder às perguntas. Se a resposta não puder ser encontrada nos artigos, escreva "Não consegui encontrar uma resposta".
// Mensagem do USUÁRIO
<inserir artigos, cada um delimitado por aspas triplas>
Pergunta: <inserir pergunta aqui>
Dado que todos os modelos têm janelas de contexto limitadas, precisamos de alguma forma de pesquisar dinamicamente informações relevantes para a pergunta feita. Embutimentos podem ser usados para implementar uma recuperação eficiente do conhecimento. Veja a tática "Usar pesquisa baseada em embeddings para implementar uma recuperação eficiente do conhecimento" para mais detalhes sobre como implementar isso.
Tática: Instruir o modelo a responder com citações de um texto de referência
Se o input foi complementado com conhecimento relevante, é direto solicitar que o modelo adicione citações às suas respostas referenciando trechos dos documentos fornecidos. Note que as citações na saída podem então ser verificadas programaticamente por meio de correspondência de strings nos documentos fornecidos.
// Mensagem do SISTEMA
Você receberá um documento delimitado por aspas triplas e uma pergunta. Sua tarefa é responder à pergunta usando apenas o documento fornecido e citar o(s) trecho(s) relevante(s) do documento usado para responder à pergunta. Se o documento não contiver as informações necessárias para responder a esta pergunta, simplesmente escreva: "Informação insuficiente". Se uma resposta à pergunta for fornecida, ela deve ser anotada com uma citação. Use o seguinte formato para citar trechos relevantes ({"citação": …}).
// Mensagem do USUÁRIO
"""<inserir documento aqui>"""
Pergunta: <inserir pergunta aqui>
Tática: Utilizar classificação de intenção para identificar as instruções mais relevantes para uma consulta do usuário
Para tarefas nas quais muitos conjuntos independentes de instruções são necessários para lidar com diferentes casos, pode ser benéfico primeiro classificar o tipo de consulta e usar essa classificação para determinar quais instruções são necessárias. Isso pode ser alcançado definindo categorias fixas e codificando instruções relevantes para lidar com tarefas em uma determinada categoria. Esse processo também pode ser aplicado recursivamente para decompor uma tarefa em uma sequência de estágios. A vantagem desse enfoque é que cada consulta conterá apenas as instruções necessárias para realizar a próxima etapa de uma tarefa, o que pode resultar em taxas de erro mais baixas em comparação com o uso de uma única consulta para realizar a tarefa inteira. Isso também pode resultar em custos mais baixos, já que prompts maiores custam mais para serem executados.
Suponha, por exemplo, que, para um aplicativo de serviço ao cliente, consultas poderiam ser utilmente classificadas da seguinte maneira:
// Mensagem do SISTEMA
Você receberá consultas de serviço ao cliente. Classifique cada consulta em uma categoria primária e em uma categoria secundária. Forneça sua saída no formato json com as chaves: primária e secundária.
Categorias primárias: Faturamento, Suporte Técnico, Gerenciamento de Conta ou Consulta Geral.
Categorias secundárias de Faturamento:
- Cancelar inscrição ou atualizar
- Adicionar um método de pagamento
- Explicação para a cobrança
- Contestar uma cobrança
Categorias secundárias de Suporte Técnico:
- Solução de problemas
- Compatibilidade de dispositivos
- Atualizações de software
Categorias secundárias de Gerenciamento de Conta:
- Redefinir senha
- Atualizar informações pessoais
- Encerrar conta
- Segurança da conta
Categorias secundárias de Consulta Geral:
- Informações sobre o produto
- Preços
- Feedback
- Falar com um humano
// Mensagem do USUÁRIO
Eu preciso fazer minha internet funcionar novamente.
Com base na classificação da consulta do cliente, um conjunto de instruções mais específicas podem ser fornecidas a um modelo para lidar com as próximas etapas. Por exemplo, suponha que o cliente necessite de ajuda com "solução de problemas".
// Mensagem do SISTEMA
Você receberá consultas de atendimento ao cliente que requerem solução de problemas em um contexto de suporte técnico. Ajude o usuário:
- Pergunte a ele para verificar se todos os cabos do roteador estão conectados. Observe que é comum os cabos se soltarem ao longo do tempo.
- Se todos os cabos estiverem conectados e o problema persistir, pergunte a ele qual modelo de roteador está utilizando.
- Agora você irá orientá-lo sobre como reiniciar o dispositivo:
-- Se o número do modelo for MTD-327J, oriente-o a pressionar o botão vermelho e segurá-lo por 5 segundos, depois aguardar 5 minutos antes de testar a conexão.
-- Se o número do modelo for MTD-327S, oriente-o a desconectar e reconectar, depois aguardar 5 minutos antes de testar a conexão.
- Se o problema do cliente persistir após reiniciar o dispositivo e aguardar 5 minutos, encaminhe-o para o suporte de TI emitindo {"Solicitação de suporte de TI"}.
- Se o usuário começar a fazer perguntas que não estão relacionadas a este tópico, confirme se eles gostariam de encerrar o bate-papo atual sobre solução de problemas e classificar sua solicitação de acordo com o seguinte esquema:
<inserir esquema de classificação primária/secundária acima aqui>
// Mensagem do USUÁRIO
Eu preciso fazer minha internet funcionar novamente.
Observe que foi instruído que o modelo emita strings especiais para indicar quando o estado da conversa muda. Isso nos permite transformar nosso sistema em uma máquina de estados onde o estado determina quais instruções são inseridas. Ao acompanhar o estado, quais instruções são relevantes nesse estado e também opcionalmente quais transições de estado são permitidas a partir desse estado, podemos colocar limites ao redor da experiência do usuário que seriam difíceis de alcançar com uma abordagem menos estruturada.
Tática: Para aplicativos de diálogo que requerem conversas muito longas, resumir ou filtrar diálogos anteriores
Como os modelos têm um comprimento de contexto fixo, o diálogo entre um usuário e um assistente, no qual a conversa inteira está incluída na janela de contexto, não pode continuar indefinidamente.
Existem várias soluções para esse problema, uma das quais é resumir turnos anteriores na conversa. Uma vez que o tamanho da entrada atinja um comprimento de limite pré-determinado, isso poderia acionar uma consulta que resume parte da conversa e o resumo da conversa anterior poderia ser incluído como parte da mensagem do sistema. Alternativamente, a conversa anterior poderia ser resumida de forma assíncrona em segundo plano durante toda a conversa.
Uma solução alternativa é selecionar dinamicamente partes anteriores da conversa que são mais relevantes para a consulta atual. Consulte a tática "Usar pesquisa baseada em embeddings para implementar recuperação eficiente de conhecimento".
Tática: Resumir documentos longos de forma segmentada e construir um resumo completo de forma recursiva
Como os modelos têm um comprimento de contexto fixo, eles não podem ser usados para resumir um texto mais longo do que o comprimento do contexto menos o comprimento do resumo gerado em uma única consulta.
Para resumir um documento muito longo, como um livro, podemos usar uma sequência de consultas para resumir cada seção do documento. Os resumos das seções podem ser concatenados e resumidos, produzindo resumos dos resumos. Esse processo pode prosseguir de forma recursiva até que um documento inteiro seja resumido. Se for necessário usar informações sobre seções anteriores para dar sentido a seções posteriores, então um truque adicional que pode ser útil é incluir um resumo contínuo do texto que precede qualquer ponto no livro ao resumir o conteúdo nesse ponto. A eficácia desse procedimento para resumir livros foi estudada em pesquisas anteriores pela OpenAI usando variantes do GPT-3.
Estratégia: Dar tempo aos modelos para "pensar"
Tática: Instruir o modelo a elaborar sua própria solução antes de chegar a uma conclusão
Às vezes obtemos melhores resultados quando instruímos explicitamente o modelo a raciocinar a partir de primeiros princípios antes de chegar a uma conclusão. Suponha, por exemplo, que queremos que um modelo avalie a solução de um aluno para um problema de matemática. A maneira mais óbvia de abordar isso é simplesmente perguntar ao modelo se a solução do aluno está correta ou não.
// Mensagem do SISTEMA
Determine se a solução do aluno está correta ou não.
// Mensagem do USUÁRIO
Declaração do Problema: Estou construindo uma instalação de energia solar e preciso de ajuda para calcular os aspectos financeiros.
- O custo do terreno é de $100 por pé quadrado
- Eu posso comprar painéis solares por $250 por pé quadrado
- Eu negociei um contrato de manutenção que custará um valor fixo de $100.000 por ano, e mais $10 por pé quadrado
Qual é o custo total para o primeiro ano de operações como uma função do número de pés quadrados.
Solução do Aluno: Deixe x ser o tamanho da instalação em pés quadrados.
1. Custo do terreno: 100x
2. Custo dos painéis solares: 250x
3. Custo de manutenção: 100.000 + 100x
Custo total: 100x + 250x + 100.000 + 100x = 450x + 100.000
// Mensagem do ASSISTENTE
A solução do aluno está correta.
Mas na verdade, a solução do aluno não está correta! Podemos fazer com que o modelo perceba isso com sucesso, solicitando que o modelo gere sua própria solução primeiro.
// Mensagem do SISTEMA
Primeiro, elabore sua própria solução para o problema. Em seguida, compare sua solução com a solução do aluno e avalie se a solução do aluno está correta ou não. Não decida se a solução do aluno está correta até que tenha resolvido o problema você mesmo.
// Mensagem do USUÁRIO
Declaração do Problema: Estou construindo uma instalação de energia solar e preciso de ajuda para calcular os aspectos financeiros.
- O custo do terreno é de $100 por pé quadrado
- Eu posso comprar painéis solares por $250 por pé quadrado
- Eu negociei um contrato de manutenção que custará um valor fixo de $100.000 por ano, e mais $10 por pé quadrado
Qual é o custo total para o primeiro ano de operações como uma função do número de pés quadrados.
Solução do Aluno: Deixe x ser o tamanho da instalação em pés quadrados.
1. Custo do terreno: 100x
2. Custo dos painéis solares: 250x
3. Custo de manutenção: 100.000 + 100x
Custo total: 100x + 250x + 100.000 + 100x = 450x + 100.000
// Mensagem do ASSISTENTE
Deixe x ser o tamanho da instalação em pés quadrados.
1. Custo do terreno: 100x
2. Custo dos painéis solares: 250x
3. Custo de manutenção: 100.000 + 10x
Custo total: 100x + 250x + 100.000 + 10x = 360x + 100.000
A solução do aluno está incorreta. Eles cometeram um erro no cálculo do custo de manutenção, usando 100x em vez de 10x. O custo total correto para o primeiro ano de operações é 360x + 100.000.
Tática: Utilizar o monólogo interior ou uma sequência de perguntas para ocultar o processo de raciocínio do modelo
A tática anterior demonstra que, às vezes, é importante para o modelo raciocinar detalhadamente sobre um problema antes de responder a uma pergunta específica. Para algumas aplicações, o processo de raciocínio que um modelo utiliza para chegar a uma resposta final seria inadequado para compartilhar com o usuário. Por exemplo, em aplicações de tutoria, podemos querer incentivar os alunos a trabalhar em suas próprias respostas, mas o processo de raciocínio de um modelo sobre a solução do aluno poderia revelar a resposta para o aluno.
O monólogo interior é uma tática que pode ser usada para mitigar isso. A ideia do monólogo interior é instruir o modelo a colocar partes da saída que devem ser ocultadas do usuário em um formato estruturado que facilite sua interpretação. Então, antes de apresentar a saída ao usuário, a saída é interpretada e apenas parte dela é tornada visível.
// Mensagem do SISTEMA
Siga estes passos para responder às consultas do usuário.
Passo 1 - Primeiro, trabalhe na sua própria solução para o problema. Não confie na solução do aluno, pois ela pode estar incorreta. Inclua todo o seu trabalho para este passo entre aspas triplas (""").
Passo 2 - Compare sua solução com a solução do aluno e avalie se a solução do aluno está correta ou não. Inclua todo o seu trabalho para este passo entre aspas triplas (""").
Passo 3 - Se o aluno cometeu um erro, determine que dica você poderia dar ao aluno sem revelar a resposta. Inclua todo o seu trabalho para este passo entre aspas triplas (""").
Passo 4 - Se o aluno cometeu um erro, forneça a dica do passo anterior ao aluno (fora das aspas triplas). Em vez de escrever "Passo 4 - ...", escreva "Dica:".
// Mensagem do USUÁRIO
Enunciado do Problema: <inserir enunciado do problema>
Solução do Aluno: <inserir a solução do aluno>
Alternativamente, isso pode ser alcançado com uma sequência de perguntas, em que todas, exceto a última, têm sua saída oculta do usuário final.
Em primeiro lugar, podemos pedir ao modelo para resolver o problema por conta própria. Como esta consulta inicial não requer a solução do aluno, ela pode ser omitida. Isso traz a vantagem adicional de que não há chance de a solução do modelo ser influenciada pela solução tentada do aluno.
// Mensagem do USUÁRIO
<inserir enunciado do problema>
Em seguida, podemos fazer com que o modelo utilize todas as informações disponíveis para avaliar a correção da solução do aluno.
// Mensagem do SISTEMA
Compare sua solução com a solução do aluno e avalie se a solução do aluno está correta ou não.
// Mensagem do USUÁRIO
Enunciado do problema: """<inserir enunciado do problema>"""
Sua solução: """<inserir solução gerada pelo modelo>"""
Solução do aluno: """<inserir solução do aluno>"""
Finalmente, podemos permitir que o modelo utilize sua própria análise para construir uma resposta na persona de um tutor prestativo.
// Mensagem do SISTEMA
Você é um tutor de matemática. Se o aluno cometeu um erro, ofereça uma dica ao aluno de forma que não revele a resposta. Se o aluno não cometeu um erro, simplesmente ofereça a ele um comentário encorajador.
// Mensagem do USUÁRIO
Enunciado do problema: """<inserir enunciado do problema>"""
Sua solução: """<inserir solução gerada pelo modelo>"""
Solução do aluno: """<inserir solução do aluno>"""
Análise: """<inserir análise gerada pelo modelo a partir do passo anterior>"""
Tática: Perguntar ao modelo se ele perdeu alguma coisa nas passagens anteriores
Suponha que estamos usando um modelo para listar trechos de uma fonte que são relevantes para uma pergunta específica. Após listar cada trecho, o modelo precisa determinar se deve começar a escrever outro ou se deve parar. Se o documento de origem for extenso, é comum que um modelo pare muito cedo e deixe de listar todos os trechos relevantes. Nesse caso, um melhor desempenho geralmente pode ser obtido fazendo com que o modelo forneça consultas de acompanhamento para encontrar quaisquer trechos que tenha perdido em passagens anteriores.
// Mensagem do SISTEMA
Você receberá um documento delimitado por aspas triplas. Sua tarefa é selecionar trechos que dizem respeito à seguinte pergunta: "Quais mudanças significativas de paradigma ocorreram na história da inteligência artificial".
Certifique-se de que os trechos contenham todo o contexto relevante necessário para interpretá-los - em outras palavras, não extraia pequenos trechos que estejam sem contexto importante. Forneça a saída no formato JSON da seguinte forma:
[{"trecho": "..."},
...
{"trecho": "..."}]
// Mensagem do USUÁRIO
"""<inserir documento aqui>"""
// Mensagem do ASSISTENTE
[{"trecho": "o modelo escreve um trecho aqui"},
...
{"trecho": "o modelo escreve outro trecho aqui"}]
// Mensagem do USUÁRIO
Existem mais trechos relevantes? Tome cuidado para não repetir trechos. Além disso, certifique-se de que os trechos contenham todo o contexto relevante necessário para interpretá-los - em outras palavras, não extraia pequenos trechos que estejam sem contexto importante.
Estratégia: Utilizar ferramentas externas
Tática: Utilizar busca baseada em embeddings para implementar recuperação eficiente de conhecimento
Um modelo pode aproveitar fontes externas de informação se forem fornecidas como parte de sua entrada. Isso pode ajudar o modelo a gerar respostas mais informadas e atualizadas. Por exemplo, se um usuário fizer uma pergunta sobre um filme específico, pode ser útil adicionar informações de alta qualidade sobre o filme (por exemplo, atores, diretores, etc.) à entrada do modelo. Os embeddings podem ser usados para implementar recuperação eficiente de conhecimento, para que informações relevantes possam ser adicionadas à entrada do modelo dinamicamente em tempo de execução.
Um embedding de texto é um vetor que pode medir a relação entre strings de texto. Strings similares ou relevantes estarão mais próximas do que strings não relacionadas. Esse fato, juntamente com a existência de algoritmos rápidos de busca de vetores, significa que os embeddings podem ser usados para implementar recuperação eficiente de conhecimento. Em particular, um corpus de texto pode ser dividido em pedaços, e cada pedaço pode ser incorporado e armazenado. Então, uma consulta dada pode ser incorporada e uma busca vetorial pode ser realizada para encontrar os pedaços de texto incorporados do corpus que estão mais relacionados à consulta (ou seja, mais próximos no espaço de embedding).
Tática: Utilizar a execução de código para realizar cálculos mais precisos ou chamar APIs externas
Os modelos de linguagem não podem ser confiáveis para realizar cálculos aritméticos ou longos com precisão por conta própria. Em casos em que isso é necessário, um modelo pode ser instruído a escrever e executar código em vez de realizar seus próprios cálculos. Em particular, um modelo pode ser instruído a colocar código que deve ser executado em um formato designado, como três apóstrofos. Após a produção de um resultado, o código pode ser extraído e executado. Por fim, se necessário, a saída do mecanismo de execução de código (ou seja, interpretador Python) pode ser fornecida como entrada para o modelo na próxima consulta.
// Mensagem do SISTEMA
Você pode escrever e executar código Python envolvendo-o em três apóstrofos, por exemplo, ```código aqui```. Use isso para fazer cálculos.
// Mensagem do USUÁRIO
Encontre todas as raízes de valor real do seguinte polinômio: 3*x**5 - 5*x**4 - 3*x**3 - 7*x - 10.
Outro caso de uso útil para a execução de código é chamar APIs externas. Se um modelo for instruído no uso adequado de uma API, ele pode escrever código que a utilize. Um modelo pode ser instruído sobre como usar uma API fornecendo documentação e/ou exemplos de código que mostrem como usar a API.
// Mensagem do SISTEMA
Você pode escrever e executar código Python envolvendo-o em três apóstrofos. Além disso, observe que você tem acesso ao seguinte módulo para ajudar os usuários a enviar mensagens para seus amigos:
\`\`\`python
import mensagem
mensagem.escrever(para="João", mensagem="Ei, quer se encontrar depois do trabalho?")\`\`\`
ATENÇÃO: Executar código produzido por um modelo não é inerentemente seguro e precauções devem ser tomadas em qualquer aplicação que busque fazer isso. Em particular, um ambiente de execução de código isolado é necessário para limitar o dano que o código não confiável poderia causar.
Tática: Dar ao modelo acesso a funções específicas
A API de Completude de Chat permite passar uma lista de descrições de funções em solicitações. Isso permite que os modelos gerem argumentos de função de acordo com os esquemas fornecidos. Os argumentos de função gerados são retornados pela API no formato JSON e podem ser usados para executar chamadas de função. A saída fornecida pelas chamadas de função pode então ser alimentada de volta a um modelo na próxima solicitação para fechar o ciclo. Esta é a maneira recomendada de usar os modelos OpenAI para chamar funções externas.
Estratégia: Testar mudanças de forma sistemática
Às vezes pode ser difícil saber se uma mudança — por exemplo, uma nova instrução ou um novo design — torna o seu sistema melhor ou pior. Observar alguns exemplos pode dar uma ideia de qual é melhor, mas com tamanhos de amostra pequenos pode ser difícil distinguir entre uma melhoria real ou apenas sorte aleatória. Talvez a mudança melhore o desempenho em algumas entradas, mas prejudique o desempenho em outras.
Procedimentos de avaliação (ou "avaliações") são úteis para otimizar os designs de sistemas. Boas avaliações são:
- Representativas do uso no mundo real (ou pelo menos diversas)
- Contêm muitos casos de teste para maior poder estatístico (veja a tabela abaixo para diretrizes)
- Fáceis de automatizar ou repetir
Diferença a detectar | Tamanho da amostra necessário para 95% de confiança |
---|---|
30% | ~10 |
10% | ~100 |
3% | ~1.000 |
1% | ~10.000 |
A avaliação de saídas pode ser feita por computadores, seres humanos ou uma combinação dos dois. Os computadores podem automatizar avaliações com critérios objetivos (por exemplo, perguntas com respostas únicas corretas) e também alguns critérios subjetivos ou nebulosos, nos quais as saídas do modelo são avaliadas por outras consultas do modelo. O OpenAI Evals é um framework de software de código aberto que fornece ferramentas para criar avaliações automatizadas.
Avaliações com base em modelos podem ser úteis quando existem uma variedade de saídas possíveis que seriam consideradas de igual qualidade (por exemplo, para perguntas com respostas longas). O limite entre o que pode ser realisticamente avaliado com uma avaliação baseada em modelos e o que requer uma avaliação humana é nebuloso e está em constante mudança à medida que os modelos se tornam mais capazes. Encorajamos a experimentação para descobrir quão bem as avaliações baseadas em modelos podem funcionar para o seu caso de uso.
Tática: Avaliar saídas do modelo com referência a respostas padrão
Suponha que seja conhecido que a resposta correta a uma pergunta deve fazer referência a um conjunto específico de fatos conhecidos. Então podemos usar uma consulta ao modelo para contar quantos dos fatos necessários estão incluídos na resposta.
Por exemplo, ao usar a seguinte mensagem do sistema:
// Mensagem do sistema
Você receberá um texto delimitado por três aspas que deve ser a resposta a uma pergunta. Verifique se as seguintes informações estão diretamente contidas na resposta:
- Neil Armstrong foi a primeira pessoa a andar na lua.
- A data em que Neil Armstrong andou na lua pela primeira vez foi 21 de julho de 1969.
Para cada um destes pontos, siga as seguintes etapas:
1 - Reformule o ponto.
2 - Forneça uma citação da resposta que está mais próxima deste ponto.
3 - Considere se alguém lendo a citação que não conhece o tópico poderia inferir diretamente o ponto. Explique por que sim ou por que não antes de tomar sua decisão.
4 - Escreva "sim" se a resposta para 3 foi sim, caso contrário escreva "não".
Por fim, forneça a contagem de quantas respostas "sim" existem. Forneça esta contagem como {"count": <inserir contagem aqui>}.
Aqui está um exemplo de entrada onde ambos os pontos são satisfeitos:
// Mensagem do sistema
<inserir mensagem do sistema acima>
// Mensagem do usuário
"""Neil Armstrong é famoso por ser o primeiro humano a pisar na Lua. Este evento histórico ocorreu em 21 de julho de 1969, durante a missão Apollo 11."""
Aqui está um exemplo de entrada onde apenas um ponto é satisfeito:
// Mensagem do sistema
<inserir mensagem do sistema acima>
// Mensagem do usuário
"""Neil Armstrong fez história quando pisou no módulo lunar, tornando-se a primeira pessoa a andar na lua."""
Aqui está um exemplo de entrada onde nenhum ponto é satisfeito:
// Mensagem do sistema
<inserir mensagem do sistema acima>
// Mensagem do usuário
"""No verão de '69, uma viagem grandiosa,
Apollo 11, ousado como a mão da lenda.
Armstrong deu um passo, a história se desenrolou,
"Um pequeno passo", ele disse, por um novo mundo."""
Existem muitas possíveis variantes desse tipo de avaliação baseada em modelo. Considere a seguinte variação que rastreia o tipo de sobreposição entre a resposta candidata e a resposta padrão e também verifica se a resposta candidata contradiz alguma parte da resposta padrão.
// Mensagem do sistema
Use as seguintes etapas para responder às entradas do usuário. Reformule completamente cada etapa antes de prosseguir. Ou seja, "Etapa 1: Raciocine...".
Etapa 1: Raciocine passo a passo se as informações na resposta enviada em comparação com a resposta especialista são: disjuntas, iguais, um subconjunto, um superconjunto ou sobrepostas (ou seja, alguma interseção mas não subconjunto/superconjunto).
Etapa 2: Raciocine passo a passo se a resposta enviada contradiz algum aspecto da resposta especialista.
Etapa 3: Produza um objeto JSON estruturado como: {"type_of_overlap": "disjunto" ou "igual" ou "subconjunto" ou "superconjunto" ou "sobreposto", "contradiction": true ou false}
Aqui está um exemplo de entrada com uma resposta insatisfatória que, no entanto, não contradiz a resposta especialista:
// Mensagem do sistema
<inserir mensagem do sistema acima>
// Mensagem do usuário
Pergunta: """Qual evento Neil Armstrong é mais famoso e em que data ocorreu? Assuma o horário UTC."""
Resposta enviada: """Ele não andou na lua ou algo do tipo?"""
Resposta do especialista: """Neil Armstrong é mais famoso por ser a primeira pessoa a andar na lua. Este evento histórico ocorreu em 21 de julho de 1969."""
Aqui está um exemplo de entrada com uma resposta que contradiz diretamente a resposta especialista:
// Mensagem do sistema
<inserir mensagem do sistema acima>
// Mensagem do usuário
Pergunta: """Qual evento Neil Armstrong é mais famoso e em que data ocorreu? Assuma o horário UTC."""
Resposta enviada: """Em 21 de julho de 1969, Neil Armstrong se tornou a segunda pessoa a andar na lua, seguindo após Buzz Aldrin."""
Resposta do especialista: """Neil Armstrong é mais famoso por ser a primeira pessoa a andar na lua. Este evento histórico ocorreu em 21 de julho de 1969."""
Aqui está um exemplo de entrada com uma resposta correta que também fornece um pouco mais de detalhes do que é necessário:
// Mensagem do SISTEMA
<insira a mensagem do sistema acima>
// Mensagem do USUÁRIO
Pergunta: """Qual evento Neil Armstrong é mais famoso e em que data ocorreu? Considere o horário UTC."""
Resposta Enviada: """Aproximadamente às 02:56 UTC do dia 21 de julho de 1969, Neil Armstrong se tornou o primeiro humano a pisar na superfície da lua, marcando uma conquista monumental na história humana."""
Resposta do Especialista: """Neil Armstrong é mais famoso por ser a primeira pessoa a caminhar na lua. Esse evento histórico ocorreu em 21 de julho de 1969."""