4. Resolução dos três problemas com o Google Gemini
Apresentaremos as capturas de tela das três sessões do Gemini que permitiram resolver os três problemas apresentados. Entraremos em detalhes. Feito isso, não repetiremos o processo para os outros IA testados. Eles funcionam de maneira semelhante. Apresentaremos apenas os detalhes mais relevantes.
4.1. Introdução
Recordamos a primeira captura de tela do Gemini apresentada anteriormente:
![]() |
- No [1], o URL do Gemini;
- Em [2], a versão do Gemini utilizada;
- Em [3-5], os três problemas apresentados ao Gemini;
O Gemini é um produto do Google disponível no URL [https://gemini.google.com/]. Para ter um histórico de suas sessões de perguntas e respostas como o mostrado acima, é necessário criar uma conta. Além disso, assim como todos os outros IA testados, o Gemini 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. Como é bastante frustrante ter que parar no meio de uma sessão, eu fiz uma assinatura. Felizmente, o primeiro mês da assinatura do Gemini é gratuito. Fiz o mesmo com os outros IA que apresentavam essas limitações, a saber: ChatGPT, MistralAI e ClaudeAI. Fiz uma assinatura de um mês, mas, nesse caso, o primeiro mês era pago. Não encontrei limites com o Grok. O DeepSeek não anuncia limites, mas às vezes responde como [Server busy] e interrompe a sessão. Isso equivale a impor limites sem avisar.
Daqui em diante, vou me referir à sessão de perguntas e respostas simplesmente como “sessão”. Os IA costumam usar o termo em inglês “chat” (conversa) ou “conversa”.
A interface do Gemini para fazer uma pergunta é a seguinte:
![]() | ![]() |
- No [1], sua pergunta;
- Em [2], o ícone que inicia o IA para o cálculo da resposta;
- Em [3-4], você pode anexar arquivos;
4.2. Problema 1
A sessão para o problema 1 é a seguinte:
![]() |
- No [1], a pergunta;
- No [2], o início da resposta do Gemini;
A continuação da resposta é a seguinte:
![]() |
![]() |
![]() |
![]() |
A resposta está correta. Os outros cinco IA também darão a resposta correta de forma semelhante.
4.3. Problema 2
4.3.1. Introdução
Recordamos aqui o problema inicial da aula [python3-flask-2020]. Trata-se de um texto fornecido aos alunos em TD.
![]() |
A tabela acima permite calcular o imposto no caso simplificado de um contribuinte que tenha apenas seu salário para declarar. Conforme indicado na nota (1), o imposto assim calculado é o imposto antes da aplicação de três mecanismos:
- O teto do quociente familiar, que se aplica a rendas elevadas;
- O abatimento e a redução de impostos, que se aplicam a rendas baixas;
Assim, o cálculo do imposto compreende as seguintes etapas [http://impotsurlerevenu.org/comprendre-le-calcul-de-l-impot/1217-calcul-de-l-impot-2019.php]:
![]() |
Propõe-se escrever um programa que permita calcular o imposto de um contribuinte em 2019, no caso simplificado de um contribuinte que tenha apenas seu salário a declarar.
4.3.1.1. Cálculo do imposto bruto
O imposto bruto pode ser calculado da seguinte maneira:
Primeiro, calcula-se o número de cotas do contribuinte:
- Cada pai ou mãe contribui com 1 parte;
- Os dois primeiros filhos contribuem com 1/2 parte cada um;
- Os filhos seguintes contribuem com uma parte cada:
O número de partes é, portanto:
- nbParts=1+nbEnfants*0,5+(nbEnfants-2)*0,5 se o empregado não for casado;
- nbParts = 2 + nbEnfants * 0,5 + (nbEnfants - 2) * 0,5 se ele for casado;
- onde nbEnfants é o número de filhos;
- Calcula-se a renda tributável R = 0,9 * S, onde S é o salário anual;
- Calcula-se o quociente familiar QF = R / nbParts;
- Calcula-se o imposto bruto I com base nos seguintes dados (2019):
9964 | 0 | 0 |
27.519 | 0,14 | 1.394,96 |
73.779 | 0,3 | 5.798 |
156.244 | 0,4 | 13.913,69 |
0 | 0,45 | 20163,45 |
Cada linha possui 3 campos: champ1, champ2, champ3. Para calcular o imposto I, procura-se a primeira linha em que QF ≤ campo1 e utilizam-se os valores dessa linha. Por exemplo, para um funcionário casado, com dois filhos e um salário anual S de 50.000 euros:
Renda tributável: R = 0,9 * S = 45.000
Número de cotas: nbParts = 2 + 2 * 0,5 = 3
Quociente familiar: QF = 45.000 / 3 = 15.000
A primeira linha em que QF <= campo1 é a seguinte:
O imposto I é, portanto, igual a 0,14*R – 1.394,96*nbParts = [0,14*45000-1394,96*3] = 2.115. O imposto é arredondado para o euro inferior.
Se a relação QF <= campo1 for verdadeira já na primeira linha, então o imposto é zero.
Se QF for tal que a relação QF <= campo1 nunca for verificada, então são utilizados os coeficientes da última linha. Aqui:
o que resulta no imposto bruto I = 0,45 * R – 20.163,45 * nbParts.
4.3.1.2. Limite máximo do quociente familiar
![]() |
Para saber se o limite máximo do quociente familiar QF se aplica, refaz-se o cálculo do imposto bruto sem os filhos. Ainda para o empregado casado com dois filhos e um salário anual S de 50.000 euros:
Renda tributável: R = 0,9 * S = 45.000
Número de faixas: nbParts=2 (os filhos não são mais contabilizados)
Quociente familiar: QF = 45.000 / 2 = 22.500
A primeira linha em que QF <= campo1 é a seguinte:
O imposto I é, então, igual a 0,14*R – 1.394,96*nbParts = [0,14*45000-1394,96*2] = 3.510.
Ganho máximo relacionado aos filhos: 1551 * 2 = 3102 euros
Imposto mínimo: 3.510 – 3.102 = 408 euros
O imposto bruto com 2 cotas, já calculado no parágrafo anterior (2.115 euros), é superior ao imposto mínimo (408 euros); portanto, o teto familiar não se aplica neste caso.
De modo geral, o imposto bruto é maior que (imposto1, imposto2), onde:
- [impôt1]: é o imposto bruto calculado com os filhos;
- [impôt2]: é o imposto bruto calculado sem os filhos e deduzido do ganho máximo (aqui, 1.551 euros por meia parcela) relacionado aos filhos;
4.3.1.3. Cálculo da redução
![]() |
Ainda para o trabalhador casado com dois filhos e um salário anual S de 50.000 euros:
O imposto bruto (2.115 euros) resultante da etapa anterior é inferior a 2.627 euros para um casal (1.595 euros para um solteiro): portanto, a redução se aplica. Ela é obtida pelo seguinte cálculo:
abatimento = limite (casal = 1.970 / solteiro = 1.196) – 0,75 * Imposto bruto
abatimento = 1.970 – 0,75 * 2.115 = 383,75, arredondado para 384 euros.
Novo imposto bruto = 2.115 – 384 = 1.731 euros
É preciso observar duas regras no cálculo da redução (algumas ferramentas de IA tiveram dificuldades com essa questão):
- A dedução não pode ser negativa;
- A redução não pode ser superior ao imposto já calculado;
4.3.1.4. Cálculo da redução de impostos
![]() |
Abaixo de um determinado limite, é aplicada uma redução de 20% sobre o imposto bruto resultante dos cálculos anteriores. Em 2019, os limites são os seguintes:
- solteiro: 21.037 euros;
- casal: 42.074 euros; (o valor 37.968 utilizado no exemplo acima parece estar incorreto);
Esse limite é aumentado pelo valor: 3.797 * (número de meias-partes trazidas pelos filhos).
Ainda no caso do trabalhador casado com dois filhos e um salário anual S de 50.000 euros:
- Seu rendimento tributável (45.000 euros) é inferior ao limite (42.074 + 2 × 3.797) = 49.668 euros;
- Portanto, ele tem direito a uma redução de 20% do seu imposto: 1.731 * 0,2 = 346,2 euros, arredondado para 347 euros;
- O imposto bruto do contribuinte passa a ser: 1.731 – 347 = 1.384 euros;
4.3.1.5. Cálculo do imposto líquido
Nosso cálculo termina aqui: o imposto líquido a pagar será de 1.384 euros. Na prática, o contribuinte pode se beneficiar de outras deduções, especialmente por doações a instituições de interesse público ou geral.
4.3.1.6. Caso dos rendimentos elevados
Nosso exemplo anterior corresponde à maioria dos casos de assalariados. No entanto, o cálculo do imposto é diferente no caso de rendas elevadas.
4.3.1.6.1. Limite máximo da redução de 10% sobre a renda anual
Na maioria dos casos, a renda tributável é obtida pela fórmula: R = 0,9 * S, em que S é o salário anual. Isso é chamado de redução de 10%. Essa redução tem um limite máximo. Em 2019:
- Ela não pode ser superior a 12.502 euros;
- Não pode ser inferior a 437 euros;
Consideremos o caso de um trabalhador solteiro, sem filhos, com um salário anual de 200.000 euros:
- A redução de 10% é de 20.000 euros > 12.502 euros. Portanto, ela é reduzida para 12.502 euros;
4.3.1.6.2. Limite máximo do quociente familiar
Consideremos um caso em que se aplica o limite máximo familiar apresentado no parágrafo |Limite máximo do quociente familiar|. Tomemos o caso de um casal com três filhos e renda anual de 100.000 euros. Repassemos as etapas do cálculo:
- A dedução de 10% é de 100.000 euros < 12.502 euros. O rendimento tributável R é, portanto, 100.000 – 10.000 = 90.000 euros;
- O casal tem nbParts = 2 + 0,5 × 2 + 1 = 4 cotas;
- Seu quociente familiar é, portanto, QF = R / nbParts = 90.000 / 4 = 22.500 euros;
- Seu imposto bruto I1 com filhos é I1 = 0,14 × 90.000 – 1.394,96 × 4 = 7.020 euros;
- Seu imposto bruto I2 sem filhos:
- QF = 90.000 / 2 = 45.000 euros;
- I2 = 0,3 × 90.000 – 5.798 × 2 = 15.404 euros;
- A regra do teto do quociente familiar estabelece que o ganho gerado pelos filhos não pode ultrapassar (1.551 × 4 meias-partes) = 6.204 euros. No entanto, neste caso, ele é I2-I1 = 15.404 – 7.020 = 8.384 euros, portanto, superior a 6.204 euros;
- O imposto bruto é, portanto, recalculado como I3 = I2-6204 = 15.404 – 6.204 = 9.200 euros;
- Como I3 > I1, será o imposto I3 que será mantido;
Esse casal não terá abatimento nem redução, e seu imposto final será de 9.200 euros.
4.3.1.7. Números oficiais
O cálculo do imposto é complexo. Ao longo do documento, os testes serão realizados com os exemplos a seguir. Os resultados são os do simulador da administração tributária |https://www3.impots.gouv.fr/simulateur/calcul_impot/2019/simplifie/index.htm|:
Contribuinte | Resultados oficiais | Resultados do algoritmo do documento |
Casal com 2 filhos e renda anual de 55.555 euros | Imposto = 2.815 euros Alíquota de imposto = 14% | Imposto = 2.814 euros Alíquota de imposto = 14% |
Casal com 2 filhos e renda anual de 50.000 euros | Imposto = 1.385 euros Abatimento = 384 euros Redução = 346 euros Alíquota de imposto = 14% | Imposto = 1.384 euros Abatimento = 384 euros Redução = 347 euros Alíquota de imposto = 14% |
Casal com 3 filhos e renda anual de 50.000 euros | Imposto = 0 euro Abatimento = 720 euros Redução = 0 euros Alíquota de imposto = 14% | Imposto = 0 euro desconto = 720 euros Redução = 0 euros Alíquota de imposto = 14% |
Solteiro, com 2 filhos e renda anual de 100.000 euros | Imposto = 19.884 euros Abatimento = 0 euros Redução = 0 euro Alíquota de imposto = 41% | Imposto = 19.884 euros Sobretaxa = 4.480 euros abatimento = 0 euro Redução = 0 euro Alíquota de imposto = 41% |
Solteiro, com 3 filhos e renda anual de 100.000 euros | Imposto = 16.782 euros Abatimento = 0 euro Redução = 0 euro Alíquota de imposto = 41% | Imposto = 16.782 euros Sobretaxa = 7.176 euros abatimento = 0 euro Redução = 0 euro Alíquota de imposto = 41% |
Casal com 3 filhos e renda anual de 100.000 euros | Imposto = 9.200 euros Abatimento = 0 euro Redução = 0 euro Alíquota de imposto = 30% | Imposto = 9.200 euros Sobretaxa = 2.180 euros abatimento = 0 euro Redução = 0 euro Alíquota de imposto = 30% |
Casal com 5 filhos e renda anual de 100.000 euros | Imposto = 4.230 euros Abatimento = 0 euro Redução = 0 euro Alíquota de imposto = 14% | Imposto = 4.230 euros abatimento = 0 euro Redução = 0 euro Alíquota de imposto = 14% |
Solteiro, sem filhos e com renda anual de 100.000 euros | Imposto = 22.986 euros Abatimento = 0 euro Redução = 0 euro Alíquota de imposto = 41% | Imposto = 22.986 euros Sobretaxa = 0 euro abatimento = 0 euro Redução = 0 euro Alíquota de imposto = 41% |
Casal com 2 filhos e renda anual de 30.000 euros | Imposto = 0 euro Abatimento = 0 euro Redução = 0 euro Alíquota de imposto = 0% | Imposto = 0 euro desconto = 0 euro Redução = 0 euro Alíquota de imposto = 0% |
Solteiro, sem filhos e com renda anual de 200.000 euros | Imposto = 64.211 euros Abatimento = 0 euro Redução = 0 euros Alíquota de imposto = 45% | Imposto = 64.210 euros Sobretaxa = 7.498 euros abatimento = 0 euro Redução = 0 euro Alíquota de imposto = 45% |
Casal com 3 filhos e renda anual de 200.000 euros | Imposto = 42.843 euros Abatimento = 0 euro Redução = 0 euro Alíquota de imposto = 41% | Imposto = 42.842 euros Sobrevalorização = 17.283 euros Desconto = 0 euro Redução = 0 euros Alíquota de imposto = 41% |
No exemplo acima, denomina-se “sobretaxa” o valor adicional que os rendimentos mais elevados pagam devido a dois fatores:
- O teto de 10% para a dedução sobre a renda anual;
- O limite máximo do quociente familiar;
Esse indicador não pôde ser verificado, pois o simulador da administração tributária não o fornece.
Percebe-se que o algoritmo do documento calcula o imposto correto em todas as ocasiões, embora com uma margem de erro de 1 euro. Essa margem de erro decorre dos arredondamentos. Todos os valores monetários são arredondados, ora para o euro superior, ora para o euro inferior. Como eu não conhecia as regras oficiais, os valores monetários do algoritmo do documento foram arredondados:
- Para o euro superior, no caso de descontos e reduções;
- Para o euro inferior, no caso das sobretaxas e do imposto final;
Vamos solicitar ao IA que faça esse cálculo de imposto.
4.3.2. Configuração da sessão do Gemini
A consulta feita ao Gemini é acompanhada por dois arquivos:
![]() |
- No [1], o cálculo que acabamos de detalhar foi inserido em um PDF, que é fornecido ao Gemini. O Gemini encontrará nele as regras exatas para o cálculo simplificado do imposto de 2019 sobre os rendimentos de 2018;
- No [2], nossas instruções;
- No arquivo [3], para executar o arquivo IA;
Nossas instruções no arquivo de texto [instructionsAvecPDF.txt] são as seguintes:
Essas instruções são o resultado de inúmeras perguntas feitas ao Gemini. Rapidamente, percebemos que o IA precisa ser muito bem definido se quisermos obter o que desejamos. Foi por causa de todas essas tentativas e erros que a sessão do Gemini acabou sendo interrompida por exceder os limites. Vamos examinar o restante dessas instruções:
- Linha 1: solicitamos que a conversa seja em francês. Essa indicação é para o DeepSeek, que tinha a tendência de falar inglês;
- Linha 3: o que queremos;
- Linha 5: diz-se ao IA para usar o PDF que lhe foi fornecido;
- Linhas 7-14: algumas dicas úteis, especialmente para o problema 3 sem o PDF. Vários IA se perderam no cálculo do imposto;
- Linhas 15-44: os 11 testes unitários que queremos que sejam incluídos no script gerado. Quando o script for gerado, vamos executá-lo no PyCharm e veremos se os 11 testes são aprovados;
- Linhas 46-53: sem essas instruções, o IA gerava testes unitários que buscavam resultados exatos e falhavam;
- Linhas 55-56: instruo o IA a não acessar a internet. A solução mais simples é usar o PDF;
- Linhas 58-59: essa instrução não foi seguida pelo IA. Fui obrigado a escrevê-la explicitamente em uma pergunta, quando constatei que um teste havia falhado;
- Linhas 61-65: indico que tipo de script Python desejo;
- Linhas 67-69: eu teria preferido um link para baixar o script gerado, pois a exibição do código na tela demora. Verificou-se que a maioria dos IA não sabe fazer isso. Os links fornecidos não funcionavam;
- Linhas 71-72: eu gostaria de saber o tempo que o IA levou para responder à pergunta. Apenas o Gemini conseguiu me fornecer essa informação. Os demais IA ou não atendiam a essa instrução, ou forneciam números aleatórios, demonstrando que não compreendiam a instrução;
4.3.3. A resposta da Gemini
A primeira resposta da Gemini é a seguinte:
![]() |
- Em [1-4], o Gemini fornece links para a parte do PDF ou do arquivo de texto com as instruções que ele utiliza em determinado momento;
A continuação é a seguinte:
![]() |
- No [1], o Gemini afirma que executou os 11 testes unitários com sucesso. A maioria dos IA também afirmou isso tanto no problema 2 quanto no problema 3 e, frequentemente, ao carregar o script gerado, ele não funcionava. Portanto, é preciso ter cautela com essa afirmação. No caso do Gemini, isso se confirmará como verdadeiro;
- No [2], um link que acabará não funcionando;
- No [3], apenas o Gemini forneceu um tempo de execução realista;
Portanto, o link [2] não funciona. Informamos isso ao Gemini:
![]() |
A resposta do Gemini:
![]() |
- No [1], o script Python gerado pelo Gemini;
Carregamos esse script em PyCharm e o executamos:
![]() |
- Em [1], [gemini1] é o script gerado pelo Gemini;
Ao executar o script, aparecem erros de compilação:
"C:\Program Files\Python313\python.exe" "C:/Program Files/JetBrains/PyCharm 2025.2.0.1/plugins/python-ce/helpers/pycharm/_jb_unittest_runner.py" --path "C:\Data\st-2025\dev\python\code\python-flask-2025-cours\outils ia\chatGPT\chatGPT1.py"
Testing started at 17:12 ...
Launching unittests with arguments python -m unittest C:\Data\st-2025\dev\python\code\python-flask-2025-cours\outils ia\chatGPT\chatGPT1.py in C:\Data\st-2025\dev\python\code\python-flask-2025-cours
Traceback (most recent call last):
File "C:\Program Files\JetBrains\PyCharm 2025.2.0.1\plugins\python-ce\helpers\pycharm\_jb_unittest_runner.py", line 38, in <module>
sys.exit(main(argv=args, module=None, testRunner=unittestpy.TeamcityTestRunner,
~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
buffer=not JB_DISABLE_BUFFERING))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Program Files\Python313\Lib\unittest\main.py", line 103, in __init__
self.parseArgs(argv)
~~~~~~~~~~~~~~^^^^^^
File "C:\Program Files\Python313\Lib\unittest\main.py", line 142, in parseArgs
self.createTests()
~~~~~~~~~~~~~~~~^^
File "C:\Program Files\Python313\Lib\unittest\main.py", line 153, in createTests
self.test = self.testLoader.loadTestsFromNames(self.testNames,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^
self.module)
^^^^^^^^^^^^
File "C:\Program Files\Python313\Lib\unittest\loader.py", line 207, in loadTestsFromNames
suites = [self.loadTestsFromName(name, module) for name in names]
~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
File "C:\Program Files\Python313\Lib\unittest\loader.py", line 137, in loadTestsFromName
module = __import__(module_name)
File "C:\Data\st-2025\dev\python\code\python-flask-2025-cours\outils ia\chatGPT\chatGPT1.py", line 28, in <module>
[cite_start]
^^^^^^^^^^
NameError: name 'cite_start' is not defined
Process finished with exit code 1
Empty suite
- Linha 30, o erro de compilação. [cite_start] é um marcador para gerar um determinado tipo de texto;
Colocamos os logs acima em um arquivo [logs gemini1.txt] e o fornecemos ao Gemini:
![]() |
A resposta do Gemini é então a seguinte:
![]() |
Carregado no arquivo PyCharm, a execução do novo script gera exatamente o mesmo erro. Informamos isso ao Gemini, fornecendo novamente os logs da execução:
![]() |
A resposta do Gemini é a seguinte:
![]() |
Desta vez deu certo. Os 11 testes unitários foram bem-sucedidos. Informamos isso ao Gemini:
Que responde:
![]() |
O script gerado pelo Gemini seguiu as instruções fornecidas no arquivo de texto [instructionsAvecPDF.txt]:
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 | |
Não verifiquei esse código. Como os 11 testes unitários foram aprovados, considero que ele está “provavelmente correto”. Não fiz nada além de verificar esses 11 testes no meu próprio código.
4.4. Problema 3
O problema 3 é idêntico ao problema 2, com a diferença de que não se fornece mais ao IA o PDF, que fornecia as regras de cálculo a serem seguidas.
A pergunta inicial para o Gemini é a seguinte:
![]() |
O arquivo de instruções em [1] é praticamente o mesmo do problema 2, com as seguintes diferenças:
1 - Exprime-toi en français.
2 - Peux-tu générer un script Python permettant de calculer l'impôt payé par les familles en 2019 sur leurs revenus de 2018.
3 - Tu t'aideras des sources que tu trouveras sur internet. Dans ta réponse indique-moi ces sources.
4 - Tu dois faire attention aux points suivants :
…
- No [3], pede-se que ele encontre na internet as regras de cálculo do imposto de 2019 sobre os rendimentos de 2018. Esse é um exercício mais difícil do que o anterior;
A seguir, apresento apenas trechos da primeira resposta do Gemini:
![]() |
![]() |
O tempo estimado é plausível. Esperamos muito tempo pela resposta do Gemini.
Assim como anteriormente, o Gemini forneceu um link para baixar o script gerado, link esse que não funciona. Informamos isso a ele:
![]() |
A resposta da Gemini:
![]() |
Carregamos o script em PyCharm com o nome [gemini2]:
![]() |
Executamos e… não funciona. Os logs da execução são os seguintes:
"C:\Program Files\Python313\python.exe" "C:/Program Files/JetBrains/PyCharm 2025.2.0.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\gemini2.py"
Testing started at 17:23 ...
Launching unittests with arguments python -m unittest C:\Data\st-2025\dev\python\code\python-flask-2025-cours\outils ia\gemini\gemini2.py in C:\Data\st-2025\dev\python\code\python-flask-2025-cours
Failure
Traceback (most recent call last):
File "C:\Data\st-2025\dev\python\code\python-flask-2025-cours\outils ia\gemini\gemini2.py", line 278, in test_cas_2
self.assertAlmostEqual(impot, 1385, delta=1)
~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^
AssertionError: 1691 != 1385 within 1 delta (306 difference)
Error
Traceback (most recent call last):
File "C:\Data\st-2025\dev\python\code\python-flask-2025-cours\outils ia\gemini\gemini2.py", line 291, in test_cas_3
impot, _, _ = calculer_impot_final(2, 3, 50000)
~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "C:\Data\st-2025\dev\python\code\python-flask-2025-cours\outils ia\gemini\gemini2.py", line 187, in calculer_impot_final
decote, impot_apres_decote = calculer_decote(impot_apres_plafonnement, adultes)
~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Data\st-2025\dev\python\code\python-flask-2025-cours\outils ia\gemini\gemini2.py", line 134, in calculer_decote
decote = seuil_decote - (impot_avant_decote * COFFICIENT_DECOTE)
^^^^^^^^^^^^^^^^^
NameError: name 'COFFICIENT_DECOTE' is not defined. Did you mean: 'COEFFICIENT_DECOTE'?
Error
Traceback (most recent call last):
File "C:\Data\st-2025\dev\python\code\python-flask-2025-cours\outils ia\gemini\gemini2.py", line 316, in test_cas_9
self._verifier_cas(2, 2, 30000, (0, 0, 0))
~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Data\st-2025\dev\python\code\python-flask-2025-cours\outils ia\gemini\gemini2.py", line 216, in _verifier_cas
impot_calcule, decote_calculee, reduction_calculee = calculer_impot_final(adultes, enfants, revenus)
~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Data\st-2025\dev\python\code\python-flask-2025-cours\outils ia\gemini\gemini2.py", line 187, in calculer_impot_final
decote, impot_apres_decote = calculer_decote(impot_apres_plafonnement, adultes)
~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Data\st-2025\dev\python\code\python-flask-2025-cours\outils ia\gemini\gemini2.py", line 134, in calculer_decote
decote = seuil_decote - (impot_avant_decote * COFFICIENT_DECOTE)
^^^^^^^^^^^^^^^^^
NameError: name 'COFFICIENT_DECOTE' is not defined. Did you mean: 'COEFFICIENT_DECOTE'?
Ran 11 tests in 0.038s
FAILED (failures=1, errors=2)
Process finished with exit code 1
- Linha 11, um teste falhou;
- Linhas 25 e 42: o mesmo erro de compilação;
Colocamos esses logs em um arquivo de texto que enviamos ao Gemini:
![]() |
A resposta do Gemini:
![]() |
![]() |
Carregamos o script em PyCharm e o executamos. Mais erros. Informamos isso ao Gemini, anexando novamente os logs da execução:
![]() |
A resposta da Gemini:
![]() |
![]() |
![]() |
Carregamos esse novo script no PyCharm e o executamos. Desta vez, os 11 testes unitários foram aprovados:
O código gerado pelo Gemini é 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 | |
Mais uma vez, não examinei esse código. Apenas constatei que ele passou nos 11 testes com sucesso.
Mas pode ser interessante conhecer seu raciocínio, especialmente nos casos específicos do cálculo do imposto. Perguntamos a ele:
![]() |
Trata-se de um caso de renda elevada, com um possível limite máximo de 10% para a dedução e um possível limite máximo para o quociente familiar.
A resposta do Gemini é a seguinte:
![]() |
![]() |
![]() |
![]() |
![]() |
Essas duas últimas capturas de tela são interessantes. O Gemini utiliza um método de cálculo diferente daquele explicado no PDF. De fato, esse método de cálculo pode ser encontrado na internet. Os dois métodos são equivalentes.
![]() |
![]() |
A explicação se destaca pela clareza. Ela poderia ser apresentada tal como está aos alunos para explicar o método de cálculo do imposto.
Agora, vamos considerar outro exemplo, desta vez com rendimentos baixos. Nesse caso, pode haver abatimento e redução:
![]() |
A resposta do Gemini é a seguinte:
![]() |
![]() |
![]() |
![]() |
![]() |
Aqui, percebe-se que o Gemini aplica uma regra que não consta no PDF. Provavelmente ele a encontrou na internet, mas será que a fonte é confiável?
![]() |
Aqui, o Gemini continua aplicando uma regra desconhecida (a regra especial mencionada acima).
![]() |
![]() |
![]() |
Portanto, os resultados do Gemini coincidem com o resultado do simulador oficial de impostos. Mas ele utilizou uma regra que não consta no PDF. Onde está o erro? Perguntamos a ele, anexando o PDF:
![]() |
A resposta do Gemini:
![]() |
![]() |
![]() |
![]() |
Acho que a Gemini está certa e que meu PDF está errado. Para verificar isso, peço a ela que faça um teste:
- Em que seu raciocínio daria os mesmos resultados que o simulador oficial de impostos;
- onde o raciocínio do PDF levaria a resultados diferentes dos do simulador;
![]() |
A resposta do Gemini é a seguinte:
![]() |
Aqui, o Gemini está errado. Eu executei o simulador com esse exemplo e obtive o seguinte resultado:
![]() |
No entanto, vamos descobrir que o raciocínio do Gemini realmente leva aos resultados acima. Continuemos:
![]() |
![]() |
![]() |
![]() |
Muito bem. Anotado. Vamos continuar:
![]() |
![]() |
![]() |
![]() |
Portanto, o Gemini calculou (imposto, desconto, redução) = (431, 325, 1296), enquanto o simulador que utilizei apresentou (431, 324, 1297). Assim, o Gemini chegou aos resultados corretos com uma diferença de apenas 1 euro, mas ele não sabe disso. Vamos informá-lo:
![]() |
O Gemini responde:
![]() |
![]() |
Agora, nos perguntamos se o Gemini poderia gerar um PDF corrigido:
![]() |
A resposta do Gemini:
![]() |
Portanto, o Gemini não me forneceu um link para um PDF, mas gerou um texto para que eu mesmo pudesse gerar esse PDF. Embora seja um pouco complicado incluir aqui as capturas de tela do PDF, estou fazendo isso para que o leitor perceba o aspecto gerativo do IA:
![]() |













Sinceramente, não verifiquei se tudo o que está escrito neste PDF é verdade. De qualquer forma, é um documento perfeito para um TD, gerado em poucos segundos.
No entanto, podemos pedir ao próprio Gemini para verificar se o seu PDF está correto. Iniciamos uma nova conversa:
![]() |
- no [1], colocamos o PDF gerado pelo Gemini [Le problème selon Gemini.pdf];
- no [2], o [instructionsAvecPDF2.txt] é idêntico às instruções do [instructionsAvecPDF.txt], exceto pelo fato de termos adicionado um décimo segundo teste unitário, justamente aquele que demonstrou que o PDF inicial estava incorreto:
Curiosamente, foram necessárias várias tentativas antes que o Gemini gerasse o script correto:
Pergunta 2
![]() |
Pergunta 3
![]() |
Como já foi feito várias vezes, quando o script gerado e carregado no PyCharm falha, fornecemos ao Gemini o arquivo de texto com os logs da execução. O Gemini os compreende muito bem.
Pergunta 4
![]() |
Pergunta 5
![]() |
Pergunta 6 e fim
![]() | ![]() |
Agora estamos certos da validade do PDF gerado pelo Gemini. As regras de cálculo nele apresentadas estão corretas.
Agora faremos o mesmo com os outros cinco IA, mas seremos muito breves em nossas explicações, exceto no caso do ChatGPT, o IA líder no momento. O que nos interessa é saber se o IA resolve ou não os três problemas que lhe são apresentados. De fato, as interfaces de todos esses IA são muito semelhantes e procedi com elas da mesma forma que com o Gemini. O leitor é incentivado a reproduzir as conversas do Gemini com o IA de sua escolha.


















































































