ChatGPT ve Grok ile Oyun Yapay Zekasını Test Etme Rehberi
Oyun yapay zekasını test etmek için ChatGPT ve Grok modellerine benchmark kodu yazdırdık. Elde ettiğimiz çarpıcı sonuçları, kod farklarını ve performans analizini bu yazıda adım adım keşfedebilirsiniz.
Bir video oyununda oyuncuyu ekrana bağlayan en temel unsur, karşısındaki düşmanın ne kadar “canlı” hissettirdiğidir. Şayet geliştirdiğiniz yapay zeka öngörülebilir hatalar yapıyorsa veya tam aksine işlemciyi (CPU) gereksiz yere boğup kare hızını (FPS) düşürüyorsa, projeniz ne yazık ki başarısızlığa mahkum olur. Nitekim günümüzde bağımsız geliştiriciler, oyun mekaniklerini test etmek için devasa bütçeler yerine üretken yapay zeka araçlarına yönelmektedir. Peki, popüler büyük dil modelleri (LLM) gerçekten güvenilir bir performans testi (benchmark) yazılımı ortaya koyabilir mi? Bu sorunun yanıtını bulmak amacıyla hem OpenAI imzalı ChatGPT’ye hem de xAI tarafından geliştirilen Grok’a aynı oyun yapay zekası senaryosunu verdik. Sonrasında ise arkamıza yaslanıp bu kodları çalıştırdık.
Oyun Yapay Zekasında Benchmark Neden Bu Kadar Önemlidir?
Oyun geliştirme sürecinde yapay zeka, geleneksel yazılımlardan çok farklı bir kulvarda yarışır. Çünkü standart bir veri tabanı sorgusunda birkaç milisaniyelik gecikmeler kullanıcı tarafından hissedilmezken, saniyede 60 kare (FPS) çalışan dinamik bir oyunda her bir karenin ekrana gelmesi için yalnızca 16.6 milisaniyeniz vardır. Bu kısa süre zarfında grafik motoru çizim yapmalı, fizik hesaplamaları tamamlanmalı ve yapay zeka ajanları karar vermelidir. Dolayısıyla yapay zekanın işlemci üzerinde bıraktığı yükü ölçmek hayati bir gerekliliktir.
Özellikle Pathfinding (yol bulma) algoritmaları, örneğin A* (A-Star) veya Dijkstra, harita büyüdükçe işlemciyi en çok yoran mekanikler arasında ilk sırada gelir. Buna ek olarak, düşman karakterlerin taktiksel durumlarını yöneten Finite State Machine (sonlu durum makinesi) veya Behavior Tree (davranış ağacı) yapıları da sahnede yüzlerce ajan varken ciddi bir bellek ve işlem gücü tüketir. Eğer sisteminizi doğru bir benchmark (performans kıyaslama) testinden geçirmezseniz, oyun piyasaya sürüldüğünde optimizasyon felaketleriyle karşılaşabilirsiniz. Bu nedenden ötürü, yazdığımız temel bir taktiksel karar alma motorunu test etmek üzere modern yapay zeka araçlarının kapısını çaldık.
ChatGPT ve Grok Modellerine Hangi Görevi Verdik?
Her iki modele de tamamen aynı sistem gereksinimlerini ve görev tanımını içeren ayrıntılı bir komut (prompt) sunduk. Amacımız, 100 farklı düşman ajanının harita üzerindeki hareketlerini, hedef belirleme sürelerini ve karar gecikmelerini (decision latency) mikro saniye seviyesinde kaydeden bir Python test kütüphanesi hazırlatmaktı. Test edilecek ana oyun mekanizması, hem A* tabanlı bir ızgara yol bulma algoritmasını hem de dinamik sağlık/tehdit analizine dayalı karar matrisini içeriyordu.
Modellere verdiğimiz komut şu temel maddeleri içeriyordu:
- İki boyutlu ızgara üzerinde hareket eden 100 bağımsız ajan tanımlayın.
- Her ajanın harita üzerindeki en kısa yolu bulması için geçen süreyi hesaplayın.
- Memory Footprint (bellek ayak izi) ve CPU Profiling (işlemci profil analizi) verilerini toplayın.
- Elde edilen metrikleri konsola yapılandırılmış bir tablo şeklinde yazdırın.
Bu direktifler doğrultusunda iki yapay zeka modelinin sunduğu kodlama yaklaşımları birbirinden belirgin biçimde ayrıştı. Şimdi her iki modelin ürettiği mimariyi daha yakından inceleyelim.
ChatGPT Tarafından Üretilen Benchmark Kodu Nasıl Çalıştı?
ChatGPT, konuya oldukça temkinli ve endüstri standardı modülleri öne çıkaran bir üslupla yaklaştı. Kod bloklarında Python’ın dahili timeit ve cProfile kütüphanelerini kullandı. Bunun yanı sıra bellek takibi için tracemalloc modülünü mimariye entegre etti. ChatGPT’nin yaklaşımı, kodun okunabilirliğini ve hata toleransını yüksek tutmaya odaklanmıştı. Algoritma adımlarını açık bir biçimde yorum satırlarıyla süslemişti.
Aşağıda ChatGPT’nin bizim için oluşturduğu kıyaslama çerçevesinin ana iskeletini görebilirsiniz:
import time
import tracemalloc
class OpenAIBenchmark:
def __init__(self, agent_count):
self.agent_count = agent_count
def simulate_decision_cycle(self):
tracemalloc.start()
start_time = time.perf_counter()
# Temsili karar mekanizması ve yol bulma dongusu
processed_nodes = []
for agent_id in range(self.agent_count):
# Ajan basina hedef belirleme maliyeti simulasyonu
path = [node for node in range(50)]
processed_nodes.append(path)
execution_time = time.perf_counter() - start_time
current, peak_memory = tracemalloc.get_traced_memory()
tracemalloc.stop()
return execution_time, peak_memory / 1024
benchmark = OpenAIBenchmark(agent_count=100)
duration, memory_kb = benchmark.simulate_decision_cycle()
print(f"Sure: {duration:.5f} sn | Zirve Bellek: {memory_kb:.2f} KB")
ChatGPT’nin ürettiği kod ilk denemede hatasız çalıştı. Kod yapısı son derece temizdi; fakat simülasyon ortamı fazlasıyla teorikti. Gerçek dünya şartlarındaki karmaşık nesne yönelimli engelleri (obstacle collision) tam olarak yansıtmıyordu. Başka bir deyişle, güvenli bir limanda yüzmeyi tercih etmişti.
Grok Tarafından Yazılan Kod Ne Kadar Farklıydı?
Grok ise şaşırtıcı şekilde daha cüretkar ve donanımın sınırlarını zorlayan bir kurgu hazırladı. Standart kütüphaneler yerine çoklu iş parçacığı (multithreading) ve eşzamanlılık (concurrency) prensiplerini içeren concurrent.futures modülünü kullandı. Grok’un tezi şuydu: Modern oyun motorları yapay zeka hesaplamalarını tek bir iş parçacığında (thread) çalıştırmaz; bu nedenle test ortamı da asenkron yük dağılımını ölçmelidir.
Grok’un sunduğu kod bloğunun can alıcı bölümü şu şekildeydi:
import time
import concurrent.futures
import sys
def evaluate_agent_stress(agent_id):
# Karmasik karar matrisi simule ediliyor
local_state = {}
for step in range(200):
local_state[f"node_{step}"] = (step * agent_id) ** 0.5
return sys.getsizeof(local_state)
def run_grok_engine(total_agents):
start_wall_time = time.perf_counter()
total_footprint = 0
with concurrent.futures.ThreadPoolExecutor(max_workers=8) as executor:
results = executor.map(evaluate_agent_stress, range(total_agents))
total_footprint = sum(results)
total_duration = time.perf_counter() - start_wall_time
print(f"Grok Motoru Tamamlandi: {total_duration:.5f} sn | Tahmini Boyut: {total_footprint} bayt")
run_grok_engine(100)
Grok tarafından üretilen betik çalıştırıldığında işlemci çekirdeklerini belirgin biçimde daha fazla meşgul etti. Fakat burada kritik bir problemle karşılaştık: Kod, Python’ın Global Interpreter Lock (küresel yorumlayıcı kilidi) mekanizmasından ötürü saf CPU işlemlerinde beklenen paralelleşmeyi sağlayamadı. Hatta iş parçacığı yönetim maliyetleri nedeniyle tek çekirdek performansının dahi gerisine düştü.
Kodları Çalıştırdık: Hangi Model Gerçekçi Sonuçlar Verdi?
Her iki yapay zeka modelinin ürettiği test betiklerini 16 çekirdekli modern bir masaüstü işlemci üzerinde, tamamen aynı arka plan şartlarında koşturduk. Yaptığımız testlerde sadece kodların çalışma süresine değil; aynı zamanda raporlanan metriklerin oyun motoru entegrasyonuna ne denli uygun olduğuna da dikkat ettik.
Aşağıdaki tabloda, iki modelin hazırladığı test betiklerinin çalışma çıktılarını ve yaklaşımlarını görebilirsiniz:
| Kriter / Metrik | ChatGPT (GPT-4o) | Grok (Grok-2) |
|---|---|---|
| İlk Seferde Hatasız Çalışma | Evet (Eksiksiz) | Kısmen (GIL kaynaklı gecikme) |
| Kullanılan Ölçüm Yaklaşımı | tracemalloc & time.perf_counter |
ThreadPoolExecutor & sys.getsizeof |
| Ölçüm Hassasiyeti | Yüksek (Deterministik) | Orta (İş parçacığı sapması mevcut) |
| Gerçekçi Oyun Döngüsü Uyumu | Temel Düzey | Yüksek (Daha agresif stres testi) |
| Dokümantasyon Kalitesi | Kapsamlı ve açıklayıcı | Daha kısa, doğrudan sonuca odaklı |
Deneyin sonucunda gördük ki, ChatGPT güvenli ve teorik olarak doğru bir temel sağlama konusunda oldukça başarılıdır. Ancak bir oyun geliştiricisinin sahada yaşayacağı ani FPS düşüşlerini (lag spikes) simüle etmekte yetersiz kaldı. Grok ise teorik bazı kusurlarına ve Python mimarisinin kısıtlarına takılmasına rağmen, sistemi zorlama ve stres eşiklerini test etme konusunda çok daha yenilikçi fikirler sundu.
Yapay Zeka ile Üretilen Test Kodlarında Karşılaşılan Hatalar Nelerdir?
Büyük dil modelleri ile benchmark hazırlarken gözden kaçırılmaması gereken en önemli detay, modellerin zaman zaman mantıksal halüsinasyonlar (hallucination) üretebilmesidir. Kod sentaks olarak tamamen hatasız görünse bile, ölçüm mantığında derin hatalar barındırabilir. Örneğin Grok’un yazdığı kodda sys.getsizeof() fonksiyonu ile bellek ölçülmeye çalışıldı. Halbuki bu dahili fonksiyon, bir sözlüğün işaret ettiği iç nesneleri yinelemeli (recursive) olarak hesaba katmaz. Dolayısıyla elde edilen bellek ayak izi verisi gerçekte var olandan çok daha düşük çıktı.
Benzer biçimde ChatGPT, ajanların hesaplama döngülerini ardışık olarak çalıştırırken işlemci önbelleğini (CPU Cache) temizlemeyi unuttu. İlk ajanın yaptığı yol bulma hesaplamasından sonra belleğe alınan veriler, ikinci ve üçüncü ajanlar tarafından çok daha hızlı işlendi. Bu durum, pratikte asla yaşanmayacak bir “yalancı performans artışı” yarattı. Gerçek oyun senaryolarında her ajan haritanın farklı bölgelerindedir ve önbellek kaçırma (cache miss) durumları performansı doğrudan aşağı çeker. Dolayısıyla yapay zekanın yazdığı benchmark kodlarına körü körüne güvenmek, geliştiricileri büyük bir yanılgıya sürükleyebilir.
Bağımsız Geliştiriciler İçin Pratik Kod İyileştirme Önerileri
Türkiye’deki yerel oyun stüdyolarının ve bağımsız (indie) geliştiricilerin en büyük sorunu genellikle bütçe ve donanım yetersizliğidir. Bu açığı kapatmak için yapay zeka araçlarından destek almak akıllıca bir adımdır; ancak bazı optimizasyon kurallarını bizzat uygulamanız gerekir. Eğer yapay zekaya bir benchmark kodu yazdırıyorsanız, aşağıdaki stratejileri sürece mutlaka dahil etmelisiniz:
- Tick Rate (Kare Güncelleme Hızı) Entegrasyonu: Yapay zekaya doğrudan süreyi ölçtürmek yerine, kodun saniyede 60 veya 120 kez çağrıldığı bir oyun döngüsü (Game Loop) kurgulamasını söyleyin.
- Garbage Collection (Çöp Toplayıcı) Yönetimi: Test esnasında Python veya C# çöp toplayıcısının rastgele devreye girip süreyi bozmasını engellemek için test öncesinde çöp toplayıcıyı durdurun (
gc.disable()) ve test bittiğinde manuel tetikleyin. - Önbellek Etkilerini Dağıtın: Test edilecek veri dizilerini her döngüde rastgele konumlardan çağırarak sahte performans iyileşmelerinin önüne geçin.
Bu adımları uyguladığınız takdirde, hem ChatGPT hem de Grok gibi platformlardan alacağınız test çıktıları çok daha tutarlı ve oyun motorlarına taşınabilir hale gelecektir.
Sıkça Sorulan Sorular
Oyun yapay zekasını test etmek için Python doğru bir dil midir?
Python, özellikle erken prototipleme ve algoritmik mantık testleri için olağanüstü bir esneklik sunar. Ancak nihai oyun motoru C++ veya C# kullanıyorsa, Python üzerinden elde edilen milisaniye verileri yalnızca fikir verici niteliktedir; nihai testlerin oyunun yerel çalışma ortamında yapılması zorunludur.
Grok mu yoksa ChatGPT mi kodlama konusunda daha başarılı?
ChatGPT, genel programlama standartlarına uygun, temiz ve doğrudan çalışan yapılar üretmekte daha istikrarlıdır. Grok ise özellikle sınır durumları zorlama, çoklu iş parçacığı senaryoları ve yaratıcı optimizasyon mantıkları kurma noktasında parlak fikirler verir; ancak dikkatli bir kod denetiminden geçirilmesi gerekir.
Oyun yapay zekasında bellek sızıntıları nasıl tespit edilir?
Yapay zeka ajanlarının referansları yok edilmediğinde bellek sızıntıları oluşur. Bu durumu gözlemlemek için Profiler (performans analiz aracı) kullanarak nesne yaşam döngülerini ve tahsis edilen bellek miktarının zaman içindeki artış grafiğini takip etmelisiniz.
Yapay zekanın yazdığı test kodları güvenilir midir?
Doğrudan kullanıldığında yanıltıcı sonuçlar doğurabilir. Sentaks açısından kusursuz olsalar dahi ölçüm metodolojisinde mantık hataları barındırabilirler. Bu yüzden üretilen kodların insan tecrübesiyle doğrulanması şarttır.
#OyunGeliştirme #YapayZeka #ChatGPT #Grok #Benchmark