czyli co działa, co nie działa i czego unikać jak ognia 🔥
Semantic Kernel to potężne SDK, ale jak każda technologia – daje dużo swobody.
A tam, gdzie swoboda… tam i pułapki.
W tym wpisie dzielę się doświadczeniami, które zebrałem budując własne agenty, pluginy i planery.
Zobaczysz:
co działa najlepiej
jak pisać kod, który się nie rozleci
na co uważać przy integracjach, pamięci i promptach
Nie buduj wszystkiego w jednym agencie.
Zamiast tego:
twórz modularne pluginy – małe, odpowiedzialne funkcje
oddziel logikę LLM od infrastruktury
nie ładuj całego świata do prompta – korzystaj z pamięci
🧠 Dobra praktyka: traktuj każdego agenta jak usługę – powinien mieć jasno określone API i odpowiedzialność.
Nie czekaj, aż coś "zadziała".
Testuj swoje prompty:
w Playgroundzie (OpenAI/Azure) zanim wrzucisz do kodu
na różnych danych wejściowych
z różnymi temperaturami
Zapisuj testy w .prompt.txt
i wersjonuj.
Będziesz wiedział, co zmieniło się między deployami.
Memory w Semantic Kernelu to tymczasowy kontekst, nie repo wiedzy.
Nie wrzucaj tam całych książek ani transkrypcji.
Segmentuj dane, używaj tagów, twórz embeddingi z głową.
🧠 Jeśli potrzebujesz „bazy wiedzy” – użyj zewnętrznego wektora (np. Qdrant, Pinecone).
FunctionResult
i SKContext
świadomie
Jeśli wtyczka może się wysypać – zabezpiecz ją.
Jeśli prompt ma wiele ścieżek – sprawdzaj output.
Nie wszystko da się przewidzieć, ale możesz:
sprawdzać context.Variables.ContainsName(...)
pisać testy na funkcje promptowe
logować każdy FunctionResult
Dodaj middleware, który loguje:
nazwę funkcji
prompt wejściowy
output
ewentualne wyjątki
To naprawdę pomaga, kiedy po 10 minutach działania Twój agent mówi:
"Sorry, I don't know what to do next" 🙃
Prompty są wrażliwe na kontekst. Zmiana modelu, inputu, czy nawet kolejności pluginów – może rozwalić działanie.
Używaj PromptTemplateConfig
, a nie gołych stringów.
Planery są świetne, ale jeśli wrzucisz 15 funkcji – model się zgubi.
Ogranicz się do 3-5 opcji, najlepiej powiązanych tematycznie.
Jeśli tworzysz plugin do wysyłania maili – zabezpiecz go.
Nie każdy prompt powinien móc wywołać DeleteAllUserData()
. 😅
Używaj filtrów (FunctionFilter
), ograniczeń i logiki kontekstowej.
Czasem model nie odpowie. Czasem poda bzdury.
Zawsze warto mieć:
defaultowy komunikat
retry logic
plan B (np. kontakt z człowiekiem)
Nie wszystko trzeba wrzucać do LLM-a.
Prosta walidacja? Pętla? Logika?
Zrób to po stronie C#, nie GPT-4.
📄 Zawsze loguj pełne zapytania i odpowiedzi – przyda się do retrainów
🔁 Jeśli coś nie działa – zmień prompt zanim zmienisz kod
🧪 Testuj z różnymi modelami (GPT-3.5 vs GPT-4 vs lokalny LLM)
🧩 Baw się planowaniem funkcji – ale rób to iteracyjnie
✅ Rób | ❌ Nie rób |
---|---|
Twórz małe pluginy | Ładuj wszystko w jedno |
Testuj prompty | Zakładaj, że "zadziała" |
Używaj pamięci z umiarem | Wrzuć wszystko do memory |
Dodawaj logi i fallbacki | Licz, że się nie wysypie |
Ogranicz liczbę funkcji | Wrzuć wszystko do planera |
W kolejnym wpisie stworzymy finalny projekt, tj. połączymy pluginy, scoring, podsumowania i szablony promptów w jedną sensowną aplikację.