5. Вирішення трьох проблем за допомогою ChatGPT
5.1. Вступ
Ось перший знімок екрана сеансу ChatGPT:
![]() ![]() |
- У [1-3] — три проблеми, поставлені в ChatGPT;
- У [4] — URL із ChatGPT;
- У [5] — версія, що використовується в ChatGPT;
ChatGPT є похідним від OpenAI, доступним у URL та [https://chatgpt.com/]. Щоб отримати історію ваших сесій запитань/відповідей, як показано вище, вам потрібно створити обліковий запис. Крім того, як і всі інші протестовані IA, ChatGPT обмежує кількість ваших запитань та кількість завантажених файлів. Коли цей ліміт вичерпано, сесія завершується, і вам пропонується продовжити її пізніше. Обмеження, встановлені ChatGPT, досягаються дуже швидко. Щоб підготувати цей посібник, мені довелося оформити платну підписку на один місяць.
Інтерфейс ChatGPT виглядає так:
![]() |
- У [1], щоб додати файли до поставленого запитання;
- У [2] — поставлене запитання;
- У [3] — для запуску виконання IA;
5.2. Задача 1
Запитання у файлі ChatGPT:
![]() |
ChatGPT відповідає правильно.
5.3. Завдання 2
Це розрахунок податку за допомогою PDF. Чесно кажучи, ми будемо використовувати PDF, згенерований Gemini, який виправляє помилки початкового PDF.
![]() |
- У файлі [1] ми вказали файл PDF, згенерований Gemini;
- У файлі [2] було додано модульний тест, за допомогою якого Gemini продемонстрував свою перевагу:
Запускаємо ChatGPT. На генерацію відповіді йому потрібно приблизно 3 хвилини. На відміну від Gemini, він надає дійсне посилання для завантаження згенерованого скрипта. Завантажуємо його в PyCharm:
![]() |
Скрипт [chatGPT1] працює з першого разу. Тут навіть немає про що говорити: у вирішенні цієї проблеми ChatGPT виявився ефективнішим за Gemini.
Скрипт [chatGPT1], наданий ChatGPT, має такий вигляд:
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
Тепер ми просимо ChatGPT знайти в Інтернеті правила розрахунку податку:
![]() |
Цього разу ми не надаємо PDF, який містив правила розрахунку, яких слід дотримуватися. Ми лише надаємо наші інструкції у текстовому файлі. Нагадаємо, що цей текстовий файл тепер містить 12 одиничних тестів після того, як до 11 початкових тестів було додано той, який використовував Gemini, щоб продемонструвати, що мій початковий PDF був помилковим.
ChatGPT відповідає за 8 хвилин, надає посилання для завантаження згенерованого скрипта. Після завантаження в PyCharm цей скрипт проходить усі 12 тестів. Отже, на обидві поставлені задачі ChatGPT відповів правильно з першої спроби, тим самим перевершивши Gemini.
ChatGPT наводить свої джерела у своїй відповіді:
![]() |
Немає що додати, це чудова робота.
Тепер можна попросити його, як ми це робили з Gemini, згенерувати PDF для студентів.
![]() |
Відповідь ChatGPT було отримано після кількох спроб, оскільки у згенерованому PDF використовувався шрифт, який замінював символи на квадратики. Але врешті-решт він згенерував PDF. Я наводжу його, оскільки він дає правила, що відрізняються від PDF від Gemini, і я замислився, хто ж має рацію. Давайте розберемося.
![]() |
![]() |
![]() | ![]() |
![]() |
Відмінність від PDF від Gemini полягає в розрахунку знижки. Ці два IA мають різний підхід. Gemini написав:
![]() |
![]() |
![]() |
Ці два IA мають два різних підходи. Хто має рацію?
5.5. Задача 4
Попросимо ChatGPT скористатися своїм PDF для розрахунку податку:
![]() | ![]() |
Як і раніше, він генерує скрипт на Python, який працює з першого разу. Ми додали до інструкцій додатковий тест:
Усі 13 тестів було успішно пройдено.
5.6. Повернення до Gemini
Тепер повернемося до Gemini, якому ми представимо PDF з ChatGPT. Оскільки правила, реалізовані в цьому PDF, відрізняються від тих, що реалізовані в PDF Gemini, можна задатися питанням, що ж станеться:
![]() |
Спочатку Gemini згенерував скрипт на Python, який не пройшов тестування. Йому надали логи:
Питання 2
![]() |
Питання 3
Помилки все ще залишаються. Продовжуємо.
![]() |
Питання 4
Все ще є помилки під час виконання:
![]() |
Цього разу все гаразд.
Проте нас все ж цікавить, чому при PDF, що мають досить різні правила обчислення, обидва IA дають правильні результати.
Ми задаємо Gemini таке запитання:
![]() |
Повне формулювання питання таке:
Відповідь Gemini є категоричною:
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
5.7. Що про це думає ChatGPT
Ми задаємо ChatGPT те саме питання, що й Gemini.
![]() |
Відповідь ChatGPT така:
![]() |
![]() |
Отже, ChatGPT пропонує нам модульний тест, щоб визначити, який із двох методів кращий. Ми дублюємо:
- Скрипт [gemini3], згенерований Gemini на основі його PDF [Le problème selon Gemini], дублюється у скрипті [gemini4];
- Скрипт [chatGPT3], згенерований ChatGPT на основі PDF та [Le problème selon ChatGPT], дублюється у скрипті [chatGPT4];
![]() | ![]() |
Крім того, до кожного зі скриптів [gemini4, chatGPT4] додається модульний тест, запропонований ChatGPT, щоб розрізнити два IA.
Виконання [gemini4] дає такі результати:
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
Отже, Gemini не пройшов тест, доданий ChatGPT.
Виконання [chatGPT4] дає такі результати:
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 також не пройшов доданий тест, але не з тих самих причин, що й Gemini. ChatGPT знайшов правильні результати, але з похибкою у 2 євро замість встановленого 1 євро.
Отже, відтепер ми будемо використовувати PDF, згенерований ChatGPT, разом із наступними IA. Слід зазначити, що саме через відсутність модульних тестів у моїх інструкціях обидва IA успішно пройшли перші тести. Звідси в цьому конкретному прикладі випливає важливість додавання модульних тестів для граничних випадків розрахунку податку. Адже самостійно придумати такі тести досить складно. Ми попросимо IA самостійно додати їх.
5.8. Завдання 3 з модульними тестами, згенерованими IA
Результати, отримані за допомогою Gemini та ChatGPT, викликають сумніви. Чи знайшли IA загальне рішення, яке проходить усі можливі тести, чи вони знайшли рішення, яке проходить лише ті тести, що були задані? Ми повернемося до рішення без PDF, щоб змусити IA звернутися до Інтернету та знайти необхідну інформацію. І ми змінюємо наші інструкції наступним чином:
![]() |
Текстовий файл [instructionsSansPDF4.txt] вже містить 14 обов’язкових тестів. До цих тестів додаємо такі інструкції:
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.
# =========================
# Одиничні тести (допуск ±1 €)
# =========================
TESTS = [
# (дорослі, діти, доходи) -> (податок, знижка, пільга)
((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 — 14 заданих тестів;
- Рядки 5–55: цей код походить зі скрипта, згенерованого ChatGPT. Ми змусимо Gemini використовувати цей код, щоб полегшити порівняння між двома згенерованими скриптами.
Почнемо з ChatGPT:
![]() |
Його перша відповідь є неправильною. Я повідомляю йому про це, надаючи логи виконання:
![]() | ![]() |
Його друга відповідь правильна. ChatGPT додав наступні 11 тестів до 14 обов’язкових:
Тепер є 25 модульних тестів. Я вручну перевірив 11 нових тестів за допомогою офіційного симулятора DGIP, і все гаразд.
Тепер переходимо до Gemini. Це буде набагато складніше. Йому вдасться згенерувати скрипт, який пройде 25 тестів ChatGPT, але лише після тривалого налагодження.
![]() |
Нижче наведено список результатів налагодження:
![]() |
Дивно, але більшість тестів не пройшла навіть серед тих 14, що були задані, хоча раніше Gemini генерував код, який проходив їх усі.
Наступна відповідь Gemini все ще не є правильною:
![]() |
Наступна відповідь теж неправильна:
![]() |
Наступна відповідь теж неправильна. Тому я змінюю тактику. Я прошу його пройти ті 25 тестів, які пройшов ChatGPT, додавши до запиту логи ChatGPT:
![]() |
Gemini зазнав невдачі. Він дійсно додав тести від ChatGPT. Я додаю йому логи їх виконання:
![]() |
Все ще не працює:
![]() |
Все ще не працює:
![]() |
Все ще немає:
![]() |
Все ще ні, але вже краще:
![]() |
Gemini робить нові помилки:
![]() |
Знову покращується:
![]() |
Цього разу все гаразд:
![]() |
Безперечно, у цьому конкретному прикладі розрахунку податку за 2019 рік з урахуванням обмежень, заданих у файлі інструкцій, ChatGPT виявився точнішим за Gemini. Але це лише приклад.
Можна піти далі. Можна попросити Gemini перегенерувати PDF відповідно до правил розрахунку, які він використовував для успішного проходження 25 тестів. Ми хочемо перевірити, чи змінив він своє початкове міркування щодо розрахунку знижки та зменшення на 20 %:
![]() | ![]() |
Цього разу Gemini згенерував файл MarkDown, який я потім перетворив на PDF [Le problème selon Gemini version 2]. І Gemini дійсно змінив свій підхід:
![]() |
![]() |
Можна помітити, що більше немає ні окремого розрахунку знижки, ні правила перерозподілу. Gemini тепер використовує логіку ChatGPT.






















































