Engenharia imediata no .NET
Neste artigo, você explora conceitos essenciais de engenharia imediata. Muitos modelos de IA são baseados em prompt, o que significa que respondem ao texto de entrada do usuário (um prompt) com uma resposta gerada por algoritmos preditivos (uma conclusão). Os modelos mais recentes também costumam suportar finalizações em forma de chat, com mensagens baseadas em funções (sistema, usuário, assistente) e histórico de bate-papo para preservar as conversas.
Trabalhar com prompts
Considere este exemplo de geração de texto em que prompt é a entrada do usuário e conclusão é a saída do modelo:
Prompt: "O presidente que cumpriu o mandato mais curto foi"
Conclusão: "Pedro Lascurain."
A conclusão parece correta, mas e se o seu aplicativo for suposto ajudar os estudantes de história dos EUA? O mandato de 45 minutos de Pedro Lascurain é o mais curto para qualquer presidente, mas ele serviu como presidente do México. Os estudantes de história dos EUA provavelmente estão procurando por "William Henry Harrison". Claramente, o aplicativo poderia ser mais útil para seus usuários pretendidos se você lhe desse algum contexto.
A engenharia de prompt adiciona contexto ao prompt fornecendo instruções, exemplos e pistas para ajudar o modelo a produzir melhores conclusão.
Os modelos que suportam a geração de texto geralmente não exigem nenhum formato específico, mas você deve organizar seus prompts para que fique claro o que é uma instrução e o que é um exemplo. Os modelos que suportam aplicativos baseados em bate-papo usam três funções para organizar as conclusões: uma função do sistema que controla o bate-papo, uma função de usuário para representar a entrada do usuário e uma função de assistente para responder aos usuários. Divida seus prompts em mensagens para cada função:
- As mensagens do sistema fornecem instruções ao modelo sobre o assistente. Um prompt pode ter apenas uma mensagem do sistema e deve ser a primeira mensagem.
- As mensagens do usuário incluem prompts do usuário e mostram exemplos, prompts históricos ou contêm instruções para o assistente. Um exemplo de conclusão de chat deve ter pelo menos uma mensagem de usuário.
- As mensagens do assistente mostram exemplos ou completações históricas e devem conter uma resposta à mensagem do usuário anterior. As mensagens do assistente não são necessárias, mas se você incluir uma, elas devem ser emparelhadas com uma mensagem de usuário para formar um exemplo.
Use instruções para melhorar a conclusão
Uma instrução é um texto que diz ao modelo como responder. Uma instrução pode ser uma diretiva ou um imperativo:
- As diretrizes dizem ao modelo como se comportar, mas não são comandos simples – pense na configuração de personagens para um ator de improvisação: "Você está ajudando os alunos a aprender sobre a história dos EUA, então fale sobre os EUA, a menos que eles perguntem especificamente sobre outros países."
- Os imperativos são comandos inequívocos para o modelo seguir. "Traduzir para Tagalog:"
As diretivas são mais abertas e flexíveis do que os imperativos:
- Você pode combinar várias diretivas em uma instrução.
- As instruções geralmente funcionam melhor quando você as usa com exemplos. No entanto, como os imperativos são comandos inequívocos, os modelos não precisam de exemplos para entendê-los (embora você possa usar um exemplo para mostrar ao modelo como formatar respostas). Como uma diretiva não diz ao modelo exatamente o que fazer, cada exemplo pode ajudar o modelo a funcionar melhor.
- Normalmente, é melhor dividir uma instrução difícil em uma série de etapas, o que você pode fazer com uma sequência de diretivas. Você também deve dizer ao modelo para produzir o resultado de cada etapa, para que você possa facilmente fazer ajustes granulares. Embora você mesmo possa dividir a instrução em etapas, é mais fácil apenas dizer ao modelo para fazê-lo e produzir o resultado de cada etapa. Essa abordagem é chamada de condução em cadeia de pensamento.
O conteúdo principal e de suporte adiciona contexto
Você pode fornecer conteúdo para adicionar mais contexto às instruções.
O conteúdo principal é o texto que você deseja que o modelo processe com uma instrução. Seja qual for a ação que a instrução envolva, o modelo irá executá-la no conteúdo principal para produzir uma conclusão.
Conteúdo de suporte é o texto ao qual você se refere em uma instrução, mas que não é o alvo da instrução. O modelo usa o conteúdo de suporte para concluir a instrução, o que significa que o conteúdo de suporte também aparece em conclusão, normalmente como algum tipo de estrutura (como em títulos ou rótulos de coluna).
Use rótulos com seu conteúdo instrucional para ajudar o modelo a descobrir como usá-lo com a instrução. Não se preocupe muito com a precisão: os rótulos não precisam corresponder às instruções exatamente porque o modelo lidará com coisas como forma de palavras e maiúsculas.
Suponha que você use a instrução "Resumir realizações presidenciais dos EUA" para produzir uma lista. O modelo pode organizá-lo e ordená-lo de várias maneiras. Mas e se você quiser que a lista agrupe as realizações por um conjunto específico de categorias? Use o conteúdo de suporte para adicionar essas informações à instrução.
Ajuste suas instruções para que o modelo se agrupe por categoria e acrescente conteúdo de suporte que especifique essas categorias:
prompt = """
Instructions: Summarize US Presidential accomplishments, grouped by category.
Categories: Domestic Policy, US Economy, Foreign Affairs, Space Exploration.
Accomplishments: 'George Washington
- First president of the United States.
- First president to have been a military veteran.
- First president to be elected to a second term in office.
- Received votes from every presidential elector in an election.
- Filled the entire body of the United States federal judges; including the Supreme Court.
- First president to be declared an honorary citizen of a foreign country, and an honorary citizen of France.
John Adams ...' ///Text truncated
""";
Use exemplos para orientar o modelo
Um exemplo é o texto que mostra o modelo como responder fornecendo exemplo de entrada do usuário e saída do modelo. O modelo usa exemplos para inferir o que incluir nas conclusões. Os exemplos podem vir antes ou depois das instruções em um prompt projetado, mas os dois não devem ser intercalados.
Um exemplo começa com um prompt e, opcionalmente, pode incluir uma conclusão. Uma conclusão em um exemplo não precisa incluir a resposta literal — ela pode conter apenas uma palavra formatada, o primeiro marcador em uma lista não ordenada ou algo semelhante para indicar como cada conclusão deve começar.
Os exemplos são classificados como aprendizagem de tiro zero ou aprendizagem de tiro reduzido com base no facto de conterem ou não conclusões literais.
- Exemplos de aprendizagem de tiro zero incluem um prompt sem conclusão literal. Esta abordagem testa as respostas de um modelo sem lhe dar exemplos de saída de dados. Os prompts de captura zero podem ter completações que incluem pistas, como indicar que o modelo deve gerar uma lista ordenada incluindo "1". como a conclusão.
- Exemplos de aprendizagem de poucas imagens incluem vários pares de prompts com finalizações literais. A aprendizagem de poucos tiros pode mudar o comportamento do modelo, adicionando ao seu conhecimento existente.
Entenda as pistas
Uma sugestão é um texto que transmite a estrutura ou formato de saída desejado. Como uma instrução, uma sugestão não é processada pelo modelo como se fosse uma entrada do usuário. Como um exemplo, uma dica mostra ao modelo o que você quer em vez de dizer o que fazer. Você pode adicionar quantas dicas quiser, para que possa iterar para obter o resultado desejado. Os sinais são usados com uma instrução ou um exemplo e devem estar no final do prompt.
Suponha que você use uma instrução para dizer ao modelo para produzir uma lista de realizações presidenciais por categoria, juntamente com conteúdo de apoio que diga ao modelo quais categorias usar. Você decide que deseja que o modelo produza uma lista aninhada com todos os limites para categorias, com as realizações de cada presidente em cada categoria listadas em uma linha que começa com seu nome, com presidentes listados cronologicamente. Após a instrução e o conteúdo de suporte, você pode adicionar três dicas para mostrar ao modelo como estruturar e formatar a lista:
prompt = """
Instructions: Summarize US Presidential accomplishments, grouped by category.
Categories: Domestic Policy, US Economy, Foreign Affairs, Space Exploration.
Accomplishments: George Washington
First president of the United States.
First president to have been a military veteran.
First president to be elected to a second term in office.
First president to receive votes from every presidential elector in an election.
First president to fill the entire body of the United States federal judges; including the Supreme Court.
First president to be declared an honorary citizen of a foreign country, and an honorary citizen of France.
John Adams ... /// Text truncated
DOMESTIC POLICY
- George Washington:
- John Adams:
""";
- POLÍTICA DOMÉSTICA mostra o modelo que você deseja que comece cada grupo com a categoria em todas as maiúsculas.
- - George Washington: mostra o modelo para iniciar cada seção com as realizações de George Washington listadas em uma linha.
- - John Adams: mostra o modelo que deve listar os presidentes restantes em ordem cronológica.
Exemplo de prompt usando .NET
O .NET fornece várias ferramentas para avisar e conversar com diferentes modelos de IA. Use o Semantic Kernel para se conectar a uma ampla variedade de modelos e serviços de IA, bem como outros SDKs, como a biblioteca oficial OpenAI .NET. O Kernel Semântico inclui ferramentas para criar prompts com diferentes funções e manter o histórico de bate-papo, bem como muitos outros recursos.
Considere o seguinte exemplo de código:
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
// Create a kernel with OpenAI chat completion
#pragma warning disable SKEXP0010
Kernel kernel = Kernel.CreateBuilder()
.AddOpenAIChatCompletion(
modelId: "phi3:mini",
endpoint: new Uri("http://localhost:11434"),
apiKey: "")
.Build();
var aiChatService = kernel.GetRequiredService<IChatCompletionService>();
var chatHistory = new ChatHistory();
chatHistory.Add(
new ChatMessageContent(AuthorRole.System, "You are a helpful AI Assistant."));
while (true)
{
// Get user prompt and add to chat history
Console.WriteLine("Your prompt:");
chatHistory.Add(new ChatMessageContent(AuthorRole.User, Console.ReadLine()));
// Stream the AI response and add to chat history
Console.WriteLine("AI Response:");
var response = "";
await foreach (var item in
aiChatService.GetStreamingChatMessageContentsAsync(chatHistory))
{
Console.Write(item.Content);
response += item.Content;
}
chatHistory.Add(new ChatMessageContent(AuthorRole.Assistant, response));
Console.WriteLine();
}
O código anterior fornece exemplos dos seguintes conceitos:
- Cria um serviço de histórico de bate-papo para solicitar que o modelo de IA seja concluído com base nas funções de autor.
- Configura a IA com uma
AuthorRole.System
mensagem. - Aceita a entrada do usuário para permitir diferentes tipos de prompts no contexto de um
AuthorRole.User
arquivo . - Transmite de forma assíncrona a conclusão da IA para fornecer uma experiência de bate-papo dinâmica.
Estenda suas técnicas de engenharia prontas
Você também pode aumentar o poder de seus prompts com técnicas de engenharia de prompt mais avançadas que são abordadas em profundidade em seus próprios artigos.
- Os LLMs têm limites de entrada de token que restringem a quantidade de texto que você pode ajustar em um prompt. Use incorporações e soluções de banco de dados vetorial para reduzir o número de tokens necessários para representar uma determinada parte do texto.
- Os LLMs não são treinados em seus dados, a menos que você mesmo os treine, o que pode ser caro e demorado. Use a geração aumentada de recuperação (RAG) para disponibilizar seus dados para um LLM sem treiná-lo.