Jak zacząć programowanie z Microsoft Semantic Kernel?

Poprzedni post był wprowadzeniem do świata Microsoft Semantic Kernel, omawiając jego kluczowe funkcje oraz możliwości, jakie oferuje w zakresie integracji z modelami językowymi. Dziś przejdziemy do praktycznych aspektów – pokażę, jak zacząć programować z wykorzystaniem Semantic Kernel, krok po kroku.

Instalacja Microsoft Semantic Kernel

Pierwszym krokiem, który należy wykonać, jest dodanie pakietu Microsoft Semantic Kernel do swojego projektu .NET. W tym celu można skorzystać z polecenia:

dotnet add package Microsoft.SemanticKernel

Nawiązanie połączenia z modelem językowym LLM

Gdy mamy już zainstalowaną paczkę, możemy połączyć się z modelem językowym, takim jak ten oferowany przez OpenAI gpt-40-mini. W tym przykładzie zostanie przedstawiona konfiguracja połączenia z modelem GPT-4, z użyciem biblioteki Microsoft.Extensions.Configuration do bezpiecznego zarządzania kluczami API.

Oto przykładowy kod, który ilustruje, jak to zrobić:

using Microsoft.Extensions.Configuration;
using Microsoft.SemanticKernel;

var builder = new ConfigurationBuilder()
    .AddUserSecrets<Program>();

var configuration = builder.Build();
var kernel = Kernel.CreateBuilder()
    .AddOpenAIChatCompletion("gpt-4o-mini", configuration["apiKey"]!)
    .Build();

W powyższym przykładzie konfigurujemy ConfigurationBuilder, aby załadować klucz API z User Secrets, co pozwala na bezpieczne przechowywanie danych uwierzytelniających. Następnie tworzymy instancję Semantic Kernel przy użyciu Kernel.CreateBuilder() i dodajemy obsługę modelu OpenAI za pomocą AddOpenAIChatCompletion. Po zbudowaniu kernelu można go wykorzystać do generowania odpowiedzi od modelu GPT-4 lub innego modelu. Microsoft Semantic Kernel oferuje możliwość integracji nie tylko z modelami językowymi, ale również z innymi usługami AI, takimi jak generowanie obrazów czy przekształcanie dźwięku na tekst. Aby dowiedzieć się więcej o dostępnych usługach oraz jak je zintegrować z Semantic Kernel, możesz odwiedzić ten link.

Co to jest prompt?

Prompt w kontekście large language models (LLM), takich jak GPT, to tekstowe zapytanie lub instrukcja, którą użytkownik wprowadza, aby wygenerować odpowiedź lub treść od modelu. Prompt może być pytaniem, poleceniem lub nawet fragmentem tekstu, który model ma dokończyć lub rozwinąć. Jakość i precyzja promptu mają bezpośredni wpływ na uzyskaną odpowiedź – im bardziej szczegółowy i jasny prompt, tym lepsze wyniki można uzyskać od modelu. Prompting jest więc kluczową umiejętnością w efektywnym korzystaniu z modeli językowych.

Przykład użycia

Poniżej przedstawiam prosty przykład, jak wykorzystać Semantic Kernel do generowania odpowiedzi od modelu GPT-4 na podstawie promptu:

using Microsoft.Extensions.Configuration;
using Microsoft.SemanticKernel;

var builder = new ConfigurationBuilder()
    .AddUserSecrets<Program>();

var configuration = builder.Build();
var kernel = Kernel.CreateBuilder()
    .AddOpenAIChatCompletion("gpt-4o-mini", configuration["apiKey"]!)
    .Build();

const string prompt = "What is Semantic Kernel? Describe it in two sentences.";
var promptAsync = await kernel.InvokePromptAsync(prompt);

Console.WriteLine(promptAsync);
Console.ReadLine();

