4. حل المشكلات الثلاث باستخدام Google Gemini
سنقدم لقطات شاشة لجلسات Gemini الثلاث التي سمحت بحل المشكلات الثلاث المطروحة. وسندخل في التفاصيل بشكل كافٍ. وبمجرد الانتهاء من ذلك، لن نكرر العملية بالنسبة للاختبارات الأخرى التي تم إجراؤها. فهي تعمل بطريقة مماثلة. وسنكتفي بتقديم التفاصيل البارزة فقط.
4.1. مقدمة
نذكر لقطة الشاشة الأولى لـ Gemini التي تم عرضها سابقًا:
![]() |
- في [1]، نسخة Gemini من URL؛
- في [2]، نسخة Gemini المستخدمة؛
- في [3-5]، المشاكل الثلاث التي طُرحت على Gemini؛
Gemini هو منتج من Google متاح على URL [https://gemini.google.com/]. للحصول على سجل لجلسات الأسئلة والأجوبة الخاصة بك كما هو موضح أعلاه، يتعين عليك إنشاء حساب. بالإضافة إلى ذلك، مثل جميع الخدمات الأخرى التي تم اختبارها، يحدد Gemini عدد الأسئلة وعدد الملفات التي يمكن تحميلها. وعند بلوغ هذا الحد، تنتهي الجلسة ويُعرض عليك متابعتها لاحقًا. ونظرًا لأن التوقف في منتصف الجلسة أمر مثير للإحباط إلى حد ما، فقد اشتركت في الخدمة. لحسن الحظ، الشهر الأول من اشتراك Gemini مجاني. وقد فعلت الشيء نفسه مع أدوات IA الأخرى التي كانت تفرض هذه القيود، وهي ChatGPT وMistralAI وClaudeAI. اشتركت في اشتراك لمدة شهر واحد، لكن في هذه الحالة كان الشهر الأول مدفوعًا. لم أواجه أي قيود مع Grok. لا يعلن DeepSeek عن أي قيود، لكنه يرد أحيانًا بـ [Server busy] ويقطع الجلسة. وهذا يعادل فرض قيود دون الإعلان عنها.
فيما يلي، سأتحدث عن «جلسة الأسئلة والأجوبة»، والتي سأختصرها إلى «جلسة» فقط. غالبًا ما يستخدم مستخدمو IA المصطلح الإنجليزي «chat» (محادثة) أو «conversation» (حوار).
واجهة Gemini لطرح سؤال هي كما يلي:
![]() | ![]() |
- في [1]، سؤالك؛
- في [2]، الرمز الذي يطلق IA لحساب الإجابة؛
- في [3-4]، يمكنك إرفاق الملفات؛
4.2. المسألة 1
الجلسة الخاصة بالمشكلة 1 هي كما يلي:
![]() |
- في [1]، السؤال؛
- في [2]، بداية إجابة Gemini؛
وتأتي بقية الإجابة على النحو التالي:
![]() |
![]() |
![]() |
![]() |
الإجابة صحيحة. وستعطي الإجابات الخمس الأخرى IA الإجابة الصحيحة أيضًا بشكل مشابه.
4.3. المسألة 2
4.3.1. مقدمة
نذكر هنا المسألة الأصلية للدورة التدريبية [python3-flask-2020]. وهو نص مُقدَّم في TD للطلاب.
![]() |
يسمح الجدول أعلاه بحساب الضريبة في الحالة المبسطة للمكلف الذي لا يعلن سوى راتبه الوحيد. وكما تشير الملاحظة (1)، فإن الضريبة المحسوبة بهذه الطريقة هي الضريبة قبل تطبيق الآليات الثلاث التالية:
- تحديد سقف للحصة العائلية الذي ينطبق على ذوي الدخل المرتفع؛
- الخصم والتخفيض الضريبي اللذين ينطبقان على الدخل المنخفض؛
وبالتالي، يتضمن حساب الضريبة الخطوات التالية [http://impotsurlerevenu.org/comprendre-le-calcul-de-l-impot/1217-calcul-de-l-impot-2019.php]:
![]() |
نقترح كتابة برنامج يسمح بحساب الضريبة المستحقة على المكلف في عام 2019 في الحالة المبسطة للمكلف الذي لا يعلن سوى راتبه الوحيد.
4.3.1.1. حساب الضريبة الإجمالية
يمكن حساب الضريبة الإجمالية بالطريقة التالية:
نحسب أولاً عدد الحصص الخاصة بالمكلف:
- يُحسب لكل والد حصة واحدة؛
- يُحسب لكل من الطفلين الأولين نصف حصة؛
- يحصل كل طفل من الأطفال التاليين على حصة واحدة:
وبالتالي، فإن عدد الحصص هو:
- nbParts=1+nbEnfants*0,5+(عدد_الأطفال-2)*0,5 إذا كان الموظف غير متزوج؛
- nbParts=2+nbEnfants*0,5+(nbEnfants-2)*0,5 إذا كان متزوجًا؛
- حيث nbEnfants هو عدد أطفاله؛
- يُحسب الدخل الخاضع للضريبة R=0.9*S حيث S هو الراتب السنوي؛
- يُحسب الحصّة العائلية QF=R/nbParts؛
- يُحسب الضريبة الإجمالية I بناءً على البيانات التالية (2019):
9964 | 0 | 0 |
27519 | 0.14 | 1394.96 |
73779 | 0.3 | 5798 |
156244 | 0.4 | 13913.69 |
0 | 0.45 | 20163.45 |
يحتوي كل سطر على 3 حقول: champ1، champ2، champ3. لحساب الضريبة I، نبحث عن السطر الأول الذي يكون فيه QF <= الحقل 1 ونأخذ قيم هذا السطر. على سبيل المثال، بالنسبة لموظف متزوج ولديه طفلان وراتب سنوي S يبلغ 50000 يورو:
الدخل الخاضع للضريبة: R=0,9*S=45000
عدد الحصص: nbParts=2+2*0,5=3
الحصة العائلية: QF=45000/3=15000
السطر الأول الذي يكون فيه QF <= الحقل 1 هو التالي:
وبالتالي، فإن الضريبة I تساوي 0.14*R – 1394,96*nbParts = [0,14*45000-1394,96*3] = 2115. ويتم تقريب الضريبة إلى أقرب يورو أقل.
إذا كانت العلاقة QF <= حقل1 صحيحة منذ السطر الأول، فإن الضريبة تكون صفرًا.
إذا كان QF بحيث لا تتحقق العلاقة QF<=champ1 أبدًا، فسيتم استخدام معاملات السطر الأخير. هنا:
مما يعطي الضريبة الإجمالية I=0.45*R – 20163,45*nbParts.
4.3.1.2. الحد الأقصى للمنحة العائلية
![]() |
لمعرفة ما إذا كان الحد الأقصى لحصة الأسرة QF ينطبق، نعيد حساب الضريبة الإجمالية بدون احتساب الأطفال. وبالنسبة للموظف المتزوج الذي لديه طفلان وراتب سنوي S يبلغ 50000 يورو:
الدخل الخاضع للضريبة: R=0,9*S=45000
عدد الحصص: nbParts=2 (لم يعد يتم احتساب الأطفال)
الحصة العائلية: QF=45000/2=22500
السطر الأول الذي يكون فيه QF <= الحقل 1 هو التالي:
وبالتالي، فإن الضريبة I تساوي 0.14*R – 1394,96*nbParts=[0,14*45000-1394,96*2]=3510.
الربح الأقصى المرتبط بالأطفال: 1551 * 2 = 3102 يورو
الضريبة الدنيا: 3510 - 3102 = 408 يورو
الضريبة الإجمالية مع حصتين، التي تم حسابها بالفعل في الفقرة السابقة، وهي 2115 يورو، تزيد عن الضريبة الدنيا البالغة 408 يورو، وبالتالي لا ينطبق سقف الضريبة العائلية في هذه الحالة.
بشكل عام، الضريبة الإجمالية تساوي (الضريبة 1، الضريبة 2) حيث:
- [impôt1]: هو الضريبة الإجمالية المحسوبة مع الأطفال؛
- [impôt2]: هو الضريبة الإجمالية المحسوبة بدون احتساب الأطفال، مطروحًا منها الحد الأقصى للزيادة (وهو هنا 1551 يورو لكل نصف حصة) المرتبطة بالأطفال؛
4.3.1.3. حساب الخصم
![]() |
بالنسبة للموظف المتزوج ولديه طفلان ويبلغ راتبه السنوي S 50000 يورو:
الضريبة الإجمالية (2115 يورو) الناتجة عن الخطوة السابقة أقل من 2627 يورو للزوجين (1595 يورو للعازب): وبالتالي يُطبق الخصم. ويتم حسابه بالصيغة التالية:
التخفيض = الحد الأدنى (للزوجين = 1970 / للعازب = 1196) - 0,75 * الضريبة الإجمالية
الخصم = 1970 - 0,75 × 2115 = 383,75، مقربًا إلى 384 يورو.
الضريبة الإجمالية الجديدة = 2115 - 384 = 1731 يورو
يجب مراعاة قاعدتين عند حساب الخصم (واجهت بعض أدوات IA صعوبة في هذه المسألة):
- لا يمكن أن يكون الخصم سالبًا؛
- لا يمكن أن يكون الخصم أكبر من الضريبة المحسوبة بالفعل؛
4.3.1.4. حساب التخفيض الضريبي
![]() |
تحت حد معين، يتم تطبيق تخفيض بنسبة 20% على الضريبة الإجمالية الناتجة عن الحسابات السابقة. في عام 2019، كانت الحدود كما يلي:
- الأعزب: 21037 يورو؛
- الزوجان: 42074 يورو؛ (يبدو أن الرقم 37968 المستخدم في المثال أعلاه خاطئ)؛
يُضاف إلى هذا الحد القيمة التالية: 3797 * (عدد نصف الحصص التي يضيفها الأبناء).
وبالنسبة للموظف المتزوج ولديه طفلان وراتب سنوي S يبلغ 50000 يورو:
- دخله الخاضع للضريبة (45000 يورو) أقل من الحد الأدنى (42074+2*3797)=49668 يورو؛
- وبالتالي يحق له الحصول على تخفيض بنسبة 20٪ من ضريبته: 1731 * 0,2 = 346,2 يورو، مقربًا إلى 347 يورو؛
- يصبح الضريبة الإجمالية للمكلف: 1731 - 347 = 1384 يورو؛
4.3.1.5. حساب الضريبة الصافية
سيتوقف حسابنا عند هذا الحد: سيكون صافي الضريبة المستحقة الدفع 1384 يورو. في الواقع، يمكن للمكلف الاستفادة من تخفيضات أخرى، لا سيما تلك المتعلقة بالتبرعات المقدمة إلى المنظمات ذات المنفعة العامة أو العامة.
4.3.1.6. حالة ذوي الدخل المرتفع
المثال السابق ينطبق على غالبية حالات الموظفين. ومع ذلك، يختلف حساب الضريبة في حالة أصحاب الدخل المرتفع.
4.3.1.6.1. الحد الأقصى للتخفيض بنسبة 10% على الدخل السنوي
في معظم الحالات، يتم حساب الدخل الخاضع للضريبة بالصيغة التالية: R=0,9*S حيث S هو الراتب السنوي. ويُطلق على ذلك اسم التخفيض بنسبة 10٪. ويخضع هذا التخفيض لسقف أقصى. في عام 2019:
- لا يمكن أن يتجاوز 12502 يورو؛
- لا يمكن أن يقل عن 437 يورو؛
لنأخذ مثالاً لموظف غير متزوج وليس لديه أطفال ويبلغ راتبه السنوي 200000 يورو:
- يبلغ التخفيض بنسبة 10% ما مقداره 20000 يورو > 12502 يورو. وبالتالي، يتم تخفيضه إلى 12502 يورو؛
4.3.1.6.2. الحد الأقصى للمعامل الأسري
لنأخذ حالة ينطبق فيها الحد الأقصى للمعامل الأسري المذكور في الفقرة |الحد الأقصى للمعامل الأسري|. لنأخذ مثال زوجين لديهما ثلاثة أطفال ودخل سنوي قدره 100000 يورو. لنستعرض خطوات الحساب:
- الخصم بنسبة 10٪ هو 100000 يورو < 12502 يورو. وبالتالي، فإن الدخل الخاضع للضريبة R يساوي 100000 - 10000 = 90000 يورو؛
- يمتلك الزوجان nbParts = 2 + 0,5*2 + 1 = 4 حصص؛
- وبالتالي، فإن نصيب الأسرة هو QF = R/nbParts = 90000/4 = 22500 يورو؛
- ضريبه الإجمالي I1 مع وجود أطفال هو I1=0,14*90000-1394,96*4= 7020 يورو؛
- ضريبته الإجمالية I2 بدون أطفال:
- QF = 90000/2 = 45000 يورو؛
- I2=0,3*90000-5798*2=15404 يورو؛
- تنص قاعدة الحد الأقصى للحصة العائلية على أن المكسب الناتج عن وجود أطفال لا يمكن أن يتجاوز (1551 × 4 نصف حصص) = 6204 يورو. لكن في هذه الحالة، يبلغ المكسب I2-I1 = 15404 - 7020 = 8384 يورو، وهو بذلك أعلى من 6204 يورو؛
- وبالتالي، يُعاد حساب الضريبة الإجمالية على النحو التالي: I3 = I2-6204 = 15404 - 6204 = 9200 يورو؛
- وبما أن I3 > I1، فسيتم الاحتفاظ بالضريبة I3؛
لن يحصل هذا الزوج على أي خصم أو تخفيض، وستكون ضريبتهما النهائية 9200 يورو.
4.3.1.7. الأرقام الرسمية
يعد حساب الضريبة أمرًا معقدًا. وستُجرى الاختبارات طوال هذا المستند باستخدام الأمثلة التالية. النتائج مأخوذة من أداة المحاكاة الخاصة بإدارة الضرائب |https://www3.impots.gouv.fr/simulateur/calcul_impot/2019/simplifie/index.htm|:
المكلف | النتائج الرسمية | نتائج الخوارزمية الواردة في الوثيقة |
زوجان ولديهما طفلان ودخلهما السنوي 55555 يورو | الضريبة = 2815 يورو معدل الضريبة = 14% | الضريبة = 2814 يورو معدل الضريبة = 14% |
زوجان ولديهما طفلان ودخلهما السنوي 50000 يورو | الضريبة = 1385 يورو الخصم = 384 يورو التخفيض = 346 يورو معدل الضريبة = 14% | الضريبة = 1384 يورو الخصم = 384 يورو الخصم = 347 يورو معدل الضريبة = 14% |
زوجان لديهما 3 أطفال ودخل سنوي يبلغ 50000 يورو | الضريبة = 0 يورو الخصم = 720 يورو الخصم = 0 يورو معدل الضريبة = 14% | الضريبة = 0 يورو الخصم = 720 يورو الخصم = 0 يورو معدل الضريبة = 14% |
أعزب ولديه طفلان ودخله السنوي 100000 يورو | الضريبة = 19884 يورو الخصم = 0 يورو الخصم = 0 يورو معدل الضريبة = 41% | الضريبة = 19884 يورو الزيادة = 4480 يورو الخصم = 0 يورو الخصم = 0 يورو معدل الضريبة = 41% |
أعزب ولديه 3 أطفال ودخل سنوي قدره 100000 يورو | الضريبة = 16782 يورو الخصم = 0 يورو الخصم = 0 يورو معدل الضريبة = 41% | الضريبة = 16782 يورو الزيادة = 7176 يورو الخصم = 0 يورو الخصم = 0 يورو معدل الضريبة = 41% |
زوجان لديهما 3 أطفال ودخل سنوي قدره 100000 يورو | الضريبة = 9200 يورو الخصم = 0 يورو الخصم = 0 يورو معدل الضريبة = 30% | الضريبة = 9200 يورو الزيادة = 2180 يورو الخصم = 0 يورو الخصم = 0 يورو معدل الضريبة = 30% |
زوجان لديهما 5 أطفال ودخل سنوي قدره 100000 يورو | الضريبة = 4230 يورو الخصم = 0 يورو الخصم = 0 يورو معدل الضريبة = 14% | الضريبة = 4230 يورو الخصم = 0 يورو الخصم = 0 يورو معدل الضريبة = 14% |
أعزب بدون أطفال ودخل سنوي قدره 100000 يورو | الضريبة = 22986 يورو الخصم = 0 يورو الخصم = 0 يورو معدل الضريبة = 41% | الضريبة = 22986 يورو الزيادة = 0 يورو الخصم = 0 يورو الخصم = 0 يورو معدل الضريبة = 41% |
زوجان ولديهما طفلان ودخلهما السنوي 30000 يورو | الضريبة = 0 يورو الخصم = 0 يورو الخصم = 0 يورو معدل الضريبة = 0% | الضريبة = 0 يورو الخصم = 0 يورو الخصم = 0 يورو معدل الضريبة = 0% |
أعزب بدون أطفال ودخل سنوي قدره 200000 يورو | الضريبة = 64211 يورو الخصم = 0 يورو الخصم = 0 يورو معدل الضريبة = 45% | الضريبة = 64210 يورو الزيادة = 7498 يورو الخصم = 0 يورو الخصم = 0 يورو معدل الضريبة = 45% |
زوجان لديهما 3 أطفال ودخل سنوي يبلغ 200000 يورو | الضريبة = 42843 يورو الخصم = 0 يورو الخصم = 0 يورو معدل الضريبة = 41% | الضريبة = 42842 يورو الزيادة = 17283 يورو الخصم = 0 يورو الخصم = 0 يورو معدل الضريبة = 41% |
فيما سبق، يُطلق مصطلح «الزيادة» على المبلغ الإضافي الذي يدفعه أصحاب الدخل المرتفع بسبب ظاهرتين:
- تحديد سقف للخصم بنسبة 10% على الدخل السنوي؛
- وضع حد أقصى للمعامل الأسري؛
لم يتسن التحقق من هذا المؤشر لأن أداة المحاكاة الخاصة بإدارة الضرائب لا توفره.
نلاحظ أن الخوارزمية الواردة في الوثيقة تعطي ضريبة صحيحة في كل مرة، مع هامش خطأ يبلغ 1 يورو. وينشأ هامش الخطأ هذا عن عمليات التقريب. فجميع المبالغ المالية يتم تقريبها أحيانًا إلى اليورو الأعلى، وأحيانًا إلى اليورو الأدنى. ونظرًا لعدم معرفتي بالقواعد الرسمية، فقد تم تقريب المبالغ النقدية الواردة في خوارزمية الوثيقة على النحو التالي:
- إلى اليورو الأعلى بالنسبة للخصومات والتخفيضات؛
- إلى اليورو الأدنى بالنسبة للزيادة الضريبية والضريبة النهائية؛
سنطلب من IA إجراء حساب الضريبة هذا.
4.3.2. إعداد جلسة عمل Gemini
يُرفق بالسؤال الموجه إلى Gemini ملفان:
![]() |
- في ملف [1]، تم إدراج الحساب الذي تم تفصيله للتو في ملف PDF الذي تم تقديمه إلى Gemini. سيجد Gemini فيه القواعد الدقيقة للحساب المبسط للضريبة لعام 2019 على دخل عام 2018؛
- في ملف [2]، توجد تعليماتنا؛
- في ملف [3] لتشغيل ملف IA؛
تعليماتنا الواردة في الملف النصي [instructionsAvecPDF.txt] هي كما يلي:
هذه التعليمات هي نتيجة لعدد كبير جدًا من الأسئلة التي طُرحت على Gemini. وسرعان ما ندرك أن ملف IA يجب أن يكون محددًا بدقة إذا أردنا الحصول على ما نريد. وبسبب كل هذه المحاولات المتعثرة، تم إيقاف جلسة Gemini في النهاية لتجاوزها الحدود المسموح بها. دعونا ندرس بقية هذه التعليمات:
- السطر 1: نطلب أن تكون المحادثة باللغة الفرنسية. هذه الإشارة موجهة إلى DeepSeek الذي كان يميل إلى التحدث باللغة الإنجليزية؛
- السطر 3: ما نريده؛
- السطر 5: يُطلب من IA استخدام PDF الذي تم تزويده به؛
- الأسطر 7-14: عدد من النصائح المفيدة خاصةً للمشكلة 3 بدون PDF. فقدت عدة IA أثناء حساب الضريبة؛
- الأسطر 15-44: الاختبارات الفردية الـ 11 التي نريد تضمينها في البرنامج النصي الذي سيتم إنشاؤه. وعندما يتم إنشاء البرنامج النصي، سنقوم بتنفيذه في PyCharm وسنرى ما إذا كانت الاختبارات الـ 11 ستنجح أم لا؛
- الأسطر 46-53: بدون هذه التعليمات، كان IA يُنشئ اختبارات وحدة تبحث عن نتائج محددة بالضبط، مما يؤدي إلى فشل الاختبارات؛
- الأسطر 55-56: أطلب من IA عدم الاتصال بالإنترنت. الحل الأبسط هو استخدام PDF؛
- السطران 58-59: لم يتبع IA هذه التعليمات. اضطررت إلى كتابتها صراحةً في سؤال، عندما لاحظت أن أحد الاختبارات قد فشل؛
- الأسطر 61-65: أشير إلى نوع البرنامج النصي لـ Python الذي أريده؛
- الأسطر 67-69: كنتُ أفضّل وجود رابط لتنزيل البرنامج النصي الذي تم إنشاؤه لأن عرض الكود على الشاشة يستغرق وقتًا. وتبين أن معظم IA لا يعرفون كيفية القيام بذلك. فالروابط المقدمة لم تكن تعمل؛
- الأسطر 71-72: كنت أرغب في معرفة الوقت الذي استغرقته أداة IA للإجابة على السؤال. لم تتمكن سوى أداة Gemini من تزويدي بهذه المعلومة. أما أجهزة IA الأخرى، فإما أنها لم تستجب لهذه التعليمات، أو أنها قدمت أرقامًا عشوائية مما يدل على أنها لم تفهم هذه التعليمات؛
4.3.3. رد «جيميني»
كان الرد الأول من Gemini كما يلي:
![]() |
- في [1-4]، يقدم Gemini روابط إلى الجزء من PDF أو الملف النصي للتعليمات التي يستخدمها في وقت معين؛
ويأتي ما يلي بعد ذلك:
![]() |
- في [1]، يؤكد Gemini أنه نفذ الاختبارات الوحدوية الـ 11 بنجاح. وقد أكد معظم ملفات IA ذلك أيضًا فيما يتعلق بالمشكلة 2 والمشكلة 3، وغالبًا ما كان البرنامج النصي الذي تم إنشاؤه لا يعمل عند تحميله. لذا يجب توخي الحذر من هذا التأكيد. بالنسبة لـ Gemini، سيثبت صحة هذا الأمر؛
- في [2]، رابط سيتبين أنه لا يعمل؛
- في [3]، لم تقدم سوى Gemini وقتًا واقعيًّا للتنفيذ؛
لذا فإن الرابط [2] لا يعمل. نبلغ Gemini بذلك:
![]() |
رد Gemini:
![]() |
- في [1]، البرنامج النصي Python الذي أنشأته Gemini؛
نقوم بتحميل هذا البرنامج النصي في PyCharm ونقوم بتنفيذه:
![]() |
- في [1]، [gemini1] هو البرنامج النصي الذي أنشأته Gemini؛
عند تشغيل البرنامج النصي، تظهر أخطاء في الترجمة:
"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
- السطر 30، خطأ الترجمة. [cite_start] هو علامة لإنشاء شكل معين من النص؛
نضع السجلات المذكورة أعلاه في ملف [logs gemini1.txt] ونقدمه إلى Gemini:
![]() |
وتكون استجابة Gemini كما يلي:
![]() |
عند تحميله في ملف PyCharm، يؤدي تشغيل البرنامج النصي الجديد إلى ظهور نفس الخطأ بالضبط. نبلغ Gemini بذلك من خلال تزويده مرة أخرى بسجلات التشغيل:
![]() |
وكانت استجابة Gemini كما يلي:
![]() |
هذه المرة نجح الأمر. اجتازت الاختبارات الفردية الـ 11 بنجاح. أبلغنا Gemini بذلك:
فأجاب:
![]() |
اتبع البرنامج النصي الذي أنشأه جيميني التعليمات الواردة في الملف النصي [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 | |
لم أتحقق من هذا الكود. وبما أن الاختبارات الفردية الـ 11 قد نجحت، فأنا أعتبره «صحيحًا على الأرجح». لم أفعل شيئًا أكثر من التحقق من هذه الاختبارات الـ 11 بالنسبة لكودي الخاص.
4.4. المشكلة 3
المشكلة 3 مطابقة للمشكلة 2، باستثناء أنه لم يعد يتم تزويد IA بـ PDF الذي كان يحدد قواعد الحساب التي يجب اتباعها.
السؤال الأولي الموجه إلى Gemini هو التالي:
![]() |
ملف التعليمات [1] مطابق تقريبًا لملف المشكلة رقم 2، مع الاختلافات التالية:
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 :
…
- في السؤال [3]، يُطلب منه البحث على الإنترنت عن قواعد حساب ضريبة عام 2019 على دخل عام 2018. وهذا تمرين أصعب من السابق؛
ولن أورد أدناه سوى أجزاء من الإجابة الأولى التي قدمها «جيميني»:
![]() |
![]() |
الوقت المقدر معقول. ننتظر إجابة جيميني لفترة طويلة.
وكما في المرة السابقة، قدم «جيميني» رابطًا لتنزيل البرنامج النصي الذي تم إنشاؤه، وهو رابط لا يعمل. وقد أبلغناه بذلك:
![]() |
رد «جيميني»:
![]() |
نقوم بتحميل البرنامج النصي في PyCharm تحت اسم [gemini2]:
![]() |
نقوم بتنفيذه و... لا يعمل. سجلات التنفيذ هي كما يلي:
"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
- السطر 11، فشل أحد الاختبارات؛
- السطران 25 و42: نفس خطأ الترجمة؛
نضع سجلات التشغيل هذه في ملف نصي ونرسله إلى Gemini:
![]() |
رد Gemini:
![]() |
![]() |
نقوم بتحميل البرنامج النصي في PyCharm ونقوم بتنفيذه. تظهر أخطاء مرة أخرى. نبلغ Gemini بذلك مع إرفاق سجلات التنفيذ مرة أخرى:
![]() |
رد Gemini:
![]() |
![]() |
![]() |
نقوم بتحميل هذا البرنامج النصي الجديد في PyCharm ونقوم بتنفيذه. هذه المرة، نجحت الاختبارات الفردية الـ 11:
الرمز الذي أنشأته Gemini هو التالي:
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 | |
مرة أخرى، لم أتفحص هذا الكود. لقد لاحظت ببساطة أنه اجتاز الاختبارات الـ 11 بنجاح.
ولكن قد يثير الفضول معرفة المنطق الكامن وراءه، لا سيما في الحالات الخاصة بحساب الضريبة. نسأله عن ذلك:
![]() |
هذه حالة دخل مرتفع تتضمن في آن واحد حدًا أقصى محتملًا للخصم بنسبة 10٪ وحدًا أقصى محتملًا للحصّة العائلية.
إجابة «جيميني» هي كما يلي:
![]() |
![]() |
![]() |
![]() |
![]() |
هاتان اللقطتان الأخيرتان مثيرتان للاهتمام. يستخدم Gemini طريقة حسابية مختلفة عن تلك الموضحة في PDF. ويمكن بالفعل العثور على هذه الطريقة الحسابية على الإنترنت. والطريقتان متكافئتان.
![]() |
![]() |
يتميز الشرح بوضوحه المذهل. يمكن تقديمه كما هو للطلاب لشرح طريقة حساب الضريبة.
والآن لنأخذ مثالاً آخر، هذه المرة مع دخل منخفض. في هذه الحالة، قد يكون هناك خصم وتخفيض:
![]() |
إجابة Gemini هي كما يلي:
![]() |
![]() |
![]() |
![]() |
![]() |
هنا، نلاحظ أن Gemini يطبق قاعدة غير موجودة في PDF. ربما عثر عليها على الإنترنت، لكن هل المصدر موثوق؟
![]() |
هنا، يواصل Gemini تطبيق قاعدة غير معروفة (القاعدة الخاصة المذكورة أعلاه).
![]() |
![]() |
![]() |
إذن، تتطابق نتائج Gemini مع نتيجة المحاكي الرسمي للضرائب. لكنه استخدم قاعدة غير موجودة في PDF. أين يكمن الخطأ؟ نسأله عن ذلك مع إرفاق PDF:
![]() |
رد Gemini:
![]() |
![]() |
![]() |
![]() |
أعتقد أن Gemini على حق وأن رمزي PDF خاطئ. للتحقق من ذلك، أطلب منه إجراء اختبار:
- حيث يعطي استنتاجه نفس النتائج التي يعطيها محاكي الضرائب الرسمي؛
- حيث ستؤدي طريقة حساب PDF إلى نتائج مختلفة عن تلك التي يقدمها المحاكي؛
![]() |
إجابة Gemini هي كما يلي:
![]() |
هنا يخطئ Gemini. لقد قمت بتشغيل المحاكي على هذا المثال ووجدت ما يلي:
![]() |
ومع ذلك، سنكتشف أن طريقة التفكير التي اتبعتها Gemini تؤدي بالفعل إلى النتائج المذكورة أعلاه. لنكمل:
![]() |
![]() |
![]() |
![]() |
حسناً. تم تدوين ذلك. لنكمل:
![]() |
![]() |
![]() |
![]() |
إذن، توصل برنامج Gemini إلى النتائج التالية: (الضريبة، الخصم، التخفيض) = (431، 325، 1296)، في حين أن المحاكي الذي استخدمته أنا أعطى النتائج التالية: (431، 324، 1297). لذا، فقد توصل برنامج Gemini إلى النتائج الصحيحة بفارق يورو واحد فقط، لكنه لا يدرك ذلك. لذا نخبره بذلك:
![]() |
يرد Gemini:
![]() |
![]() |
والآن، نتساءل عما إذا كان بإمكان «جيميني» توليد قيمة «PDF» مصححة:
![]() |
رد جيميني:
![]() |
لذلك لم يقدم لي Gemini رابطًا إلى ملف PDF، لكنه أنشأ نصًا لتمكيني من إنشاء ملف PDF بنفسي. على الرغم من أن عرض لقطات شاشة لـ PDF هنا قد يكون مرهقًا، إلا أنني أفعل ذلك حتى يرى القارئ الجانب التوليدي لـ IA:
![]() |













بصراحة، لم أتحقق مما إذا كان كل ما ورد في هذا الملف PDF صحيحًا. على أي حال، إنه مستند مثالي لملف TD، تم إنشاؤه في بضع ثوانٍ.
ومع ذلك، يمكننا أن نطلب من «جيميني» نفسه التحقق من صحة ملفه PDF. نبدأ محادثة جديدة:
![]() |
- في [1]، وضعنا PDF الذي أنشأه Gemini [Le problème selon Gemini.pdf]؛
- في [2]، [instructionsAvecPDF2.txt] مطابق لتعليمات [instructionsAvecPDF.txt]، باستثناء إضافة اختبار وحدة ثاني عشر، وهو نفس الاختبار الذي أظهر أن PDF الأصلي كان خاطئًا:
ومن الغريب أنه استغرق الأمر عدة محاولات ذهابًا وإيابًا قبل أن يقوم Gemini بإنشاء البرنامج النصي الصحيح:
السؤال 2
![]() |
السؤال 3
![]() |
وكما تم فعله عدة مرات حتى الآن، عندما يفشل البرنامج النصي الذي تم إنشاؤه وتحميله في PyCharm، نقدم لـ Gemini ملف نصي يحتوي على سجلات التنفيذ. ويفهم Gemini هذه السجلات جيدًا.
السؤال 4
![]() |
السؤال 5
![]() |
السؤال 6 والنهاية
![]() | ![]() |
الآن نحن مطمئنون إلى صحة الرمز PDF الذي أنشأته Gemini. قواعد الحساب الواردة فيه صحيحة.
سنقوم الآن بنفس الإجراء بالنسبة للملفات الخمسة الأخرى IA، لكننا سنكون موجزين جدًّا في تفسيراتنا، باستثناء ChatGPT وIA، اللذين يتصدران القائمة حاليًّا. ما يهمنا هو معرفة ما إذا كان IA يحل أم لا المشاكل الثلاث المطروحة عليه. في الواقع، واجهات جميع ملفات IA هذه متشابهة جدًّا، وقد تعاملت معها بنفس الطريقة التي تعاملت بها مع Gemini. نشجع القارئ على إعادة تشغيل محادثات Gemini باستخدام نموذج IA الذي يختاره.


















































































