czyli jak nauczyć agenta, żeby sam wybierał co i kiedy zrobić
To nie Ty wybierasz funkcje – agent sam zdecyduje, których potrzebuje, żeby osiągnąć cel.
Brzmi magicznie? A to po prostu… Planery — system, który łączy Twoje funkcje (pluginy) w logiczne łańcuchy, zależnie od zadania użytkownika.
W skrócie: to komponenty Semantic Kernel, które automatycznie wybierają, łączą i wykonują odpowiednie funkcje, by osiągnąć określony przez użytkownika cel.
Nie piszesz już kodu typu:
await plugin["A"](context); await plugin["B"](context); await plugin["C"](context);
Zamiast tego piszesz:
"Przygotuj raport z podsumowaniem danych z pliku i zapisz go do PDF"
…a Planer rozkłada to na kroki:
Wczytaj plik z danymi (FileIOPlugin
)
Streść dane (ConversationSummaryPlugin
)
Wygeneruj raport (TextPlugin
lub LLM)
Zapisz wynik (FileIOPlugin
)
I sam to wszystko odpala. 🚀
Wbudowane są dwa główne typy:
StepwisePlanner
Najprostszy — tworzy plan krok po kroku. Przy każdej iteracji decyduje, jaką funkcję wywołać dalej.
✅ Dobry do linearnych procesów
❌ Nie zawsze optymalny przy złożonych zależnościach
var planner = new StepwisePlanner(kernel); var result = await planner.ExecuteAsync("Zrób streszczenie pliku 'chat.txt'");
SequentialPlanner
Tworzy cały plan z góry, czyli listę kroków do wykonania, i potem je realizuje.
✅ Lepszy przy bardziej złożonych celach
❌ Wymaga dobrego promptu, żeby LLM wiedział co zrobić
var planner = new SequentialPlanner(kernel); var plan = await planner.CreatePlanAsync("Zrób analizę treści i zapisz do pliku"); await plan.InvokeAsync(kernel);
Zakładamy, że masz już kernel z pluginami:
var kernel = Kernel.CreateBuilder().AddOpenAIChatCompletion("gpt-4", "key").Build(); kernel.ImportPluginFromObject(new FileIOPlugin("data/"), "fileIO"); kernel.ImportPluginFromPromptDirectory("Plugins/TextSummary", "summary");
Tworzymy planera i plan:
var planner = new SequentialPlanner(kernel); var plan = await planner.CreatePlanAsync("Otwórz plik chat.txt, streść rozmowę i zapisz wynik do summary.txt");
Odpalamy:
await plan.InvokeAsync(kernel);
I gotowe — funkcje zostaną dobrane, złożone i wykonane automatycznie.
Za wszystkim stoi prompt, który Planer wysyła do modelu językowego.
Zawiera on:
Opis dostępnych funkcji (nazwa, parametry, opis działania)
Zadanie od użytkownika (np. “Podsumuj dane z pliku”)
Model analizuje to i tworzy plan — czyli listę kroków z konkretnymi wywołaniami funkcji.
To właśnie tu Semantic Kernel staje się agentem decyzyjnym, a nie tylko nakładką na LLM.
Jeśli masz dobrze nazwane i opisane pluginy, Planer działa zaskakująco dobrze.
👉 Przykład:
Zamiast trzymać logikę przetwarzania danych w kodzie C#, możesz rozdzielić ją między:
promptowe pluginy (np. streszczanie, analizowanie)
natywne pluginy (czytanie plików, wysyłanie maili)
i Planer, który wszystko tym zarządza.
To gotowy fundament pod agenta AI do automatyzacji procesów.
Rzecz do zapamiętania | Opis |
---|---|
Planery to nie magia | Tworzą plan na podstawie opisu funkcji i promptu |
Musisz opisać pluginy | Dobra dokumentacja funkcji to podstawa |
Kolejność ma znaczenie | SequentialPlanner zakłada, że funkcje działają po kolei |
Debuguj jak normalny kod | plan.Steps to po prostu lista kroków — można ją edytować i podglądać |
Planery to nie koniec historii. W następnych wpisach pokażemy, jak:
tworzyć własnych agentów krok po kroku (z pamięcią, tożsamością, celem),
korzystać z komponentów planowania AI na żądanie,
łączyć Semantic Kernel z zewnętrznymi źródłami danych i usługami.
Gotowy na budowanie własnego agenta?