Sitemap

Prompt Mühendisliği: AI Asistanınızı Stajyerden Ustalığa Yükseltme Sanatı

10 min readJun 25, 2025

--

Merhaba, değerli geliştirici arkadaşlar. Bu yazımda sizlere Prompt Mühendisliği kavramını ve nasıl doğru promptlar yazabiliriz konusunu anlatmaya çalışacağım. Umarım sizler için faydalı olur.

Prompt Mühendisliği

Prompt Mühendisliği yapay zekanın gündemimize bomba gibi düştüğü günlerde bir meslek olarak anılıyordu. Belki bunun için ayrı okullar, eğitimler vs verilebilir deniyordu ancak günümüz itibariyle nedense o kadar önemli olduğu düşünülmüyor. Hatta balon olduğunu iddia edenler bile var. Fakat bu yazımda promtp mühendisliğinin geleceği hakkında konuşmuyoruz, ne olduğunu açıklayıp, kendi alanım olan Flutter ekseriyetinde nasıl daha doğru promptlar yazabiliriz bunu konuşuyor olacağız.

Promptlar; bizim yapay zeka modellerine verdiğimiz komutlardır.

Örneğin;

  • “Bu metni özetle”
  • “Bir şiir yaz”
  • “Bu kodu açıkla”
  • “Türkçe’ye çevir”

gibi yazdığımız şeyler prompt yani komut olarak kabul ediliyor.

Prompt mühendisliği ise, AI’dan istediğiniz sonucu alabilmek için prompt’larınızı optimize etme pratiğidir. Yani iyi ve etkili promptlar yazabilmeyi pratize ettiğimiz bir alan diyebiliriz.

Peki neden iyi prompt yazmak bu kadar önemli? Sonuçta yapay zeka çok akıllı ve her geçen gün gelişmiyor mu? Ne yazdığımın ne önemi var demeyin…

Bisiklette bir araç ve bizi bir yere götürür, yarış araçlarıda bir araç ve bizi bir yere götürür. Ama fark şu; Yarış araçları bizi varış noktamıza daha hızlı ve daha iyi şekilde götürür.

Yapay zeka modelleri (LLM’ler), inanılmaz güçlü motorlardır. Ancak bu motorun ne kadar güç üreteceği, ne kadar verimli çalışacağı ve sizi tam olarak istediğiniz hedefe ne kadar hassasiyetle ulaştıracağı, tamamen sizin ona verdiğiniz “anahtar, yakıt ve yol tarifi” olan prompt’a bağlıdır.

Cursor, Claude, Copilot gibi araçlarla kodlama konusunda inanılmaz işler yapabiliyoruz. Ancak bir sorun var: Bu araçlar ve kullanılan yapay zeka modelleri, siz ona doğru soruları sormadıkça, ne yapacağını bilemeyen, hevesli ama tecrübesiz bir stajyer gibi davranır.

İşte tam burada bu tecrübesiz stajyeri bir ustaya olabildiğince döndürmek için yapabileceklerimizden bahsediyoruz.

Bölüm 1: Komut Vermekten Diyalog Kurmaya

Çoğu geliştirici, AI’a bir Google araması gibi davranır. Ancak yapay zeka deminde bahsettiğim gibi sizin onu yönlendirmenizi bekler.

Kötü Yaklaşım (Arama Motoru Zihniyeti):
“flutter kullan ve verdiğim apiden verileri çek”

Bu, AI’a bir avuç anahtar kelime fırlatıp, ilgili linkleri bekleme alışkanlığımızdan gelir. AI size bir şeyler verir, evet. Ama bu, bir ansiklopediden rastgele bir sayfa koparıp önünüze atmak gibidir.

Doğru Yaklaşım (Mimar Zihniyeti):
“Sen, performans optimizasyonu ve temiz kod konularında uzman bir Senior Flutter Geliştiricisisin. Bir API’den JSON formatında bir kullanıcı listesi çekecek ve bunu ekranda kaydırılabilir bir listede gösterecek bir sayfa tasarlamanı istiyorum. Durum yönetimi için Riverpod kullanacağız. Veri yüklenirken bir iskelet (skeleton) arayüzü göster, hata durumunda ise kullanıcı dostu bir mesaj ve yeniden deneme butonu sun.”

