Kişiselleştirilmiş beslenme danışmanlığına erişmek ve sağlıklı yaşam hedeflerinize ulaşmak karmaşık olabilir. İşte tam bu noktada, yapay zeka destekli bir beslenme asistanı olan FatAdvisor projesinin temellerini atarak bu zorlukların üstesinden nasıl geleceğimizi keşfedeceksiniz.
Modern yaşamın getirdiği yoğun tempo, insanların sağlıklı beslenme alışkanlıkları edinmesini veya sürdürmesini zorlaştırıyor. Gün içinde ne yediğimizi takip etmek, makro ve mikro besin dengesini sağlamak, kişisel hedeflerimize uygun diyetler oluşturmak çoğu zaman gözümüzde büyüyor. Fast food seçeneklerinin cazibesi, bilgi kirliliği ve uzman danışmanlık hizmetlerinin maliyeti de bu süreci daha karmaşık hale getiren faktörlerden. Peki, bu kaotik ortamda bize rehberlik edebilecek, kişisel ihtiyaçlarımıza göre uyarlanmış, doğru ve anlık geri bildirim sağlayabilecek bir çözüm mümkün mü? İşte tam da bu noktada, yapay zeka destekli bir beslenme asistanı olan FatAdvisor devreye giriyor. FatAdvisor, kullanıcıların günlük yiyecek alımlarını analiz ederek, besin değerlerini hesaplayarak, kişisel hedefler (kilo kaybı, kas kazanımı, genel sağlık) doğrultusunda öneriler sunarak ve hatta potansiyel alerjenler veya besin eksiklikleri konusunda uyararak sağlıklı beslenme yolculuğunu kolaylaştırmayı hedefliyor.
Bu proje, sadece bir kalori takip uygulaması olmanın ötesine geçerek, bir sohbet botu gibi kullanıcıyla doğal bir dilde iletişim kurabilen, yemek fotoğraflarını tanıyabilen (ilerleyen aşamalarda) ve en önemlisi, kişiye özel adaptif beslenme planları oluşturabilen bir sistem olmayı amaçlıyor. Düşünsenize, akşam yemeğinde ne yiyeceğinize karar veremediğinizde, telefonunuza “Bugün ne yesem?” diye sorduğunuzda, FatAdvisor size buzdolabınızdaki malzemelere, beslenme hedeflerinize ve hatta o günkü aktivite seviyenize göre anında bir tarif öneriyor. Veya bir restoranda menüye bakarken, hangi yemeğin diyetinize en uygun olduğunu anında söyleyebiliyor. Bu, beslenme danışmanlığını cebimize getiren, 7/24 yanımızda olan bir kişisel koç gibi düşünülebilir. Bu tür bir sistem, sadece bireysel sağlık ve refahı artırmakla kalmıyor, aynı zamanda genel halk sağlığına da önemli katkılar sağlayabilir. Kronik hastalıkların önlenmesinden sporcuların performansını artırmaya kadar geniş bir yelpazede fayda sunma potansiyeli taşıyor. Dolayısıyla, evet, beslenme alışkanlıklarımızı kökten değiştirebilecek, bize özel çözümler sunan bir AI asistanına kesinlikle ihtiyacımız var ve FatAdvisor bu ihtiyacı karşılamak üzere yola çıkıyor. Bu makale serisinin ilk bölümünde, bu vizyonu gerçeğe dönüştürecek sağlam bir teknolojik temelin nasıl atılacağını adım adım inceleyeceğiz.
FatAdvisor Projesinin Temel Taşları Neler Olmalı?
Her büyük yazılım projesi gibi, FatAdvisor’ın da başarılı olabilmesi için sağlam ve düşünülmüş bir temel mimariye ihtiyacı vardır. Bu temel, projenin sadece bugünkü ihtiyaçlarını karşılamakla kalmayıp, gelecekteki genişlemeleri ve yeni özellik entegrasyonlarını da sorunsuz bir şekilde destekleyebilmelidir. FatAdvisor için bu temel taşları oluştururken, performans, güvenlik, ölçeklenebilirlik ve kullanıcı deneyimi gibi kritik faktörleri göz önünde bulundurmalıyız. Projemizin çekirdeğini, .NET ekosisteminin gücünü kullanarak bir API katmanı, robust bir veri modellemesi ve gelecekteki yapay zeka entegrasyonlarına açık bir yapı oluşturacak şekilde tasarlayacağız.
İlk olarak, API Katmanı projenin beyni ve sinir sistemi olacak. Bu katman, hem mobil uygulamamızdan hem de web arayüzümüzden gelen tüm talepleri işleyecek, veri tabanıyla iletişim kuracak ve yapay zeka modülleriyle entegrasyonu sağlayacak. .NET Core, yüksek performansı, çapraz platform desteği ve geniş geliştirici topluluğu sayesinde bu katman için ideal bir seçim. RESTful prensiplerine uygun olarak tasarlanacak bir API, farklı istemcilerle kolayca iletişim kurabilmemizi garantileyecek. İkinci temel taşımız Veri Modellemesi ve Saklama. Beslenme verileri oldukça çeşitlidir: kullanıcı bilgileri, yiyecek maddeleri, öğünler, besin değerleri, alerjiler ve daha fazlası. Bu verilerin mantıklı ve ilişkisel bir şekilde modellenmesi, hem veri bütünlüğünü sağlamak hem de sorgulama performansını optimize etmek açısından hayati öneme sahip. İlişkisel bir veritabanı (örneğin SQL Server veya PostgreSQL) Entity Framework Core ile birlikte, bu karmaşık veri yapısını yönetmek için güçlü bir çözüm sunuyor.
Üçüncü ve belki de en heyecan verici temel taş ise Yapay Zeka Entegrasyonu. FatAdvisor’ı diğer beslenme uygulamalarından ayıran en önemli özellik yapay zeka yetenekleri olacak. Bu ilk aşamada, Azure OpenAI gibi hizmetlerle temel bir entegrasyon kurarak, kullanıcılardan doğal dil girdilerini alıp işleyebilecek ve basit beslenme tavsiyeleri veya sorulara yanıtlar üretebilecek bir yapı inşa edeceğiz. Bu entegrasyon, gelecekte makine öğrenimi modelleriyle daha derinlemesine kişiselleştirilmiş öneriler sunmanın kapılarını aralayacak. Son olarak, Kullanıcı Arayüzü (UI) ve Kullanıcı Deneyimi (UX) FatAdvisor’ın benimsenmesi için kilit bir rol oynayacak. Temelleri atarken, API’mizin farklı frontend teknolojileri (örneğin React, Angular, Vue.js veya .NET MAUI ile mobil uygulamalar) tarafından kolayca tüketilebilir olmasını sağlayacağız. Temiz, sezgisel ve erişilebilir bir arayüz, kullanıcıların uygulamayı keyifle kullanmasını sağlayacak. Bu dört temel taş, FatAdvisor’ın sadece bugün değil, gelecekte de büyüyüp gelişebileceği sağlam bir zemin oluşturacak. Şimdi bu temel taşların her birini daha detaylı inceleyerek, projemizin inşaatına başlayalım.
.NET Core ile API Oluşturma: Beslenme Verilerine Giden Yol
FatAdvisor projemizin bel kemiği olacak olan API katmanını oluşturmakla işe başlıyoruz. Bu API, hem mobil hem de web uygulamalarından gelen tüm veri isteklerini işleyecek, iş mantığını uygulayacak ve veritabanı ile yapay zeka servisleri arasında bir köprü görevi görecektir. .NET Core, yüksek performansı, esnek mimarisi ve zengin kütüphane desteği sayesinde bu görev için mükemmel bir seçimdir. Adım adım, FatAdvisor için temel bir .NET Core Web API projesi nasıl başlatılır ve ilk endpoint’ler nasıl oluşturulur ona bakalım.
İlk olarak, sisteminizde .NET SDK’nın kurulu olduğundan emin olun. Visual Studio veya Visual Studio Code gibi bir IDE kullanarak yeni bir .NET Core Web API projesi oluşturabiliriz. Komut satırını tercih edenler için aşağıdaki komut yeterli olacaktır:
dotnet new webapi -n FatAdvisorApi
cd FatAdvisorApi
Bu komut, FatAdvisorApi adında yeni bir Web API projesi oluşturur ve çalışma dizinimizi bu projenin içine taşır. Proje yapısını incelediğinizde, Controllers klasöründe örnek bir WeatherForecastController.cs dosyası göreceksiniz. Bu, API'mizin nasıl çalışacağını gösteren iyi bir başlangıç noktasıdır. Biz kendi beslenme verilerimiz için kontrolcüleri oluşturacağız. Örneğin, yiyecek maddelerini yönetmek için bir FoodItemsController ve kullanıcıların beslenme kayıtlarını tutmak için bir NutritionLogsController ihtiyacımız olacak.
Temel bir FoodItem modeli tanımlayalım. Bu model, bir yiyecek maddesinin adı, kalorisi ve diğer besin değerleri gibi özelliklerini içerecektir. Aşağıda basit bir örnek görebilirsiniz:
// Models/FoodItem.cs
namespace FatAdvisorApi.Models
{
public class FoodItem
{
public int Id { get; set; }
public string Name { get; set; }
public double Calories { get; set; }
public double Protein { get; set; }
public double Carbohydrates { get; set; }
public double Fat { get; set; }
}
}
Şimdi, bu modele CRUD (Create, Read, Update, Delete) işlemleri yapabilen bir kontrolcü oluşturalım. Basitçe, tüm yiyecek maddelerini getiren bir GET endpoint'i ile başlayabiliriz:
// Controllers/FoodItemsController.cs
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using FatAdvisorApi.Models; // Model dosyamızı dahil ediyoruz
namespace FatAdvisorApi.Controllers
{
[ApiController]
[Route("[controller]")]
public class FoodItemsController : ControllerBase
{
private static List _foodItems = new List
{
new FoodItem { Id = 1, Name = "Elma", Calories = 52, Protein = 0.3, Carbohydrates = 14, Fat = 0.2 },
new FoodItem { Id = 2, Name = "Tavuk Göğsü", Calories = 165, Protein = 31, Carbohydrates = 0, Fat = 3.6 }
};
[HttpGet]
public IEnumerable Get()
{
return _foodItems;
}
[HttpGet("{id}")]
public ActionResult GetById(int id)
{
var item = _foodItems.Find(f => f.Id == id);
if (item == null)
{
return NotFound();
}
return item;
}
[HttpPost]
public ActionResult Post(FoodItem newFoodItem)
{
newFoodItem.Id = _foodItems.Count > 0 ? _foodItems.Max(f => f.Id) + 1 : 1;
_foodItems.Add(newFoodItem);
return CreatedAtAction(nameof(GetById), new { id = newFoodItem.Id }, newFoodItem);
}
// Diğer Put ve Delete işlemleri de benzer şekilde eklenebilir.
}
}
Bu örnekte, veritabanı entegrasyonu henüz yapılmadığı için verileri statik bir liste (_foodItems) içinde tutuyoruz. Ancak bu yapı, API'mizin nasıl çalışacağını göstermek için yeterlidir. [ApiController] ve [Route("[controller]")] nitelikleri, bu sınıfın bir API kontrolcüsü olduğunu ve istekleri /FoodItems yolu üzerinden karşılayacağını belirtir. [HttpGet], [HttpPost] gibi nitelikler ise HTTP metotlarını belirler. API'mizi çalıştırmak için dotnet run komutunu kullanabilir ve Swagger UI (varsayılan olarak gelir) üzerinden endpoint'lerimizi test edebiliriz. Bu basit başlangıç, FatAdvisor'ın temel veri akışını yönetecek API omurgasını oluşturmak için ilk adımdır. İlerleyen aşamalarda, bu yapıyı veritabanı entegrasyonu, kimlik doğrulama, yetkilendirme ve daha karmaşık iş mantıklarıyla genişleteceğiz. Bu katman, FatAdvisor'ın diğer tüm modüllerinin birbiriyle tutarlı ve verimli bir şekilde konuşmasını sağlayacak kritik bir bileşendir.
Veri Modellemesi ve Saklanması: Diyet Bilgilerini Nasıl Düzenlemeliyiz?
Herhangi bir beslenme uygulamasının kalbinde, doğru ve tutarlı bir şekilde yapılandırılmış veri yatar. FatAdvisor için de bu durum geçerli. Kullanıcıların beslenme alışkanlıklarını anlamak, kişiselleştirilmiş öneriler sunmak ve ilerlemeyi takip etmek için, verileri mantıksal bir düzende modellememiz ve güvenli bir şekilde saklamamız gerekiyor. Bu bölüm, FatAdvisor için temel veri modellerini ve bu modelleri .NET ekosisteminde popüler bir ORM (Object-Relational Mapper) olan Entity Framework Core ile nasıl kullanacağımızı ele alacaktır.
FatAdvisor için düşünebileceğimiz temel varlıklar şunlardır:
- User (Kullanıcı): Uygulamayı kullanan bireyin temel bilgileri (Id, Ad, Soyad, E-posta, Yaş, Cinsiyet, Boy, Kilo, Aktivite Seviyesi, Hedef Kilo vb.).
- FoodItem (Yiyecek Maddesi): Besin veri tabanımızda yer alan her bir yiyecek maddesi (Id, Ad, Kalori, Protein, Karbonhidrat, Yağ, Lif, Porsiyon Boyutu vb.).
- Meal (Öğün): Kullanıcının belirli bir zamanda tükettiği bir veya birden fazla yiyecek maddesinin birleşimi (Id, KullanıcıId, Tarih, Saat, Öğün Tipi - Kahvaltı, Öğle Yemeği, Akşam Yemeği, Ara Öğün).
- NutritionLog (Beslenme Kaydı): Bir öğün içindeki belirli bir yiyecek maddesinin ve tüketilen miktarının detayı (Id, ÖğünId, YiyecekMaddesiId, Miktar, Birim).
- UserGoal (Kullanıcı Hedefi): Kullanıcının kilo kaybı, kas kazanımı gibi beslenme hedefleri ve bu hedeflere ulaşmak için gerekli makro besin dağılımları.
Bu varlıkları C# sınıfları olarak modelleyebiliriz. İşte birkaç örnek:
// Models/User.cs
namespace FatAdvisorApi.Models
{
public class User
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public int Age { get; set; }
public string Gender { get; set; } // "Male" veya "Female"
public double HeightCm { get; set; }
public double WeightKg { get; set; }
public string ActivityLevel { get; set; } // "Sedentary", "LightlyActive", etc.
public double TargetWeightKg { get; set; }
// İlişkisel özellikler
public ICollection Meals { get; set; }
public ICollection Goals { get; set; }
}
}
// Models/Meal.cs
namespace FatAdvisorApi.Models
{
public class Meal
{
public int Id { get; set; }
public int UserId { get; set; }
public DateTime MealDateTime { get; set; }
public string MealType { get; set; } // e.g., "Breakfast", "Lunch", "Dinner", "Snack"
// İlişkisel özellikler
public User User { get; set; }
public ICollection NutritionLogs { get; set; }
}
}
Veritabanı olarak SQL Server, PostgreSQL veya MySQL gibi ilişkisel bir veritabanı tercih edebiliriz. .NET Core ekosisteminde, Entity Framework Core (EF Core) bu C# modellerini veritabanı tablolarına dönüştürmek ve bu tablolarla etkileşim kurmak için harika bir araçtır. EF Core, kodumuzdan veritabanı işlemlerini soyutlayarak, SQL sorguları yazmak yerine LINQ (Language Integrated Query) kullanarak verilerle çalışmamızı sağlar.
EF Core'u projemize entegre etmek için gerekli NuGet paketlerini kurmamız gerekir:
dotnet add package Microsoft.EntityFrameworkCore.SqlServer // veya .PostgreSQL, .Sqlite
dotnet add package Microsoft.EntityFrameworkCore.Tools
Daha sonra, uygulamanın veritabanıyla nasıl etkileşim kuracağını tanımlayan bir DbContext sınıfı oluşturmalıyız:
// Data/ApplicationDbContext.cs
using Microsoft.EntityFrameworkCore;
using FatAdvisorApi.Models;
namespace FatAdvisorApi.Data
{
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions options)
: base(options)
{
}
public DbSet Users { get; set; }
public DbSet FoodItems { get; set; }
public DbSet Meals { get; set; }
public DbSet NutritionLogs { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// İlişkileri ve kısıtlamaları burada tanımlayabiliriz
modelBuilder.Entity()
.HasMany(u => u.Meals)
.WithOne(m => m.User)
.HasForeignKey(m => m.UserId);
// Diğer ilişkiler...
}
}
}
Startup.cs veya .NET 6+ ile Program.cs dosyasında veritabanı bağlantı dizesini yapılandırmamız ve ApplicationDbContext'i servislere eklememiz gerekecektir:
// Program.cs (örnek .NET 6+)
using Microsoft.EntityFrameworkCore;
using FatAdvisorApi.Data;
var builder = WebApplication.CreateBuilder(args);
// DbContext'i servislere ekleme
builder.Services.AddDbContext(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
// Diğer servisler ve middleware'ler...
appsettings.json dosyamızda ise bağlantı dizemizi tanımlarız:
{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=FatAdvisorDb;Trusted_Connection=True;MultipleActiveResultSets=true"
},
// Diğer ayarlar...
}
Veritabanı tablolarını oluşturmak için EF Core Migrations'ı kullanacağız. Komut satırından aşağıdaki komutları çalıştırarak ilk migrasyonu oluşturabilir ve veritabanını güncelleyebiliriz:
dotnet ef migrations add InitialCreate
dotnet ef database update
Bu adımlar, FatAdvisor'ın tüm beslenme verilerini tutarlı, güvenli ve kolayca erişilebilir bir şekilde depolamasını sağlayacak sağlam bir veritabanı altyapısı kurmamıza olanak tanır. Doğru veri modellemesi, uygulamanın performansı, ölçeklenebilirliği ve en önemlisi, yapay zeka modüllerinin doğru ve anlamlı verilerle çalışabilmesi için kritik öneme sahiptir.
Yapay Zeka Entegrasyonuna İlk Adımlar: Azure OpenAI ile Konuşma Nasıl Başlar?
FatAdvisor'ı diğer beslenme takip uygulamalarından ayıran en önemli özelliklerden biri, doğal dil işleme yetenekleri sayesinde kullanıcılarla etkileşim kurabilen ve akıllı öneriler sunabilen bir yapay zeka ajanı olmasıdır. Bu yapay zeka yeteneklerini uygulamaya entegre etmek için, Microsoft Azure OpenAI hizmetlerinden yararlanacağız. Azure OpenAI, OpenAI'ın güçlü dil modelleri olan GPT-3, GPT-4 ve DALL-E gibi modelleri Azure'ın güvenlik, kurumsal yetenekleri ve ölçeklenebilirliği ile sunar. Bu bölümde, FatAdvisor API'mizi Azure OpenAI ile nasıl konuşturacağımızı ve yapay zeka entegrasyonuna ilk adımları nasıl atacağımızı keşfedeceğiz.
Öncelikle, bir Azure aboneliğinizin olması ve Azure OpenAI hizmetine erişiminiz bulunması gerekmektedir. Azure portalında bir Azure OpenAI kaynağı oluşturduktan sonra, bir dağıtım (deployment) oluşturmanız ve bir model (örneğin gpt-35-turbo) seçmeniz gerekecektir. Bu dağıtım, API'mizin yapay zeka isteklerini göndereceği endpoint ve anahtarları sağlayacaktır. API'mizin bu hizmetle iletişim kurabilmesi için bir API anahtarına ve endpoint URL'sine ihtiyacımız olacak.
FatAdvisor API'sinde Azure OpenAI ile iletişim kurmak için HttpClient sınıfını kullanabiliriz. Basit bir ChatGPTService veya OpenAIService sınıfı oluşturarak bu entegrasyonu soyutlayabiliriz:
// Services/OpenAIService.cs
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration; // IConfiguration için
namespace FatAdvisorApi.Services
{
public class OpenAIService
{
private readonly HttpClient _httpClient;
private readonly IConfiguration _configuration;
private readonly string _endpoint;
private readonly string _apiKey;
private readonly string _deploymentName; // Örneğin "gpt-35-turbo"
public OpenAIService(HttpClient httpClient, IConfiguration configuration)
{
_httpClient = httpClient;
_configuration = configuration;
_endpoint = _configuration["AzureOpenAI:Endpoint"];
_apiKey = _configuration["AzureOpenAI:ApiKey"];
_deploymentName = _configuration["AzureOpenAI:DeploymentName"]; // appsettings.json'dan okunacak
_httpClient.DefaultRequestHeaders.Add("api-key", _apiKey);
}
public async Task GetNutritionAdviceAsync(string prompt)
{
// Azure OpenAI Chat Completions API için istek URL'si
var requestUrl = $"{_endpoint}openai/deployments/{_deploymentName}/chat/completions?api-version=2023-05-15";
var requestBody = new
{
messages = new[]
{
new { role = "system", content = "You are a helpful nutrition assistant named FatAdvisor. Provide concise and healthy food advice." },
new { role = "user", content = prompt }
},
max_tokens = 150, // Yanıtın uzunluğunu sınırlar
temperature = 0.7 // Yaratıcılık seviyesi
};
var jsonContent = new StringContent(
JsonSerializer.Serialize(requestBody),
Encoding.UTF8,
"application/json"
);
var response = await _httpClient.PostAsync(requestUrl, jsonContent);
if (response.IsSuccessStatusCode)
{
var responseContent = await response.Content.ReadAsStringAsync();
var jsonResponse = JsonDocument.Parse(responseContent);
// Yanıttan mesaj içeriğini çekme
var messageContent = jsonResponse.RootElement
.GetProperty("choices")[0]
.GetProperty("message")
.GetProperty("content")
.GetString();
return messageContent;
}
else
{
var errorContent = await response.Content.ReadAsStringAsync();
// Hata yönetimini iyileştirmek önemlidir.
return $"API isteği başarısız oldu: {response.StatusCode} - {errorContent}";
}
}
}
}
Bu OpenAIService sınıfını Program.cs dosyamızda bağımlılık enjeksiyonu (dependency injection) için kaydedebiliriz:
// Program.cs
// ...
builder.Services.AddHttpClient(); // HttpClient'ı OpenAIService için kaydet
builder.Services.AddScoped(); // OpenAIService'i DI konteynerine ekle
// ...
appsettings.json dosyamızda ise Azure OpenAI yapılandırmasını saklarız:
{
"AzureOpenAI": {
"Endpoint": "https://[your-resource-name].openai.azure.com/",
"ApiKey": "YOUR_AZURE_OPENAI_KEY",
"DeploymentName": "gpt-35-turbo" // Veya kullandığınız modelin dağıtım adı
},
// ...
}
Son olarak, API kontrolcülerimizde bu servisi kullanarak AI destekli yanıtlar alabiliriz:
// Controllers/NutritionController.cs (örnek)
using Microsoft.AspNetCore.Mvc;
using FatAdvisorApi.Services;
using System.Threading.Tasks;
namespace FatAdvisorApi.Controllers
{
[ApiController]
[Route("[controller]")]
public class NutritionController : ControllerBase
{
private readonly OpenAIService _openAIService;
public NutritionController(OpenAIService openAIService)
{
_openAIService = openAIService;
}
[HttpGet("advice")]
public async Task GetNutritionAdvice([FromQuery] string query)
{
if (string.IsNullOrWhiteSpace(query))
{
return BadRequest("Lütfen bir beslenme sorgusu sağlayın.");
}
var advice = await _openAIService.GetNutritionAdviceAsync(query);
return Ok(new { Advice = advice });
}
}
}
Bu sayede, kullanıcılar /Nutrition/advice?query=bugun+ne+yemeliyim gibi bir istek gönderdiğinde, Azure OpenAI bu sorguyu işleyecek ve FatAdvisor adına bir yanıt üretecektir. Bu entegrasyon, FatAdvisor'a doğal dil anlama ve üretme yeteneği kazandırarak, kullanıcı deneyimini önemli ölçüde zenginleştirecek ilk adımdır. İlerleyen aşamalarda, bu yapıyı kullanarak daha karmaşık sorguları işleyebilir, kişiselleştirilmiş tarifler önerebilir ve hatta kullanıcıların hedefleri doğrultusunda dinamik diyet planları oluşturabiliriz.
Mobil ve Web Uyumluluğu: FatAdvisor Her Cihazda Nasıl Çalışır?
Günümüz dünyasında kullanıcılar, bir uygulamaya farklı cihazlardan (akıllı telefonlar, tabletler, dizüstü bilgisayarlar) sorunsuz bir şekilde erişmeyi beklerler. FatAdvisor'ın da geniş bir kitleye ulaşabilmesi ve üstün bir kullanıcı deneyimi sunabilmesi için mobil ve web uyumluluğuna sahip olması hayati öneme sahiptir. API'mizi .NET Core ile oluşturarak, arka uç (backend) tarafında zaten platformdan bağımsız bir temel attık. Şimdi sıra, bu API ile etkileşime girecek olan ön uç (frontend) katmanının her cihazda sorunsuz çalışmasını sağlamakta. Bu, kullanıcı arayüzü (UI) ve kullanıcı deneyimi (UX) tasarımında responsive (duyarlı) tasarım prensiplerini benimsemeyi ve potansiyel olarak çapraz platform mobil geliştirme teknolojilerini kullanmayı gerektirir.
Web Uygulamaları için Responsive Tasarım:
FatAdvisor'ın bir web arayüzü olacağını varsayarsak, responsive tasarım, ekran boyutuna göre otomatik olarak ayarlanan bir düzen demektir. Bu, kullanıcıların masaüstü bilgisayarda veya akıllı telefonda aynı web sitesini ziyaret ettiğinde farklı ama optimize edilmiş bir deneyim yaşadığı anlamına gelir. Bu genellikle HTML, CSS ve JavaScript kullanılarak elde edilir. CSS'in @media kuralları, farklı ekran boyutları için farklı stil kuralları tanımlamamıza olanak tanır. Örneğin:
/* Genel stiller (örneğin masaüstü için) */
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 20px;
}
.container {
max-width: 960px;
margin: 0 auto;
padding: 20px;
background-color: #f0f0f0;
}
.sidebar {
width: 25%;
float: left;
padding-right: 20px;
}
.main-content {
width: 75%;
float: left;
}
/* Küçük ekranlar için medya sorgusu */
@media (max-width: 768px) {
.container {
padding: 10px;
}
.sidebar, .main-content {
width: 100%; /* Küçük ekranlarda yan çubuk ve ana içerik tam genişlikte olsun */
float: none;
padding: 0;
}
.sidebar {
margin-bottom: 20px; /* Yan çubuk ile içerik arasına boşluk bırak */
}
}
/* Çok küçük ekranlar için medya sorgusu (mobil cihazlar) */
@media (max-width: 480px) {
body {
font-size: 14px;
}
h1 {
font-size: 24px;
}
}
Yukarıdaki örnekte, .sidebar ve .main-content elementleri masaüstünde yan yana dururken (float: left; ile), ekran genişliği 768 pikselin altına düştüğünde alt alta sıralanır (width: 100%; float: none;). Bu, web tabanlı FatAdvisor arayüzünün tabletlerde ve mobil cihazlarda daha okunaklı ve kullanılabilir olmasını sağlar. Görsel betimlemelerle anlatacak olursak, masaüstünde menünün solda olduğu, içeriğin sağda yer aldığı bir düzen düşünün. Medya sorgusu sayesinde mobil cihazlarda menü yukarıya çıkar ve tam genişlikte gösterilir, içerik ise menünün altında yine tam genişlikte sıralanır. Bu, kullanıcıların kaydırma ve yakınlaştırma ihtiyacını azaltarak daha doğal bir etkileşim sunar.
Mobil Uygulamalar için Çapraz Platform Geliştirme:
Web uygulamasının yanı sıra, FatAdvisor için native mobil bir uygulama deneyimi de sunmak isteyebiliriz. Burada .NET geliştiricileri için en cazip seçeneklerden biri .NET MAUI (Multi-platform App UI)'dir. .NET MAUI, tek bir C# kod tabanı ile iOS, Android, macOS ve Windows için native uygulamalar oluşturmanıza olanak tanır. Bu, ayrı ayrı her platform için kod yazmak yerine, geliştirme sürecini önemli ölçüde hızlandırır ve maliyetleri düşürür.
// .NET MAUI'de basit bir UI tanımı (XAML)
Bu XAML kodu, .NET MAUI uygulamasında basit bir sayfa düzenini tanımlar. Bu tür bir yaklaşım, FatAdvisor'ın mobil uygulamalarının her platformda tutarlı bir görünüm ve his sunmasını sağlarken, aynı zamanda cihazın native özelliklerine (kamera, konum, bildirimler vb.) erişim imkanı tanır. Örneğin, yemek fotoğrafı çekme ve bu fotoğrafları AI modelimize göndererek yemek tanıma özelliği (gelecekteki aşamalar için) native mobil uygulama üzerinden çok daha verimli bir şekilde çalışabilir.
Özetle, FatAdvisor'ın farklı cihazlarda sorunsuz çalışabilmesi için responsive web tasarımı prensiplerini ve .NET MAUI gibi çapraz platform mobil geliştirme araçlarını kullanmak, hem geliştirme verimliliğini artıracak hem de kullanıcılara en iyi deneyimi sunacaktır. API'mizin bu çeşitli ön uç uygulamalarıyla güvenli ve verimli bir şekilde iletişim kurabilmesi için sağlam bir HTTP iletişimi ve veri formatı (JSON) kullandığımızdan emin olmalıyız.
Vaka Analizi: "FitChef" Uygulaması ve Ölçeklenebilirlik Dersleri
Teorik bilgileri pekiştirmek ve gerçek dünya zorluklarını anlamak için hayali bir vaka analizine dalalım. "FitChef" adında, FatAdvisor'a benzer, yapay zeka destekli bir beslenme ve tarif önerme uygulaması düşünelim. FitChef, başlangıçta küçük bir kullanıcı kitlesi için oldukça başarılı bir şekilde çalışıyordu. Kullanıcılar, günlük öğünlerini kaydedebiliyor, FitChef'in AI algoritmasından kişiselleştirilmiş tarif önerileri alabiliyor ve beslenme hedeflerini takip edebiliyorlardı. Uygulama, geliştiricilerin beklentilerini aşan bir hızda büyüdü ve kısa sürede on binlerce aktif kullanıcıya ulaştı.
Ancak, bu hızlı büyüme beraberinde ciddi ölçeklenebilirlik sorunlarını getirdi. Uygulama, özellikle yoğun saatlerde yavaşlamaya başladı, AI yanıt süreleri uzadı ve veritabanı bağlantı hataları sıkça yaşanır oldu. Kullanıcılar, "FitChef'in AI'ı donuyor" veya "Uygulama çok yavaş, kaydettiğim öğünler gözükmüyor" gibi şikayetlerde bulunmaya başladılar. FitChef ekibi, mevcut mimarilerinin bu ani yükü kaldıramadığını fark etti ve acil bir revizyona gitmek zorunda kaldı.
FitChef'in Karşılaştığı Sorunlar ve Çözümleri:
- Veritabanı Performansı: Başlangıçta tek bir sunucuda çalışan ilişkisel veritabanı, artan eş zamanlı istekleri ve karmaşık sorguları kaldıramaz hale geldi. Özellikle kullanıcıların geçmiş beslenme kayıtlarını ve AI'ın besin veritabanını sıkça sorgulaması, kilitlenmelere neden oluyordu.
- Çözüm: Veritabanı, daha güçlü bir sunucuya taşındı ve indeksleme stratejileri optimize edildi. Sık okunan ama nadiren yazılan veriler (örneğin yiyecek maddeleri listesi) için Redis gibi bir dağıtık önbellek (distributed cache) sistemi entegre edildi. Bu sayede, AI modelinin her defasında veritabanına gitmesi yerine önbellekten hızlıca veri alması sağlandı.
- API Katmanı Tıkanıklığı: .NET Core API'si, gelen tüm istekleri tek bir monolitik uygulama olarak işlemeye çalışıyordu. Özellikle AI modeline yapılan çağrılar zaman alıcı olduğu için, bu çağrılar diğer API isteklerini bloke etmeye başladı.
- Çözüm: Uygulama, mikroservis mimarisine doğru evriltildi. Kullanıcı yönetimi, beslenme takibi ve AI önerileri gibi farklı iş alanları ayrı mikroservislere bölündü. AI modeline yapılan çağrılar ise asenkron bir kuyruk (örneğin RabbitMQ veya Azure Service Bus) aracılığıyla işlendi. Kullanıcı bir AI talebi gönderdiğinde, bu talep kuyruğa atılır ve AI servisi arka planda işi tamamlayıp sonucu kullanıcıya bildirimle iletir. Bu, ana API'nin hızlı yanıt vermesini sağladı.
- Yapay Zeka Servis Yükü: FitChef'in AI modeli, özellikle kişiselleştirilmiş tarif oluşturma gibi yoğun işlemler sırasında yüksek CPU ve bellek tüketimine neden oluyordu. Tek bir AI servis örneği bu yükü kaldıramıyordu.
- Çözüm: Azure OpenAI gibi bulut tabanlı AI servislerine geçiş yapıldı. Bu servisler, talebe göre otomatik olarak ölçeklenebilme yeteneğine sahiptir. Ayrıca, daha karmaşık ve pahalı AI model çağrıları için bir "kredilendirme" veya "sınırlama" mekanizması (rate limiting) uygulandı, böylece hizmetin kötüye kullanımı veya aşırı yüklenmesi engellendi.
- Frontend Performansı: Mobil uygulama, API'den çok fazla veri çekmeye çalışıyor ve bu da yavaş yüklenmelere neden oluyordu.
- Çözüm: Mobil uygulamada lazy loading (tembel yükleme) ve veri paginasyonu (sayfalama) teknikleri uygulandı. Kullanıcının sadece ihtiyaç duyduğu veriler çekildi ve ekranın tamamını dolduracak şekilde değil, kaydırma yaptıkça daha fazla veri yüklendi. Görsel optimizasyonlar ve daha küçük resim boyutları kullanılarak bant genişliği kullanımı azaltıldı.
FitChef'in yaşadığı bu deneyim, FatAdvisor projesi için değerli dersler sunuyor. Daha projenin temellerini atarken, FatAdvisor'ın mimarisini ölçeklenebilirliği göz önünde bulundurarak tasarlamalıyız. Bu, modüler bir API yapısı, Entity Framework Core ile doğru indekslenmiş bir veritabanı, Azure OpenAI gibi ölçeklenebilir bulut servislerini kullanmak ve frontend'i performans odaklı geliştirmek anlamına geliyor. Bu vaka analizi, "Part 1: Building the Foundation" bölümünde attığımız adımların, gelecekteki büyüme ve başarının ne kadar önemli bir parçası olduğunu vurgulamaktadır. Doğru temelleri atmak, FatAdvisor'ın FitChef gibi zorluklarla karşılaşmasını engeller ve sorunsuz bir büyüme sağlar.
Geleceğe Yönelik İpuçları: FatAdvisor'ı Daha Güçlü Hale Nasıl Getirebiliriz?
FatAdvisor projesinin temellerini atarken, sadece mevcut gereksinimleri karşılamakla kalmayıp, gelecekteki büyümeyi ve gelişimi de destekleyecek şekilde düşünmek büyük önem taşır. Sağlam bir başlangıç yapmak, ilerleyen dönemlerde büyük revizyonlar veya performans sorunlarıyla karşılaşmamızı engeller. İşte FatAdvisor'ı daha güçlü, güvenli ve kullanıcı dostu hale getirmek için düşünebileceğimiz bazı ileri düzey ipuçları ve püf noktaları:
1. Güvenlik Katmanlarını Kalınlaştırın:
Kullanıcı verileri, özellikle sağlık ve beslenme bilgileri gibi hassas veriler içerdiğinde, güvenlik en üst öncelik olmalıdır.
- Kimlik Doğrulama ve Yetkilendirme (Authentication & Authorization): Kullanıcıların kimliklerini doğrulayarak (örneğin JWT - JSON Web Tokens ile) ve yalnızca yetkili oldukları kaynaklara erişmelerini sağlayarak (rol tabanlı yetkilendirme) API'nizi koruyun. ASP.NET Core Identity veya IdentityServer4 gibi kütüphaneler bu konuda size yardımcı olabilir.
- Veri Şifreleme: Hem veritabanında depolanan hassas verileri (at rest encryption) hem de API üzerinden iletilen verileri (HTTPS ile in transit encryption) şifreleyin.
- Girdi Doğrulama ve Güvenli Kodlama: SQL Enjeksiyonu, XSS (Cross-Site Scripting) gibi yaygın güvenlik açıklarını önlemek için tüm kullanıcı girdilerini sunucu tarafında dikkatlice doğrulayın ve sanitize edin.
2. Performans Optimizasyonu ile Hız Kazanın:
Uygulamanın hızlı yanıt vermesi, kullanıcı memnuniyeti için kritik öneme sahiptir.
- Asenkron Programlama (Async/Await): Özellikle veritabanı sorguları ve harici API çağrıları gibi I/O yoğun işlemleri asenkron olarak yürüterek API'nizin ölçeklenebilirliğini artırın. Bu, sunucunun bir isteği beklerken diğer istekleri işleyebilmesini sağlar.
- Önbellekleme (Caching): Sıkça erişilen ancak nadiren değişen veriler (örneğin yiyecek maddeleri listesi, popüler tarifler) için önbellekleme kullanın. Redis gibi dağıtık bir önbellek çözümü, API sunucuları arasında veriyi paylaşarak performansı ciddi şekilde artırabilir.
- Veritabanı İndekslemesi ve Optimizasyonu: En sık sorgulanan kolonlara indeksler ekleyin ve karmaşık sorgularınızın performansını analiz ederek optimize edin. Entity Framework Core ile yapılan sorguların SQL çıktısını incelemek, darboğazları tespit etmede yardımcı olabilir.
3. Yapay Zeka Deneyimini Derinleştirin:
FatAdvisor'ın AI yeteneklerini daha da geliştirmek için:
- Prompt Mühendisliği Geliştirme: Azure OpenAI ile çalışırken, daha spesifik ve bağlam açısından zengin prompt'lar kullanarak daha doğru ve faydalı yanıtlar elde edin. Kullanıcının yaşı, cinsiyeti, hedefleri gibi kişisel verileri prompt'a dinamik olarak dahil edin.
- Kullanıcı Geri Bildirimleriyle Modeli Eğitme: AI tarafından verilen tavsiyeler hakkında kullanıcı geri bildirimlerini toplayın. Bu geri bildirimleri, AI modelinin performansını artırmak ve daha iyi kişiselleştirilmiş öneriler sunmak için kullanın.
- Görüntü Tanıma Entegrasyonu (Gelecek Planı): Kullanıcıların yedikleri yemeğin fotoğrafını çekerek AI'ın yemeği tanımasını ve besin değerlerini otomatik olarak kaydetmesini sağlayın. Azure Computer Vision veya özel bir makine öğrenimi modeli bu konuda kullanılabilir.
4. İzleme ve Günlüğe Kaydetme (Monitoring & Logging):
Uygulamanın performansını ve sağlığını sürekli izlemek, sorunları proaktif olarak tespit etmek ve çözmek için önemlidir.
- Application Insights: Azure Application Insights gibi araçları kullanarak uygulamanızın performans metriklerini, hata oranlarını ve kullanıcı davranışlarını izleyin.
- Yapılandırılmış Günlükleme: Serilog veya NLog gibi kütüphanelerle yapılandırılmış günlükleme (structured logging) kullanarak, logları okunabilir ve sorgulanabilir bir formatta toplayın. Bu, hataların tespiti ve performans sorunlarının analizi için kritik öneme sahiptir.
Bu ipuçları, FatAdvisor projesinin sadece bugün değil, gelecekte de başarılı ve sürdürülebilir olmasını sağlayacak sağlam bir zemin oluşturmanıza yardımcı olacaktır. Her birini uygularken, projenin mevcut ölçeğini, bütçesini ve ekibin yetkinliklerini göz önünde bulundurarak dengeli bir yaklaşım sergilemek önemlidir.
Sonuç: FatAdvisor ile Sağlıklı Yaşama İlk Adım
Bu makale serisinin ilk bölümünde, "Building FatAdvisor: A .NET Nutrition AI Agent" projesinin temel taşlarını bir araya getirdik. Sağlıklı beslenme alışkanlıkları edinmenin zorluklarından yola çıkarak, yapay zeka destekli bir beslenme asistanının bu alandaki potansiyelini vurguladık. .NET Core ile sağlam ve ölçeklenebilir bir API katmanı oluşturmayı, beslenme verilerini mantıklı bir şekilde modelleyerek Entity Framework Core ile veritabanına kaydetmeyi öğrendik. Ayrıca, Azure OpenAI gibi güçlü bulut tabanlı yapay zeka hizmetlerini kullanarak FatAdvisor'ın doğal dil işleme yeteneklerini nasıl kazandıracağımızın ilk adımlarını attık. Mobil ve web uyumluluğunun önemine değinerek, responsive tasarım ve .NET MAUI gibi teknolojilerin FatAdvisor'ın her cihazda sorunsuz çalışmasını nasıl sağlayabileceğini inceledik. FitChef vaka analizi ile, ölçeklenebilirlik sorunlarının gerçek dünyadaki etkilerini ve bu sorunların doğru mimari seçimlerle nasıl aşılabileceğini gördük. Son olarak, FatAdvisor'ı daha güçlü, güvenli ve performanslı hale getirmek için geleceğe yönelik önemli ipuçları ve püf noktalarını ele aldık.
Bu ilk aşama, FatAdvisor'ın vizyonunu gerçeğe dönüştürmek için atılan kritik bir adımdır. Bir beslenme AI aracısının sadece bir fikir olmaktan çıkıp, somut bir teknolojik temele oturması, projenin ilerleyen bölümlerinde daha karmaşık yapay zeka modelleri, kişiselleştirilmiş tarif önerileri ve gelişmiş kullanıcı deneyimleri eklememiz için sağlam bir zemin hazırlar. Unutmayın ki, herhangi bir büyük yazılım projesinde olduğu gibi, temel ne kadar sağlam olursa, üzerine inşa edeceğiniz katlar da o kadar güçlü ve dayanıklı olacaktır. FatAdvisor ile bireylerin sağlıklı beslenme hedeflerine ulaşmalarına yardımcı olmak için çıktığımız bu yolculukta, teknoloji ve yapay zekanın dönüştürücü gücünü en iyi şekilde kullanmayı hedefliyoruz. İkinci bölümde, bu temel üzerine inşa edeceğimiz daha ileri yapay zeka entegrasyonlarını, özel beslenme algoritmalarını ve zengin kullanıcı arayüzü özelliklerini keşfedeceğiz. Sağlıklı yaşama giden yolda FatAdvisor, en güvenilir dijital ortağınız olmaya aday.
Sıkça Sorulan Sorular (SSS)
1. FatAdvisor gibi bir AI beslenme ajanı için neden .NET tercih edilmeli?
.NET, yüksek performans, güçlü güvenlik özellikleri ve kurumsal düzeyde ölçeklenebilirlik sunan bir platformdur. Özellikle C# dili, geliştirme hızı ve kod bakımı açısından oldukça avantajlıdır. Ayrıca, Azure OpenAI gibi Microsoft ekosistemindeki diğer bulut servisleriyle entegrasyonu kolaydır, bu da AI destekli bir uygulama geliştirmek için ideal bir ortam sağlar. Geniş geliştirici topluluğu ve zengin kütüphane desteği de önemli avantajlardır.
2. Entity Framework Core (EF Core) kullanmak zorunlu mu? Alternatifleri nelerdir?
EF Core, .NET uygulamalarında ilişkisel veritabanlarıyla çalışmak için oldukça popüler ve güçlü bir ORM aracıdır. Kod ve veritabanı arasında bir köprü görevi görerek geliştirme sürecini hızlandırır ve SQL sorguları yazma ihtiyacını azaltır. Ancak zorunlu değildir. Alternatif olarak, Dapper gibi daha hafif bir mikro-ORM kullanabilir veya ADO.NET ile doğrudan SQL sorguları yazarak veritabanıyla etkileşim kurabilirsiniz. Seçim, projenin büyüklüğüne, performans gereksinimlerine ve ekibin deneyimine bağlıdır.
3. Kullanıcı verileri (beslenme alışkanlıkları, kişisel bilgiler) FatAdvisor'da ne kadar güvende olacak?
Kullanıcı verilerinin güvenliği FatAdvisor için en yüksek önceliktir. Uygulama, hassas verileri korumak için sektör standartlarını ve en iyi uygulamaları benimsemelidir: HTTPS üzerinden güvenli iletişim, JWT tabanlı kimlik doğrulama, veritabanında şifreleme (hem depolanan hem de iletilen veriler için) ve GDPR/KVKK gibi yerel düzenlemelere uygunluk sağlanmalıdır. Ayrıca, SQL enjeksiyonu ve XSS gibi yaygın güvenlik açıklarına karşı girdi doğrulama mekanizmaları titizlikle uygulanmalıdır.
4. FatAdvisor'ın AI yeteneklerini daha da geliştirmek için neler yapılabilir?
AI yeteneklerini geliştirmek için birçok yol vardır. Azure OpenAI ile daha gelişmiş prompt mühendisliği teknikleri kullanarak modelin yanıt kalitesini artırabilirsiniz. Ayrıca, kullanıcı geri bildirimleriyle AI modelini sürekli olarak fine-tune edebilir veya özel makine öğrenimi modelleri (örneğin, yemek fotoğrafı tanıma için Computer Vision modelleri) entegre edebilirsiniz. Kişiselleştirilmiş tarif önerileri, beslenme eksiklikleri tespiti ve davranışsal tavsiyeler sunmak için daha karmaşık algoritmalar ve veri analizleri geliştirilebilir.
5. FatAdvisor projesinin bir sonraki aşamasında bizi neler bekliyor?
Bu makale serisinin ikinci bölümünde, FatAdvisor'ın temelini daha da sağlamlaştırarak ileri seviye özelliklere odaklanacağız. Bu, büyük dil modelleri ile daha derin entegrasyonlar, makine öğrenimi tabanlı kişiselleştirilmiş beslenme öneri sistemlerinin geliştirilmesi, görüntü tanıma yeteneklerinin eklenmesi ve kullanıcı arayüzünün (web/mobil) daha interaktif ve zengin hale getirilmesi gibi konuları içerebilir. Ayrıca, kullanıcıların sağlık hedeflerine ulaşmalarına yardımcı olacak ek araçlar ve özellikler de keşfedilecektir.