4. Risoluzione dei tre problemi con Google Gemini
Forniremo gli screenshot delle tre sessioni di Gemini che hanno permesso di risolvere i tre problemi posti. Entreremo abbastanza nei dettagli. Una volta fatto ciò, non ripeteremo il processo per gli altri IA testati. Funzionano in modo analogo. Forniremo solo i dettagli salienti.
4.1. Introduzione
Ricordiamo la prima schermata di Gemini fornita in precedenza:
![]() |
- In [1], il URL di Gemini;
- In [2], la versione di Gemini utilizzata;
- In [3-5], i tre problemi sottoposti a Gemini;
Gemini è un prodotto di Google disponibile all’indirizzo URL [https://gemini.google.com/]. Per avere una cronologia delle vostre sessioni di domande e risposte come quella sopra riportata, è necessario creare un account. Inoltre, come tutte le altre IA testate, Gemini limita il numero di domande e il numero di file scaricati. Quando si raggiunge questo limite, la sessione termina e viene proposto di riprenderla in un secondo momento. Poiché è piuttosto frustrante interrompersi nel bel mezzo di una sessione, ho sottoscritto un abbonamento. Fortunatamente, il primo mese dell’abbonamento a Gemini è gratuito. Ho fatto lo stesso con gli altri IA che presentavano queste limitazioni, ovvero ChatGPT, MistralAI e ClaudeAI. Ho sottoscritto un abbonamento di un mese, ma in questo caso il primo mese era a pagamento. Con Grok non ho riscontrato alcuna limitazione. DeepSeek non dichiara alcuna limitazione, ma a volte risponde [Server busy] e interrompe la sessione. È come imporre delle limitazioni senza dirlo.
Di seguito mi riferirò alle sessioni di domande e risposte, abbreviate semplicemente in “sessioni”. Gli utenti IA utilizzano più spesso il termine inglese “chat” (discussione) o “conversazione”.
L’interfaccia di Gemini per porre una domanda è la seguente:
![]() | ![]() |
- In [1], la vostra domanda;
- In [2], l’icona che avvia il IA per il calcolo della risposta;
- In [3-4], è possibile allegare dei file;
4.2. Problema 1
La sessione relativa al problema 1 è la seguente:
![]() |
- In [1], la domanda;
- In [2], l'inizio della risposta di Gemini;
Il seguito della risposta è il seguente:
![]() |
![]() |
![]() |
![]() |
La risposta è corretta. Anche gli altri cinque IA daranno la risposta corretta in una forma analoga.
4.3. Problema 2
4.3.1. Introduzione
Ricordiamo qui il problema iniziale del corso [python3-flask-2020]. Si tratta di un testo fornito agli studenti in formato TD.
![]() |
La tabella sopra riportata consente di calcolare l’imposta nel caso semplificato di un contribuente che abbia da dichiarare solo il proprio stipendio. Come indicato nella nota (1), l’imposta così calcolata è l’imposta al lordo di tre meccanismi:
- il tetto massimo del quoziente familiare, che si applica ai redditi elevati;
- Lo sconto e la riduzione d’imposta che si applicano ai redditi bassi;
Pertanto, il calcolo dell’imposta comprende le seguenti fasi [http://impotsurlerevenu.org/comprendre-le-calcul-de-l-impot/1217-calcul-de-l-impot-2019.php]:
![]() |
Ci proponiamo di scrivere un programma che consenta di calcolare l’imposta di un contribuente nel 2019 nel caso semplificato di un contribuente che abbia da dichiarare solo il proprio stipendio.
4.3.1.1. Calcolo dell’imposta lorda
L’imposta lorda può essere calcolata nel modo seguente:
Si calcola innanzitutto il numero di quote del contribuente:
- Ogni genitore apporta 1 quota;
- I primi due figli contribuiscono ciascuno con 1/2 quota;
- I figli successivi apportano una quota ciascuno:
Il numero di quote è quindi:
- nbParts=1+nbEnfants*0,5+(nbEnfants-2)*0,5 se il dipendente non è sposato;
- nbParts = 2 + nbEnfants * 0,5 + (nbEnfants - 2) * 0,5 se è sposato;
- dove nbEnfants è il numero di figli;
- Si calcola il reddito imponibile R=0,9*S dove S è lo stipendio annuale;
- Si calcola il quoziente familiare QF = R / nbParts;
- Si calcola l’imposta lorda I in base ai seguenti dati (2019):
9964 | 0 | 0 |
27519 | 0,14 | 1394,96 |
73779 | 0,3 | 5798 |
156.244 | 0,4 | 13913,69 |
0 | 0,45 | 20163,45 |
Ogni riga presenta 3 campi: champ1, champ2, champ3. Per calcolare l'imposta I, si cerca la prima riga in cui QF ≤ campo1 e si prendono i valori di quella riga. Ad esempio, per un dipendente sposato con due figli e uno stipendio annuo S di 50.000 euro:
Reddito imponibile: R=0,9*S=45000
Numero di quote: nbParts=2+2*0,5=3
Quoziente familiare: QF=45.000/3=15.000
La prima riga in cui QF <= campo1 è la seguente:
L'imposta I è quindi pari a 0,14*R – 1394,96*nbParts = [0,14*45000-1394,96*3] = 2115. L'imposta viene arrotondata all'euro inferiore.
Se la relazione QF ≤ campo1 è vera fin dalla prima riga, allora l’imposta è pari a zero.
Se QF è tale che la relazione QF<=campo1 non è mai soddisfatta, allora vengono utilizzati i coefficienti dell’ultima riga. In questo caso:
il che dà l'imposta lorda I=0,45*R – 20163,45*nbParts.
4.3.1.2. Limite massimo del quoziente familiare
![]() |
Per verificare se si applica il limite massimo del quoziente familiare QF, si ricalcola l’imposta lorda senza considerare i figli. Sempre per il lavoratore dipendente sposato con due figli e uno stipendio annuo S di 50.000 euro:
Reddito imponibile: R=0,9*S=45.000
Numero di quote: nbParts=2 (i figli non vengono più conteggiati)
Quoziente familiare: QF = 45.000 / 2 = 22.500
La prima riga in cui QF <= campo1 è la seguente:
L’imposta I è quindi pari a 0,14*R – 1394,96*nbParts=[0,14*45000-1394,96*2]=3510.
Guadagno massimo legato ai figli: 1551 * 2 = 3102 euro
Imposta minima: 3510 – 3102 = 408 euro
L’imposta lorda con 2 quote, già calcolata nel paragrafo precedente (2115 euro), è superiore all’imposta minima (408 euro), pertanto in questo caso non si applica il limite massimo familiare.
In generale, l’imposta lorda è maggiore di (imposta1, imposta2), dove:
- [impôt1]: è l’imposta lorda calcolata con i figli;
- [impôt2]: è l’imposta lorda calcolata senza i figli e ridotta del guadagno massimo (in questo caso 1551 euro per mezza quota) relativo ai figli;
4.3.1.3. Calcolo della riduzione
![]() |
Sempre per il dipendente sposato con due figli e uno stipendio annuo S di 50.000 euro:
L’imposta lorda (2115 euro) risultante dalla fase precedente è inferiore a 2627 euro per una coppia (1595 euro per un single): si applica quindi la riduzione. Essa si ottiene con il seguente calcolo:
sconto = soglia (coppia = 1970 / single = 1196) - 0,75 * imposta lorda
sconto = 1970 - 0,75 * 2115 = 383,75 arrotondato a 384 euro.
Nuova imposta lorda = 2115 - 384 = 1731 euro
Nel calcolo della riduzione occorre osservare due regole (alcuni strumenti di IA hanno incontrato difficoltà su questo punto):
- La riduzione non può essere negativa;
- La riduzione non può essere superiore all’imposta già calcolata;
4.3.1.4. Calcolo della riduzione d’imposta
![]() |
Al di sotto di una certa soglia, viene applicata una riduzione del 20% sull’imposta lorda risultante dai calcoli precedenti. Nel 2019, le soglie sono le seguenti:
- single: 21.037 euro;
- coppia: 42.074 euro; (la cifra 37.968 utilizzata nell’esempio sopra riportato sembra errata);
A questa soglia va aggiunto il valore: 3.797 * (numero di mezze quote apportate dai figli).
Sempre per il lavoratore dipendente sposato con due figli e uno stipendio annuo S di 50.000 euro:
- Il suo reddito imponibile (45.000 euro) è inferiore alla soglia (42.074 + 2 * 3.797) = 49.668 euro;
- Ha quindi diritto a una riduzione del 20% della sua imposta: 1731 * 0,2 = 346,2 euro, arrotondati a 347 euro;
- L’imposta lorda del contribuente risulta pari a: 1.731 - 347 = 1.384 euro;
4.3.1.5. Calcolo dell’imposta netta
Il nostro calcolo si ferma qui: l’imposta netta da pagare sarà di 1.384 euro. In realtà, il contribuente può beneficiare di altre detrazioni, in particolare per le donazioni a enti di interesse pubblico o generale.
4.3.1.6. Caso dei redditi elevati
Il nostro esempio precedente corrisponde alla maggior parte dei casi dei lavoratori dipendenti. Tuttavia, il calcolo dell’imposta è diverso nel caso dei redditi elevati.
4.3.1.6.1. Limite massimo della riduzione del 10% sul reddito annuo
Nella maggior parte dei casi, il reddito imponibile si ottiene con la formula: R=0,9*S, dove S è lo stipendio annuale. Si parla in questo caso di riduzione del 10%. Tale riduzione è soggetta a un limite massimo. Nel 2019:
- non può superare i 12.502 euro;
- non può essere inferiore a 437 euro;
Prendiamo il caso di un dipendente non sposato senza figli con uno stipendio annuo di 200.000 euro:
- La riduzione del 10% è pari a 20.000 euro > 12.502 euro. Viene quindi ridotta a 12.502 euro;
4.3.1.6.2. Limite massimo del quoziente familiare
Consideriamo un caso in cui si applica il limite massimo del quoziente familiare illustrato nel paragrafo |Limite massimo del quoziente familiare|. Prendiamo il caso di una coppia con tre figli e un reddito annuo di 100.000 euro. Ripassiamo le fasi del calcolo:
- La detrazione del 10% è pari a 100.000 euro < 12.502 euro. Il reddito imponibile R è quindi pari a 100.000 - 10.000 = 90.000 euro;
- La coppia ha nbParts = 2 + 0,5 × 2 + 1 = 4 quote;
- Il suo quoziente familiare è quindi QF = R / nbParts = 90.000 / 4 = 22.500 euro;
- La sua imposta lorda I1 con figli è pari a I1=0,14*90.000-1.394,96*4= 7.020 euro;
- La sua imposta lorda I2 senza figli:
- QF = 90.000 / 2 = 45.000 euro;
- I2 = 0,3 × 90.000 − 5.798 × 2 = 15.404 euro;
- La regola del limite massimo del quoziente familiare stabilisce che il beneficio derivante dai figli non possa superare (1551*4 mezze quote)=6204 euro. In questo caso, invece, è pari a I2-I1=15404-7020= 8384 euro, quindi superiore a 6204 euro;
- L’imposta lorda viene quindi ricalcolata come I3 = I2-6204 = 15.404 - 6.204 = 9.200 euro;
- Poiché I3 > I1, verrà mantenuta l’imposta I3;
Questa coppia non beneficerà né di uno sconto né di una riduzione e la sua imposta finale sarà di 9200 euro.
4.3.1.7. Dati ufficiali
Il calcolo dell’imposta è complesso. Nel corso del documento, le simulazioni saranno effettuate utilizzando i seguenti esempi. I risultati provengono dal simulatore dell’amministrazione fiscale |https://www3.impots.gouv.fr/simulateur/calcul_impot/2019/simplifie/index.htm|:
Contribuente | Risultati ufficiali | Risultati dell’algoritmo del documento |
Coppia con 2 figli e un reddito annuo di 55555 euro | Imposta = 2815 euro Aliquota fiscale = 14 % | Imposta = 2814 euro Aliquota fiscale = 14 % |
Coppia con 2 figli e un reddito annuo di 50.000 euro | Imposta = 1.385 euro Sconto = 384 euro Riduzione = 346 euro Aliquota fiscale = 14 % | Imposta = 1.384 euro Sconto = 384 euro Riduzione = 347 euro Aliquota fiscale = 14 % |
Coppia con 3 figli e un reddito annuo di 50.000 euro | Imposta = 0 euro Sconto = 720 euro Sconto = 0 euro Aliquota fiscale = 14 % | Imposta = 0 euro Sconto = 720 euro Riduzione = 0 euro Aliquota fiscale = 14 % |
Celibe con 2 figli e un reddito annuo di 100.000 euro | Imposta = 19.884 euro Sconto = 0 euro Sconto = 0 euro Aliquota fiscale = 41 % | Imposta = 19.884 euro Maggiorazione = 4.480 euro sconto = 0 euro Riduzione = 0 euro Aliquota fiscale = 41 % |
Celibe con 3 figli e un reddito annuo di 100.000 euro | Imposta = 16.782 euro Sconto = 0 euro Sconto = 0 euro Aliquota fiscale = 41 % | Imposta = 16.782 euro Maggiorazione = 7.176 euro sconto = 0 euro Riduzione = 0 euro Aliquota fiscale = 41 % |
Coppia con 3 figli e un reddito annuo di 100.000 euro | Imposta = 9.200 euro Sconto = 0 euro Sconto = 0 euro Aliquota fiscale = 30 % | Imposta = 9.200 euro Maggiorazione = 2180 euro sconto = 0 euro Riduzione = 0 euro Aliquota fiscale = 30 % |
Coppia con 5 figli e un reddito annuo di 100.000 euro | Imposta = 4.230 euro Sconto = 0 euro Sconto = 0 euro Aliquota fiscale = 14 % | Imposta = 4.230 euro Sconto = 0 euro Riduzione = 0 euro Aliquota fiscale = 14 % |
Celibe senza figli e con un reddito annuo di 100.000 euro | Imposta = 22.986 euro Sconto = 0 euro Sconto = 0 euro Aliquota fiscale = 41% | Imposta = 22.986 euro Maggiorazione = 0 euro Sconto = 0 euro Riduzione = 0 euro Aliquota fiscale = 41 % |
Coppia con 2 figli e un reddito annuo di 30.000 euro | Imposta = 0 euro Sconto = 0 euro Sconto = 0 euro Aliquota fiscale = 0% | Imposta = 0 euro Sconto = 0 euro Riduzione = 0 euro Aliquota fiscale = 0 % |
Celibe senza figli e con un reddito annuo di 200.000 euro | Imposta = 64.211 euro Sconto = 0 euro Sconto = 0 euro Aliquota fiscale = 45 % | Imposta = 64.210 euro Maggiorazione = 7.498 euro sconto = 0 euro Riduzione = 0 euro Aliquota fiscale = 45 % |
Coppia con 3 figli e un reddito annuo di 200.000 euro | Imposta = 42.843 euro Sconto = 0 euro Sconto = 0 euro Aliquota fiscale = 41% | Imposta = 42.842 euro Maggiorazione = 17.283 euro Sconto = 0 euro Riduzione = 0 euro Aliquota fiscale = 41 % |
In questo caso, si definisce «sovrattassa» l’importo aggiuntivo che i redditi elevati devono versare a causa di due fenomeni:
- il limite massimo del 10% sulla detrazione sui redditi annuali;
- Il limite massimo del quoziente familiare;
Questo indicatore non ha potuto essere verificato poiché il simulatore dell’amministrazione fiscale non lo fornisce.
Si nota che l’algoritmo del documento fornisce ogni volta un’imposta corretta, con tuttavia un margine di errore di 1 euro. Questo margine di errore deriva dagli arrotondamenti. Tutte le somme di denaro vengono arrotondate a volte all’euro superiore, a volte all’euro inferiore. Poiché non conoscevo le regole ufficiali, gli importi dell’algoritmo del documento sono stati arrotondati:
- all’euro superiore per gli sconti e le riduzioni;
- All’euro inferiore per i sovrapprezzi e l’imposta finale;
Chiederemo a IA di eseguire questo calcolo dell’imposta.
4.3.2. Configurazione della sessione Gemini
La richiesta inviata a Gemini è accompagnata da due file:
![]() |
- Nel file [1], il calcolo appena descritto è stato inserito in un file PDF che viene fornito a Gemini. Gemini vi troverà le regole esatte per il calcolo semplificato dell’imposta 2019 sui redditi del 2018;
- In [2], le nostre istruzioni;
- Nel file [3] per avviare il file IA;
Le nostre istruzioni nel file di testo [instructionsAvecPDF.txt] sono le seguenti:
Queste istruzioni sono il risultato di moltissime domande poste a Gemini. Ci si rende conto abbastanza rapidamente che il IA deve essere molto ben definito se si vuole ottenere ciò che si desidera. È a causa di tutti questi tentativi che la sessione Gemini è stata infine interrotta per superamento dei limiti. Esaminiamo il seguito di queste istruzioni:
- Riga 1: si richiede che la conversazione sia in francese. Questa indicazione è rivolta a DeepSeek, che tendeva a parlare in inglese;
- Riga 3: ciò che si desidera;
- Riga 5: si dice a IA di utilizzare il PDF che gli è stato fornito;
- Righe 7-14: una serie di consigli utili soprattutto per il problema 3 senza PDF. Diversi IA sono andati persi nel calcolo dell’imposta;
- Righe 15-44: gli 11 test unitari che si desidera includere nello script generato. Una volta generato lo script, lo si eseguirà in PyCharm e si verificherà se gli 11 test vengono superati;
- Righe 46-53: senza queste istruzioni, IA generava test unitari che cercavano risultati esatti e fallivano;
- Righe 55-56: indico a IA di non connettersi a Internet. La soluzione più semplice è utilizzare PDF;
- Righe 58-59: questa istruzione non è stata seguita da IA. Sono stato costretto a scriverla esplicitamente in una domanda, quando ho constatato che un test era fallito;
- Righe 61-65: indico quale tipo di script Python desidero;
- Righe 67-69: avrei preferito un link per scaricare lo script generato, poiché la visualizzazione del codice sullo schermo richiede tempo. È emerso che la maggior parte dei IA non è in grado di farlo. I link forniti non funzionavano;
- Righe 71-72: avrei voluto conoscere il tempo impiegato dall’IA per rispondere alla domanda. Solo Gemini è stato in grado di fornirmi questa informazione. Gli altri IA o non rispondevano a questa istruzione, oppure fornivano cifre inventate, dimostrando di non averla compresa;
4.3.3. La risposta di Gemini
La prima risposta di Gemini è la seguente:
![]() |
- In [1-4], Gemini fornisce dei link alla parte del PDF o del file di testo contenente le istruzioni che sta utilizzando in quel momento;
Il seguito è il seguente:
![]() |
- In [1], Gemini afferma di aver eseguito con successo tutti gli 11 test unitari. La maggior parte dei IA lo ha affermato sia per il problema 2 che per il problema 3 e spesso, quando si caricava lo script generato, non funzionava. Bisogna quindi diffidare di questa affermazione. Per Gemini si rivelerà vera;
- In [2], un link che si rivelerà non funzionante;
- Nel [3 solo Gemini ha fornito un tempo di esecuzione realistico;
Quindi il link [2] non funziona. Lo segnaliamo a Gemini:
![]() |
La risposta di Gemini:
![]() |
- In [1], lo script Python generato da Gemini;
Carichiamo questo script in PyCharm e lo eseguiamo:
![]() |
- In [1], [gemini1] è lo script generato da Gemini;
All’esecuzione dello script compaiono errori di compilazione:
"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
- Riga 30, l’errore di compilazione. [cite_start] è un marcatore per generare una determinata forma di testo;
Si inseriscono i log sopra riportati in un file [logs gemini1.txt] e lo si fornisce a Gemini:
![]() |
La risposta di Gemini è quindi la seguente:
![]() |
Una volta caricato in PyCharm, l’esecuzione del nuovo script genera esattamente lo stesso errore. Lo si comunica a Gemini fornendogli nuovamente i log dell’esecuzione:
![]() |
La risposta di Gemini è la seguente:
![]() |
Questa volta funziona. Tutti gli 11 test unitari hanno esito positivo. Lo comunichiamo a Gemini:
Che risponde:
![]() |
Lo script generato da Gemini ha seguito le istruzioni fornite nel file di testo [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 | |
Non ho verificato questo codice. Poiché gli 11 test unitari sono stati superati, lo considero «probabilmente corretto». Per quanto riguarda il mio codice, mi sono limitato a verificare questi 11 test.
4.4. Il problema 3
Il problema 3 è identico al problema 2, tranne per il fatto che a IA non viene più fornito il PDF che indicava le regole di calcolo da seguire.
La domanda iniziale a Gemini è la seguente:
![]() |
Il file delle istruzioni in formato [1] è praticamente identico a quello del problema 2, con le seguenti differenze:
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 :
…
- In [3], gli viene chiesto di trovare su Internet le regole per il calcolo dell’imposta 2019 sui redditi del 2018. Si tratta di un esercizio più difficile del precedente;
Di seguito riporto solo alcune parti della prima risposta di Gemini:
![]() |
![]() |
Il tempo stimato è plausibile. Si attende a lungo la risposta di Gemini.
Come in precedenza, Gemini ha fornito un link per scaricare lo script generato, link che però non funziona. Glielo facciamo notare:
![]() |
La risposta di Gemini:
![]() |
Carichiamo lo script in PyCharm con il nome [gemini2]:
![]() |
Lo si esegue e… non funziona. I log dell’esecuzione sono i seguenti:
"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
- Riga 11, un test non è andato a buon fine;
- Righe 25, 42: lo stesso errore di compilazione;
Si inseriscono questi log in un file di testo che si invia a Gemini:
![]() |
La risposta di Gemini:
![]() |
![]() |
Carichiamo lo script in PyCharm e lo eseguiamo. Ancora errori. Lo segnaliamo a Gemini allegando nuovamente i log dell’esecuzione:
![]() |
La risposta di Gemini:
![]() |
![]() |
![]() |
Carichiamo questo nuovo script in PyCharm ed eseguiamolo. Questa volta tutti gli 11 test unitari vengono superati:
Il codice generato da Gemini è il seguente:
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 | |
Anche in questo caso non ho esaminato il codice. Ho semplicemente constatato che superava con successo tutti gli 11 test.
Ma si può essere curiosi di conoscere il suo ragionamento, in particolare per i casi particolari del calcolo dell’imposta. Glielo chiediamo:
![]() |
Si tratta di un caso di redditi elevati con un possibile limite massimo della detrazione del 10% e un possibile limite massimo del quoziente familiare.
La risposta di Gemini è la seguente:
![]() |
![]() |
![]() |
![]() |
![]() |
Queste ultime due schermate sono interessanti. Gemini utilizza un metodo di calcolo diverso da quello spiegato nel PDF. Questo metodo di calcolo è effettivamente reperibile su Internet. I due metodi sono equivalenti.
![]() |
![]() |
La spiegazione si distingue per la sua chiarezza. Potrebbe essere fornita così com’è agli studenti per illustrare il metodo di calcolo dell’imposta.
Ora prendiamo un altro esempio, questa volta con redditi modesti. In questo caso, possono esserci uno sconto e una riduzione:
![]() |
La risposta di Gemini è la seguente:
![]() |
![]() |
![]() |
![]() |
![]() |
Qui si nota che Gemini applica una regola che non è presente nel PDF. Probabilmente l’ha trovata su Internet, ma la fonte è affidabile?
![]() |
Qui Gemini continua ad applicare una regola sconosciuta (la regola speciale di cui sopra).
![]() |
![]() |
![]() |
Quindi i risultati di Gemini coincidono con quelli del simulatore fiscale ufficiale. Tuttavia, ha utilizzato una regola non presente nel PDF. Dove sta l’errore? Glielo chiediamo allegando il PDF:
![]() |
La risposta di Gemini:
![]() |
![]() |
![]() |
![]() |
Penso che Gemini abbia ragione e che il mio PDF sia errato. Per verificarlo, gli chiedo di fare un test:
- in cui il suo ragionamento darebbe gli stessi risultati del simulatore fiscale ufficiale;
- in cui il ragionamento del PDF darebbe risultati diversi da quelli del simulatore;
![]() |
La risposta di Gemini è la seguente:
![]() |
In questo caso Gemini sbaglia. Ho eseguito il simulatore su questo esempio e ho ottenuto quanto segue:
![]() |
Tuttavia, scopriremo che il ragionamento di Gemini porta effettivamente ai risultati sopra riportati. Continuiamo:
![]() |
![]() |
![]() |
![]() |
Va bene. Ne prendo nota. Continuiamo:
![]() |
![]() |
![]() |
![]() |
Quindi Gemini ha calcolato (imposta, sconto, riduzione) = (431, 325, 1296), mentre il simulatore che ho utilizzato io restituisce (431, 324, 1297). Quindi Gemini ha ottenuto i risultati corretti con uno scarto di 1 euro, ma non lo sa. Glielo diciamo:
![]() |
Gemini risponde:
![]() |
![]() |
Ora ci si chiede se Gemini potrebbe generare un PDF corretto:
![]() |
La risposta di Gemini:
![]() |
Gemini non mi ha quindi fornito un link a un PDF, ma ha generato un testo che mi permette di generare io stesso questo PDF. Sebbene sia un po’ ingombrante riportare qui gli screenshot del PDF, lo faccio affinché il lettore possa cogliere l’aspetto generativo del IA:
![]() |













Onestamente non ho verificato se tutto ciò che è riportato in questo PDF sia vero. In ogni caso, è un documento perfetto per un TD, generato in pochi secondi.
Tuttavia, è possibile far verificare da Gemini stesso che il suo PDF sia corretto. Si avvia una nuova conversazione:
![]() |
- in [1], abbiamo inserito il PDF generato da Gemini [Le problème selon Gemini.pdf];
- in [2], [instructionsAvecPDF2.txt] è identico alle istruzioni di [instructionsAvecPDF.txt], tranne per l’aggiunta di un dodicesimo test unitario, proprio quello che ha evidenziato l’errore nel PDF iniziale:
Curiosamente, ci sono voluti diversi tentativi prima che Gemini generasse lo script corretto:
Domanda 2
![]() |
Domanda 3
![]() |
Come già fatto più volte, quando lo script generato e caricato in PyCharm non funziona, forniamo a Gemini il file di testo contenente i log dell’esecuzione. Gemini li comprende molto bene.
Domanda 4
![]() |
Domanda 5
![]() |
Domanda 6 e fine
![]() | ![]() |
Ora siamo certi della validità del codice PDF generato da Gemini. Le regole di calcolo ivi riportate sono corrette.
Ora faremo la stessa cosa per gli altri cinque IA, ma saremo molto concisi nelle nostre spiegazioni, tranne che per il ChatGPT, l’attuale leader tra i IA. Ciò che ci interessa è sapere se l’IA risolva o meno i tre problemi che gli vengono posti. Infatti, le interfacce di tutti questi IA sono molto simili e ho proceduto con loro come con Gemini. Il lettore è invitato a riprodurre le conversazioni di Gemini con il modello IA di sua scelta.


















































