Farkı görüyor musunuz? İlkinde bir komut var, ikincisinde ise bir görev tanımı (briefing). AI’ı projenize dahil ettiniz, ona bir rol verdiniz, hedefleri ve kısıtlamaları çizdiniz. Onu bir araçtan bir takım arkadaşına dönüştürdünüz.

NOT: AI’ı asla bir “şey” olarak görmeyin. Onu, projenize yeni katılmış süper zeki ama proje hafızası olmayan bir meslektaşınız olarak düşünün. Her seferinde ona bağlamı ve hedefleri hatırlatmalısınız.

Bölüm 2: Prompt’un Dört Temel Direği

Her etkili prompt, dört temel üzerine kuruludur. Bunu aklınızda tutmak için Ro-Ba-He-Bi (Rol, Bağlam, Hedef, Biçim) formülünü kullanabilirsiniz. Türkçe kodlaması bu şekilde. Ama ben ortamlarda havalı görünmek istiyorum diyorsanız ingilizce kısaltmasını ekleyeyim. R.O.P.E.S. — karışık sıralandırma yapılmıştı akılda kalıcı olsun diye-

1. ROL (Persona): “Sen Kimsin?”

Bu, yapabileceğiniz en basit ama en etkili ayardır. AI’a bir kimlik atayarak, onun milyarlarca parametreden oluşan sinir ağında, o kimlikle ilgili olan yolları “aydınlatırsınız”. Yani yapay zekaya bir kimlik kazandırarak ne için emrinize amade olduğunu anlamasına yardımcı olabilirsiniz.

  • Sıradan Prompt: Bu kodu daha iyi yap.
  • Rol Atanmış Prompt: Sen, SOLID prensiplerine sıkı sıkıya bağlı bir yazılım mimarısın. Aşağıdaki Flutter widget’ını Tek Sorumluluk Prensibi’ni (Single Responsibility Principle) ihlal edip etmediği açısından analiz et ve daha modüler hale getirmek için yeniden düzenle (refactor).

Aradaki farkı görüyorsunuz. Kimlik atama işlemi bile olsa sadece bir kaç anahtar kelimeyi vermiyoruz. Diyalog kurup kendisine kimlik, rol ataması yapıyoruz.

Ben Flutter geliştiricisi olarak örnek olması açısından bazı persona örnekleri yazıyorum. Sizlerde kendi personalarınızı, ihtiyaçlarınıza göre geliştirebilirsiniz

Flutter İçin Güçlü Personalar:

  • “Material Design 3 ve akıcı animasyonlar konusunda uzman bir UI/UX mühendisi.”
  • “Flutter uygulamalarında bellek sızıntılarını ve gereksiz build tetiklemelerini bulma konusunda takıntılı bir performans mühendisi.”
  • “Karmaşık iş akışlarını BLoC veya Riverpod kullanarak yöneten bir state management uzmanı.”
  • “Güvenlik zafiyetlerini (XSS, güvensiz veri depolama vb.) tespit eden bir siber güvenlik analisti.”

2. BAĞLAM (Context): “Neredeyiz ve Elimizde Ne Var?”

AI’ın hafızası yoktur. Projenizin dosya yapısını, kullandığınız kütüphaneleri, kodlama standartlarınızı bilmez. Hafıza özelliği yavaş yavaş kazandırılmaya çalışılıyor. Cursor kullananlar bilir @ işareti ile ilgili sayfa, klasör vb. seçip etkileşime girmesini sağlayabiliyoruz.

  • Tehlikeli Derecede Kötü:

Bu butona basınca veriyi kaydet. (Hangi buton? Hangi veri? Nereye kaydet?)

  • Güçlü ve Güvenli:

