Paweł Łukasiewicz: programista blogger
Paweł Łukasiewicz
2025-05-18
Paweł Łukasiewicz
2025-05-18
Udostępnij Udostępnij Kontakt
🧠 Planery w Semantic Kernel

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.


🤔 Co to w ogóle są planery?

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:

  1. Wczytaj plik z danymi (FileIOPlugin)

  2. Streść dane (ConversationSummaryPlugin)

  3. Wygeneruj raport (TextPlugin lub LLM)

  4. Zapisz wynik (FileIOPlugin)

I sam to wszystko odpala. 🚀


🔍 Jakie są rodzaje planerów?

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); 

🧪 Przykład: sekwencyjny planer z pluginami

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.


🧠 Gdzie tu magia?

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.


🧩 Planery + Pluginy = mocna para

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.


⚠️ Warto wiedzieć

Rzecz do zapamiętaniaOpis
Planery to nie magiaTworzą plan na podstawie opisu funkcji i promptu
Musisz opisać pluginyDobra dokumentacja funkcji to podstawa
Kolejność ma znaczenieSequentialPlanner zakłada, że funkcje działają po kolei
Debuguj jak normalny kodplan.Steps to po prostu lista kroków — można ją edytować i podglądać

🔮 Co dalej?

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?