Jak používat Semantic Kernel: Praktický průvodce s vzory, výzvami a pluginy
Zkoušeli jste někdy propojit LLM s vaší aplikací a skončili jste s křehkou změti výzev, pomocných funkcí a stavů? Semantic Kernel (SK) existuje právě proto, aby to napravil. Je to odlehčený open-source framework pro orchestraci od Microsoftu pro vytváření aplikací s umělou inteligencí, které kombinují přirozený jazyk, nástroje a paměť – aniž by se váš kód změnil v promptní špagety.
V tomto průvodci si prakticky a na řešení zaměřeně projdeme, jak používat Semantic Kernel od nuly až po produkční vzory. Naučíte se, jak strukturovat výzvy, připojovat nástroje, přidávat paměť, volat více modelů a nasazovat agenty, kteří jednají konzistentně. Příklady budeme držet při zemi a ukážeme vám, na čem záleží.
Co je Semantic Kernel – a proč ho používat?
Semantic Kernel je SDK, které vám pomůže:
- Skládat výzvy a funkce („skills“/pluginy) do pipelines.
- Volat více modelů (OpenAI, Azure OpenAI, lokální modely) zaměnitelně.
- Přidat paměť pro kontext a dlouhodobé vybavování pomocí embeddings.
- Plánovat a orchestrovat vícestupňové úkoly se spolehlivým stavem.
- Integrovat nástroje (API, databáze, file I/O) bezpečně a deterministicky.
Představte si SK jako kontroler, který koordinuje LLM, logiku vaší aplikace a uživatelská data. Místo pevného kódování dlouhých výzev a ad hoc volání nástrojů definujete opakovaně použitelné sémantické funkce a nativní funkce s jasnými vstupy/výstupy.
Běžné případy použití:
- Kopilot pro zákaznickou podporu s generováním rozšířeným o načítání (RAG)
- Workflow agenti (shrnutí → klasifikace → akce)
- Dokument Q&A s pamětí a citacemi
- Pipeline pro kreativní obsah a generování kódu
Rychlý start: Vaše první aplikace Semantic Kernel
Níže je uveden minimální tok, který ukazuje, jak používat Semantic Kernel s chat modelem a jednoduchou výzvou. Pro přehlednost použijeme C#; můžete to samé udělat v Pythonu nebo Javě.
1) Instalace balíčků
# .NET
dotnet add package Microsoft.SemanticKernel
# Volitelné: konektory a plannery se liší podle verze
2) Konfigurace kernelu a modelu
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.OpenAI;
var builder = Kernel.CreateBuilder;
// Vyberte si svého poskytovatele: OpenAI nebo Azure OpenAI
builder.AddOpenAIChatCompletion(
modelId: "gpt-4o-mini", // nebo váš preferovaný model
apiKey: Environment.GetEnvironmentVariable("OPENAI_API_KEY")
);
var kernel = builder.Build;
3) Definování sémantické funkce (prompt)
using Microsoft.SemanticKernel.SemanticFunctions;
var prompt = @"Jste stručný vysvětlovač.
Vysvětlete koncept '{topic}' ve 3 bodech pro začátečníka.";
var explainFunc = kernel.CreateFunctionFromPrompt(prompt);
var result = await explainFunc.InvokeAsync(kernel, new { ["topic"] = "vector embeddings" });
Console.WriteLine(result);
Toto je jádro: kernel, model a prompt přeměněný na opakovaně použitelnou funkci se vstupy.
Sémantické funkce vs. Nativní funkce
- Sémantické funkce: Poháněné výzvami. Vytváříte je ze šablon, předáváte proměnné a získáváte textové nebo strukturované výstupy.
- Nativní funkce: Běžné kódové funkce, které SK zpřístupňuje LLM pro použití nástrojů.
Příklad nativní funkce, která získává počasí z vašeho API a zpřístupňuje ho modelu:
public class WeatherPlugin
{
[KernelFunction, Description("Získat počasí pro město")]
public async Task<string> GetWeatherAsync(
[Description("Název města")] string city)
{
// Zavolejte zde své API pro počasí
var temp = 22; // zástupný symbol
return $"Počasí v {city}: {temp}°C a jasno";
}
}
// Registrace pluginu
var weather = new WeatherPlugin;
kernel.Plugins.AddFromObject(weather, pluginName: "weather");
Nyní mohou vaše výzvy volat weather.GetWeatherAsync jako nástroj, což modelu umožňuje zakotvit odpovědi v reálných datech.
Vzory výzev, které skutečně fungují
Při učení, jak používat Semantic Kernel, nejrychlejší výhry pocházejí z disciplinovaných vzorů výzev:
- System-first: Použijte silnou systémovou zprávu k uzamčení tónu, persony, bezpečnosti a formátu výstupu.
- Proměnné sloty: Pojmenujte zástupné symboly jasně (např.
{topic}, {audience}) a ověřte vstup.
- Výstupní kontrakty: Požádejte o strukturované formáty, jako je JSON; zahrňte schéma do výzvy.
- Few-shot: Poskytněte stručné příklady pro styl a formát, ne pro nafouknutí obsahu.
- Guardrails: Zahrňte omezení („Pokud chybí data, nejprve položte objasňující otázku“).
Příklad strukturované výzvy uvnitř SK:
var prompt = @"
Jste klasifikační engine.
Úkol: Klasifikujte `message` do jedné z [Billing, Tech Support, Sales].
Vraťte striktní JSON: { \"label\": string, \"confidence\": number }
message: {message}
";
var classify = kernel.CreateFunctionFromPrompt(prompt);
var output = await classify.InvokeAsync(kernel, new { ["message"] = "Nemohu se přihlásit ke svému účtu." });
Console.WriteLine(output); // {"label":"Tech Support","confidence":0.89}
Přidání paměti: Embeddings, RAG a kontextová okna
LLM zapomínají. Paměť je činí užitečnými.
- Krátkodobý kontext: Automatický prostřednictvím historie konverzace.
- Dlouhodobá paměť: Ukládejte embeddings uživatelských poznámek, dokumentů nebo událostí a načítajte relevantní části pro kontext.
- RAG: Před voláním funkce generování dotazujte svůj vektorový store a vložte výsledky do výzvy.
Příklad: přidání textové paměti s embeddings a načtení kontextu.
using Microsoft.SemanticKernel.Memory;
var memory = new MemoryBuilder
.WithMemoryStore(new VolatileMemoryStore) // vyměňte za vektorovou DB (Qdrant, Pinecone, Azure AI Search)
.WithTextEmbeddingGeneration(
new OpenAITextEmbeddingGeneration("text-embedding-3-small", Environment.GetEnvironmentVariable("OPENAI_API_KEY")))
.Build;
await memory.SaveInformationAsync(
collection: "policies", id: "refund-policy",
text: "Zákazníci mohou požádat o vrácení peněz do 30 dnů od nákupu s dokladem o zaplacení.");
);
// Později: načtěte a vložte do výzvy
var results = memory.SearchAsync("refund window", collection: "policies", limit: 3, minRelevanceScore: 0.7);
await foreach (var item in results)
{
Console.WriteLine($"Relevantní: {item.Metadata.Text}");
}
Poté vložte nejlepší shody do své sémantické funkce jako kontextové proměnné. Tip: udržujte malé kusy (200–400 tokenů) a deduplikujte.
Použití nástrojů a plánování: Vícestupňové pracovní postupy
Semantic Kernel podporuje plannery, které mohou rozdělit uživatelský cíl na kroky a vybrat, které funkce volat. To je ideální, když máte sadu nativních a sémantických funkcí.
Vzor:
- Shromážděte cíl a omezení od uživatele.
- Navrhněte plán (sekvence volání funkcí s argumenty).
- Provádějte krok za krokem, ověřujte výstupy a zotavujte se z chyb.
Příklad pseudokódu:
// 1) Definujte pluginy (sémantické + nativní) jako dříve
// 2) Použijte planner (API se může lišit podle verze)
var goal = "Shrňte připojené zásady, klasifikujte riziko a odešlete e-mail se zprávou";
// Předpokládejme, že máme pluginy: files, summarize, classify, email
// Planner sestaví plán: files.Load → summarize.Run → classify.Run → email.Send
// Spusťte plán sekvenčně, ověřte výstupy JSON mezi kroky
Doporučené postupy:
- Udělejte kroky idempotentní a testovatelné.
- Nastavte explicitní výstupní schémata mezi kroky.
- Použijte opakování/backoff u síťových nástrojů.
- Zaznamenávejte vstupy/výstupy pro pozorovatelnost (ale vyčistěte PII).
Strategie více modelů: Vyberte správný model pro danou úlohu
Pomocí Semantic Kernel můžete směrovat úkoly do různých modelů:
- Rychlé návrhy → malé, levné modely
- Kroky náročné na usuzování → větší modely
- Embeddings → specializovaný embedding model
- Kód → modely optimalizované pro kód
V praxi:
var kernel = Kernel.CreateBuilder
.AddOpenAIChatCompletion("gpt-4o-mini", apiKey)
.Build;
var fastKernel = Kernel.CreateBuilder
.AddOpenAIChatCompletion("gpt-4o-mini", apiKey) // optimalizováno pro rychlost
.Build;
// Směrujte jednodušší výzvy do fastKernel; složité úkoly do kernel
Nebo nakonfigurujte více služeb ve stejném kernelu a vyberte je pro každou funkci.
Od prototypu k produkci: Guardrails a testování
Když se učíte, jak používat Semantic Kernel v reálných aplikacích, záleží na spolehlivosti:
- Výstupy Schema-first: Použijte schémata JSON a
TryParse gates.
- Determinismus, když je potřeba: Nastavte nízkou teplotu a omezte výstupy.
- Bezpečnostní filtry: Přidejte filtry obsahu a red-team prompts.
- Caching: Cache RAG výsledky a stabilní generace.
- Pozorovatelnost: Zaznamenávejte šablony výzev, proměnné, latenci, využití tokenů.
- Unit testy: Golden test prompts se snapshot comparisons.
Příklad: ověření výstupu JSON.
record Classification(string label, double confidence);
bool TryParseClassification(string text, out Classification cls)
{
try { cls = System.Text.Json.JsonSerializer.Deserialize<Classification>(text)!; return true; }
catch { cls = default!; return false; }
}
Vzory reálného světa, které můžete znovu použít
- RAG Chatbot:
retrieve(context) → answer(question, context) s citacemi.
- Schvalovací pracovní postupy: classify → generate draft → human review → send.
- Content ops: outline → draft → fact-check → tone adjust → publish.
- Agent s nástroji: calendar.lookup, docs.search, email.send; s plánováním a pamětí.
Tip: Zapouzdřete každý krok jako funkci (sémantickou nebo nativní) a složte je do pipelines.
Příklad: Dokument Q&A s citacemi
Pojďme propojit jednoduchou Q&A pipeline, která cituje zdroje pomocí RAG.
// 1) Ingestujte dokumenty do paměti
await memory.SaveInformationAsync("handbook", "vacation-policy",
"Zaměstnanci získávají 1,5 dne PTO měsíčně a mohou převést 5 dní.");
// 2) Načtěte kontext pro otázku
var top = memory.SearchAsync("carry over PTO", "handbook", limit: 3, minRelevanceScore: 0.75);
var contexts = new List<string>;
await foreach (var r in top) contexts.Add(r.Metadata.Text);
// 3) Zeptejte se s kontextem a vyžádejte si citace
var qaPrompt = @"
Odpovídáte striktně z poskytnutého kontextu. Pokud chybí, řekněte, že nevíte.
Zahrňte inline citace jako [source i] pomocí indexu kontextových položek začínajících na 1.
Context:
1) {{ctx1}}
2) {{ctx2}}
Question: {{q}}
";
var qa = kernel.CreateFunctionFromPrompt(qaPrompt);
var variables = new KernelArguments
{
["ctx1"] = contexts.ElementAtOrDefault(0) ?? "",
["ctx2"] = contexts.ElementAtOrDefault(1) ?? "",
["q"] = "Kolik PTO dní mohu převést?"
};
var answer = await qa.InvokeAsync(kernel, variables);
Console.WriteLine(answer);
Běžné nástrahy (a jak se jim vyhnout)
- Jedna obří výzva: Rozdělte na funkce; předejte pouze kontext, který potřebujete.
- Žádné výstupní kontrakty: Vždy definujte schémata pro strojově čitelné kroky.
- RAG bez hygieny: Dobře rozdělte, deduplikujte a řaďte podle relevance a aktuálnosti.
- Rozrůstání nástrojů: Udržujte malá a zdokumentovaná rozhraní pluginů.
- Žádný human-in-the-loop: Přidejte schválení pro vysoce rizikové akce.
Jak používat Semantic Kernel s frontendy
- Webové aplikace: Hostujte svou SK orchestraci ve vrstvě API; streamujte tokeny do UI.
- Chat UIs: Udržujte stav konverzace na straně serveru; prořezávejte a shrnujte.
- Auth: Volání bezpečná pro impersonifikaci – nikdy nedovolte modelu razit tokeny. Braňte volání nástrojů prostřednictvím vašeho backendu.
Kontrolní seznam nasazení
- Proměnné prostředí pro klíče a koncové body
- Omezení rychlosti a opakování pro volání modelů/nástrojů
- Řízení zdrojového kódu šablon výzev
- Zálohování vektorového store a zpracování PII
- Panely pozorovatelnosti (latence, náklady, chyby)
- A/B testování pro výzvy a směrování
Řešení problémů ve stylu FAQ
- „Model halucinuje i s RAG.“ Zpřísněte instrukce: „Odpovídejte pouze z kontextu“ a zahrňte příklad odmítnutí. Zvyšte specificitu načítání a snižte teplotu.
- „JSON se stále rozbíjí.“ Přidejte mini příklad platného JSON a zakažte komentáře. Proveďte post-validaci a parafrázujte při selhání.
- „Latence je vysoká.“ Načítejte méně, relevantnějších kusů; přepněte jednoduché kroky na menší modely; paralelizujte nezávislé kroky.
- „Náklady prudce rostou.“ Cache, komprimujte kontext a směrujte snadné úkoly na levnější modely.
Stojí za zmínku: Stavte rychleji s Sider.AI
Pokud prototypujete výzvy, testujete toky nástrojů nebo porovnáváte odpovědi mezi modely, společník jako Sider.ai může urychlit iteraci. Můžete navrhovat výzvy, spouštět A/B srovnání a zachycovat opakovaně použitelné úryvky před jejich přesunutím do šablon Semantic Kernel – skvělé pro zostření instrukcí a výstupních schémat. Další kroky: Proměňte to v pracovního agenta
- Začněte s jedním jasným úkolem (např. klasifikace e-mailů podpory).
- Definujte sémantické/nativní funkce s přísnými vstupy/výstupy.
- Přidejte paměť pouze tam, kde měřitelně zlepšuje odpovědi.
- Instrumentujte všechno; testujte s reálnými vzorky.
- Iterujte na výzvách pomocí sandboxu, poté kodifikujte v SK.
Klíčové poznatky:
- Semantic Kernel vám pomáhá skládat výzvy, nástroje a paměť do spolehlivých pracovních postupů.
- Použijte výstupní schémata, plannery a multi-model routing pro robustnost a kontrolu nákladů.
- RAG plus guardrails překonává obří výzvy pokaždé.
Jakmile zvládnete, jak používat Semantic Kernel s těmito vzory, dodáte funkce AI, které nejsou jen působivé ukázky – ale spolehlivé systémy.
FAQ
Q1:K čemu se Semantic Kernel používá v aplikacích AI?
Semantic Kernel je orchestracní SDK pro vytváření pracovních postupů AI, které kombinují výzvy LLM, nástroje (nativní funkce) a paměť. Pomáhá vám strukturovat úkoly, přidávat RAG a spolehlivě volat více modelů.
Q2:Jak mohu použít Semantic Kernel pro RAG se svými dokumenty?
Integrovat své dokumenty do vektorového store prostřednictvím paměťových API SK, poté načtěte nejrelevantnější kusy pro každý dotaz a vložte je do své výzvy. To zlepšuje přesnost a snižuje halucinace.
Q3:Může Semantic Kernel volat externí API a služby?
Ano. Zabalte API jako nativní funkce do pluginu a zaregistrujte je v kernelu, aby je model mohl používat jako nástroje. Udržujte malá rozhraní a vynucujte ověřování vstupů/výstupů.
Q4:Které modely fungují se Semantic Kernel?
Semantic Kernel podporuje OpenAI, Azure OpenAI a další konektory. Můžete směrovat úkoly do různých modelů – například menší modely pro návrhy a větší modely pro kroky náročné na usuzování.
Q5:Jak zajistím, aby byly výstupy Semantic Kernel konzistentní (např. JSON)?
Použijte strukturované výzvy, které vyžadují striktní JSON a zahrnují minimální příklad nebo schéma. Nastavte nízkou teplotu, ověřte výstupy po volání a opakujte nebo opravte, když se parsování nezdaří.