Web Sitesine Yapay Zeka Entegrasyonu

Merhaba ben İrem Nur, yazımda staj kapsamında Microsoft’un Semantic Kernel (SK) framework’ünü kullanarak geliştirdiğim ASP.NET Core tabanlı bir AI chat uygulamasının arkasındaki mantığı ve tasarım kararlarını paylaşacağım.  

Proje, ilk etapta kullanıcıdan mesaj alıp AI’dan yanıt döndüren basit bir Razor Pages uygulaması olarak başladı; ancak Azure OpenAI servisleriyle entegrasyon, sohbet geçmişinin veritabanında saklanması ve ölçeklenebilirlik ihtiyaçları derinleştikçe kapsamlı bir chat sistemine dönüştü.

Kullanılan birkaç teknolojiyi ve tercih edilme sebebini açıklayarak başlamak istiyorum. 

Semantic Kernel Nedir? Neden Tercih Edildi?   

Semantic Kernel, Microsoft’un “AI orchestration framework” olarak konumlandırdığı açık kaynaklı bir çözüm. Geleneksel yöntemde bir AI servisinin API’ sine ham HTTP çağrıları yapar, yanıtları manuel olarak parse eder, hata yönetimini ve farklı sağlayıcı entegrasyonlarını kendiniz üstlenirsiniz. Semantic Kernel ise bu karmaşıklığı ortadan kaldırır. Aynı kod tabanıyla OpenAI, Azure OpenAI veya Google AI modellerine erişebilir; her AI görevine özel agent’ler tanımlar; konuşma geçmişini, uzun vadeli hafızayı ve bağlamı otomatik olarak yönetir; ayrıca eklenti sistemi sayesinde haricî servisleri ya da kendi fonksiyonlarınızı modele öğretebilirsiniz. Çoklu sağlayıcı desteği, agent-tabanlı mimari, yerleşik bellek yönetimi araştırma aşamasında Semantic Kernel’ ı tercih etmemin temel nedenlerini oluşturdu. 

Geçmiş Erişimi Nasıl Sağlandı?  

AI chat sistemlerinde en kritik başlıklardan biri kalıcı depolamadır. Kullanıcıların geçmiş konuşmalarına erişmesi ve yöneticilerin sohbet analizi yapabilmesi için her mesajı güvenli ve sorgulanabilir biçimde saklamak gerekir. Format standardizasyonu, oturum yönetimi ve performans gibi kavramlarda çıkan problemleri çözmeye yönelik tercih yaptım. Çözüm olarak, sohbet içeriğini Markdown formatında saklamaya, istemcide HTML’ye dönüştürmeye karar verdim.  

Oturum izolasyonu için her yeni sohbete benzersiz bir session ID atayan ve SK’nin ChatHistory sınıfıyla tüm konuşma bağlamını taşıyan “session-based isolation” yaklaşımını benimsedim. Bu sayede paralel sohbetler birbirini etkilemeden ilerliyor ve model önceki mesajları hatırlıyor; fakat belleğin büyümesi ve sunucu yeniden başlatıldığında oturumların kaybolması gibi ölçeklenebilirlik sorunsalları da beraberinde geliyor. Veritabanı tarafında, her mesajı ayrı kayıt olarak tutan bir “Mesaj” tablosu ve her sohbet oturumuna dair verileri saklayan bir “ChatId” tablosu tasarladım; bu ayrım, mesaj düzeyinde sorgu ve analitiği kolaylaştırdı ve performansı arttırdı.

“Mesaj” Tablosu: 

chatId int
kullanici varchar(50)
mesaj nvarchar(MAX)
zaman datetime
baslik varchar(100)

 

Uygulama Yapısı ve Çalışması  

Çalışma mantığından önce web sitesinin yapısından bahsetmek istiyorum. Aşağıda verilen görselden de görüleceği üzere basit ve işlem odaklı bir arayüz tercih edildi. Kullanıcıyı anasayfada ai ile sohbet edebileceği chat ekranı karşılıyor. En üstte kullanıcının hizmetlere ulaşabileceği butonlar var. Özetleme ve çevirme hizmetlerine bu butonlarla erişiliyor. Sol tarafta daha önce yapılmış sohbetlerin listesi ve erişimini sağlayan kutucuklar bulunuyor. En alt kısımda ise kullanıcının ai’ a göndereceği metnin girileceği alan var.   

