Ferdi Giden

Merhaba, Ben Ferdi 👋

Merhaba! Ben Ferdi.

Uzman bir PHP, MySQL ve Tailwind CSS geliştiricisiyim. Kariyerim boyunca performanslı, güvenli ve ölçeklenebilir web uygulamaları ile sistem eklentileri geliştirdim. Kullanıcı deneyimini (UX) ön planda tutan, modern ve temiz arayüzler kodlamayı seviyorum.

Burada son projelerimi, yazdığım eklentileri ve blog yazılarımı bulabilirsiniz.
Projelerime Göz At
ferdigiden.config.ts
config.ts
TypeScript
import { StudioConfig } from "@ferdi/core";

export const FerdigidenDev: StudioConfig = {
  name: "Ferdigiden Digital",
  locations: ["BURSA", "DNG"],
  focus: "High-Performance Web Applications",
  stack: [
    "HTML", "CSS", "JS", "PHP", "SQL",
    "Python", "Node.js", "Next.js", "React"  ],
  architecture: "Clean Code & Scalability"
};
DİZİN TERMİNALİ
$ npm run deploy
> ferdigiden@3.0.0 deploy:production
✓ compiling typescript modules...
✓ optimization and code shaking complete.
🚀 assets built successfully in 140ms.
server live at https://ferdigiden.com.tr
TEKNOLOJİ HAVUZUMUZ

Geliştirdiğimiz Modern Ekosistem

Projelerinizde kullandığımız güvenilir, ölçeklenebilir ve yüksek performanslı kurumsal teknolojiler.

Laravel

MySQL

JavaScript

Tailwind CSS

Node.js

React

Projelerim & Eklentiler

Gelişmiş SEO Analiz Eklentisi

Web siteleri için özel olarak geliştirdiğim, sayfaların on-page SEO skorlarını otomatik ölçen ve öneriler sunan eklenti paketi.

Eklentiyi İndir

Tailwind CSS Yönetim Paneli

Modern projeler için hazırladığım Dark/Light mode destekli, tamamen duyarlı (responsive) admin paneli UI şablonu.

Eklentiyi İndir

Finans API Entegrasyonu

Kripto para ve döviz kurlarını anlık olarak veritabanına işleyen arka plan (backend) mikroservis projesi.

Son Blog Yazıları

21.09.2026

PyTorch ile Derin Öğrenme Modellerinde Hiperparametre Optimizasyonu: Optuna Rehberi

