Semantic Kernel, Microsoft tarafından geliştirilen açık kaynaklı bir LLM orchestration framework'üdür. Büyük dil modellerini uygulamanızın iş mantığıyla bağlamak için plugin sistemi, otomatik fonksiyon çağrısı ve prompt template yönetimi sunar.
Kurulum ve Kernel Oluşturma
// dotnet add package Microsoft.SemanticKernel
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.OpenAI;
var kernel = Kernel.CreateBuilder()
.AddOpenAIChatCompletion("gpt-4o", "sk-...")
.Build();
// Basit prompt çalıştırma
var sonuc = await kernel.InvokePromptAsync(
"{{$konu}} konusunu Türkçe olarak 3 maddeyle açıkla",
new KernelArguments { ["konu"] = "Dependency Injection" });
Console.WriteLine(sonuc);
Plugin Sistemi: Native Functions
Plugin'ler, LLM'in çağırabileceği C# metodlarıdır. [KernelFunction] attribute'u bir metodu otomatik olarak araç olarak tanımlar.
using System.ComponentModel;
public class KodAraclariPlugin
{
[KernelFunction("kod_incele")]
[Description("Verilen C# kodunu inceler ve iyileştirme önerileri sunar")]
public string KodIncele(
[Description("İncelenecek C# kodu")] string kod,
[Description("Odak noktası: performans, guvenlik veya okunabilirlik")] string odak = "genel")
{
// Gerçek bir senaryoda statik analiz aracı çağrılabilir
return $"Kod analizi başlatılıyor... Odak: {odak}\nKod uzunluğu: {kod.Length} karakter";
}
[KernelFunction("paket_ara")]
[Description("NuGet'te paket arar ve popüler alternatifleri listeler")]
public async Task<string> PaketAraAsync(
[Description("Aranacak paket adı veya kategori")] string arama)
{
// Gerçek senaryoda NuGet API çağrısı yapılır
await Task.Delay(100);
return $"'{arama}' için önerilen paketler: ...";
}
}
// Kernel'e kayıt
kernel.ImportPluginFromObject(new KodAraclariPlugin(), "KodAraclari");
Otomatik Fonksiyon Çağrısı
var settings = new OpenAIPromptExecutionSettings
{
ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
};
// Model hangi fonksiyonu çağıracağına kendisi karar verir
var yanit = await kernel.InvokePromptAsync(
"HttpClient kullanımı için en iyi NuGet paketlerini önerir misin?",
new KernelArguments(settings));
Console.WriteLine(yanit);
// Kernel otomatik olarak paket_ara fonksiyonunu çağırır
// ve sonucu konuşmaya dahil eder
Prompt Template'leri
// Yeniden kullanılabilir prompt fonksiyonu
string sablonMetni = """
Sen uzman bir {{$dil}} kod inceleyicisin.
Aşağıdaki kodu incele ve şunları değerlendir:
1. Olası hatalar ve güvenlik açıkları
2. Performans iyileştirme fırsatları
3. SOLID prensiplerine uyum
Kod:
```{{$dil_adi}}
{{$kod}}
```
Yanıtını maddeler halinde ver.
""";
var inceleFunc = kernel.CreateFunctionFromPrompt(sablonMetni,
new OpenAIPromptExecutionSettings { MaxTokens = 1500 });
var incelemeYaniti = await kernel.InvokeAsync(inceleFunc, new KernelArguments
{
["dil"] = "C#",
["dil_adi"] = "csharp",
["kod"] = """
public List<User> GetUsers()
{
var db = new DatabaseContext();
return db.Users.ToList();
}
"""
});
Console.WriteLine(incelemeYaniti);
Sohbet Geçmişi ile Konuşma
using Microsoft.SemanticKernel.ChatCompletion;
var chatService = kernel.GetRequiredService<IChatCompletionService>();
var gecmis = new ChatHistory();
gecmis.AddSystemMessage(
"Sen deneyimli bir .NET mimarısın. Kısa, net ve uygulanabilir tavsiyeler ver.");
// Konuşma döngüsü
Console.Write("Sen: ");
var girdi = Console.ReadLine();
while (!string.IsNullOrWhiteSpace(girdi))
{
gecmis.AddUserMessage(girdi);
var yanit = await chatService.GetChatMessageContentAsync(
gecmis,
new OpenAIPromptExecutionSettings
{
ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
},
kernel);
gecmis.AddAssistantMessage(yanit.Content!);
Console.WriteLine($"Asistan: {yanit.Content}\n");
Console.Write("Sen: ");
girdi = Console.ReadLine();
}
DI ile Semantic Kernel
// Program.cs
builder.Services.AddKernel()
.AddOpenAIChatCompletion("gpt-4o", builder.Configuration["OpenAI:ApiKey"]!)
.Plugins.AddFromType<KodAraclariPlugin>("KodAraclari");
// Servis sınıfında kullanım
public class KodAsistaniService(Kernel kernel)
{
public async Task<string> IncelemeYapAsync(string kod, string odak)
{
var settings = new OpenAIPromptExecutionSettings
{
ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
};
var yanit = await kernel.InvokePromptAsync(
$"�?u kodu '{odak}' açısından incele:\n```csharp\n{kod}\n```",
new KernelArguments(settings));
return yanit.ToString();
}
}
Semantic Kernel, LLM'lerin yeteneklerini kendi iş mantığınızla birleştirmenin en olgun .NET çözümüdür. Plugin sistemi sayesinde modele gerçek araçlar verirken, prompt template yönetimi uygulamanızın AI davranışını kodun geri kalanından ayrı ve yönetilebilir tutar.