Hvordan bruke Semantic Kernel: En praktisk veiledning med mønstre, prompter og plugins
Har du noen gang prøvd å koble en LLM til appen din og endt opp med et skjørt virvar av prompter, hjelpefunksjoner og tilstand? Semantic Kernel (SK) eksisterer for å fikse nettopp det. Det er et lettvekts, åpen kildekode-orkestreringsrammeverk fra Microsoft for å bygge AI-første apper som blander naturlig språk, verktøy og minne – uten å gjøre kodebasen din om til en prompt-spaghetti.
I denne veiledningen vil vi ta en praktisk, løsningsorientert tur gjennom hvordan du bruker Semantic Kernel fra null til produksjonsmønstre. Du vil lære hvordan du strukturerer prompter, kobler til verktøy, legger til minne, kaller flere modeller og distribuerer agenter som opptrer konsekvent. Vi vil holde eksemplene jordnære og vise deg hva som betyr noe.
Hva er Semantic Kernel – og hvorfor bruke det?
Semantic Kernel er en SDK som hjelper deg med å:
- Komponere prompter og funksjoner («skills»/plugins) til pipelines.
- Kalle flere modeller (OpenAI, Azure OpenAI, lokale modeller) om hverandre.
- Legge til minne for kontekst og langsiktig tilbakekalling via embeddings.
- Planlegge og orkestrere flertrinns oppgaver med pålitelig tilstand.
- Integrere verktøy (API-er, databaser, fil I/O) trygt og deterministisk.
Tenk på SK som kontrolleren som koordinerer LLM-er, applikasjonslogikken din og brukerdata. I stedet for å hardkode lange prompter og ad hoc-verktøykall, definerer du gjenbrukbare semantiske funksjoner og native funksjoner med klare innganger/utganger.
Vanlige brukstilfeller:
- Kundestøtte-copiloter med retrieval-augmented generation (RAG)
- Arbeidsflytagenter (oppsummer → klassifiser → iverksett tiltak)
- Dokument Q&A med minne og sitater
- Kreative innholds- og kode genererings pipelines
Hurtigstart: Din første Semantic Kernel-app
Nedenfor er en minimal flyt for å vise hvordan du bruker Semantic Kernel med en chat-modell og en enkel prompt. Vi bruker C# for klarhet; du kan gjøre det samme i Python eller Java.
1) Installer pakker
# .NET
dotnet add package Microsoft.SemanticKernel
# Valgfritt: koblinger og planleggere varierer etter versjon
2) Konfigurer kjernen og modellen
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.OpenAI;
var builder = Kernel.CreateBuilder;
// Velg din leverandør: OpenAI eller Azure OpenAI
builder.AddOpenAIChatCompletion(
modelId: "gpt-4o-mini", // eller din foretrukne modell
apiKey: Environment.GetEnvironmentVariable("OPENAI_API_KEY")
);
var kernel = builder.Build;
3) Definer en semantisk funksjon (prompt)
using Microsoft.SemanticKernel.SemanticFunctions;
var prompt = @"Du er en konsis forklarer.
Forklar konseptet '{topic}' i 3 punkter for en nybegynner.";
var explainFunc = kernel.CreateFunctionFromPrompt(prompt);
var result = await explainFunc.InvokeAsync(kernel, new { ["topic"] = "vector embeddings" });
Console.WriteLine(result);
Dette er kjernen: en kjerne, en modell og en prompt gjort om til en gjenbrukbar funksjon med innganger.
Semantiske funksjoner vs. Native funksjoner
- Semantiske funksjoner: Prompt-drevet. Du oppretter dem fra maler, sender variabler og får tekst eller strukturerte utdata.
- Native funksjoner: Vanlige kodefunksjoner som SK eksponerer for LLM for verktøybruk.
Eksempel på native funksjon som henter vær fra API-et ditt og eksponerer det for modellen:
public class WeatherPlugin
{
[KernelFunction, Description("Get weather for a city")]
public async Task<string> GetWeatherAsync(
[Description("City name")] string city)
{
// Kall vær-API-et ditt her
var temp = 22; // placeholder
return $"Weather in {city}: {temp}°C and clear";
}
}
// Registrer plugin
var weather = new WeatherPlugin;
kernel.Plugins.AddFromObject(weather, pluginName: "weather");
Nå kan promptene dine kalle weather.GetWeatherAsync som et verktøy, slik at modellen kan forankre svar i reelle data.
Prompt-mønstre som faktisk fungerer
Når du lærer hvordan du bruker Semantic Kernel, kommer de raskeste gevinstene fra disiplinerte prompt-mønstre:
- System-først: Bruk en sterk systemmelding for å låse tone, persona, sikkerhet og utdataformat.
- Variable slots: Navngi plassholdere tydelig (f.eks.
{topic}, {audience}) og valider inndata.
- Output contracts: Be om strukturerte formater som JSON; inkluder et skjema i prompten.
- Few-shot: Gi konsise eksempler for stil og format, ikke innholds oppblåsing.
- Guardrails: Inkluder begrensninger («Hvis data mangler, still et avklarende spørsmål først»).
Eksempel på strukturert prompt inne i SK:
var prompt = @"
Du er en klassifiseringsmotor.
Oppgave: Klassifiser `message` inn i en av [Billing, Tech Support, Sales].
Returner streng 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}
Legge til minne: Embeddings, RAG og kontekstvinduer
LLM-er glemmer. Minne gjør dem nyttige.
- Korttidskontekst: Automatisk via samtalelogg.
- Langtidsminne: Lagre embeddings av brukernotater, dokumenter eller hendelser og hent relevante biter for kontekst.
- RAG: Før du kaller en genereringsfunksjon, spør vektorlageret ditt og injiser resultater i prompten.
Eksempel: legg til tekstminne med embeddings og hent kontekst.
using Microsoft.SemanticKernel.Memory;
var memory = new MemoryBuilder
.WithMemoryStore(new VolatileMemoryStore) // bytt ut med en vektor 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."
);
// Senere: hent og legg inn i prompt
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}");
}
Mat deretter de beste treffene inn i din semantiske funksjon som kontekstvariabler. Tips: hold biter små (200–400 tokens) og dedupliser.
Verktøybruk og planlegging: Flertrinns arbeidsflyter
Semantic Kernel støtter planleggere som kan bryte ned et brukermål i trinn og velge hvilke funksjoner som skal kalles. Dette er perfekt når du har en verktøykasse med native og semantiske funksjoner.
Mønster:
- Samle mål og begrensninger fra brukeren.
- Utarbeid en plan (sekvens av funksjonskall med argumenter).
- Utfør trinnvis, verifiser utdata og gjenopprett fra feil.
Pseudokode eksempel:
// 1) Definer plugins (semantisk + native) som før
// 2) Bruk en planlegger (API-overflaten kan variere etter versjon)
var goal = "Summarize the attached policy, classify risk, and email a report";
// Anta at vi har plugins: files, summarize, classify, email
// Planner will assemble a plan: files.Load → summarize.Run → classify.Run → email.Send
// Utfør planen sekvensielt, valider JSON-utdata mellom trinn
Beste praksis:
- Gjør trinnene idempotente og testbare.
- Angi eksplisitte utdataschemaer mellom trinn.
- Bruk retries/backoff på nettverksverktøy.
- Logg innganger/utganger for observerbarhet (men skrubb PII).
Strategi for flere modeller: Velg riktig modell for jobben
Ved hjelp av Semantic Kernel kan du rute oppgaver til forskjellige modeller:
- Raske utkast → små, billige modeller
- Resonnementstunge trinn → større modeller
- Embeddings → spesialisert embedding-modell
- Kode → kodeoptimaliserte modeller
I praksis:
var kernel = Kernel.CreateBuilder
.AddOpenAIChatCompletion("gpt-4o-mini", apiKey)
.Build;
var fastKernel = Kernel.CreateBuilder
.AddOpenAIChatCompletion("gpt-4o-mini", apiKey) // speed-optimized
.Build;
// Rute enklere prompter til fastKernel; komplekse oppgaver til kernel
Eller konfigurer flere tjenester i samme kjerne og velg per funksjon.
Fra prototype til produksjon: Guardrails og testing
Når du lærer hvordan du bruker Semantic Kernel i virkelige apper, betyr pålitelighet noe:
- Skjema-første utdata: Bruk JSON-skjemaer og
TryParse porter.
- Determinisme når det trengs: Sett temperaturen lavt og begrens utdata.
- Sikkerhetsfiltre: Legg til innholdsfiltre og red-team prompter.
- Caching: Cache RAG-resultater og stabile genereringer.
- Observerbarhet: Logg prompt-maler, variabler, latens, token-bruk.
- Enhetstester: Golden test prompter med snapshot-sammenligninger.
Eksempel: valider JSON-utdata.
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; }
}
Virkelige mønstre du kan gjenbruke
- RAG Chatbot:
retrieve(context) → answer(question, context) med sitater.
- Godkjenningsarbeidsflyter: klassifiser → generer utkast → menneskelig gjennomgang → send.
- Innholdsoperasjoner: skisser → utkast → faktasjekk → tonejustering → publiser.
- Agent med verktøy: calendar.lookup, docs.search, email.send; med planlegging og minne.
Tips: Innkapsle hvert trinn som en funksjon (semantisk eller native) og sett dem sammen til pipelines.
Eksempel: Dokument Q&A med sitater
La oss koble en enkel Q&A-pipeline som siterer kilder ved hjelp av RAG.
// 1) Legg inn dokumenter i minnet
await memory.SaveInformationAsync("handbook", "vacation-policy",
"Employees accrue 1.5 days of PTO per month and can carry over 5 days.");
// 2) Hent kontekst for et spørsmål
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) Spør med kontekst og be om sitater
var qaPrompt = @"
Du svarer strengt fra den oppgitte konteksten. Hvis du mangler, si at du ikke vet det.
Inkluder inline sitater som [source i] ved hjelp av indeksen til kontekstelementer som starter på 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);
Vanlige fallgruver (og hvordan du unngår dem)
- Enkel gigantisk prompt: Bryt inn i funksjoner; send bare den konteksten du trenger.
- Ingen output contracts: Definer alltid skjemaer for maskinlesbare trinn.
- RAG uten hygiene: Chunk godt, dedupe og ranger etter relevans og aktualitet.
- Verktøy sprawl: Hold plugin-grensesnittene små og dokumenterte.
- Ingen menneske-i-sløyfen: Legg til godkjenninger for høyrisiko handlinger.
Hvordan bruke Semantic Kernel med frontender
- Webapper: Vert din SK-orkestrering i et API-lag; strøm tokens til brukergrensesnittet.
- Chat UIs: Oppretthold samtaletilstand på serversiden; beskjær og oppsummer.
- Auth: Impersoneringssikre samtaler – la aldri modellen prege tokens. Gate verktøy samtaler gjennom backend.
Sjekkliste for distribusjon
- Miljøvariabler for nøkler og endepunkter
- Hastighetsbegrensning og retries for modell/verktøy samtaler
- Vektorlager sikkerhetskopier og PII-håndtering
- Observerbarhet dashbord (latens, kostnad, feil)
- A/B testing for prompter og ruting
Feilsøking i FAQ-stil
- «Modellen hallusinerer selv med RAG.» Stram inn instruksjonene: «Svar bare fra kontekst» og inkluder et avslags eksempel. Øk hentings spesifisiteten og reduser temperaturen.
- «JSON fortsetter å bryte.» Legg til et mini eksempel på gyldig JSON og forby kommentarer. Ettervalider og omformuler ved feil.
- «Latensen er høy.» Hent færre, mer relevante biter; bytt enkle trinn til mindre modeller; parallelliser uavhengige trinn.
- «Kostnadene skyter i været.» Cache, komprimer kontekst og rute enkle oppgaver til billigere modeller.
Verdt å merke seg: Bygg raskere med Sider.AI
Hvis du prototyper prompter, tester verktøyflyter eller sammenligner svar på tvers av modeller, kan en følgesvenn som Sider.ai fremskynde iterasjonen. Du kan utarbeide prompter, kjøre A/B-sammenligninger og fange gjenbrukbare utdrag før du flytter dem inn i Semantic Kernel-maler – flott for å skjerpe instruksjoner og utdataschemaer. Neste trinn: Gjør dette om til en fungerende agent
- Start med en klar oppgave (f.eks. klassifiser støtte-e-poster).
- Definer semantiske/native funksjoner med strenge innganger/utganger.
- Legg bare til minne der det målbart forbedrer svarene.
- Instrumenter alt; test med virkelige eksempler.
- Iterer på prompter ved hjelp av en sandkasse, og kodifiser deretter i SK.
Viktige takeaways:
- Semantic Kernel hjelper deg med å komponere prompter, verktøy og minne til pålitelige arbeidsflyter.
- Bruk utdataschemaer, planleggere og multi-modell ruting for robusthet og kostnadskontroll.
- RAG pluss guardrails slår gigantiske prompter hver gang.
Når du mestrer hvordan du bruker Semantic Kernel med disse mønstrene, vil du sende AI-funksjoner som ikke bare er imponerende demoer – men pålitelige systemer.
FAQ
Q1: Hva brukes Semantic Kernel til i AI-apper?
Semantic Kernel er en orkestrerings-SDK for å bygge AI-arbeidsflyter som kombinerer LLM-prompter, verktøy (native funksjoner) og minne. Den hjelper deg med å strukturere oppgaver, legge til RAG og kalle flere modeller pålitelig.
Q2: Hvordan bruker jeg Semantic Kernel for RAG med dokumentene mine?
Legg dokumentene dine inn i et vektorlager via SKs minne-APIer, og hent deretter de mest relevante bitene per spørring og injiser dem i prompten din. Dette forbedrer nøyaktigheten og reduserer hallusinasjoner.
Q3: Kan Semantic Kernel kalle eksterne APIer og tjenester?
Ja. Pakk APIer som native funksjoner i en plugin og registrer dem med kjernen, slik at modellen kan bruke dem som verktøy. Hold grensesnittene små og håndhev inngangs-/utgangsvalidering.
Q4: Hvilke modeller fungerer med Semantic Kernel?
Semantic Kernel støtter OpenAI, Azure OpenAI og andre koblinger. Du kan rute oppgaver til forskjellige modeller – for eksempel mindre modeller for utkast og større modeller for resonnementstunge trinn.
Q5: Hvordan gjør jeg Semantic Kernel-utdata konsistente (f.eks. JSON)?
Bruk strukturerte prompter som krever streng JSON og inkluderer et minimalt eksempel eller skjema. Sett lav temperatur, valider utdata etter kall, og prøv på nytt eller reparer når parsing mislykkes.