Sen, benim Flutter projemde çalışıyorsun. Durum yönetimi için Provider kullanıyoruz. @user_profile_view.dart dosyasındaki Kaydet butonunun on Pressed fonksiyonunu yazmanı istiyorum. Butona basıldığında, @user_model.dart içindeki Usermodelinin mevcut state’ini alıp @user_service.dart dosyasındaki updateUserProfile metoduna göndermeli. Bu işlem asenkron olacağı için, işlem başlarken bir loading indicator göster ve buton pasif olsun; işlem bitince de bir SnackBar ile “Profil güncellendi” mesajı göster.

Bu şekilde prompt yazmak yapay zekanın halüsülasyon görmesinin önüne geçer yani yapınızın dışına çıkmasını, yanlış yöntemler kullanmasını engeller. Burada bu kadar uzun prompt yazacağıma kendim yaparım diyebilirsiniz ancak yapay zeka dediğimiz şey bir zihin okuyucusu ya da sihirli bir değnek değil. En azından günümüz itibariyle…

3. HEDEF & KISITLAMALAR (Objective & Constraints): “Ne İstiyorum ve Ne İstemiyorum?”

Hedefiniz kristal kadar berrak olmalı. AI’a yorum yapması için alan bırakmayın. İstediklerinizi yazmaktan geri durmayın. Örneğin bir ayarlar sayfası yapmak istiyor olun.

  • Bulanık Hedef:

Bana bir ayarlar sayfası yap.

  • Net Hedef ve Kısıtlamalar:

