Cvičení – implementace služby Azure OpenAI
Začněme nejjednodušší službou. OpenAiService
Tato služba obsahuje pouze dvě metody, které potřebujeme implementovat, abychom mohli okamžitě implementovat základní výzvy a dokončení. Datovou službu Azure Cosmos DB for NoSQL neimtribuujeme až později, takže zatím nemůžeme zachovat relace napříč relacemi ladění.
V tomto cvičení máme několik klíčových požadavků:
- Odešlete dotaz od uživatele asistentovi AI a požádejte o odpověď.
- Pošlete asistentovi AI řadu výzev a požádejte o shrnutí konverzace.
Zeptejte se modelu AI na otázku.
Nejprve implementujte konverzaci s odpověďmi na otázky odesláním systémové výzvy, otázky a ID relace, aby model AI mohl poskytnout odpověď v kontextu aktuální konverzace. Ujistěte se, že měříte počet tokenů, které je potřeba k analýze výzvy, a vrácení odpovědi (nebo dokončení v tomto kontextu).
Otevřete soubor Services/OpenAiService.cs.
V rámci
GetChatCompletionAsync
této metody odeberte veškerý existující zástupný kód.public async Task<(string completionText, int completionTokens)> GetChatCompletionAsync(string sessionId, string userPrompt) { }
Vytvořte proměnnou
ChatRequestSystemMessage
s názvemsystemMessage
. Pro tuto proměnnou použijteUser
roli a proměnnou_systemPrompt
pro obsah.ChatRequestSystemMessage systemMessage = new(_systemPrompt);
Vytvořte proměnnou
ChatRequestUserMessage
s názvemuserMessage
. Pro tuto proměnnou by role měla býtChatRole.User
a používat parametr konstruktoruuserPrompt
pro obsah zprávy.ChatRequestUserMessage userMessage = new(userPrompt);
Vytvořte novou proměnnou s názvem
options
typuChatCompletionsOptions
. Přidejte do seznamu dvě proměnnéMessages
zprávy, nastavte hodnotuUser
na parametr konstruktorusessionId
, nastavteMaxTokens
na4000
a nastavte zbývající vlastnosti na doporučené hodnoty zde.ChatCompletionsOptions options = new() { DeploymentName = _modelName, Messages = { systemMessage, userMessage }, User = sessionId, MaxTokens = 4000, Temperature = 0.3f, NucleusSamplingFactor = 0.5f, FrequencyPenalty = 0, PresencePenalty = 0 };
Tip
4096 je maximální počet tokenů pro gpt-35-turbo model. Jen sem zaokrouhlíme dolů, abychom zjednodušily věci.
Asynchronní vyvolání
GetChatCompletionsAsync
metody proměnné klienta Azure OpenAI (_client
). Předejte proměnnouoptions
, kterou jste vytvořili. Uložte výsledek do proměnné s názvemcompletions
typuChatCompletions
.ChatCompletions completions = await _client.GetChatCompletionsAsync(options);
Tip
Metoda
GetChatCompletionsAsync
vrátí objekt typuTask<Response<ChatCompletions>>
. TřídaResponse<T>
obsahuje implicitní převod na typT
, který umožňuje vybrat typ na základě potřeb vaší aplikace. Výsledek můžete uložit buďResponse<ChatCompletions>
tak, aby se z odpovědi získala úplná metadata, nebo jenChatCompletions
v případě, že vám záleží jenom na obsahu samotného výsledku.Nakonec vraťte řazenou kolekci členů jako výsledek
GetChatCompletionAsync
metody s obsahem dokončení jako řetězec, počet tokenů přidružených k výzvě a počet tokenů pro odpověď.return ( response: completions.Choices[0].Message.Content, promptTokens: completions.Usage.PromptTokens, responseTokens: completions.Usage.CompletionTokens );
Uložte soubor Služby/OpenAiService.cs.
Zeptejte se modelu AI, aby shrnul konverzaci.
Teď odešlete model AI jinou výzvu systému, aktuální konverzaci a ID relace, aby model AI mohl shrnout konverzaci několika slovy.
V rámci
SummarizeAsync
této metody odeberte veškerý existující zástupný kód.public async Task<string> SummarizeAsync(string sessionId, string conversationText) { }
Vytvořte proměnnou
ChatRequestSystemMessage
s názvemsystemMessage
. Pro tuto proměnnou použijteUser
roli a proměnnou_summarizePrompt
pro obsah.ChatRequestSystemMessage systemMessage = new(_summarizePrompt);
Vytvořte další
ChatRequestUserMessage
proměnnou s názvemuserMessage
.User
Znovu použijte roli a pro obsah zprávy použijteconversationText
parametr konstruktoru.ChatRequestUserMessage userMessage = new(conversationText);
Vytvořte proměnnou
ChatCompletionsOptions
soptions
dvěma proměnnými zpráv vMessages
seznamu,User
nastavte na parametr konstruktorusessionId
,MaxTokens
nastavte na200
hodnotu a zbývající vlastnosti na doporučené hodnoty.ChatCompletionsOptions options = new() { DeploymentName = _modelName, Messages = { systemMessage, userMessage }, User = sessionId, MaxTokens = 200, Temperature = 0.0f, NucleusSamplingFactor = 1.0f, FrequencyPenalty = 0, PresencePenalty = 0 };
Asynchronní volání
_client.GetChatCompletionsAsync
pomocíoptions
proměnné jako parametru Uložte výsledek do proměnné s názvemcompletions
typuChatCompletions
.ChatCompletions completions = await _client.GetChatCompletionsAsync(options);
Vrátí obsah dokončení jako řetězec jako výsledek
SummarizeAsync
metody.return completions.Choices[0].Message.Content;
Uložte soubor Služby/OpenAiService.cs.
Kontrola práce
V tuto chvíli by vaše aplikace měla mít dostatečnou implementaci služby Azure OpenAI, kterou můžete otestovat. Mějte na paměti, že ještě nemáte implementaci úložiště dat, takže konverzace se neuchovávají mezi relacemi ladění.
Otevřete nový terminál.
Spusťte aplikaci s povoleným opětovným načítáním za provozu pomocí
dotnet watch
.dotnet watch run --non-interactive
Tip
Funkce Opětovné načítání za provozu je tady povolená, pokud potřebujete provést malou opravu kódu aplikace. Další informace najdete v tématu podpora rozhraní .NET Opětovné načítání za provozu pro ASP.NET Core.
Visual Studio Code znovu spustí jednoduchý prohlížeč v nástroji se spuštěnou webovou aplikací. Ve webové aplikaci vytvořte novou chatovací relaci a položte asistentovi AI otázku. Pomocník s AI teď reaguje dokončením vytvořeným modelem. Měli byste si také všimnout, že pole uživatelského rozhraní tokenu jsou teď naplněna skutečným využitím tokenů pro každé dokončení a výzvu.
Zavřete terminál.