Derin Öğrenmede Hiperparametre Optimizasyonunun Önemi Yapay zekâ projelerinde model Mimarisi kadar, öğrenme oranı (learning rate), katman sayısı, batch boyutu gibi hiperparametrelerin seçimi de başarının temel belirleyicisidir. Manuel deneme yanılma yöntemi hem zaman kaybına yol açar hem de optimum noktayı kaçırma riskini artırır. Bu süreçleri otomatikleştirmek, makine öğrenmesi mühendisliğinde verimliliği artıran kritik bir adımdır. Optuna kütüphanesi, dinamik arama uzayları (dynamic construction) ve gelişmiş budama (pruning) algoritmaları ile öne çıkar. Arama sürecinde başarısız olması kesinleşen denemeleri erken aşamada durdurarak hesaplama maliyetini minimuma indirir. Optuna ile Optimizasyon Sürecinin Kurulumu Python ekosisteminde PyTorch ile entegre çalışan Optuna, objective adı verilen bir amaç fonksiyonu üzerinden çalışır. Bu fonksiyon, belirlenen hiperparametre kombinasyonları ile modeli eğitir ve doğrulama seti üzerindeki kaybı (loss) ya da doğruluğu (accuracy) geri döndürür. Aşağıdaki örnek kod bloğunda, basit bir PyTorch sinir ağı için Optuna kullanılarak öğrenme oranının ve gizli katman boyutunun optimize edilmesi gösterilmiştir: import optuna import torch import torch.nn as nn import torch.optim as optim class SimpleNN(nn.Module): def __init__(self, hidden_size): super(SimpleNN, self).__init__() self.fc1 = nn.Linear(28 * 28, hidden_size) self.fc2 = nn.Linear(hidden_size, 10) def forward(self, x): x = x.view(-1, 28 * 28) x = torch.relu(self.fc1(x)) return self.fc2(x) def objective(trial): hidden_size = trial.suggest_int('hidden_size', 64, 256) lr = trial.suggest_float('lr', 1e-5, 1e-1, log=True) model = SimpleNN(hidden_size) optimizer = optim.Adam(model.parameters(), lr=lr) criterion = nn.CrossEntropyLoss() # Dummy veri seti simülasyonu inputs = torch.randn(64, 1, 28, 28) targets = torch.randint(0, 10, (64,)) optimizer.zero_grad() output = model(inputs) loss = criterion(output, targets) loss.backward() optimizer.step() return loss.item() study = optuna.create_study(direction='minimize') study.optimize(objective, n_trials=50) print('En iyi hiperparametreler:', study.best_params) Gelişmiş Özellikler ve Budama (Pruning) Algoritmaları Optuna'nın en güçlü yönlerinden biri olan budama mekanizmaları, kaynakların verimli kullanılmasını sağlar. MedianPruner veya HyperbandPruner gibi algoritmalar, epoch'lar ilerledikçe performansı kötü giden eğitim süreçlerini erkenden sonlandırır. MedianPruner: Araştırma geçmişindeki ara sonuçların medyan değerine göre budama yapar. HyperbandPruner: Kaynak tahsisini optimize ederek en umut vadeden denemelere odaklanır. PatientPruner: Ani dalgalanmalarda yanlışlıkla budama yapılmasını engeller. Görselleştirme ve Analiz Araçları Optuna, optimizasyon sürecini anlamak için zengin görselleştirme modülleri barındırır. Hangi parametrenin modeli daha çok etkilediğini görmek için slice plot veya contour plot grafiklerinden yararlanabilirsiniz. import optuna.visualization as vis # Optimizasyon geçmişini görselleştirme fig_history = vis.plot_optimization_history(study) fig_history.show() # Parametre önem düzeylerini görselleştirme fig_importance = vis.plot_param_importances(study) fig_importance.show() Sistem Performansını Artırma Stratejileri Büyük ölçekli derin öğrenme modellerinde hiperparametre optimizasyonu yaparken GPU bellek yönetimi kritik önem taşır. Paralel calışma (distributed optimization) desteği sayesinde Optuna, birden fazla GPU üzerinde eş zamanlı denemeler yürüterek toplam süreyi saatler hatta günler mertebesinden dakikalara indirebilir. Veritabanı arka ucu (SQLite veya PostgreSQL) kullanarak süreci kesintilerden korumak da kurumsal düzeyde en iyi uygulamalar arasındadır.

Devamını Oku
21.09.2026

LangChain ve Qdrant ile RAG Mimarisi: Kurumsal LLM Uygulamaları Geliştirme Rehberi

