Übung: Implementieren von Azure OpenAI Service

Abgeschlossen

Wir beginnen mit der einfachsten Vorlage: OpenAiService Dieser Dienst enthält nur zwei Methoden, die wir implementieren müssen, damit wir sofort einfache Prompts und Vervollständigungen implementieren können. Wir implementieren unseren Azure Cosmos DB for NoSQL-Datendienst erst später, sodass wir unsere Sitzungen noch nicht über Debugsitzungen hinaus aufrechterhalten können.

In dieser Übung gibt es einige wichtige Anforderungen:

  • Senden einer Benutzerfrage an den KI-Assistenten mit Bitte um eine Antwort
  • Senden einer Reihe von Prompts an den KI-Assistenten mit Bitte um eine Zusammenfassung der Unterhaltung

Stellen einer Frage an das KI-Modell

Implementieren Sie zunächst eine Frage-Antwort-Unterhaltung, indem Sie einen Systemprompt, eine Frage und Sitzungs-ID senden, damit das KI-Modell eine Antwort im Kontext der aktuellen Unterhaltung geben kann. Stellen Sie sicher, dass Sie die Anzahl der Token messen, die benötigt werden, um den Prompt zu parsen und eine Antwort (oder eine Vervollständigung in diesem Kontext) zurückzugeben.

  1. Öffnen Sie die Datei Services/OpenAiService.cs.

  2. Entfernen Sie innerhalb der GetChatCompletionAsync-Methode eventuell vorhandenen Platzhaltercode:

    public async Task<(string completionText, int completionTokens)> GetChatCompletionAsync(string sessionId, string userPrompt)
    {
    }
    
  3. Erstellen Sie eine ChatRequestSystemMessage-Variable mit dem Namen systemMessage. Verwenden Sie für diese Variable die Rolle User und die _systemPrompt-Variable für Inhalt.

    ChatRequestSystemMessage systemMessage = new(_systemPrompt);
    
  4. Erstellen Sie eine ChatRequestUserMessage-Variable mit dem Namen userMessage. Für diese Variable sollte die Rolle ChatRole.User lauten und der Konstruktorparameter userPrompt für den Inhalt der Nachricht verwendet werden.

    ChatRequestUserMessage userMessage = new(userPrompt);
    
  5. Erstellen Sie eine neue Variable mit dem Namen options vom Typ ChatCompletionsOptions. Fügen Sie der Messages-Liste die beiden Nachrichtenvariablen hinzu, legen Sie den Wert User für den Konstruktorparameter sessionId fest, legen Sie MaxTokens auf 4000 fest, und legen Sie die restlichen Eigenschaften auf die hier empfohlenen Werte fest.

    ChatCompletionsOptions options = new()
    {
        DeploymentName = _modelName,
        Messages = {
            systemMessage,
            userMessage
        },
        User = sessionId,
        MaxTokens = 4000,
        Temperature = 0.3f,
        NucleusSamplingFactor = 0.5f,
        FrequencyPenalty = 0,
        PresencePenalty = 0
    };
    

    Tipp

    4096 ist die maximale Anzahl an Token für das GPT-35-Turbo-Modell. Wir runden hier lediglich ab, um alles zu vereinfachen.

  6. Rufen Sie asynchron die GetChatCompletionsAsync-Methode der Azure OpenAI-Clientvariable (_client) auf. Übergeben Sie die von Ihnen erstellte options Variable. Speichern Sie das Ergebnis in einer Variablen namens completions vom Typ ChatCompletions.

    ChatCompletions completions = await _client.GetChatCompletionsAsync(options);
    

    Tipp

    Die GetChatCompletionsAsync-Methode gibt ein Objekt vom Typ Task<Response<ChatCompletions>> zurück. Die Response<T>-Klasse enthält eine implizite Konvertierung in den Typ T, wodurch Sie einen Typ basierend auf den Anforderungen Ihrer Anwendung auswählen können. Sie können das Ergebnis entweder als Response<ChatCompletions> speichern, um die vollständigen Metadaten aus der Antwort abzurufen, oder nur als ChatCompletions, wenn Sie sich nur für den Inhalt des Ergebnisses selbst interessieren.

  7. Geben Sie schließlich ein Tupel als Ergebnis der GetChatCompletionAsync-Methode zurück, mit dem Inhalt der Vervollständigung als Zeichenfolge, der Anzahl der Token, die dem Prompt zugeordnet sind, und der Anzahl der Token für die Antwort.

    return (
        response: completions.Choices[0].Message.Content,
        promptTokens: completions.Usage.PromptTokens,
        responseTokens: completions.Usage.CompletionTokens
    );
    
  8. Speichern Sie die Datei Services/OpenAiService.cs.

