> ## Content Index
> Fetch the complete content index at: https://arabroot.io/llms.txt
> Use this file to discover other available public pages before exploring further.

# أدوات التعليم في زمن الذكاء الاصطناعي: من الكشف إلى التصحيح
- URL: https://arabroot.io/articles/ادوات-التعليم-في-زمن-الذكاء-الاصطناعي/
- Published: 2026-10-13T09:00:00.000Z
- Updated: 2026-10-15T08:47:18.000Z
- Description: ما الذي تقدمه أدوات الكشف والمراقبة والمصححات الآلية والمساعدات للمقرر، وأين يجتاز الحل المولد المصحح الآلي.
- Author: فريق عرب رووت
- Tags: الأدلة التقنية, الاستضافة الذاتية والتطبيقات, التعليم, الاستضافة الذاتية, Moodle

في [المقال الأول من السلسلة](https://arabroot.io/articles/%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D8%A8%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D8%A7%D8%AE%D8%AA%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D8%AC%D8%A7%D9%85%D8%B9%D9%8A%D8%A9-%D9%81%D9%8A-%D8%B2%D9%85%D9%86-%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A/) وصلنا إلى أن الناتج النهائي للواجب لم يعد دليلاً على التعلم، وأن الحل في إعادة تصميم التقييم وليس في مطاردة الطلاب. وهنا يأتي السؤال العملي: ما هي الأدوات التي تساعد المعلم والجامعة على تنفيذ هذا التصميم؟ وما الذي تفعله كل أداة فعلاً، وما الذي لا تفعله مهما قال موقعها؟

المواضيع في السلسلة:

1. الواجبات والاختبارات الجامعية في زمن الذكاء الاصطناعي.
2. أدوات التعليم في زمن الذكاء الاصطناعي: من الكشف إلى التصحيح (الموضوع الحالي).
3. مساعد تدريس بالذكاء الاصطناعي لمقرر البرمجة: تجربة عملية على سيرفرك.

وسوف نناقش في هذا المقال ما يلي:

- خريطة الأدوات في خمس عائلات، وما الذي تقدمه كل عائلة.
- أدوات الكشف وحدودها باختصار، لأن تفاصيلها في المقال الأول.
- قفل جهاز الاختبار مع Safe Exam Browser، وأين يفيد وأين لا يفيد.
- تتبع العملية بسجل Git وسجل النسخ.
- المصححات الآلية مفتوحة المصدر، مع تجربة حقيقية لـ CodeRunner على Moodle، وكيف يجتاز حل كتبه نموذج ذكاء اصطناعي كل الاختبارات.
- مساعدات المقررات مثل CS50.ai وKhanmigo، والخيار الذي تشغله على سيرفرك.
- جدول للرخص والأسعار، وجدول يساعدك على اختيار ما يناسب مقررك.

## خريطة الأدوات

الأدوات التي تعرض على الجامعات في هذا الموضوع كثيرة، ولكنها تعود إلى خمس عائلات، ولكل عائلة سؤال واحد تجيب عنه. والصورة التالية تبين هذه العائلات:

![خمس بطاقات: كشف النص المولد مثل Turnitin وGPTZero ونتيجته احتمالية لا تصلح دليلاً، وقفل جهاز الاختبار مع Safe Exam Browser برخصة MPL-2.0 داخل القاعة، وتتبع العملية بسجل Git، والمصحح الآلي مثل CodeRunner مع Jobe وINGInious وAutolab الذي يتحقق أن الكود يعمل ولا يعرف من كتبه، ومساعد المقرر مثل CS50.ai وKhanmigo أو مساعد على سيرفرك](https://arabroot.io/content/images/2026/10/ai-education-tools-01-tools-map.webp)

كل عائلة تجيب عن سؤال مختلف، ولا توجد أداة واحدة تجيب عن سؤال «هل تعلم الطالب؟»

في الصورة أعلاه لاحظ أن الأسئلة مختلفة تماماً:

- **أداة الكشف** تسأل: هل يشبه هذا النص ما يولده النموذج؟
- **قفل الجهاز** يسأل: هل كان الطالب وحده مع الاختبار؟
- **تتبع العملية** يسأل: كيف وصل الطالب إلى هذا الناتج؟
- **المصحح الآلي** يسأل: هل الكود يعمل؟
- **المساعد** لا يقيس شيئاً، وإنما يحاول أن يساعد الطالب على التعلم بدلاً من أن يحل عنه.

## أدوات الكشف وحدودها

شرحنا في المقال الأول نتائج دراستين على أدوات كشف النص المولد AI Detectors، ونلخصهما هنا لأنهما تحددان مكان هذه العائلة في الخريطة:

- [دراسة Weber-Wulff وزملائها (2023)](https://doi.org/10.1007/s40979-023-00146-z?ref=arabroot.io) اختبرت 14 أداة منها Turnitin وGPTZero، ولم تتجاوز أي أداة دقة 80%، وأضعفت إعادة الصياغة والترجمة الآلية الأدوات بشكل كبير.
- [دراسة Liang وزملائه (2023)](https://arxiv.org/abs/2304.02819?ref=arabroot.io) وجدت أن سبع أدوات صنفت في المتوسط 61.22% من مقالات بشرية كتبها طلاب يكتبون الإنجليزية لغة ثانية على أنها مولدة.

والقاعدة العملية من ذلك أن نسبة الأداة سبب لمحادثة مع الطالب وليست دليلاً، ولذلك لا ننصح بشراء أداة كشف لمقررات البرمجة بالذات، والسبب أن الكود الصحيح لمسألة صغيرة يتشابه بطبيعته، وأن الطريقة الأرخص والأدق هي أن تسأل الطالب عن كوده.

## قفل جهاز الاختبار مع Safe Exam Browser

إذا كان جزء من الدرجة في الاختبار داخل القاعة، كما اقترحنا في المقال الأول، فالسؤال هو كيف تضمن أن الجهاز الذي يحل عليه الطالب لا يفتح نافذة محادثة في الخلفية. وأشهر أداة مفتوحة المصدر لهذا هي [Safe Exam Browser](https://safeexambrowser.org/about%5Foverview%5Fen.html?ref=arabroot.io)، واختصاراً SEB، وتصفها صفحتها الرسمية بأنها بيئة متصفح تحول أي كمبيوتر مؤقتاً إلى محطة عمل آمنة، وتتحكم في الوصول إلى وظائف النظام والمواقع والتطبيقات الأخرى أثناء الاختبار. وهذه أهم النقاط عنها:

- **المكونات:** تطبيق كشك Kiosk يقفل الجهاز، ومتصفح يتصل بنظام إدارة التعلم LMS، ويمكن السماح لتطبيق محدد بالعمل معه مثل بيئة برمجة إذا احتاجه الاختبار.
- **الربط مع Moodle:** قاعدة الوصول `quizaccess_seb` جزء من Moodle نفسه، وقد تأكدنا من وجودها في نسخة Moodle 5.3 التي نصبناها في التجربة أدناه، فتطلب من إعدادات الاختبار Quiz أن يفتح الاختبار من SEB فقط.
- **الخصوصية:** بحسب الصفحة الرسمية لا يتصل SEB بأي خدمة سحابية مركزية، ومكون SEB Server اختياري ويثبت على سيرفر الجامعة نفسها.
- **الرخصة:** رخصة MPL-2.0 بحسب مستودعي [نسخة Windows](https://github.com/SafeExamBrowser/seb-win-refactoring?ref=arabroot.io) و[SEB Server](https://github.com/SafeExamBrowser/seb-server?ref=arabroot.io) على GitHub.

وهل هذا يحل المشكلة؟ لا، والتفصيل فيما يلي: SEB يقفل الجهاز الذي أمام الطالب، ولا يقفل الهاتف الذي في جيبه، ولذلك هو أداة للاختبار داخل القاعة مع مراقب، وليس بديلاً عن المراقبة. ولا ننصح بأدوات المراقبة عن بعد Remote Proctoring التي تسجل كاميرا الطالب في بيته، والسبب أنها تجمع بيانات شخصية حساسة من بيوت الطلاب، وهذا يحتاج أساساً نظامياً واضحاً بحسب [نظام حماية البيانات الشخصية](https://dgp.sdaia.gov.sa/wps/portal/pdp/knowledgecenter/details/PDPL?ref=arabroot.io) في المملكة.

وسوف نشرح تثبيت SEB وإعداده مع Moodle خطوة بخطوة في مقال مستقل ضمن مرحلة التعليم الإلكتروني بإذن الله، فهو مدرج في خريطة الموقع بعنوان «الاختبارات الآمنة مع Safe Exam Browser».

## تتبع العملية بسجل Git

أبسط أداة لتتبع العملية في مقرر البرمجة هي Git نفسه، والطريقة أن يبدأ كل طالب الواجب من مستودع قالب Template Repository، ويرفع تغييراته على مراحل، ويسلم رابط المستودع وليس ملفاً. وما تحصل عليه من ذلك:

- تسلسل زمني للعمل، فالحل الذي ظهر كاملاً في Commit واحد قبل الموعد بدقائق يستحق سؤالاً في الدفاع الشفهي.
- رسائل الـ Commits نفسها، وهي تبين هل يفهم الطالب ما غيره.
- مادة جاهزة للأسئلة: لماذا غيرت هذه الدالة بين النسخة الثانية والثالثة؟

وقد شرحنا أساسيات Git في [مقال إدارة النسخ وGit للمبتدئين](https://arabroot.io/articles/%D8%A7%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D9%86%D8%B3%D8%AE-%D9%88-git-%D9%84%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86/). والجامعة التي تريد أن تبقى المستودعات على سيرفراتها يمكنها تشغيل Gitea أو GitLab داخلياً، وهو ما يذكره [مقال المصادر المفتوحة للجامعات](https://arabroot.io/articles/%D8%A7%D9%84%D9%85%D8%B5%D8%A7%D8%AF%D8%B1-%D8%A7%D9%84%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D9%84%D9%84%D8%AC%D8%A7%D9%85%D8%B9%D8%A7%D8%AA/) ضمن طبقة البحث.

⚠️

GitHub Classroom كان الأداة الأشهر لتوزيع الواجبات عبر مستودعات GitHub، ولكن [توثيق GitHub](https://docs.github.com/en/education/manage-coursework-with-github-classroom/get-started-with-github-classroom/about-github-classroom?ref=arabroot.io) يذكر أن التطبيق يغلق وسوف يتوقف في 28 أغسطس 2026، أي قبل كتابة هذا المقال بأسابيع، فلا تبن عليه مقرراً جديداً، وإذا كانت لديك بيانات فيه فالتوثيق نفسه فيه صفحة لتصديرها.

## المصححات الآلية مفتوحة المصدر

المصحح الآلي Autograder برنامج يشغل كود الطالب على اختبارات كتبها المعلم ويعطي الدرجة مباشرة، وهو الأداة التي جعلت مقررات البرمجة الكبيرة ممكنة أصلاً، لأن معلماً واحداً لا يستطيع أن يشغل كود 500 طالب كل أسبوع. والخيارات مفتوحة المصدر الأشهر:

- **CodeRunner:** نوع سؤال Question Type يضاف إلى Moodle، فيكتب الطالب الكود داخل اختبار Moodle العادي ويرى نتيجة الاختبارات فوراً، ويشغل الكود على سيرفر منفصل اسمه Jobe. وتذكر [صفحته الرسمية](https://coderunner.org.nz/?ref=arabroot.io) أنه مستخدم في قرابة 4000 موقع Moodle مسجل.
- **INGInious:** من جامعة Louvain في بلجيكا، يشغل كود الطالب داخل Container عبر Docker، ويمكن ربطه بـ Moodle أو edX مصححاً خارجياً.
- **Autolab:** بدأ في جامعة Carnegie Mellon، ويشغل التصحيح عبر خدمة اسمها Tango، ويعرض لوحة نتائج Scoreboard للطلاب.
- **nbgrader وOtter-Grader:** لواجبات Jupyter Notebooks في مقررات البيانات والعلوم.

واخترنا CodeRunner للتجربة لأن الجامعة التي تستخدم Moodle تضيفه دون نظام جديد، وقد شرحنا تثبيت Moodle نفسه في [دليل Moodle](https://arabroot.io/articles/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-moodle-%D9%85%D9%86%D8%B5%D8%A9-%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%B9%D9%84%D9%89-%D8%B3%D9%8A%D8%B1%D9%81%D8%B1%D9%83/). أما INGInious فيحتاج أن يتحكم في Docker على السيرفر ليشغل Container لكل تصحيح، وهذا يعني إعطاءه صلاحية واسعة على السيرفر، فهو يناسب سيرفراً مخصصاً له وليس سيرفراً مشتركاً مثل سيرفر تجاربنا.

## تجربة عملية: CodeRunner على Moodle

الهدف من التجربة سؤالان: كيف يصحح CodeRunner محاولة طالب حقيقية، وماذا يحدث عندما يلصق الطالب نص الواجب في نموذج ذكاء اصطناعي ويسلم ما يخرج منه. والصورة التالية تبين مكونات التجربة:

![الطالب يكتب الكود في سؤال CodeRunner داخل Moodle، وMoodle يرسل الكود إلى سيرفر Jobe على الشبكة الداخلية، وJobe يشغله ويعيد المخرج، وCodeRunner يقارنه بالمتوقع ويعطي الدرجة، وفي الجهة الأخرى نموذج qwen2.5:3b عبر Ollama يكتب الحل من نص الواجب](https://arabroot.io/content/images/2026/10/ai-education-tools-02-lab.webp)

كل شيء على سيرفر واحد: Moodle وقاعدة البيانات وسيرفر Jobe والنموذج المحلي الذي كتب الحل

### ملف Docker Compose

نبدأ من الإعداد نفسه الذي استخدمناه في دليل Moodle، ونضيف إليه خدمة Jobe من Docker Image الرسمية `trampgeek/jobeinabox`، والملف كاملاً كما يلي:

```yaml
name: lab-edu
services:
  db:
    image: postgres:17.11
    container_name: lab-edu-db
    environment:
      POSTGRES_DB: moodle
      POSTGRES_USER: moodle
      POSTGRES_PASSWORD: change-me-db
    volumes:
      - db:/var/lib/postgresql/data

  web:
    image: moodlehq/moodle-php-apache:8.3-bookworm@sha256:501f19fa75ad3cdc8962f2a742f39d179b8aa8ffdc2ff233d8d27a32f14e0e05
    container_name: lab-edu-web
    depends_on: [db, jobe]
    environment:
      PHP_INI-max_input_vars: "5000"
      PHP_INI-display_errors: "Off"
    ports:
      - "127.0.0.1:18481:80"
    volumes:
      - code:/var/www/html
      - data:/var/www/moodledata
      - ./moodle-router.conf:/etc/apache2/conf-enabled/moodle-router.conf:ro
      - ./:/lab:ro

  # Jobe runs the students' code in a sandbox; Moodle talks to it over the internal network only
  jobe:
    image: trampgeek/jobeinabox@sha256:b442c8e63f016ff33aa2b6f28c36abc8ebd30cbb39e8e025cadeec2107c5ce85
    container_name: lab-edu-jobe

volumes:
  db:
    name: lab-edu-db
  code:
    name: lab-edu-code
  data:
    name: lab-edu-data

networks:
  default:
    name: lab-edu-moodle
```

في الإعداد أعلاه لاحظ التالي:

- خدمة Jobe لا تنشر أي منفذ على السيرفر، فلا يصل إليها إلا Moodle عبر الشبكة الداخلية، والسبب أن Jobe يشغل أي كود يرسل إليه.
- Docker Images مثبتة ببصمة Digest، فالتجربة تعطي النتيجة نفسها إذا أعدتها.
- المجلد الحالي مربوط داخل Container على المسار `/lab` للقراءة فقط، لنستورد منه السؤال.

بعد ذلك نفك Moodle 5.3.0 في ال Volume، ونضع إضافتي CodeRunner في مجلد `public` لأن Moodle منذ الإصدار 5.1 ينقل الإضافات تحته:

```bash
curl -sL -o moodle.tgz https://github.com/moodle/moodle/archive/refs/tags/v5.3.0.tar.gz
curl -sL -o coderunner.tgz https://github.com/trampgeek/moodle-qtype_coderunner/archive/refs/tags/v5.10.6.tar.gz
curl -sL -o behaviour.tgz https://github.com/trampgeek/moodle-qbehaviour_adaptive_adapted_for_coderunner/archive/refs/tags/v1.4.8.tar.gz
docker volume create lab-edu-code
docker run --rm --name lab-edu-unpack -v "$PWD":/src:ro -v lab-edu-code:/var/www/html \
  --entrypoint sh moodlehq/moodle-php-apache:8.3-bookworm -c '
  tar xzf /src/moodle.tgz -C /var/www/html --strip-components=1 &&
  mkdir -p /var/www/html/public/question/type/coderunner /var/www/html/public/question/behaviour/adaptive_adapted_for_coderunner &&
  tar xzf /src/coderunner.tgz -C /var/www/html/public/question/type/coderunner --strip-components=1 &&
  tar xzf /src/behaviour.tgz -C /var/www/html/public/question/behaviour/adaptive_adapted_for_coderunner --strip-components=1 &&
  chown -R www-data:www-data /var/www/html'
docker compose up -d
```

ثم ننصب Moodle من سطر الأوامر بالأمر نفسه الذي شرحناه في دليل Moodle، ومن مخرج التنصيب الأسطر التي تخص الإضافتين:

```text
برنامج تنصيب مودل 5.3 (Build: 20261005) عبر سطر الأوامر النصية
...
-->qtype_coderunner
++ install.php: نجاح (2.03 ثوان) ++
...
-->qbehaviour_adaptive_adapted_for_coderunner
++ نجاح (0.17 ثوان) ++
...
تم التنصيب بنجاح.
```

### ثلاثة أشياء يجب ضبطها قبل أول سؤال

التنصيب نجح، ولكن السؤال لن يعمل بعد، وقد واجهنا ثلاث مشاكل بالترتيب.

**الأولى: نماذج الأسئلة لا تنصب إلا عبر Cron.** عند فتح معاينة السؤال ظهر الخطأ التالي:

```text
تم الكشف عن خطأ بالنص البرمجي ، يجب إصلاحه من قبل المبرمج : prototype_contexts: no system-level question bank found
```

والسبب أن CodeRunner في Moodle 5 ينشئ نماذج أنواع الأسئلة Prototypes بمهمة مؤجلة Adhoc Task تنتظر Cron، فإذا لم يكن Cron يعمل فلن تنشأ. والحل تشغيل Cron كما في دليل Moodle، أو تشغيل المهام المؤجلة مرة واحدة:

```bash
docker exec -u www-data lab-edu-web php /var/www/html/admin/cli/adhoc_task.php --execute
```

والمخرج سوف يكون كما يلي (الأسطر التي تخص CodeRunner):

```text
Execute adhoc task: qtype_coderunner\task\qtype_coderunner_setup_question_prototypes
Setting up CodeRunner question prototypes...
CodeRunner prototypes set up using qbank.
CodeRunner: creating new system question bank.
CodeRunner: replacing existing prototypes with new ones.
CodeRunner question prototypes successfully installed.
Adhoc task complete: qtype_coderunner\task\qtype_coderunner_setup_question_prototypes
```

**الثانية: CodeRunner يرسل الكود إلى جامعة Canterbury افتراضياً.** هذا أهم ما في التجربة من ناحية الخصوصية، فالإعداد الافتراضي لسيرفر Jobe ليس سيرفرك:

```bash
docker exec -u www-data lab-edu-web php /var/www/html/admin/cli/cfg.php --component=qtype_coderunner --name=jobe_host
```

```text
jobe2.cosc.canterbury.ac.nz
```

وهذه القيمة موجودة في كود الإضافة نفسه في [ملف constants.php](https://github.com/trampgeek/moodle-qtype%5Fcoderunner/blob/master/classes/constants.php?ref=arabroot.io)، وهو سيرفر تجريبي لجامعة Canterbury في نيوزيلندا، وهذا يعني أن أي جامعة تنصب CodeRunner ولا تغير الإعداد ترسل كود طلابها إلى سيرفر خارجي. والحل أن نوجهه إلى خدمة Jobe في ملف Compose:

```bash
docker exec -u www-data lab-edu-web php /var/www/html/admin/cli/cfg.php --component=qtype_coderunner --name=jobe_host --set=jobe
docker exec lab-edu-web curl -s http://jobe/jobe/index.php/restapi/languages
```

والأمر الثاني يسأل Jobe عن اللغات التي يشغلها، والمخرج سوف يكون كما يلي:

```json
[["c","15.2.0"],["cpp","15.2.0"],["java","25.0.4.1"],["nodejs","22.22.1"],["octave","Unknown"],["pascal","3.2.2"],["php","8.5.4"],["python3","3.14.4"]]
```

**الثالثة: حماية Moodle تمنع الوصول إلى الشبكة الداخلية.** عند أول محاولة ظهرت هذه الرسالة في نتيجة السؤال:

```text
فشل تشغيل الاختباراتفشل طلب مخدم Jobe.HTTP response from Jobe was -1: "" (curl error 0: تم حظر عنوان URL.)
```

والسبب أن Moodle يمنع افتراضياً اتصالات cURL بالعناوين الخاصة، وقائمة المنع الافتراضية تحتوي على النطاقات 10.0.0.0/8 و172.16.0.0/12 و192.168.0.0/16، وشبكة Docker عندنا كانت `192.168.112.0/20`. وفي الإنتاج اترك القائمة كما هي واحذف منها فقط النطاق الذي فيه سيرفر Jobe، وهذا ما فعلناه في التجربة:

```bash
docker exec -u www-data lab-edu-web php /var/www/html/admin/cli/cfg.php --name=curlsecurityblockedhosts \
  --set="$(printf '127.0.0.0/8\n10.0.0.0/8\n172.16.0.0/12\n0.0.0.0\nlocalhost\n169.254.169.254\n0000::1')"
```

⚠️

حذف نطاق من قائمة المنع يسمح لأي إضافة في Moodle بالاتصال بعناوين ذلك النطاق، فالأفضل في الإنتاج أن يكون Jobe في شبكة صغيرة خاصة به لا يوجد فيها غيره، بدلاً من فتح نطاق كامل فيه سيرفرات أخرى.

### السؤال ومحاولة الطالب

السؤال هو الواجب الثاني من مقررنا التجريبي: الدالة `top_words(text, n)` التي تعيد أكثر الكلمات تكراراً مع ترتيب أبجدي عند التساوي، وفيه سبعة اختبارات، أربعة ظاهرة للطالب وثلاثة مخفية. واستوردناه بسكربت PHP صغير موجود في ملفات التجربة يستخدم واجهة الاستيراد في Moodle، والمخرج كان كما يلي:

```text
++ تحليل الأسئلة من ملف الاستيراد. ++
++ يجري استيراد 1 أسئلة/سؤال من الملف ++
course=2 qbank_cmid=2 question=1 (HW2 top_words)
```

ثم كتبنا محاولة تشبه ما يكتبه طالب في أسبوعه الرابع، فهي تعمل على الحالة البسيطة وتنسى علامات الترقيم والترتيب عند التساوي:

```python
from collections import Counter

def top_words(text, n):
    words = text.lower().split()
    return Counter(words).most_common(n)
```

وسلمناها من معاينة السؤال، والصورة التالية تبين النتيجة:

![جدول نتائج CodeRunner لمحاولة الطالب: نجح أربعة اختبارات وفشل ثلاثة، هي الترتيب عند التساوي في b a c a b وعلامات الترقيم في Hello hello HELLO والترتيب في zeta alpha، والدرجة 5.71 من 10](https://arabroot.io/content/images/2026/10/ai-education-tools-03-student-attempt.webp)

أربعة اختبارات من سبعة، والدرجة 5.71 من 10، والصفوف الباهتة هي الاختبارات المخفية التي يراها المعلم في المعاينة فقط

والجدول نفسه كما قرأناه من الصفحة بسكربت التجربة، لأن واجهة Moodle العربية تعرض قوائم Python بترتيب معكوس كما سيأتي:

```text
 | الفحص | المتوقع | Got |
 | print(top_words('the cat and the hat', 1)) | [('the', 2)] | [('the', 2)] |
 | print(top_words('b a c a b', 2)) | [('a', 2), ('b', 2)] | [('b', 2), ('a', 2)] |
 | print(top_words('Hello, hello! HELLO?', 1)) | [('hello', 3)] | [('hello,', 1)] |
 | print(top_words('', 3)) | [] | [] |
 | print(top_words('one two', 0)) | [] | [] |
 | print(top_words('سلام عليكم سلام', 1)) | [('سلام', 2)] | [('سلام', 2)] |
 | print(top_words('zeta alpha zeta alpha beta', 3)) | [('alpha', 2), ('zeta', 2), ('beta', 1)] | [('zeta', 2), ('alpha', 2), ('beta', 1)] |
```

وفي النتيجة أعلاه لاحظ التالي:

- المصحح أدى عمله جيداً: الطالب يعرف من الصف الثالث أن `split` تترك الفاصلة في الكلمة، ومن الصف الثاني أن `most_common` لا ترتب المتساوي أبجدياً، وهي معلومة موجودة في ملاحظات المقرر.
- في الصورة تظهر القوائم مثل `[('b', 2), ('a', 2)]` مقلوبة الأقواس والترتيب، والسبب أن خلايا الجدول ترث اتجاه الصفحة من اليمين إلى اليسار RTL، وهذه مشكلة عرض في الواجهة العربية فقط، والقيم نفسها صحيحة كما في النص أعلاه، فانتبه لها إذا كان طلابك يستخدمون Moodle بالعربية.

### الحل الذي كتبه الذكاء الاصطناعي

الآن نفعل ما يفعله طالب لا يريد أن يتعب: نلصق نص الواجب في نموذج ذكاء اصطناعي ونطلب الكود فقط. واستخدمنا نموذجاً صغيراً على سيرفرنا وليس خدمة تجارية، وهو qwen2.5:3b عبر Ollama، بحرارة صفر Temperature 0 وبذرة ثابتة Seed، والطلب كان كما يلي:

```text
Solve this Python assignment. Give only the code.

Write the function top_words(text, n) that splits the text into words (letters and digits, Arabic included),
ignores case and punctuation, and returns a list of (word, count) tuples for the n most frequent words.
When two words have the same count, sort them alphabetically. If n is zero or less, return an empty list.
```

واستغرق النموذج قرابة 400 ثانية على المعالج فقط في سيرفر تجاربنا المزدحم، وكتب 240 توكن، وهذا هو الكود كما خرج منه دون أي تعديل:

```python
from collections import Counter
import re

def top_words(text, n):
    if n <= 0:
        return []

    # Normalize text: convert to lower case and remove punctuation
    text = re.sub(r'[^\w\s]', '', text.lower())

    # Split text into words
    words = text.split()

    # Count the frequency of each word
    word_counts = Counter(words)

    # Get the n most common words
    most_common = word_counts.most_common(n)

    # Sort by count, then alphabetically
    most_common.sort(key=lambda x: (-x[1], x[0]))

    return most_common
```

ثم سلمناه في السؤال نفسه، والصورة التالية تبين النتيجة:

![جدول نتائج CodeRunner للحل الذي كتبه النموذج: نجحت الاختبارات السبعة كلها، الظاهرة والمخفية، والرسالة تم تجاوز كل الاختبارات، والدرجة 10 من 10](https://arabroot.io/content/images/2026/10/ai-education-tools-04-ai-solution.webp)

الاختبارات السبعة كلها، والدرجة الكاملة 10 من 10، لحل لم يكتب الطالب منه حرفاً

والسطر الأخير من النتيجة كما قرأه سكربت التجربة:

```text
state: صحيح / الدرجات لهذا التسليم: 10.00/10.00.
```

وهنا نقطة مهمة جداً، فالحل الذي أخذ الدرجة الكاملة ليس صحيحاً. لاحظ أنه يأخذ أكثر `n` كلمات بالدالة `most_common` أولاً، ثم يرتب، فإذا كان التساوي على حدود القائمة فقد يختار الكلمة الخطأ قبل أن يرتب. وشغلنا الحل نفسه على حالتين ليستا في اختبارات السؤال:

```python
# two extra cases that the CodeRunner tests do not contain
print(top_words('b a b a c', 1))
print(top_words('my_var my var', 3))
```

والمخرج سوف يكون كما يلي:

```text
[('b', 2)]
[('my', 1), ('my_var', 1), ('var', 1)]
```

وفي المخرج أعلاه لاحظ التالي:

- الإجابة الصحيحة للحالة الأولى `[('a', 2)]`، لأن a وb متساويتان والترتيب الأبجدي يقدم a، ولكن الحل اختار b لأنها ظهرت أولاً في النص.
- في الحالة الثانية اعتبر الشرطة السفلية Underscore جزءاً من الكلمة، والسبب أن `\w` في Python يطابقها كما تذكر ملاحظات المقرر، والمطلوب أن تكون الكلمات حروفاً وأرقاماً فقط.
- الخطآن لم يظهرا في المصحح لأن المعلم لم يكتب اختباراً لهما، وهذه طبيعة أي مصحح آلي: يقول إن الكود اجتاز الاختبارات الموجودة، وليس إنه صحيح.

والنتيجة التي تهمنا من التجربة كلها: طالب في أسبوعه الرابع حاول بنفسه فأخذ 5.71، وطالب لصق نص الواجب في نموذج صغير مجاني فأخذ 10 من 10 بحل فيه خطآن لا يعرف عنهما شيئاً. والمصحح الآلي لم يخطئ في شيء، فهو أجاب عن السؤال الذي صمم له، وهذا بالضبط سبب ما قلناه في المقال الأول: درجة المصحح الآلي يجب أن ترافقها أسئلة عن الكود في الدفاع الشفهي، مثل «ماذا يحدث إذا تساوت كلمتان على حدود القائمة؟»، وهو سؤال يجيب عنه من كتب الكود في ثوان، ولا يجيب عنه من نسخه.

## مساعدات المقررات

العائلة الأخيرة لا تقيس شيئاً، وإنما تحاول أن تعطي الطالب مساعدة تشبه المعلم: تلميح وسؤال يوجهه بدلاً من الحل. وأشهر مثالين موثقين:

- **CS50.ai من جامعة Harvard:** بحسب [ورقة الفريق في SIGCSE 2024](https://cs.harvard.edu/malan/publications/V1fp0567-liu.pdf?ref=arabroot.io)، بنوا على GPT-4 مجموعة أدوات منها «بطة» للمحادثة على شكل Rubber Duck، مع ضوابط تربوية Pedagogical Guardrails توجه الطالب ولا تعطيه الحل، واسترجاع من نصوص المحاضرات بطريقة RAG، وفحص لمحاولات حقن التعليمات Prompt Injection، وحد لعدد الأسئلة على شكل قلوب: عشرة قلوب يعود منها قلب كل ثلاث دقائق. وراجع أحد أعضاء فريق المقرر 25 إجابة منهجية في الفصل الصيفي فوجد 22 منها صحيحة (88%).
- **Khanmigo من Khan Academy:** تصفه [صفحته الرسمية](https://www.khanmigo.ai/?ref=arabroot.io) بأنه يتحدى المتعلم أن يفكر ويحل المسائل دون أن يعطيه الإجابات مباشرة، ونسخة المعلم مجانية بحسب الصفحة نفسها، وهو موجه للتعليم العام أكثر من الجامعات.

وفي الحالتين المساعد خدمة لا تتحكم في بياناتها ولا في نموذجها، وهذا مناسب لكثير من المقررات، ولكن الجامعة التي تريد أن تبقى أسئلة طلابها داخلها، أو تريد مساعداً يعرف ملاحظات مقررها هي، تستطيع أن تبني مساعداً مشابهاً على سيرفرها بنموذج مفتوح، وهذا بالضبط ما سوف نبنيه ونقيس ضوابطه في [المقال الثالث من السلسلة](https://arabroot.io/articles/%D9%85%D8%B3%D8%A7%D8%B9%D8%AF-%D8%AA%D8%AF%D8%B1%D9%8A%D8%B3-%D8%A8%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D9%84%D9%85%D9%82%D8%B1%D8%B1-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/).

## الرخص والأسعار

الجدول التالي من المستودعات والصفحات الرسمية كما قرأناها في 13 أكتوبر 2026، والأسعار تتغير فارجع إلى الصفحة قبل القرار:

| الأداة                                                                                                                                       | العائلة           | الرخصة أو نموذج التسعير                        | ملاحظة                                          |
| -------------------------------------------------------------------------------------------------------------------------------------------- | ----------------- | ---------------------------------------------- | ----------------------------------------------- |
| [Safe Exam Browser](https://github.com/SafeExamBrowser/seb-win-refactoring?ref=arabroot.io)                                                  | قفل الجهاز        | مفتوحة المصدر برخصة MPL-2.0                    | يدعمه Moodle مباشرة                             |
| [CodeRunner](https://github.com/trampgeek/moodle-qtype%5Fcoderunner?ref=arabroot.io)                                                         | مصحح آلي          | مفتوحة المصدر برخصة GPL                        | إضافة لـ Moodle تحتاج سيرفر Jobe                |
| [Jobe](https://github.com/trampgeek/jobe?ref=arabroot.io)                                                                                    | بيئة تشغيل معزولة | مفتوحة المصدر برخصة MIT                        | تشغله على سيرفرك                                |
| [INGInious](https://github.com/INGInious/INGInious?ref=arabroot.io)                                                                          | مصحح آلي          | مفتوحة المصدر برخصة AGPL-3.0                   | من جامعة Louvain، يشغل كل تصحيح في Container    |
| [Autolab](https://github.com/autolab/Autolab?ref=arabroot.io)                                                                                | مصحح آلي          | مفتوحة المصدر برخصة Apache-2.0                 | من جامعة Carnegie Mellon، مع خدمة Tango للتشغيل |
| [nbgrader](https://github.com/jupyter/nbgrader?ref=arabroot.io) و[Otter-Grader](https://github.com/ucbds-infra/otter-grader?ref=arabroot.io) | مصحح آلي          | مفتوحة المصدر برخصة BSD-3-Clause               | لواجبات Jupyter Notebooks                       |
| [CodeGrade](https://www.codegrade.com/pricing?ref=arabroot.io)                                                                               | مصحح آلي          | تجاري، وفيه خطة مجانية حتى 50 طالباً في المقرر | ربط LMS في الخطط المدفوعة                       |
| GitHub Classroom                                                                                                                             | توزيع الواجبات    | خدمة من GitHub                                 | توقف في 28 أغسطس 2026                           |
| CS50.ai                                                                                                                                      | مساعد             | خدمة مجانية لطلاب CS50                         | خاص بمقررات CS50                                |
| Khanmigo                                                                                                                                     | مساعد             | خدمة، ونسخة المعلم مجانية                      | للتعليم العام أكثر                              |

## كيف تختار؟

الجدول التالي يربط ما تريد إثباته في مقررك بالأداة المناسبة، وهو مبني على ما شرحناه في المقالين:

| ماذا تريد؟                            | الأداة المناسبة           | ما يجب أن ترافقه                                 |
| ------------------------------------- | ------------------------- | ------------------------------------------------ |
| أن تعرف هل الكود يعمل، لمئات الطلاب   | مصحح آلي مثل CodeRunner   | دفاع شفهي لعينة، لأن المصحح لا يعرف من كتب الكود |
| أن تتأكد أن الطالب يملك المهارة بنفسه | اختبار داخل القاعة مع SEB | مراقب في القاعة وأسئلة تقيس قراءة الكود          |
| أن ترى كيف وصل الطالب إلى الحل        | Git مع مستودع لكل طالب    | أسئلة عن التغييرات في الدفاع الشفهي              |
| أن تعطي الطالب مساعدة في أي وقت       | مساعد بضوابط يعطي تلميحات | قياس دوري لما يتسرب منه، كما في المقال الثالث    |
| أن تثبت أن نصاً مولد                  | لا توجد أداة تثبت ذلك     | محادثة مع الطالب عن عمله                         |

## أخطاء شائعة

- **اعتبار درجة المصحح الآلي دليلاً على الفهم:** التجربة أعلاه بينت أن الحل المولد يأخذ الدرجة الكاملة.
- **ترك CodeRunner على سيرفر Jobe الافتراضي:** الإعداد الافتراضي يرسل كود طلابك إلى سيرفر جامعة Canterbury، فغيره إلى سيرفرك قبل أول اختبار.
- **إخفاء كل الاختبارات عن الطالب:** الاختبارات الظاهرة تعلمه ما المطلوب، والمخفية تمنع البرمجة على المخرج المتوقع، فاجمع بينهما.
- **SEB بلا مراقب:** الأداة تقفل الجهاز ولا تقفل الهاتف.
- **بناء مقرر جديد على GitHub Classroom:** الخدمة توقفت.
- **شراء أداة كشف لمقرر البرمجة:** الكود الصحيح يتشابه، والأبحاث لا تدعم استخدام النسبة دليلاً.

## الخلاصة

وصلنا لنهاية الموضوع، وأهم ما فيه:

- أدوات التعليم في زمن الذكاء الاصطناعي خمس عائلات، وكل عائلة تجيب عن سؤال مختلف، ولا توجد أداة تقول لك «هل تعلم الطالب؟».
- أدوات الكشف لا تصلح دليلاً، وSafe Exam Browser يفيد داخل القاعة مع مراقب، وسجل Git يعطيك مادة للأسئلة.
- المصحح الآلي يتحقق أن الكود يعمل، وفي تجربتنا حصل حل كتبه نموذج صغير على سيرفرنا على الدرجة الكاملة، ولذلك يجب أن يرافقه تقييم للعملية والفهم.
- CodeRunner مع Jobe على سيرفرك خيار مفتوح المصدر يناسب الجامعات التي تستخدم Moodle، وGitHub Classroom توقف.
- المساعد الذي يعطي تلميحات بدل الحلول هو العائلة الوحيدة التي تحاول أن تساعد على التعلم، وفي المقال القادم بإذن الله نبنيه على سيرفرنا ونقيس كم مرة تصمد ضوابطه.

[![](https://arabroot.io/content/images/2026/10/ai-in-education-cover-cover.webp)دليلالواجبات والاختبارات الجامعية في زمن الذكاء الاصطناعيكيف تقيم طلابك عندما يكتب الذكاء الاصطناعي الواجب، ولماذا لا تنفع أدوات الكشف، وما الذي يجب أن تدرسه الآن.](https://arabroot.io/articles/%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D8%A8%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D8%A7%D8%AE%D8%AA%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D8%AC%D8%A7%D9%85%D8%B9%D9%8A%D8%A9-%D9%81%D9%8A-%D8%B2%D9%85%D9%86-%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A/)[![](https://arabroot.io/content/images/2026/10/ai-teaching-assistant-cover-cover.webp)دليلمساعد تدريس بالذكاء الاصطناعي لمقرر البرمجةكيف تبني مساعداً محلياً يجيب طلاب البرمجة من ملاحظات المقرر ويعطي تلميحات بدلاً من حل الواجبات.](https://arabroot.io/articles/%D9%85%D8%B3%D8%A7%D8%B9%D8%AF-%D8%AA%D8%AF%D8%B1%D9%8A%D8%B3-%D8%A8%D8%A7%D9%84%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D9%84%D9%85%D9%82%D8%B1%D8%B1-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/)[![](https://arabroot.io/content/images/2026/10/moodle-cover-cover.webp)دليلMoodle: منصة تعلم بالعربية على سيرفرككيف تثبت Moodle على سيرفرك وتجهزه بالعربية، ثم تنشئ مقرراً واختباراً وتسجل الطلاب وتأخذ له نسخة احتياطية كاملة.](https://arabroot.io/articles/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-moodle-%D9%85%D9%86%D8%B5%D8%A9-%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%B9%D9%84%D9%89-%D8%B3%D9%8A%D8%B1%D9%81%D8%B1%D9%83/)[![](https://arabroot.io/content/images/2026/10/lms-basics-cover-cover.webp)دليلأنظمة إدارة التعلم LMS: ماذا تحتاج منها مؤسستك التعليمية؟ما الذي يفعله نظام إدارة التعلم LMS، وما الذي تحتاجه منه مدرستك أو جامعتك فعلاً قبل أن تختار بين الأنظمة المفتوحة.](https://arabroot.io/articles/%D8%A7%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85-lms-%D9%85%D8%A7%D8%B0%D8%A7-%D8%AA%D8%AD%D8%AA%D8%A7%D8%AC-%D9%85%D9%86%D9%87%D8%A7-%D9%85%D8%A4%D8%B3%D8%B3%D8%AA%D9%83/)[![](https://arabroot.io/content/images/2026/10/git-basics-cover-cover.webp)دليلإدارة النسخ وGit للمبتدئين: لماذا نحتاجها وكيف تعمللماذا تضيع الملفات بأسماء final\_v2 ويمسح الزملاء عمل بعضهم، وكيف يحل Git ذلك على مشروع حقيقي من أول commit.](https://arabroot.io/articles/%D8%A7%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D9%86%D8%B3%D8%AE-%D9%88-git-%D9%84%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86/)[![](https://arabroot.io/content/images/2026/10/oss-universities-cover-cover.webp)دليلالمصادر المفتوحة للجامعات: خطة وأدوات بالترتيبدليل لقيادة الجامعة يشرح ما تكسبه فعلاً من المصادر المفتوحة وما تكلفه، وبأي ترتيب تنقل خدماتها إليها.](https://arabroot.io/articles/%D8%A7%D9%84%D9%85%D8%B5%D8%A7%D8%AF%D8%B1-%D8%A7%D9%84%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D9%84%D9%84%D8%AC%D8%A7%D9%85%D8%B9%D8%A7%D8%AA/)

## سجل التحديثات

- أكتوبر 2026: كتابة المقال، وقراءة الرخص والأسعار من المستودعات والصفحات الرسمية في 13 أكتوبر 2026، وتنفيذ التجربة على Docker Engine 29.8.0 مع Moodle 5.3.0 (Build 20261005) على PHP 8.3.35 (moodlehq/moodle-php-apache:8.3-bookworm) وPostgreSQL 17.11، وCodeRunner 5.10.6 مع qbehaviour\_adaptive\_adapted\_for\_coderunner 1.4.8، وJobe من Docker Image trampgeek/jobeinabox (البصمة b442c8e63f01، Python 3.14.4 داخلها)، وOllama 0.40.3 مع النموذج qwen2.5:3b (البصمة 357c53fb659c، تكميم Q4\_K\_M) على المعالج فقط.