`Bir “Ayarlar” sayfası oluştur.

İstediklerim:

Sayfanın başında kullanıcının profil fotoğrafı ve adı görünsün.

“Hesap Ayarları”, “Bildirimler” ve “Görünüm” olmak üzere üç bölüm olsun.

“Görünüm” bölümünde “Karanlık Mod” için bir SwitchListTile bulunsun.
İSTEMEDİKLERİM (Kısıtlamalar):

GetX paketini kullanma, sadece Provider kullan.

Verileri local database’e (SQLite) yazma, şimdilik sadece SharedPreferences kullan.

Karmaşık animasyonlar ekleme, sade ve işlevsel olsun.

İsteklerini ve istemediklerinizi net şekilde belirtmek daha iyi çıktı almanızı sağlar. Eğer aklınızda bir şey yoksa, ayarlar sayfasının nasıl olması gerektiğine dair yapay zeka ile fikir alışverişi yapabilir ya da internet üzerinde örnek yapılar arayabilirsiniz.

Ayrıca istekler kadar istenmeyen şeylerde doğru çıktılar için önemlidir. Belirtmekten geri kalmayın. Tekrar belirtmiş olayım; bunu yazana kadar yaparım, çok uğraştırıcı demeyin. Doğru promptu yazmak 10 dakikanızı alırken, yapay zekanın yaptığı iş size 1 saat kazandırabilir..

4. BİÇİM (Format): “Çıktıyı Nasıl İstiyorum?”

AI’dan ne tür bir çıktı beklediğinizi belirtmek, size saatler kazandırabilir. Örneğin bir json modelinin dart için modelini oluşturmak istediğinizi varsayalım

  • Belirsiz Biçim:

Bu JSON için Dart modeli oluştur.

  • Belirli Biçim:

Aşağıdaki JSON verisini, null-safety kurallarına uygun bir Dart data sınıfına dönüştür. Sınıf, freezed paketini kullanmalı. fromJson factory constructor’ını da içermeli.

  • JSON Verisi:

{“id”: 1, “title”: “Flutter Pro”, “tags”: [“mobile”, “dev”]}

  • İstenen Çıktı Biçimi (Örnek):
import 'package:freezed_annotation/freezed_annotation.dart'; 
part 'product.freezed.dart';
part 'product.g.dart';

@freezed class Product with _$Product

{

const factory Product({
required int id,
required String title,
List<String>? tags,
}) = _Product;

factory Product.fromJson(Map<String, dynamic> json) => _$ProductFromJson(json);

}

Bu şekilde istediğimiz çıktılar için örnekler vermek istediğimiz yapıyı elde etmek adına bize çok zaman kazandırır. Çünkü yapay zeka nasıl bir çıktı vermesi gerektiğine dair artık çok nettir. Belirsizlikleri minimumdur.

Bölüm 3: AI’ın Düşünce Sürecini Yönetmek

Doğru şekilde prompt yazma adına temelleri öğrendik diyebiliriz. Şimdi bu temelleri biraz daha ileriye taşımaya bakalım. Aşağıdaki yapılar AI’a “ne yapacağını” söylemekle kalmaz, “nasıl düşünmesi gerektiğini” dikte eder.

Teknik 1: Chain-of-Thought (CoT) — “Adım Adım Düşün”

Varsayılan olarak bir LLM, bir “kara kutu” gibidir. İçine bir soru atarsınız, dışarı bir cevap çıkar. Ama cevabın nasıl bulunduğunu, hangi mantıksal adımlardan geçtiğini bilmezsiniz. Bu yüzden de sık sık mantık hatası yapar veya en bariz çözümü gözden kaçırır.

Düşünce Zinciri (Chain of Thought), bu kara kutuyu kırıp onu şeffaf bir “cam kutuya” dönüştürme eylemidir. AI’ı, cevabı vermeden önce, tıpkı bir insanın yapacağı gibi, mantıksal adımlarını sesli (yazılı) düşünmeye zorlarsınız. Bu basit eylem, karmaşık problemlerdeki başarı oranını katlayarak artırır. Bunu bir çok yapay zeka modelinde thinking vb adlarla adlandırılmış olarak görüyoruz zaten.

Bu, karmaşık problemler için mutlak bir zorunluluktur. AI’dan cevabı vermeden önce düşünce sürecini adım adım yazmasını istersiniz. Bu, onun mantıksal hatalar yapmasını engeller ve size de çözümün nasıl bulunduğunu gösterir.

  • Senaryo:

Bir ListView.builder içinde, her bir liste elemanı için asenkron bir veri çekiyorsunuz ve bu işlem sırasında state’i güncellediğiniz için o meşhur setState() or markNeedsBuild() called during build hatasını alıyorsunuz. Bu, her Flutter geliştiricisinin karşılaştığı klasik bir sorundur.

Bu senaryoda bir çok geliştirici yapay zekaya aynen şunu yazar;

  • “Bu kodda ‘setState called during build’ hatası alıyorum, düzelt.

Şimdi bunu yazıncada sorun çözülmüyor mu kardeşim diyeceksiniz. Bakın ben sorunu çözemez demiyorum. Bu da sorunu çözer mutlaka ama daha doğru bir yaklaşım şu şekilde olur;

ROL: Sen, Flutter’ın render döngüsü ve asenkron state yönetimi konularında derinlemesine uzman bir Flutter mimarısın.

BAĞLAM: Aşağıdaki kod, bir liste oluştururken her eleman için asenkron bir işlem yapıyor ve bu sırada hata veriyor.
**** HATALI KODUNUZ *****

GÖREV: Bu sorunu çözmek için adım adım düşünelim:
1. İlk olarak, bu `setState() or markNeedsBuild() called during build` hatasının Flutter’da *neden* ortaya çıktığını, build metodu sırasında state güncellemenin neden yasak olduğunu teknik olarak açıkla.
2. İkinci olarak, benim kodumdaki hangi satırın veya mantığın bu yasağı çiğnediğini tam olarak tespit et.
3. Üçüncü olarak, bu tür asenkron UI güncellemeleri için Flutter’daki en doğru ve idiomatic çözümün ne olduğunu belirt (örneğin FutureBuilder veya state management yaklaşımları).
4. Son olarak, benim kodumu bu doğru çözümü kullanarak yeniden yaz ve her satırın neden değiştirildiğini yorum satırlarıyla açıkla.

Bu şekilde bir prompt gönderdiğinizde hem sorunun nedenini hem çözüm adımlarını hemde bir daha bu şekilde hata almamak adına nelerden kaçınmanız gerektiğini öğrenmiş olursunuz. Diğer türlü bu sorunu çöz dediğinizde ne yazık ki kendinize bir şey katma olasılığını çok düşürüyorsunuz..

Teknik 2: Few-Shot Prompting — “Benim Gibi Yap”

Bundan bahsettik ama yine bahsedelim. Yapmak istediğiniz işlem ne ise ona dair bir örnek vererek istediğiniz çıktıyı almaya çalışırsınız. Yani AI’a ne istediğinizi birkaç örnekle (shot) gösterirsiniz. Bu, özellikle kod stili, formatlama veya çeviri gibi kalıp gerektiren işler için inanılmazdır.

  • Few-Shot Prompt:

`Sen, projedeki kod dokümantasyonunu standart hale getirmekle görevli birisin. Aşağıdaki örnekleri takip ederek, vereceğim yeni fonksiyon için bir DartDoc yorumu yaz.

  • ÖRNEK 1: İLGİLİ KODLAR…

