Anwendung von Semantic Kernel: Ein praktischer Leitfaden mit Mustern, Prompts und Plugins
Haben Sie jemals versucht, ein LLM an Ihre App anzuhängen und sind am Ende in einem brüchigen Durcheinander aus Prompts, Hilfsfunktionen und Zuständen gelandet? Semantic Kernel (SK) existiert, um genau das zu beheben. Es ist ein leichtgewichtiges Open-Source-Orchestrierungs-Framework von Microsoft zum Erstellen von KI-gestützten Apps, die natürliche Sprache, Tools und Speicher kombinieren – ohne Ihre Codebasis in ein Prompt-Spaghetti-Chaos zu verwandeln.
In diesem Leitfaden werden wir eine praktische, lösungsorientierte Tour machen, wie man Semantic Kernel von Null zu Produktionsmustern verwendet. Sie lernen, wie man Prompts strukturiert, Tools einbindet, Speicher hinzufügt, mehrere Modelle aufruft und Agents bereitstellt, die konsistent agieren. Wir werden die Beispiele praxisnah halten und Ihnen zeigen, worauf es ankommt.
Was ist Semantic Kernel – und warum sollte man es verwenden?
Semantic Kernel ist ein SDK, das Ihnen hilft:
- („Skills“/Plugins) zu Pipelines .
- (OpenAI, Azure OpenAI, lokale Modelle) austauschbar.
- für Kontext und langfristigen Abruf über Embeddings.
- mit zuverlässigem Zustand.
- (APIs, Datenbanken, Datei-I/O) sicher und deterministisch.
Betrachten Sie SK als den Controller, der LLMs, Ihre Anwendungslogik und Benutzerdaten koordiniert. Anstatt lange Prompts und Ad-hoc-Tool-Aufrufe fest zu codieren, definieren Sie wiederverwendbare semantische Funktionen und native Funktionen mit klaren Ein- und Ausgaben.
Häufige Anwendungsfälle:
- Kundensupport-Copiloten mit Retrieval-Augmented Generation (RAG)
- Workflow-Agenten (zusammenfassen → klassifizieren → Maßnahmen ergreifen)
- Dokumenten-Q&A mit Speicher und Zitaten
- Pipelines für kreative Inhalte und Code-Generierung
Schnellstart: Ihre erste Semantic Kernel App
Nachfolgend finden Sie einen minimalen Ablauf, um zu zeigen, wie man Semantic Kernel mit einem Chatmodell und einem einfachen Prompt verwendet. Wir verwenden C# zur Verdeutlichung; Sie können dasselbe in Python oder Java tun.
1) Installieren Sie Pakete
# .NET
dotnet add package Microsoft.SemanticKernel
# Optional: Connectors und Planer variieren je nach Version
2) Konfigurieren Sie den Kernel und das Modell
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.OpenAI;
var builder = Kernel.CreateBuilder;
// Wählen Sie Ihren Anbieter: OpenAI oder Azure OpenAI
builder.AddOpenAIChatCompletion(
modelId: "gpt-4o-mini", // oder Ihr bevorzugtes Modell
apiKey: Environment.GetEnvironmentVariable("OPENAI_API_KEY")
);
var kernel = builder.Build;
3) Definieren Sie eine semantische Funktion (Prompt)
using Microsoft.SemanticKernel.SemanticFunctions;
var prompt = @"Du bist ein prägnanter Erklärer.
Erkläre das Konzept von '{topic}' in 3 Stichpunkten für einen Anfänger.";
var explainFunc = kernel.CreateFunctionFromPrompt(prompt);
var result = await explainFunc.InvokeAsync(kernel, new { ["topic"] = "vector embeddings" });
Console.WriteLine(result);
Das ist der Kern: ein Kernel, ein Modell und ein Prompt, der in eine wiederverwendbare Funktion mit Eingaben umgewandelt wird.
Semantische Funktionen vs. Native Funktionen
- Semantische Funktionen: Prompt-gesteuert. Sie erstellen sie aus Vorlagen, übergeben Variablen und erhalten Text oder strukturierte Ausgaben.
- Native Funktionen: Reguläre Codefunktionen, die SK dem LLM zur Tool-Nutzung zur Verfügung stellt.
Beispiel für eine native Funktion, die Wetterdaten von Ihrer API abruft und dem Modell zur Verfügung stellt:
public class WeatherPlugin
{
[KernelFunction, Description("Get weather for a city")]
public async Task<string> GetWeatherAsync(
[Description("City name")] string city)
{
// Call your weather API here
var temp = 22; // placeholder
return $"Weather in {city}: {temp}°C and clear";
}
}
// Register plugin
var weather = new WeatherPlugin;
kernel.Plugins.AddFromObject(weather, pluginName: "weather");
Jetzt können Ihre Prompts weather.GetWeatherAsync als Tool aufrufen, wodurch das Modell Antworten in realen Daten verankern kann.
Prompt-Muster, die wirklich funktionieren
Wenn Sie lernen, wie man Semantic Kernel verwendet, erzielt man die schnellsten Erfolge mit disziplinierten Prompt-Mustern:
- System-First: Verwenden Sie eine starke Systemnachricht, um Ton, Persona, Sicherheit und Ausgabeformat festzulegen.
- Variablen-Slots: Benennen Sie Platzhalter eindeutig (z. B.
{topic}, {audience}) und validieren Sie die Eingabe.
- Ausgabeverträge: Fragen Sie nach strukturierten Formaten wie JSON; fügen Sie ein Schema in den Prompt ein.
- Few-Shot: Geben Sie prägnante Beispiele für Stil und Format, nicht für Inhaltsfülle.
- Leitplanken: Fügen Sie Einschränkungen hinzu („Wenn Daten fehlen, stellen Sie zuerst eine klärende Frage“).
Beispiel für einen strukturierten Prompt innerhalb von SK:
var prompt = @"
Du bist eine Klassifizierungs-Engine.
Aufgabe: Klassifiziere die `message` in eine von [Billing, Tech Support, Sales].
Gib striktes JSON zurück: { \"label\": string, \"confidence\": number }
message: {message}
";
var classify = kernel.CreateFunctionFromPrompt(prompt);
var output = await classify.InvokeAsync(kernel, new { ["message"] = "Ich kann mich nicht in mein Konto einloggen." });
Console.WriteLine(output); // {"label":"Tech Support","confidence":0.89}
Hinzufügen von Speicher: Embeddings, RAG und Kontextfenster
LLMs vergessen. Speicher macht sie nützlich.
- Kurzzeitiger Kontext: Automatisch über den Konversationsverlauf.
- Langzeitgedächtnis: Speichern Sie Embeddings von Benutzernotizen, Dokumenten oder Ereignissen und rufen Sie relevante Teile für den Kontext ab.
- RAG: Bevor Sie eine Generierungsfunktion aufrufen, fragen Sie Ihren Vektor-Store ab und fügen Sie die Ergebnisse in den Prompt ein.
Beispiel: Textspeicher mit Embeddings hinzufügen und Kontext abrufen.
using Microsoft.SemanticKernel.Memory;
var memory = new MemoryBuilder
.WithMemoryStore(new VolatileMemoryStore) // swap for a vector 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."
);
// Later: retrieve and stuff into 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}");
}
Füttern Sie dann die Top-Treffer als Kontextvariablen in Ihre semantische Funktion ein. Tipp: Halten Sie die Chunks klein (200–400 Token) und deduplizieren Sie sie.
Tool-Nutzung und Planung: Mehrschrittige Workflows
Semantic Kernel unterstützt Planer, die ein Benutzerziel in Schritte unterteilen und auswählen können, welche Funktionen aufgerufen werden sollen. Dies ist perfekt, wenn Sie eine Toolbox mit nativen und semantischen Funktionen haben.
Muster:
- Sammeln Sie Ziel und Einschränkungen vom Benutzer.
- Entwerfen Sie einen Plan (Sequenz von Funktionsaufrufen mit Argumenten).
- Führen Sie Schritt für Schritt aus, überprüfen Sie die Ausgaben und erholen Sie sich von Fehlern.
Pseudocode-Beispiel:
// 1) Definieren Sie Plugins (semantisch + nativ) wie zuvor
// 2) Verwenden Sie einen Planer (API-Oberfläche kann je nach Version variieren)
var goal = "Fasse die beigefügte Richtlinie zusammen, klassifiziere das Risiko und sende einen Bericht per E-Mail";
// Angenommen, wir haben Plugins: files, summarize, classify, email
// Der Planer wird einen Plan zusammenstellen: files.Load → summarize.Run → classify.Run → email.Send
// Führen Sie den Plan sequenziell aus, validieren Sie JSON-Ausgaben zwischen den Schritten
Bewährte Methoden:
- Machen Sie Schritte idempotent und testbar.
- Legen Sie explizite Ausgabeschemas zwischen den Schritten fest.
- Verwenden Sie Wiederholungen/Backoff bei vernetzten Tools.
- Protokollieren Sie Ein- und Ausgaben zur Beobachtbarkeit (aber bereinigen Sie PII).
Multi-Modell-Strategie: Wählen Sie das richtige Modell für den Job
Mit Semantic Kernel können Sie Aufgaben an verschiedene Modelle weiterleiten:
- Schnelle Entwürfe → kleine, billige Modelle
- Denkintensive Schritte → größere Modelle
- Embeddings → spezialisiertes Embedding-Modell
- Code → codeoptimierte Modelle
In der Praxis:
var kernel = Kernel.CreateBuilder
.AddOpenAIChatCompletion("gpt-4o-mini", apiKey)
.Build;
var fastKernel = Kernel.CreateBuilder
.AddOpenAIChatCompletion("gpt-4o-mini", apiKey) // speed-optimized
.Build;
// Leiten Sie einfachere Prompts an fastKernel weiter; komplexe Aufgaben an kernel
Oder konfigurieren Sie mehrere Dienste im selben Kernel und wählen Sie diese pro Funktion aus.
Vom Prototyp zur Produktion: Leitplanken und Tests
Wenn Sie lernen, wie man Semantic Kernel in realen Apps verwendet, ist Zuverlässigkeit wichtig:
- Schema-First-Ausgaben: Verwenden Sie JSON-Schemas und
TryParse-Gates.
- Determinismus bei Bedarf: Stellen Sie die Temperatur niedrig ein und beschränken Sie die Ausgaben.
- Sicherheitsfilter: Fügen Sie Inhaltsfilter und Red-Team-Prompts hinzu.
- Caching: Cachen Sie RAG-Ergebnisse und stabile Generierungen.
- Beobachtbarkeit: Protokollieren Sie Prompt-Vorlagen, Variablen, Latenz, Token-Nutzung.
- Unit-Tests: Golden Test-Prompts mit Snapshot-Vergleichen.
Beispiel: Validieren Sie die JSON-Ausgabe.
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; }
}
Real-World-Muster, die Sie wiederverwenden können
- RAG-Chatbot:
retrieve(context) → answer(question, context) mit Zitaten.
- Genehmigungs-Workflows: classify → generate draft → human review → send.
- Content-Ops: outline → draft → fact-check → tone adjust → publish.
- Agent mit Tools: calendar.lookup, docs.search, email.send; mit Planung und Speicher.
Tipp: Kapseln Sie jeden Schritt als Funktion (semantisch oder nativ) und setzen Sie sie zu Pipelines zusammen.
Beispiel: Dokumenten-Q&A mit Zitaten
Verbinden wir eine einfache Q&A-Pipeline, die Quellen mithilfe von RAG zitiert.
// 1) Nehmen Sie Dokumente in den Speicher auf
await memory.SaveInformationAsync("handbook", "vacation-policy",
"Employees accrue 1.5 days of PTO per month and can carry over 5 days.");
// 2) Rufen Sie den Kontext für eine Frage ab
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) Fragen Sie mit Kontext und fordern Sie Zitate an
var qaPrompt = @"
Sie antworten strikt aus dem bereitgestellten Kontext. Wenn etwas fehlt, sagen Sie, dass Sie es nicht wissen.
Fügen Sie Inline-Zitate wie [source i] hinzu, indem Sie den Index der Kontext-Elemente ab 1 verwenden.
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);
Häufige Fallstricke (und wie man sie vermeidet)
- Ein einziger riesiger Prompt: Teilen Sie ihn in Funktionen auf; übergeben Sie nur den Kontext, den Sie benötigen.
- Keine Ausgabeverträge: Definieren Sie immer Schemas für maschinenlesbare Schritte.
- RAG ohne Hygiene: Chunk gut, deduplizieren und ordnen Sie nach Relevanz und Aktualität.
- Tool-Wildwuchs: Halten Sie Plugin-Schnittstellen klein und dokumentiert.
- Kein Human-in-the-Loop: Fügen Sie Genehmigungen für risikoreiche Aktionen hinzu.
Wie man Semantic Kernel mit Frontends verwendet
- Web-Apps: Hosten Sie Ihre SK-Orchestrierung in einer API-Schicht; streamen Sie Token an die UI.
- Chat-UIs: Verwalten Sie den Konversationsstatus serverseitig; beschneiden und fassen Sie zusammen.
- Auth: Impersonierungssichere Aufrufe – lassen Sie das Modell niemals Token prägen. Schützen Sie Tool-Aufrufe über Ihr Backend.
Deployment-Checkliste
- Umgebungsvariablen für Schlüssel und Endpunkte
- Ratenbegrenzung und Wiederholungen für Modell-/Tool-Aufrufe
- Prompt-Vorlagen-Quellcodeverwaltung
- Vektor-Store-Backups und PII-Verarbeitung
- Observability-Dashboards (Latenz, Kosten, Fehler)
- A/B-Tests für Prompts und Routing
FAQ-Stil-Fehlerbehebung
- „Das Modell halluziniert auch mit RAG.“ Verschärfen Sie die Anweisungen: „Antworten Sie nur aus dem Kontext“ und fügen Sie ein Verweigerungsbeispiel hinzu. Erhöhen Sie die Retrieval-Spezifität und reduzieren Sie die Temperatur.
- „JSON geht immer wieder kaputt.“ Fügen Sie ein Mini-Beispiel für gültiges JSON hinzu und verbieten Sie Kommentare. Validieren Sie nach dem Aufruf und paraphrasieren Sie bei Fehlern.
- „Die Latenz ist hoch.“ Rufen Sie weniger, relevantere Chunks ab; wechseln Sie einfache Schritte zu kleineren Modellen; parallelisieren Sie unabhängige Schritte.
- „Die Kosten steigen sprunghaft an.“ Cachen, komprimieren Sie den Kontext und leiten Sie einfache Aufgaben an billigere Modelle weiter.
Erwähnenswert: Schneller bauen mit Sider.AI
Wenn Sie Prompts prototypisieren, Tool-Flows testen oder Antworten über verschiedene Modelle hinweg vergleichen, kann ein Tool wie Sider.ai die Iteration beschleunigen. Sie können Prompts entwerfen, A/B-Vergleiche durchführen und wiederverwendbare Snippets erfassen, bevor Sie sie in Semantic Kernel-Vorlagen verschieben – ideal zum Schärfen von Anweisungen und Ausgabeschemas. Nächste Schritte: Verwandeln Sie dies in einen funktionierenden Agenten
- Beginnen Sie mit einer klaren Aufgabe (z. B. Support-E-Mails klassifizieren).
- Definieren Sie semantische/native Funktionen mit strikten Ein- und Ausgaben.
- Fügen Sie Speicher nur dort hinzu, wo er die Antworten messbar verbessert.
- Instrumentieren Sie alles; testen Sie mit realen Beispielen.
- Iterieren Sie Prompts mit einer Sandbox und kodifizieren Sie sie dann in SK.
Wichtige Erkenntnisse:
- Semantic Kernel hilft Ihnen, Prompts, Tools und Speicher zu zuverlässigen Workflows zusammenzufügen.
- Verwenden Sie Ausgabeschemas, Planer und Multi-Modell-Routing für Robustheit und Kostenkontrolle.
- RAG plus Leitplanken schlägt jedes Mal riesige Prompts.
Sobald Sie beherrschen, wie man Semantic Kernel mit diesen Mustern verwendet, werden Sie KI-Funktionen ausliefern, die nicht nur beeindruckende Demos sind – sondern zuverlässige Systeme.
FAQ
F1:Wofür wird Semantic Kernel in KI-Apps verwendet?
Semantic Kernel ist ein Orchestrierungs-SDK zum Erstellen von KI-Workflows, die LLM-Prompts, Tools (native Funktionen) und Speicher kombinieren. Es hilft Ihnen, Aufgaben zu strukturieren, RAG hinzuzufügen und mehrere Modelle zuverlässig aufzurufen.
F2:Wie verwende ich Semantic Kernel für RAG mit meinen Dokumenten?
Nehmen Sie Ihre Dokumente über die Speicher-APIs von SK in einen Vektor-Store auf, rufen Sie dann die relevantesten Chunks pro Abfrage ab und fügen Sie sie in Ihren Prompt ein. Dies verbessert die Genauigkeit und reduziert Halluzinationen.
F3:Kann Semantic Kernel externe APIs und Dienste aufrufen?
Ja. Verpacken Sie APIs als native Funktionen in einem Plugin und registrieren Sie sie beim Kernel, damit das Modell sie als Tools verwenden kann. Halten Sie die Schnittstellen klein und erzwingen Sie die Eingabe-/Ausgabevalidierung.
F4:Welche Modelle funktionieren mit Semantic Kernel?
Semantic Kernel unterstützt OpenAI, Azure OpenAI und andere Konnektoren. Sie können Aufgaben an verschiedene Modelle weiterleiten – z. B. kleinere Modelle für Entwürfe und größere Modelle für denkintensive Schritte.
F5:Wie mache ich Semantic Kernel-Ausgaben konsistent (z. B. JSON)?
Verwenden Sie strukturierte Prompts, die striktes JSON verlangen, und fügen Sie ein minimales Beispiel oder Schema hinzu. Stellen Sie eine niedrige Temperatur ein, validieren Sie die Ausgaben nach dem Aufruf und wiederholen oder reparieren Sie sie, wenn das Parsen fehlschlägt.