4. Résolution des trois problèmes avec Google Gemini
Nous allons donner les copies d’écran des trois sessions Gemini qui ont permis de résoudre les trois problèmes posés. Nous irons assez dans les détails. Ceci fait, nous ne répéterons pas le processus pour les autres IA testées. Elles fonctionnent de manière analogue. Nous ne donnerons que les détails frappants.
4.1. Introduction
Nous rappelons la première copie d’écran de Gemini donnée précédemment :
![]() |
- En [1], l’URL de Gemini ;
- En [2], la version de Gemini utilisée ;
- En [3-5], les trois problèmes posés à Gemini ;
Gemini est un produit de Google disponible à l’URL [https://gemini.google.com/]. Pour avoir un historique de vos sessions de questions / réponses comme ci-dessus, il vous faut créer un compte. Par ailleurs, comme toutes les autres IA testées, Gemini limite le nombre de vos questions et le nombre de fichiers téléchargés. Quand cette limite est atteinte, la session est terminée et on vous propose de la continuer plus tard dans le temps. Comme il est assez frustrant de s’arrêter en plein milieu d’une session, j’ai pris un abonnement. Le premier mois de l’abonnement Gemini est par chance gratuit. J’ai fait de même avec les autres IA qui avaient ces limites, à savoir ChatGPT, MistralAI, ClaudeAI. J’ai pris un abonnement d’un mois, mais là le premier mois était payant. Je n’ai pas rencontré de limites avec Grok. DeepSeek n’annonce pas de limites mais répond parfois [Server busy] et interrompt la session. Ca revient à mettre des limites sans le dire.
Dans la suite, je parlerai de session de questions / réponses, raccourcie à session simplement. Les IA utilisent le plus souvent le terme anglais chat (discussion) ou conversation.
L’interface de Gemini pour poser une question est la suivante :
![]() | ![]() |
- En [1], votre question ;
- En [2], l’icône qui lance l’IA pour le calcul de la réponse ;
- En [3-4], vous pouvez joindre des fichiers ;
4.2. Le problème 1
La session pour le problème 1 est la suivante :
![]() |
- En [1], la question ;
- En [2], le début de la réponse de Gemini ;
La suite de la réponse est la suivante :
![]() |
![]() |
![]() |
![]() |
La réponse est correcte. Les cinq autres IA donneront également la bonne réponse sous une forme analogue.
4.3. Le problème 2
4.3.1. Introduction
On rappelle ici le problème initial du cours [python3-flask-2020]. C’est un texte donné en TD à des étudiants.
![]() |
Le tableau ci-dessus permet de calculer l’impôt dans le cas simplifié d'un contribuable n'ayant que son seul salaire à déclarer. Comme l’indique la note (1), l’impôt ainsi calculé est l’impôt avant trois mécanismes :
- Le plafonnement du quotient familial qui intervient pour les hauts revenus ;
- La décote et la réduction d’impôts qui interviennent pour les faibles revenus ;
Ainsi le calcul de l’impôt comprend les étapes suivantes [http://impotsurlerevenu.org/comprendre-le-calcul-de-l-impot/1217-calcul-de-l-impot-2019.php] :
![]() |
On se propose d'écrire un programme permettant de calculer l'impôt d'un contribuable en 2019 dans le cas simplifié d'un contribuable n'ayant que son seul salaire à déclarer.
4.3.1.1. Calcul de l’impôt brut
L’impôt brut peut être calculé de la façon suivante :
On calcule d’abord le nombre de parts du contribuable :
- Chaque parent amène 1 part ;
- Les deux premiers enfants amènent chacun 1/2 part ;
- Les enfants suivants amènent une part chacun :
Le nombre de parts est donc :
- nbParts=1+nbEnfants*0,5+(nbEnfants-2)*0,5 si le salarié n’est pas marié ;
- nbParts=2+nbEnfants*0,5+(nbEnfants-2)*0,5 s'il est marié ;
- où nbEnfants est son nombre d'enfants ;
- On calcule le revenu imposable R=0.9*S où S est le salaire annuel ;
- On calcule le quotient familial QF=R/nbParts ;
- On calcule l’impôt brut I d'après les données suivantes (2019) :
9964 | 0 | 0 |
27519 | 0.14 | 1394.96 |
73779 | 0.3 | 5798 |
156244 | 0.4 | 13913.69 |
0 | 0.45 | 20163.45 |
Chaque ligne a 3 champs : champ1, champ2, champ3. Pour calculer l'impôt I, on recherche la première ligne où QF<=champ1 et on prend les valeurs de cette ligne. Par exemple, pour un salarié marié avec deux enfants et un salaire annuel S de 50000 euros :
Revenu imposable : R=0,9*S=45000
Nombre de parts : nbParts=2+2*0,5=3
Quotient familial : QF=45000/3=15000
La 1re ligne où QF<=champ1 est la suivante :
L'impôt I est alors égal à 0.14*R – 1394,96*nbParts=[0,14*45000-1394,96*3]=2115. L’impôt est arrondi à l’euro inférieur.
Si la relation QF<=champ1 dès la 1re ligne, alors l’impôt est nul.
Si QF est tel que la relation QF<=champ1 n'est jamais vérifiée, alors ce sont les coefficients de la dernière ligne qui sont utilisés. Ici :
ce qui donne l'impôt brut I=0.45*R – 20163,45*nbParts.
4.3.1.2. Plafonnement du quotient familial
![]() |
Pour savoir si le plafonnement du quotient familial QF s’applique, on refait le calcul de l’impôt brut sans les enfants. Toujours pour le salarié marié avec deux enfants et un salaire annuel S de 50000 euros :
Revenu imposable : R=0,9*S=45000
Nombre de parts : nbParts=2 (on ne compte plus les enfants)
Quotient familial : QF=45000/2=22500
La 1re ligne où QF<=champ1 est la suivante :
L'impôt I est alors égal à 0.14*R – 1394,96*nbParts=[0,14*45000-1394,96*2]=3510.
Gain maximal lié aux enfants : 1551 * 2 = 3102 euros
Impôt minimal : 3510-3102 = 408 euros
L’impôt brut avec 2 parts déjà calculé au paragraphe précédent 2115 euros est supérieur à l’impôt minimal 408 euros, donc le plafonnement familial ne s’applique pas ici.
De façon générale, l’impôt brut est sup(impôt1, impôt2) où :
- [impôt1] : est l’impôt brut calculé avec les enfants ;
- [impôt2] : est l’impôt brut calculé sans les enfants et diminué du gain maximal (ici 1551 euros par demi-part) lié aux enfants ;
4.3.1.3. Calcul de la décote
![]() |
Toujours pour le salarié marié avec deux enfants et un salaire annuel S de 50000 euros :
L’impôt brut (2115 euros) issu de l’étape précédente est inférieur à 2627 euros pour un couple (1595 euros pour un célibataire) : la décote s’applique donc. Elle est obtenue avec le calcul suivant :
décote= seuil (couple=1970/célibataire=1196)-0,75* Impôt brut
décote=1970-0,75*2115=383,75 arrondi à 384 euros.
Nouvel Impôt brut= 2115-384= 1731 euros
Il faut observer deux règles dans le calcul de la décote (certains outils d’IA ont buté sur cette question) :
- La décote ne peut être négative ;
- La décote ne peut être supérieure à l’impôt déjà calculé ;
4.3.1.4. Calcul de la réduction d’impôts
![]() |
Au-dessous d’un certain seuil, une réduction de 20 % est faite sur l’impôt brut issu des calculs précédents. En 2019, les seuils sont les suivants :
- célibataire : 21037 euros ;
- couple : 42074 euros ; (le chiffre 37968 utilisé dans l’exemple ci-dessus semble erroné) ;
Ce seuil est augmenté de la valeur : 3797 * (nombre de demi-parts amenées par les enfants).
Toujours pour le salarié marié avec deux enfants et un salaire annuel S de 50000 euros :
- Son revenu imposable (45000 euros) est inférieur au seuil (42074+2*3797)=49668 euros ;
- Il a donc droit à une réduction de 20 % de son impôt : 1731 * 0,2= 346,2 euros arrondi à 347 euros ;
- L’impôt brut du contribuable devient : 1731-347= 1384 euros ;
4.3.1.5. Calcul de l’impôt net
Notre calcul s’arrêtera là : l’impôt net à payer sera de 1384 euros. Dans la réalité, le contribuable peut bénéficier d’autres réductions notamment pour des dons à des organismes d’intérêt public ou général.
4.3.1.6. Cas des hauts revenus
Notre exemple précédent correspond à la majorité des cas de salariés. Cependant le calcul de l’impôt est différent dans le cas des hauts revenus.
4.3.1.6.1. Plafonnement de la réduction de 10 % sur les revenus annuels
Dans la plupart des cas, le revenu imposable est obtenu par la formule : R=0,9*S où S est le salaire annuel. On appelle cela la réduction des 10 %. Cette réduction est plafonnée. En 2019 :
- Elle ne peut être supérieure à 12502 euros ;
- Elle ne peut être inférieure à 437 euros ;
Prenons le cas d’un salarié non marié sans enfants et un salaire annuel de 200000 euros :
- La réduction de 10 % est de 20000 euros > 12502 euros. Elle est donc ramenée à 12502 euros ;
4.3.1.6.2. Plafonnement du quotient familial
Prenons un cas où le plafonnement familial présenté au paragraphe |Plafonnement du quotient familial|, intervient. Prenons le cas d’un couple avec trois enfants et des revenus annuels de 100000 euros. Reprenons les étapes du calcul :
- L’abattement de 10 % est de 100000 euros < 12502 euros. Le revenu imposable R est donc 100000-10000=90000 euros ;
- Le couple a nbParts=2+0,5*2+1=4 parts ;
- Son quotient familial est donc QF= R/nbParts=90000/4=22500 euros ;
- Son impôt brut I1 avec enfants est I1=0,14*90000-1394,96*4= 7020 euros ;
- Son impôt brut I2 sans enfants :
- QF=90000/2=45000 euros ;
- I2=0,3*90000-5798*2=15404 euros ;
- La règle du plafonnement du quotient familial dit que le gain amené par les enfants ne peut dépasser (1551*4 demi-parts)=6204 euros. Or ici, il est I2-I1=15404-7020= 8384 euros, donc supérieur à 6204 euros ;
- L’impôt brut est donc recalculé comme I3=I2-6204=15404-6204= 9200 euros ;
- Comme I3>I1, ce sera l’impôt I3 qui sera conservé ;
Ce couple n’aura ni décote, ni réduction et son impôt final sera de 9200 euros.
4.3.1.7. Chiffres officiels
Le calcul de l’impôt est complexe. Tout au long du document, les tests seront faits avec les exemples suivants. Les résultats sont ceux du simulateur de l’administration fiscale |https://www3.impots.gouv.fr/simulateur/calcul_impot/2019/simplifie/index.htm| :
Contribuable | Résultats officiels | Résultats de l’algorithme du document |
Couple avec 2 enfants et des revenus annuels de 55555 euros | Impôt=2815 euros Taux d’imposition=14 % | Impôt=2814 euros Taux d’imposition=14 % |
Couple avec 2 enfants et des revenus annuels de 50000 euros | Impôt=1385 euros Décote=384 euros Réduction=346 euros Taux d’imposition=14 % | Impôt=1384 euros Décote=384 euros Réduction=347 euros Taux d’imposition=14 % |
Couple avec 3 enfants et des revenus annuels de 50000 euros | Impôt=0 euro décote=720 euros Réduction=0 euro Taux d’imposition=14 % | Impôt=0 euro décote=720 euros Réduction=0 euro Taux d’imposition=14 % |
Célibataire avec 2 enfants et des revenus annuels de 100000 euros | Impôt=19884 euros décote=0 euro Réduction=0 euro Taux d’imposition=41 % | Impôt=19884 euros Surcote=4480 euros décote=0 euro Réduction=0 euro Taux d’imposition=41 % |
Célibataire avec 3 enfants et des revenus annuels de 100000 euros | Impôt=16782 euros décote=0 euro Réduction=0 euro Taux d’imposition=41 % | Impôt=16782 euros Surcote=7176 euros décote=0 euro Réduction=0 euro Taux d’imposition=41 % |
Couple avec 3 enfants et des revenus annuels de 100000 euros | Impôt=9200 euros décote=0 euro Réduction=0 euro Taux d’imposition=30 % | Impôt=9200 euros Surcote=2180 euros décote=0 euro Réduction=0 euro Taux d’imposition=30 % |
Couple avec 5 enfants et des revenus annuels de 100000 euros | Impôt=4230 euros décote=0 euro Réduction=0 euro Taux d’imposition=14 % | Impôt=4230 euros décote=0 euro Réduction=0 euro Taux d’imposition=14 % |
Célibataire sans enfants et des revenus annuels de 100000 euros | Impôt=22986 euros décote=0 euro Réduction=0 euro Taux d’imposition=41 % | Impôt= 22986 euros Surcote=0 euro décote=0 euro Réduction=0 euro Taux d’imposition=41 % |
Couple avec 2 enfants et des revenus annuels de 30000 euros | Impôt=0 euro décote=0 euro Réduction=0 euro Taux d’imposition=0 % | Impôt=0 euro décote=0 euro Réduction=0 euro Taux d’imposition=0 % |
Célibataire sans enfants et des revenus annuels de 200000 euros | Impôt=64211 euro décote=0 euro Réduction=0 euro Taux d’imposition=45 % | Impôt= 64210 euros Surcote=7498 euros décote=0 euro Réduction=0 euro Taux d’imposition=45 % |
Couple avec 3 enfants et des revenus annuels de 200000 euros | Impôt=42843 euro décote=0 euro Réduction=0 euro Taux d’imposition=41 % | Impôt=42842 euros Surcote=17283 euros décote=0 euro Réduction=0 euro Taux d’imposition=41 % |
Ci-dessus, on appelle surcote, ce que paient en plus les hauts revenus à cause de deux phénomènes :
- Le plafonnement de l’abattement de 10 % sur les revenus annuels ;
- Le plafonnement du quotient familial ;
Cet indicateur n’a pu être vérifié car le simulateur de l’administration fiscale ne le donne pas.
On voit que l’algorithme du document donne un impôt juste à chaque fois, avec cependant une marge d’erreur de 1 euro. Cette marge d’erreur provient des arrondis. Toutes les sommes d’argent sont arrondies parfois à l’euro supérieur, parfois à l’euro inférieur. Comme je ne connaissais pas les règles officielles, les sommes d’argent de l’algorithme du document ont été arrondies :
- À l’euro supérieur pour les décotes et réductions ;
- À l’euro inférieur pour les surcotes et l’impôt final ;
Nous allons demander à l’IA de faire ce calcul d’impôt.
4.3.2. Configuration de la session Gemini
La question posée à Gemini s’accompagne de deux fichiers :
![]() |
- En [1], le calcul qui vient d’être détaillé a été mis dans un PDF qui est donné à Gemini. Gemini va y trouver les règles exactes de calcul simplifié de l’impôt 2019 sur les revenus 2018 ;
- En [2], nos instructions ;
- En [3] pour lancer l’IA ;
Nos instructions dans le fichier texte [instructionsAvecPDF.txt] sont les suivantes :
Ces instructions sont le résultat de très nombreuses questions posées à Gemini. Assez rapidement, on se rend compte que l’IA doit être très cadrée si on veut obtenir ce qu’on veut. C’est à cause de tous ces tâtonnements que la session Gemini était finalement stoppée pour dépassement de limites. Examinons la suite de ces instructions :
- Ligne 1 : on demande que la conversation soit en français. Cette indication est pour DeepSeek qui avait tendance à parler anglais ;
- Ligne 3 : ce qu’on veut ;
- Ligne 5 : on dit à l’IA d’utiliser le PDF qu’on lui a donné ;
- Lignes 7-14 : un certain nombre de conseils utiles surtout pour le problème 3 sans PDF. Plusieurs IA se sont perdues dans le calcul de l’impôt ;
- Lignes 15-44 : les 11 tests unitaires que l’on veut voir inclus dans le script généré. Lorsque le script sera généré, on l’exécutera dans PyCharm et on verra bien si les 11 tests passent ;
- Lignes 46-53 : sans ces instructions, les IA généraient des tests unitaires cherchant des résultats exacts qui échouaient ;
- Lignes 55-56 : je dis à l’IA de ne pas aller sur internet. La solution la plus simple est d’utiliser le PDF ;
- Lignes 58-59 : cette instruction n’a pas été suivie par les IA. J’ai été obligé de l’écrire explicitement dans une question, lorsque je constatais qu’un test avait échoué ;
- Lignes 61-65 : j’indique quel type de script Python je souhaite ;
- Lignes 67-69 : j’aurais préféré un lien pour récupérer le script généré car l’affichage du code à l’écran prend du temps. Il s’est avéré que la plupart des IA ne savent pas faire cela. Les liens donnés ne marchaient pas ;
- Lignes 71-72 : j’aurais aimé avoir le temps passé par l’IA pour répondre à la question. Seule Gemini a pu me donner ce renseignement. Les autres IA soit ne répondaient pas à cette instruction, soit donnaient des chiffres fantaisistes montrant qu’elles ne comprenaient pas cette instruction ;
4.3.3. La réponse de Gemini
La première réponse de Gemini est la suivante :
![]() |
- En [1-4], Gemini fournit des liens sur la partie du PDF ou du fichier texte des instructions qu’il utilise à un moment donné ;
La suite est la suivante :
![]() |
- En [1], Gemini affirme qu’il a exécuté les 11 tests unitaires avec succès. La plupart des IA ont affirmé cela aussi bien sur le problème 2 que le problème 3 et souvent lorsqu’on chargeait le script généré ça ne marchait pas. Il faut donc se méfier de cette affirmation. Pour Gemini cela va s’avérer vrai ;
- En [2], un lien qui s’avérera ne pas marcher ;
- En [3 seule Gemini a donné un temps d’exécution réaliste ;
Donc le lien [2] ne marche pas. On le dit à Gemini :
![]() |
La réponse de Gemini :
![]() |
- En [1], le script Python généré par Gemini ;
On charge ce script dans PyCharm et on l’exécute :
![]() |
- En [1], [gemini1] est le script généré par Gemini ;
A l’exécution du script apparaissent des erreurs de compilation :
"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
- Ligne 30, l’erreur de compilation. [cite_start] est un marqueur pour générer une certaine forme de texte ;
On met les logs ci-dessus dans un fichier [logs gemini1.txt] et on donne celui-ci à Gemini :
![]() |
La réponse de Gemini est alors la suivante :
![]() |
Chargé dans PyCharm, l’exécution du nouveau script génère exactement la même erreur. On le dit à Gemini en lui fournissant de nouveau les logs de l’exécution :
![]() |
La réponse de Gemini est la suivante :
![]() |
Cette fois c’est bon. Les 11 tests unitaires sont réussis. On le dit à Gemini :
![]() |
Qui répond :
![]() |
Le script généré par Gemini a suivi les instructions données dans le fichier texte [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 | |
Je n’ai pas vérifié ce code. Puisque les 11 tests unitaires sont passés, je considère qu’il est « probablement correct ». Je n’ai pas fait davantage pour mon propre code que de vérifier ces 11 tests.
4.4. Le problème 3
Le problème 3 est identique au problème 2, si ce n’est qu’on ne donne plus à l’IA le PDF qui donnait les règles de calcul à observer.
La question initiale à Gemini est la suivante :
![]() |
Le fichier des instructions en [1] est quasiment le même que pour le problème 2 avec les différences suivantes :
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 :
…
- En [3], on lui dit de trouver sur internet les règles de calcul de l’impôt 2019 sur les revenus 2018. C’est un exercice plus difficile que le précédent ;
Je ne donne ci-dessous que des parties de la première réponse de Gemini :
![]() |
![]() |
Le temps estimé est plausible. On attend longtemps la réponse de Gemini.
Comme précédemment, Gemini a fourni un lien de téléchargement du script généré, lien qui ne marche pas. On le lui dit :
![]() |
La réponse de Gemini :
![]() |
On charge le script dans PyCharm sous le nom [gemini2]:
![]() |
On l’exécute et… ça ne marche pas. Les logs de l’exécution sont les suivants :
"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
- Ligne 11, un test a échoué ;
- Lignes 25, 42 : une même erreur de compilation ;
On met ces logs dans un fichier texte qu’on donne à Gemini :
![]() |
La réponse de Gemini :
![]() |
![]() |
On charge dans PyCharm le script et on l’exécute. Encore des erreurs. On le dit à Gemini en joignant de nouveau les logs de l’exécution :
![]() |
La réponse de Gemini :
![]() |
![]() |
![]() |
On charge ce nouveau script dans PyCharm et on l’exécute. Cette fois les 11 tests unitaires passent :
Le code généré par Gemini est le suivant :
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 | |
De nouveau je n’ai pas inspecté ce code. J’ai simplement constaté qu’il passait les 11 tests avec succès.
Mais on peut être curieux de connaître son raisonnement, notamment pour les cas particuliers du calcul de l’impôt. On le lui demande :
![]() |
C’est un cas de hauts revenus avec à la fois un plafonnement possible de l’abattement de 10% et un plafonnement possible du quotient familial.
La réponse de Gemini est la suivante :
![]() |
![]() |
![]() |
![]() |
![]() |
Ces deux dernières copies d’écran sont intéressantes. Gemini utilise une méthode de calcul différente de celle expliquée dans le PDF. On trouve effectivement cette méthode de calcul sur internet. Les deux méthodes sont équivalentes.
![]() |
![]() |
![]() |
L’explication est remarquable par sa clarté. On pourrait la donner telle-quelle à des étudiants pour expliquer la méthode de calcul de l’impôt.
Maintenant prenons un autre exemple cette fois-ci avec des faibles revenus. Dans ce cas, il peut y avoir décote et réduction :
![]() |
La réponse de Gemini est la suivante :
![]() |
![]() |
![]() |
![]() |
![]() |
Ici, on constate que Gemini applique une règle qui n’est pas dans le PDF. Il l’a probablement trouvée sur internet, mais la source est-elle fiable ?
![]() |
Ici, Gemini continue d’appliquer une règle inconnue (la règle spéciale ci-dessus).
![]() |
![]() |
![]() |
Donc les résultats de Gemini collent avec le résultat du simulateur officiel des impôts. Mais il a utilisé une règle non présente dans le PDF. Où est l’erreur ? On le lui demande en lui joignant le PDF :
![]() |
La réponse de Gemini :
![]() |
![]() |
![]() |
![]() |
Je pense que Gemini a raison et que mon PDF est erroné. Pour le vérifier, je lui demande un test :
- Où son raisonnement donnerait les mêmes résultats que le simulateur d’impôt officiel ;
- Où le raisonnement du PDF donnerait lui des résultats différents de ceux du simulateur ;
![]() |
La réponse de Gemini est la suivante :
![]() |
Ici Gemini se trompe. J’ai lancé le simulateur sur cet exemple et j’ai trouvé la chose suivante :
![]() |
Cependant, on va découvrir que le raisonnement de Gemini donne bien les résultats ci-dessus. On continue :
![]() |
![]() |
![]() |
![]() |
Très bien. C’est noté. On continue :
![]() |
![]() |
![]() |
![]() |
Donc Gemini a trouvé (impôt, décote, réduction)= (431, 325, 1296) alors que le simulateur utilisé par mes soins donne (431, 324, 1297). Donc Gemini a trouvé les bons résultats à 1 euro près mais il ne le sait pas. On le lui dit :
![]() |
Gemini répond :
![]() |
![]() |
Maintenant, on se demande si Gemini pourrait générer un PDF corrigé :
![]() |
La réponse de Gemini :
![]() |
Gemini ne m’a donc pas donné de lien vers un PDF, mais il a généré un texte pour générer moi-même ce PDF. Bien que ce soit encombrant de donner ici, les copies d’écran du PDF, je le fais pour que le lecteur voie le côté génératif de l’IA :
![]() |













Honnêtement je n’ai pas vérifié si tout ce qui est dit dans ce PDF est vrai. En tout cas, c’est un document parfait pour un TD, généré en quelques secondes.
Néanmoins, on peut faire vérifier par Gemini lui-même que son PDF est bon. On démarre une nouvelle conversation :
![]() |
- en [1], on a mis le PDF généré par Gemini [Le problème selon Gemini.pdf] ;
- en [2], [instructionsAvecPDF2.txt] est identique aux instructions de [instructionsAvecPDF.txt], si ce n’est qu’on a ajouté un douzième test unitaire, celui-là même qui a montré que le PDF initial était erroné :
Curieusement il a fallu plusieurs allers-retours avant que Gemini génère le bon script :
Question 2
![]() |
Question 3
![]() |
Comme il a été fait maintenant plusieurs fois, lorsque le script généré et chargé dans PyCharm échoue, on donne à Gemini le fichier texte des logs de l’exécution. Gemini les comprend très bien.
Question 4
![]() |
Question 5
![]() |
Question 6 et fin
![]() | ![]() |
Maintenant nous sommes rassurés sur la validité du PDF généré par Gemini. Les règles de calcul qui y sont données sont correctes.
Nous allons maintenant faire la même chose pour les cinq autres IA mais nous serons très brefs dans nos explications, sauf pour ChatGPT l’IA leader du moment. Ce qui nous intéresse c’est de savoir si l’IA résoud ou non les trois problèmes qu’on lui pose. En effet, les interfaces de toutes ces IA sont très analogues et j’ai procédé avec elles comme avec Gemini. Le lecteur est encouragé à rejouer les conversations Gemini avec l’IA de son choix.




















































