AI, verdiğiniz örneklerden formatı (tek satırlık özet, parametreler, fırlatılan hatalar, dönüş değeri) öğrenir ve yeni fonksiyon için birebir uygular.

Teknik 3: İteratif Geliştirme — “Sohbeti Sürdür”

İlk prompt’ta mükemmel sonuç beklemeyin. En iyi sonuçlar, bir diyalog sonucunda ortaya çıkar. Ki bunuda yazının başında söyledik. Komutan gibi davranmayın yere yat, kalk, sürün, selamla vs şeklinde değil diyalog kurun. Bir takım arkadaşı gibi görün kendisini. Yapayda olsa bir kalbi olup olmadığını bilemezsiniz…

Siz: Bana bir e-ticaret uygulaması için ürün detay sayfası yap. (Geniş bir başlangıç)

AI: (Basit bir sayfa iskeleti verir)

Siz: Güzel başlangıç. Şimdi, ürün resimlerini yatayda kaydırılabilir bir galeri olarak ekle. smooth_page_indicator paketini kullanarak altta noktalar göster.

AI: (Resim galerisini ekler)

Siz: Harika. Fiyatın yanına, eğer varsa, indirim oranını (%20 gibi) kırmızı bir etiketle göster. Ayrıca bir “Sepete Ekle” butonu ekle. Bu butona basıldığında, animasyonlu bir şekilde sepet ikonuna doğru bir ürün resmi uçsun.

Bu, AI ile “pair programming” yapmanın en saf halidir. Adım adım, birlikte inşa edersiniz.

Teknikler sadece bu kadar değil. Araştırıldığında çok daha fazla teknik olduğunu göreceksiniz. Ve her birinin çeşitli amaçlarda kullanılabileceğinide yine göreceksiniz. Yazımı bitirmeden son bir teknik daha yazıp makaleyi bitirelim.

Teknik 4: Geri Adım (Step-back) — Balkona Çıkıp Resme Bakmak

Bazen bir soruna o kadar odaklanırız ki, “tünel vizyonu” yaşarız. Yanlış problemi çözmeye çalışırız veya daha büyük, daha zarif bir çözümü göremeyiz. Geri Adım tekniği, AI’ı ve dolayısıyla sizi, spesifik kod satırlarına dalmadan önce “balkona çıkıp resmin bütününe bakmaya” zorlar. Önce genel prensipleri ve stratejiyi belirler, sonra bu stratejiyi spesifik probleme uygular.

Yani al hemen bu sorunu çöz demeden önce yapay zeka ile birlikte konu üzerine fikir yürütürsünüz — daha çok yapay zeka yürütür — sizde bu fikirleri değerlendirip uygulama aşamasına koyarsınız. Hemen örnek senaryomuz gelsin.

Senaryo

Elinizde 1500 satırlık, içinde UI kodları, iş mantığı, API çağrıları ve state yönetiminin karman çorman olduğu devasa bir StatefulWidget var. Onu refactor etmeniz gerekiyor.

