AI

Texte generieren mit KI und Semantic Kernel für C#

Die automatische Texterstellung hat in den letzten beiden Jahren dank der rasanten Entwicklungen im Bereich der künstlichen Intelligenz enorme Fortschritte gemacht. Dieser Beitrag bietet einen Einstieg in Verwendung des Semantic Kernel SDK zur Generierung von Texten mit C#.

Semantic Kernel ist ein Open-Source-SDK, das für C#, Python und Java verfügbar ist. Es vereinheitlicht den Zugriff auf verschiedene LLMs und AI-Tools. Dadurch kann Vielzahl von Szenarien so abgebildet werden, ohne Abhängigkeiten zu einem bestimmten Anbieter über die gesamte Codebasis zu verstreuen.

In unserem Beispiel verwenden wir ein Modell, das in Azure OpenAI gehostet wird, um einen kurzen Wetterbericht zu erhalten. Azure OpenAI bietet hierfür beispielsweise die Modelle gpt-35-turbo oder gpt-4 in verschiedenen Varianten an, die über den ChatCompletions-Endpoint Texte generieren können.

Aufsetzen des Semantic Kernel

Zum Einstieg setzen wir ein Konsolenprojekt auf und fügen zuerst das Nuget-Paket Microsoft.SemanticKernel zum Projekt hinzu. Anschließend können wir mit folgendem Code starten:

using Microsoft.Extensions.Configuration;
using Microsoft.SemanticKernel;
using Sample.AI.TextGeneration.SK;

var kernel = Kernel.CreateBuilder()
  .AddAzureOpenAIChatCompletion(
    "<deployment name>",
    "<endpoint name>",
    "<API key>")
  .Build();

Die Kernel-Instanz bildet den Dreh- und Angelpunkt bei der Verwendung des Semantic Kernel. Obiger Code setzt diesen auf und fügt die Dienste für die Verwendung von ChatCompletions auf Azure OpenAI hinzu. Falls die OpenAI-API eingesetzt werden soll, kann AddAzureOpenAIChatCompletion durch AddOpenAIChatCompletion ersetzt werden. Es ist dann lediglich die Angabe des gewünschten Modells und des API-Keys notwendig.

Anschließend setzen wird unseren ersten Prompt ab:

WeatherInfo weather = new()
{
  DegreesCelcius = 12.34f,
  Description = "Sonnig"
};

var response = await kernel.InvokePromptAsync($"""
  Du bist ein freundlicher Wetter-Assistent.
  Bitte gib mir einen kurzen Wetterbericht in zwei Sätzen.
  Die aktuelle Lage ist:
  Temperatur: {weather.DegreesCelcius} °C
  Beschreibung: {weather.Description}
""");
Console.WriteLine(response.ToString());

Nach erfolgreicher Ausführung des Projekts wird in der Konsole ungefähr folgender Text angezeigt:

Öffnen Sie Ihr Fenster, es ist ein herrlicher sonniger Tag
mit angenehmen Temperaturen von etwa 12,34 °C. Es ist der
perfekte Tag, um einen Spaziergang zu genießen!

Einfache Prompt-Templates

Bei der Verwendung von LLMs ist die Verfassung des Prompts von zentraler Bedeutung. Kurze Prompts wie oben sind für einfache Szenarien geeignet; in komplexeren Szenarien gelangen sie schnell an ihre Grenzen. Außerdem werden Prompts oft für verschiedene Eingaben wiederholt erzeugt, so dass Vorlagen unverzichtbar sind.

Semantic Kernel bringt hierfür bereits eine einfache Template-Engine mit:

var promptTemplate = @"""
  Du bist ein freundlicher Wetter-Assistent. Bitte gib mir einen
  kurzen Wetterbericht in zwei Sätzen. Die aktuelle Lage ist:
  Temperatur: {{$degrees}} °C
  Beschreibung: {{$description}}
  """;

var response = await kernel.InvokePromptAsync(promptTemplate, new()
{
    { "degrees", weather.DegreesCelcius },
    { "description", weather.Description },
});

Template-Wiederverwendung

Soll das Template mehrfach eingesetzt werden, bietet es sich an, eine Funktion dafür zu erzeugen, die in mehreren Aufrufen mit verschiedenen Parametern genutzt werden kann:

var promptTemplateFct = kernel.CreateFunctionFromPrompt(@"""
  Du bist ein freundlicher Wetter-Assistent. Bitte gib mir einen
  kurzen Wetterbericht in zwei Sätzen. Die aktuelle Lage ist:
  Temperatur: {{$degrees}} °C
  Beschreibung: {{$description}}
  """,
  new OpenAIPromptExecutionSettings()
  {
    MaxTokens = 100,
    Temperature = 0.3f
  });

var response = await kernel.InvokeAsync(promptTemplateFct, new()
{
  { "degrees", weather.DegreesCelcius },
  { "description", weather.Description },
});

Wie im Code oben gezeigt, kann man hierbei auch einige Einstellungen setzen; beispielhaft herausgegriffen haben wir die Einstellungen Temperature (Kreativität der Ausgabe) und MaxTokens (Länge der Ausgabe). Letztere hat durch die Begrenzung der Ausgabelänge auch Auswirkungen auf die Antwortgeschwindigkeit.

Zusammenfassung

In diesem Artikel haben wir das Semantic Kernel SDK in einem C#-Projekt aufgesetzt und konnten so mit nur wenigen Anwendungen ein Large Language Model einsetzen, um unsere Daten in Textform zu beschreiben. Dies ist natürlich nur der Anfang - in unseren nächsten Artikeln werden wir das Beispiel weiter ausbauen.

AI Azure OpenAI Text generation Chat completions
Markus Wildgruber
Markus Wildgruber

Geschäftsführer

  • CloudArchitect
  • DeveloperCoach
  • DotNet
  • MongoDB
  • Angular