Bitten des KI-Modells um die Zusammenfassung einer Unterhaltung

Senden Sie nun einen anderen Prompt, Ihre aktuelle Unterhaltung und die Sitzungs-ID an das KI-Modell, damit das KI-Modell die Unterhaltung in einigen Wörtern zusammenfassen kann.

  1. Entfernen Sie innerhalb der SummarizeAsync-Methode eventuell vorhandenen Platzhaltercode:

    public async Task<string> SummarizeAsync(string sessionId, string conversationText)
    {
    }
    
  2. Erstellen Sie eine ChatRequestSystemMessage-Variable mit dem Namen systemMessage. Verwenden Sie für diese Variable die Rolle User und die _summarizePrompt-Variable für Inhalt.

    ChatRequestSystemMessage systemMessage = new(_summarizePrompt);
    
  3. Erstellen Sie eine weitere „ChatRequestUserMessage“-Variable mit dem Namen „userMessage“. Verwenden Sie die Rolle User erneut, und verwenden Sie den Konstruktorparameter conversationText für den Inhalt der Nachricht.

    ChatRequestUserMessage userMessage = new(conversationText);
    
  4. Erstellen Sie eine ChatCompletionsOptions-Variable mit dem Namen options mit den beiden Nachrichtenvariablen in der Messages-Liste, wobei User auf den sessionId Konstruktorparameter und MaxTokens auf 200 festgelegt ist. Die restlichen Eigenschaften sind auf die hier empfohlenen Werte festgelegt:

    ChatCompletionsOptions options = new()
    {
        DeploymentName = _modelName,
        Messages = {
            systemMessage,
            userMessage
        },
        User = sessionId,
        MaxTokens = 200,
        Temperature = 0.0f,
        NucleusSamplingFactor = 1.0f,
        FrequencyPenalty = 0,
        PresencePenalty = 0
    };
    
  5. Rufen Sie _client.GetChatCompletionsAsync asynchron die options Variable als Parameter auf. Speichern Sie das Ergebnis in einer Variablen namens completions vom Typ ChatCompletions.

    ChatCompletions completions = await _client.GetChatCompletionsAsync(options);
    
  6. Geben Sie den Inhalt der Vervollständigung als Zeichenfolge im Ergebnis der SummarizeAsync-Methode zurück.

    return completions.Choices[0].Message.Content;
    
  7. Speichern Sie die Datei Services/OpenAiService.cs.

Arbeit überprüfen

Zu diesem Zeitpunkt sollte Ihre Anwendung über eine Implementierung von Azure OpenAI Service verfügen, die für Testzwecke ausreichend ist. Bedenken Sie, dass Sie noch keinen Datenspeicher implementiert haben, sodass Ihre Unterhaltungen zwischen Debugsitzungen nicht gespeichert werden.

  1. Öffnen Sie ein neues Terminal.

  2. Starten Sie die Anwendung mit aktivierten Hot Reloads mithilfe von dotnet watch.

    dotnet watch run --non-interactive
    

    Tipp

    Das Feature Hot Reload ist aktiviert, falls Sie eine kleine Korrektur am Code der Anwendung vornehmen müssen. Weitere Informationen finden Sie unter .NET Hot Reload-Unterstützung für ASP.NET Core.

  3. Visual Studio Code startet den einfachen Browser im Tool mit der ausgeführten Webanwendung neu. Erstellen Sie in der Webanwendung eine neue Chatsitzung, und stellen Sie dem KI-Assistenten eine Frage. Der KI-Assistent antwortet nun mit einer Vervollständigung, die vom Modell erstellt wurde. Beachten Sie auch, dass die Benutzeroberflächenfelder Token jetzt mit der tatsächlichen Tokenverwendung für jede Vervollständigung und jeden Prompt aufgefüllt werden.

    Screenshot of the application running with a connection Azure OpenAI.

  4. Schließen Sie das Terminal.