Kako koristiti Semantic Kernel: Praktični vodič sa obrascima, upitima i dodacima
Da li ste ikada pokušali da povežete LLM sa svojom aplikacijom i završili sa krhkom zbrkom upita, pomoćnih funkcija i stanja? Semantic Kernel (SK) postoji upravo da to popravi. To je lagani, open-source okvir za orkestraciju od Microsofta za izgradnju AI-first aplikacija koje kombinuju prirodni jezik, alate i memoriju—bez pretvaranja vašeg koda u špagete od upita.
U ovom vodiču, proći ćemo kroz praktični obilazak orijentisan na rešenja o tome kako koristiti Semantic Kernel od nule do proizvodnih obrazaca. Naučićete kako da strukturirate upite, priključite alate, dodate memoriju, pozovete više modela i rasporedite agente koji deluju dosledno. Primeri će biti praktični i pokazaćemo vam šta je važno.
Šta je Semantic Kernel—i zašto ga koristiti?
Semantic Kernel je SDK koji vam pomaže da:
- Sastavite upite i funkcije ("skills"/plugins) u cevovode.
- Pozovete više modela (OpenAI, Azure OpenAI, lokalni modeli) naizmenično.
- Dodate memoriju za kontekst i dugoročno pamćenje putem ugrađivanja (embeddings).
- Planirate i orkestrirate višestepene zadatke sa pouzdanim stanjem.
- Integrišete alate (API-je, baze podataka, file I/O) bezbedno i deterministički.
Zamislite SK kao kontroler koji koordinira LLM-ove, logiku vaše aplikacije i korisničke podatke. Umesto da ručno kodirate dugačke upite i ad hoc pozive alata, definišete semantičke funkcije za višekratnu upotrebu i izvorne funkcije sa jasnim ulazima/izlazima.
Uobičajeni slučajevi upotrebe:
- Kopilot za korisničku podršku sa generisanjem obogaćenim preuzimanjem (RAG)
- Agenti za tok rada (rezimiraj → klasifikuj → preduzmi akciju)
- Dokument Q&A sa memorijom i citatima
- Cevovodi za kreativni sadržaj i generisanje koda
Brzi početak: Vaša prva Semantic Kernel aplikacija
Ispod je minimalni tok da pokažemo kako koristiti Semantic Kernel sa modelom za ćaskanje i jednostavnim upitom. Koristićemo C# za jasnoću; možete učiniti isto u Pythonu ili Javi.
1) Instalirajte pakete
# .NET
dotnet add package Microsoft.SemanticKernel
# Opciono: konektori i planeri se razlikuju u zavisnosti od verzije
2) Konfigurišite kernel i model
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.OpenAI;
var builder = Kernel.CreateBuilder;
// Izaberite svog provajdera: OpenAI ili Azure OpenAI
builder.AddOpenAIChatCompletion(
modelId: "gpt-4o-mini", // ili vaš željeni model
apiKey: Environment.GetEnvironmentVariable("OPENAI_API_KEY")
);
var kernel = builder.Build;
3) Definišite semantičku funkciju (upit)
using Microsoft.SemanticKernel.SemanticFunctions;
var prompt = @"Vi ste koncizan objašnjavač.
Objasnite koncept '{topic}' u 3 tačke za početnika.";
var explainFunc = kernel.CreateFunctionFromPrompt(prompt);
var result = await explainFunc.InvokeAsync(kernel, new { ["topic"] = "vector embeddings" });
Console.WriteLine(result);
Ovo je suština: kernel, model i upit pretvoreni u funkciju za višekratnu upotrebu sa ulazima.
Semantičke funkcije vs. Izvorne funkcije
- Semantičke funkcije: Pokreću ih upiti. Kreirate ih iz šablona, prosleđujete promenljive i dobijate tekstualne ili strukturirane izlaze.
- Izvorne funkcije: Obične funkcije koda koje SK izlaže LLM-u za upotrebu alata.
Primer izvorne funkcije koja preuzima vremensku prognozu sa vašeg API-ja i izlaže je modelu:
public class WeatherPlugin
{
[KernelFunction, Description("Get weather for a city")]
public async Task<string> GetWeatherAsync(
[Description("City name")] string city)
{
// Pozovite svoj API za vremensku prognozu ovde
var temp = 22; // placeholder
return $"Weather in {city}: {temp}°C and clear";
}
}
// Registrujte plugin
var weather = new WeatherPlugin;
kernel.Plugins.AddFromObject(weather, pluginName: "weather");
Sada vaši upiti mogu pozvati weather.GetWeatherAsync kao alat, omogućavajući modelu da zasniva odgovore na stvarnim podacima.
Obrasci upita koji zaista rade
Kada učite kako da koristite Semantic Kernel, najbrže pobede dolaze od disciplinovanih obrazaca upita:
- Sistem na prvom mestu: Koristite snažnu sistemsku poruku da zaključate ton, personu, sigurnost i format izlaza.
- Promenljivi slotovi: Jasno imenujte čuvare mesta (npr.
{topic}, {audience}) i validirajte ulaz.
- Ugovori o izlazu: Tražite strukturirane formate kao što je JSON; uključite šemu u upit.
- Few-shot: Pružite koncizne primere za stil i format, a ne za preopterećenje sadržajem.
- Zaštitne ograde: Uključite ograničenja (“Ako nedostaju podaci, prvo postavite pojašnjavajuće pitanje”).
Primer strukturiranog upita unutar SK:
var prompt = @"
Vi ste mašina za klasifikaciju.
Zadatak: Klasifikujte `message` u jednu od [Billing, Tech Support, Sales].
Vratite strogi JSON: { \"label\": string, \"confidence\": number }
message: {message}
";
var classify = kernel.CreateFunctionFromPrompt(prompt);
var output = await classify.InvokeAsync(kernel, new { ["message"] = "I can’t log into my account." });
Console.WriteLine(output); // {"label":"Tech Support","confidence":0.89}
Dodavanje memorije: Ugrađivanja (Embeddings), RAG i kontekstni prozori
LLM-ovi zaboravljaju. Memorija ih čini korisnim.
- Kratkoročni kontekst: Automatski putem istorije razgovora.
- Dugoročna memorija: Sačuvajte ugrađivanja korisničkih beleški, dokumenata ili događaja i preuzmite relevantne delove za kontekst.
- RAG: Pre pozivanja funkcije generisanja, upitajte svoju vektorsku prodavnicu i ubacite rezultate u upit.
Primer: dodajte tekstualnu memoriju sa ugrađivanjima i preuzmite kontekst.
using Microsoft.SemanticKernel.Memory;
var memory = new MemoryBuilder
.WithMemoryStore(new VolatileMemoryStore) // zamenite za vektorsku 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: "Customers can request a refund within 30 days of purchase with proof of receipt."
);
// Kasnije: preuzmite i ubacite u upit
var results = memory.SearchAsync("refund window", collection: "policies", limit: 3, minRelevanceScore: 0.7);
await foreach (var item in results)
{
Console.WriteLine($"Relevant: {item.Metadata.Text}");
}
Zatim ubacite najbolje rezultate u svoju semantičku funkciju kao kontekstne promenljive. Savet: neka delovi budu mali (200–400 tokena) i deduplicirajte.
Upotreba alata i planiranje: Višestepeni tokovi rada
Semantic Kernel podržava planere koji mogu razložiti korisnički cilj na korake i izabrati koje funkcije da pozovu. Ovo je savršeno kada imate alatnicu izvornih i semantičkih funkcija.
Obrazac:
- Prikupite cilj i ograničenja od korisnika.
- Napravite nacrt plana (niz poziva funkcija sa argumentima).
- Izvršite korak po korak, verifikujte izlaze i oporavite se od grešaka.
Pseudokod primer:
// 1) Definišite plugins (semantičke + izvorne) kao i ranije
// 2) Koristite planer (API površina može da varira u zavisnosti od verzije)
var goal = "Summarize the attached policy, classify risk, and email a report";
// Pretpostavimo da imamo plugins: files, summarize, classify, email
// Planner će sastaviti plan: files.Load → summarize.Run → classify.Run → email.Send
// Izvršite plan sekvencijalno, validirajte JSON izlaze između koraka
Najbolje prakse:
- Učinite korake idempotentnim i testabilnim.
- Postavite eksplicitne šeme izlaza između koraka.
- Koristite ponavljanja/povlačenja na umreženim alatima.
- Evidentirajte ulaze/izlaze za mogućnost posmatranja (ali uklonite PII).
Strategija sa više modela: Izaberite pravi model za posao
Koristeći Semantic Kernel, možete usmeravati zadatke na različite modele:
- Brzi nacrti → mali, jeftini modeli
- Koraci sa teškim rezonovanjem → veći modeli
- Ugrađivanja (Embeddings) → specijalizovani model za ugrađivanje
- Kod → modeli optimizovani za kod
U praksi:
var kernel = Kernel.CreateBuilder
.AddOpenAIChatCompletion("gpt-4o-mini", apiKey)
.Build;
var fastKernel = Kernel.CreateBuilder
.AddOpenAIChatCompletion("gpt-4o-mini", apiKey) // optimizovano za brzinu
.Build;
// Usmerite jednostavnije upite na fastKernel; složene zadatke na kernel
Ili, konfigurišite više usluga u istom kernelu i izaberite po funkciji.
Od prototipa do proizvodnje: Zaštitne ograde i testiranje
Dok učite kako da koristite Semantic Kernel u stvarnim aplikacijama, pouzdanost je važna:
- Izlazi na prvom mestu sa šemom: Koristite JSON šeme i
TryParse kapije.
- Determinizam kada je potrebno: Postavite nisku temperaturu i ograničite izlaze.
- Sigurnosni filteri: Dodajte filtere sadržaja i red-team upite.
- Keširanje: Keširajte RAG rezultate i stabilne generacije.
- Mogućnost posmatranja: Evidentirajte šablone upita, promenljive, latenciju, upotrebu tokena.
- Jedinični testovi: Zlatni test upiti sa poređenjima snimaka.
Primer: validirajte JSON izlaz.
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; }
}
Obrasci iz stvarnog sveta koje možete ponovo koristiti
- RAG Chatbot:
retrieve(context) → answer(question, context) sa citatima.
- Tokovi rada za odobravanje: klasifikuj → generiši nacrt → ljudska revizija → pošalji.
- Operacije sa sadržajem: nacrt → nacrt → provera činjenica → podešavanje tona → objavljivanje.
- Agent sa alatima: calendar.lookup, docs.search, email.send; sa planiranjem i memorijom.
Savet: Inkapsulirajte svaki korak kao funkciju (semantičku ili izvornu) i sastavite ih u cevovode.
Primer: Dokument Q&A sa citatima
Hajde da povežemo jednostavan Q&A cevovod koji citira izvore koristeći RAG.
// 1) Unesite dokumente u memoriju
await memory.SaveInformationAsync("handbook", "vacation-policy",
"Employees accrue 1.5 days of PTO per month and can carry over 5 days.");
// 2) Preuzmite kontekst za pitanje
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) Pitajte sa kontekstom i zatražite citate
var qaPrompt = @"
Odgovarate strogo iz datog konteksta. Ako nedostaje, recite da ne znate.
Uključite inline citate kao [source i] koristeći indeks kontekstnih stavki počevši od 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"] = "How many PTO days can I carry over?"
};
var answer = await qa.InvokeAsync(kernel, variables);
Console.WriteLine(answer);
Uobičajene zamke (i kako ih izbeći)
- Jedan džinovski upit: Razbijte u funkcije; prosledite samo kontekst koji vam je potreban.
- Nema ugovora o izlazu: Uvek definišite šeme za mašinski čitljive korake.
- RAG bez higijene: Dobro podelite, deduplicirajte i rangirajte po relevantnosti i novini.
- Širenje alata: Održavajte male i dokumentovane interfejse dodataka.
- Nema čoveka u petlji: Dodajte odobrenja za akcije visokog rizika.
Kako koristiti Semantic Kernel sa frontendovima
- Veb aplikacije: Ugostite svoju SK orkestraciju u API sloju; strimujte tokene do UI.
- Chat UI: Održavajte stanje razgovora na strani servera; obrezujte i rezimirajte.
- Auth: Pozivi bezbedni za lažno predstavljanje—nikada ne dozvolite modelu da kuje tokene. Kontrolišite pozive alata preko svog backend-a.
Kontrolna lista za primenu
- Promenljive okruženja za ključeve i krajnje tačke
- Ograničenje brzine i ponavljanja za pozive modela/alata
- Kontrola izvora šablona upita
- Pravljenje rezervnih kopija vektorske prodavnice i rukovanje PII
- Kontrolne table za mogućnost posmatranja (latencija, troškovi, greške)
- A/B testiranje za upite i usmeravanje
Rešavanje problema u stilu FAQ
- “Model halucinira čak i sa RAG.” Pooštrite uputstva: "Odgovorite samo iz konteksta" i uključite primer odbijanja. Povećajte specifičnost preuzimanja i smanjite temperaturu.
- “JSON stalno puca.” Dodajte mini primer važećeg JSON-a i zabranite komentare. Post-validirajte i ponovo parafrazirajte u slučaju neuspeha.
- “Latencija je visoka.” Preuzmite manje, relevantnijih delova; prebacite jednostavne korake na manje modele; paralelizujte nezavisne korake.
- “Troškovi rastu.” Keširajte, komprimujte kontekst i usmerite jednostavne zadatke na jeftinije modele.
Vredi napomenuti: Izgradite brže sa Sider.AI
Ako pravite prototipove upita, testirate tokove alata ili upoređujete odgovore između modela, pratilac kao što je Sider.ai može ubrzati iteraciju. Možete da napravite nacrt upita, pokrenete A/B poređenja i snimite isječke za višekratnu upotrebu pre nego što ih prebacite u Semantic Kernel šablone—odlično za izoštravanje uputstava i šema izlaza. Sledeći koraci: Pretvorite ovo u radnog agenta
- Počnite sa jednim jasnim zadatkom (npr. klasifikujte emailove podrške).
- Definišite semantičke/izvorne funkcije sa strogim ulazima/izlazima.
- Dodajte memoriju samo tamo gde merljivo poboljšava odgovore.
- Instrumentirajte sve; testirajte sa uzorcima iz stvarnog sveta.
- Ponavljajte upite koristeći sandbox, a zatim kodifikujte u SK.
Ključni zaključci:
- Semantic Kernel vam pomaže da sastavite upite, alate i memoriju u pouzdane tokove rada.
- Koristite šeme izlaza, planere i usmeravanje sa više modela za robusnost i kontrolu troškova.
- RAG plus zaštitne ograde pobeđuju džinovske upite svaki put.
Kada savladate kako da koristite Semantic Kernel sa ovim obrascima, isporučićete AI funkcije koje nisu samo impresivne demonstracije—već pouzdani sistemi.
FAQ
P1: Za šta se koristi Semantic Kernel u AI aplikacijama?
Semantic Kernel je SDK za orkestraciju za izgradnju AI tokova rada koji kombinuju LLM upite, alate (izvorne funkcije) i memoriju. Pomaže vam da strukturirate zadatke, dodate RAG i pouzdano pozovete više modela.
P2: Kako da koristim Semantic Kernel za RAG sa svojim dokumentima?
Unesite svoje dokumente u vektorsku prodavnicu putem SK-ovih memorijskih API-ja, a zatim preuzmite najrelevantnije delove po upitu i ubacite ih u svoj upit. Ovo poboljšava tačnost i smanjuje halucinacije.
P3: Može li Semantic Kernel pozvati eksterne API-je i usluge?
Da. Umotajte API-je kao izvorne funkcije u plugin i registrujte ih sa kernelom tako da model može da ih koristi kao alate. Održavajte male interfejse i sprovedite validaciju ulaza/izlaza.
P4: Koji modeli rade sa Semantic Kernelom?
Semantic Kernel podržava OpenAI, Azure OpenAI i druge konektore. Možete usmeravati zadatke na različite modele—na primer, manje modele za nacrte i veće modele za korake koji zahtevaju intenzivno rezonovanje.
P5: Kako da učinim Semantic Kernel izlaze doslednim (npr. JSON)?
Koristite strukturirane upite koji zahtevaju strogi JSON i uključuju minimalni primer ili šemu. Postavite nisku temperaturu, validirajte izlaze nakon poziva i ponovite ili popravite kada raščlanjivanje ne uspe.