Cvičení – implementace služby Azure OpenAI

Dokončeno

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

  1. Otevřete soubor Services/OpenAiService.cs.

  2. 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)
    {
    }
    
  3. Vytvořte proměnnou ChatRequestSystemMessage s názvem systemMessage. Pro tuto proměnnou použijte User roli a proměnnou _systemPrompt pro obsah.

    ChatRequestSystemMessage systemMessage = new(_systemPrompt);
    
  4. Vytvořte proměnnou ChatRequestUserMessage s názvem userMessage. Pro tuto proměnnou by role měla být ChatRole.User a používat parametr konstruktoru userPrompt pro obsah zprávy.

    ChatRequestUserMessage userMessage = new(userPrompt);
    
  5. Vytvořte novou proměnnou s názvem options typu ChatCompletionsOptions. Přidejte do seznamu dvě proměnné Messages zprávy, nastavte hodnotu User na parametr konstruktoru sessionId , nastavte MaxTokens na 4000a 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.

  6. Asynchronní vyvolání GetChatCompletionsAsync metody proměnné klienta Azure OpenAI (_client). Předejte proměnnou options , kterou jste vytvořili. Uložte výsledek do proměnné s názvem completions typu ChatCompletions.

    ChatCompletions completions = await _client.GetChatCompletionsAsync(options);
    

    Tip

    Metoda GetChatCompletionsAsync vrátí objekt typu Task<Response<ChatCompletions>>. Třída Response<T> obsahuje implicitní převod na typ T , 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 jen ChatCompletions v případě, že vám záleží jenom na obsahu samotného výsledku.

  7. 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
    );
    
  8. 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.

  1. 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)
    {
    }
    
  2. Vytvořte proměnnou ChatRequestSystemMessage s názvem systemMessage. Pro tuto proměnnou použijte User roli a proměnnou _summarizePrompt pro obsah.

    ChatRequestSystemMessage systemMessage = new(_summarizePrompt);
    
  3. Vytvořte další ChatRequestUserMessage proměnnou s názvem userMessage. User Znovu použijte roli a pro obsah zprávy použijte conversationText parametr konstruktoru.

    ChatRequestUserMessage userMessage = new(conversationText);
    
  4. Vytvořte proměnnou ChatCompletionsOptions s options dvěma proměnnými zpráv v Messages seznamu, User nastavte na parametr konstruktoru sessionId , MaxTokens nastavte na 200hodnotu 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
    };
    
  5. Asynchronní volání _client.GetChatCompletionsAsync pomocí options proměnné jako parametru Uložte výsledek do proměnné s názvem completions typu ChatCompletions.

    ChatCompletions completions = await _client.GetChatCompletionsAsync(options);
    
  6. Vrátí obsah dokončení jako řetězec jako výsledek SummarizeAsync metody.

    return completions.Choices[0].Message.Content;
    
  7. 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í.

  1. Otevřete nový terminál.

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

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

    Screenshot of the application running with a connection Azure OpenAI.

  4. Zavřete terminál.