Pewnie słyszałeś o chat gpt, bo kto nie słyszał 😀 W tym poście chciałbym zaprezentować LLM a właściwie SLM stworzony przez Microsoft. Model ten nazywa się Phi-3.
Może najpierw zacznę od tego, czym różnią się modele SLM (Small Language Model) od LLM (Large Language Model). Nazwą – to po pierwsze 😉 SLM mają mniejsze wymagania obliczeniowe, ale podobnie jak LLM mogą być używane w NLP (Natural Language Processing). Przykład LLM to GPT-4. Ciężko byłoby używać LLM na laptopie lokalnie. SLM jak za chwilę się przekonasz, możemy używać na laptopie (na stacjonarnym chyba też 😀).
Phi-3 powstał w trzech wersjach:
– Phi-3-mini (3.8B). Dostępny w dwóch wariantach różniących się liczbą tokenów: 4K oraz 128K
– Phi-3-small (7B)
– Phi-3-medium (14B)
W internecie można znaleźć informacje, że Phi-3 nie jest najlepszy jeśli chodzi o testy z wiedzy ogólnej. Natomiast dość dobrze radzi sobie z tworzeniem postów w social mediach, streszczeniami, analizą tekstów i w marketingu. Zamierzam sprawdzić kilka jego umiejętności.
Aby zacząć musimy najpierw pobrać nasz model:
git lfs install git clone https://huggingface.co/microsoft/Phi-3-mini-4k-instruct-onnx
💡 git lfs install aktywuje Git Large File Storage (LFS) w naszym repozytorium.
Napiszę prostą aplikację konsolową .NET, która pomoże mi przetestować Phi-3. Kod znajduje się tutaj. Aplikacja używa Microsoft.ML.OnnxRuntimeGenAI, którą możesz dodać do swojego projektu tak jak poniżej. ONNX pozwala w łatwy sposób uruchamiać modele ML. Nie jest zależna od innych treningowych frameworków.
dotnet add package "Microsoft.ML.OnnxRuntimeGenAI"
🚨Jeśli będziesz testować aplikację lokalnie to pamiętaj o ustawieniu ścieżki do modelu (w appsettings.json), który sklonowałaś/sklonowałeś wcześniej, np.
{
"AppSettings": {
"ModelPath": "C:\\ml-models\\Phi-3-mini-4k-instruct-onnx\\cpu_and_mobile\\cpu-int4-rtn-block-32"
}
}
W celu przetestowania tworzę klasę PhiPrompt, która odpowiada za interakcję z użytkownikiem. Działanie jest proste: pytamy użytkownika i zwracamy odpowiedź.
using Microsoft.ML.OnnxRuntimeGenAI;
namespace PhiOnxDemoApp;
public class PhiPrompt
{
private readonly Model _model;
private readonly Tokenizer _tokenizer;
private readonly string _systemPrompt =
@"As an AI assistant answer questions using a direct style.";
public PhiPrompt(AppSettings settings)
{
_model = new Model(settings.ModelPath);
_tokenizer = new Tokenizer(_model);
}
public void Run()
{
Console.WriteLine("Hello, how can I help you today?");
while (true)
{
if (!TryGetUserQuestion(out var question))
{
Console.WriteLine("See you next time :-)");
break;
}
ShowAnswer(question!);
}
}
private static bool TryGetUserQuestion(out string? question)
{
Console.WriteLine();
Console.Write(@"Question (press ENTER to finish): ");
question = Console.ReadLine();
return !string.IsNullOrWhiteSpace(question);
}
private void ShowAnswer(string question)
{
Console.WriteLine();
Console.Write("Answer: ");
Console.WriteLine();
var fullPrompt = $"<|system|>{_systemPrompt}<|end|><|user|>{question}<|end|><|assistant|>";
var tokens = _tokenizer.Encode(fullPrompt);
var generatorParams = new GeneratorParams(_model);
generatorParams.SetSearchOption("max_length", 2048);
generatorParams.SetSearchOption("past_present_share_buffer", false);
generatorParams.SetInputSequences(tokens);
var generator = new Generator(_model, generatorParams);
while (!generator.IsDone())
{
generator.ComputeLogits();
generator.GenerateNextToken();
var outputTokens = generator.GetSequence(0);
var newToken = outputTokens.Slice(outputTokens.Length - 1, 1);
var output = _tokenizer.Decode(newToken);
Console.Write(output);
}
Console.WriteLine();
Console.WriteLine();
Console.WriteLine(new string('-', Console.WindowWidth));
}
}
Czas na testowanie. Najpierw sprawdzę, czy dostanę slogan na stronę. Zadaję pytanie give me 5 slogans for website about AI i oto efekt:

Myślę, że gdybym tworzył taką stronę, to coś bym wybrał. To może teraz coś związanego z marketingiem. Zapytam o reklamę dla roweru (give me short ads about road bike).

Jak widać dostaliśmy odpowiedzi. Jeśli nie podamy ilości odpowiedzi to dostaniemy tyle ile ONNX&Phi-3 uzna za słuszne 😉
To teraz przetestuję jak poradzi sobie ze streszczeniem jakiegoś nudnego i długiego tekstu. Moja praca dyplomowa byłaby idealna, ale nie wiem gdzie mam cyfrową wersję 🙂 Wybiorę coś z artykułu z wikipedii https://en.wikipedia.org/wiki/Large_language_model.

No to może teraz coś związanego z historią i takim językiem ogólnym (nietechnicznym). Posłużę się kolejnym artykułem https://en.wikipedia.org/wiki/Marie_Curie. Zamierzam otrzymać 3 zdania streszczające dłuższy tekst.

Moim zdaniem to podsumowanie jest zadowalające (dostaliśmy jeszcze jedno zdanie gratis). No to sprawdźmy jak poradzi sobie z wiedzą ogólną.

Dwie pierwsze odpowiedzi są poprawne. Odpowiedź o pierwiastek też wygląda na poprawną. Ale sprawdziłem i nie jest poprawna. Czyli do liczenia nie za bardzo się nadaje 🙂 Sprawdźmy, czy poradzi sobie z zagadką z serialu/książki „Ślepnąc od świateł”.

I niespodzianka, poradził sobie 😮 Więc jakby to powiedział Jacek: „dobry jest, umie liczyć” 😀
Zamierzam się jeszcze pobawić Phi-3 i może jeszcze opublikuję jakiś post. Przykłady od Microsoft znajdziesz tutaj. Z tego video dowiedziałem się, że jest już Phi-3.5, więc może ten następny post będzie już o nim. Modele znajdują się tutaj.