Dela via


Fråga efter teknik i .NET

I den här artikeln utforskar du viktiga tekniska begrepp. Många AI-modeller är promptbaserade, vilket innebär att de svarar på användarens indatatext (en uppmaning) med ett svar som genereras av förutsägelsealgoritmer (ett slutförande). Nyare modeller stöder också ofta slutföranden i chattformulär, med meddelanden baserade på roller (system, användare, assistent) och chatthistorik för att bevara konversationer.

Arbeta med prompter

Tänk på det här textgenereringsexemplet där prompten är användarens indata och slutförande är modellutdata:

Fråga: "Presidenten som tjänstgjorde kortast var "

Slutförande: "Pedro Lascurain."

Slutförandet verkar korrekt, men vad händer om din app ska hjälpa amerikanska historiestudenter? Pedro Lascurains 45 minuter långa mandatperiod är den kortaste mandatperioden för någon president, men han tjänstgjorde som Mexikos president. De amerikanska historiestudenterna letar förmodligen efter "William Henry Harrison". Det är uppenbart att appen kan vara mer användbar för sina avsedda användare om du gav den lite kontext.

Prompt engineering lägger till kontext i prompten genom att tillhandahålla instruktioner, exempel och tips för att hjälpa modellen att skapa bättre slutföranden.

Modeller som stöder textgenerering kräver ofta inget specifikt format, men du bör ordna dina frågor så att det är tydligt vad som är en instruktion och vad som är ett exempel. Modeller som stöder chattbaserade appar använder tre roller för att organisera slutföranden: en systemroll som styr chatten, en användarroll som representerar användarindata och en assistentroll för att svara på användare. Dela upp dina frågor i meddelanden för varje roll:

  • Systemmeddelanden ger modellinstruktionerna om assistenten. En fråga kan bara ha ett systemmeddelande och det måste vara det första meddelandet.
  • Användarmeddelanden innehåller uppmaningar från användaren och visar exempel, historiska uppmaningar eller innehåller instruktioner för assistenten. Ett exempel på att chatten har slutförts måste ha minst ett användarmeddelande.
  • Assistentmeddelanden visar exempel eller historiska slutföranden och måste innehålla ett svar på föregående användarmeddelande. Assistentmeddelanden krävs inte, men om du inkluderar ett måste det kopplas till ett användarmeddelande för att bilda ett exempel.

Använd instruktioner för att förbättra slutförandet

En instruktion är text som talar om för modellen hur den ska svara. En instruktion kan vara ett direktiv eller ett imperativ:

  • Direktiv berättar för modellen hur man beter sig, men är inte enkla kommandon – tänk teckenkonfiguration för en improviserad aktör: "Du hjälper eleverna att lära sig om USA:s historia, så prata om USA om de inte specifikt frågar om andra länder."
  • Imperativ är entydiga kommandon som modellen ska följa. "Översätt till Tagalog:"

Direktiven är mer öppna och flexibla än imperativ:

  • Du kan kombinera flera direktiv i en instruktion.
  • Instruktioner fungerar vanligtvis bättre när du använder dem med exempel. Men eftersom imperativ är entydiga kommandon behöver modeller inte exempel för att förstå dem (även om du kan använda ett exempel för att visa modellen hur svar formateras). Eftersom ett direktiv inte anger exakt vad modellen ska göra kan varje exempel hjälpa modellen att fungera bättre.
  • Det är vanligtvis bättre att dela upp en svår instruktion i en serie steg, vilket du kan göra med en sekvens av direktiv. Du bör också be modellen att mata ut resultatet av varje steg, så att du enkelt kan göra detaljerade justeringar. Även om du kan dela upp instruktionen i steg själv är det enklare att bara be modellen att göra det och att mata ut resultatet av varje steg. Den här metoden kallas för tankekedja.

Primärt och stödjande innehåll lägger till kontext

Du kan ange innehåll för att lägga till mer kontext i instruktioner.

Primärt innehåll är text som du vill att modellen ska bearbeta med en instruktion. Oavsett vilken åtgärd instruktionen innebär utför modellen den på det primära innehållet för att skapa ett slutförande.

Stödinnehåll är text som du refererar till i en instruktion, men som inte är målet för instruktionen. Modellen använder det stödjande innehållet för att slutföra instruktionen, vilket innebär att stödinnehåll också visas i slutföranden, vanligtvis som någon form av struktur (till exempel i rubriker eller kolumnetiketter).

Använd etiketter med ditt instruktionsinnehåll för att hjälpa modellen att ta reda på hur den ska användas med instruktionen. Oroa dig inte för mycket för precision – etiketter behöver inte matcha instruktionerna exakt eftersom modellen hanterar saker som ordformulär och versaler.