Bir çok geliştirici Cursor vb araçlar üzerinden hemen dosya konumu verip;

Bu widget’ı refactor et der. Ama yapay zeka uyması gereken kural vs varsa bilmeden en kestirmeden halletmeye çalışır. Dolayısıyla bu yöntem yanlış. Peki doğrusu ne?

Önce balkona çıkın. Yani yapay zekadan sorun üzerine konu üzerine fikir, yöntem alın.

Aşama 1:
* ROL: Sen, SOLID prensipleri ve Clean Architecture konusunda bir yazılım mimarısın.
* SORU: Flutter’da, devasa bir StatefulWidget’ı yönetilebilir, test edilebilir ve yeniden kullanılabilir bileşenlere ayırmanın temel stratejileri ve ilkeleri nelerdir? Bana özellikle Sorumlulukların Ayrılması (Single Responsibility) ve Bağımlılıkların Tersine Çevrilmesi (Dependency Inversion) ilkelerinin Flutter’da nasıl uygulanacağını açıkla.

Aşama 2:

Mükemmel bir açıklama. Şimdi, az önce bahsettiğin bu strateji ve ilkeleri kullanarak aşağıdaki canavar widget’ı refactor etmeni istiyorum.

BAĞLAM: `@/screens/monster_profile_screen.dart` dosyasındaki kod aşağıdadır: # [kodunuz ya da ilgili dosyanız ] #

GÖREV: Bu kodu, anlattığın ilkelere göre, state mantığını bir Riverpod provider’ına, UI parçalarını ise küçük, bağımsız ve stateless widget’lara bölerek yeniden yapılandır.

Bu şekilde AI’a sadece “yap” demek yerine, “nasıl yapılması gerektiğinin yol haritasını” önce siz ondan alıp, sonra o haritayı kullanarak işi yapmasını istersiniz. Bu, son derece ilkeli, mimari olarak sağlam ve “yamalama” hissinden uzak, profesyonel bir sonuç almanızı sağlar. Yanlış problemi çözme riskini ortadan kaldırırsınız.

Bu son teknikle beraber makaleyi sonlandırıyorum.

Kapanış ve Uyarılar

Değerli arkadaşlar;

Prompt Mühendisliği, bizim ana işimiz, mesleğimiz olmalı diye bir kural yok. Aslında farkında olmadan bir çoğumuz zaten bir prompt mühendisiyiz. Ama bu sanatta ustalaşmak, sizi sadece daha hızlı bir kodlayıcı yapmaz. Sizi daha iyi bir düşünür, daha iyi bir sistem tasarımcısı ve daha iyi bir problem çözücü yapabilir.

Ayrıca eklemek isterim. Doğru promptları yazmak zaman ve emek isteyen bir konudur. Yeteri kadar detay ve örnek verdiğinizde bile hatalı yanıtlar alma olasılığınız vardır. Promptların en verimli en doğru halini denemeler yaparak bulabilirsiniz. Yazılım gibi konu ve alan derinliği çok olan bölümlerde deneme yanılma yöntemleriyle pratiklik kazanmak yapacağınız en doğru işlerden biri olur bence. Bu yüzden prompt yazmayı ve elinizden geldiğince performanslarını ölçemeyi, istediğiniz çıktıları ne derece verdiği gibi başlıkları toplayıp incelemeyi ihmal etmeyin..

Ve Unutmayın, elinizdeki AI, sizin zekanızın bir yansımasıdır. Ona verdiğiniz talimatların kalitesi, ondan alacağınız çıktının kalitesini belirler. Stajyer mi istiyorsunuz, yoksa usta mı?

Sonraki makalelerde görüşmek üzere!

Github: www.github.com/abdullah017
Linkedin: www.linkedin.com/in/abdullahtas
Stackoverflow:
https://stackoverflow.com/users/13807726/abdullah-t

--

--

AbdullahTaş
AbdullahTaş

Written by AbdullahTaş

FLUTTER DEVELOPER AT IWWOMI | HASURA-GRAPHQL & FIREBASE |

No responses yet