Delen via


Prompt engineering in .NET

In dit artikel verkent u essentiële technische concepten voor prompts. Veel AI-modellen zijn gebaseerd op prompts, wat betekent dat ze reageren op tekst van gebruikersinvoer (een prompt) met een antwoord dat wordt gegenereerd door voorspellende algoritmen (een voltooiing). Nieuwere modellen ondersteunen ook vaak voltooiingen in chatformulier, met berichten op basis van rollen (systeem, gebruiker, assistent) en chatgeschiedenis om gesprekken te behouden.

Werken met prompts

Bekijk dit voorbeeld van het genereren van tekst waarbij de prompt de gebruikersinvoer en voltooiing de modeluitvoer is:

Prompt: "De president die de kortste termijn diende was "

Voltooiing: "Pedro Lascurain."

De voltooiing lijkt correct, maar wat als uw app amerikaanse geschiedenisstudenten moet helpen? Pedro Lascurain's termijn van 45 minuten is de kortste termijn voor elke president, maar hij diende als president van Mexico. De Amerikaanse geschiedenisstudenten zijn waarschijnlijk op zoek naar William Henry Harrison. De app kan duidelijk nuttiger zijn voor de beoogde gebruikers als u deze context hebt gegeven.

Prompt engineering voegt context toe aan de prompt door instructies, voorbeelden en aanwijzingen op te geven om het model te helpen betere voltooiingen te produceren.

Voor modellen die tekstgeneratie ondersteunen, is vaak geen specifieke indeling vereist, maar u moet uw prompts ordenen, zodat het duidelijk is wat een instructie is en wat een voorbeeld is. Modellen die ondersteuning bieden voor op chat gebaseerde apps gebruiken drie rollen om voltooiingen te organiseren: een systeemrol waarmee de chat wordt beheerd, een gebruikersrol die gebruikersinvoer vertegenwoordigt en een assistentrol voor het reageren op gebruikers. Verdeel uw prompts in berichten voor elke rol:

  • Systeemberichten geven de modelinstructies over de assistent. Een prompt kan slechts één systeembericht bevatten en moet het eerste bericht zijn.
  • Gebruikersberichten bevatten prompts van de gebruiker en voorbeelden, historische prompts of instructies voor de assistent. Een voorbeeld van een chatvoltooiing moet ten minste één gebruikersbericht bevatten.
  • Assistentberichten geven voorbeeld- of historische voltooiingen weer en moeten een antwoord bevatten op het voorgaande gebruikersbericht. Assistentberichten zijn niet vereist, maar als u er een opneemt, moet deze worden gekoppeld aan een gebruikersbericht om een voorbeeld te vormen.

Instructies gebruiken om de voltooiing te verbeteren

Een instructie is tekst die aangeeft hoe het model moet reageren. Een instructie kan een richtlijn of een imperatief zijn:

  • Instructies vertellen het model hoe ze zich moeten gedragen, maar zijn geen eenvoudige opdrachten. Denk aan het instellen van tekens voor een improvacteur: "U helpt studenten om meer te weten te komen over de Amerikaanse geschiedenis, dus praat over de VS, tenzij ze specifiek vragen over andere landen."
  • Imperatieven zijn ondubbelzinnige opdrachten die het model moet volgen. "Vertalen naar Tagalog:"

Richtlijnen zijn opener en flexibeler dan imperatieven:

  • U kunt verschillende instructies combineren in één instructie.
  • Instructies werken meestal beter wanneer u ze met voorbeelden gebruikt. Omdat imperatieven echter ondubbelzinnige opdrachten zijn, hebben modellen geen voorbeelden nodig om ze te begrijpen (hoewel u een voorbeeld kunt gebruiken om het model weer te geven hoe reacties moeten worden opgemaakt). Omdat een richtlijn niet precies vertelt wat het model moet doen, kan elk voorbeeld het model helpen beter te werken.
  • Het is meestal beter om een moeilijke instructie op te splitsen in een reeks stappen, die u kunt doen met een reeks instructies. U moet het model ook vertellen het resultaat van elke stap uit te voeren, zodat u eenvoudig gedetailleerde aanpassingen kunt aanbrengen. Hoewel u de instructie zelf in stappen kunt opsplitsen, is het eenvoudiger om het model te vertellen dat u dit moet doen en om het resultaat van elke stap uit te voeren. Deze benadering wordt keten van gedachteprompt genoemd.

Primaire en ondersteunende inhoud toevoegen context

U kunt inhoud opgeven om meer context toe te voegen aan instructies.

Primaire inhoud is tekst die u door het model wilt laten verwerken met een instructie. Welke actie de instructie ook inhoudt, het model zal het uitvoeren op de primaire inhoud om een voltooiing te produceren.

Ondersteunende inhoud is tekst waarnaar u verwijst in een instructie, maar die niet het doel van de instructie is. Het model gebruikt de ondersteunende inhoud om de instructie te voltooien, wat betekent dat ondersteunende inhoud ook in voltooiingen wordt weergegeven, meestal als een soort structuur (zoals in koppen of kolomlabels).

Gebruik labels met uw instructie-inhoud om het model te helpen erachter te komen hoe het met de instructie moet worden gebruikt. U hoeft zich geen zorgen te maken over precisie. Labels hoeven niet exact overeen te komen met instructies, omdat het model zaken als woordvorm en hoofdlettergebruik afhandelt.