Anta att du använder instruktionen "Sammanfatta amerikanska presidentprestationer" för att skapa en lista. Modellen kan ordna och ordna den på valfritt antal sätt. Men vad händer om du vill att listan ska gruppera prestationerna efter en specifik uppsättning kategorier? Använd stödinnehåll för att lägga till den informationen i instruktionen.

Justera din instruktion så att modellen grupperar efter kategori och lägger till stödinnehåll som anger dessa kategorier:

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

Använd exempel för att vägleda modellen

Ett exempel är text som visar modellen hur den ska svara genom att tillhandahålla exempel på användarindata och modellutdata. Modellen använder exempel för att härleda vad som ska ingå i slutföranden. Exempel kan komma före eller efter instruktionerna i en konstruerad fråga, men de två bör inte varvatsas.

Ett exempel börjar med en fråga och kan eventuellt inkludera ett slutförande. Ett slutförande i ett exempel behöver inte innehålla det ordagranna svaret– det kan bara innehålla ett formaterat ord, den första punkten i en oordnad lista eller något som liknar hur varje slutförande ska starta.

Exempel klassificeras som nollskottsinlärning eller få skottinlärning baserat på om de innehåller ordagrant slutföranden.

  • Exempel på nollskottsinlärning innehåller en uppmaning utan ordagrant slutförande. Den här metoden testar en modells svar utan att ge den exempeldatautdata. Nollskottsprompter kan ha slutföranden som innehåller tips, till exempel att ange att modellen ska mata ut en ordnad lista genom att inkludera "1". som slutförande.
  • Exempel på inlärning med få bilder innehåller flera par prompter med ordagrant slutföranden. Få skottinlärning kan ändra modellens beteende genom att lägga till den befintliga kunskapen.

Förstå tips

En referens är text som förmedlar önskad struktur eller format för utdata. Precis som en instruktion bearbetas inte en referens av modellen som om det vore användarindata. Precis som i ett exempel visar en referens modellen vad du vill ha i stället för att tala om för den vad den ska göra. Du kan lägga till så många tips du vill, så att du kan iterera för att få det resultat du vill ha. Tips används med en instruktion eller ett exempel och bör finnas i slutet av prompten.

Anta att du använder en instruktion för att berätta för modellen att skapa en lista över presidentprestationer efter kategori, tillsammans med stödinnehåll som talar om för modellen vilka kategorier som ska användas. Du bestämmer dig för att du vill att modellen ska skapa en kapslad lista med alla tak för kategorier, med varje presidents prestationer i varje kategori listade på en rad som börjar med deras namn, med presidenter listade kronologiskt. Efter instruktionen och det stödjande innehållet kan du lägga till tre tips för att visa modellen hur du strukturerar och formaterar listan:

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 visar den modell som du vill att den ska starta varje grupp med kategorin i alla versaler.
  • - George Washington: visar modellen för att starta varje avsnitt med George Washingtons prestationer listade på en rad.
  • - John Adams: visar modellen att den bör lista återstående presidenter i kronologisk ordning.

Exempelprompt med .NET

.NET innehåller olika verktyg för att fråga och chatta med olika AI-modeller. Använd Semantic Kernel för att ansluta till en mängd olika AI-modeller och tjänster, samt andra SDK:er, till exempel det officiella OpenAI .NET-biblioteket. Semantisk kernel innehåller verktyg för att skapa frågor med olika roller och upprätthålla chatthistorik samt många andra funktioner.

Ta följande kod som exempel:

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

Föregående kod innehåller exempel på följande begrepp:

  • Skapar en chatthistoriktjänst för att uppmana AI-modellen att slutföras baserat på redigeringsroller.
  • Konfigurerar AI:n med ett AuthorRole.System meddelande.
  • Accepterar användarindata för att tillåta olika typer av frågor i kontexten för en AuthorRole.User.
  • Asynkront strömmar slutförandet från AI:n för att ge en dynamisk chattupplevelse.

Utöka teknikerna för promptteknik

Du kan också öka kraften i dina frågor med mer avancerade tekniker för snabbteknik som beskrivs ingående i deras egna artiklar.

  • LLM:er har tokeninmatningsgränser som begränsar mängden text som du får plats i en prompt. Använd inbäddnings - och vektordatabaslösningar för att minska antalet token som du behöver för att representera en viss text.
  • LLM:er tränas inte på dina data om du inte tränar dem själv, vilket kan vara kostsamt och tidskrävande. Använd hämtningsförhöjd generering (RAG) för att göra dina data tillgängliga för en LLM utan att träna dem.