5. Resolução dos três problemas com o ChatGPT
5.1. Introdução
Aqui está uma primeira captura de tela de uma sessão do ChatGPT:
![]() ![]() |
- No [1-3], os três problemas apresentados no ChatGPT;
- Na sessão [4], o URL da sessão ChatGPT;
- No [5], a versão do ChatGPT utilizada;
O ChatGPT é um produto do OpenAI, disponível no URL e no [https://chatgpt.com/]. Para ter um histórico de suas sessões de perguntas e respostas, como mostrado acima, é necessário criar uma conta. Além disso, assim como todas as outras versões testadas, o IA limita o número de perguntas e o número de arquivos baixados. Quando esse limite é atingido, a sessão é encerrada e é sugerido que você a continue mais tarde. Os limites impostos pelo ChatGPT são atingidos muito rapidamente. Para fazer este tutorial, tive que assinar um plano pago de um mês.
A interface do ChatGPT é a seguinte:
![]() |
- No [1], para anexar arquivos à pergunta feita;
- No [2], a pergunta feita;
- No [3], para iniciar a execução do IA;
5.2. Problema 1
A pergunta no ChatGPT:
![]() |
O ChatGPT responde corretamente.
5.3. Problema 2
Trata-se do cálculo do imposto com o PDF. Para ser sincero, vamos usar o PDF gerado pelo Gemini, que corrige os erros do PDF inicial.
![]() |
- No [1], fornecemos o PDF gerado pelo Gemini;
- No [2], foi adicionado o teste unitário pelo qual o Gemini demonstrou sua superioridade:
Executamos o ChatGPT. Ele leva cerca de 3 minutos para gerar sua resposta. Ao contrário do Gemini, ele fornece um link que funciona para recuperar o script gerado. Carregamos esse script no PyCharm:
![]() |
O script [chatGPT1] funciona logo na primeira tentativa. Não há o que discutir: nesse problema, o ChatGPT teve melhor desempenho do que o Gemini.
O script [chatGPT1] fornecido pelo ChatGPT é o seguinte:
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. O problema 3
Agora, solicitamos ao ChatGPT que pesquise na internet as regras de cálculo do imposto:
![]() |
Desta vez, não fornecemos o PDF, que indicava as regras de cálculo a serem seguidas. Apenas fornecemos nossas instruções no arquivo de texto. Vale lembrar que esse arquivo de texto contém agora 12 testes unitários, após termos adicionado aos 11 testes iniciais aquele utilizado pelo Gemini para demonstrar que meu PDF inicial estava errado.
O ChatGPT responde em 8 minutos e fornece um link para baixar o script gerado. Uma vez carregado no PyCharm, esse script é aprovado nos 12 testes. Portanto, nas duas questões apresentadas, o ChatGPT respondeu corretamente logo na primeira tentativa, superando assim o Gemini.
O ChatGPT fornece suas fontes na resposta:
![]() |
Não há o que dizer, é um excelente trabalho.
Agora, podemos pedir a ele, assim como fizemos com o Gemini, que gere um PDF para os alunos.
![]() |
A resposta de ChatGPT foi obtida após várias tentativas, pois o PDF gerado usava uma fonte que substituía caracteres por um quadrado. Mas, por fim, ele gerou o PDF. Estou apresentando-o porque ele fornece regras diferentes do PDF do Gemini, e me perguntei, então, quem estava certo. Vamos investigar.
![]() |
![]() |
![]() | ![]() |
![]() |
A diferença em relação ao PDF da Gemini está no cálculo do desconto. Os dois IA não seguem a mesma abordagem. A Gemini havia escrito:
![]() |
![]() |
![]() |
Os dois IA apresentam duas abordagens diferentes. Quem está certo?
5.5. Problema 4
Vamos pedir ao ChatGPT que se baseie no seu PDF para fazer o cálculo do imposto:
![]() | ![]() |
Assim como nas vezes anteriores, ele gera um script em Python que funciona na primeira tentativa. Tínhamos adicionado um teste extra nas instruções:
Os 13 testes foram concluídos com sucesso.
5.6. De volta ao Gemini
Agora, voltamos ao Gemini, ao qual apresentaremos o PDF a partir do ChatGPT. Como as regras implementadas neste PDF são diferentes das implementadas no PDF do Gemini, podemos nos perguntar o que vai acontecer:
![]() |
O Gemini gerou inicialmente um script em Python que falhava nos testes. Apresentamos a ele os logs:
Questão 2
![]() |
Pergunta 3
Ainda há erros. Vamos continuar.
![]() |
Pergunta 4
Ainda há erros na execução:
![]() |
Desta vez deu certo.
No entanto, ficamos intrigados com o fato de que, embora os PDF tenham regras de cálculo bastante diferentes, os IA geram resultados corretos.
Fazemos a seguinte pergunta ao Gemini:
![]() |
A pergunta completa é a seguinte:
A resposta do Gemini é categórica:
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
5.7. O que ChatGPT acha disso?
Fazemos a ChatGPT a mesma pergunta feita a Gemini.
![]() |
A resposta de ChatGPT é a seguinte:
![]() |
![]() |
Assim, ChatGPT nos propõe um teste unitário para decidir entre os dois métodos. Reproduzimos:
- O script [gemini3] gerado pelo Gemini, tomando como fonte seu próprio PDF; o [Le problème selon Gemini] é duplicado no script [gemini4];
- O script [chatGPT3], gerado pelo ChatGPT a partir dos scripts PDF e [Le problème selon ChatGPT], é duplicado no script [chatGPT4];
![]() | ![]() |
Além disso, adiciona-se em cada um dos scripts [gemini4, chatGPT4] o teste unitário proposto pelo ChatGPT para distinguir os dois IA.
A execução de [gemini4] produz os seguintes resultados:
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
Portanto, o Gemini falha no teste adicionado por ChatGPT.
A execução de [chatGPT4] produz os seguintes resultados:
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
O ChatGPT também falha no teste adicionado, mas não pelas mesmas razões que o Gemini. O ChatGPT encontrou os resultados corretos, mas com uma diferença de 2 euros, em vez do 1 euro exigido.
Portanto, a partir de agora, usaremos o PDF gerado pelo ChatGPT com os IA seguintes. É importante observar que foi devido à falta de testes unitários propostos nas minhas instruções que os dois IA foram aprovados nos primeiros testes. Daí, neste exemplo específico, a importância de incluir testes unitários para os casos-limite do cálculo do imposto. Já que é bastante difícil imaginar esses testes por conta própria. Vamos pedir aos IA que os adicionem por conta própria.
5.8. O problema 3 com testes unitários gerados pelos IA
Os resultados obtidos com o Gemini e o ChatGPT deixam dúvidas. Será que os IA encontraram uma solução geral que passa em todos os testes imagináveis ou encontraram uma solução que passa apenas nos testes exigidos? Vamos recomeçar com uma solução sem o PDF para obrigar o IA a acessar a internet e buscar as informações de que precisa. E modificamos nossas instruções da seguinte maneira:
![]() |
O arquivo de texto [instructionsSansPDF4.txt] já contém 14 testes obrigatórios. A esses testes, acrescentamos as seguintes instruções:
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.
# =========================
# Testes unitários (tolerância de ±1 €)
# =========================
TESTS = [
# (adultos, crianças, renda) -> (imposto, abatimento, redução)
((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()
- Linhas 11-24: os 14 testes predefinidos;
- Linhas 5-55: esse código vem do script gerado por ChatGPT. Vamos determinar que o Gemini utilize esse código para facilitar as comparações entre os dois scripts gerados.
Começamos com o ChatGPT:
![]() |
A primeira resposta dele está incorreta. Eu o informo disso, fornecendo os logs da execução:
![]() | ![]() |
A segunda resposta dele está correta. ChatGPT acrescentou os 11 testes a seguir aos 14 testes exigidos:
Agora há 25 testes unitários. Verifiquei manualmente os 11 novos testes com o simulador oficial do DGIP e está tudo certo.
Agora, vamos passar para o Gemini. Isso vai ser muito mais complicado. Ele vai conseguir gerar um script que passe nos 25 testes do ChatGPT, mas só depois de uma longa depuração.
![]() |
Abaixo, a lista de depuração:
![]() |
Estranhamente, a maioria dos testes falhou, mesmo entre os 14 exigidos, embora, no passado, o Gemini tivesse gerado código que os passava todos.
A resposta a seguir do Gemini ainda não está correta:
![]() |
A resposta a seguir também não está correta:
![]() |
A resposta a seguir também não. Por isso, mudo de estratégia. Peço que ele passe nos 25 testes que o ChatGPT passou, anexando os logs do ChatGPT:
![]() |
O Gemini falha. Ele adicionou corretamente os testes de ChatGPT. Anexo os logs da execução dele:
![]() |
Ainda não:
![]() |
Ainda não:
![]() |
Ainda não:
![]() |
Ainda não, mas já está melhor:
![]() |
O Gemini comete novos erros:
![]() |
Está melhorando de novo:
![]() |
Desta vez, deu certo:
![]() |
Indiscutivelmente, neste exemplo específico do cálculo do imposto de 2019 com as restrições definidas no arquivo de instruções, o ChatGPT se mostrou mais adequado do que o Gemini. Mas isso é apenas um exemplo.
Podemos ir além. Podemos solicitar ao Gemini que gere novamente um PDF de acordo com as regras de cálculo que ele utilizou para ser aprovado nos 25 testes. Queremos verificar se ele alterou seu raciocínio inicial sobre os cálculos do abatimento e da redução de 20%:
![]() | ![]() |
Desta vez, o Gemini gerou um arquivo MarkDown, que eu depois transformei em PDF [Le problème selon Gemini version 2]. E o Gemini realmente alterou seu raciocínio:
![]() |
![]() |
Percebe-se que não há mais o cálculo específico do desconto nem a regra de repescagem. O Gemini adotou agora o raciocínio de ChatGPT.






















































