4. Resolución de los tres problemas con Google Gemini
Vamos a mostrar las capturas de pantalla de las tres sesiones de Gemini que permitieron resolver los tres problemas planteados. Entraremos bastante en detalle. Una vez hecho esto, no repetiremos el proceso para las demás IA probadas. Funcionan de manera análoga. Solo daremos los detalles más destacados.
4.1. Introducción
Recordamos la primera captura de pantalla de Gemini mostrada anteriormente:
![]() |
- En [1], el URL de Gemini;
- En [2], el version de Gemini utilizado;
- En [3-5], las tres preguntas planteadas a Gemini;
Gemini es un producto de Google disponible en URL [https://gemini.google.com/]. Para disponer de un historial de tus sesiones de preguntas y respuestas como el anterior, debes crear una cuenta. Por otra parte, al igual que todas las demás IA probadas, Gemini limita el número de preguntas y el número de archivos descargados. Cuando se alcanza este límite, la sesión finaliza y se te propone continuarla más tarde. Como resulta bastante frustrante tener que parar en medio de una sesión, me he suscrito. Por suerte, el primer mes de la suscripción a Gemini es gratuito. Hice lo mismo con los demás IA que tenían estas limitaciones, a saber, ChatGPT, MistralAI y ClaudeAI. Contraté una suscripción de un mes, pero en este caso el primer mes era de pago. No he encontrado límites con Grok. DeepSeek no anuncia límites, pero a veces responde [Server busy] e interrumpe la sesión. Es como poner límites sin decirlo.
En lo que sigue, hablaré de sesiones de preguntas y respuestas, abreviadas simplemente como «sesiones». Los IA suelen utilizar el término inglés «chat» (charla) o «conversación».
La interfaz de Gemini para hacer una pregunta es la siguiente:
![]() | ![]() |
- En [1], tu pregunta;
- En [2], el icono que inicia IA para el cálculo de la respuesta;
- En [3-4], puede adjuntar archivos;
4.2. El problema 1
La sesión para el problema 1 es la siguiente:
![]() |
- En [1], la pregunta;
- En [2], el inicio de la respuesta de Gemini;
El resto de la respuesta es el siguiente:
![]() |
![]() |
![]() |
![]() |
La respuesta es correcta. Los otros cinco IA también darán la respuesta correcta de forma similar.
4.3. El problema 2
4.3.1. Introducción
Recordemos aquí el problema inicial del curso [python3-flask-2020]. Se trata de un texto que se ha dado a los estudiantes en TD.
![]() |
La tabla anterior permite calcular el impuesto en el caso simplificado de un contribuyente que solo tiene que declarar su salario. Como indica la nota (1), el impuesto así calculado es el impuesto antes de aplicar tres mecanismos:
- El límite máximo del coeficiente familiar que se aplica a las rentas elevadas;
- La bonificación y la reducción de impuestos que se aplican a las rentas bajas;
Así, el cálculo del impuesto comprende los siguientes pasos [http://impotsurlerevenu.org/comprendre-le-calcul-de-l-impot/1217-calcul-de-l-impot-2019.php]:
![]() |
Nos proponemos escribir un programa que permita calcular el impuesto de un contribuyente en 2019 en el caso simplificado de un contribuyente que solo tenga que declarar su salario.
4.3.1.1. Cálculo del impuesto bruto
El impuesto bruto se puede calcular de la siguiente manera:
En primer lugar, se calcula el número de participaciones del contribuyente:
- Cada progenitor aporta 1 parte;
- Los dos primeros hijos aportan cada uno 1/2 parte;
- Los hijos siguientes aportan una parte cada uno:
Por lo tanto, el número de participaciones es:
- nbParts=1+nbEnfants*0,5+(n.º de hijos-2)*0,5 si el empleado no está casado;
- nbParts = 2 + nbEnfants * 0,5 + (nbEnfants - 2) * 0,5 si está casado;
- donde nbEnfants es su número de hijos;
- Se calcula la renta imponible R = 0,9 * S, donde S es el salario anual;
- Se calcula el coeficiente familiar QF = R / nbParts;
- Se calcula el impuesto bruto I a partir de los siguientes datos (2019):
9964 | 0 | 0 |
27519 | 0,14 | 1394,96 |
73779 | 0,3 | 5798 |
156 244 | 0,4 | 13913,69 |
0 | 0,45 | 20163,45 |
Cada línea tiene 3 campos: champ1, champ2, champ3. Para calcular el impuesto I, se busca la primera línea en la que QF <= campo1 y se toman los valores de esa línea. Por ejemplo, para un empleado casado con dos hijos y un salario anual S de 50 000 euros:
Renta imponible: R=0,9*S=45 000
Número de cuotas: nbParts=2+2*0,5=3
Cotización familiar: QF=45 000/3=15 000
La primera línea en la que QF <= campo1 es la siguiente:
El impuesto I es entonces igual a 0,14*R – 1394,96*nbParts=[0,14*45000-1394,96*3]=2115. El impuesto se redondea al euro inferior.
Si la relación QF <= campo1 se cumple desde la primera línea, entonces el impuesto es nulo.
Si QF es tal que la relación QF<=campo1 nunca se cumple, entonces se utilizan los coeficientes de la última línea. En este caso:
lo que da el impuesto bruto I = 0,45*R – 20 163,45*nbParts.
4.3.1.2. Límite máximo del coeficiente familiar
![]() |
Para saber si se aplica el límite máximo del coeficiente familiar QF, se vuelve a calcular el impuesto bruto sin tener en cuenta a los hijos. Siguiendo con el ejemplo del asalariado casado con dos hijos y un salario anual S de 50 000 euros:
Renta imponible: R = 0,9 * S = 45 000
Número de partes: nbParts=2 (ya no se cuentan los hijos)
Cotización familiar: QF = 45 000 / 2 = 22 500
La primera línea en la que QF <= campo1 es la siguiente:
El impuesto I es entonces igual a 0,14*R – 1394,96*nbParts=[0,14*45000-1394,96*2]=3510.
Ganancia máxima por hijos: 1551 * 2 = 3102 euros
Impuesto mínimo: 3510-3102 = 408 euros
El impuesto bruto con 2 partes, ya calculado en el párrafo anterior (2115 euros), es superior al impuesto mínimo (408 euros), por lo que el límite máximo familiar no se aplica en este caso.
En general, el impuesto bruto es sup(impuesto1, impuesto2), donde:
- [impôt1]: es el impuesto bruto calculado con los hijos;
- [impôt2]: es el impuesto bruto calculado sin los hijos y reducido en la ganancia máxima (en este caso, 1551 euros por media parte) relacionada con los hijos;
4.3.1.3. Cálculo de la reducción
![]() |
Siguiendo con el ejemplo del asalariado casado con dos hijos y un salario anual S de 50 000 euros:
El impuesto bruto (2115 euros) resultante del paso anterior es inferior a 2627 euros para una pareja (1595 euros para una persona soltera): por lo tanto, se aplica la reducción. Se obtiene mediante el siguiente cálculo:
descuento = umbral (pareja = 1970 / soltero = 1196) - 0,75 * Impuesto bruto
descuento = 1970 - 0,75 * 2115 = 383,75, redondeado a 384 euros.
Nuevo impuesto bruto = 2115 - 384 = 1731 euros
Hay que tener en cuenta dos reglas en el cálculo de la reducción (algunas herramientas de IA han tropezado con esta cuestión):
- El descuento no puede ser negativo;
- La deducción no puede ser superior al impuesto ya calculado;
4.3.1.4. Cálculo de la reducción de impuestos
![]() |
Por debajo de un determinado umbral, se aplica una reducción del 20 % sobre el impuesto bruto resultante de los cálculos anteriores. En 2019, los umbrales son los siguientes:
- soltero: 21 037 euros;
- pareja: 42 074 euros; (la cifra de 37 968 utilizada en el ejemplo anterior parece errónea);
Este umbral se incrementa en el valor: 3797 * (número de medias partes aportadas por los hijos).
Siguiendo con el ejemplo del asalariado casado con dos hijos y un salario anual S de 50 000 euros:
- Su renta imponible (45 000 euros) es inferior al umbral (42 074 + 2 × 3797) = 49 668 euros;
- Por lo tanto, tiene derecho a una reducción del 20 % de su impuesto: 1731 * 0,2 = 346,2 euros, redondeado a 347 euros;
- El impuesto bruto del contribuyente pasa a ser: 1731 - 347 = 1384 euros;
4.3.1.5. Cálculo del impuesto net
Nuestro cálculo se detendrá aquí: el impuesto net a pagar será de 1384 euros. En la realidad, el contribuyente puede beneficiarse de otras reducciones, en particular por donaciones a organismos de interés público o general.
4.3.1.6. El caso de las rentas elevadas
Nuestro ejemplo anterior corresponde a la mayoría de los casos de asalariados. Sin embargo, el cálculo del impuesto es diferente en el caso de las rentas altas.
4.3.1.6.1. Límite máximo de la reducción del 10 % sobre los ingresos anuales
En la mayoría de los casos, la renta imponible se obtiene mediante la fórmula: R = 0,9 * S, donde S es el salario anual. A esto se le denomina la reducción del 10 %. Esta reducción tiene un límite máximo. En 2019:
- No puede ser superior a 12 502 euros;
- No puede ser inferior a 437 euros;
Tomemos el caso de un asalariado soltero sin hijos y con un salario anual de 200 000 euros:
- La reducción del 10 % es de 20 000 euros > 12 502 euros. Por lo tanto, se reduce a 12 502 euros;
4.3.1.6.2. Límite máximo del coeficiente familiar
Tomemos un caso en el que se aplica el límite máximo familiar presentado en el apartado |Límite máximo del coeficiente familiar|. Tomemos el caso de una pareja con tres hijos y unos ingresos anuales de 100 000 euros. Repasemos los pasos del cálculo:
- La deducción del 10 % es de 100 000 euros < 12 502 euros. Por lo tanto, la renta imponible R es de 100 000 - 10 000 = 90 000 euros;
- La pareja tiene nbParts = 2 + 0,5 × 2 + 1 = 4 partes;
- Por lo tanto, su coeficiente familiar es QF = R/nbParts = 90 000/4 = 22 500 euros;
- Su impuesto bruto I1 con hijos es I1 = 0,14 × 90 000 – 1 394,96 × 4 = 7 020 euros;
- Su impuesto bruto I2 sin hijos:
- QF = 90 000 / 2 = 45 000 euros;
- I2 = 0,3 × 90 000 − 5798 × 2 = 15 404 euros;
- La regla del límite máximo del coeficiente familiar establece que la ganancia aportada por los hijos no puede superar (1551*4 medias partes)=6204 euros. Sin embargo, en este caso es I2-I1=15404-7020= 8384 euros, por lo que es superior a 6204 euros;
- Por lo tanto, el impuesto bruto se recalcula como I3 = I2-6204 = 15 404 - 6 204 = 9 200 euros;
- Como I3 > I1, se mantendrá el impuesto I3;
Esta pareja no tendrá ni bonificación ni reducción y su impuesto final será de 9200 euros.
4.3.1.7. Cifras oficiales
El cálculo del impuesto es complejo. A lo largo de todo el documento, las pruebas se realizarán con los siguientes ejemplos. Los resultados son los del simulador de la administración tributaria |https://www3.impots.gouv.fr/simulateur/calcul_impot/2019/simplifie/index.htm|:
Contribuyente | Resultados oficiales | Resultados del algoritmo del documento |
Pareja con 2 hijos y unos ingresos anuales de 55 555 euros | Impuesto = 2815 euros Tipo impositivo = 14 % | Impuesto = 2814 euros Tipo impositivo = 14 % |
Pareja con dos hijos y unos ingresos anuales de 50 000 euros | Impuesto = 1385 euros Descuento = 384 euros Reducción = 346 euros Tipo impositivo = 14 % | Impuesto = 1384 euros Descuento = 384 euros Descuento = 347 euros Tipo impositivo = 14 % |
Pareja con 3 hijos y unos ingresos anuales de 50 000 euros | Impuesto = 0 euros Descuento = 720 euros Descuento = 0 euros Tipo impositivo = 14 % | Impuesto = 0 euros Descuento = 720 euros Descuento = 0 euros Tipo impositivo = 14 % |
Soltero con 2 hijos y unos ingresos anuales de 100 000 euros | Impuesto = 19 884 euros Descuento = 0 euros Reducción = 0 euros Tipo impositivo = 41 % | Impuesto = 19 884 euros Recargo = 4480 euros Descuento = 0 euros Reducción = 0 euros Tipo impositivo = 41 % |
Soltero con 3 hijos y unos ingresos anuales de 100 000 euros | Impuesto = 16 782 euros Descuento = 0 euros Descuento = 0 euros Tipo impositivo = 41 % | Impuesto = 16 782 euros Recargo = 7176 euros Descuento = 0 euros Reducción = 0 euros Tipo impositivo = 41 % |
Pareja con 3 hijos y unos ingresos anuales de 100 000 euros | Impuesto = 9200 euros Descuento = 0 euros Descuento = 0 euros Tipo impositivo = 30 % | Impuesto = 9200 euros Recargo = 2180 euros Descuento = 0 euros Reducción = 0 euros Tipo impositivo = 30 % |
Pareja con 5 hijos y unos ingresos anuales de 100 000 euros | Impuesto = 4230 euros Descuento = 0 euros Descuento = 0 euros Tipo impositivo = 14 % | Impuesto = 4230 euros Descuento = 0 euros Descuento = 0 euros Tipo impositivo = 14 % |
Soltero sin hijos y con unos ingresos anuales de 100 000 euros | Impuesto = 22 986 euros Descuento = 0 euros Descuento = 0 euros Tipo impositivo = 41 % | Impuesto = 22 986 euros Recargo = 0 euros Descuento = 0 euros Reducción = 0 euros Tipo impositivo = 41 % |
Pareja con 2 hijos y unos ingresos anuales de 30 000 euros | Impuesto = 0 euros Descuento = 0 euros Descuento = 0 euros Tipo impositivo = 0 % | Impuesto = 0 euros Descuento = 0 euros Reducción = 0 euros Tipo impositivo = 0 % |
Soltero sin hijos y con unos ingresos anuales de 200 000 euros | Impuesto = 64 211 euros Descuento = 0 euros Descuento = 0 euros Tipo impositivo = 45 % | Impuesto = 64 210 euros Recargo = 7498 euros Descuento = 0 euros Reducción = 0 euros Tipo impositivo = 45 % |
Pareja con 3 hijos y unos ingresos anuales de 200 000 euros | Impuesto = 42 843 euros Descuento = 0 euros Descuento = 0 euros Tipo impositivo = 41 % | Impuesto = 42 842 euros Recargo = 17 283 euros descuento = 0 euros Reducción = 0 euros Tipo impositivo = 41 % |
En el ejemplo anterior, se denomina recargo a lo que pagan de más las rentas altas debido a dos fenómenos:
- El límite máximo de la deducción del 10 % sobre los ingresos anuales;
- El límite máximo del coeficiente familiar;
Este indicador no se ha podido verificar, ya que el simulador de la administración tributaria no lo proporciona.
Se observa que el algoritmo del documento da un impuesto correcto en todos los casos, aunque con un margen de error de 1 euro. Este margen de error se debe a los redondeos. Todas las cantidades monetarias se redondean a veces al euro superior y a veces al euro inferior. Como no conocía las normas oficiales, las cantidades del algoritmo del documento se han redondeado:
- Al euro superior para los descuentos y reducciones;
- Al euro inferior para los recargos y el impuesto final;
Vamos a pedirle al IA que realice este cálculo del impuesto.
4.3.2. Configuración de la sesión de Gemini
La pregunta planteada a Gemini va acompañada de dos archivos:
![]() |
- En [1], el cálculo que acabamos de detallar se ha introducido en un PDF que se entrega a Gemini. Gemini encontrará en él las reglas exactas para el cálculo simplificado del impuesto de 2019 sobre los ingresos de 2018;
- En [2], nuestras instrucciones;
- En [3] para ejecutar el IA;
Nuestras instrucciones en el archivo de texto [instructionsAvecPDF.txt] son las siguientes:
Estas instrucciones son el resultado de numerosas preguntas formuladas a Gemini. Muy pronto nos damos cuenta de que el IA debe estar muy bien definido si queremos obtener lo que queremos. Debido a todos estos intentos fallidos, la sesión de Gemini se detuvo finalmente por exceder los límites. Examinemos el resto de estas instrucciones:
- Línea 1: se solicita que la conversación sea en francés. Esta indicación es para DeepSeek, que tendía a hablar en inglés;
- Línea 3: lo que queremos;
- Línea 5: se le dice a IA que utilice el PDF que se le ha dado;
- Líneas 7-14: una serie de consejos útiles, sobre todo para el problema 3 sin PDF. Se han perdido varios IA en el cálculo del impuesto;
- Líneas 15-44: las 11 pruebas unitarias que queremos que se incluyan en el script generado. Cuando se genere el script, lo ejecutaremos en PyCharm y veremos si las 11 pruebas pasan;
- Líneas 46-53: sin estas instrucciones, IA generaba pruebas unitarias que buscaban resultados exactos y fallaban;
- Líneas 55-56: le indico a IA que no se conecte a Internet. La solución más sencilla es utilizar PDF;
- Líneas 58-59: esta instrucción no fue seguida por los IA. Me vi obligado a escribirla explícitamente en una pregunta, cuando comprobé que una prueba había fallado;
- Líneas 61-65: indico qué tipo de script de Python deseo;
- Líneas 67-69: hubiera preferido un enlace para recuperar el script generado, ya que mostrar el código en pantalla lleva tiempo. Resultó que la mayoría de los IA no saben hacer esto. Los enlaces proporcionados no funcionaban;
- Líneas 71-72: me hubiera gustado saber el tiempo que tardó el IA en responder a la pregunta. Solo Gemini pudo darme esta información. Los demás IA o bien no respondían a esta instrucción, o bien daban cifras fantasiosas que demostraban que no la entendían;
4.3.3. La respuesta de Gemini
La primera respuesta de Gemini es la siguiente:
![]() |
- En [1-4], Gemini proporciona enlaces a la parte del PDF o del archivo de texto de las instrucciones que utiliza en un momento dado;
La continuación es la siguiente:
![]() |
- En [1], Gemini afirma que ha ejecutado con éxito las 11 pruebas unitarias. La mayoría de los IA afirmaban lo mismo tanto en el problema 2 como en el problema 3 y, a menudo, al cargar el script generado, este no funcionaba. Por lo tanto, hay que desconfiar de esta afirmación. En el caso de Gemini, resultará ser cierto;
- En [2], un enlace que resultará no funcionar;
- En [3], solo Gemini dio un tiempo de ejecución realista;
Por lo tanto, el enlace [2] no funciona. Se lo indicamos a Gemini:
![]() |
La respuesta de Gemini:
![]() |
- En [1], el script de Python generado por Gemini;
Cargamos este script en PyCharm y lo ejecutamos:
![]() |
- En [1], [gemini1] es el script generado por Gemini;
Al ejecutar el script aparecen errores de compilación:
"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
- Línea 30, el error de compilación. [cite_start] es un marcador para generar un determinado tipo de texto;
Ponemos los registros anteriores en un archivo [logs gemini1.txt] y se lo pasamos a Gemini:
![]() |
La respuesta de Gemini es entonces la siguiente:
![]() |
Una vez cargado en PyCharm, la ejecución del nuevo script genera exactamente el mismo error. Se se lo comunicamos a Gemini proporcionándole de nuevo los registros de la ejecución:
![]() |
La respuesta de Gemini es la siguiente:
![]() |
Esta vez sí. Las 11 pruebas unitarias se han superado. Se lo comunicamos a Gemini:
Que responde:
![]() |
El script generado por Gemini ha seguido las instrucciones dadas en el archivo 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 | |
No he comprobado este código. Dado que las 11 pruebas unitarias han pasado, considero que es «probablemente correcto». No he hecho nada más con mi propio código que comprobar estas 11 pruebas.
4.4. El problema 3
El problema 3 es idéntico al problema 2, salvo que ya no se le da al IA el PDF que proporcionaba las reglas de cálculo a seguir.
La pregunta inicial a Gemini es la siguiente:
![]() |
El archivo de instrucciones en [1] es prácticamente el mismo que para el problema 2, con las siguientes diferencias:
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], se le pide que busque en Internet las normas de cálculo del impuesto de 2019 sobre los ingresos de 2018. Es un ejercicio más difícil que el anterior;
A continuación solo incluyo partes de la primera respuesta de Gemini:
![]() |
![]() |
El tiempo estimado es plausible. Esperamos mucho tiempo la respuesta de Gemini.
Al igual que antes, Gemini ha proporcionado un enlace de descarga del script generado, enlace que no funciona. Se lo indicamos:
![]() |
La respuesta de Gemini:
![]() |
Cargamos el script en PyCharm con el nombre [gemini2]:
![]() |
Lo ejecutamos y… no funciona. Los registros de la ejecución son los siguientes:
"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
- Línea 11, una prueba ha fallado;
- Líneas 25 y 42: el mismo error de compilación;
Guardamos estos registros en un archivo de texto que le pasamos a Gemini:
![]() |
La respuesta de Gemini:
![]() |
![]() |
Cargamos el script en PyCharm y lo ejecutamos. Más errores. Se lo comunicamos a Gemini adjuntando de nuevo los registros de la ejecución:
![]() |
La respuesta de Gemini:
![]() |
![]() |
![]() |
Cargamos este nuevo script en PyCharm y lo ejecutamos. Esta vez, las 11 pruebas unitarias se superan:
El código generado por Gemini es el siguiente:
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 | |
Una vez más, no he revisado este código. Simplemente he comprobado que superaba las 11 pruebas con éxito.
Pero puede que nos interese conocer su razonamiento, especialmente en los casos particulares del cálculo del impuesto. Se le pregunta:
![]() |
Se trata de un caso de ingresos elevados con un posible límite máximo de la deducción del 10 % y un posible límite máximo del coeficiente familiar.
La respuesta de Gemini es la siguiente:
![]() |
![]() |
![]() |
![]() |
![]() |
Estas dos últimas capturas de pantalla son interesantes. Gemini utiliza un método de cálculo diferente al explicado en el PDF. De hecho, este método de cálculo se puede encontrar en Internet. Ambos métodos son equivalentes.
![]() |
![]() |
La explicación destaca por su claridad. Se podría entregar tal cual a los estudiantes para explicar el método de cálculo del impuesto.
Ahora tomemos otro ejemplo, esta vez con ingresos bajos. En este caso, puede haber una bonificación y una reducción:
![]() |
La respuesta de Gemini es la siguiente:
![]() |
![]() |
![]() |
![]() |
![]() |
Aquí vemos que Gemini aplica una regla que no está en el PDF. Probablemente la haya encontrado en Internet, pero ¿es fiable la fuente?
![]() |
Aquí, Gemini sigue aplicando una regla desconocida (la regla especial mencionada anteriormente).
![]() |
![]() |
![]() |
Por lo tanto, los resultados de Gemini coinciden con el resultado del simulador oficial de impuestos. Pero ha utilizado una regla que no aparece en el PDF. ¿Dónde está el error? Se lo preguntamos adjuntándole el PDF:
![]() |
La respuesta de Gemini:
![]() |
![]() |
![]() |
![]() |
Creo que Gemini tiene razón y que mi PDF es erróneo. Para verificarlo, le pido que haga una prueba:
- Donde su razonamiento daría los mismos resultados que el simulador fiscal oficial;
- Donde el razonamiento del PDF le daría resultados diferentes a los del simulador;
![]() |
La respuesta de Gemini es la siguiente:
![]() |
Aquí Gemini se equivoca. He ejecutado el simulador con este ejemplo y he obtenido lo siguiente:
![]() |
Sin embargo, veremos que el razonamiento de Gemini da efectivamente los resultados anteriores. Continuamos:
![]() |
![]() |
![]() |
![]() |
Muy bien. Tomamos nota. Continuamos:
![]() |
![]() |
![]() |
![]() |
Así pues, Gemini ha calculado (impuesto, descuento, reducción) = (431, 325, 1296), mientras que el simulador que yo he utilizado da como resultado (431, 324, 1297). Por lo tanto, Gemini ha obtenido los resultados correctos con una diferencia de 1 euro, pero no lo sabe. Se lo indicamos:
![]() |
Gemini responde:
![]() |
![]() |
Ahora nos preguntamos si Gemini podría generar un PDF corregido:
![]() |
La respuesta de Gemini:
![]() |
Así pues, Gemini no me ha proporcionado un enlace a un PDF, pero ha generado un texto para que yo mismo genere ese PDF. Aunque resulte un poco pesado incluir aquí las capturas de pantalla del PDF, lo hago para que el lector vea el aspecto generativo del IA:
![]() |













Sinceramente, no he comprobado si todo lo que se dice en este PDF es cierto. En cualquier caso, es un documento perfecto para un TD, generado en unos segundos.
No obstante, podemos hacer que el propio Gemini compruebe que su PDF es correcto. Iniciamos una nueva conversación:
![]() |
- en [1], hemos puesto el PDF generado por Gemini [Le problème selon Gemini.pdf];
- en [2], [instructionsAvecPDF2.txt] es idéntico a las instrucciones de [instructionsAvecPDF.txt], salvo que se ha añadido una duodécima prueba unitaria, la misma que demostró que el PDF inicial era erróneo:
Curiosamente, fueron necesarias varias idas y venidas antes de que Gemini generara el script correcto:
Pregunta 2
![]() |
Pregunta 3
![]() |
Como ya se ha hecho varias veces, cuando el script generado y cargado en PyCharm falla, se le proporciona a Gemini el archivo de texto con los registros de la ejecución. Gemini los entiende perfectamente.
Pregunta 4
![]() |
Pregunta 5
![]() |
Pregunta 6 y fin
![]() | ![]() |
Ahora estamos seguros de la validez del PDF generado por Gemini. Las reglas de cálculo que se indican en él son correctas.
Ahora haremos lo mismo con los otros cinco IA, pero seremos muy breves en nuestras explicaciones, salvo en el caso de ChatGPT, el IA líder en este momento. Lo que nos interesa es saber si el IA resuelve o no los tres problemas que se le plantean. De hecho, las interfaces de todos estos IA son muy similares y he procedido con ellos igual que con Gemini. Se anima al lector a volver a reproducir las conversaciones de Gemini con el IA de su elección.


















































































