Sdílet prostřednictvím


Prompt engineering in .NET

V tomto článku prozkoumáte základní koncepty přípravy výzev. Řada modelů AI je založená na výzev, což znamená, že reagují na text uživatelského vstupu ( výzva) s odpovědí vygenerovanou prediktivními algoritmy ( dokončení). Novější modely také často podporují dokončování ve formuláři chatu se zprávami založenými na rolích (systém, uživatel, asistent) a historii chatu, aby se zachovaly konverzace.

Práce s výzvami

Podívejte se na tento příklad generování textu, ve kterém se zobrazí výzva k zadání uživatele a dokončení je výstupem modelu:

Výzva: "Prezident, který sloužil nejkratší lhůtě, byl "

Dokončení: "Pedro Lascurain."

Dokončení se zobrazí správně, ale co když má vaše aplikace pomoct studentům historie v USA? Pedro Lascurain je 45minutový období nejkratší pro každého prezidenta, ale sloužil jako prezident Mexika. Studenti historie USA pravděpodobně hledají "William Henry Harrison". Pokud jste aplikaci dali nějaký kontext, může být aplikace pro své zamýšlené uživatele užitečnější.

Prompt engineering adds context to the prompt by providing instructions, examples, and cues to help the model produce better completions.

Modely, které podporují generování textu, často nevyžadují žádný konkrétní formát, ale měli byste uspořádat výzvy, aby bylo jasné, co je instrukce a jaký je příklad. Modely, které podporují chatovací aplikace, používají tři role k uspořádání dokončení: systémovou roli, která řídí chat, roli uživatele, která představuje vstup uživatele a roli asistenta pro reagování na uživatele. Rozdělte výzvy na zprávy pro každou roli:

  • Systémové zprávy poskytují pokyny k modelu pro asistenta. Výzva může obsahovat pouze jednu systémovou zprávu a musí to být první zpráva.
  • Uživatelské zprávy obsahují výzvy od uživatele a zobrazují příklady, historické výzvy nebo obsahují pokyny pro asistenta. Příklad dokončení chatu musí obsahovat alespoň jednu zprávu uživatele.
  • Zprávy pomocníka zobrazují příklad nebo historické dokončování a musí obsahovat odpověď na předchozí zprávu uživatele. Zprávy pomocníka nejsou povinné, ale pokud je zahrnete, musí být spárované s uživatelskou zprávou, aby bylo možné vytvořit příklad.

Použití pokynů ke zlepšení dokončení

Instrukce je text, který modelu říká, jak reagovat. Instrukce může být direktiva nebo imperativní:

  • Direktivy říkají modelu, jak se chovat, ale nejsou to jednoduché příkazy – představte si nastavení postavy improvizovaného herce: "Pomáháte studentům učit se o historii USA, takže nemluvte o USA, pokud se výslovně neptají na jiné země."
  • Imperativní příkazy jsou jednoznačné příkazy , které má model sledovat. "Přeložit na Tagalog:"

Direktivy jsou více otevřené a flexibilní než imperativní:

  • V jedné instrukci můžete zkombinovat několik direktiv.
  • Pokyny obvykle fungují lépe, když je používáte s příklady. Vzhledem k tomu, že imperativní příkazy jsou jednoznačné, modely je nepotřebují k pochopení příkladů (i když můžete použít příklad k zobrazení způsobu formátování odpovědí). Vzhledem k tomu, že direktiva neřekne modelu přesně to, co dělat, může každý příklad lépe fungovat.
  • Obvykle je lepší rozdělit obtížné instrukce do řady kroků, které můžete dělat s posloupností direktiv. Model byste také měli informovat, aby vypíše výsledek každého kroku, abyste mohli snadno provádět podrobné úpravy. I když si pokyny můžete rozdělit do kroků sami, je jednodušší model jednoduše říct, aby to udělal, a výstupem výsledku každého kroku. Tento přístup se nazývá řetěz myšlenkových výzev.

Kontext pro přidání primárního a podpůrného obsahu

Můžete zadat obsah pro přidání dalšího kontextu k pokynům.

Primární obsah je text, který má model zpracovat pomocí instrukce. Ať už instrukce zahrnuje jakoukoli akci, model ji provede s primárním obsahem, aby vytvořil dokončení.

Podpůrný obsah je text, na který odkazujete v instrukci, ale který není cílem instrukce. Model používá podpůrný obsah k dokončení instrukce, což znamená, že podpůrný obsah se také zobrazuje v doplňcích, obvykle jako nějaký druh struktury (například v nadpisech nebo popiscích sloupců).

Popisky s výukovým obsahem vám pomůžou model zjistit, jak ho používat s pokyny. Nedělejte si starosti s přesností – popisky nemusí přesně odpovídat pokynům, protože model bude zpracovávat věci, jako je tvar slova a velká písmena.