Stel dat u de instructie 'Samenvatting van amerikaanse presidentiële prestaties' gebruikt om een lijst te maken. Het model kan het op verschillende manieren ordenen en ordenen. Maar wat als u wilt dat de lijst de prestaties groepeert op basis van een specifieke set categorieën? Gebruik ondersteunende inhoud om die informatie toe te voegen aan de instructie.

Pas uw instructie aan zodat het model wordt gegroepeerd op categorie en ondersteunende inhoud toevoegt waarmee deze categorieën worden opgegeven:

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
""";

Voorbeelden gebruiken om het model te begeleiden

Een voorbeeld is tekst die laat zien hoe het model reageert door voorbeeldgebruikersinvoer en modeluitvoer op te geven. Het model gebruikt voorbeelden om af te stellen wat er moet worden opgenomen in voltooiingen. Voorbeelden kunnen vóór of na de instructies in een ontworpen prompt komen, maar de twee moeten niet worden doorgekruist.

Een voorbeeld begint met een prompt en kan eventueel een voltooiing bevatten. Een voltooiing in een voorbeeld hoeft niet het exacte antwoord op te nemen. Het kan gewoon een opgemaakt woord, het eerste opsommingsteken in een niet-geordende lijst bevatten of iets vergelijkbaars om aan te geven hoe elke voltooiing moet beginnen.

Voorbeelden worden geclassificeerd als zero-shot learning of weinig-shot learning op basis van of ze exacte voltooiingen bevatten.

  • Voorbeelden van zero-shot learning zijn een prompt zonder exacte voltooiing. Met deze benadering worden de antwoorden van een model getest zonder dat dit voorbeeldgegevensuitvoer geeft. Zero-shot prompts kunnen voltooiingen hebben die aanwijzingen bevatten, zoals het aangeven dat het model een geordende lijst moet uitvoeren door '1' op te nemen . als voltooiing.
  • Enkele voorbeelden van leren zijn verschillende paren prompts met exacte voltooiingen. Weinig-shot learning kan het gedrag van het model wijzigen door toe te voegen aan de bestaande kennis.

Aanwijzingen begrijpen

Een aanwijzing is tekst die de gewenste structuur of indeling van uitvoer overbrengt. Net als een instructie wordt een cue niet verwerkt door het model alsof het gebruikersinvoer was. Net als een voorbeeld toont een cue het gewenste model in plaats van het te vertellen wat u moet doen. U kunt zoveel aanwijzingen toevoegen als u wilt, zodat u het gewenste resultaat kunt ophalen. Aanwijzingen worden gebruikt met een instructie of een voorbeeld en moeten zich aan het einde van de prompt bevinden.

Stel dat u een instructie gebruikt om het model te vertellen een lijst met presidentiële prestaties per categorie te produceren, samen met ondersteunende inhoud die aangeeft welke categorieën moeten worden gebruikt. U besluit dat u wilt dat het model een geneste lijst met alle hoofdletters voor categorieën produceert, waarbij de prestaties van elke president in elke categorie op één regel staan die begint met hun naam, waarbij presidenten chronologisch worden vermeld. Na uw instructies en ondersteunende inhoud kunt u drie aanwijzingen toevoegen om het model te laten zien hoe u de lijst structureert en opmaken:

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:
""";
  • DOMESTIC POLICY toont het model dat u wilt dat elke groep wordt gestart met de categorie in hoofdletters.
  • - George Washington: toont het model om elke sectie te starten met de prestaties van George Washington op één regel.
  • - John Adams: toont het model waarin de resterende presidenten in chronologische volgorde moeten worden vermeld.

Voorbeeldprompt met .NET

.NET biedt verschillende hulpprogramma's voor het vragen en chatten met verschillende AI-modellen. Gebruik Semantic Kernel om verbinding te maken met een groot aantal AI-modellen en -services, evenals andere SDK's, zoals de officiële OpenAI .NET-bibliotheek. Semantische kernel bevat hulpprogramma's voor het maken van prompts met verschillende rollen en het onderhouden van de chatgeschiedenis, evenals vele andere functies.

Kijk eens naar het volgende codevoorbeeld:

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();
}

De voorgaande code bevat voorbeelden van de volgende concepten:

  • Hiermee maakt u een chatgeschiedenisservice om het AI-model te vragen om voltooiingen op basis van auteursrollen.
  • Hiermee configureert u de AI met een AuthorRole.System bericht.
  • Accepteert gebruikersinvoer om verschillende typen prompts toe te staan in de context van een AuthorRole.User.
  • Asynchroon streamt de voltooiing van de AI om een dynamische chatervaring te bieden.

Breid uw prompt-engineeringtechnieken uit

U kunt ook de kracht van uw prompts vergroten met geavanceerdere techniektechnieken voor prompts die uitgebreid worden behandeld in hun eigen artikelen.

  • LLM's hebben tokeninvoerlimieten die de hoeveelheid tekst beperken die u in een prompt kunt plaatsen. Gebruik insluitingen en vectordatabaseoplossingen om het aantal tokens te verminderen dat u nodig hebt om een bepaald stuk tekst weer te geven.
  • LLM's worden niet getraind op uw gegevens, tenzij u ze zelf traint, wat kostbaar en tijdrovend kan zijn. Gebruik het ophalen van augmented generation (RAG) om uw gegevens beschikbaar te maken voor een LLM zonder deze te trainen.