Aspire İle Üretken (Generative) AI Uygulamaları Geliştirme
Merhaba,
Bu içeriğimizde OpenRouter platformundan Qwen: Qwen3 32B modellini kullanarak Aspire eşliğinde basit bir yapay zeka destekli içerik analiz aracı geliştireceğiz. Buradaki amacımız, verdiğimiz adresteki makaleyi AI modeli ile analiz ederek, beklentilerimiz doğrultusundaki (özet, etiketler, kritik başlıklar vs. gibi) kimi metrikleri talep edebileceğimiz üretken (generative) bir yapay zeka çalışmasını Aspire geliştirme platformu üzerinden gerçekleştirmektir. Böylece Aspire entegrasyonu ile bu tarz çalışmaların ayağa kaldırılmasının ve uygulamalara yapay zeka desteği eklemenin ne derece kolay olduğunu hep birlikte tecrübe ediyor olacağız. O halde hazırsanız başlayalım…
İlk olarak boş bir Aspire projesi eşliğinde ArticleSummarizer.Api isimli bir Asp.NET Core projesi oluşturalım ve bu projeyi Aspire’da resource olarak referans edelim.
var builder = DistributedApplication.CreateBuilder(args);
builder.AddProject<Projects.ArticleSummarizer_Api>("articlesummarizer-api");
builder.Build().Run();
Ardından bu projelere aşağıdaki kütüphaneleri yükleyelim:
Aspire ➔ Aspire.Hosting.OpenAI
ArticleSummarizer.Api ➔ Aspire.OpenAI
Şimdi öncelikle Aspire projesinde aşağıdaki gibi temel yapılandırmaları sağlayalım:
var builder = DistributedApplication.CreateBuilder(args);
var contentService = builder.AddExternalService("content-source", new Uri("https://www.gencayyildiz.com/blog/"));
var aiModel = builder.AddConnectionString("ai-model");
builder.AddProject<Projects.ArticleSummarizer_Api>("articlesummarizer-api")
.WithReference(contentService)
.WithReference(aiModel);
builder.Build().Run();
Burada 3. satırda AddExternalService metodu ile içerik kaynağını Aspire’ın service discovery sistemine kayıt ediyoruz. Böylece;
// Program.cs içinde
builder.Services.AddHttpClient("content-source", configure =>
{
configure.BaseAddress = new Uri("https+http://content-source");
});
.
.
.
// Kullanımda
var client = httpClientFactory.CreateClient("content-source");
şeklinde bir kullanım imkanı elde etmiş oluyoruz.
Ayrıca 5. satırda ise AddConnectionString ile ‘ai-model’ adına karşılık bir connection string tanımlamasında bulunuyoruz. Bu connection string aşağıdaki gibi
Endpoint={endpoint};Key={key}; formatında appsettings.json dosyasında tutulmaktadır.
"ConnectionStrings": {
"ai-model": "Endpoint=https://openrouter.ai/api/v1;Key=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;Model=qwen/qwen3-32b"
}
7 ile 9. satır aralığında ise bu tanımlanmış olan nesneleri ArticleSummarizer.Api projesine referans ederek kullanılabilir hale getiriyoruz.
Evet, Aspire projesinde yapılacaklar bunlardan ibarettir… Şimdi sıra ArticleSummarizer.Api projesine gelmiş bulunmaktadır, haliyle ilgili projede makale özetleme servisini aşağıdaki gibi oluşturalım:
public class ContentSummaryService(IChatClient chatClient, IHttpClientFactory httpClientFactory)
{
async Task<string> GetContentAsync(string url)
{
var httpClient = httpClientFactory.CreateClient("content-source");
var response = await httpClient.GetAsync(url);
response.EnsureSuccessStatusCode();
var htmlContent = await response.Content.ReadAsStringAsync();
return htmlContent;
}
public async Task<string> SummarizeContentAsync(string url)
{
string content = await GetContentAsync(url);
var response = await chatClient.GetResponseAsync($@"""
Sen bir blog içerik asistanısın.
Aşağıdaki blog yazısını analiz et:
{content}
Mümkün mertebe bu içerikte nelerden bahsediliyor bunu özetle.
Vereceğin çıktı şu formatta olsun :
### ÖZET ### (Max 250 kelime)
...
### Vurgulanması Gereken Noktalar ###
...
### Ana Etiketler ###
...
### Kategori ### (Tahminen hangi kategoriye girdiğini sen söyle)
...
""");
return response.Messages[0].Text;
}
}
Devamında ise Program.cs dosyasını aşağıdaki gibi yapılandıralım:
using ArticleSummarizer.Api.Services;
using Microsoft.AspNetCore.Mvc;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpClient("content-source", configure =>
{
configure.BaseAddress = new Uri("https+http://content-source");
});
builder.Services.AddSingleton<ContentSummaryService>();
builder.AddOpenAIClient("ai-model")
.AddChatClient();
builder.AddServiceDefaults();
var app = builder.Build();
app.MapDefaultEndpoints();
.
.
.
app.Run();
Burada dikkat ederseniz; 6 ile 9. satır aralığında Aspire uygulamasında tanımladığımız contentService yapılandırılmaktadır. Ayrıca 13 ile 14. satır aralığında OpenAI client’ı ile chat servisi IoC’ye eklenmektedir.
Bu çalışmada Aspire kullandığımız için AppHost projesinde tanımlanan kaynaklar (resources) otomatik olarak bağlı projelere enjekte edildiğinden gerekli konfigürasyonel değerler environment’tan çekilecektir. Zaten Aspire’ın farkı da burada ortaya çıkmaktadır…
Ve son olarak aşağıdaki endpoint’i oluşturalım:
app.MapGet("/", ([FromQuery()] string url, ContentSummaryService contentSummaryService) =>
{
return contentSummaryService.SummarizeContentAsync(url);
});
Evet… Artık uygulamamız hazır 🙂 Yapılan bu çalışmalar neticesinde tüm solution’ı derleyip, uygulamayı çalıştıralım ve oluşturduğumuz endpoint’e rastgele içerikler göndererek testimizi gerçekleştirelim…
Nihai olarak,
İçerik boyunca uygulamalarımıza yapay zeka eklemenin karmaşıklığını büyük ölçüde Aspire entegrasyonu ile nasıl ortadan kaldırdığımızı tecrübe etmiş ve böylece Aspire gibi gayet kullanışlı ve gelecek vadeden bir platformun, yarının her türlü ihtiyaçlarına karşı nasıl bir altyapı sağladığını da gözlemlemiş bulunuyoruz.
İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…