W powyższym przykładzie najpierw tworzymy i konfigurujemy kernel, a następnie definiujemy prompt, czyli instrukcję tekstową, która zostanie przesłana do modelu językowego. Prompt jest kluczowym elementem w interakcji z modelami AI, ponieważ określa, jakiej odpowiedzi oczekujemy od modelu. W tym przypadku pytamy model o opis Semantic Kernel w dwóch zdaniach. Po wywołaniu funkcji InvokePromptAsync, model zwraca odpowiedź, którą wypisujemy na konsolę.

Definiowanie funkcji (Prompt Function)

Funkcje semantyczne to funkcje, które łączą się z usługami AI, zazwyczaj modelami językowymi (LLM), aby wykonać określone zadanie. Funkcje semantyczne umożliwiają zewnętrznemu modelowi wykonanie zadania na podstawie zdefiniowanego promptu. Funkcje te wcześniej były znane jako funkcje semantyczne, a po wydaniu wersji 1.0 są nazywane funkcjami promptu.

Przykład poniżej pokazuje, jak zdefiniować funkcję promptu, która przetłumaczy tekst z jednego języka na inny:

using Microsoft.Extensions.Configuration;
using Microsoft.SemanticKernel;

var builder = new ConfigurationBuilder()
    .AddUserSecrets<Program>();

var configuration = builder.Build();
var kernel = Kernel.CreateBuilder()
    .AddOpenAIChatCompletion("gpt-4o-mini", configuration["apiKey"]!)
    .Build();

const string prompt = """
                      Translate the following text from {{$source_language}} to {{$target_language}}: "{{$text_to_translate}}"
                      """;

var translateFunction = kernel.CreateFunctionFromPrompt(prompt);

var result = await kernel.InvokeAsync(translateFunction, new KernelArguments
{
    ["source_language"] = "polish",
    ["target_language"] = "english",
    ["text_to_translate"] = "Pracuj tak ciężko jak to możliwe, to zwiększa szanse na sukces. Jeśli inni ludzie pracują 40 godzin w tygodniu, a ty 100 godzin, to ty w 4 miesiące osiągniesz to, co innym zajmie rok."
});

Console.WriteLine(result);
Console.ReadLine();

W powyższym kodzie definiujemy prompt, który zawiera zmienne takie jak {{$source_language}}, {{$target_language}}, oraz {{$text_to_translate}}. Te zmienne mogą być dynamicznie zastępowane wartościami przekazanymi podczas wywołania funkcji. Funkcja promptu jest tworzona za pomocą CreateFunctionFromPrompt, a następnie wywoływana przy użyciu InvokeAsync, gdzie przekazujemy konkretne wartości do zmiennych za pomocą KernelArguments. W tym przykładzie tłumaczymy tekst z polskiego na angielski.

Istnieje możliwość przekazania różnych parametrów określających, jak model przetwarza prompt, co można osiągnąć za pomocą OpenAIPromptExecutionSettings. Umożliwia to kontrolowanie takich parametrów jak maksymalna liczba tokenów, temperatura modelu i inne. Poniższy przykład przedstawia, jak zdefiniować funkcję promptu z niestandardowymi ustawieniami:

var translateFunction = kernel.CreateFunctionFromPrompt(prompt, new OpenAIPromptExecutionSettings()
{
    MaxTokens = 1000,
    Temperature = 0.5,
});

W powyższym przykładzie ustawiamy maksymalną liczbę tokenów na 1000 oraz temperaturę modelu na 0,5, co wpływa na stopień losowości generowanej odpowiedzi.

Podsumowanie

W poście omówiłem krok po kroku proces instalacji i konfiguracji Microsoft Semantic Kernel, w tym nawiązanie połączenia z modelem językowym LLM oraz definiowanie funkcji promptu (wcześniej znanych jako funkcje semantyczne).

W przyszłych postach będę omawiał coraz bardziej zaawansowane zagadnienia związane z Semantic Kernel.

Zapraszam do śledzenia kolejnych postów!