Microsoft .NET AI Template - .NET’te Hızlıca AI Chatbot Oluşturma
Merhaba,
Yakın zamanda Semantic Kernel ve SignalR ile birlikte gerçek zamanlı bir AI chatbot uygulamasını manuel bir şekilde geliştirmiş (bknz: Semantic Kernel & SignalR İle Birlikte Canlı AI Yanıtlarını Gösteren Kendi Chat Uygulamamızı Yazalım) ve hatta YouTube kanalımızda (bknz: inceleme videosu) inceleme videosunu yayınlamıştık. İlgili içeriklerden de anlaşılacağı üzere kullanıcıların AI modelleriyle olan iletişim süreçlerinde bir chatbot uygulaması oluşturmak orta şeker zahmetli ve biraz zaman alıcı cinsten bir sürece sahiptir. Ayrıca, hangi yazılımda olursak olalım bu ihtiyacı karşılamak için sürekli aynı işlemleri yaparak birbirlerini tekrar eden çözümlerle üretimde bulunmamız gerekmektedir. İşte bu durumun farkında olan .NET mimarisinin geliştiricileri; bu ihtiyacı, bu ihtiyacın orta şekerde olsa zahmetini ve hangi durumda olursak olalım esasında sürekli aynı işlemlerin tekrar etmesini görmüş ve bizlere AI destekli chatbot uygulamalarını geliştirmemizi kolaylaştırmak için tasarladıkları hazır bir AI Template sunmuş bulunmaktadırlar. Bizler bu içeriğimizde yeni gelen AI Template’i teknik inceleyecek ve gelecekte ne gibi bir noktaya evrilebileceğine dair vizyon çizip, yorumda bulunacağız. O halde fazla vakit kaybetmeksizin buyurun başlayalım…
AI Template’i Nedir? Neyi Kolaylaştırmaktadır?
Yapay zekanın hayatımıza girişiyle birlikte artık günümüz yazılımlarında olmazsa olmaz diyebileceğimiz AI destekli chatbot’lar, sanal asistanlar veya yapay zeka destekli aramalar gibi özellikler uygulamalar açısından aranan nitelikler olarak oldukça önem kazanmış bulunmakta ve daha da önemlisi bu yeteneklerin uygulamalara entegre edilmesi her zamankinden daha fazla kritik arz etmektedir diyebiliriz. İşte bu duruma istinaden .NET ile AI destekli yapıların geliştirme sürecini daha da rahatlatabilmek ve süreçte geliştirici açısından keşfedilmesi gereken adımları daha rahat inceleme şansı tanıyabilmek için Microsoft tarafından AI template’i biz geliştiricilere sunulmuştur.
Bu template, AI destekli sohbet uygulamaları geliştirmeyi kolaylaştırmak için tasarlanmıştır ve bu ilk sürümü, Microsoft.Extensions.AI ve Microsoft.Extensions.VectorData abstraction’ları kullanılarak oluşturulan Blazor tabanlı bir web uygulamasına odaklıdır. Ayrıca bu template, sohbet uygulamaları için yaygın olarak kullanılan Retrieval Augmented Generation (RAG) pattern’ını kullanmaktadır. Böylece bu template, PDF’lerle veya farklı verilerinizle etkileşime girebilen sohbet tabanlı bir kullanıcı arayüzü oluşturmanıza olanak tanımakla birlikte, prototipleme için de herhangi bir local vector store’unu veya daha gelişmiş yapılandırmalar için ise Azure AI Search‘ü desteklemektedir. Ayrıca template’in odaklandığı işlevsellik gereği kılavuz olarak sunduğu kod gereksinimleriniz doğrultusunda özelleştirilebilir olan belli başlı component’leri içermektedir.
Yani uzun lafın kısası .NET AI template, AI destekli sohbet uygulamalarını hızlı ve kolay bir şekilde geliştirmek için kapsamlı bir başlangıç noktası sağlamaktadır.
İncelediğimiz bu template’in şu anda preview aşamasında olduğuna ve gelecekteki sürümlerin kullanıcıların geri bildirimlerine ve yapay zeka alanındaki hızlı gelişmelere bağlı olarak değişebileceğine dikkatinizi çekerim.
Hangi Tür Veri Kaynakları İle Entegre Edilebilmektedir?
AI template’i özellikle metin tabanlı ve doküman kaynaklı verilerle çalışmak üzere tasarlanmış olsa da, esasında entegre edilebileceği veri yapıları oldukça çeşitlilik göstermektedir. Şöyle ki;
- PDF ve doküman tabanlı verilerin işlemesi için hazır yapı sağlamaktadır.
- Verilerin vektör temsillerini oluşturarak yerel veri tabanlarında saklanmasını ve sorgulanmasını desteklenmektedir.
- Azure AI Search gibi cloud tabanlı arama ve veri işleme servisleriyle entegrasyon altyapısı sunmaktadır.
- Retrieval Augmented Generation (RAG) pattern’ı kullanıldığı için metin tabanlı ve yapılandırılmış farklı veri kaynaklarından gelen içeriklerle zenginleştirilmiş sohbet imkanı sağlamaktadır.
Bunların dışında bu template, farklı veri formatlarını ve kaynaklarını desteklemek üzere esnek şekilde geliştirilebilecek bir yapıya sahiptir.
Hangi AI Model Provider’ları İle Uyumludur?
AI template ile geliştirilen chatbotlar, özellikle OpenAI servisleri başta olmak üzere GitHub, Ollama sağlayıcılarıyla ve hatta Azure OpenAI ve Azure AI Search gibi çeşitli cloud tabanlı AI model provider’larıyla uyumluluk sergilemekte ve bunların dışında API tabanlı entegrasyonlara da imkan tanımaktadır.
Nasıl Kurulur ve Yapılandırılır?
AI template’i kurabilmek ve yapılandırabilmek için ilk olarak Microsoft.Extensions.AI.Templates‘in aşağıdaki talimat eşliğinde bulunulan bilgisayara yüklenmesi gerekmektedir;
Kurulumu gerçekleştirdikten sonra aşağıdaki görselde olduğu gibi AI Chat Web App proje template’i üzerinden uygulama temelleri atılabilmektedir.
Devamında ise minimum kurulumla başlamanın en kolay yolu olarak GitHub provider’ı eşliğinde gitmekte fayda vardır.
Tabi GitHub’ı kullanabilmek için aşağıdaki görselde olduğu gibi bir access token edinilmesi gerekmektedir.
Bunun için; ‘Settings’ -> ‘Developer settings’ -> ‘Fine-grained tokens’ -> ‘Generate new token’ kombinasyonunun takip edilmesi yeterli olacaktır.
Buradan elde edilen token daha hiçbir incelemede bulunmaksızın hemen appsettings.json dosyasına aşağıdaki gibi eklenmelidir;
{
.
.
.
"GitHubModels": {
"Token": "github_pat_11AYQY6XA0zmA7Yg******ENUUBWpxHYSj"
}
}
İşte, yapılandırma bundan ibarettir… Artık altyapı hazır olduğuna göre template’in bizlere sunduğu hazır yapıyı incelemeye geçebiliriz.
Hazır Yapıyı İnceleyelim…
AI template ile bir uygulama oluşturulduğu anda kullanıma hazır bir altyapı sunulmaktadır. İlk etapta tek dokunulması gereken nokta yukarıdaki satırlarda bahsi geçtiği gibi access token’ı kullanacak şekilde yapılandırılma gerekliliğidir. Bunun dışında her şey hazır bir vaziyettedir…
Şimdi bizlere sunulan bu hazır yapılanmayı yüzeysel kritize ederek, hangi teknolojilerle nasıl bir yaklaşım kullanılmış anlamaya çalışalım. Bunun için ‘Program.cs’ dosyasına bakmakta fayda var;
Bu dosyada, genel anlamda AI destekli bir doküman arama (semantik arama) yapılandırması gerçekleştirilmektedir.
using Example_AI_Chat_Project.Components;
using Example_AI_Chat_Project.Services;
using Example_AI_Chat_Project.Services.Ingestion;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.AI;
using Microsoft.Extensions.VectorData;
using OpenAI;
using System.ClientModel;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorComponents().AddInteractiveServerComponents();
// You will need to set the endpoint and key to your own values
// You can do this using Visual Studio's "Manage User Secrets" UI, or on the command line:
// cd this-project-directory
// dotnet user-secrets set GitHubModels:Token YOUR-GITHUB-TOKEN
var credential = new ApiKeyCredential(builder.Configuration["GitHubModels:Token"] ?? throw new InvalidOperationException("Missing configuration: GitHubModels:Token. See the README for details."));
var openAIOptions = new OpenAIClientOptions()
{
Endpoint = new Uri("https://models.inference.ai.azure.com")
};
var ghModelsClient = new OpenAIClient(credential, openAIOptions);
var chatClient = ghModelsClient.GetChatClient("gpt-4o-mini").AsIChatClient();
var embeddingGenerator = ghModelsClient.GetEmbeddingClient("text-embedding-3-small").AsIEmbeddingGenerator();
var vectorStore = new JsonVectorStore(Path.Combine(AppContext.BaseDirectory, "vector-store"));
builder.Services.AddSingleton<IVectorStore>(vectorStore);
builder.Services.AddScoped<DataIngestor>();
builder.Services.AddSingleton<SemanticSearch>();
builder.Services.AddChatClient(chatClient).UseFunctionInvocation().UseLogging();
builder.Services.AddEmbeddingGenerator(embeddingGenerator);
builder.Services.AddDbContext<IngestionCacheDbContext>(options =>
options.UseSqlite("Data Source=ingestioncache.db"));
var app = builder.Build();
IngestionCacheDbContext.Initialize(app.Services);
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error", createScopeForErrors: true);
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseAntiforgery();
app.UseStaticFiles();
app.MapRazorComponents<App>()
.AddInteractiveServerRenderMode();
// By default, we ingest PDF files from the /wwwroot/Data directory. You can ingest from
// other sources by implementing IIngestionSource.
// Important: ensure that any content you ingest is trusted, as it may be reflected back
// to users or could be a source of prompt injection risk.
await DataIngestor.IngestDataAsync(
app.Services,
new PDFDirectorySource(Path.Combine(builder.Environment.WebRootPath, "Data")));
app.Run();
Önemli satırları izah etmemiz gerekirse eğer;
- 17. satırda; bağlantı kurulacak GitHub ile ilgili gerekli credential çalışmaları yapılmaktadır.
- 18 – 23. satır aralığında; Azure üzerinde çalışan OpenAI client yapılandırması sağlanmaktadır.
- 24 – 25. satır aralığında; sohbet için
gpt-4o-mini, text embeddings için isetext-embedding-3-smallmodelleri varsayılan olarak ayarlanmaktadır. - 27. satırda; vector verilerini depolamak için JSON tabanlı bir store oluşturulmaktadır.
Bunların dışında gerisi Blazor mimarisine uygun kodlama çalışmalarıdır.
Artık uygulamayı derleyip çalıştırabilir ve bizlere nasıl bir yapının sunulduğuna bakabiliriz…
Görüldüğü üzere, içerisine örnek amaçlı eklenmiş olan pdf dosyaları üzerinden sorular sorulabilen ve rahatlıkla sohbet edilebilen amatör bir tasarıma sahip bir uygulama karşılamaktadır bizleri. İster lalettayin sohbete başlayabilir, isterseniz de örnek amaçlı gelen pdf’lere dair sualler sorabilirsiniz.
Buradaki test sürecini daha da özelleştirebilir ve yandaki gibi kendinize özel pdf’leri de sürece dahil edip aşağıdaki gibi dosyaya özel sorularla tam teste de tabi tutabilirsiniz. Tabi bunun için öncelikle bu dosyaya uygulama üzerinden erişim sağlanması gerekmektedir. Ee bunun için de ‘Chat.razor’ dosyasında aşağıdaki güncellemenin yapılması gerekmektedir.
.
.
.
<ChatMessageList Messages="@messages" InProgressMessage="@currentResponseMessage">
<NoMessagesContent>
<div>To get started, try asking about these example documents. You can replace these with your own data and replace this message.</div>
<ChatCitation File="Example_Emergency_Survival_Kit.pdf" />
<ChatCitation File="Example_GPS_Watch.pdf" />
<ChatCitation File="Product_Templates.pdf" />
</NoMessagesContent>
</ChatMessageList>
.
.
.
Ayrıca burada önemli olan bir husustan daha bahsetmek istiyorum. Sistemi yapılandıran prompt’un varlığından ve bununla ilgili değişiklik sürecinden.
System Prompt’unun Değiştirilmesi
Template’in bizlere sunmuş olduğu yapıda AI modelinin davranışını şekillendirmek ve sınırlarını belirlemek üzere bir talimat seti mevcuttur. Bu talimatlar ‘Chat.razor’ dosyası içerisinde tanımlanmış olan SystemPrompt property’sinde aşağıdaki şekilde bulunmaktadır.
Burada varsayılan olarak gelen talimat setine bakarsak eğer;
| İngilizce | Türkçe |
|---|---|
|
You are an assistant who answers questions about information you retrieve. Do not answer questions about anything else. Use only simple markdown to format your responses. Use the search tool to find relevant information. When you do this, end your <citation filename=’string’ page_number=’number’>exact quote here</citation> Always include the citation in your response if there are results. The quote must be max 5 words, taken word-for-word from the search result, and is the basis for why the citation is relevant. |
Siz, aldığınız bilgilerle ilgili soruları yanıtlayan bir asistansınız. Başka hiçbir şey hakkındaki soruları yanıtlamayın. Yanıtlarınızı biçimlendirmek için yalnızca basit markdown kullanın. İlgili bilgileri bulmak için arama aracını kullanın. Bunu yaptığınızda, yanıtınızı özel XML biçiminde alıntılarla sonlandırın: <citation filename=’string’ page_number=’number’>alıntı buraya</citation> Sonuçlar varsa, alıntıyı her zaman yanıtınıza ekleyin. Alıntı en fazla 5 kelime olmalı, arama sonucundan kelimesi kelimesine alınmalı ve alıntının neden alakalı olduğunun temelini oluşturmalıdır. Alıntıların varlığına atıfta bulunmayın; bu etiketleri sadece en sonunda, çevreleyen metin olmadan yayınlayın. |
şeklinde belirlendiğini görüyoruz. Bunu istediğiniz gibi şekillendirebilir ve sınırları belirleyebilirsiniz. Misal olarak ben aşağıdaki gibi bir sistem prompt’u eşliğinde bir test gerçekleştirmek istedim 🙂
@code {
private const string SystemPrompt = @"
Sen şakacı bir asistansın.
Gelen sorulara doğru cevap vereceksin ama her cümleye saçma da olsa bir şakayla başlayacaksın.
";
.
.
.
Aman Allah’ım… 🫢🫢İğrenç şakalar yapıyor 🤣Tabi bu sistem prompt’unu iş mantığı ve gereksinimi doğrultusunda AI modelini şekillendirmek maksadıyla daha mevzuat temelli oluşturmakta fayda vardır. Ne de olsa, örnekteki sistem prompt’una karşı görseldeki gibi saçmalıyor olması, doğru ve açık bir şekilde verilen mevzuata da hakkıyla uyacağının açık teminatıdır diyebiliriz 🙂
Nihai olarak;
Görüyorsunuz ki AI template’i, .NET ve Blazor altyapısında AI destekli bir sohbet uygulamasını kolaylıkla oluşturmak için bizlere bir yol sunmaktadır. Artık bu gelişmeden sonra arayüze dokunuşlarda bulunarak kendinize göre şekillendirebilir ve ek belge türleri ekleyerek uygulamanın işlevselliğini daha da genişletebilir ve hatta koda müdahale ederek de istediğiniz gibi özelleştirmelerde bulunabilirsiniz.
İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…
Not : Örnek çalışmaya aşağıdaki GitHub adresinden erişebilirsiniz.
https://github.com/gncyyldz/Example_AI_Chat_Project

Merhaba Anlatımınızdan Dolayı Teşekkür Ederim,
.net Core Yapısında PostgreSQL Kullanarak Geliştirdiğim Projede Dahilinde Entity ve Context Kullanarak Mevcut DB Yapısı Üzerinden Bir Sorgulama Nasıl Yaptırabilirim ?
Amacım Bir Chat Agent Uygulamasına EK Bir Denetim Durumunda Kişinin Karşısında Chat Ekranı ve Soruların Karlışığı Olarak DB’ den Alınan Canlı Veri İle Bir Entegrasyon Yapmak İstiyorum