1. Retrieval-Augmented Generation (RAG) Nedir ve Neden Kritik Önem Taşır? Büyük dil modelleri (LLM'ler), muazzam miktarda veri üzerinde eğitilmiş olsalar da, kapalı devre yapılarından dolayı kurumların özel veya güncel verilerine varsayılan olarak erişemezler. Bu durum, modellerin bilgi eksikliği yaşadığında mantıklı görünen ancak tamamen yanlış yanıtlar üretmesine, yani hallucination (yanılsama) problemine yol açar. Modelleri sürekli yeniden eğitmek (fine-tuning) hem finansal açıdan maliyetli hem de zaman alıcıdır. Tam bu noktada mimari bir çözüm olarak Retrieval-Augmented Generation (RAG) devreye girer. RAG mimarisi, bir bilgi getirme (retrieval) sistemi ile bir dil modelini (generation) birleştirir. Kullanıcı bir soru sorduğunda, sistem öncelikle özel veri deposundan (vektör veritabanı) sorguyla doğrudan ilişkili metin parçalarını tespit eder. Ardından bu bağlamı (context) orijinal soruyla birleştirerek LLM'e sunar. Böylece model, yalnızca verilen doğrulanmış bilgi parçalarını kullanarak yanıt üretir. Bu durum, bilgi doğruluğunu artırırken modelin eğitilmediği gizli belgelere de güvenle erişmesini sağlar. 2. Vektör Veritabanları ve Qdrant Mimarisi Geleneksel ilişkisel veritabanı yönetim sistemleri (RDBMS) veya metin tabanlı arama motorları (Elasticsearch gibi), kelime bazlı eşleşmelere dayanır. Ancak yapay zekâ uygulamalarında anlamsal benzerlik (semantic similarity) arandığından, metinlerin yüksek boyutlu sayısal vektörlere (embeddings) dönüştürülmesi şarttır. Vektör veritabanları, bu yüksek boyutlu uzayda en yakın komşu aramalarını (Nearest Neighbor Search) milisaniyeler seviyesinde yapabilmek için tasarlanmıştır. Qdrant, Rust dili ile geliştirilmiş, yüksek performanslı, açık kaynaklı bir vektör arama motorudur. HNSW (Hierarchical Navigable Small World) indeksleme algoritmasını kullanarak devasa veri kümelerinde son derece düşük gecikme süreleriyle arama imkânı tanır. Filtreleme yetenekleri ve yük yükleme (payload) desteği, Qdrant'ı kurumsal seviyedeki RAG projeleri için ideal bir seçenek haline getirir. 3. Veri Ön İşleme, Bölme (Chunking) ve Vektörleştirme Bir RAG hattı kurarken performansın %70'i verinin nasıl bölündüğüne ve vektörleştirildiğine bağlıdır. Belgelerin tek parça halinde veritabanına aktarılması anlamsal yoğunluğu düşürür. Bu yüzden metinlerin mantıksal parçalara (chunks) ayrılması gerekir. RecursiveCharacterTextSplitter yaklaşımı, paragrafları ve cümle sınırlarını koruyarak metni bölmenin en etkili yollarından biridir. Metin parçalandıktan sonra bir embedding modeli (örneğin OpenAI text-embedding-3-small veya açık kaynaklı bge-m3) vasıtasıyla vektör uzayına izdüşürülür. Aşağıdaki Python kodu, belgelerin yüklenmesi, bölümlenmesi ve Qdrant vektör veritabanına aktarılması sürecini göstermektedir: import os from langchain_community.document_loaders import PyPDFDirectoryLoader from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_openai import OpenAIEmbeddings from langchain_community.vectorstores import Qdrant from qdrant_client import QdrantClient, models # 1. Belgeleri Yükleme loader = PyPDFDirectoryLoader("./kurumsal_belgeler/") raw_documents = loader.load() # 2. Metin Parçalama (Chunking) text_splitter = RecursiveCharacterTextSplitter( chunk_size=1000, chunk_overlap=150, separators=["\n\n", "\n", " ", ""] ) docs = text_splitter.split_documents(raw_documents) # 3. Embedding Modeli ve Qdrant Bağlantısı embeddings = OpenAIEmbeddings(model="text-embedding-3-small") qdrant_url = "http://localhost:6333" # Qdrant İndeksini Oluşturma ve Veri Aktarımı vector_db = Qdrant.from_documents( docs, embeddings, url=qdrant_url, collection_name="kurumsal_bilgi_bankasi", force_recreate=True ) print(f"{len(docs)} adet metin parçası başarıyla vektörleştirildi ve Qdrant'a yüklendi.") 4. LangChain Entegrasyonu ile Uçtan Uca RAG Hattı Oluşturma Veriler Qdrant üzerinde vektör indeksine dönüştürüldükten sonra, kullanıcının sorgusunu alıp doğru bilgiyi getirecek ve LLM'e besleyecek zinciri (chain) kurmak gerekir. LangChain, bu bileşenleri modüler bir şekilde birbirine bağlamak için mükemmel bir orkestrasyon aracıdır. Bu aşamada ChatPromptTemplate ile modelin sistem talimatları sınırlandırılır. Modelin sadece sağlanan bağlama sadık kalması yönünde kesin direktifler verilir. Böylece uydurma yanıtların önüne geçilir. Aşağıdaki kod örneğinde, oluşturulan Qdrant indeksinden bilgi çeken ve gpt-4o-mini modeli ile yanıt üreten tam teşekküllü bir RAG zinciri yer almaktadır: from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser from langchain_core.runnables import RunnablePassthrough # 1. Qdrant Retriver (Bilgi Getirici) Tanımlama retriever = vector_db.as_retriever( search_type="similarity", search_kwargs={"k": 4} ) # 2. Sistem Prompt Tasarımı system_prompt = """ Sen kurumsal bir asistan yapay zekâsın. Yalnızca sana sağlanan bağlamı (context) kullanarak sorulara cevap ver. Eğer cevap sağlanan bağlamda yoksa, bilmediğini açıkça belirt ve tahmin yürütme. Bağlam: {context} """ prompt = ChatPromptTemplate.from_messages([ ("system", system_prompt), ("human", "{question}") ]) # 3. LLM Model Tanımı llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.0) # 4. Bağlam Birleştirme Fonksiyonu def format_docs(docs): return "\n\n".join(doc.page_content for doc in docs) # 5. RAG Chain Kurulumu (LCEL - LangChain Expression Language) rag_chain = ( {"context": retriever | format_docs, "question": RunnablePassthrough()} | prompt | llm | StrOutputParser() ) # 6. Sorgu Çalıştırma sorgu = "Şirketin yıllık izin politikası ve mazeret izni şartları nelerdir?" yanit = rag_chain.invoke(sorgu) print("--- Yanıt ---") print(yanit) 5. Yanılsama (Hallucination) Metriklerini Düşürme Yöntemleri Standart bir RAG mimarisi her zaman mükemmel sonuç vermeyebilir. Arama aşamasında yanlış verilerin getirilmesi veya LLM'in gelen veriyi yanlış yorumlaması kalite sorunlarına yol açar. Bu sorunları aşmak için gelişmiş RAG (Advanced RAG) teknikleri uygulanmalıdır: Re-ranking (Yeniden Sıralama): Vektör aramasından dönen ilk N sonucu (örneğin k=20), Cohere ReRank gibi özel bir çapraz kodlayıcı (cross-encoder) modelinden geçirerek en alakalı 3-4 parçaya indirmek doğruluk oranını gözle görülür şekilde artırır. Query Rewriting (Sorgu Yeniden Yazımı): Kullanıcının girdiği belirsiz veya eksik sorguları LLM kullanarak daha detaylı ve vektör arama performansını artıracak anahtar kelimelerle yeniden yapılandırmak son derece etkilidir. Hybrid Search (Karma Arama): Anlamsal arama (dense retrieval) ile geleneksel BM25 kelime aramasını (sparse retrieval) birleştirmek, özellikle ürün kodları veya özel terimler içeren sorgularda kaçırılan bilgileri yakalar. 6. Üretim Ortamında (Production) RAG Ölçekleme ve Performans Optimizasyonu RAG sistemini binlerce kullanıcının erişimine sunarken performans ve güvenilirlik en önemli faktör haline gelir. Qdrant vektör veritabanını üretim ortamında dağıtırken bellek (RAM) kullanımı dikkate alınmalıdır. HNSW indekslerinin RAM tüketimini azaltmak adına Scalar Quantization (SQ) veya Product Quantization (PQ) yöntemleri kullanılarak vektör boyutları küçültülebilir. Bu işlem %80'e varan bellek tasarrufu sağlarken doğruluk kaybını önemsiz seviyelerde tutar. Sistem kalitesini sürekli izlemek için Ragas veya TruLens gibi RAG değerlendirme çerçeveleri (evaluation frameworks) entegre edilmelidir. Bu araçlar; Sadakat (Faithfulness), Soru Alaka Düzeyi (Answer Relevance) ve Bağlam Doğruluğu (Context Precision) gibi metrikleri otomatik ölçümleyerek sistemdeki zayıf halkaları tespit etmeye imkân tanır.

Devamını Oku
21.09.2026

Micro-Frontend Mimarisi: Webpack 5 Module Federation ile Ölçeklenebilir Sistemler

Micro-Frontend Nedir ve Neden İhtiyaç Duyulur? Büyük ölçekli yazılım projelerinde monolitik ön yüz (frontend) mimarileri zamanla yönetilemez hale gelebilir. Yüzlerce bileşenden oluşan, onlarca geliştiricinin aynı kod tabanı (codebase) üzerinde çalıştığı yapılarda derleme süreleri uzar, bağımlılık güncellemeleri riskli hale gelir ve canlıya alım (deployment) süreçleri kilitlenir. Micro-Frontend mimarisi, arka planda (backend) yıllardır başarıyla uygulanan mikroservis yaklaşımını kullanıcı arayüzü dünyasına taşır. Bu yaklaşım sayesinde devasa bir web uygulaması, kendi bağımsız yaşam döngüsüne, kod deposuna (repository) ve CI/CD süreçlerine sahip küçük, özerk parçalara bölünür. Her bir takım, sistemin diğer kısımlarını bozma korkusu duymadan kendi sorumluluk alanındaki mikro uygulamayı geliştirebilir, test edebilir ve canlı ortama aktarabilir. Webpack 5 Module Federation Nasıl Çalışır? Geçmişte iframe kullanımı, build-time entegrasyonlar veya npm paketleri ile çözülmeye çalışılan frontend ölçekleme sorunları, Webpack 5 ile tanıtılan Module Federation özelliği sayesinde radikal bir biçimde çözüme kavuştu. Module Federation, JavaScript modüllerinin derleme aşamasında değil, doğrudan çalışma zamanında (runtime) başka bir uygulamadan dinamik olarak yüklenmesine olanak tanır. Bu mimaride temel olarak iki ana rol bulunur: Host (Shell) Uygulama: Ana omurgayı oluşturan, yönlendirme (routing) ve genel sayfa düzenini (layout) yöneten, dışarıdan gelen mikro uygulamaları kapsülleyen ana yapı. Remote Uygulama: Kendi başına çalışabilen ancak belirli bileşenlerini veya sayfalarını dış dünyaya açan (expose eden) bağımsız mikro uygulama. Uygulamalı Adımlarla Module Federation Yapılandırması Pratik bir senaryo üzerinden Module Federation'ın nasıl kurulacağını inceleyelim. Senaryomuzda bir e-ticaret platformunun sepet bileşenini (Remote) ana uygulamaya (Host) nasıl entegre edeceğimizi adım adım yapılandıracağız. 1. Remote Uygulama (Sepet Servisi) Yapılandırması Remote uygulama, dışarıya sunacağı bileşenleri webpack.config.js dosyasındaki ModuleFederationPlugin eklentisi aracılığıyla tanımlar. const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin'); module.exports = { mode: 'development', devServer: { port: 3001, }, plugins: [ new ModuleFederationPlugin({ name: 'cartApp', filename: 'remoteEntry.js', exposes: { './CartWidget': './src/components/CartWidget', }, shared: { react: { singleton: true, requiredVersion: '^18.0.0' }, 'react-dom': { singleton: true, requiredVersion: '^18.0.0' }, }, }), ], }; 2. Host Uygulama (Shell) Yapılandırması Host uygulama ise remoteEntry.js dosyasını işaret ederek uzak bileşeni çalışma zamanında dinamik olarak içeri aktarır. const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin'); module.exports = { mode: 'development', devServer: { port: 3000, }, plugins: [ new ModuleFederationPlugin({ name: 'hostApp', remotes: { cartApp: 'cartApp@http://localhost:3001/remoteEntry.js', }, shared: { react: { singleton: true, requiredVersion: '^18.0.0' }, 'react-dom': { singleton: true, requiredVersion: '^18.0.0' }, }, }), ], }; Micro-Frontend Mimarilerinde Performans ve Durum Yönetimi Micro-Frontend mimarisine geçerken dikkat edilmesi gereken en kritik hususlardan biri ağ yükü ve performans optimizasyonudur. Her mikro uygulamanın kendi React veya Vue kütüphane kopyasını indirmesi, kullanıcılara devasa bir JavaScript paketi yükler. shared parametresi burada devreye girerek ortak bağımlılıkların tekilleştirilmesini (singleton) sağlar. Durum yönetimi (State Management) tarafında ise mikro uygulamaların birbirinden bağımsız kalması esastır. Global bir Redux store paylaşmak yerine, uygulamalar arası iletişim tarayıcı olayları (CustomEvent API) veya hafif yayın/abone (Pub/Sub) mekanizmaları ile yürütülmelidir. Bu sayede mikro uygulamalar arasındaki sıkı bağlar (tight coupling) engellenmiş olur. Üretim Ortamında (Production) Best Practice Prensipleri Sistemin canlı ortamda yüksek erişilebilirlikle çalışabilmesi için aşağıdaki prensiplerin uygulanması önerilir: Dinamik Remote Tanımlama: Canlı ortamda sunucu adresleri değişebileceğinden, remote URL'leri statik konfigürasyonlar yerine çalışma zamanında (runtime) bir API veya ortam değişkeni üzerinden dinamik yüklemek kritik öneme sahiptir. Hata Toleransı (Fallback UI): Uzak bir servis çöktüğünde veya ağ hatası nedeniyle yüklenemediğinde, tüm ana uygulamanın kilitlenmesini engellemek adına React Error Boundary yapıları ve yedek (fallback) UI bileşenleri entegre edilmelidir. CSS İzolasyonu: Farklı ekiplerin yazdığı stillerin birbiriyle çakışmasını önlemek amacıyla Tailwind CSS prefixing, CSS Modules veya Shadow DOM gibi izolasyon teknikleri tercih edilmelidir. Semantik Versiyonlama: Bağımlılık uyumsuzluklarının önüne geçebilmek adına takımlar arası versiyonlama standartlarına sıkı sıkıya bağlı kalınmalıdır. Modern web geliştirme süreçlerinde karmaşıklığı yönetmek, ekipleri bağımsızlaştırmak ve geliştirici deneyimini (DX) en üst seviyeye çıkarmak için Micro-Frontend mimarileri güçlü bir alternatif sunar. Webpack 5 Module Federation altyapısı ile bu mimariyi doğru kurgulamak, sürdürülebilir ve esnek platformlar inşa etmenin önünü açar.

Devamını Oku