Sdílet prostřednictvím


Inženýrství pokynů v .NET

V tomto článku prozkoumáte základní koncepty nastavování 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 podněty

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

Výsledek se zdá být správný, ale co když má vaše aplikace pomoci studentům americké historie? Pedro Lascurainovo 45minutové funkční období je nejkratší ze všech prezidentů, a přesto 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 přidává kontext k příkazu poskytováním instrukcí, příkladů a nápověd, aby model mohl vytvořit lepší dokončení.

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 asistenta zobrazují příklady nebo historická dokončení a musí obsahovat odpověď na předcházející 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žijte pokyny ke zlepšení výsledku

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 pokyn modelu přesně neurčuje, co dělat, může každý příklad pomoci modelu pracovat lépe.
  • Obvykle je lepší rozdělit obtížné instrukce do řady kroků, které můžete dělat s posloupností direktiv. Měli byste také informovat model, aby vypisoval výsledky každého kroku, abyste mohli snadno provádět granulární úpravy. I když si pokyny můžete rozdělit do kroků sami, je jednodušší jednoduše říct modelu, aby to udělal, a aby zpracoval výstup každého kroku. Tento přístup se nazývá řetěz myšlenkových výzev.

Primární a podpůrný obsah dodává kontext

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 na primárním obsahu, aby dokončil proces.

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ů).

Používejte štítky u svého výukového obsahu, aby model lépe pochopil, jak jej použít podle instrukcí. 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 seřadit ho různými způsoby. 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 mohou být uvedeny před nebo po pokynech v navržené výzvě, ale neměly by se střídat.

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 zero-shot learning nebo few-shot learning na základě toho, zda obsahují doslovná dokončování.

  • Zero-shot learning příklady zahrnují výzvu bez doslovného doplně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í.
  • Few-shot learning příklady zahrnují několik dvojic výzev s doslovnými dokončeními. Učení z malého množství dat může změnit chování modelu rozšířením jeho stávajících znalostí.

Porozumět podnětům

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. Jako příklad ukazuje model, co chcete, namísto toho, abyste mu říkali, co má 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 s kategoriemi napsanými velkými písmeny, přičemž úspěchy jednotlivých prezidentů v každé kategorii jsou uvedeny na jednom řádku, který začíná jejich jménem, s prezidenty uvedenými chronologicky. Po vašich instrukcích a podpůrném obsahu můžete přidat tři pomůcky, aby modelu ukázaly, jak 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 ukazuje model, který chcete, aby začínal každou skupinu s kategorií ve všech velkých písmenech.
  • - George Washington: ukazuje model pro zahájení každého oddílu, uvádějící úspěchy George Washingtona na jednom řádku.
  • - John Adams: model ukazuje, ž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 vyvolání výzev a chatování s různými modely umělé inteligence. 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 pomocí zprávy AuthorRole.System.
  • Přijímá vstup uživatele, aby umožňoval různé typy výzev v kontextu objektu AuthorRole.User.
  • Asynchronně streamuje výsledky z AI, aby poskytoval dynamický zážitek z chatu.

Rozšiřte své techniky tvorby promptů

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ýcha 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í retrieval augmented generation (RAG) zpřístupníte data pro LLM bez nutnosti jejich tréninku.