5. ChatGPT ile üç sorunun çözümü
5.1. Giriş
İşte bir ChatGPT oturumunun ilk ekran görüntüsü:
![]() ![]() |
- [1-3]'te, ChatGPT'te ortaya çıkan üç sorun;
- [4]'te, ChatGPT'in URL'i;
- [5]'te, ChatGPT'in kullanılan sürümü;
ChatGPT, OpenAI'in bir ürünüdür ve URL ile [https://chatgpt.com/]'te mevcuttur. Yukarıdaki gibi soru-cevap oturumlarınızın geçmişine erişmek için bir hesap oluşturmanız gerekir. Ayrıca, test edilen diğer tüm IA'ler gibi, ChatGPT de soru sayınızı ve indirilen dosya sayısını sınırlamaktadır. Bu sınıra ulaşıldığında oturum sona erer ve daha sonra devam etmeniz önerilir. ChatGPT tarafından uygulanan sınırlar çok hızlı bir şekilde dolmaktadır. Bu eğitimi hazırlamak için bir aylık ücretli abonelik almam gerekti.
ChatGPT'in arayüzü şu şekildedir:
![]() |
- [1]'te, sorulan soruya dosya eklemek için;
- [2]'te, sorulan soru;
- [3]'te, IA'in çalıştırılması;
5.2. Sorun 1
ChatGPT'teki soru:
![]() |
ChatGPT doğru yanıt veriyor.
5.3. Sorun 2
PDF ile vergi hesaplaması. Dürüst olmak gerekirse, ilk PDF'teki hataları düzelten ve Gemini tarafından oluşturulan PDF'i kullanacağız.
![]() |
- [1]'te, Gemini tarafından oluşturulan PDF'i verdik;
- [2] dosyasında, Gemini'nin üstünlüğünü kanıtladığı birim testi eklenmiştir:
ChatGPT'i çalıştırıyoruz. Yanıtını oluşturması yaklaşık 3 dakika sürüyor. Gemini'nin aksine, oluşturulan komut dosyasını almak için çalışan bir bağlantı sağlıyor. Bunu PyCharm'e yüklüyoruz:
![]() |
[chatGPT1] komut dosyası ilk denemede çalışıyor. Bu konuda tartışmaya gerek yok, bu sorunda ChatGPT, Gemini'den daha iyi performans gösterdi.
ChatGPT tarafından sağlanan [chatGPT1] komut dosyası şöyledir:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 | |
5.4. 3. Sorun
Şimdi ChatGPT'ten internet üzerinden vergi hesaplama kurallarını aramasını istiyoruz:
![]() |
Bu sefer, uyulması gereken hesaplama kurallarını içeren PDF dosyası sağlanmamaktadır. Yalnızca metin dosyasında talimatlarımız verilmektedir. Hatırlatmak isteriz ki, bu metin dosyası artık 12 birim testi içermektedir; çünkü başlangıçtaki 11 teste, Gemini'nin benim ilk PDF dosyamın hatalı olduğunu kanıtlamak için kullandığı testi de ekledik.
ChatGPT, 8 dakika içinde yanıt verdi ve oluşturulan komut dosyasını indirmek için bir bağlantı sağladı. PyCharm’e yüklendikten sonra, bu komut dosyası 12 testi de geçti. Dolayısıyla, sorulan iki soruya ChatGPT ilk denemede doğru yanıt verdi ve böylece Gemini’yi geride bıraktı.
ChatGPT, yanıtında kaynaklarını belirtir:
![]() |
Söylenecek bir şey yok, harika bir iş çıkarmış.
Şimdi, Gemini’ye yaptığımız gibi, öğrenciler için bir PDF oluşturmasını isteyebiliriz.
![]() |
ChatGPT yanıtı, birkaç kez gidip gelmenin ardından elde edildi; çünkü oluşturulan PDF, karakterleri kareyle değiştiren bir yazı tipi kullanıyordu. Ancak sonunda PDF'i oluşturdu. Bunu paylaşıyorum çünkü Gemini'nin PDF'inden farklı kurallar veriyor ve ben de hangisinin doğru olduğunu merak ettim. Bunu araştıracağız.
![]() |
![]() |
![]() | ![]() |
![]() |
Gemini'nin PDF modeliyle arasındaki fark, indirim hesaplamasında yatmaktadır. İki IA modeli aynı yaklaşımı benimsememektedir. Gemini şöyle yazmıştı:
![]() |
![]() |
![]() |
İki IA kodu da birbirinden farklı yaklaşımlar sergiliyor. Hangisi doğru?
5.5. 4. Problem
ChatGPT'ten, vergi hesaplamasını yapmak için PDF'i temel almasını isteyeceğiz:
![]() | ![]() |
Önceki seferlerde olduğu gibi, ilk denemede çalışan bir Python betiği oluşturuyor. Talimatlara ek bir test eklemiştik:
13 testin tümü başarıyla geçildi.
5.6. Gemini’ye geri dönüş
Şimdi Gemini'ye geri dönüyoruz ve ona ChatGPT'ten PDF'i sunacağız. Bu PDF'te uygulanan kurallar, Gemini'deki PDF'te uygulanan kurallardan farklı olduğu için, ne olacağını merak edebiliriz:
![]() |
Gemini ilk olarak testleri geçemeyen bir Python betiği oluşturdu. Ona günlükler gösterildi:
Soru 2
![]() |
Soru 3
Hala hatalar var. Devam ediyoruz.
![]() |
Soru 4
Yürütme sırasında hâlâ hatalar var:
![]() |
Bu sefer doğru.
Yine de, hesaplama kuralları oldukça farklı olan PDF ve IA'in her ikisinin de doğru sonuçlar vermesi merak uyandırıcı.
Gemini’ye şu soruyu soruyoruz:
![]() |
Sorunun tam metni şöyledir:
Gemini’nin cevabı kesin:
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
5.7. ChatGPT ne düşünüyor?
ChatGPT’e de Gemini’ye sorulan aynı soru soruluyor.
![]() |
ChatGPT’in cevabı şöyledir:
![]() |
![]() |
Bunun üzerine, ChatGPT, iki yöntemi karşılaştırmak için bir birim testi öneriyor. Şunu kopyalıyoruz:
- Gemini tarafından, PDF'i kaynak alarak oluşturulan [gemini3] betiği; [Le problème selon Gemini], [gemini4] betiğinde kopyalanır;
- ChatGPT komut dosyası, PDF ve [Le problème selon ChatGPT] komut dosyalarını kaynak alarak oluşturulan [chatGPT3] komut dosyası, [chatGPT4] komut dosyasına kopyalanır;
![]() | ![]() |
Ayrıca, her bir [gemini4, chatGPT4] komut dosyasına, iki IA komut dosyası arasında ayrım yapmak için ChatGPT tarafından önerilen birim testi eklenir.
[gemini4] komutunun çalıştırılması sonucunda aşağıdaki sonuçlar elde edilir:
C:\Data\st-2025\dev\python\code\python-flask-2025-cours\.venv\Scripts\python.exe "C:/Program Files/JetBrains/PyCharm 2025.2.1.1/plugins/python-ce/helpers/pycharm/_jb_unittest_runner.py" --path "C:\Data\st-2025\dev\python\code\python-flask-2025-cours\outils ia\gemini\gemini4.py"
Testing started at 17:45 ...
Launching unittests with arguments python -m unittest C:\Data\st-2025\dev\python\code\python-flask-2025-cours\outils ia\gemini\gemini4.py in C:\Data\st-2025\dev\python\code\python-flask-2025-cours
SubTest failure: Traceback (most recent call last):
File "C:\Program Files\Python313\Lib\unittest\case.py", line 58, in testPartExecutor
yield
File "C:\Program Files\Python313\Lib\unittest\case.py", line 556, in subTest
yield
File "C:\Data\st-2025\dev\python\code\python-flask-2025-cours\outils ia\gemini\gemini4.py", line 234, in test_cas_verifies_simulateur_officiel
self.assertAlmostEqual(calcul_impot, attendu_impot, delta=1, msg="Échec sur le montant de l'impôt")
~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: 2669 != 2270 within 1 delta (399 difference) : Échec sur le montant de l'impôt
Ran 1 test in 0.010s
FAILED (failures=1)
One or more subtests failed
Failed subtests list: [Test 'test12' avec entrée (2, 0, 43333)]
Process finished with exit code 1
Dolayısıyla Gemini, ChatGPT tarafından eklenen testte başarısız oluyor.
[chatGPT4] komutunun çalıştırılması şu sonuçları verir:
C:\Data\st-2025\dev\python\code\python-flask-2025-cours\.venv\Scripts\python.exe "C:\Data\st-2025\dev\python\code\python-flask-2025-cours\outils ia\chatGPT\chatGPT4.py"
Test (2, 2, 55555) -> obtenu (impôt=2814, décote=0, réduction=0) | attendu (2815, 0, 0) | OK
Test (2, 2, 50000) -> obtenu (impôt=1384, décote=384, réduction=347) | attendu (1385, 384, 346) | OK
Test (2, 3, 50000) -> obtenu (impôt=0, décote=721, réduction=0) | attendu (0, 720, 0) | OK
Test (1, 2, 100000) -> obtenu (impôt=19884, décote=0, réduction=0) | attendu (19884, 0, 0) | OK
Test (1, 3, 100000) -> obtenu (impôt=16782, décote=0, réduction=0) | attendu (16782, 0, 0) | OK
Test (2, 3, 100000) -> obtenu (impôt=9200, décote=0, réduction=0) | attendu (9200, 0, 0) | OK
Test (2, 5, 100000) -> obtenu (impôt=4230, décote=0, réduction=0) | attendu (4230, 0, 0) | OK
Test (1, 0, 100000) -> obtenu (impôt=22986, décote=0, réduction=0) | attendu (22986, 0, 0) | OK
Test (2, 2, 30000) -> obtenu (impôt=0, décote=0, réduction=0) | attendu (0, 0, 0) | OK
Test (1, 0, 200000) -> obtenu (impôt=64210, décote=0, réduction=0) | attendu (64211, 0, 0) | OK
Test (2, 3, 200000) -> obtenu (impôt=42842, décote=0, réduction=0) | attendu (42843, 0, 0) | OK
Test (2, 2, 49500) -> obtenu (impôt=1296, décote=431, réduction=325) | attendu (1297, 431, 324) | OK
Test (1, 0, 18535) -> obtenu (impôt=359, décote=491, réduction=90) | attendu (359, 491, 90) | OK
Test (2, 0, 43333) -> obtenu (impôt=2268, décote=0, réduction=401) | attendu (2270, 0, 400) | ECHEC
Détails tolérance ±1€ : impôt ok? False, décote ok? True, réduction ok? True
Résultat global : AU MOINS UN TEST ÉCHOUE ❌
Process finished with exit code 0
ChatGPT de eklenen testte başarısız oluyor, ancak bunun nedeni Gemini ile aynı değil. ChatGPT doğru sonuçları buldu, ancak belirlenen 1 euro yerine 2 euro farkla.
Dolayısıyla bundan sonra, ChatGPT tarafından üretilen PDF'i, sonraki IA'lerle birlikte kullanacağız. Talimatlarımda önerilen birim testlerinin eksikliği nedeniyle, iki IA'in de ilk testleri başarıyla geçtiğini belirtmek gerekir. Bu nedenle, bu özel örnekte, vergi hesaplamasının sınır durumları için birim testleri eklemenin önemi ortaya çıkmaktadır. Bu testleri kendi başımıza hayal etmek oldukça zor olduğundan, IA'lerden bunları kendileri eklemelerini isteyeceğiz.
5.8. IA tarafından oluşturulan birim testleri ile 3. problem
Gemini ve ChatGPT ile elde edilen sonuçlar şüphe uyandırıyor. IA, akla gelebilecek tüm testleri geçerli kılan genel bir çözüm mü buldu, yoksa sadece zorunlu testleri geçerli kılan bir çözüm mü buldu? PDF'i içermeyen bir çözüme geri döneceğiz; böylece IA'leri, ihtiyaç duydukları bilgileri internetten aramaya zorlayacağız. Talimatlarımızı şu şekilde değiştiriyoruz:
![]() |
[instructionsSansPDF4.txt] metin dosyası zaten 14 zorunlu test içeriyor. Bu testlere şu talimatları ekliyoruz:
7 - tu ajouteras autant de tests unitaires que nécessaires pour vérifier les cas limites du calcul de l'impôt.
Pour le code tu complèteras le script suivant auquel tu auras rajouté tes propres tests.
# =========================
# Birim testleri (±1 € tolerans)
# =========================
TESTS = [
# (yetişkinler, çocuklar, gelirler) -> (vergi, indirim, muafiyet)
((2, 2, 55555), (2815, 0, 0)),
((2, 2, 50000), (1385, 384, 346)),
((2, 3, 50000), (0, 720, 0)),
((1, 2, 100000), (19884, 0, 0)),
((1, 3, 100000), (16782, 0, 0)),
((2, 3, 100000), (9200, 0, 0)),
((2, 5, 100000), (4230, 0, 0)),
((1, 0, 100000), (22986, 0, 0)),
((2, 2, 30000), (0, 0, 0)),
((1, 0, 200000), (64211, 0, 0)),
((2, 3, 200000), (42843, 0, 0)),
((2, 2, 49500), (1297, 431, 324)),
((1, 0, 18535), (359, 491, 90)),
((2, 0, 43333), (2270, 0, 400)),
]
def _ok(a, b, tol=1):
return abs(a - b) <= tol
def run_tests(verbose: bool = True) -> bool:
all_ok = True
for (params, expected) in TESTS:
a, e, r = params
exp_impot, exp_decote, exp_reduc = expected
res = calcul_impot_2019(a, e, r)
ok_impot = _ok(res.impot, exp_impot)
ok_decote = _ok(res.decote, exp_decote)
ok_reduc = _ok(res.reduction, exp_reduc)
test_ok = ok_impot and ok_decote and ok_reduc
if verbose:
print(
f"Test {params} -> obtenu (impôt={res.impot}, décote={res.decote}, réduction={res.reduction}) | attendu {expected} | {'OK' if test_ok else 'ECHEC'}")
if not test_ok:
print(
f" Détails tolérance ±1€ : impôt ok? {ok_impot}, décote ok? {ok_decote}, réduction ok? {ok_reduc}")
all_ok &= test_ok
if verbose:
print("\nRésultat global :", "TOUS LES TESTS PASSENT ✅" if all_ok else "AU MOINS UN TEST ÉCHOUE ❌")
return all_ok
if __name__ == "__main__":
run_tests()
- 11-24. satırlar, zorunlu 14 test;
- 5-55. satırlar: Bu kod, ChatGPT tarafından oluşturulan komut dosyasından alınmıştır. Oluşturulan iki komut dosyası arasındaki karşılaştırmaları kolaylaştırmak için Gemini'ye bu kodu kullanmasını zorunlu kılacağız.
ChatGPT ile başlayalım:
![]() |
İlk yanıtı yanlış. Yürütme günlüklerini göstererek bunu ona bildiriyorum:
![]() | ![]() |
İkinci cevabı doğru. ChatGPT, zorunlu 14 teste aşağıdaki 11 testi daha ekledi:
Artık 25 birim testi var. 11 yeni testi DGIP'in resmi simülatörüyle manuel olarak kontrol ettim ve her şey yolunda.
Şimdi Gemini’ye geçiyoruz. Bu çok daha karmaşık olacak. Uzun bir hata ayıklama sürecinin ardından, ChatGPT’in 25 testini geçen bir komut dosyası oluşturmayı başaracak.
![]() |
Aşağıda hata ayıklama listesi yer almaktadır:
![]() |
Garip bir şekilde, geçmişte Gemini tüm testleri geçen kod üretmiş olmasına rağmen, zorunlu 14 testin bile çoğu başarısız oldu.
Gemini’nin aşağıdaki yanıtı hâlâ doğru değil:
![]() |
Aşağıdaki yanıt da doğru değil:
![]() |
Aşağıdaki yanıt da değil. Bu yüzden taktiğimi değiştiriyorum. ChatGPT'in geçtiği 25 testi geçmesini istiyorum ve ChatGPT'in günlüklerini de ekliyorum:
![]() |
Gemini başarısız oldu. ChatGPT’in testlerini eklemiş. Ona bu testlerin çalıştırma günlüklerini ekliyorum:
![]() |
Hala çalışmıyor:
![]() |
Hâlâ çalışmıyor:
![]() |
Hala yok:
![]() |
Hâlâ yok ama daha iyi:
![]() |
Gemini yeni hatalar yapıyor:
![]() |
Yine iyileşiyor:
![]() |
Bu sefer doğru:
![]() |
Tartışmasız olarak, talimat dosyasında belirtilen kısıtlamalarla 2019 yılı vergi hesaplamasına ilişkin bu somut örnekte, ChatGPT, Gemini'den daha isabetli sonuçlar verdi. Ancak bu sadece bir örnektir.
Daha da ileri gidebiliriz. Gemini’den, 25 testi başarıyla geçmek için kullandığı hesaplama kurallarına göre bir PDF dosyası yeniden oluşturmasını isteyebiliriz. İndirim ve %20’lik azaltma hesaplamalarıyla ilgili ilk mantığını değiştirip değiştirmediğini görmek istiyoruz:
![]() | ![]() |
Bu sefer Gemini, MarkDown adlı bir dosya oluşturdu; ben de bunu daha sonra PDF ve [Le problème selon Gemini version 2] olarak dönüştürdüm. Ve Gemini, mantığını gerçekten de değiştirmiş:
![]() |
![]() |
Görüldüğü üzere, artık özel iskonto hesaplaması ya da yeniden değerlendirme kuralı yok. Gemini artık ChatGPT'in mantığını benimsemiştir.






















