Kullanıcı mesajını gönderdikten sonra gelen yanıt yeni bir mesaj kutucuğu ile gösteriliyor. 

Agent’ ların sayfalarına girdiğimizde de metnin girileceği ve özelliğin seçileceği alanlar bizi karşılıyor. Metni gönderdikten sonra gelen cevap yeni açılan mesaj kutusunda sergileniyor. 

Tasarımı incelediğimize göre çalışmasına geçebiliriz. 

AI ile Chat Sayfası  

Kullanıcıyı karşılayan ve ai ile sohbet ettiği ekranın arkasındaki temel mantıktan bahsedelim. Kullanıcıdan gelen her mesaj önce Razor Pages katmanına, oradan da /api/chat uç noktasına ulaşır. API, ilgili kullanıcının veya oturumun ChatHistory nesnesine mesajı ekler ve bu geçmişi tümüyle Semantic Kernel’ e iletir. Modelden gelen yanıt parçalar hâlinde tarayıcıya akarken aynı zamanda ChatHistory’ ye kaydedilir. 

Bu süreçte hem kullanıcı hem asistan mesajları Markdown biçimine dönüştürülerek SQL Server’a kalıcı olarak yazılır. Böylece sayfa yenilense bile diyaloğun tamamı geri getirilebilir. 

Özetleyici ve Çevirmen AI Agentlar  

Uygulamada iki özel yapay zekâ fonksiyonu, biri çeviri diğeri özet üretme görevi üstleniyor. Kullanıcı hizmeti yukarıdaki butonlardan açar ve hizmet için oluşturulmuş sayfaya geçilir. Sayfadaki girdi bölümüne metni girerek çeviri için dil seçeneğini seçerek, özetleme için de özetleme türünü seçerek Ai Agent’ a isteği gönderir. Agent işlemi tamamladıktan sonra açılan metin kutusunda cevabı kullanıcıya sunar.  

Çevirici ajan şu mantıkla çalışıyor: Önce Razor Page’den gelen metin InputText değişkeninde toplanıyor. Ardından yeni bir ChatCompletionAgent nesnesi oluşturuluyor ve Instructions özelliğinde modelin yapacağı iş net olarak tanımlanıyor. Kullanıcı mesajı bir AgentGroupChat nesnesine ekleniyor; bu nesne tek bir sohbet bağlamı içinde yanıt akışını yönetiyor. await foreach döngüsüyle modelden gelen her parça okunarak TranslateResult değişkenine yazılıyor ve tarayıcıya eş zamanlı gösteriliyor. Aynı yapı özetleyici ajan için de geçerli. 

Bu yaklaşımın iki avantajı var. Birincisi, mevcut kernel ve modelin dışına çıkmadan çeviri ile özet görevini üstlenmek ek mikro‑servis gerektirmiyor. İkincisi, prompt şablonunu değiştirerek ajanı yeniden eğitmeye veya yeni bir model kiralamaya gerek kalmadan görev çeşitliliği sağlayabiliyoruz. Böylece kullanıcı, uzun makaleleri tek tıklamayla özetleyebiliyor veya sohbeti başka bir dile anında çevirebiliyor; üstelik tüm bu işlemler aynı oturum bağlamını koruduğu için model önceki mesajlardan hâlâ haberdar kalıyor. 

Bu şekilde ai agentlar da projeye eklendi .

Proje kullanıcının sohbet edebileceği bir ai hizmeti entegrasyonu ile başladı, sonradan bu sohbetleri görüntüleyebilmesi için veritabanı entegrasyonu, kaydı ve ai agent hizmetleri eklenmesiyle tamamlanmış oldu. 

Aklınıza takılan herhangi bir detay için proje dosyasına github’ta iremnurkus ismini aratarak erişebilirsiniz. 

Teşekkürler. 

İrem Nur KUŞ

Selçuk Üniversitesi- Bilgisayar Mühendisliği

iremnurkus15@gmail.com