Předpokládejme, že k vytvoření seznamu použijete pokyn "Sumarizace amerických prezidentských úspěchů" . Model může uspořádat a uspořádat ho libovolným počtem způsobů. Ale co když chcete, aby seznam seskupil výsledky podle konkrétní sady kategorií? Pomocí podpůrného obsahu přidejte tyto informace do instrukce.

Upravte instrukce tak, aby se model seskupil podle kategorií, a připojte podpůrný obsah, který určuje tyto kategorie:

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

Použití příkladů k vedení modelu

Příkladem je text, který ukazuje, jak reagovat na model poskytnutím ukázkového vstupu uživatele a výstupu modelu. Model používá příklady k odvození toho, co se má zahrnout do dokončování. Příklady můžou být před nebo po pokynech v technické výzvě, ale tyto dva by se neměly interspersovat.

Příklad začíná výzvou a volitelně může obsahovat dokončení. Dokončení v příkladu nemusí obsahovat doslovnou odpověď – může obsahovat jenom formátované slovo, první odrážku v neuspořádaném seznamu nebo něco podobného, aby bylo možné určit, jak má být každé dokončení zahájeno.

Příklady se klasifikují jako učení s nulovým snímkem nebo učení s několika snímky na základě toho, jestli obsahují doslovné dokončování.

  • Příklady učení s nulovým snímkem obsahují výzvu bez doslovné dokončování. Tento přístup testuje odpovědi modelu bez poskytnutí ukázkového výstupu dat. Výzvy s nulovým snímkem můžou obsahovat dokončování, která obsahují upozornění, jako je například označení, že by model měl vypsat seřazený seznam tak, že zahrne "1". jako dokončení.
  • Příklady učení s několika snímky zahrnují několik dvojic výzev s doslovnými dokončováními. Několik snímků učení může změnit chování modelu přidáním do stávajících znalostí.

Vysvětlení upozornění

Upozornění je text, který vyjadřuje požadovanou strukturu nebo formát výstupu. Podobně jako instrukce model nezpracovává upozornění, jako by šlo o uživatelský vstup. Podobně jako v příkladu ukazuje model, který chcete, místo toho, abyste mu řekli, co dělat. Můžete přidat tolik upozornění, kolik chcete, abyste mohli iterovat, abyste získali požadovaný výsledek. Upozornění se používají s pokyny nebo příkladem a měly by být na konci výzvy.

Předpokládejme, že použijete pokyn k tomu, abyste modelu řekli, aby vytvořil seznam prezidentských úspěchů podle kategorií spolu s podpůrným obsahem, který říká modelu, jaké kategorie se mají použít. Rozhodnete se, že chcete, aby model vytvořil vnořený seznam se všemi limity kategorií, přičemž výsledky jednotlivých prezidentů v každé kategorii jsou uvedené na jednom řádku, který začíná jejich jménem, s prezidenty uvedenými chronologicky. Po instrukci a podpůrném obsahu můžete přidat tři pomůcky, které ukazují, jak model strukturovat a formátovat seznam:

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:
""";
  • DOMÁCÍ POLITIKA zobrazuje model, který má začínat každou skupinu s kategorií ve všech limitech.
  • - George Washington: ukazuje model, který má začít každý oddíl s úspěchy George Washington uvedené na jedné řadě.
  • - John Adams: ukazuje model, že by měl vypsat zbývající prezidenty v chronologickém pořadí.

Příklad výzvy pomocí .NET

.NET poskytuje různé nástroje pro zobrazování výzvy a chatování s různými modely AI. Pomocí sémantického jádra se připojte k široké škále modelů a služeb AI a také k dalším sadem SDK, jako je oficiální knihovna OpenAI .NET. Sémantické jádro obsahuje nástroje pro vytváření výzev s různými rolemi a udržování historie chatu a mnoho dalších funkcí.

Vezměme si následující příklad kódu:

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

Předchozí kód obsahuje příklady následujících konceptů:

  • Vytvoří službu historie chatu, která vyzve model AI k dokončení na základě rolí autora.
  • Nakonfiguruje AI zprávou AuthorRole.System .
  • Přijímá vstup uživatele, aby umožňoval různé typy výzev v kontextu objektu AuthorRole.User.
  • Asynchronně streamuje dokončení z AI, aby poskytoval dynamické chatování.

Rozšíření technik přípravy výzvy

Výkon výzev můžete zvýšit také pomocí pokročilejších technik přípravy výzev, které jsou podrobně popsány v jejich vlastních článcích.

  • LLM mají omezení vstupu tokenu, která omezují množství textu, který můžete přizpůsobit výzvě. Pomocí vložených a vektorových databázových řešení snižte počet tokenů, které potřebujete k reprezentaci dané části textu.
  • LLM nejsou na vašich datech trénovány, pokud je nevytrénujete sami, což může být nákladné a časově náročné. Pomocí rozšířené generace načítání (RAG) zpřístupníte data pro LLM bez trénování.