5. Rozwiązanie trzech problemów za pomocą ChatGPT
5.1. Wprowadzenie
Oto pierwszy zrzut ekranu z sesji ChatGPT:
![]() ![]() |
- W [1-3] pojawiły się trzy problemy zgłoszone w ChatGPT;
- W sesji [4] pojawia się wynik z sesji URL, który pochodzi z sesji ChatGPT;
- W [5] zastosowano wersję z pliku ChatGPT;
ChatGPT jest produktem opartym na OpenAI, dostępnym w URL i [https://chatgpt.com/]. Aby uzyskać historię swoich sesji pytań i odpowiedzi, jak pokazano powyżej, należy utworzyć konto. Ponadto, podobnie jak wszystkie inne przetestowane wersje IA, ChatGPT ogranicza liczbę zadawanych pytań oraz liczbę pobranych plików. Po osiągnięciu tego limitu sesja zostaje zakończona i pojawia się propozycja jej kontynuowania w późniejszym terminie. Limity narzucone przez ChatGPT są osiągane bardzo szybko. Aby przygotować ten poradnik, musiałem wykupić miesięczną płatną subskrypcję.
Interfejs ChatGPT wygląda następująco:
![]() |
- W [1], aby dołączyć pliki do zadanego pytania;
- W [2] – zadane pytanie;
- W [3], aby uruchomić wykonanie IA;
5.2. Zadanie 1
Pytanie w pliku ChatGPT:
![]() |
ChatGPT udziela prawidłowej odpowiedzi.
5.3. Problem 2
Chodzi o obliczenie podatku przy użyciu pliku PDF. Szczerze mówiąc, wykorzystamy plik PDF wygenerowany przez Gemini, który koryguje błędy zawarte w pierwotnym pliku PDF.
![]() |
- W pliku [1] podaliśmy plik PDF wygenerowany przez Gemini;
- W pliku [2] dodano test jednostkowy, dzięki któremu Gemini wykazało swoją przewagę:
Uruchamiamy ChatGPT. Wygenerowanie odpowiedzi zajmuje mu około 3 minut. W przeciwieństwie do Gemini, dostarcza on działający link umożliwiający pobranie wygenerowanego skryptu. Wczytujemy go do PyCharm:
![]() |
Skrypt [chatGPT1] działa za pierwszym razem. Nie ma co do tego wątpliwości – w tym przypadku ChatGPT poradził sobie lepiej niż Gemini.
Skrypt [chatGPT1] dostarczony przez ChatGPT wygląda następująco:
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. Problem 3
Teraz prosimy ChatGPT o wyszukanie w Internecie zasad obliczania podatku:
![]() |
Tym razem nie podajemy pliku PDF, który zawierał zasady obliczeń, których należało przestrzegać. W pliku tekstowym podajemy jedynie nasze instrukcje. Przypominamy, że ten plik tekstowy zawiera obecnie 12 testów jednostkowych po dodaniu do 11 początkowych testów tego, który wykorzystał Gemini, aby wykazać, że mój pierwotny plik PDF był błędny.
ChatGPT odpowiada w ciągu 8 minut, podając link do pobrania wygenerowanego skryptu. Po załadowaniu do PyCharm skrypt ten przechodzi wszystkie 12 testów. Zatem na oba postawione zadania ChatGPT odpowiedział poprawnie za pierwszym razem, przewyższając tym samym Gemini.
ChatGPT podaje źródła w swojej odpowiedzi:
![]() |
Nie ma co dodawać, to świetna robota.
Teraz możemy poprosić go, tak jak zrobiliśmy to w przypadku Gemini, o wygenerowanie pliku PDF dla studentów.
![]() |
Odpowiedź ChatGPT uzyskano po kilku rundach wymiany, ponieważ wygenerowany plik PDF wykorzystywał czcionkę, która zastępowała znaki kwadratem. Ostatecznie jednak wygenerował plik PDF. Podaję go, ponieważ zawiera on inne reguły niż plik PDF z Gemini i zacząłem się zastanawiać, kto ma rację. Zbadamy tę sprawę.
![]() |
![]() |
![]() | ![]() |
![]() |
Różnica w stosunku do modelu PDF firmy Gemini polega na sposobie obliczania dyskonta. Oba modele IA mają różne podejście. Firma Gemini napisała:
![]() |
![]() |
![]() |
Oba kody IA mają dwa różne podejścia. Kto ma rację?
5.5. Zadanie 4
Poprosimy ChatGPT, aby na podstawie swojego PDF obliczył podatek:
![]() | ![]() |
Podobnie jak poprzednio, generuje on skrypt w języku Python, który działa za pierwszym razem. W instrukcjach dodaliśmy dodatkowy test:
Wszystkie 13 testów zakończyło się sukcesem.
5.6. Powrót do Gemini
Teraz wracamy do Gemini, któremu przedstawimy plik PDF z ChatGPT. Ponieważ reguły zaimplementowane w tym PDF różnią się od tych zaimplementowanych w PDF w Gemini, można się zastanawiać, co się stanie:
![]() |
Gemini najpierw wygenerowało skrypt w języku Python, który nie przeszedł testów. Przedstawiono mu logi:
Pytanie 2
![]() |
Pytanie 3
Wciąż występują błędy. Kontynuujemy.
![]() |
Pytanie 4
Wciąż pojawiają się błędy podczas wykonywania:
![]() |
Tym razem wszystko działa poprawnie.
Nadal jednak intryguje nas fakt, że mimo dość różnych reguł obliczeniowych w PDF, oba IA generują poprawne wyniki.
Zadajemy Gemini następujące pytanie:
![]() |
Pełne brzmienie pytania jest następujące:
Odpowiedź Gemini jest jednoznaczna:
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
5.7. Co o tym sądzi ChatGPT
Zadajemy ChatGPT to samo pytanie, które zadaliśmy Gemini.
![]() |
Odpowiedź ChatGPT brzmi następująco:
![]() |
![]() |
W związku z tym ChatGPT proponuje nam test jednostkowy, aby rozstrzygnąć, która z metod jest lepsza. Powielamy:
- Skrypt [gemini3] wygenerowany przez Gemini, przyjmując jako źródło jego PDF [Le problème selon Gemini] jest powielony w skrypcie [gemini4];
- Skrypt [chatGPT3], wygenerowany przez ChatGPT na podstawie skryptów źródłowych PDF i [Le problème selon ChatGPT], jest duplikowany w skrypcie [chatGPT4];
![]() | ![]() |
Ponadto do każdego ze skryptów [gemini4, chatGPT4] dodaje się test jednostkowy zaproponowany przez ChatGPT w celu rozstrzygnięcia sporu między dwoma skryptami IA.
Wykonanie skryptu [gemini4] daje następujące wyniki:
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
Zatem Gemini nie przechodzi testu dodanego przez ChatGPT.
Uruchomienie pliku [chatGPT4] daje następujące wyniki:
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 również nie przechodzi dodanego testu, ale nie z tych samych powodów co Gemini. ChatGPT uzyskał prawidłowe wyniki, ale z odchyleniem o 2 euro zamiast wymaganych 1 euro.
W związku z tym od tej pory będziemy używać PDF wygenerowanego przez ChatGPT wraz z kolejnymi IA. Należy zauważyć, że to właśnie z powodu braku testów jednostkowych w moich instrukcjach oba IA przeszły pomyślnie pierwsze testy. Stąd w tym konkretnym przykładzie wynika znaczenie wprowadzenia testów jednostkowych dla skrajnych przypadków obliczania podatku. Ponieważ samodzielne wymyślenie takich testów jest raczej trudne. Poprosimy więc pliki IA, aby same je dodały.
5.8. Problem 3 z testami jednostkowymi wygenerowanymi przez IA
Wyniki uzyskane przy użyciu Gemini i ChatGPT budzą wątpliwości. Czy IA znalazły ogólne rozwiązanie, które spełnia wszystkie możliwe do wyobrażenia testy, czy też znalazły rozwiązanie, które spełnia jedynie narzucone testy? Zaczniemy od nowa, rezygnując z PDF, aby zmusić IA do wyszukania w Internecie potrzebnych informacji. Modyfikujemy nasze instrukcje w następujący sposób:
![]() |
Plik tekstowy [instructionsSansPDF4.txt] zawiera już 14 testów obowiązkowych. Do tych testów dodajemy następujące instrukcje:
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.
# =========================
# Testy jednostkowe (tolerancja ±1 €)
# =========================
TESTS = [
# (osoby dorosłe, dzieci, dochody) -> (podatek, ulga, obniżka)
((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()
- Wiersze 11–24: 14 testów obowiązkowych;
- Wiersze 5–55: ten kod pochodzi ze skryptu wygenerowanego przez ChatGPT. Zmusimy Gemini do użycia tego kodu, aby ułatwić porównania między dwoma wygenerowanymi skryptami.
Zaczynamy od ChatGPT:
![]() |
Jego pierwsza odpowiedź jest nieprawidłowa. Informuję go o tym, przekazując mu logi z wykonania:
![]() | ![]() |
Jego druga odpowiedź jest poprawna. ChatGPT dodał 11 poniższych testów do 14 wymaganych:
Obecnie mamy 25 testów jednostkowych. Ręcznie sprawdziłem 11 nowych testów za pomocą oficjalnego symulatora DGIP i wszystko działa poprawnie.
Teraz przechodzimy do Gemini. To będzie znacznie bardziej skomplikowane. Uda mu się wygenerować skrypt, który przejdzie wszystkie 25 testów ChatGPT, ale dopiero po długim debugowaniu.
![]() |
Poniżej znajduje się lista wyników debugowania:
![]() |
Co dziwne, większość testów zakończyła się niepowodzeniem, nawet wśród 14 wymaganych, podczas gdy w przeszłości Gemini generowało kod, który przechodził je wszystkie.
Poniższa odpowiedź Gemini nadal nie jest poprawna:
![]() |
Następująca odpowiedź również nie jest poprawna:
![]() |
Kolejna odpowiedź również nie jest poprawna. W związku z tym zmieniam taktykę. Proszę go o pomyślne przejście 25 testów, które zaliczył ChatGPT, dołączając logi z ChatGPT:
![]() |
Gemini nie radzi sobie. Dodano wprawdzie testy z ChatGPT. Załączam logi z jego wykonania:
![]() |
Nadal nie działa:
![]() |
Nadal nie działa:
![]() |
Wciąż nie:
![]() |
Wciąż nie, ale już lepiej:
![]() |
Gemini popełnia nowe błędy:
![]() |
Znowu jest lepiej:
![]() |
Tym razem wszystko działa poprawnie:
![]() |
Bez wątpienia w tym konkretnym przykładzie obliczenia podatku za rok 2019, z uwzględnieniem ograniczeń zawartych w pliku instrukcji, ChatGPT okazał się bardziej trafny niż Gemini. Ale to tylko przykład.
Można pójść o krok dalej. Można poprosić Gemini o ponowne wygenerowanie pliku PDF zgodnie z zasadami obliczeniowymi, które zastosowało, aby pomyślnie przejść 25 testów. Chcemy sprawdzić, czy zmieniło swoje pierwotne rozumowanie dotyczące obliczeń obniżki i 20-procentowej ulgi:
![]() | ![]() |
Tym razem Gemini wygenerowało plik o nazwie MarkDown, który następnie przekształciłem w PDF i [Le problème selon Gemini version 2]. Gemini rzeczywiście zmieniło swoje rozumowanie:
![]() |
![]() |
Widać, że nie ma już ani specjalnego obliczenia dyskonta, ani reguły ponownego rozpatrywania. Gemini przyjęło teraz sposób rozumowania z ChatGPT.






















































