Generative KI-Anwendungen mit Phi-3 SML, C# Semantic Kernel und Ollama entwicklen

Sascha Kiefer

Einleitung

Was ist Phi-3 SLM?

Phi-3 SLM (Small Language Model) ist eine Familie von leistungsfähigen, kosteneffizienten kleinen Sprachmodellen, die von Microsoft entwickelt wurden. Diese Modelle sind darauf ausgelegt, trotz ihrer geringeren Größe eine hervorragende Leistung zu erbringen und eignen sich ideal für generative KI-Anwendungen.

Was ist Semantic Kernel?

Semantic Kernel ist eine Bibliothek und ein Framework von Microsoft, das die Integration von Sprachmodellen in Programmiersprachen wie C#, Python und Java ermöglicht. Es bietet eine einfache und flexible Programmierumgebung, um KI-Funktionen in Anwendungen einzubinden.

Was ist Ollama?

Ollama ist eine Open-Source-Plattform, die es ermöglicht, große und kleine Sprachmodelle (LLMs, SMLs) lokal auf einem Computer auszuführen. Ursprünglich entwickelt, um Llama2-Modelle zu unterstützen, hat Ollama seine Modellbibliothek erweitert und umfasst nun auch Modelle wie Mistral, Phi-2 und Phi-3. Die Plattform bietet eine einfache Möglichkeit, diese Modelle ohne großen Konfigurationsaufwand lokal zu betreiben.

Was ist ein generative KI-Anwendung?

Eine generative KI-Anwendung ist eine Anwendung, die mithilfe von KI-Techniken wie Sprachmodellen Texte, Bilder oder andere Inhalte erzeugt. Beispielsweise ist Chat-GPT eine solche Anwendung.

Voraussetzungen

Um loszulegen, müssen folgende Voraussetzungen erfüllt sein:

Sobald Ollama installiert ist, stellt es eine REST-API bereit, über die auf die Sprachmodelle zugegriffen werden kann. Diese API wird in der Regel unter http://localhost:11434 bereitgestellt.

Da wir uns in diesem Artikel auf das Sprachmodell Phi-3 SLM konzentrieren, müssen wir sicherstellen, dass dieses Modell in Ollama verfügbar ist:

ollama pull phi3:latest

installiert das etwas 2GB große Modell.

Erstellen einer einfachen Kommandozeilenanwendung

Nachdem alle Vorraussetzungen erfüllt sind, können wir eine einfache KI-Anwendung erstellen, die das Phi-3 SLM-Modell verwendet, um Text zu generieren.

dotnet new console -n OllamaPhi3SlmConsoleApp
cd OllamaPhi3SlmConsoleApp

Danach muss die benötigte Abhängigkeiten hinzugefügt:

dotnet add package Microsoft.Extensions.Hosting
dotnet add package Microsoft.SemanticKernel

Nun können wir mit der Implementierung beginnen. In der bereitgestellten Datei Program.cs wird folgender Code hinzugefügt:

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
using System.Text;

// create a new host application builder
var builder = Host.CreateEmptyApplicationBuilder(new HostApplicationBuilderSettings
{
    Args = args
});

// register OpenAI chat completion service
builder.Services.AddOpenAIChatCompletion(
    modelId: "phi3",
    apiKey: null,
    endpoint: new Uri("http://localhost:11434") // With local Ollama OpenAI API endpoint
);

var app = builder.Build();

// create a new chat
var chat = app.Services.GetRequiredService<IChatCompletionService>();

// define the chat system message
var chatSystemMessage = Prompt("What am I?");
if (string.IsNullOrWhiteSpace(chatSystemMessage))
{
    SayGoodbye();
    return;
}

// create a new chat history with the chat system message
var chatHistory = new ChatHistory(chatSystemMessage);

// create a string builder to store the AI response
var stringBuilder = new StringBuilder();

// keep the chat running until the user exits
while (true)
{
    // ask the user for input
    var userQuestion = Prompt();
    if (string.IsNullOrWhiteSpace(userQuestion))
    {
        SayGoodbye();
        break;
    }

    // add the user question to the chat history
    chatHistory.AddUserMessage(userQuestion);

    // get the AI response streamed back to the console
    await foreach (var message in chat.GetStreamingChatMessageContentsAsync(chatHistory))
    {
        Say(message);
        stringBuilder.Append(message.Content);
    }

    // add the AI response to the chat history
    chatHistory.AddAssistantMessage(stringBuilder.ToString());
    stringBuilder.Clear();
}

// prompt the user for a question and return the answer
string? Prompt(string question = "?")
{
    Console.WriteLine();
    Console.Write($"{question} ");

    var answer = Console.ReadLine();
    return answer?.Trim();
}

// write a messages to the console
void Say(StreamingChatMessageContent? message) => Console.Write(message);

// say goodbye to the user
void SayGoodbye() => Console.WriteLine("Goodbye!");

Mit Hilfe der IChatCompletionService-Schnittstelle kann eine Chat-Konversation mit dem Modell geführt und die Antworten auf der Konsole ausgeben werden. Das Modell wird über die Ollama REST-API angesprochen, die auf http://localhost:11434 bereitgestellt wird.

Ausführen der Anwendung

Um die Anwendung auszuführen, wechseln wir in das Projektverzeichnis und führen den folgenden Befehl aus:

dotnet run
Ausgabe der Anwendung

Zusammenfassung

In diesem Artikel haben wir gesehen, wie man generative KI-Anwendungen mit Phi-3 SLM, C# Semantic Kernel und Ollama entwickeln kann. Wir haben eine einfache KI-Anwendung erstellt, die das Phi-3 SLM-Modell verwendet, um auf Benutzereingaben zu reagieren. Durch die Verwendung von Ollama und dem Semantic Kernel können wir die Leistungsfähigkeit von Sprachmodellen in C#-Anwendungen nutzen und interaktive KI-Anwendungen entwickeln.

Quellcode

Der vollständige Quellcode der Anwendung ist auf GitHub verfügbar.

Weiterführende Links

Keinen Artikel mehr verpassen

Kein Spam. Nur relevante News über und von uns. Jederzeit abbestellbar.