<?xml version="1.0"?>
<rss version="2.0"><channel><title>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: &#x630;&#x643;&#x627;&#x621; &#x627;&#x635;&#x637;&#x646;&#x627;&#x639;&#x64A;</title><link>https://academy.hsoub.com/programming/artificial-intelligence/page/2/?d=2</link><description>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: &#x630;&#x643;&#x627;&#x621; &#x627;&#x635;&#x637;&#x646;&#x627;&#x639;&#x64A;</description><language>ar</language><item><title>&#x642;&#x64A;&#x627;&#x633; &#x623;&#x62F;&#x627;&#x621; &#x646;&#x645;&#x627;&#x630;&#x62C; &#x627;&#x644;&#x645;&#x62D;&#x648;&#x644;&#x627;&#x62A; Transformers</title><link>https://academy.hsoub.com/programming/artificial-intelligence/%D9%82%D9%8A%D8%A7%D8%B3-%D8%A3%D8%AF%D8%A7%D8%A1-%D9%86%D9%85%D8%A7%D8%B0%D8%AC-%D8%A7%D9%84%D9%85%D8%AD%D9%88%D9%84%D8%A7%D8%AA-transformers-r2504/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2025_02/Transformers.png.b653fb6b1e55e33dddde6cc6a9984454.png" /></p>
<p>
	نشرح في هذا المقال طرق قياس أداء نماذج مكتبة المحولات Transformer التي توفرها منصة Hugging Face باستخدام مكتبات قياس الأداء الخارجية المخصصة لقياس سرعة وتعقيد الذاكرة في هذه النماذج، ونوضح أفضل الممارسات التي علينا اتباعها لقياس وتقييم أداء النماذج عند استخدام هذه المكتبات.
</p>

<p>
	<strong>ملاحظة</strong>: قد تصبح أدوات قياس الأداء الخاصة بمنصة Hugging Face مُهمَلة، ومن المفيد التحقق دومًا من <a href="https://github.com/huggingface/notebooks/blob/main/examples/benchmark.ipynb" rel="external nofollow">هذه الملاحظات</a> التي تشرح بالتفصيل كيفية قياس أداء نماذج Transformers.
</p>

<h2 id="transformers-1">
	قياس أداء نماذج المحولات Transformers
</h2>

<p>
	يسمح الصنفان <code>PyTorchBenchmark</code> و <code>TensorFlowBenchmark</code> بقياس أداء نماذج Transformers بمرونة كبيرة، حيث تسمح لنا أصناف قياس الأداء بقياس ذروة استخدام الذاكرة Peak Memory Usage، ومعرفة الوقت المطلوب Required Time لكل من الاستدلال Inference والتدريب Training.
</p>

<p>
	<strong>ملاحظة</strong>: تستخدم عملية الاستدلال Inference نموذجًا مدربًا لإجراء تنبؤات أو قرارات جديدة بناءً على بيانات جديدة. ويتطلب الاستدلال إجراء تمرير أمامي واحد أي تمرير البيانات عبر النموذج للحصول على النتيجة دون تعديل أو تحديث للأوزان، أما التدريب فهو يُحسّن أداء النموذج من خلال تعديل الأوزان داخل الشبكة العصبية باستخدام بيانات التدريب، وينفذ تمرير أمامي واحد وتمرير خلفي واحد من أجل حساب الخطأ في المخرجات التي جرى التنبؤ بها ثم يُعدّل الأوزان وفقًا لذلك.
</p>

<p>
	يحتاج الصنفان <code>PyTorchBenchmark</code> و <code>TensorFlowBenchmark</code> لتمرير كائن من نوع <code>PyTorchBenchmarkArguments</code> أو <code>TensorFlowBenchmarkArguments</code> لإنشاء نسخ منها، حيث يحتوي كل كائن من هذه الكائنات على جميع عمليات الضبط Configurations ذات الصلة بصنف قياس الأداء المقابل.
</p>

<p>
	يوضّح المثال التالي كيفية قياس أداء نموذج BERT من نوع <code>bert-base-cased</code>، في حال استخدام إطار عمل بايتورش <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A5%D8%B7%D8%A7%D8%B1-%D8%B9%D9%85%D9%84-%D8%A8%D8%A7%D9%8A-%D8%AA%D9%88%D8%B1%D8%B4-pytorch-%D9%88%D8%A3%D9%87%D9%85%D9%8A%D8%AA%D9%87-%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%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-r2311/" rel="">Pytorch</a>، فسنكتب ما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9869_6" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">PyTorchBenchmark</span><span class="pun">,</span><span class="pln"> </span><span class="typ">PyTorchBenchmarkArguments</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> args </span><span class="pun">=</span><span class="pln"> </span><span class="typ">PyTorchBenchmarkArguments</span><span class="pun">(</span><span class="pln">models</span><span class="pun">=[</span><span class="str">"google-bert/bert-base-uncased"</span><span class="pun">],</span><span class="pln"> batch_sizes</span><span class="pun">=[</span><span class="lit">8</span><span class="pun">],</span><span class="pln"> sequence_lengths</span><span class="pun">=[</span><span class="lit">8</span><span class="pun">,</span><span class="pln"> </span><span class="lit">32</span><span class="pun">,</span><span class="pln"> </span><span class="lit">128</span><span class="pun">,</span><span class="pln"> </span><span class="lit">512</span><span class="pun">])</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> benchmark </span><span class="pun">=</span><span class="pln"> </span><span class="typ">PyTorchBenchmark</span><span class="pun">(</span><span class="pln">args</span><span class="pun">)</span></pre>

<p>
	في حال استخدام إطار عمل تنسرفلو <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D9%86%D8%B5%D8%A9-%D8%AA%D9%86%D8%B3%D8%B1%D9%81%D9%84%D9%88-tensorflow-%D9%84%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-r2491/" rel="">TensorFlow</a>، فسنكتب ما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9869_8" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">TensorFlowBenchmark</span><span class="pun">,</span><span class="pln"> </span><span class="typ">TensorFlowBenchmarkArguments</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> args </span><span class="pun">=</span><span class="pln"> </span><span class="typ">TensorFlowBenchmarkArguments</span><span class="pun">(</span><span class="pln">
</span><span class="pun">…</span><span class="pln">    models</span><span class="pun">=[</span><span class="str">"google-bert/bert-base-uncased"</span><span class="pun">],</span><span class="pln"> batch_sizes</span><span class="pun">=[</span><span class="lit">8</span><span class="pun">],</span><span class="pln"> sequence_lengths</span><span class="pun">=[</span><span class="lit">8</span><span class="pun">,</span><span class="pln"> </span><span class="lit">32</span><span class="pun">,</span><span class="pln"> </span><span class="lit">128</span><span class="pun">,</span><span class="pln"> </span><span class="lit">512</span><span class="pun">]</span><span class="pln">
</span><span class="pun">…</span><span class="pln"> </span><span class="pun">)</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> benchmark </span><span class="pun">=</span><span class="pln"> </span><span class="typ">TensorFlowBenchmark</span><span class="pun">(</span><span class="pln">args</span><span class="pun">)</span></pre>

<p>
	تحتاج أصناف قياس الأداء لثلاثة وسطاء هي: <code>models</code> و <code>batch_sizes</code> و <code>sequence_lengths</code>، حيث يكون الوسيط <code>models</code> مطلوبًا ويمثل قائمة <code>list</code> من معرّفات النماذج المطلوب قياسها من <a href="https://huggingface.co/models" rel="external nofollow">مستودع النماذج</a>. والوسيط <code>batch_sizes</code> اختياري ويستخدم لتحديد حجم الدفعات batch size أثناء قياس الأداء، والوسيط <code>sequence_lengths</code> اختياري لتحديد حجم معرّفات الدخل <code>input_ids</code> التي سيُقاس أداء النموذج عليها.
</p>

<p>
	هنالك العديد من المعاملات الأخرى التي يمكننا ضبطها باستخدام أصناف قياس الأداء، لذا ننصح بمطالعة الملفات التالية <span ipsnoautolink="true">لإطار عمل بايتورش PyTorch</span>:
</p>

<ul>
	<li>
		<code>src/transformers/benchmark/benchmark_args_utils.py</code>
	</li>
	<li>
		<code>src/transformers/benchmark/benchmark_args.py</code>
	</li>
</ul>

<p>
	والملف التالي <span ipsnoautolink="true">لإطار عمل تنسرفلو Tensorflow:</span><span style="display: none;"> </span>
</p>

<ul>
	<li>
		<code>src/transformers/benchmark/benchmark_args_tf.py</code>
	</li>
</ul>

<p>
	 كما يمكن تشغيل أوامر الصدفة Shell التالية من المجلد الجذر لطباعة قائمة وصفية بجميع المعاملات القابلة للضبط لإطار عمل PyTorch و Tensorflow على التوالي.
</p>

<p>
	سنستخدم الأمر التالي في إطار عمل PyTorch:
</p>

<pre class="ipsCode">python examples/pytorch/benchmarking/run_benchmark.py --help
</pre>

<p>
	بعدها، يمكننا إنشاء كائن من صنف معين مخصص لقياس الأداء من خلال استدعاء التابع <code>benchmark.run()‎</code>:
</p>

<pre class="ipsCode">&gt;&gt;&gt; results = benchmark.run()
&gt;&gt;&gt; print(results)
====================       INFERENCE - SPEED - RESULT       ====================
--------------------------------------------------------------------------------
Model Name             Batch Size     Seq Length     Time in s                  
--------------------------------------------------------------------------------
google-bert/bert-base-uncased          8               8             0.006     
google-bert/bert-base-uncased          8               32            0.006     
google-bert/bert-base-uncased          8              128            0.018     
google-bert/bert-base-uncased          8              512            0.088     
--------------------------------------------------------------------------------

====================      INFERENCE - MEMORY - RESULT       ====================
--------------------------------------------------------------------------------
Model Name             Batch Size     Seq Length    Memory in MB 
--------------------------------------------------------------------------------
google-bert/bert-base-uncased          8               8             1227
google-bert/bert-base-uncased          8               32            1281
google-bert/bert-base-uncased          8              128            1307
google-bert/bert-base-uncased          8              512            1539
--------------------------------------------------------------------------------

====================        ENVIRONMENT INFORMATION         ====================

- transformers_version: 2.11.0
- framework: PyTorch
- use_torchscript: False
- framework_version: 1.4.0
- python_version: 3.6.10
- system: Linux
- cpu: x86_64
- architecture: 64bit
- date: 2020-06-29
- time: 08:58:43.371351
- fp16: False
- use_multiprocessing: True
- only_pretrain_model: False
- cpu_ram_mb: 32088
- use_gpu: True
- num_gpus: 1
- gpu: TITAN RTX
- gpu_ram_mb: 24217
- gpu_power_watts: 280.0
- gpu_performance_state: 2
- use_tpu: False
</pre>

<p>
	وسنستخدم الأمر التالي في إطار عمل TensorFlow:
</p>

<pre class="ipsCode">python examples/tensorflow/benchmarking/run_benchmark_tf.py --help
</pre>

<p>
	بعدها، يمكننا إنشاء كائن من صنف معين لقياس الأداء من خلال استدعاء التابع <code>benchmark.run()‎</code>:
</p>

<pre class="ipsCode">&gt;&gt;&gt; results = benchmark.run()
&gt;&gt;&gt; print(results)
&gt;&gt;&gt; results = benchmark.run()
&gt;&gt;&gt; print(results)
====================       INFERENCE - SPEED - RESULT       ====================
--------------------------------------------------------------------------------
Model Name             Batch Size     Seq Length     Time in s                  
--------------------------------------------------------------------------------
google-bert/bert-base-uncased          8               8             0.005
google-bert/bert-base-uncased          8               32            0.008
google-bert/bert-base-uncased          8              128            0.022
google-bert/bert-base-uncased          8              512            0.105
--------------------------------------------------------------------------------

====================      INFERENCE - MEMORY - RESULT       ====================
--------------------------------------------------------------------------------
Model Name             Batch Size     Seq Length    Memory in MB 
--------------------------------------------------------------------------------
google-bert/bert-base-uncased          8               8             1330
google-bert/bert-base-uncased          8               32            1330
google-bert/bert-base-uncased          8              128            1330
google-bert/bert-base-uncased          8              512            1770
--------------------------------------------------------------------------------

====================        ENVIRONMENT INFORMATION         ====================

- transformers_version: 2.11.0
- framework: Tensorflow
- use_xla: False
- framework_version: 2.2.0
- python_version: 3.6.10
- system: Linux
- cpu: x86_64
- architecture: 64bit
- date: 2020-06-29
- time: 09:26:35.617317
- fp16: False
- use_multiprocessing: True
- only_pretrain_model: False
- cpu_ram_mb: 32088
- use_gpu: True
- num_gpus: 1
- gpu: TITAN RTX
- gpu_ram_mb: 24217
- gpu_power_watts: 280.0
- gpu_performance_state: 2
- use_tpu: False
</pre>

<p>
	يُقاس أداء الوقت المطلوب للاستدلال، ومقدار الذاكرة التي يحتاجها النموذج تلقائيًا دون الحاجة إلى تدخل يدوي من المستخدم. حيث يعرض القسم الأول والثاني من خرج المثال السابق النتيجة المقابلة لوقت الاستدلال وذاكرته، وتُطبَع جميع المعلومات ذات الصلة ببيئة الحوسبة <code>ENVIRONMENT INFORMATION</code>مثل نوع وحدة معالجة الرسوميات GPU والنظام وإصدارات المكتبة وغير ذلك.
</p>

<p>
	يمكننا حفظ هذه المعلومات اختياريًا في ملف <code>‎.csv</code> عند إضافة الوسيط <code>save_to_csv=True</code> إلى الصنفين <code>PyTorchBenchmarkArguments</code> و <code>TensorFlowBenchmarkArguments</code> على التوالي، حيث يُحفَظ كل قسم في ملف منفصل، كما يمكننا تحديد مسار كل ملف <code>‎.csv</code> اختياريًا.
</p>

<h2 id="bert">
	قياس أداء النموذج BERT باستخدام إعدادات عشوائية
</h2>

<p>
	يمكننا قياس أداء نموذج model ما باستخدام إعدادات عشوائية بدلاً من قياس أداء نموذج مدرَّب مسبقًا باستخدام معرّف هذا النموذج، على سبيل المثال يمكن قياس أداء نموذج BERT باستخدام المعرف <code>google-bert/bert-base-uncased</code>، لنلقِ نظرة على المثال التالي الذي يستخدم إطار عمل بايتورش PyTorch لقياس أداء نماذج متعددة مستخدمًا إعدادات عشوائية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9869_14" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">PyTorchBenchmark</span><span class="pun">,</span><span class="pln"> </span><span class="typ">PyTorchBenchmarkArguments</span><span class="pun">,</span><span class="pln"> </span><span class="typ">BertConfig</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> args </span><span class="pun">=</span><span class="pln"> </span><span class="typ">PyTorchBenchmarkArguments</span><span class="pun">(</span><span class="pln">
</span><span class="pun">…</span><span class="pln">    models</span><span class="pun">=[</span><span class="str">"bert-base"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"bert-384-hid"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"bert-6-lay"</span><span class="pun">],</span><span class="pln"> batch_sizes</span><span class="pun">=[</span><span class="lit">8</span><span class="pun">],</span><span class="pln"> sequence_lengths</span><span class="pun">=[</span><span class="lit">8</span><span class="pun">,</span><span class="pln"> </span><span class="lit">32</span><span class="pun">,</span><span class="pln"> </span><span class="lit">128</span><span class="pun">,</span><span class="pln"> </span><span class="lit">512</span><span class="pun">]</span><span class="pln">
</span><span class="pun">…</span><span class="pln"> </span><span class="pun">)</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> config_base </span><span class="pun">=</span><span class="pln"> </span><span class="typ">BertConfig</span><span class="pun">()</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> config_384_hid </span><span class="pun">=</span><span class="pln"> </span><span class="typ">BertConfig</span><span class="pun">(</span><span class="pln">hidden_size</span><span class="pun">=</span><span class="lit">384</span><span class="pun">)</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> config_6_lay </span><span class="pun">=</span><span class="pln"> </span><span class="typ">BertConfig</span><span class="pun">(</span><span class="pln">num_hidden_layers</span><span class="pun">=</span><span class="lit">6</span><span class="pun">)</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> benchmark </span><span class="pun">=</span><span class="pln"> </span><span class="typ">PyTorchBenchmark</span><span class="pun">(</span><span class="pln">args</span><span class="pun">,</span><span class="pln"> configs</span><span class="pun">=[</span><span class="pln">config_base</span><span class="pun">,</span><span class="pln"> config_384_hid</span><span class="pun">,</span><span class="pln"> config_6_lay</span><span class="pun">])</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> benchmark</span><span class="pun">.</span><span class="pln">run</span><span class="pun">()</span><span class="pln">
</span><span class="pun">====================</span><span class="pln">       INFERENCE </span><span class="pun">-</span><span class="pln"> SPEED </span><span class="pun">-</span><span class="pln"> RESULT       </span><span class="pun">====================</span><span class="pln">
</span><span class="pun">--------------------------------------------------------------------------------</span><span class="pln">
</span><span class="typ">Model</span><span class="pln"> </span><span class="typ">Name</span><span class="pln">             </span><span class="typ">Batch</span><span class="pln"> </span><span class="typ">Size</span><span class="pln">     </span><span class="typ">Seq</span><span class="pln"> </span><span class="typ">Length</span><span class="pln">       </span><span class="typ">Time</span><span class="pln"> </span><span class="kwd">in</span><span class="pln"> s                  
</span><span class="pun">--------------------------------------------------------------------------------</span><span class="pln">
bert</span><span class="pun">-</span><span class="pln">base                  </span><span class="lit">8</span><span class="pln">              </span><span class="lit">128</span><span class="pln">            </span><span class="lit">0.006</span><span class="pln">
bert</span><span class="pun">-</span><span class="pln">base                  </span><span class="lit">8</span><span class="pln">              </span><span class="lit">512</span><span class="pln">            </span><span class="lit">0.006</span><span class="pln">
bert</span><span class="pun">-</span><span class="pln">base                  </span><span class="lit">8</span><span class="pln">              </span><span class="lit">128</span><span class="pln">            </span><span class="lit">0.018</span><span class="pln">     
bert</span><span class="pun">-</span><span class="pln">base                  </span><span class="lit">8</span><span class="pln">              </span><span class="lit">512</span><span class="pln">            </span><span class="lit">0.088</span><span class="pln">     
bert</span><span class="pun">-</span><span class="lit">384</span><span class="pun">-</span><span class="pln">hid              </span><span class="lit">8</span><span class="pln">               </span><span class="lit">8</span><span class="pln">             </span><span class="lit">0.006</span><span class="pln">     
bert</span><span class="pun">-</span><span class="lit">384</span><span class="pun">-</span><span class="pln">hid              </span><span class="lit">8</span><span class="pln">               </span><span class="lit">32</span><span class="pln">            </span><span class="lit">0.006</span><span class="pln">     
bert</span><span class="pun">-</span><span class="lit">384</span><span class="pun">-</span><span class="pln">hid              </span><span class="lit">8</span><span class="pln">              </span><span class="lit">128</span><span class="pln">            </span><span class="lit">0.011</span><span class="pln">     
bert</span><span class="pun">-</span><span class="lit">384</span><span class="pun">-</span><span class="pln">hid              </span><span class="lit">8</span><span class="pln">              </span><span class="lit">512</span><span class="pln">            </span><span class="lit">0.054</span><span class="pln">     
bert</span><span class="pun">-</span><span class="lit">6</span><span class="pun">-</span><span class="pln">lay                 </span><span class="lit">8</span><span class="pln">               </span><span class="lit">8</span><span class="pln">             </span><span class="lit">0.003</span><span class="pln">     
bert</span><span class="pun">-</span><span class="lit">6</span><span class="pun">-</span><span class="pln">lay                 </span><span class="lit">8</span><span class="pln">               </span><span class="lit">32</span><span class="pln">            </span><span class="lit">0.004</span><span class="pln">     
bert</span><span class="pun">-</span><span class="lit">6</span><span class="pun">-</span><span class="pln">lay                 </span><span class="lit">8</span><span class="pln">              </span><span class="lit">128</span><span class="pln">            </span><span class="lit">0.009</span><span class="pln">     
bert</span><span class="pun">-</span><span class="lit">6</span><span class="pun">-</span><span class="pln">lay                 </span><span class="lit">8</span><span class="pln">              </span><span class="lit">512</span><span class="pln">            </span><span class="lit">0.044</span><span class="pln">
</span><span class="pun">--------------------------------------------------------------------------------</span><span class="pln">

</span><span class="pun">====================</span><span class="pln">      INFERENCE </span><span class="pun">-</span><span class="pln"> MEMORY </span><span class="pun">-</span><span class="pln"> RESULT       </span><span class="pun">====================</span><span class="pln">
</span><span class="pun">--------------------------------------------------------------------------------</span><span class="pln">
</span><span class="typ">Model</span><span class="pln"> </span><span class="typ">Name</span><span class="pln">             </span><span class="typ">Batch</span><span class="pln"> </span><span class="typ">Size</span><span class="pln">     </span><span class="typ">Seq</span><span class="pln"> </span><span class="typ">Length</span><span class="pln">      </span><span class="typ">Memory</span><span class="pln"> </span><span class="kwd">in</span><span class="pln"> MB 
</span><span class="pun">--------------------------------------------------------------------------------</span><span class="pln">
bert</span><span class="pun">-</span><span class="pln">base                  </span><span class="lit">8</span><span class="pln">               </span><span class="lit">8</span><span class="pln">             </span><span class="lit">1277</span><span class="pln">
bert</span><span class="pun">-</span><span class="pln">base                  </span><span class="lit">8</span><span class="pln">               </span><span class="lit">32</span><span class="pln">            </span><span class="lit">1281</span><span class="pln">
bert</span><span class="pun">-</span><span class="pln">base                  </span><span class="lit">8</span><span class="pln">              </span><span class="lit">128</span><span class="pln">            </span><span class="lit">1307</span><span class="pln">     
bert</span><span class="pun">-</span><span class="pln">base                  </span><span class="lit">8</span><span class="pln">              </span><span class="lit">512</span><span class="pln">            </span><span class="lit">1539</span><span class="pln">     
bert</span><span class="pun">-</span><span class="lit">384</span><span class="pun">-</span><span class="pln">hid              </span><span class="lit">8</span><span class="pln">               </span><span class="lit">8</span><span class="pln">             </span><span class="lit">1005</span><span class="pln">     
bert</span><span class="pun">-</span><span class="lit">384</span><span class="pun">-</span><span class="pln">hid              </span><span class="lit">8</span><span class="pln">               </span><span class="lit">32</span><span class="pln">            </span><span class="lit">1027</span><span class="pln">     
bert</span><span class="pun">-</span><span class="lit">384</span><span class="pun">-</span><span class="pln">hid              </span><span class="lit">8</span><span class="pln">              </span><span class="lit">128</span><span class="pln">            </span><span class="lit">1035</span><span class="pln">     
bert</span><span class="pun">-</span><span class="lit">384</span><span class="pun">-</span><span class="pln">hid              </span><span class="lit">8</span><span class="pln">              </span><span class="lit">512</span><span class="pln">            </span><span class="lit">1255</span><span class="pln">     
bert</span><span class="pun">-</span><span class="lit">6</span><span class="pun">-</span><span class="pln">lay                 </span><span class="lit">8</span><span class="pln">               </span><span class="lit">8</span><span class="pln">             </span><span class="lit">1097</span><span class="pln">     
bert</span><span class="pun">-</span><span class="lit">6</span><span class="pun">-</span><span class="pln">lay                 </span><span class="lit">8</span><span class="pln">               </span><span class="lit">32</span><span class="pln">            </span><span class="lit">1101</span><span class="pln">     
bert</span><span class="pun">-</span><span class="lit">6</span><span class="pun">-</span><span class="pln">lay                 </span><span class="lit">8</span><span class="pln">              </span><span class="lit">128</span><span class="pln">            </span><span class="lit">1127</span><span class="pln">     
bert</span><span class="pun">-</span><span class="lit">6</span><span class="pun">-</span><span class="pln">lay                 </span><span class="lit">8</span><span class="pln">              </span><span class="lit">512</span><span class="pln">            </span><span class="lit">1359</span><span class="pln">
</span><span class="pun">--------------------------------------------------------------------------------</span><span class="pln">

</span><span class="pun">====================</span><span class="pln">        ENVIRONMENT INFORMATION         </span><span class="pun">====================</span><span class="pln">

</span><span class="pun">-</span><span class="pln"> transformers_version</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2.11</span><span class="pun">.</span><span class="lit">0</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> framework</span><span class="pun">:</span><span class="pln"> </span><span class="typ">PyTorch</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> use_torchscript</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">False</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> framework_version</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1.4</span><span class="pun">.</span><span class="lit">0</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> python_version</span><span class="pun">:</span><span class="pln"> </span><span class="lit">3.6</span><span class="pun">.</span><span class="lit">10</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> system</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Linux</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> cpu</span><span class="pun">:</span><span class="pln"> x86_64
</span><span class="pun">-</span><span class="pln"> architecture</span><span class="pun">:</span><span class="pln"> </span><span class="lit">64bit</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> date</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2020</span><span class="pun">-</span><span class="lit">06</span><span class="pun">-</span><span class="lit">29</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> time</span><span class="pun">:</span><span class="pln"> </span><span class="lit">09</span><span class="pun">:</span><span class="lit">35</span><span class="pun">:</span><span class="lit">25.143267</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> fp16</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">False</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> use_multiprocessing</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">True</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> only_pretrain_model</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">False</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> cpu_ram_mb</span><span class="pun">:</span><span class="pln"> </span><span class="lit">32088</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> use_gpu</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">True</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> num_gpus</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> gpu</span><span class="pun">:</span><span class="pln"> TITAN RTX
</span><span class="pun">-</span><span class="pln"> gpu_ram_mb</span><span class="pun">:</span><span class="pln"> </span><span class="lit">24217</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> gpu_power_watts</span><span class="pun">:</span><span class="pln"> </span><span class="lit">280.0</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> gpu_performance_state</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> use_tpu</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">False</span></pre>

<p>
	وفي المثال التالي نقيس أداء النماذج باستخدام إطار عمل تنسرفلو TensorFlow مع ضبط عشوائي للنماذج، حيث يمكننا اختيار النماذج المختلفة و إعدادات الضبط المناسبة للاختبار مع توفير الوسائط المناسبة كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9869_16" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">TensorFlowBenchmark</span><span class="pun">,</span><span class="pln"> </span><span class="typ">TensorFlowBenchmarkArguments</span><span class="pun">,</span><span class="pln"> </span><span class="typ">BertConfig</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> args </span><span class="pun">=</span><span class="pln"> </span><span class="typ">TensorFlowBenchmarkArguments</span><span class="pun">(</span><span class="pln">
</span><span class="pun">…</span><span class="pln">    models</span><span class="pun">=[</span><span class="str">"bert-base"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"bert-384-hid"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"bert-6-lay"</span><span class="pun">],</span><span class="pln"> batch_sizes</span><span class="pun">=[</span><span class="lit">8</span><span class="pun">],</span><span class="pln"> sequence_lengths</span><span class="pun">=[</span><span class="lit">8</span><span class="pun">,</span><span class="pln"> </span><span class="lit">32</span><span class="pun">,</span><span class="pln"> </span><span class="lit">128</span><span class="pun">,</span><span class="pln"> </span><span class="lit">512</span><span class="pun">]</span><span class="pln">
</span><span class="pun">…</span><span class="pln"> </span><span class="pun">)</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> config_base </span><span class="pun">=</span><span class="pln"> </span><span class="typ">BertConfig</span><span class="pun">()</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> config_384_hid </span><span class="pun">=</span><span class="pln"> </span><span class="typ">BertConfig</span><span class="pun">(</span><span class="pln">hidden_size</span><span class="pun">=</span><span class="lit">384</span><span class="pun">)</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> config_6_lay </span><span class="pun">=</span><span class="pln"> </span><span class="typ">BertConfig</span><span class="pun">(</span><span class="pln">num_hidden_layers</span><span class="pun">=</span><span class="lit">6</span><span class="pun">)</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> benchmark </span><span class="pun">=</span><span class="pln"> </span><span class="typ">TensorFlowBenchmark</span><span class="pun">(</span><span class="pln">args</span><span class="pun">,</span><span class="pln"> configs</span><span class="pun">=[</span><span class="pln">config_base</span><span class="pun">,</span><span class="pln"> config_384_hid</span><span class="pun">,</span><span class="pln"> config_6_lay</span><span class="pun">])</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> benchmark</span><span class="pun">.</span><span class="pln">run</span><span class="pun">()</span><span class="pln">
</span><span class="pun">====================</span><span class="pln">       INFERENCE </span><span class="pun">-</span><span class="pln"> SPEED </span><span class="pun">-</span><span class="pln"> RESULT       </span><span class="pun">====================</span><span class="pln">
</span><span class="pun">--------------------------------------------------------------------------------</span><span class="pln">
</span><span class="typ">Model</span><span class="pln"> </span><span class="typ">Name</span><span class="pln">             </span><span class="typ">Batch</span><span class="pln"> </span><span class="typ">Size</span><span class="pln">     </span><span class="typ">Seq</span><span class="pln"> </span><span class="typ">Length</span><span class="pln">       </span><span class="typ">Time</span><span class="pln"> </span><span class="kwd">in</span><span class="pln"> s                  
</span><span class="pun">--------------------------------------------------------------------------------</span><span class="pln">
bert</span><span class="pun">-</span><span class="pln">base                  </span><span class="lit">8</span><span class="pln">               </span><span class="lit">8</span><span class="pln">             </span><span class="lit">0.005</span><span class="pln">
bert</span><span class="pun">-</span><span class="pln">base                  </span><span class="lit">8</span><span class="pln">               </span><span class="lit">32</span><span class="pln">            </span><span class="lit">0.008</span><span class="pln">
bert</span><span class="pun">-</span><span class="pln">base                  </span><span class="lit">8</span><span class="pln">              </span><span class="lit">128</span><span class="pln">            </span><span class="lit">0.022</span><span class="pln">
bert</span><span class="pun">-</span><span class="pln">base                  </span><span class="lit">8</span><span class="pln">              </span><span class="lit">512</span><span class="pln">            </span><span class="lit">0.106</span><span class="pln">
bert</span><span class="pun">-</span><span class="lit">384</span><span class="pun">-</span><span class="pln">hid              </span><span class="lit">8</span><span class="pln">               </span><span class="lit">8</span><span class="pln">             </span><span class="lit">0.005</span><span class="pln">
bert</span><span class="pun">-</span><span class="lit">384</span><span class="pun">-</span><span class="pln">hid              </span><span class="lit">8</span><span class="pln">               </span><span class="lit">32</span><span class="pln">            </span><span class="lit">0.007</span><span class="pln">
bert</span><span class="pun">-</span><span class="lit">384</span><span class="pun">-</span><span class="pln">hid              </span><span class="lit">8</span><span class="pln">              </span><span class="lit">128</span><span class="pln">            </span><span class="lit">0.018</span><span class="pln">
bert</span><span class="pun">-</span><span class="lit">384</span><span class="pun">-</span><span class="pln">hid              </span><span class="lit">8</span><span class="pln">              </span><span class="lit">512</span><span class="pln">            </span><span class="lit">0.064</span><span class="pln">
bert</span><span class="pun">-</span><span class="lit">6</span><span class="pun">-</span><span class="pln">lay                 </span><span class="lit">8</span><span class="pln">               </span><span class="lit">8</span><span class="pln">             </span><span class="lit">0.002</span><span class="pln">
bert</span><span class="pun">-</span><span class="lit">6</span><span class="pun">-</span><span class="pln">lay                 </span><span class="lit">8</span><span class="pln">               </span><span class="lit">32</span><span class="pln">            </span><span class="lit">0.003</span><span class="pln">
bert</span><span class="pun">-</span><span class="lit">6</span><span class="pun">-</span><span class="pln">lay                 </span><span class="lit">8</span><span class="pln">              </span><span class="lit">128</span><span class="pln">            </span><span class="lit">0.0011</span><span class="pln">
bert</span><span class="pun">-</span><span class="lit">6</span><span class="pun">-</span><span class="pln">lay                 </span><span class="lit">8</span><span class="pln">              </span><span class="lit">512</span><span class="pln">            </span><span class="lit">0.074</span><span class="pln">
</span><span class="pun">--------------------------------------------------------------------------------</span><span class="pln">

</span><span class="pun">====================</span><span class="pln">      INFERENCE </span><span class="pun">-</span><span class="pln"> MEMORY </span><span class="pun">-</span><span class="pln"> RESULT       </span><span class="pun">====================</span><span class="pln">
</span><span class="pun">--------------------------------------------------------------------------------</span><span class="pln">
</span><span class="typ">Model</span><span class="pln"> </span><span class="typ">Name</span><span class="pln">             </span><span class="typ">Batch</span><span class="pln"> </span><span class="typ">Size</span><span class="pln">     </span><span class="typ">Seq</span><span class="pln"> </span><span class="typ">Length</span><span class="pln">      </span><span class="typ">Memory</span><span class="pln"> </span><span class="kwd">in</span><span class="pln"> MB 
</span><span class="pun">--------------------------------------------------------------------------------</span><span class="pln">
bert</span><span class="pun">-</span><span class="pln">base                  </span><span class="lit">8</span><span class="pln">               </span><span class="lit">8</span><span class="pln">             </span><span class="lit">1330</span><span class="pln">
bert</span><span class="pun">-</span><span class="pln">base                  </span><span class="lit">8</span><span class="pln">               </span><span class="lit">32</span><span class="pln">            </span><span class="lit">1330</span><span class="pln">
bert</span><span class="pun">-</span><span class="pln">base                  </span><span class="lit">8</span><span class="pln">              </span><span class="lit">128</span><span class="pln">            </span><span class="lit">1330</span><span class="pln">
bert</span><span class="pun">-</span><span class="pln">base                  </span><span class="lit">8</span><span class="pln">              </span><span class="lit">512</span><span class="pln">            </span><span class="lit">1770</span><span class="pln">
bert</span><span class="pun">-</span><span class="lit">384</span><span class="pun">-</span><span class="pln">hid              </span><span class="lit">8</span><span class="pln">               </span><span class="lit">8</span><span class="pln">             </span><span class="lit">1330</span><span class="pln">
bert</span><span class="pun">-</span><span class="lit">384</span><span class="pun">-</span><span class="pln">hid              </span><span class="lit">8</span><span class="pln">               </span><span class="lit">32</span><span class="pln">            </span><span class="lit">1330</span><span class="pln">
bert</span><span class="pun">-</span><span class="lit">384</span><span class="pun">-</span><span class="pln">hid              </span><span class="lit">8</span><span class="pln">              </span><span class="lit">128</span><span class="pln">            </span><span class="lit">1330</span><span class="pln">
bert</span><span class="pun">-</span><span class="lit">384</span><span class="pun">-</span><span class="pln">hid              </span><span class="lit">8</span><span class="pln">              </span><span class="lit">512</span><span class="pln">            </span><span class="lit">1540</span><span class="pln">
bert</span><span class="pun">-</span><span class="lit">6</span><span class="pun">-</span><span class="pln">lay                 </span><span class="lit">8</span><span class="pln">               </span><span class="lit">8</span><span class="pln">             </span><span class="lit">1330</span><span class="pln">
bert</span><span class="pun">-</span><span class="lit">6</span><span class="pun">-</span><span class="pln">lay                 </span><span class="lit">8</span><span class="pln">               </span><span class="lit">32</span><span class="pln">            </span><span class="lit">1330</span><span class="pln">
bert</span><span class="pun">-</span><span class="lit">6</span><span class="pun">-</span><span class="pln">lay                 </span><span class="lit">8</span><span class="pln">              </span><span class="lit">128</span><span class="pln">            </span><span class="lit">1330</span><span class="pln">
bert</span><span class="pun">-</span><span class="lit">6</span><span class="pun">-</span><span class="pln">lay                 </span><span class="lit">8</span><span class="pln">              </span><span class="lit">512</span><span class="pln">            </span><span class="lit">1540</span><span class="pln">
</span><span class="pun">--------------------------------------------------------------------------------</span><span class="pln">

</span><span class="pun">====================</span><span class="pln">        ENVIRONMENT INFORMATION         </span><span class="pun">====================</span><span class="pln">

</span><span class="pun">-</span><span class="pln"> transformers_version</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2.11</span><span class="pun">.</span><span class="lit">0</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> framework</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Tensorflow</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> use_xla</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">False</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> framework_version</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2.2</span><span class="pun">.</span><span class="lit">0</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> python_version</span><span class="pun">:</span><span class="pln"> </span><span class="lit">3.6</span><span class="pun">.</span><span class="lit">10</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> system</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Linux</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> cpu</span><span class="pun">:</span><span class="pln"> x86_64
</span><span class="pun">-</span><span class="pln"> architecture</span><span class="pun">:</span><span class="pln"> </span><span class="lit">64bit</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> date</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2020</span><span class="pun">-</span><span class="lit">06</span><span class="pun">-</span><span class="lit">29</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> time</span><span class="pun">:</span><span class="pln"> </span><span class="lit">09</span><span class="pun">:</span><span class="lit">38</span><span class="pun">:</span><span class="lit">15.487125</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> fp16</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">False</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> use_multiprocessing</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">True</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> only_pretrain_model</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">False</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> cpu_ram_mb</span><span class="pun">:</span><span class="pln"> </span><span class="lit">32088</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> use_gpu</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">True</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> num_gpus</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> gpu</span><span class="pun">:</span><span class="pln"> TITAN RTX
</span><span class="pun">-</span><span class="pln"> gpu_ram_mb</span><span class="pun">:</span><span class="pln"> </span><span class="lit">24217</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> gpu_power_watts</span><span class="pun">:</span><span class="pln"> </span><span class="lit">280.0</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> gpu_performance_state</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2</span><span class="pln">
</span><span class="pun">-</span><span class="pln"> use_tpu</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">False</span></pre>

<p>
	يُقاس الوقت والذاكرة المطلوبة للاستدلال للضبط المخصَّص الخاص بالصنف <code>BertModel</code> هذه المرة، وهذه الميزة مفيدة خاصة عند تحديد الضبط الذي يجب تدريب النموذج عليه.
</p>

<h2 id="">
	أفضل ممارسات قياس الأداء
</h2>

<p>
	فيما يلي قائمة موجزة بأفضل الممارسات التي يجب علينا الانتباه لها عند قياس أداء نموذج model:
</p>

<ul>
	<li>
		قياس الأداء مدعوم حاليًا لجهاز واحد فقط، ويوصى عند قياسه على وحدة معالجة الرسوميات GPU تحديد الجهاز الذي سيُشغّل الشيفرة البرمجية عليه عن طريق ضبط متغير البيئة <code>CUDA_VISIBLE_DEVICES</code> بقيمة محددة قبل تشغيل هذه الشيفرة
	</li>
	<li>
		علينا ضبط الخيار <code>no_multi_processing</code> على القيمة <code>True</code> للاختبار وتنقيح الأخطاء فقط، ويوصى بتشغيل كل قياس ذاكرة في عملية منفصلة لضمان قياسها بدقة
	</li>
	<li>
		يجب دائمًا ذكر معلومات البيئة عند مشاركة نتائج قياس أداء النموذج، فقد تختلف النتائج بين أجهزة GPU المختلفة وإصدارات المكتبة المختلفة
	</li>
</ul>

<h2 id="-1">
	مشاركة قياس الأداء
</h2>

<p>
	تمكنا من إجراء قياسات أداء لجميع النماذج الأساسية المتاحة لوقت الاستدلال على العديد من الإعدادات المختلفة مثل إطار عمل PyTorch مع استخدام <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B5%D8%AF%D9%8A%D8%B1-%D9%86%D9%85%D8%A7%D8%B0%D8%AC-%D8%A7%D9%84%D9%85%D8%AD%D9%88%D9%84%D8%A7%D8%AA-transformers-%D8%A5%D9%84%D9%89-%D8%B5%D9%8A%D8%BA%D8%A9-torchscript-r2501/" rel="">TorchScript</a> وبدونها، وإطار عمل TensorFlow مع استخدام XLA وبدونها. ونُفذّت جميع هذه الاختبارات -باستثناء TensorFlow XLA- عبر وحدات المعالجة المركزية <a href="https://academy.hsoub.com/apps/operating-systems/%D9%88%D8%AD%D8%AF%D8%A9-%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%84%D8%AC%D8%A9-%D8%A7%D9%84%D9%85%D8%B1%D9%83%D8%B2%D9%8A%D8%A9-r879/" rel="">CPU</a> ووحدات معالجة الرسوميات GPU.
</p>

<p>
	يمكن مطالعة <a href="https://medium.com/huggingface/benchmarking-transformers-pytorch-and-tensorflow-e2917fb891c2" rel="external nofollow">طريقة قياس أداء Transformers</a> و<a href="https://docs.google.com/spreadsheets/d/1sryqufw2D0XlUH4sq3e9Wnxu5EAQkaohzrJbd5HdQ_w/edit?gid=0#gid=0" rel="external nofollow">نتائجها</a> بمزيد من التفصيل. وكما نلاحظ فقد أصبحت مشاركة نتائج قياس الأداء مع المجتمع أسهل من أي وقت مضى باستخدام أدوات قياس الأداء الجديدة مثل <span style="display: none;"> </span><a href="https://github.com/huggingface/transformers/blob/main/examples/tensorflow/benchmarking/README.md" rel="external nofollow">نتائج قياس أداء TensorFlow</a>.
</p>

<h2 id="-2">
	الخاتمة
</h2>

<p>
	وصلنا لختام مقالنا الذي شرحنا فيه كيفية استخدام مكتبات قياس أداء نماذج المحولات Transformers بسهولة، مع توفير أكواد يمكن استخدامها لضبط عملية قياس الأداء وتشغيله، وعرضنا النتائج التي حصلنا عليها مثل وقت الاستدلال و استخدام الذاكرة وقارنا بينها، كما وضحنا أفضل الممارسات التي يجب اتباعها لقياس أداء النماذج بكفاءة.
</p>

<p>
	ترجمة -وبتصرّف- للقسم <a href="https://huggingface.co/docs/transformers/benchmarks" rel="external nofollow">Benchmarks</a> من توثيقات Hugging Face.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B5%D8%AF%D9%8A%D8%B1-%D9%86%D9%85%D8%A7%D8%B0%D8%AC-%D8%A7%D9%84%D9%85%D8%AD%D9%88%D9%84%D8%A7%D8%AA-transformers-%D8%A5%D9%84%D9%89-%D8%B5%D9%8A%D8%BA%D8%A9-torchscript-r2501/" rel="">تصدير نماذج المحولات Transformers إلى صيغة TorchScript</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AC%D9%88%D9%84%D8%A9-%D8%B3%D8%B1%D9%8A%D8%B9%D8%A9-%D9%84%D9%84%D8%A8%D8%AF%D8%A1-%D9%85%D8%B9-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%AD%D9%88%D9%91%D9%84%D8%A7%D8%AA-transformers-r2351/" rel="">جولة سريعة للبدء مع مكتبة المحوّلات Transformers</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%AD%D9%88%D9%91%D9%84%D8%A7%D8%AA-transformers-r2352/" rel="">تثبيت مكتبة المحوّلات Transformers</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D9%82%D9%8A%D9%8A%D9%85-%D9%88%D8%A7%D8%AE%D8%AA%D9%8A%D8%A7%D8%B1-%D9%86%D9%85%D8%A7%D8%B0%D8%AC-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-r1635/" rel="">تقييم واختيار نماذج تعلم الآلة</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2504</guid><pubDate>Wed, 05 Feb 2025 15:01:00 +0000</pubDate></item><item><title>&#x62A;&#x635;&#x62F;&#x64A;&#x631; &#x646;&#x645;&#x627;&#x630;&#x62C; &#x627;&#x644;&#x645;&#x62D;&#x648;&#x644;&#x627;&#x62A; Transformers &#x625;&#x644;&#x649; &#x635;&#x64A;&#x63A;&#x629; TorchScript</title><link>https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B5%D8%AF%D9%8A%D8%B1-%D9%86%D9%85%D8%A7%D8%B0%D8%AC-%D8%A7%D9%84%D9%85%D8%AD%D9%88%D9%84%D8%A7%D8%AA-transformers-%D8%A5%D9%84%D9%89-%D8%B5%D9%8A%D8%BA%D8%A9-torchscript-r2501/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2025_01/TransformersTorchScript_.png.b8d9c47f0a64cb91b9b9cc8ddc0b0fde.png" /></p>
<p>
	إذا كنا نطور نماذج ذكاء اصطناعي ونرغب في تحسين أدائها أو نشرها في بيئات مختلفة، فإن TorchScript أداة قوية توفر لنا طريقة لإنشاء نماذج قابلة للتسلسل والتحسين من شيفرة باي تورش PyTorch البرمجية وفقًا <a href="https://pytorch.org/docs/stable/jit.html" rel="external nofollow">لتوثيق TorchScript</a>.
</p>

<p>
	لا تزال التجارب جارية لاختبار استخدام TorchScript مع النماذج التي يكون حجم مدخلاتها متغيرًا. وفي الإصدارات القادمة، سيجري تقديم أمثلة برمجية أكثر، وتحسين مرونة التنفيذ، بالإضافة إلى مقارنة أداء الكود المكتوب <a href="https://academy.hsoub.com/python/" rel="">بلغة بايثون Python</a> مع الكود المحوَّل إلى TorchScript لمعرفة الفرق في السرعة والكفاءة.
</p>

<p>
	توجد وحدتان من وحدات باي تورش <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A5%D8%B7%D8%A7%D8%B1-%D8%B9%D9%85%D9%84-%D8%A8%D8%A7%D9%8A-%D8%AA%D9%88%D8%B1%D8%B4-pytorch-%D9%88%D8%A3%D9%87%D9%85%D9%8A%D8%AA%D9%87-%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%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-r2311/" rel="">PyTorch</a> هما الوحدة <span style="display: none;">  </span><span ipsnoautolink="true"><a href="https://pytorch.org/docs/stable/jit.html" rel="external nofollow">JIT</a> لترجمة </span>نموذج باي تورش إلى كود يمكن تنفيذه مباشرة على الآلة، <span ipsnoautolink="true">والوحدة  TRACE</span> لتسريع الكود فهما تسمحان للمطورين بتصدير نماذجهم لإعادة استخدامها في برامج أخرى مثل برامج C++‎ التي تركز على الفعالية وتحسين الأداء والموارد المستخدمة.
</p>

<p>
	سنوفر فيما يلي واجهة تتيح لنا تصدير نماذج مكتبة المحوِّلات Transformers إلى صيغة TorchScript حتى نتمكّن من إعادة استخدامها في بيئة مختلفة عن برامج بايثون Python المستندة إلى إطار عمل باي تورش PyTorch، وسنوضّح كيفية تصدير واستخدام النماذج باستخدام صيغة TorchScript.
</p>

<p>
	يتطلب تصدير النموذج شيئين هما:
</p>

<ul>
	<li>
		إنشاء نسخة خاصة من النموذج متوافقة مع TorchScript باستخدام الراية <code>torchscript</code>
	</li>
	<li>
		تمرير بيانات تجريبية أو دخل وهمي إلى النموذج ليتمكن من تتبع العمليات الحسابية وتسجيلها بشكل صحيح
	</li>
</ul>

<p>
	يتضمن هذان الأمران الضروريان عدة أمور يجب على المطورين توخي الحذر بشأنها كما سنوضّح فيما يلي.
</p>

<h2 id="torchscripttiedweights">
	راية TorchScript والأوزان المرتبطة Tied Weights
</h2>

<p>
	لا يدعم TorchScript تصدير النماذج التي تحتوي على أوزان مرتبطة، لذا يجب فصل هذه الأوزان ونسخها مسبقًا قبل التصدير. لذا تُعَد الراية <code>torchscript</code> ضرورية لأن معظم النماذج اللغوية في<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%AD%D9%88%D9%91%D9%84%D8%A7%D8%AA-transformers-%D9%85%D9%86-%D9%85%D9%86%D8%B5%D8%A9-hugging-face-r2340/" rel=""> مكتبة المحولات Transformers</a> لها أوزان تربط بين طبقة التضمين <code>Embedding</code> وطبقة فك الترميز <code>Decoding</code>. وبما أن صيغة TorchScript لا تسمح بتصدير النماذج التي لها أوزان مرتبطة، لذا من الضروري فك الارتباط ونسخ الأوزان مسبقًا. تُفصَل طبقة التضمين <code>Embedding</code> عن طبقة فك الترميز <code>Decoding</code> للنماذج التي تنسخها الراية <code>torchscript</code>، مما يعني أنه لا ينبغي تدريبها لاحقًا، إذ سيؤدي التدريب إلى عدم مزامنة الطبقتين، وسيعطي نتائج غير متوقعة.
</p>

<p>
	لا ينطبق ذلك على النماذج التي لا تحتوي على رأس نموذج لغوي Language Model Head، فهذه النماذج لا تحتوي على أوزان مرتبطة، وبالتالي يمكن تصديرها بأمان بدون الراية <code>torchscript</code>.
</p>

<h2 id="">
	الدخل الوهمي والأطوال المعيارية
</h2>

<p>
	عند تصدير نموذج باستخدام TorchScript، يجب تنفيذ تمرير أمامي على دخل وهمي. هذا الدخل هو بيانات افتراضية تُمرَّر عبر النموذج لمساعدة باي تورش PyTorch على تسجيل العمليات التي يجري تنفيذها على كل موتر Tensor أثناء انتقال القيم بين الطبقات.
</p>

<h3 id="-1">
	لماذا نحتاج إلى الدخل الوهمي
</h3>

<p>
	يعتمد PyTorch على هذه العمليات المسجلة لإنشاء تعقّب Trace للنموذج، وهو ما يسمح بتحويله إلى صيغة TorchScript. لكن هذا التعقب يكون مرتبطًا بأبعاد الدخل الوهمي المستخدمة أثناء التصدير، مما يعني أن النموذج الناتج لن يدعم أطوال تسلسل أو أحجام دفعات مختلفة عن التي استُخدمت عند التتبع. إذا حاولنا تمرير بيانات بحجم مختلف عن الحجم المستخدم أثناء التصدير، فسيظهر خطأ، لأن النموذج لم يجري تعقّبه إلا لأبعاد محددة، ولا يستطيع التعامل مع أطوال مختلفة تلقائيًا، سيكون الخطأ على النحو التالي:
</p>

<pre class="ipsCode">`The expanded size of the tensor (3) must match the existing size (7) at non-singleton dimension 2`
</pre>

<p>
	يُوصَى بتعقّب النموذج باستخدام حجم دخل وهمي لا يقل عن أكبر حجم دخل للنموذج أثناء الاستدلال Inference. يمكن أن يساعد الحشو Padding في ملء القيم المفقودة، ولكن ستكون أبعاد المصفوفة كبيرة أيضًا بسبب تعقّب النموذج باستخدام حجم دخل أكبر، مما يؤدي لإجراء مزيد من العمليات الحسابية. انتبه إلى العدد الإجمالي للعمليات التي تجري على كل دخل وراقب الأداء عند تصدير نماذج ذات أطوال تسلسلٍ مختلفة.
</p>

<h2 id="torchscriptpython">
	استخدام صيغة TorchScript في بايثون Python
</h2>

<p>
	يوضّح هذا القسم كيفية حفظ النماذج وتحميلها وكيفية استخدام التعقّب للاستدلال.
</p>

<h3 id="-2">
	حفظ النموذج
</h3>

<p>
	يمكن تصدير نموذج <code>BertModel</code> باستخدام صيغة TorchScript من خلال إنشاء نسخة <code>BertModel</code> من الصنف <code>BertConfig</code> ثم حفظها على القرص الصلب باسم الملف <code>traced_bert.pt</code> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_66_15" style=""><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">BertModel</span><span class="pun">,</span><span class="pln"> </span><span class="typ">BertTokenizer</span><span class="pun">,</span><span class="pln"> </span><span class="typ">BertConfig</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> torch

enc </span><span class="pun">=</span><span class="pln"> </span><span class="typ">BertTokenizer</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="str">"google-bert/bert-base-uncased"</span><span class="pun">)</span><span class="pln">

</span><span class="com"># ‫ترميز Tokenizing النص المُدخل</span><span class="pln">
text </span><span class="pun">=</span><span class="pln"> </span><span class="str">"[CLS] Who was Jim Henson ? [SEP] Jim Henson was a puppeteer [SEP]"</span><span class="pln">
tokenized_text </span><span class="pun">=</span><span class="pln"> enc</span><span class="pun">.</span><span class="pln">tokenize</span><span class="pun">(</span><span class="pln">text</span><span class="pun">)</span><span class="pln">

</span><span class="com"># تقنيع‫ Masking أحد رموز Tokens الدخل</span><span class="pln">
masked_index </span><span class="pun">=</span><span class="pln"> </span><span class="lit">8</span><span class="pln">
tokenized_text</span><span class="pun">[</span><span class="pln">masked_index</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"[MASK]"</span><span class="pln">
indexed_tokens </span><span class="pun">=</span><span class="pln"> enc</span><span class="pun">.</span><span class="pln">convert_tokens_to_ids</span><span class="pun">(</span><span class="pln">tokenized_text</span><span class="pun">)</span><span class="pln">
segments_ids </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">]</span><span class="pln">

</span><span class="com"># إنشاء دخل وهمي</span><span class="pln">
tokens_tensor </span><span class="pun">=</span><span class="pln"> torch</span><span class="pun">.</span><span class="pln">tensor</span><span class="pun">([</span><span class="pln">indexed_tokens</span><span class="pun">])</span><span class="pln">
segments_tensors </span><span class="pun">=</span><span class="pln"> torch</span><span class="pun">.</span><span class="pln">tensor</span><span class="pun">([</span><span class="pln">segments_ids</span><span class="pun">])</span><span class="pln">
dummy_input </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">tokens_tensor</span><span class="pun">,</span><span class="pln"> segments_tensors</span><span class="pun">]</span><span class="pln">

</span><span class="com"># ‫تهيئة النموذج باستخدام راية torchscript</span><span class="pln">
</span><span class="com"># ضبط الراية على القيمة‫ True بالرغم من أن ذلك غير ضروري لأن هذا النموذج لا يحتوي على رأس النموذج اللغوي LM.</span><span class="pln">
config </span><span class="pun">=</span><span class="pln"> </span><span class="typ">BertConfig</span><span class="pun">(</span><span class="pln">
    vocab_size_or_config_json_file</span><span class="pun">=</span><span class="lit">32000</span><span class="pun">,</span><span class="pln">
    hidden_size</span><span class="pun">=</span><span class="lit">768</span><span class="pun">,</span><span class="pln">
    num_hidden_layers</span><span class="pun">=</span><span class="lit">12</span><span class="pun">,</span><span class="pln">
    num_attention_heads</span><span class="pun">=</span><span class="lit">12</span><span class="pun">,</span><span class="pln">
    intermediate_size</span><span class="pun">=</span><span class="lit">3072</span><span class="pun">,</span><span class="pln">
    torchscript</span><span class="pun">=</span><span class="kwd">True</span><span class="pun">,</span><span class="pln">
</span><span class="pun">)</span><span class="pln">

</span><span class="com"># إنشاء نسخة من النموذج</span><span class="pln">
model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">BertModel</span><span class="pun">(</span><span class="pln">config</span><span class="pun">)</span><span class="pln">

</span><span class="com"># يجب أن يكون النموذج في وضع التقييم</span><span class="pln">
model</span><span class="pun">.</span><span class="pln">eval</span><span class="pun">()</span><span class="pln">

</span><span class="com"># إذا أردنا إنشاء نسخة من النموذج باستخدام‫ *from_pretrained*، فيمكن أيضًا ضبط راية TorchScript بسهولة</span><span class="pln">
model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">BertModel</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="str">"google-bert/bert-base-uncased"</span><span class="pun">,</span><span class="pln"> torchscript</span><span class="pun">=</span><span class="kwd">True</span><span class="pun">)</span><span class="pln">

</span><span class="com"># إنشاء التعقّب</span><span class="pln">
traced_model </span><span class="pun">=</span><span class="pln"> torch</span><span class="pun">.</span><span class="pln">jit</span><span class="pun">.</span><span class="pln">trace</span><span class="pun">(</span><span class="pln">model</span><span class="pun">,</span><span class="pln"> </span><span class="pun">[</span><span class="pln">tokens_tensor</span><span class="pun">,</span><span class="pln"> segments_tensors</span><span class="pun">])</span><span class="pln">
torch</span><span class="pun">.</span><span class="pln">jit</span><span class="pun">.</span><span class="pln">save</span><span class="pun">(</span><span class="pln">traced_model</span><span class="pun">,</span><span class="pln"> </span><span class="str">"traced_bert.pt"</span><span class="pun">)</span></pre>

<h3 id="-3">
	تحميل النموذج
</h3>

<p>
	يمكننا الآن تحميل النموذج <code>BertModel</code> الذي حفظناه بالاسم <code>traced_bert.pt</code> من القرص الصلب واستخدامه مع الدخل الوهمي <code>dummy_input</code> المُهيَّأ مسبقًا كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_66_17" style=""><span class="pln">loaded_model </span><span class="pun">=</span><span class="pln"> torch</span><span class="pun">.</span><span class="pln">jit</span><span class="pun">.</span><span class="pln">load</span><span class="pun">(</span><span class="str">"traced_bert.pt"</span><span class="pun">)</span><span class="pln">
loaded_model</span><span class="pun">.</span><span class="pln">eval</span><span class="pun">()</span><span class="pln">

all_encoder_layers</span><span class="pun">,</span><span class="pln"> pooled_output </span><span class="pun">=</span><span class="pln"> loaded_model</span><span class="pun">(*</span><span class="pln">dummy_input</span><span class="pun">)</span></pre>

<h3 id="-4">
	استخدام نموذج مُتعقَّب للاستدلال
</h3>

<p>
	سنستخدم النموذج المتعقَّب للاستدلال باستخدام <a href="https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%83%D8%A7%D8%A6%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%88%D8%AC%D9%87-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-%D8%A7%D9%84%D8%AA%D9%88%D8%A7%D8%A8%D8%B9-%D8%A7%D9%84%D8%B3%D8%AD%D8%B1%D9%8A%D8%A9-dunder-methods-r2192/" rel="">التابع السحري</a> <code>__call__</code> الخاص به كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_66_19" style=""><span class="pln">traced_model</span><span class="pun">(</span><span class="pln">tokens_tensor</span><span class="pun">,</span><span class="pln"> segments_tensors</span><span class="pun">)</span></pre>

<h2 id="torchscripthuggingfaceawsneuronsdk">
	نشر نماذج TorchScript من منصة Hugging Face على خدمة AWS
</h2>

<p>
	قدمت خدمة AWS عائلة من نسخ <a href="https://aws.amazon.com/ec2/instance-types/inf1/" rel="external nofollow">Amazon EC2 Inf1</a> لاستدلال التعلم الآلي منخفض التكلفة وعالي الأداء في السحابة، حيث تعمل نسخ Inf1 باستخدام شريحة AWS Inferentia، والتي هي مسرّع للعتاد المُخصّص ومتخصصة في أحمال استدلال التعلم العميق. و <a href="https://awsdocs-neuron.readthedocs-hosted.com/en/latest/#" rel="external nofollow">AWS Inferentia</a> هي أداة SDK لشريحة Inferentia تدعم تعقّب نماذج المحوِّلات Transformers وتحسينها للنشر على Inf1، حيث توفر أداة Neuron SDK ما يلي:
</p>

<ol>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-api-r1314/" rel="">واجهة برمجة تطبيقات <abbr title="Application Programming Interface | واجهة برمجية">API</abbr></a> سهلة الاستخدام مع تغيير سطر واحد من الشيفرة البرمجية لتعقّب نموذج TorchScript وتحسينه للاستدلال في السحابة
	</li>
	<li>
		تحسينات الأداء الجاهزة لتحسين تكلفة الأداء
	</li>
	<li>
		دعم نماذج المحولات Transformers من منصة Hugging Face المبنية باستخدام إطار عمل <a href="https://awsdocs-neuron.readthedocs-hosted.com/en/latest/src/examples/pytorch/bert_tutorial/tutorial_pretrained_bert.html" rel="external nofollow">PyTorch</a> أو <a href="https://awsdocs-neuron.readthedocs-hosted.com/en/latest/src/examples/tensorflow/huggingface_bert/huggingface_bert.html" rel="external nofollow">TensorFlow</a>
	</li>
</ol>

<h3 id="-5">
	النتائج
</h3>

<p>
	تعمل نماذج المحولات Transformers المستندة إلى بنية <a href="https://huggingface.co/docs/transformers/main/model_doc/bert" rel="external nofollow">BERT</a>  أي تمثيلات المشفّر ثنائية الاتجاه من مكتبة المحوِّلات أو Bidirectional Encoder Representations from Transformers أو أنواعها المختلفة مثل <a href="https://huggingface.co/docs/transformers/main/model_doc/distilbert" rel="external nofollow">distilBERT</a> و <a href="https://huggingface.co/docs/transformers/main/model_doc/roberta" rel="external nofollow">roBERTa</a> بنجاح على Inf1 للمهام غير التوليدية مثل الإجابة على الأسئلة الاستخراجية وتصنيف التسلسلات وتصنيف الرموز، ولكن يمكن أيضًا تكييف مهام توليد النصوص لتشغيلها على Inf1. ويمكن العثور على مزيد من المعلومات حول النماذج التي يمكن تحويلها على Inferentia في قسم ملاءمة بنية النموذج في <a href="https://awsdocs-neuron.readthedocs-hosted.com/en/latest/general/models/index.html#models-inferentia" rel="external nofollow">توثيق Neuron</a>.
</p>

<h3 id="dependencies">
	الاعتماديات Dependencies
</h3>

<p>
	يتطلب استخدام AWS Neuron لتحويل النماذج <a href="https://awsdocs-neuron.readthedocs-hosted.com/en/latest/frameworks/torch/index.html?index.html=#installation-guide" rel="external nofollow">بيئةَ Neuron SDK</a> التي تكون مضبوطة مسبقًا على <a href="https://docs.aws.amazon.com/dlami/latest/devguide/tutorial-inferentia-launching.html" rel="external nofollow">AWS Deep Learning AMI</a>.
</p>

<h3 id="awsneuron">
	تحويل النموذج لأداة AWS Neuron
</h3>

<p>
	سنحوّل النموذج لأداة AWS NEURON باستخدام الشيفرة البرمجية نفسها من قسم استخدام صيغة TorchScript في بايثون التي شرحناها سابقًا في هذا المقال لتعقّب النموذج <code>BertModel</code>، ونستورد امتداد إطار عمل <code>torch.neuron</code> للوصول إلى مكونات Neuron SDK من خلال واجهة برمجة تطبيقات بايثون كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_66_23" style=""><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">BertModel</span><span class="pun">,</span><span class="pln"> </span><span class="typ">BertTokenizer</span><span class="pun">,</span><span class="pln"> </span><span class="typ">BertConfig</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> torch
</span><span class="kwd">import</span><span class="pln"> torch</span><span class="pun">.</span><span class="pln">neuron</span></pre>

<p>
	وكل ما علينا فعله هو تعديل السطر التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_66_25" style=""><span class="pun">-</span><span class="pln"> torch</span><span class="pun">.</span><span class="pln">jit</span><span class="pun">.</span><span class="pln">trace</span><span class="pun">(</span><span class="pln">model</span><span class="pun">,</span><span class="pln"> </span><span class="pun">[</span><span class="pln">tokens_tensor</span><span class="pun">,</span><span class="pln"> segments_tensors</span><span class="pun">])</span><span class="pln">
</span><span class="pun">+</span><span class="pln"> torch</span><span class="pun">.</span><span class="pln">neuron</span><span class="pun">.</span><span class="pln">trace</span><span class="pun">(</span><span class="pln">model</span><span class="pun">,</span><span class="pln"> </span><span class="pun">[</span><span class="pln">token_tensor</span><span class="pun">,</span><span class="pln"> segments_tensors</span><span class="pun">])</span></pre>

<p>
	هذا يتيح لأداة Neuron SDK تعقّب النموذج وتحسينه لنسخ Inf1.
</p>

<p>
	وأخيرًا ننصح بمطالعة توثيق <a href="https://awsdocs-neuron.readthedocs-hosted.com/en/latest/index.html" rel="external nofollow">AWS NeuronSDK</a> لمعرفة المزيد عن ميزات AWS Neuron SDK وأدواتها وبرامجها التعليمية وتحديثاتها الأخيرة.
</p>

<h2 id="-6">
	الخلاصة
</h2>

<p>
	شرحنا في هذا المقال كيفية تصدير نماذج المحولات Transformers إلى صيغة TorchScript لاستخدامها في بيئات غير Python. يتطلب الأمر تطبيق راية <code>torchscript</code> على النموذج وفصل الأوزان المرتبطة بين الطبقات. كما وضحنا طريقة تمرير دخل وهمي لتسجيل العمليات الحسابية وتحويل النموذج إلى صيغة قابلة للتسلسل. وعرضنا كيفية استخدام هذا النموذج في Python بعد تصديره وحفظه. وأخيرًا شرحنا كيفية تحسين النماذج واستخدامها على خدمات AWS باستخدام Neuron SDK.
</p>

<p>
	ترجمة -وبتصرّف- للقسم <a href="https://huggingface.co/docs/transformers/torchscript" rel="external nofollow">Export to TorchScript</a> من توثيقات Hugging Face.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%86%D8%B8%D8%B1%D8%A9-%D8%B9%D8%A7%D9%85%D8%A9-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%B5%D9%86%D9%81-trainer-%D9%81%D9%8A-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%AD%D9%88%D9%84%D8%A7%D8%AA-transformers-r2492/" rel="">نظرة عامة على الصنف Trainer في مكتبة المحولات Transformers</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AC%D9%88%D9%84%D8%A9-%D8%B3%D8%B1%D9%8A%D8%B9%D8%A9-%D9%84%D9%84%D8%A8%D8%AF%D8%A1-%D9%85%D8%B9-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%AD%D9%88%D9%91%D9%84%D8%A7%D8%AA-transformers-r2351/" rel="">جولة سريعة للبدء مع مكتبة المحوّلات Transformers</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%AD%D9%88%D9%91%D9%84%D8%A7%D8%AA-transformers-r2352/" rel="">تثبيت مكتبة المحوّلات Transformers</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A8%D9%86%D8%A7%D8%A1-%D9%86%D9%85%D8%A7%D8%B0%D8%AC-%D9%85%D8%AE%D8%B5%D8%B5%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-transformers-%D9%81%D9%8A-hugging-face-r2481/" rel="">بناء نماذج مخصصة باستخدام مكتبة Transformers في Hugging Face</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2501</guid><pubDate>Wed, 29 Jan 2025 15:08:01 +0000</pubDate></item><item><title>&#x623;&#x633;&#x626;&#x644;&#x629; &#x648;&#x625;&#x62C;&#x627;&#x628;&#x627;&#x62A; &#x62D;&#x648;&#x644; &#x627;&#x644;&#x630;&#x643;&#x627;&#x621; &#x627;&#x644;&#x627;&#x635;&#x637;&#x646;&#x627;&#x639;&#x64A; &#x648;&#x645;&#x639;&#x627;&#x644;&#x62C;&#x629; &#x627;&#x644;&#x644;&#x63A;&#x629; &#x627;&#x644;&#x637;&#x628;&#x64A;&#x639;&#x64A;&#x629; NLP</title><link>https://academy.hsoub.com/programming/artificial-intelligence/%D8%A3%D8%B3%D8%A6%D9%84%D8%A9-%D9%88%D8%A5%D8%AC%D8%A7%D8%A8%D8%A7%D8%AA-%D8%AD%D9%88%D9%84-%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%88%D9%85%D8%B9%D8%A7%D9%84%D8%AC%D8%A9-%D8%A7%D9%84%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%B7%D8%A8%D9%8A%D8%B9%D9%8A%D8%A9-nlp-r2496/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2025_01/-------.png.c4fa37ae9bd1afd0c7ff6a8f53fe45be.png" /></p>
<p>
	سنغطي في هذا المقال أسئلة واسعة حول تعلم الآلة Machine Learning، ومعالجة اللغات الطبيعية Natural Language Processing، والذكاء الاصطناعي Artificial Intelligence بهدف توسيع المهارات حول هذه التقنيات الحديثة، سنحاول الإجابة على مجموعة من الأسئلة المهمة بدءًا من أساسيات هذا المجال، والتقنيات الموصى بها، وصولًا إلى النماذج اللغوية المتقدمة مثل GPT 4، كما سنتناول التحديات التي تواجه المنتجات والأعمال المرتبطة بمعالجة اللغات الطبيعية ونناقش مستقبل هذا المجال.
</p>

<h2 id="-1">
	أسئلة حول أساسيات معالجة اللغات الطبيعية
</h2>

<p>
	فيما يلي مجموعة أسئلة وإجابات حول أساسيات معالجة اللغات الطبيعية.
</p>

<h3>
	ما خطوات الانتقال من تطوير التطبيقات التقليدية لاحتراف مجال تعلم الآلة ML
</h3>

<p>
	في مجال تعلم الآلة، يحتاج المطور إلى استيعاب المفاهيم النظرية أولًا فهي تشكل الأساس الذي يبنى عليه كل شيء. ولكن من المهم أيضًا أن يتعرف على التقنيات واللغات الحديثة التي تدعم هذا المجال ويمكن تحقيق ذلك بحضور <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D9%81%D8%B6%D9%84-%D8%AF%D9%88%D8%B1%D8%A7%D8%AA-%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-r2332/" rel="">دورات تدريبية حول الذكاء الاصطناعي</a> وتعلم الآلة وتنفيذ ما يتعلمه بشكل عملي.
</p>

<p>
	أما بالنسبة للغات البرمجة، فلغة <a href="https://wiki.hsoub.com/Python" rel="external">بايثون</a> هي الخيار الأمثل للمطورين المبتدئين في تعلم الآلة فهي لغة برمجة عالية المستوى، وتحظى بشعبية واسعة، وتتميز بوجود مجتمع كبير يدعمها، كما تحتوي بايثون على مكتبات قوية في مجال تعلم الآلة مثل تنسرفلو  <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D9%86%D8%B5%D8%A9-%D8%AA%D9%86%D8%B3%D8%B1%D9%81%D9%84%D9%88-tensorflow-%D9%84%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-r2491/" rel="">TensorFlow</a> وساي كت ليرن <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-scikit-learn-%D9%88%D8%A3%D9%87%D9%85-%D8%AE%D9%88%D8%A7%D8%B1%D8%B2%D9%85%D9%8A%D8%A7%D8%AA%D9%87%D8%A7-r2485/" rel="">Scikit-learn</a> التي تسهّل الوصول إلى الأدوات اللازمة لتطبيق مفاهيم تعلم الآلة.
</p>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة الذكاء الاصطناعي
		</p>

		<p class="banner-subtitle">
			احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة.
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/artificial-intelligence" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<a href="https://academy.hsoub.com/learn/artificial-intelligence" rel=""><img alt="دورة الذكاء الاصطناعي AI" src="https://academy.hsoub.com/learn/assets/images/courses/artificial-intelligence.png"></a>
	</div>
</div>

<p>
	 
</p>

<h3>
	هل تتطلب دراسة معالجة اللغة الطبيعية معرفة بمجال اللغويات Linguistics ونظرية المعلومات
</h3>

<p>
	تشكل نظرية المعلومات Information Theory الأساس الذي يعتمد عليه الكثيرون في فهم طريقة معالجة البيانات والمعلومات بطريقة منظمة وفعّالة، وهي تستخدم في مجالات متعددة، بما في ذلك معالجة اللغة الطبيعية NLP. فعلم البيانات ونظرية المعلومات يرتبطان ارتباطًا وثيقًا ببعضهما، وبالتالي فإن الفهم الجيد لمفاهيم مثل انتروبية المعلومات Information Entropy سيسهم في تعزيز قدرتنا على تطوير <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%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/" rel="">تطبيقات ذكاء اصطناعي</a> احترافية، وسيساعدنا توظيف هذه المبادئ على التعمق في معالجة اللغات الطبيعية.
</p>

<p>
	أما بالنسبة للغويات Linguistics وفهم بنية وقواعد اللغة فلا يتطلب الأمر بالضرورة الحصول على شهادة أكاديمية في هذا المجال. ويمكننا الاستفادة من الدورات التدريبية عبر الإنترنت التي توفر محتوى تطبيقي يساعد في تعزيز مهاراتنا، فمن خلال هذه الدورات سنتمكن من اكتساب الخبرة اللازمة لتطبيق تقنيات معالجة اللغات الطبيعية باحترافية.
</p>

<h3>
	ما هي نماذج BERT وGPT وما الأمثلة الواقعية عنها
</h3>

<p>
	نماذج BERT وGPT هما نوعان من النماذج اللغوية Language Models المدربة على كميات ضخمة من النصوص بهدف أداء مهام معينة مثل ملء المعلومات الناقصة في النصوص Text Infilling. إن هذه النماذج مهيأة بشكل خاص للاستخدام في التفاعل الحواري، حيث يمكنها فهم السياق اللغوي، والرد على الاستفسارات بطريقة طبيعية مشابهة لطريقة البشر.
</p>

<p>
	كما تُظهر نماذج BERT وGPT أداء مذهلًا وتتفوق في العديد من التطبيقات الأخرى غير الحوارية، مثل حل المسائل الرياضية أو ترجمة النصوص. ويُظهِر كل من نموذج BERT الذي يعتمد على المعالجة ثنائية الاتجاه للنصوص Bidirectional Processing ونموذج GPT الذي يعتمد على النماذج اللغوية التوليدية Generative Language Models قدرة فائقة على فهم وتوليد اللغة في العديد من السياقات. وأحد الأمثلة الواقعية على استخدام GPT هو <a href="https://academy.hsoub.com/apps/web/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A8%D9%88%D8%AA-%D8%A7%D9%84%D9%85%D8%AD%D8%A7%D8%AF%D8%AB%D8%A9-%D8%A7%D9%84%D8%B0%D9%83%D9%8A-%D8%B4%D8%A7%D8%AA-%D8%AC%D9%8A-%D8%A8%D9%8A-%D8%AA%D9%8A-chatgpt-r863/" rel="">روبوت الدردشة ChatGPT</a>، أما نموذج BERT فيستخدم بشكل رئيسي في <a href="https://academy.hsoub.com/marketing/search-engine-optimisation/%D8%AA%D8%AD%D8%B3%D9%8A%D9%86-%D9%85%D8%AD%D8%B1%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%AD%D8%AB-seo-%D9%88%D8%A3%D9%87%D9%85%D9%8A%D8%AA%D9%87%D8%A7-%D9%84%D9%85%D9%88%D9%82%D8%B9%D9%83-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A-r490/" rel="">تحسين محركات البحث SEO</a> وأنظمة التوصية.
</p>

<h3>
	ما أبرز الأدوات المفيدة في مجال معالجة اللغات الطبيعية
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="166047" href="https://academy.hsoub.com/uploads/monthly_2025_01/NLP-Tools.png.ba59326154011d5d4ab139e3dcdc3944.png" rel=""><img alt="nlp tools" class="ipsImage ipsImage_thumbnailed" data-fileid="166047" data-unique="or11i301a" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_01/NLP-Tools.thumb.png.bb77cbc853028090ab621fba08136d9e.png"> </a>
</p>

<p>
	من أبرز أدوات معالجة اللغة الطبيعية NLP نذكر:
</p>

<ul>
	<li>
		لغات البرمجة مثل بايثون Python و R
	</li>
	<li>
		الخدمات السحابية مثل Amazon Web Services و Microsoft Azure
	</li>
	<li>
		خدمات تسيير العمل مثل Apache Airflow و Amazon Neptune
	</li>
	<li>
		النماذج اللغوية مثل  GPT و BERT
	</li>
</ul>

<h3>
	أي لغة أفضل في تحليل النصوص لغة بايثون أم R
</h3>

<p>
	يُفضِّل كثيرون استخدام لغة بايثون في كل شيء، وليس في علم البيانات فقط، فلهذه اللغة <a href="https://academy.hsoub.com/programming/python/%D9%85%D9%85%D9%8A%D8%B2%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86/" rel="">مميزات عديدة</a> من أبرزها سهولتها ووجود مجتمع كبير داعم لها، وتوفر العديد من مكتبات تحليل النصوص واستخراج المعلومات مثل NLTK و spaCy و TextBlob. أما <a href="https://academy.hsoub.com/programming/r-language/" rel="">لغة R</a>، فهي مختلفة عن لغات البرمجة الأخرى وقد يكون استخدامها صعبًا ومعقدًا في بيئة الإنتاج. لكن قدراتها في مجال الإحصاء الرياضي يعطيها ميزة كبيرة مقارنة بلغة بايثون.
</p>

<h3>
	ما هي الخدمة السحابية الأفضل لبناء النماذج ونشرها
</h3>

<p>
	هناك العديد من الخدمات السحابية المتاحة لبناء النماذج Models ونشرها مثل خدمات AWS و Azure و Google، يمكن اختيار الخدمة التي تناسبنا وينصح الكاتب باستخدام منصة AWS لأنها تجنبنا مشكلة احتكار البائع Vendor Lock-in التي قد نواجهها عندما نعتمد على مزود سحابي معين، والتي قد تعيق انتقالنا إلى مزود آخر بسهولة وتكبدنا تكاليف ضخمة وتحديات كبيرة في نقل بيئة العمل.
</p>

<h3>
	هل يفيدنا استخدام أدوات تسيير العمل في خطوط عمل معالجة اللغة الطبيعية
</h3>

<p>
	نعم، تفيد أدوات تسيير العمل مثل Prefect أو Airflow أو Luigi أو Neptune بشكل فعّال في خطوط عمل معالجة اللغة الطبيعية NLP pipelines، لاسيما عندما يتطلب الأمر تنسيق عدة عمليات مع الحاجة لإضافة أو تعديل خطوط العمل في المستقبل.
</p>

<p>
	فهذه الأدوات ضرورية في حالات معالجة البيانات الضخمة التي تتطلب عمليات استخراج البيانات Extract، وتحويلها Transform، وتحميلها Load، والمعروفة اختصارًا بعمليات ETL، وهي تساهم في إدارة العمليات بثقة ومرونة وتنظم تنفيذ العمليات المعقدة، وتُسهّل التعامل مع تدفقات البيانات وتحسن الكفاءة في مشاريع معالجة اللغة الطبيعية.
</p>

<h3>
	ما الأدوات التي يُوصى بها في مجال تعلم الآلة ومعالجة اللغات الطبيعية
</h3>

<p>
	ينصح الكاتب باستخدام التابع <code>style</code> من مكتبة Pandas لعرض البيانات وإجراء مقارنات سريعة بينها. كما ينصح باستخدام MLflow عند الحاجة لمشاركة نتائج تجربة معينة مع فريق من المبرمجين أو <a href="https://academy.hsoub.com/programming/general/%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA/" rel="">علماء البيانات</a>، واستخدام مكتبة <code>ploty</code> بدلًا من <code>matplotlib</code> للحصول على تقارير تفاعلية، ويمكن استخدام <a href="https://wandb.ai/site" rel="external nofollow">منصة Weights &amp; Biases</a> في مجال <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86-%D9%84%D9%81%D9%87%D9%85-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%82-r1422/" rel="">التعلم العميق Deep Learning</a>، لأن مراقبة الموترات أو التنسورات <a href="https://ar.wikipedia.org/wiki/%D9%85%D9%88%D8%AA%D8%B1" rel="external nofollow">tensors</a> -وهي البنية الأساسية للبيانات التي تعالجها الشبكة العصبية- أصعب بكثير من مراقبة المقاييس metrics بسبب طبيعة البيانات التي تعمل بها التنسورات، حيث تحتوي على معلومات متعددة الأبعاد قد تكون ضخمة ومعقدة، في حين أن المقاييس، مثل دقة النموذج accuracy و خسارة النموذج Loss فهي قيم واحدة مفردة يجري تحديثها باستمرار وعرضها خلال تدريب النموذج ومن السهل تتبعها وتحليلها.
</p>

<h2 id="-2">
	نصائح وأسئلة حول العمل في مجال معالجة اللغة الطبيعية
</h2>

<p>
	فيما يلي مجموعة أسئلة وإجابات مرتبطة بالعمل في مجال معالجة اللغات الطبيعية.
</p>

<h3>
	كيف يمكن تقسيم المهام اليومية في تنظيف البيانات وبناء نماذج التطبيقات
</h3>

<p>
	يعد تنظيف البيانات Data Cleaning وهندسة الميزات Feature Engineering من المهام التي تتطلب وقتًا كبيرًا عند تطوير تطبيقات فعلية، نظرًا لأن جودة البيانات هي الأساس الذي يعتمد عليه تعلم الآلة في تقديم حلول فعّالة. لذا، يُنصح بتخصيص أكبر قدر ممكن من الوقت لبناء النماذج Models، خصوصًا عندما تكون متطلبات التطبيق بسيطة ومحدودة، ولا تحتاج إلى استخدام تقنيات معقدة أو حلول مبتكرة للوصول إلى النتائج المطلوبة.
</p>

<h3>
	كيف يمكن تحليل جدوى لنموذج تعلم آلة لا يحقق الأداء المطلوب
</h3>

<p>
	لو طُلب منا العمل على نموذج تعلم آلة لا يحقق الأداء المطلوب مهما درّبناه، وأردنا إجراء تحليل جدوى لتوفير الوقت وتقديم دليل على أن من الأفضل الانتقال إلى طرق أخر فيمكننا استخدام <a href="https://academy.hsoub.com/entrepreneurship/business/%D9%85%D8%A7-%D9%87%D9%88-%D8%A5%D8%B7%D8%A7%D8%B1-%D8%B9%D9%85%D9%84-%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%B1%D9%86-lean-software-development%D8%9F-r1094/" rel="">أسلوب التطوير المرن Lean</a> الذي يهدف إلى تحقيق أفضل النتائج بأقل جهد ووقت، يجري ذلك من خلال معالجة بسيطة مسبقة للبيانات Data Preprocessing، واستخدام مجموعة نماذج بسيطة سهلة التنفيذ، واتباع ممارسات من شأنها ضمان عمل النموذ بشكل صحيح مثل فصل مجموعات التدريب، والتحقق من الصحة validation، واستخدام الاختبار والتقويم المتقاطع cross-validation عند الإمكان. فباستخدام هذه الخطوات البسيطة، يمكننا تقييم فيما إذا كان النموذج الحالي قابل للتحسين أو من الأفضل استخدام نماذج أخرى لتحقيق الأداء المطلوب.
</p>

<h3>
	هل يمكن بناء نماذج تعلم آلة تستخدم موارد أقل وبجودة النماذج الأكبر حجمًا
</h3>

<p>
	نعم، يمكن بناء نماذج أصغر باستخدام تقنيات مثل التقليم Pruning. والتقليم هو عملية تقليص حجم النموذج عن طريق إزالة العناصر غير المهمة التي لا تؤثر بشكل كبير على أداء النموذج. تساعدنا هذه التقنية في تقليل حجم النموذج وتحسين كفاءته الحسابية وتمكننا من تشغيله على أجهزة أقل قوة مع الحفاظ على نفس مستوى الأداء.
</p>

<p>
	من الأمثلة الحديثة على ذلك <a href="https://www.deepmind.com/publications/an-empirical-analysis-of-compute-optimal-large-language-model-training" rel="external nofollow">نموذج Chinchilla</a> من DeepMind، فعلى الرغم من أن هذا النموذج أصغر بكثير من النماذج القوية مثل GPT-3 من حيث الحجم الحسابي، إلا أنه يقدم أداء أفضل. وهذا يثبت أن تقنيات مثل التقليم يمكن أن تساعدنا في تحسين الكفاءة الحسابية وتحقيق نتائج عالية الأداء بنماذج أصغر.
</p>

<h2 id="-3">
	أسئلة حول منتجات الذكاء الاصطناعي ورؤى الأعمال
</h2>

<p>
	فيما يلي مجموعة أمثلة وإجابات حول منتجات الذكاء الاصطناعي ورؤى الأعمال
</p>

<h3>
	ما هي الخطوات المتبعة في دورة تطوير منتجات تعلم الآلة
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="166048" href="https://academy.hsoub.com/uploads/monthly_2025_01/2057859364_.png.0bbe482fdb51bdf197cd3a16e4464e83.png" rel=""><img alt="دورة تطوير منتجات تعلم الآلة" class="ipsImage ipsImage_thumbnailed" data-fileid="166048" data-unique="sybs8iooe" style="width: 500px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_01/.thumb.png.0143c996c3019fdf8a764da24c7e9da6.png"> </a>
</p>

<p>
	تتكون دورة تطوير منتجات تعلم الآلة من عدة خطوات أساسية: تبدأ الدورة بتحليل البيانات الاستكشافي Exploratory Data Analysis أو اختصارًا EDA من خلال فحص البيانات بعناية لتحديد ما هو ضروري للعمل على منتج تعلم الآلة، بعدها تُناقش نتائج التحليل مع الفريق وتقيّم أهداف المشروع لضمان وضوح التوجهات بعد تحديد الأهداف، ثم تُستَخدم نماذج بسيطة لتوليد نتائج مرجعية تساعد في تحديد أفضل الحلول، وأخيرًا يجري تحسين النماذج وتعديلها لتحقيق النتائج المثلى وفقًا لمقاييس الأداء. وخلال جميع الخطوات يجب أن يكون هناك تواصل مستمر مع العميل لضمان تطابق الحلول مع احتياجاته.
</p>

<h3>
	ما تحديات تطبيق الذكاء الاصطناعي وتعلم الآلة في تطوير المنتجات
</h3>

<p>
	في الوقت الحالي، هناك تحديان رئيسيان في مجال الذكاء الاصطناعي وتعلم الآلة: الأول هو الذكاء الاصطناعي العام Artificial General Intelligence أو AGI اختصارًا، والذي أصبح محور اهتمام كبير فهو نوع من الذكاء الاصطناعي يُفترض أن يكون قادرًا على أداء أي مهمة يمكن أن يؤديها الإنسان. لكن رغم الاهتمام الكبير به، لا زال تحقيقه غير ممكن في الوقت الحالي، وما زال أمامنا وقت طويل للوصول إلى تحقيق مستوى عالي من الكفاءة في أداء مهام متنوعة، ولا زال الذكاء الاصطناعي يواجه صعوبة في التعامل مع مشكلات لم يتعلم كيفية حلها مسبقًا.
</p>

<p>
	الحد الثاني في الذكاء الاصطناعي هو التعلم المعزز Reinforcement Learning حيث يعتمد هذا النوع من التعلم على تحسين الأنظمة من خلال المحاولة والتجربة والتفاعل مع البيئة بدلاً من الاعتماد على البيانات الضخمة Big data. ورغم أنه يعد بديلاً للتعلم التقليدي القائم على البيانات الضخمة والتعلم الخاضع للإشراف Supervised learning، إلا أن جمع البيانات اللازمة لتعلم جميع المهام البشرية أمر يستغرق وقتًا طويلاً، وحتى إذا جمعنا البيانات المطلوبة، قد لا تكون كافية لإنشاء نموذج ذكي يعمل بنفس مستوى الكفاءة التي يعمل بها البشر، خاصة عندما تتغير الظروف والبيئات في المستقبل. فهذه التغيرات قد تؤثر على قدرة النموذج على التكيف مع التحديات الجديدة. لذا من غير المحتمل أن يتمكن مجتمع الذكاء الاصطناعي من حل هذه المشكلات قريبًا، وإذا تمكن من ذلك، ستتحول التحديات إلى أمور تتعلق بالكفاءة الحسابية.
</p>

<h3>
	ما حالات استخدام عمليات تعلم الآلة
</h3>

<p>
	تعد عمليات تعلم الآلة Machine Learning Operations أو MLOps اختصارًا، ممتازة لعديد من المنتجات والأهداف مثل الحلول المصممة بدون خادم <a href="https://academy.hsoub.com/devops/cloud-computing/%D8%B3%D8%A8%D8%B9-%D9%85%D9%86%D8%B5%D8%A7%D8%AA-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-%D9%84%D9%84%D8%A8%D8%AF%D8%A1-%D9%81%D9%8A-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%AD%D9%88%D8%B3%D8%A8%D8%A9-%D8%AE%D9%81%D9%8A%D8%A9-%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%AF%D9%85-serverless-r408/" rel="">Serverless</a> والتي تُحَصَّل الرسوم فيها مقابل ما نستخدمه والتي لا نحتاج فيها إلى إدارة الخوادم أو القلق بشأن صيانتها، وكذلك تستخدم في واجهات برمجة تطبيقات تعلم الآلة التجارية مثل التنبؤ بالطلب على المنتجات أو تحسين تجربة العملاء، كما تُستخدم خدمات مجانية مثل MLflow لمتابعة ومراقبة التجارب أثناء تطوير النماذج في مراحلها الأولى، ومراقبة الأداء بعد نشر التطبيقات.
</p>

<h3>
	كيف نقنع العميل أو المدير باستخدام تعلم الآلة في التطبيقات
</h3>

<p>
	تتمتع عمليات تعلم الآلة بفوائد كبيرة في التطبيقات على مستوى المؤسسات، حيث تساهم في تحسين كفاءة عملية التطوير وتقليل التكاليف التقنية. ومع ذلك، من المهم تقييم مدى ملاءمة الحل المقترح للهدف المطلوب. على سبيل المثال، إذا كان لدينا خادم في مكتبنا ويمكن ضمان تلبية متطلبات اتفاقية مستوى الخدمة Service-level agreement أو اختصارًا SLA، ومعرفة عدد الطلبات المتوقعة، فلن نحتاج لاستخدام خدمات عمليات تعلم الآلة المُدارة managed MLOps service. تحدث المشكلات الشائعة عندما نفترض أن الخدمة المُدارة ستلبي جميع متطلبات المشروع، مثل أداء النموذج، ومتطلبات اتفاقية مستوى الخدمة SLA، وقابلية التوسع، وغيرها.
</p>

<p>
	على سبيل المثال، يتطلب إنشاء واجهة برمجة تطبيقات للتعرف الضوئي على الحروف  Optical Character Recognition أو OCR اختصارًا إجراء ختبارات دقيقة لتقييم نقاط الفشل وكيفية حدوثها. ويجب استخدام هذه الاختبارات لتحديد العوائق التي قد تعيق الوصول إلى الأداء المطلوب.
</p>

<h3>
	كيف تحدد المؤسسات احتياجات العميل بدقة وتنشئ نماذج تساعد في اتخاذ القرارات
</h3>

<p>
	تُضيف أدوات علم البيانات مزيدًا من الغموض للعميل مقارنة بحلول البرمجة التقليدية، لأنها تعتمد غالبًا على التعامل مع حالات عدم اليقين بدلاً من تجنبها. لهذا، من الضروري أن يظل العميل على اطلاع دائم بسير العمل فالعميل هو الأكثر دراية باحتياجات المشروع وهو من يوافق على النتيجة النهائية.
</p>

<h2 id="-4">
	أسئلة حول مستقبل معالجة اللغات الطبيعية
</h2>

<p>
	فيما يلي مجموعة أمثلة وإجابات حول مستقبل معالجة اللغات الطبيعية وتحديات تطبيقها.
</p>

<h3>
	ما مبرر ارتفاع استهلاك الطاقة الناتج عن الشبكات العصبية التلافيفية الكبيرة CNNs
</h3>

<p>
	قد يعتقد البعض أن نماذج مثل LLaMA من شركة Meta غير مفيدة وتهدر الموارد. ومع ذلك، بما أن هذه النماذج ستكون متاحة مجانًا للجمهور في المستقبل، فإن الاستثمارات التي تُنفق على تدريب هذه النماذج ستعود بالفائدة على المدى البعيد وستساهم في تقدم الأبحاث والتقنيات، فبتقديم هذه النماذج، نفتح الفرصة للباحثين والمطورين للاستفادة منها في مجالات متنوعة، ونسرع من الابتكار ونعزز من تقدم الذكاء الاصطناعي بشكل عام.
</p>

<h3>
	هل استطاعت نماذج الذكاء الاصطناعي اكتساب وعي يماثل الوعي البشري
</h3>

<p>
	إن الوعي في الذكاء الاصطناعي هو مفهوم نظري للغاية، والحديث عن وعي الذكاء الاصطناعي قد يكون غير دقيق في الغالب، ويؤثر سلبًا على فهم معالجة اللغات الطبيعية. بالعموم، تظل مشاريع الذكاء الاصطناعي اصطناعية ولا تمتلك وعيًا مشابهًا للوعي البشري.
</p>

<h3>
	هل يجب أن نقلق بشأن القضايا الأخلاقية المتعلقة بالذكاء الاصطناعي وتعلم الآلة
</h3>

<p>
	يجب أن نكون حذرين بشأن ذلك خاصة مع التقدم السريع في أنظمة الذكاء الاصطناعي مثل ChatGPT. ولكن، من المهم أن يكون لدينا تعليم وخبرة كافية لفهم هذه التقنية بشكل جيد. ومن المفترض أن تكون الحكومات هي المسؤولة عن تنظيم الأمور، ما زلنا بحاجة إلى وقت إضافي لتحقيق ذلك، ولعل إحدى القضايا الأخلاقية المهمة هي كيفية تقليل تحيز الذكاء الاصطناعي وتجنبه ومسؤولية ذلك تقع على عاتق المهندسين والشركات، وكذلك على العملاء. لذا يجب بذل جهد كبير لضمان عدم التمييز أو المعاملة غير العادلة لأي شخص، بغض النظر عن تكاليف تحقيق ذلك.
</p>

<h2>
	الخاتمة
</h2>

<p>
	ختامًا، لنتذكر أن تعلم الآلة هو المحرك الرئيسي الذي يمكن أن يقود البشرية إلى ثورتها الصناعية القادمة. فقد اختفت وظائف عدة أثناء الثورة الصناعية، ولكن ظهرت وظائف جديدةً أكثر إبداعًا ويمكنها تأدية عمل ينجزه عدد كبير من العمال. وبإمكاننا فعل الشيء نفسه الآن والتكيف مع تعلم الآلة والذكاء الاصطناعي بشكل إيجابي وفعال.
</p>

<p>
	ترجمة، وبتصرّف، للمقال <a href="https://www.toptal.com/artificial-intelligence/ask-an-nlp-engineer" rel="external nofollow">Ask an NLP Engineer: From GPT Models to the Ethics of AI</a>، لكاتبه Daniel Pérez Rubio.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-r1009/" rel="">المفاهيم الأساسية لتعلم الآلة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%85%D8%AC%D8%A7%D9%84%D8%A7%D8%AA-%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/" rel="">مجالات الذكاء الاصطناعي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%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-%D8%A3%D9%87%D9%85-%D8%A7%D9%84%D8%A5%D9%86%D8%AC%D8%A7%D8%B2%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D8%A7%D8%AE%D8%AA%D8%B1%D8%A7%D8%B9%D8%A7%D8%AA-%D9%88%D9%83%D9%8A%D9%81-%D8%A3%D8%AB%D8%B1%D8%AA-%D9%81%D9%8A-%D8%AD%D9%8A%D8%A7%D8%AA%D9%86%D8%A7-%D8%A7%D9%84%D9%8A%D9%88%D9%85%D9%8A%D8%A9-r975/" rel="">الذكاء الاصطناعي: أهم الإنجازات والاختراعات وكيف أثرت في حياتنا اليومية</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%86%D8%B8%D8%B1%D8%A9-%D8%B3%D8%B1%D9%8A%D8%B9%D8%A9-%D8%B9%D9%84%D9%89-%D9%85%D8%AC%D8%A7%D9%84-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-r1933/" rel="">نظرة سريعة على مجال تعلم الآلة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%83%D9%84-%D9%85%D8%A7-%D8%AA%D9%88%D8%AF-%D9%85%D8%B9%D8%B1%D9%81%D8%AA%D9%87-%D8%B9%D9%86-%D8%AF%D8%B1%D8%A7%D8%B3%D8%A9-%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-r2362/" rel="">كل ما تود معرفته عن دراسة الذكاء الاصطناعي</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2496</guid><pubDate>Thu, 23 Jan 2025 15:00:00 +0000</pubDate></item><item><title>&#x62A;&#x635;&#x62F;&#x64A;&#x631; &#x646;&#x645;&#x627;&#x630;&#x62C; Transformers &#x644;&#x635;&#x64A;&#x63A;&#x62A;&#x64A; ONNX &#x648; TFLite</title><link>https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B5%D8%AF%D9%8A%D8%B1-%D9%86%D9%85%D8%A7%D8%B0%D8%AC-transformers-%D9%84%D8%B5%D9%8A%D8%BA%D8%AA%D9%8A-onnx-%D9%88-tflite-r2497/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2025_01/TransformersONNXTFLiteOptimum_.png.6325718a200a430afab8183aaf451c86.png" /></p>
<p>
	يتطلب نشر نماذج <span ipsnoautolink="true">مكتبة المحوِّلات Transformers</span> التي توفرها منصة Huggingface في بيئات الإنتاج تصدير النماذج إلى صيغة متسلسلة Serialized أي إلى صيغة يمكن تحميلها وتنفيذها في أوقات تشغيل وعلى عتاد متخصص.
</p>

<p>
	سنشرح في مقال اليوم كيفية تصدير نماذج Transformers باستخدام مكتبة Optimum وهي امتداد <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%AD%D9%88%D9%91%D9%84%D8%A7%D8%AA-transformers-%D9%85%D9%86-%D9%85%D9%86%D8%B5%D8%A9-hugging-face-r2340/" rel="">لمكتبة المحولات Transformers</a> تتيح تصدير النماذج من إطار عمل باي تورش PyTorch أو تنسر فلو TensorFlow إلى صيغ متسلسلة مثل ONNX و TFLite عبر وحدة <code>exporters</code>، وتوفر المكتبة أيضًا مجموعة من أدوات تحسين الأداء لتدريب النماذج وتشغيلها بكفاءة.
</p>

<h2 id="transformersonnx">
	تصدير نماذج Transformers إلى صيغة ONNX
</h2>

<p>
	صيغة <a href="https://onnx.ai/" rel="external nofollow">ONNX</a> هي اختصار لعبارة Open Neural Network eXchange وهي معيار مفتوح يحدّد مجموعة من المعاملات وصيغة ملفات مشتركة لتمثيل نماذج التعلم العميق <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86-%D9%84%D9%81%D9%87%D9%85-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%82-r1422/" rel="">Deep Leaning</a> في مجموعة متنوعة من أطر العمل كإطار عمل باي تورش <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A5%D8%B7%D8%A7%D8%B1-%D8%B9%D9%85%D9%84-%D8%A8%D8%A7%D9%8A-%D8%AA%D9%88%D8%B1%D8%B4-pytorch-%D9%88%D8%A3%D9%87%D9%85%D9%8A%D8%AA%D9%87-%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%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-r2311/" rel="">PyTorch</a> وتنسرفلو <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D9%86%D8%B5%D8%A9-%D8%AA%D9%86%D8%B3%D8%B1%D9%81%D9%84%D9%88-tensorflow-%D9%84%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-r2491/" rel="">TensorFlow</a>، وتُستخدَم هذه المعاملات لإنشاء رسم بياني حسابي يُطلق عليه اسم التمثيل الوسيط Intermediate Representation يمثّل تدفق البيانات عبر الشبكة العصبونية عند تصدير النموذج إلى صيغة ONNX.
</p>

<p>
	الهدف من صيغة ONNX هو تمكين تبادل النماذج بين أطر العمل المختلفة، وتسهيل نقل النماذج بين بيئات تطوير متعددة مع الحفاظ على تكاملها وأدائها، وتسهّل هذه الصيغة التبديل بين أطر العمل من خلال عرض رسم بياني باستخدام معاملات وأنواع بيانات معيارية، فمثلًا يمكن تصدير نموذج مُدرَّب في إطار عمل باي تورش PyTorch إلى صيغة ONNX، ثم استيراده في إطار عمل تنسرفلو TensorFlow والعكس صحيح.
</p>

<p>
	بعد تصدير النموذج إلى صيغة ONNX سنتمكن من تنفيذ الأمور التالية:
</p>

<ul>
	<li>
		تحسين الاستدلال والتنبؤ من النموذج باستخدام تقنيات مثل <a href="https://huggingface.co/docs/optimum/onnxruntime/usage_guides/optimization" rel="external nofollow">تحسين الرسم البياني</a> Graph Optimization و<a href="https://huggingface.co/docs/optimum/onnxruntime/usage_guides/quantization" rel="external nofollow">التكميم</a> Quantization
	</li>
	<li>
		تشغيل مسرّع ONNX Runtime باستخدام <a href="https://huggingface.co/docs/optimum/onnxruntime/package_reference/modeling_ort" rel="external nofollow">أصناف ORTModelForXXX</a> التي تتبع واجهة برمجة تطبيقات <code>AutoModel</code> المستخدمة أيضًا في مكتبة المحولات Transformers
	</li>
	<li>
		تشغيل <a href="https://huggingface.co/docs/optimum/main/en/onnxruntime/usage_guides/pipelines" rel="external nofollow">خطوط أنابيب الاستدلال المُحسَّنة</a> التي تملك نفس واجهة برمجة التطبيقات الخاصة بالدالة <a href="https://huggingface.co/docs/transformers/v4.44.0/en/main_classes/pipelines#transformers.pipeline" rel="external nofollow"><code>pipeline()‎</code></a> في مكتبة المحولات Transformers
	</li>
</ul>

<p>
	توفّر مكتبة Optimum دعمًا لتصدير صيغة ONNX من خلال الاستفادة من كائنات الضبط Configuration التي تكون جاهزة لعدد من بنى النماذج، وهي مصمَّمة لتكون قابلة للتوسيع بسهولة إلى بنى أخرى، ويمكنك مطالعة <a href="https://huggingface.co/docs/optimum/exporters/onnx/overview" rel="external nofollow">توثيق Optimum</a> للحصول على قائمة بعمليات الضبط الجاهزة.
</p>

<p>
	هنالك طريقتان لتصدير نموذج Transformers إلى صيغة ONNX هما:
</p>

<ul>
	<li>
		التصدير باستخدام مكتبة Optimum عبر واجهة سطر الأوامر CLI
	</li>
	<li>
		التصدير باستخدام مكتبة Optimum عبر <code>optimum.onnxruntime</code>
	</li>
</ul>

<h3 id="transformersonnxcli">
	تصدير النموذج إلى صيغة ONNX باستخدام واجهة سطر الأوامر
</h3>

<p>
	يمكن تصدير نموذج Transformers إلى صيغة ONNX عبر <a href="https://academy.hsoub.com/devops/servers/%D9%85%D8%A7-%D9%87%D9%88-%D8%B3%D8%B7%D8%B1-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D8%9F-r353/" rel="">واجهة سطر الأوامر CLI</a> من خلال تثبيت اعتمادية إضافية كما يلي:
</p>

<pre class="ipsCode">pip install optimum[exporters]
</pre>

<p>
	يمكن مطالعة <a href="https://huggingface.co/docs/optimum/exporters/onnx/usage_guides/export_a_model#exporting-a-model-to-onnx-using-the-cli" rel="external nofollow">توثيق Optimum</a> للتعرف على جميع الوسطاء المتاحة، أو استخدم الأمر التالي للمساعدة:
</p>

<pre class="ipsCode">optimum-cli export onnx --help
</pre>

<p>
	يمكننا تصدير نقطة التحقق Checkpoint الخاصة بالنموذج من مستودع Hub على سبيل المثال النموذج<br>
	،<code>distilbert/distilbert-base-uncased-distilled-squad</code> هو نسخة من نموذج DistilBERT جرى تحسينه للعمل مع مجموعة بيانات الأسئلة والأجوبة SQuAD. ويمكننا تصدير هذا النموذج أو تحميله من خلال تشغيل الأمر التالي:
</p>

<pre class="ipsCode">optimum-cli export onnx --model distilbert/distilbert-base-uncased-distilled-squad distilbert_base_uncased_squad_onnx/
</pre>

<p>
	يجب أن نرى السجلات التي تعرض التقدم ومكان حفظ ملف <code>model.onnx</code> الناتج بالشكل التالي:
</p>

<pre class="ipsCode">Validating ONNX model distilbert_base_uncased_squad_onnx/model.onnx...
    -[✓] ONNX model output names match reference model (start_logits, end_logits)
    - Validating ONNX Model output "start_logits":
        -[✓] (2, 16) matches (2, 16)
        -[✓] all values close (atol: 0.0001)
    - Validating ONNX Model output "end_logits":
        -[✓] (2, 16) matches (2, 16)
        -[✓] all values close (atol: 0.0001)
The ONNX export succeeded and the exported model was saved at: distilbert_base_uncased_squad_onnx
</pre>

<p>
	يوضّح المثال السابق تصدير نقطة تحقق من مستودع Hub. علينا أن نتأكد أولًا من حفظ أوزان النموذج وملفات <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%B1%D9%85%D8%B2%D8%A7%D8%AA-tokenizers-%D9%81%D9%8A-%D9%85%D9%86%D8%B5%D8%A9-hugging-face-r2470/" rel="">Tokenizer</a> في نفس المجلد المُسمَّى <code>local_path</code> عند تصدير نموذج محلي. إذا استخدمنا واجهة سطر الأوامر CLI، فعلينا تمرير اسم المجلد <code>local_path</code> إلى الوسيط <code>model</code> بدلًا من اسم نقطة التحقق على مستودع Hub واستخدم الوسيط <code>‎--task</code> الذي يمثل المهمة. ويمكن مطالعة المزيد حول قائمة المهام المدعومة في <a href="https://huggingface.co/docs/optimum/exporters/task_manager" rel="external nofollow">توثيق Optimum</a>.
</p>

<pre class="ipsCode">optimum-cli export onnx --model local_path --task question-answering distilbert_base_uncased_squad_onnx/
</pre>

<p>
	بعدها يمكننا تشغيل ملف النموذج المُصدّر <code>model.onnx</code> الناتج على أحد <a href="https://onnx.ai/supported-tools.html#deployModel" rel="external nofollow">المسرّعات Accelerators المتعددة</a> التي تدعم معيار ONNX، فمثلًا يمكن تحميل النموذج وتشغيله باستخدام المسرّع <a href="https://onnxruntime.ai/" rel="external nofollow">ONNX Runtime</a> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7887_9" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">AutoTokenizer</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> optimum</span><span class="pun">.</span><span class="pln">onnxruntime </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">ORTModelForQuestionAnswering</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> tokenizer </span><span class="pun">=</span><span class="pln"> </span><span class="typ">AutoTokenizer</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="str">"distilbert_base_uncased_squad_onnx"</span><span class="pun">)</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">ORTModelForQuestionAnswering</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="str">"distilbert_base_uncased_squad_onnx"</span><span class="pun">)</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> inputs </span><span class="pun">=</span><span class="pln"> tokenizer</span><span class="pun">(</span><span class="str">"What am I using?"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Using DistilBERT with ONNX Runtime!"</span><span class="pun">,</span><span class="pln"> return_tensors</span><span class="pun">=</span><span class="str">"pt"</span><span class="pun">)</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> outputs </span><span class="pun">=</span><span class="pln"> model</span><span class="pun">(**</span><span class="pln">inputs</span><span class="pun">)</span></pre>

<p>
	ينطبق الأمر نفسه على نقاط تحقق تنسرفلو TensorFlow على مستودع Hub، فمثلًا يمكننا تصدير نقطة تحقق TensorFlow خام غير مُعدّلة من <a href="https://huggingface.co/keras-io" rel="external nofollow">مجموعة Keras</a> كما يلي:
</p>

<pre class="ipsCode">optimum-cli export onnx --model keras-io/transformers-qa distilbert_base_cased_squad_onnx/
</pre>

<h3 id="transformersonnxoptimumonnxruntime">
	تصدير النموذج إلى صيغة ONNX باستخدام optimum.onnxruntime
</h3>

<p>
	يمكننا تصدير نموذج Transformers إلى ONNX برمجيًا بدلًا من استخدام واجهة سطر الأوامر CLI كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9573_9" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> optimum</span><span class="pun">.</span><span class="pln">onnxruntime </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">ORTModelForSequenceClassification</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">AutoTokenizer</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> model_checkpoint </span><span class="pun">=</span><span class="pln"> </span><span class="str">"distilbert_base_uncased_squad"</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> save_directory </span><span class="pun">=</span><span class="pln"> </span><span class="str">"onnx/"</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="com"># ‫تحميل نموذج من مكتبة Transformers وتصديره إلى صيغة ONNX</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> ort_model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">ORTModelForSequenceClassification</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="pln">model_checkpoint</span><span class="pun">,</span><span class="pln"> export</span><span class="pun">=</span><span class="kwd">True</span><span class="pun">)</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> tokenizer </span><span class="pun">=</span><span class="pln"> </span><span class="typ">AutoTokenizer</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="pln">model_checkpoint</span><span class="pun">)</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="com"># ‫حفظ نموذج onnx والمرمِّز</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> ort_model</span><span class="pun">.</span><span class="pln">save_pretrained</span><span class="pun">(</span><span class="pln">save_directory</span><span class="pun">)</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> tokenizer</span><span class="pun">.</span><span class="pln">save_pretrained</span><span class="pun">(</span><span class="pln">save_directory</span><span class="pun">)</span></pre>

<h3 id="">
	تصدير النموذج إلى بنية غير مدعومة
</h3>

<p>
	إذا أردنا المساهمة بإضافة دعم لنموذج لا يمكن تصديره حاليًا، فيجب أن نتحقق أولًا فيما إذا كان مدعومًا في <a href="https://huggingface.co/docs/optimum/exporters/onnx/overview" rel="external nofollow"><code>optimum.exporters.onnx</code></a>، وإن كان غير مدعوم، <span ipsnoautolink="true">فيمكن أن <a href="https://huggingface.co/docs/optimum/exporters/onnx/usage_guides/contribute" rel="external nofollow">نساهم في Optimum</a></span> مباشرةً.
</p>

<h3 id="transformersonnx-1">
	تصدير نموذج باستخدام الحزمة transformers.onnx
</h3>

<p>
	<strong>ملاحظة</strong>: لم تَعُد هناك صيانة للحزمة <code>tranformers.onnx</code>، لذا علينا تصدير النماذج باستخدام المكتبة Optimum كما هو موضح في الأقسام السابقة، إذ سيُزال هذا القسم في الإصدارات المستقبلية.
</p>

<p>
	يمكن تصدير نموذج Transformers إلى صيغة ONNX باستخدام الحزمة <code>tranformers.onnx</code> من خلال تثبيت اعتماديات إضافية كما يلي:
</p>

<pre class="ipsCode">pip install transformers[onnx]
</pre>

<p>
	نستخدم حزمة <code>transformers.onnx</code> كما نستخدم وحدة بايثون Python لتصدير نقطة تحقق باستخدام ضبط Configuration جاهز كما يلي:
</p>

<pre class="ipsCode">python -m transformers.onnx --model=distilbert/distilbert-base-uncased onnx/
</pre>

<p>
	سيؤدي هذا إلى تصدير رسم ONNX البياني لنقطة التحقق التي يحدّدها الوسيط <code>‎--model</code>. علينا تمرير نقطة تحقق على مستودع Hub أو أي نقطة تحقق مُخزَّنة محليًا، ثم يمكننا تشغيل ملف <code>model.onnx</code> الناتج على أحد المسرِّعات التي تدعم معيار ONNX، فمثلًا يمكننا تحميل النموذج وتشغيله باستخدام المُسرّع ONNX Runtime كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9573_7" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">AutoTokenizer</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> onnxruntime </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">InferenceSession</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> tokenizer </span><span class="pun">=</span><span class="pln"> </span><span class="typ">AutoTokenizer</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="str">"distilbert/distilbert-base-uncased"</span><span class="pun">)</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> session </span><span class="pun">=</span><span class="pln"> </span><span class="typ">InferenceSession</span><span class="pun">(</span><span class="str">"onnx/model.onnx"</span><span class="pun">)</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="com"># ‫يتوقع المسرّع ONNX Runtime وجود مصفوفات NumPy كدخل</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> inputs </span><span class="pun">=</span><span class="pln"> tokenizer</span><span class="pun">(</span><span class="str">"Using DistilBERT with ONNX Runtime!"</span><span class="pun">,</span><span class="pln"> return_tensors</span><span class="pun">=</span><span class="str">"np"</span><span class="pun">)</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> outputs </span><span class="pun">=</span><span class="pln"> session</span><span class="pun">.</span><span class="pln">run</span><span class="pun">(</span><span class="pln">output_names</span><span class="pun">=[</span><span class="str">"last_hidden_state"</span><span class="pun">],</span><span class="pln"> input_feed</span><span class="pun">=</span><span class="pln">dict</span><span class="pun">(</span><span class="pln">inputs</span><span class="pun">))</span></pre>

<p>
	يمكن الحصول على أسماء المخرجات المطلوبة مثل ‎<code>["last_hidden_state"]</code>‎ من خلال الاطّلاع على ضبط ONNX لكل نموذج، فمثلًا يكون لدينا ما يلي بالنسبة لنموذج DistilBERT:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_6269_13" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> transformers</span><span class="pun">.</span><span class="pln">models</span><span class="pun">.</span><span class="pln">distilbert </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">DistilBertConfig</span><span class="pun">,</span><span class="pln"> </span><span class="typ">DistilBertOnnxConfig</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> config </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DistilBertConfig</span><span class="pun">()</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> onnx_config </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DistilBertOnnxConfig</span><span class="pun">(</span><span class="pln">config</span><span class="pun">)</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">print</span><span class="pun">(</span><span class="pln">list</span><span class="pun">(</span><span class="pln">onnx_config</span><span class="pun">.</span><span class="pln">outputs</span><span class="pun">.</span><span class="pln">keys</span><span class="pun">()))</span><span class="pln">
</span><span class="pun">[</span><span class="str">"last_hidden_state"</span><span class="pun">]</span></pre>

<p>
	ينطبق الأمر نفسه على نقاط تحقق تنسرفلو TensorFlow على مستودع Hub، حيث نصدّر نقطة تحقق تنسرفلو TensorFlow خام غير مُدرّبة كما يلي:
</p>

<pre class="ipsCode">python -m transformers.onnx --model=keras-io/transformers-qa onnx/
</pre>

<p>
	يمكننا تصدير نموذج مُخزَّن محليًا من خلال حفظ أوزان النموذج وملفات Tokenizer الخاصة به في المجلد نفسه مثل <code>local-pt-checkpoint</code>، ثم نصدّره إلى صيغة ONNX من خلال توجيه الوسيط <code>‎--model</code> الخاص بحزمة <code>transformers.onnx</code> إلى المجلد المطلوب كما يلي:
</p>

<pre class="ipsCode">python -m transformers.onnx --model=local-pt-checkpoint onnx/
</pre>

<h2 id="transformerstfliteoptimum">
	تصدير النماذج إلى صيغة TFLite باستخدام المكتبة Optimum
</h2>

<p>
	يُعدّ <a href="https://www.tensorflow.org/lite/guide" rel="external nofollow">TensorFlow Lite</a> أو TFLite اختصارًا إطار عمل خفيف الوزن لنشر نماذج <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9/" rel="">تعلم الآلة</a> على الأجهزة ذات الموارد المحدودة مثل الهواتف المحمولة والأنظمة المُضمَّنة وأجهزة <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D9%87%D9%88-%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-%D8%A7%D9%84%D8%A3%D8%B4%D9%8A%D8%A7%D8%A1-iot-r1783/" rel="">إنترنت الأشياء IoT</a>، فقد صُمِّم إطار عمل TFLite لتحسين النماذج وتشغيلها بكفاءة على هذه الأجهزة ذات القدرة الحاسوبية والذاكرة المحدودة. يُمثَّل نموذج TFLite بصيغة فعالة خاصة يمكن نقلها وتحدّدها لاحقة الملفات <code>‎.tflite</code>.
</p>

<p>
	كما توفر المكتبة Optimum دالة لتصدير نماذج المحولات Transformers إلى صيغة TFLite عبر وحدة <code>exporters.tflite</code>، وللحصول على قائمة ببنى النماذج المدعومة يمكن مطالعة <a href="https://huggingface.co/docs/optimum/exporters/tflite/overview" rel="external nofollow">توثيق Optimum</a>.
</p>

<p>
	يمكننا تصدير نموذج إلى صيغة TFLite من خلال تثبيت الاعتماديات المطلوبة كما يلي:
</p>

<pre class="ipsCode">pip install optimum[exporters-tf]
</pre>

<p>
	ويمكن مطالعة <a href="https://huggingface.co/docs/optimum/main/en/exporters/tflite/usage_guides/export_a_model" rel="external nofollow">توثيق Optimum</a> للتعرف على جميع الوسطاء المتاحة، أو استخدم الأمر التالي للمساعدة:
</p>

<pre class="ipsCode">optimum-cli export tflite --help
</pre>

<p>
	يمكن تصدير نقطة التحقق الخاصة بالنموذج من مستودع Hub مثل <code>google-bert/bert-base-uncased</code> من خلال تشغيل الأمر التالي:
</p>

<pre class="ipsCode">optimum-cli export tflite --model google-bert/bert-base-uncased --sequence_length 128 bert_tflite/
</pre>

<p>
	يجب أن نرى السجلات التي تشير إلى التقدم ، ويظهر مكان حفظ ملف <code>model.tflite</code> الناتج كما يلي:
</p>

<pre class="ipsCode">Validating TFLite model...
    -[✓] TFLite model output names match reference model (logits)
    - Validating TFLite Model output "logits":
        -[✓] (1, 128, 30522) matches (1, 128, 30522)
        -[x] values not close enough, max diff: 5.817413330078125e-05 (atol: 1e-05)
The TensorFlow Lite export succeeded with the warning: The maximum absolute difference between the output of the reference model and the TFLite exported model is not within the set tolerance 1e-05:
- logits: max diff = 5.817413330078125e-05.
 The exported model was saved at: bert_tflite
</pre>

<p>
	يوضح المثال السابق تصدير نقطة تحقق من مستودع Hub. يجب أن نتأكد أولًا من حفظ أوزان النموذج وملفات Tokenizer في المجلد نفسه <code>local_path</code> عند تصدير نموذج محلي. وإذا استخدمنا واجهة سطر الأوامر CLI، فعلينا تمرير اسم المجلد <code>local_path</code> إلى الوسيط <code>model--</code> بدلًا من اسم نقطة التحقق على مستودع Hub.
</p>

<h2>
	الخاتمة
</h2>

<p>
	شرحنا في هذا المقال كيفية تصدير نماذج التعلم العميق التي تستخدم مكتبة Transformers من منصة Hugging Face إلى صيغ يمكن تشغيلها في بيئات إنتاج حقيقية مثل تطبيقات الهاتف أو الويب أو أنظمة الذكاء الاصطناعي كالصيغة ONNX والصيغة  TFLite باستخدام مكتبة Optimum. الفائدة الأساسية من تصدير النماذج إلى هذه الصيغ هي تحسين أدائها عند التشغيل على أجهزة متخصصة، مثل المعالجات أو الأجهزة التي تملك قدرة حاسوبية محدودة، وتسهيل تشغيلها في تطبيقات عملية بسرعة وكفاءة.
</p>

<p>
	ترجمة -وبتصرّف- للقسمين <a href="https://huggingface.co/docs/transformers/serialization" rel="external nofollow">Export to ONNX</a> و <a href="https://huggingface.co/docs/transformers/tflite" rel="external nofollow">Export to TFLite</a> من توثيقات Hugging Face.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%85%D8%A7-%D9%87%D9%8A-%D9%85%D9%86%D8%B5%D8%A9-hugging-face-%D9%84%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-r2449/" rel="">ما هي منصة Hugging Face للذكاء الاصطناعي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%B1%D9%85%D8%B2%D8%A7%D8%AA-tokenizers-%D9%81%D9%8A-%D9%85%D9%86%D8%B5%D8%A9-hugging-face-r2470/" rel="">استخدام مكتبة المرمزات Tokenizers في منصة Hugging Face</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%A8%D9%86%D9%8A%D8%A9-%D9%85%D8%AE%D8%B5%D8%B5%D8%A9-%D9%84%D9%86%D9%85%D8%A7%D8%B0%D8%AC-transformers-%D9%81%D9%8A-hugging-face-r2476/" rel="">إنشاء بنية مخصصة لنماذج Transformers في Hugging Face</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A8%D9%86%D8%A7%D8%A1-%D9%86%D9%85%D8%A7%D8%B0%D8%AC-%D9%85%D8%AE%D8%B5%D8%B5%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-transformers-%D9%81%D9%8A-hugging-face-r2481/" rel="">بناء نماذج مخصصة باستخدام مكتبة Transformers في Hugging Face</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2497</guid><pubDate>Wed, 22 Jan 2025 15:00:00 +0000</pubDate></item><item><title>&#x646;&#x638;&#x631;&#x629; &#x639;&#x627;&#x645;&#x629; &#x639;&#x644;&#x649; &#x627;&#x644;&#x635;&#x646;&#x641; Trainer &#x641;&#x64A; &#x645;&#x643;&#x62A;&#x628;&#x629; &#x627;&#x644;&#x645;&#x62D;&#x648;&#x644;&#x627;&#x62A; Transformers</title><link>https://academy.hsoub.com/programming/artificial-intelligence/%D9%86%D8%B8%D8%B1%D8%A9-%D8%B9%D8%A7%D9%85%D8%A9-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%B5%D9%86%D9%81-trainer-%D9%81%D9%8A-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%AD%D9%88%D9%84%D8%A7%D8%AA-transformers-r2492/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2025_01/TrainerTransformers_.png.3e4a05f772181ecb693fd8f314337f04.png" /></p>
<p>
	سنتعرف في هذا المقال على الصنف Trainer في مكتبة المحولات Transformers ضمن منصة Hugging Face، ونوضح طريقة الاستفادة منه في تدريب النماذج اللغوية الكبيرة، كما سنتعرف أيضًا على أصناف عديدة تفيدنا في تحسين وتسريع عملية التدريب.
</p>

<h2>
	ما هو الصنف Trainer
</h2>

<p>
	<a href="https://huggingface.co/docs/transformers/main_classes/trainer" rel="external nofollow">الصنف Trainer</a> هو أداة تُسهّل تدريب النماذج المبنية باستخدام <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A5%D8%B7%D8%A7%D8%B1-%D8%B9%D9%85%D9%84-%D8%A8%D8%A7%D9%8A-%D8%AA%D9%88%D8%B1%D8%B4-pytorch-%D9%88%D8%A3%D9%87%D9%85%D9%8A%D8%AA%D9%87-%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%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-r2311/" rel="">باي تورش PyTorch</a> في مكتبة المحولات Transformers. فبدلًا من أن نضطر لكتابة الشيفرة الخاصة بتدريب النموذج من البداية، يتيح لنا هذا الصنف تمرير العناصر الأساسية مثل النموذج Model، والمُرمِّز Tokenizer، ومجموعة البيانات Dataset، ودالة التقييم Evaluation Function، ومعاملات التدريب الفائقة Hyperparameters، والبدء بعدها بالتدريب بسرعة دون الحاجة للتعامل مع الكثير من التفاصيل والإعدادات يدويًا، كما أن الصنف Trainer قابل للتخصيص وبإمكاننا تعديل إعداداته بما يوافق احتياجاتنا.
</p>

<p>
	توفر مكتبة Transformers أيضًا الصنف <a href="https://huggingface.co/docs/transformers/v4.43.4/en/main_classes/trainer#transformers.Seq2SeqTrainer" rel="external nofollow">Seq2SeqTrainer</a> الذي يساعدنا في مهام تتطلب تحويل سلسلة نصية إلى سلسلة نصية أخرى مثل الترجمة أو التلخيص. يوجد أيضًا الصنف <a href="https://huggingface.co/docs/trl/v0.9.6/en/sft_trainer#trl.SFTTrainer" rel="external nofollow">SFTTrainer</a> من مكتبة <a href="https://huggingface.co/docs/trl/index" rel="external nofollow">TRL</a> التي تغلِّف الصنف Trainer وهي مُحسَّنة لتدريب النماذج اللغوية مثل Llama-2 و Mistral باستخدام تقنيات الانحدار التلقائي Autoregressive التي تُمكِّن النموذج اللغوي من توليد النصوص بناءً على تسلسل الكلمات السابقة، مما يُحسن أداءه، ويدعم الصنف SFTTrainer أيضًا ميزات أخرى مثل Sequence Packing و LoRA وQuantization و DeepSpeed للتوسّع بكفاءة إلى أيّ حجم نموذج نحتاجه، مما يجعله مثاليًا لتدريب النماذج اللغوية المتقدمة.
</p>

<p>
	<strong>ملاحظة</strong>: يُستحسن الاطلاع على <a href="https://huggingface.co/docs/transformers/main_classes/trainer" rel="external nofollow">توثيق Trainer</a> لمعرفة المزيد حول الأصناف المختلفة ومتى نستخدم كل منها، فالصنف Trainer هو الخيار الأكثر تنوعًا ويناسب مجموعة واسعة من المهام، والصنف Seq2SeqTrainer مناسب لمهام تتطلب حويل تسلسل نصي إلى تسلسل نصي آخر كالترجمة والتلخيص، أما الصنف SFTTrainer فهو مناسب لتدريب النماذج اللغوية المتقدمة.
</p>

<p>
	قبل البدء باستخدام الصنف Trainer، لنتأكد من تثبيت مكتبة <a href="https://huggingface.co/docs/accelerate/index" rel="external nofollow">Accelerate</a> المفيدة لتفعيل وتشغيل تدريب نماذج باي تورش PyTorch في البيئات الموزعة بسرعة من خلال الأمر التالي:
</p>

<pre class="ipsCode" id="ips_uid_1495_7">pip install accelerate
# للترقية
pip install accelerate --upgrade</pre>

<p>
	سنوفر في الفقرات التالية نظرة عامة على الصنف Trainer وطريقة استخدامه في مكتبة المحوّلات Transformers.
</p>

<h2 id="">
	الاستخدام الأساسي للصنف Trainer
</h2>

<p>
	يتضمن الصنف Trainer الشيفرة البرمجية الموجودة في حلقة تدريب أساسية، والتي تتضمن ما يلي:
</p>

<ol>
	<li>
		إجراء خطوة تدريب لحساب الخسارة
	</li>
	<li>
		حساب التدرجات Gradients باستخدام التابع <a href="https://huggingface.co/docs/accelerate/v0.33.0/en/package_reference/accelerator#accelerate.Accelerator.backward" rel="external nofollow"><code>backward</code></a>
	</li>
	<li>
		تحديث الأوزان بناءً على التدرجات
	</li>
	<li>
		تكرار هذه العملية حتى الوصول إلى عدد محدَّد مسبقًا من دورات التدريب Epochs
	</li>
</ol>

<p>
	يجرّد الصنف Trainer هذه الشيفرة حتى لا نضطر إلى القلق بشأن كتابة حلقة تدريب يدويًا في كل مرة، أو إذا كنا مبتدئين في استخدام إطار عمل PyTorch وإجراء عملية التدريب من خلاله، فما علينا سوى توفير المكوّنات الأساسية المطلوبة للتدريب كالنموذج ومجموعة البيانات، وسيتولى الصنف Trainer التعامل مع الأمور الأخرى نيابة عنا.
</p>

<p>
	في حال أردنا تحديد خيارات التدريب فيمكننا العثور عليها في الصنف <a href="https://huggingface.co/docs/transformers/v4.43.4/en/main_classes/trainer#transformers.TrainingArguments" rel="external nofollow">TrainingArguments</a>. لنحدّد مثلًا مكان حفظ النموذج في المعامل <code>output_dir</code> ودفع النموذج إلى مستودع Hub بعد التدريب باستخدام المعامل <code>push_to_hub=True</code> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1158_17" style=""><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">TrainingArguments</span><span class="pln">

training_args </span><span class="pun">=</span><span class="pln"> </span><span class="typ">TrainingArguments</span><span class="pun">(</span><span class="pln">
    output_dir</span><span class="pun">=</span><span class="str">"your-model"</span><span class="pun">,</span><span class="pln">
    learning_rate</span><span class="pun">=</span><span class="lit">2e-5</span><span class="pun">,</span><span class="pln">
    per_device_train_batch_size</span><span class="pun">=</span><span class="lit">16</span><span class="pun">,</span><span class="pln">
    per_device_eval_batch_size</span><span class="pun">=</span><span class="lit">16</span><span class="pun">,</span><span class="pln">
    num_train_epochs</span><span class="pun">=</span><span class="lit">2</span><span class="pun">,</span><span class="pln">
    weight_decay</span><span class="pun">=</span><span class="lit">0.01</span><span class="pun">,</span><span class="pln">
    eval_strategy</span><span class="pun">=</span><span class="str">"epoch"</span><span class="pun">,</span><span class="pln">
    save_strategy</span><span class="pun">=</span><span class="str">"epoch"</span><span class="pun">,</span><span class="pln">
    load_best_model_at_end</span><span class="pun">=</span><span class="kwd">True</span><span class="pun">,</span><span class="pln">
    push_to_hub</span><span class="pun">=</span><span class="kwd">True</span><span class="pun">,</span><span class="pln">
</span><span class="pun">)</span></pre>

<p>
	بعد إنشاء <code>training_args</code> علينا تمريره للصنف Trainer إلى جانب النموذج، ومجموعة البيانات، والمُعالِج المسبق لمجموعة البيانات إذ يمكن أن يكون هذا المُعالِج مرمِّزًا أو مستخرج ميزات أو معالج صور حسب نوع بياناتنا، كذلك علينا تمرير مجمِّع بيانات ودالة لحساب المقاييس التي نريد تتبعها أثناء التدريب، ثم نستدعي التابع <a href="https://huggingface.co/docs/transformers/v4.43.4/en/main_classes/trainer#transformers.Trainer.train" rel="external nofollow"><code>train()‎</code></a> لبدء التدريب كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1158_19" style=""><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">Trainer</span><span class="pln">

trainer </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Trainer</span><span class="pun">(</span><span class="pln">
    model</span><span class="pun">=</span><span class="pln">model</span><span class="pun">,</span><span class="pln">
    args</span><span class="pun">=</span><span class="pln">training_args</span><span class="pun">,</span><span class="pln">
    train_dataset</span><span class="pun">=</span><span class="pln">dataset</span><span class="pun">[</span><span class="str">"train"</span><span class="pun">],</span><span class="pln">
    eval_dataset</span><span class="pun">=</span><span class="pln">dataset</span><span class="pun">[</span><span class="str">"test"</span><span class="pun">],</span><span class="pln">
    tokenizer</span><span class="pun">=</span><span class="pln">tokenizer</span><span class="pun">,</span><span class="pln">
    data_collator</span><span class="pun">=</span><span class="pln">data_collator</span><span class="pun">,</span><span class="pln">
    compute_metrics</span><span class="pun">=</span><span class="pln">compute_metrics</span><span class="pun">,</span><span class="pln">
</span><span class="pun">)</span><span class="pln">

trainer</span><span class="pun">.</span><span class="pln">train</span><span class="pun">()</span></pre>

<h3 id="checkpoints">
	نقاط التحقق Checkpoints
</h3>

<p>
	يحفظ الصنف Trainer نقاط التحقق Checkpoints الخاصة بنموذجنا في المجلد المحدد في المعامل <code>output_dir</code> الخاص بالصنف <a href="https://huggingface.co/docs/transformers/v4.43.4/en/main_classes/trainer#transformers.TrainingArguments" rel="external nofollow">TrainingArguments</a>، حيث سنجد نقاط التحقق محفوظة في المجلد الفرعي <code>checkpoint-000</code> وتقابل الأرقام في النهاية خطوة التدريب، ويُعَد حفظ نقاط التحقق مفيدًا لاستئناف التدريب لاحقًا.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1158_21" style=""><span class="com"># الاستئناف من نقطة التحقق الأخيرة</span><span class="pln">
trainer</span><span class="pun">.</span><span class="pln">train</span><span class="pun">(</span><span class="pln">resume_from_checkpoint</span><span class="pun">=</span><span class="kwd">True</span><span class="pun">)</span><span class="pln">

</span><span class="com"># الاستئناف من نقطة تحقق مُحدَّدة محفوظة في مجلد الخرج</span><span class="pln">
trainer</span><span class="pun">.</span><span class="pln">train</span><span class="pun">(</span><span class="pln">resume_from_checkpoint</span><span class="pun">=</span><span class="str">"your-model/checkpoint-1000"</span><span class="pun">)</span></pre>

<p>
	يمكننا حفظ نقاط التحقق الخاصة بنموذجنا، ولكن حالة المُحسِّن لن تُحفَظ افتراضيًا في مستودع Hub، فكي نحفظها يجب علينا ضبط المعامل <code>push_to_hub=True </code>في الصنف TrainingArguments لإيداعها Commit ودفعها إلى المستودع.
</p>

<p>
	فيما يلي بعض الخيارات الأخرى التي يمكننا استخدامها لتحديد كيفية حفظ نقاط التحقق وإعدادها من خلال المعامل <a href="https://huggingface.co/docs/transformers/main_classes/trainer#transformers.TrainingArguments.hub_strategy" rel="external nofollow"><code>hub_strategy</code></a>.
</p>

<ul>
	<li>
		يدفع الخيار <code>hub_strategy="checkpoint"‎</code> أحدث نقطة تحقق إلى مجلد فرعي باسم <code>last-checkpoint</code> ، والذي يمكننا استئناف التدريب منه
	</li>
	<li>
		يدفع الخيار <code>hub_strategy="all_checkpoints"‎</code> جميع نقاط التحقق إلى المجلد المحدَّد في المعامل <code>output_dir</code>، حيث سنرى نقطة تحقق واحدة لكل مجلد في مستودع النموذج
	</li>
</ul>

<p>
	عند استئناف التدريب من نقطة تحقق محفوظة سابقًا، يحاول الصنف Trainer أن يحتفظ بنفس حالة الأرقام العشوائية RNG التي كانت في وقت الحفظ، سواء في Python أو NumPy أو PyTorch. ولكن بسبب بعض الإعدادات الافتراضية في باي تورش PyTorch، قد لا تكون الأرقام العشوائية هي نفسها عند استئناف التدريب. فإذا كنا نرغب في جعل كل شيء يحدث بنفس الطريقة تمامًا في كل مرة، يمكن تعديل بعض الإعدادات لجعل التدريب ينفذ دومًا بنفس الطريقة، لكن يجب أن نضع بالحسبان أن هذا قد يجعل التدريب أبطأ قليلاً، ويمكن الرجوع إلى <a href="https://pytorch.org/docs/stable/notes/randomness#controlling-sources-of-randomness" rel="external nofollow">دليل التحكم في العشوائية في PyTorch</a> لمطالعة هذه الإعدادات التي يتوجب تفعيلها لتحقيق ذلك.
</p>

<h2 id="trainer">
	تخصيص الصنف Trainer
</h2>

<p>
	صُمِّم الصنف Trainer ليكون سهل الاستخدام والوصول، وهو يتميز أيضًا بسهولة التخصيص، إذ يمكننا إنشاء أصناف فرعية للعديد من توابع الصنف وتعديلها لدعم الوظيفة التي نريدها دون الحاجة إلى إعادة كتابة حلقة التدريب بالكامل من الصفر كي تتوافق مع هذه الوظيفة، وتتضمن هذه التوابع ما يلي:
</p>

<ul>
	<li>
		ينشئ التابع <a href="https://huggingface.co/docs/transformers/v4.43.4/en/main_classes/trainer#transformers.Trainer.get_train_dataloader" rel="external nofollow"><code>get_train_dataloader()‎</code></a> صنف DataLoader للتدريب
	</li>
	<li>
		ينشئ التابع <a href="https://huggingface.co/docs/transformers/v4.43.4/en/main_classes/trainer#transformers.Trainer.get_eval_dataloader" rel="external nofollow"><code>get_eval_dataloader()‎</code></a> صنف DataLoader للتقييم
	</li>
	<li>
		ينشئ التابع <a href="https://huggingface.co/docs/transformers/v4.43.4/en/main_classes/trainer#transformers.Trainer.get_test_dataloader" rel="external nofollow"><code>get_test_dataloader()‎</code></a> صنف DataLoader للاختبار
	</li>
	<li>
		يسجّل التابع <a href="https://huggingface.co/docs/transformers/v4.43.4/en/main_classes/trainer#transformers.Trainer.log" rel="external nofollow"><code>log()‎</code></a> معلومات حول الكائنات المختلفة التي تراقب التدريب
	</li>
	<li>
		يستخدم التابع <a href="https://huggingface.co/docs/transformers/v4.43.4/en/main_classes/trainer#transformers.Trainer.create_optimizer_and_scheduler" rel="external nofollow"><code>create_optimizer_and_scheduler()‎</code></a>  لإعداد المحسّن optimizer ومُجَدوِل معدل التعلم learning rate scheduler، ويمكن التخصيص أيضًا باستخدام التابعين <a href="https://huggingface.co/docs/transformers/v4.43.4/en/main_classes/trainer#transformers.Trainer.create_optimizer" rel="external nofollow"><code>create_optimizer()‎</code></a> و <a href="https://huggingface.co/docs/transformers/v4.43.4/en/main_classes/trainer#transformers.Trainer.create_scheduler" rel="external nofollow"><code>create_scheduler()‎</code></a>
	</li>
	<li>
		يحسب التابع <a href="https://huggingface.co/docs/transformers/v4.43.4/en/main_classes/trainer#transformers.Trainer.compute_loss" rel="external nofollow"><code>compute_loss()‎</code></a> الخسارة على دفعة من دخل التدريب
	</li>
	<li>
		يجري التابع <a href="https://huggingface.co/docs/transformers/v4.43.4/en/main_classes/trainer#transformers.Trainer.training_step" rel="external nofollow"><code>training_step()‎</code></a> خطوة التدريب
	</li>
	<li>
		يجري التابع <a href="https://huggingface.co/docs/transformers/v4.43.4/en/main_classes/trainer#transformers.Trainer.prediction_step" rel="external nofollow"><code>prediction_step()‎</code></a> خطوة التنبؤ والاختبار
	</li>
	<li>
		يقيّم التابع <a href="https://huggingface.co/docs/transformers/v4.43.4/en/main_classes/trainer#transformers.Trainer.evaluate" rel="external nofollow"><code>evaluate()‎</code></a> النموذج ويعيد مقاييس التقييم
	</li>
	<li>
		يجري التابع <a href="https://huggingface.co/docs/transformers/v4.43.4/en/main_classes/trainer#transformers.Trainer.predict" rel="external nofollow"><code>predict()‎</code></a> تنبؤات على مجموعة الاختبار باستخدام المقاييس إذا كانت التسميات Labels متاحة
	</li>
</ul>

<p>
	يمكننا مثلًا تخصيص التابع <code>compute_loss()‎</code> لاستخدام خسارة موزونة weighted loss كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_8374_9" style=""><span class="kwd">from</span><span class="pln"> torch </span><span class="kwd">import</span><span class="pln"> nn
</span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">Trainer</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">CustomTrainer</span><span class="pun">(</span><span class="typ">Trainer</span><span class="pun">):</span><span class="pln">
    </span><span class="kwd">def</span><span class="pln"> compute_loss</span><span class="pun">(</span><span class="pln">self</span><span class="pun">,</span><span class="pln"> model</span><span class="pun">,</span><span class="pln"> inputs</span><span class="pun">,</span><span class="pln"> return_outputs</span><span class="pun">=</span><span class="kwd">False</span><span class="pun">):</span><span class="pln">
        labels </span><span class="pun">=</span><span class="pln"> inputs</span><span class="pun">.</span><span class="pln">pop</span><span class="pun">(</span><span class="str">"labels"</span><span class="pun">)</span><span class="pln">
        </span><span class="com"># تمرير أمامي</span><span class="pln">
        outputs </span><span class="pun">=</span><span class="pln"> model</span><span class="pun">(**</span><span class="pln">inputs</span><span class="pun">)</span><span class="pln">
        logits </span><span class="pun">=</span><span class="pln"> outputs</span><span class="pun">.</span><span class="pln">get</span><span class="pun">(</span><span class="str">"logits"</span><span class="pun">)</span><span class="pln">
        </span><span class="com"># حساب الخسارة المخصَّصة لثلاثة تسميات توضيحية بأوزان مختلفة</span><span class="pln">
        loss_fct </span><span class="pun">=</span><span class="pln"> nn</span><span class="pun">.</span><span class="typ">CrossEntropyLoss</span><span class="pun">(</span><span class="pln">weight</span><span class="pun">=</span><span class="pln">torch</span><span class="pun">.</span><span class="pln">tensor</span><span class="pun">([</span><span class="lit">1.0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2.0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3.0</span><span class="pun">],</span><span class="pln"> device</span><span class="pun">=</span><span class="pln">model</span><span class="pun">.</span><span class="pln">device</span><span class="pun">))</span><span class="pln">
        loss </span><span class="pun">=</span><span class="pln"> loss_fct</span><span class="pun">(</span><span class="pln">logits</span><span class="pun">.</span><span class="pln">view</span><span class="pun">(-</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">model</span><span class="pun">.</span><span class="pln">config</span><span class="pun">.</span><span class="pln">num_labels</span><span class="pun">),</span><span class="pln"> labels</span><span class="pun">.</span><span class="pln">view</span><span class="pun">(-</span><span class="lit">1</span><span class="pun">))</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">(</span><span class="pln">loss</span><span class="pun">,</span><span class="pln"> outputs</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> return_outputs </span><span class="kwd">else</span><span class="pln"> loss</span></pre>

<h3 id="callbacks">
	دوال رد النداء Callbacks
</h3>

<p>
	يوجد خيار آخر لتخصيص الصنف Trainer وهو استخدام دوال رد النداء Callbacks، لا تُغيّر هذه الدوال في حلقة التدريب نفسها، بل تراقب حالة الحلقة وتنفذ بعض الإجراءات مثل التوقف المبكر عن التنفيذ، أو تسجيل النتائج استنادًا إلى الحالة الحالية، وبالتالي لا يمكن استخدام دالة رد نداء لتنفيذ شيءٍ مخصص كتعريف دالة خسارة مخصَّصة باستخدامها، بل يجب في هذه الحالة إنشاء صنف فرعي وتعديل التابع <code>compute_loss()‎</code> ضمنه.
</p>

<p>
	على سبيل المثال، يمكننا إضافة دالة رد نداء للتوقف المبكر بعد 10 خطوات في حلقة التدريب على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3696_9" style=""><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">TrainerCallback</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">EarlyStoppingCallback</span><span class="pun">(</span><span class="typ">TrainerCallback</span><span class="pun">):</span><span class="pln">
    </span><span class="kwd">def</span><span class="pln"> __init__</span><span class="pun">(</span><span class="pln">self</span><span class="pun">,</span><span class="pln"> num_steps</span><span class="pun">=</span><span class="lit">10</span><span class="pun">):</span><span class="pln">
        self</span><span class="pun">.</span><span class="pln">num_steps </span><span class="pun">=</span><span class="pln"> num_steps

    </span><span class="kwd">def</span><span class="pln"> on_step_end</span><span class="pun">(</span><span class="pln">self</span><span class="pun">,</span><span class="pln"> args</span><span class="pun">,</span><span class="pln"> state</span><span class="pun">,</span><span class="pln"> control</span><span class="pun">,</span><span class="pln"> </span><span class="pun">**</span><span class="pln">kwargs</span><span class="pun">):</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> state</span><span class="pun">.</span><span class="pln">global_step </span><span class="pun">&gt;=</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">num_steps</span><span class="pun">:</span><span class="pln">
            </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">{</span><span class="str">"should_training_stop"</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">True</span><span class="pun">}</span><span class="pln">
        </span><span class="kwd">else</span><span class="pun">:</span><span class="pln">
            </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">{}</span></pre>

<p>
	ثم نمرّرها إلى المعامل <code>callback</code> الخاص بالصنف Trainer كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3696_11" style=""><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">Trainer</span><span class="pln">

trainer </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Trainer</span><span class="pun">(</span><span class="pln">
    model</span><span class="pun">=</span><span class="pln">model</span><span class="pun">,</span><span class="pln">
    args</span><span class="pun">=</span><span class="pln">training_args</span><span class="pun">,</span><span class="pln">
    train_dataset</span><span class="pun">=</span><span class="pln">dataset</span><span class="pun">[</span><span class="str">"train"</span><span class="pun">],</span><span class="pln">
    eval_dataset</span><span class="pun">=</span><span class="pln">dataset</span><span class="pun">[</span><span class="str">"test"</span><span class="pun">],</span><span class="pln">
    tokenizer</span><span class="pun">=</span><span class="pln">tokenizer</span><span class="pun">,</span><span class="pln">
    data_collator</span><span class="pun">=</span><span class="pln">data_collator</span><span class="pun">,</span><span class="pln">
    compute_metrics</span><span class="pun">=</span><span class="pln">compute_metrics</span><span class="pun">,</span><span class="pln">
    callback</span><span class="pun">=[</span><span class="typ">EarlyStoppingCallback</span><span class="pun">()],</span><span class="pln">
</span><span class="pun">)</span></pre>

<h2 id="logging">
	التسجيل Logging
</h2>

<p>
	يمكننا من خلال ضبط مستوى التسجيل Logging التحكم في كمية وتفاصيل المعلومات المسجلة أثناء تنفيذ الشيفرات البرمجية، وهذا يساعدنا في تتبع الأداء واكتشاف الأخطاء بشكل فعال حسب الحاجة.
</p>

<p>
	يُضبَط الصنف Trainer على المستوى <code>logging.INFO</code> افتراضيًا والذي يبلّغ عن الأخطاء والتحذيرات والمعلومات الأساسية الأخرى، وتُضبَط نسخة الصنف Trainer في البيئات الموزعة على المستوى <code>logging.WARNING</code> الذي يبلّغ عن الأخطاء والتحذيرات فقط. يمكننا تغيير مستوى التسجيل باستخدام المعاملات <a href="https://huggingface.co/docs/transformers/main_classes/trainer#transformers.TrainingArguments.log_level" rel="external nofollow"><code>log_level</code></a> و <a href="https://huggingface.co/docs/transformers/main_classes/trainer#transformers.TrainingArguments.log_level_replica" rel="external nofollow"><code>log_level_replica</code></a> في الصنف TrainingArguments.
</p>

<p>
	كما يمكن ضبط إعداد مستوى السجل لكل جهاز من خلال استخدام المعامل <a href="https://huggingface.co/docs/transformers/main/en/main_classes/trainer#transformers.TrainingArguments.log_on_each_node" rel="external nofollow"><code>log_on_each_node</code></a> لتحديد استخدام مستوى السجل على كل جهاز أو على الجهاز الرئيسي فقط إذا كنا نعمل في بيئة تحتوي على أجهزة متعددة.
</p>

<p>
	<strong>ملاحظة1</strong>: من المفيد مطالعة توثيق واجهة برمجة التطبيقات الخاصة <a href="https://huggingface.co/docs/transformers/main_classes/logging" rel="external nofollow">بالتسجيل</a> Logging للحصول على مزيد من المعلومات حول مستويات التسجيل المختلفة ودور كل منها.
</p>

<p>
	<strong>ملاحظة2</strong>: يحدّد الصنف Trainer مستوى السجل بطريقة منفصلة لكل جهاز في التابع <code>Trainer.__init__()‎</code> المسؤول عن تهيئة كائن التدريب، لذا قد نرغب في التفكير في ضبط مستوى السجل مبكرًا في حال استخدمنا دوال <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%AD%D9%88%D9%91%D9%84%D8%A7%D8%AA-transformers-%D9%85%D9%86-%D9%85%D9%86%D8%B5%D8%A9-hugging-face-r2340/" rel="">مكتبة المحوّلات Transformers</a> الأخرى قبل إنشاء الكائن.
</p>

<p>
	يمكن مثلًا ضبط الشيفرة البرمجية الرئيسية لاستخدام مستوى السجل نفسه وفقًا لكل جهاز كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3696_13" style=""><span class="pln">logger </span><span class="pun">=</span><span class="pln"> logging</span><span class="pun">.</span><span class="pln">getLogger</span><span class="pun">(</span><span class="pln">__name__</span><span class="pun">)</span><span class="pln">

logging</span><span class="pun">.</span><span class="pln">basicConfig</span><span class="pun">(</span><span class="pln">
    format</span><span class="pun">=</span><span class="str">"%(asctime)s - %(levelname)s - %(name)s - %(message)s"</span><span class="pun">,</span><span class="pln">
    datefmt</span><span class="pun">=</span><span class="str">"%m/%d/%Y %H:%M:%S"</span><span class="pun">,</span><span class="pln">
    handlers</span><span class="pun">=[</span><span class="pln">logging</span><span class="pun">.</span><span class="typ">StreamHandler</span><span class="pun">(</span><span class="pln">sys</span><span class="pun">.</span><span class="pln">stdout</span><span class="pun">)],</span><span class="pln">
</span><span class="pun">)</span><span class="pln">

log_level </span><span class="pun">=</span><span class="pln"> training_args</span><span class="pun">.</span><span class="pln">get_process_log_level</span><span class="pun">()</span><span class="pln">
logger</span><span class="pun">.</span><span class="pln">setLevel</span><span class="pun">(</span><span class="pln">log_level</span><span class="pun">)</span><span class="pln">
datasets</span><span class="pun">.</span><span class="pln">utils</span><span class="pun">.</span><span class="pln">logging</span><span class="pun">.</span><span class="pln">set_verbosity</span><span class="pun">(</span><span class="pln">log_level</span><span class="pun">)</span><span class="pln">
transformers</span><span class="pun">.</span><span class="pln">utils</span><span class="pun">.</span><span class="pln">logging</span><span class="pun">.</span><span class="pln">set_verbosity</span><span class="pun">(</span><span class="pln">log_level</span><span class="pun">)</span><span class="pln">

trainer </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Trainer</span><span class="pun">(...)</span></pre>

<p>
	استخدمنا مجموعات مختلفة من المعاملات <code>log_level</code> و <code>log_level_replica</code> لضبط ما يُسجَّل على كل جهاز، حيث إذا كان لدينا جهاز واحد، فنستخدم ما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3696_15" style=""><span class="pln">my_app</span><span class="pun">.</span><span class="pln">py </span><span class="pun">...</span><span class="pln"> </span><span class="pun">--</span><span class="pln">log_level warning </span><span class="pun">--</span><span class="pln">log_level_replica error</span></pre>

<p>
	ونضيف المعامل <code>log_on_each_node 0</code> للبيئات متعددة الأجهزة كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3696_17" style=""><span class="pln">my_app</span><span class="pun">.</span><span class="pln">py </span><span class="pun">...</span><span class="pln"> </span><span class="pun">--</span><span class="pln">log_level warning </span><span class="pun">--</span><span class="pln">log_level_replica error </span><span class="pun">--</span><span class="pln">log_on_each_node </span><span class="lit">0</span><span class="pln">

</span><span class="com"># الضبط للإبلاغ عن الأخطاء فقط</span><span class="pln">
my_app</span><span class="pun">.</span><span class="pln">py </span><span class="pun">...</span><span class="pln"> </span><span class="pun">--</span><span class="pln">log_level error </span><span class="pun">--</span><span class="pln">log_level_replica error </span><span class="pun">--</span><span class="pln">log_on_each_node </span><span class="lit">0</span></pre>

<h2 id="neftune">
	تقنية NEFTune
</h2>

<p>
	تقنية <a href="https://huggingface.co/papers/2310.05914" rel="external nofollow">NEFTune </a>هي طريقة لتحسين أداء النموذج أثناء التدريب عن طريق إضافة ضجيج Noise إلى البيانات المستخدمة لتدريب النموذج. وما نعنيه بالضجيج هنا إضافة بعض التغييرات العشوائية إلى البيانات للمساعدة في تحسين قدرة النموذج على التعميم وعدم حفظ التفاصيل الزائدة التي قد تؤدي إلى مشكلات في الأداء، فعند استخدام NEFTune، يجري تعديل طبقة التضمين أي التمثيل الرياضي للبيانات داخل النموذج بإضافة الضجيج إليها، مما يساعد في تدريب النموذج بمرونة أكبر.
</p>

<p>
	يمكننا تفعيل هذه التقنية في الصنف Trainer من خلال ضبط المعامل <code>neftune_noise_alpha</code> داخل  الصنف TrainingArguments، فهذا المعامل يحدد مقدار الضجيج الذي سيُضاف إلى طبقة التضمين أثناء التدريب كما في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7739_9" style=""><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">TrainingArguments</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Trainer</span><span class="pln">

training_args </span><span class="pun">=</span><span class="pln"> </span><span class="typ">TrainingArguments</span><span class="pun">(...,</span><span class="pln"> neftune_noise_alpha</span><span class="pun">=</span><span class="lit">0.1</span><span class="pun">)</span><span class="pln">
trainer </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Trainer</span><span class="pun">(...,</span><span class="pln"> args</span><span class="pun">=</span><span class="pln">training_args</span><span class="pun">)</span></pre>

<p>
	بعد الانتهاء من التدريب، تُعطَّل تقنية NEFTune لاستعادة الطبقة الأصلية للتضمين بدون أي تعديلات عشوائية وتجنب أيّ سلوك غير متوقّع.
</p>

<h2 id="galore">
	استراتيجية التدريب GaLore
</h2>

<p>
	إسقاط التدرج منخفض الرتبة Gradient Low-Rank Projection -أو GaLore اختصارًا- هي استراتيجية تدريب منخفضة الرتبة وتتميز بكفاءة في استخدام الذاكرة وتسمح بالتعلم الكامل للمعاملات، ولكنها أكثر كفاءة في استخدام الذاكرة من طرق التكيف منخفضة الرتبة التقليدية مثل LoRA.
</p>

<p>
	توفر هذه الاستراتيجية أداءً جيدًا باستخدامها ذاكرة أقل، مما يجعلها خيارًا ممتازًا للاستخدام في تدريب النماذج الكبيرة، قبل البدء باستخدام GaLore، علينا  التأكد من تثبيت المستودع الرسمي الخاص بها باستخدام الأمر التالي:
</p>

<pre class="ipsCode">pip install galore-torch
</pre>

<p>
	نحتاج بعد ذلك إلى تحديد كيفية تحسين النموذج بشكل دقيق وإضافة بعض الخيارات التي تحدد طريقة التحسين وأيضًا تحديد الوحدات المستهدفة التي نريد تعديلها، حيث نضيف الخيارات <code>["galore_adamw", "galore_adafactor", "galore_adamw_8bit"]</code> في المعامل <code>optim</code> مع المعامل <code>optim_target_modules</code> الذي يمكن أن يكون قائمة من السلاسل النصية أو <a href="https://academy.hsoub.com/programming/general/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D8%A8%D9%8A%D8%B1-%D8%A7%D9%84%D9%86%D9%85%D8%B7%D9%8A%D8%A9-%D9%81%D9%8A-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r1374/" rel="">التعابير النمطية Regex</a> أو مسارًا كاملًا مطابقًا لأسماء وحدات النموذج المستهدفة التي نريد تكييفها أثناء عملية التدريب.
</p>

<p>
	فيما يلي مثال لسكربت لتدريب نموذج باستخدام مكتبة GaLore، لكن علينا التأكّد من استخدام الأمر التالي أولًا قبل تشغيل السكربت
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2701_15" style=""><span class="pln">pip install trl datasets</span></pre>

<p>
	وفيما يلي السكربت المطلوب:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2701_9" style=""><span class="kwd">import</span><span class="pln"> torch
</span><span class="kwd">import</span><span class="pln"> datasets
</span><span class="kwd">import</span><span class="pln"> trl

</span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">TrainingArguments</span><span class="pun">,</span><span class="pln"> </span><span class="typ">AutoConfig</span><span class="pun">,</span><span class="pln"> </span><span class="typ">AutoTokenizer</span><span class="pun">,</span><span class="pln"> </span><span class="typ">AutoModelForCausalLM</span><span class="pln">

train_dataset </span><span class="pun">=</span><span class="pln"> datasets</span><span class="pun">.</span><span class="pln">load_dataset</span><span class="pun">(</span><span class="str">'imdb'</span><span class="pun">,</span><span class="pln"> split</span><span class="pun">=</span><span class="str">'train'</span><span class="pun">)</span><span class="pln">

args </span><span class="pun">=</span><span class="pln"> </span><span class="typ">TrainingArguments</span><span class="pun">(</span><span class="pln">
    output_dir</span><span class="pun">=</span><span class="str">"./test-galore"</span><span class="pun">,</span><span class="pln">
    max_steps</span><span class="pun">=</span><span class="lit">100</span><span class="pun">,</span><span class="pln">
    per_device_train_batch_size</span><span class="pun">=</span><span class="lit">2</span><span class="pun">,</span><span class="pln">
    optim</span><span class="pun">=</span><span class="str">"galore_adamw"</span><span class="pun">,</span><span class="pln">
    optim_target_modules</span><span class="pun">=[</span><span class="str">"attn"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"mlp"</span><span class="pun">]</span><span class="pln">
</span><span class="pun">)</span><span class="pln">

model_id </span><span class="pun">=</span><span class="pln"> </span><span class="str">"google/gemma-2b"</span><span class="pln">

config </span><span class="pun">=</span><span class="pln"> </span><span class="typ">AutoConfig</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="pln">model_id</span><span class="pun">)</span><span class="pln">

tokenizer </span><span class="pun">=</span><span class="pln"> </span><span class="typ">AutoTokenizer</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="pln">model_id</span><span class="pun">)</span><span class="pln">
model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">AutoModelForCausalLM</span><span class="pun">.</span><span class="pln">from_config</span><span class="pun">(</span><span class="pln">config</span><span class="pun">).</span><span class="pln">to</span><span class="pun">(</span><span class="lit">0</span><span class="pun">)</span><span class="pln">

trainer </span><span class="pun">=</span><span class="pln"> trl</span><span class="pun">.</span><span class="typ">SFTTrainer</span><span class="pun">(</span><span class="pln">
    model</span><span class="pun">=</span><span class="pln">model</span><span class="pun">,</span><span class="pln">
    args</span><span class="pun">=</span><span class="pln">args</span><span class="pun">,</span><span class="pln">
    train_dataset</span><span class="pun">=</span><span class="pln">train_dataset</span><span class="pun">,</span><span class="pln">
    dataset_text_field</span><span class="pun">=</span><span class="str">'text'</span><span class="pun">,</span><span class="pln">
    max_seq_length</span><span class="pun">=</span><span class="lit">512</span><span class="pun">,</span><span class="pln">
</span><span class="pun">)</span><span class="pln">

trainer</span><span class="pun">.</span><span class="pln">train</span><span class="pun">()</span></pre>

<p>
	يمكننا تمرير الوسطاء الإضافية التي تدعمها GaLore من خلال تمرير المعامل <code>optim_args</code> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2701_13" style=""><span class="kwd">import</span><span class="pln"> torch
</span><span class="kwd">import</span><span class="pln"> datasets
</span><span class="kwd">import</span><span class="pln"> trl

</span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">TrainingArguments</span><span class="pun">,</span><span class="pln"> </span><span class="typ">AutoConfig</span><span class="pun">,</span><span class="pln"> </span><span class="typ">AutoTokenizer</span><span class="pun">,</span><span class="pln"> </span><span class="typ">AutoModelForCausalLM</span><span class="pln">

train_dataset </span><span class="pun">=</span><span class="pln"> datasets</span><span class="pun">.</span><span class="pln">load_dataset</span><span class="pun">(</span><span class="str">'imdb'</span><span class="pun">,</span><span class="pln"> split</span><span class="pun">=</span><span class="str">'train'</span><span class="pun">)</span><span class="pln">

args </span><span class="pun">=</span><span class="pln"> </span><span class="typ">TrainingArguments</span><span class="pun">(</span><span class="pln">
    output_dir</span><span class="pun">=</span><span class="str">"./test-galore"</span><span class="pun">,</span><span class="pln">
    max_steps</span><span class="pun">=</span><span class="lit">100</span><span class="pun">,</span><span class="pln">
    per_device_train_batch_size</span><span class="pun">=</span><span class="lit">2</span><span class="pun">,</span><span class="pln">
    optim</span><span class="pun">=</span><span class="str">"galore_adamw"</span><span class="pun">,</span><span class="pln">
    optim_target_modules</span><span class="pun">=[</span><span class="str">"attn"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"mlp"</span><span class="pun">],</span><span class="pln">
    optim_args</span><span class="pun">=</span><span class="str">"rank=64, update_proj_gap=100, scale=0.10"</span><span class="pun">,</span><span class="pln">
</span><span class="pun">)</span><span class="pln">

model_id </span><span class="pun">=</span><span class="pln"> </span><span class="str">"google/gemma-2b"</span><span class="pln">

config </span><span class="pun">=</span><span class="pln"> </span><span class="typ">AutoConfig</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="pln">model_id</span><span class="pun">)</span><span class="pln">

tokenizer </span><span class="pun">=</span><span class="pln"> </span><span class="typ">AutoTokenizer</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="pln">model_id</span><span class="pun">)</span><span class="pln">
model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">AutoModelForCausalLM</span><span class="pun">.</span><span class="pln">from_config</span><span class="pun">(</span><span class="pln">config</span><span class="pun">).</span><span class="pln">to</span><span class="pun">(</span><span class="lit">0</span><span class="pun">)</span><span class="pln">

trainer </span><span class="pun">=</span><span class="pln"> trl</span><span class="pun">.</span><span class="typ">SFTTrainer</span><span class="pun">(</span><span class="pln">
    model</span><span class="pun">=</span><span class="pln">model</span><span class="pun">,</span><span class="pln">
    args</span><span class="pun">=</span><span class="pln">args</span><span class="pun">,</span><span class="pln">
    train_dataset</span><span class="pun">=</span><span class="pln">train_dataset</span><span class="pun">,</span><span class="pln">
    dataset_text_field</span><span class="pun">=</span><span class="str">'text'</span><span class="pun">,</span><span class="pln">
    max_seq_length</span><span class="pun">=</span><span class="lit">512</span><span class="pun">,</span><span class="pln">
</span><span class="pun">)</span><span class="pln">

trainer</span><span class="pun">.</span><span class="pln">train</span><span class="pun">()</span></pre>

<p>
	يمكن مطالعة المزيد عن هذه طريقة GaLore في <a href="https://github.com/jiaweizzhao/GaLore" rel="external nofollow">المستودع الأصلي</a>.
</p>

<p>
	يمكننا حاليًا تدريب الطبقات الخطية فقط باستخدام طريقة GaLore التي تستخدم طريقة التفكك منخفض الرتبة Low-Rank Decomposition، بينما ستظل الطبقات المتبقية تًدرّب وتُحسَّن بالطريقة التقليدية. وسنلاحظ أن عملية التحضير لبدء التدريب تستغرق بعض  الوقت مثلًا 3 دقائق لنموذج 2B على NVIDIA A100 ولكن يجب أن يعمل التدريب بسلاسة بعد ذلك.
</p>

<p>
	يمكننا أيضًا إجراء تحسين على مستوى الطبقة من خلال إضافة الكلمة <code>layerwise</code> إلى نهاية اسم المحسِّن كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2701_17" style=""><span class="kwd">import</span><span class="pln"> torch
</span><span class="kwd">import</span><span class="pln"> datasets
</span><span class="kwd">import</span><span class="pln"> trl

</span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">TrainingArguments</span><span class="pun">,</span><span class="pln"> </span><span class="typ">AutoConfig</span><span class="pun">,</span><span class="pln"> </span><span class="typ">AutoTokenizer</span><span class="pun">,</span><span class="pln"> </span><span class="typ">AutoModelForCausalLM</span><span class="pln">

train_dataset </span><span class="pun">=</span><span class="pln"> datasets</span><span class="pun">.</span><span class="pln">load_dataset</span><span class="pun">(</span><span class="str">'imdb'</span><span class="pun">,</span><span class="pln"> split</span><span class="pun">=</span><span class="str">'train'</span><span class="pun">)</span><span class="pln">

args </span><span class="pun">=</span><span class="pln"> </span><span class="typ">TrainingArguments</span><span class="pun">(</span><span class="pln">
    output_dir</span><span class="pun">=</span><span class="str">"./test-galore"</span><span class="pun">,</span><span class="pln">
    max_steps</span><span class="pun">=</span><span class="lit">100</span><span class="pun">,</span><span class="pln">
    per_device_train_batch_size</span><span class="pun">=</span><span class="lit">2</span><span class="pun">,</span><span class="pln">
    optim</span><span class="pun">=</span><span class="str">"galore_adamw_layerwise"</span><span class="pun">,</span><span class="pln">
    optim_target_modules</span><span class="pun">=[</span><span class="str">"attn"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"mlp"</span><span class="pun">]</span><span class="pln">
</span><span class="pun">)</span><span class="pln">

model_id </span><span class="pun">=</span><span class="pln"> </span><span class="str">"google/gemma-2b"</span><span class="pln">

config </span><span class="pun">=</span><span class="pln"> </span><span class="typ">AutoConfig</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="pln">model_id</span><span class="pun">)</span><span class="pln">

tokenizer </span><span class="pun">=</span><span class="pln"> </span><span class="typ">AutoTokenizer</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="pln">model_id</span><span class="pun">)</span><span class="pln">
model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">AutoModelForCausalLM</span><span class="pun">.</span><span class="pln">from_config</span><span class="pun">(</span><span class="pln">config</span><span class="pun">).</span><span class="pln">to</span><span class="pun">(</span><span class="lit">0</span><span class="pun">)</span><span class="pln">

trainer </span><span class="pun">=</span><span class="pln"> trl</span><span class="pun">.</span><span class="typ">SFTTrainer</span><span class="pun">(</span><span class="pln">
    model</span><span class="pun">=</span><span class="pln">model</span><span class="pun">,</span><span class="pln">
    args</span><span class="pun">=</span><span class="pln">args</span><span class="pun">,</span><span class="pln">
    train_dataset</span><span class="pun">=</span><span class="pln">train_dataset</span><span class="pun">,</span><span class="pln">
    dataset_text_field</span><span class="pun">=</span><span class="str">'text'</span><span class="pun">,</span><span class="pln">
    max_seq_length</span><span class="pun">=</span><span class="lit">512</span><span class="pun">,</span><span class="pln">
</span><span class="pun">)</span><span class="pln">

trainer</span><span class="pun">.</span><span class="pln">train</span><span class="pun">()</span></pre>

<p>
	نلاحظ أن التحسين على مستوى الطبقة Layer-wise Optimization تجريبي بعض الشيء ولا يدعم توزيع البيانات Distributed Data Parallel أو DDP اختصارًا، وبالتالي عند استخدام هذا النوع من التحسين فقد تتمكن من تشغيل التدريب على وحدة معالجة رسومية GPU واحدة فقط.
</p>

<h2 id="lomo">
	محسّن LOMO
</h2>

<p>
	محسّن LOMO هو أداة تُستخدم لتحسين النماذج اللغوية الكبيرة عندما تكون الموارد محدودة، وهو يساعد على تقليل استخدام الذاكرة أثناء التدريب. يُعد AdaLomo نوعًا من محسنات LOMO، وهو يعتمد على تقنية التعلم التكيفي Adaptive Learning لتحديث المعاملات بكفاءة، مما يعزز الأداء مع الحفاظ على استهلاك منخفض للذاكرة.
</p>

<p>
	يعمل محسّن LOMO عن طريق دمج حساب التدرج وتحديث المعاملات في خطوة واحدة، مما يساعد على تسريع عملية التدريب وتقليل الحاجة إلى الذاكرة. المحسنات المتاحة في LOMO هي <code>lomo</code> و <code>adalomo </code>.
</p>

<p>
	<strong>ملاحظة</strong>: يُوصَى باستخدام محسّن <code>AdaLomo</code> بدون تفعيل خيار حساب تدرجات النموذج <code>grad_norm</code> للحصول على أداء أفضل وإنتاجية أعلى.
</p>

<p>
	 نثبّت أولًا LOMO من مستودع Pypi باستخدام الأمر التالي:
</p>

<pre class="ipsCode" id="ips_uid_7587_9"> pip install lomo-optim </pre>

<p>
	أو نثبّته من المصدر باستخدام الأمر التالي:
</p>

<pre class="ipsCode" id="ips_uid_7587_11"> pip install git+https://github.com/OpenLMLab/LOMO.git.</pre>

<p>
	فيما يلي سكربت بسيط يوضح كيفية صقل نموذج <a href="https://huggingface.co/google/gemma-2b" rel="external nofollow">google/gemma-2b</a> مع مجموعة بيانات IMDB بدقة كاملة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7587_13" style=""><span class="kwd">import</span><span class="pln"> torch
</span><span class="kwd">import</span><span class="pln"> datasets
</span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">TrainingArguments</span><span class="pun">,</span><span class="pln"> </span><span class="typ">AutoTokenizer</span><span class="pun">,</span><span class="pln"> </span><span class="typ">AutoModelForCausalLM</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> trl

train_dataset </span><span class="pun">=</span><span class="pln"> datasets</span><span class="pun">.</span><span class="pln">load_dataset</span><span class="pun">(</span><span class="str">'imdb'</span><span class="pun">,</span><span class="pln"> split</span><span class="pun">=</span><span class="str">'train'</span><span class="pun">)</span><span class="pln">

args </span><span class="pun">=</span><span class="pln"> </span><span class="typ">TrainingArguments</span><span class="pun">(</span><span class="pln">
    output_dir</span><span class="pun">=</span><span class="str">"./test-lomo"</span><span class="pun">,</span><span class="pln">
    max_steps</span><span class="pun">=</span><span class="lit">1000</span><span class="pun">,</span><span class="pln">
    per_device_train_batch_size</span><span class="pun">=</span><span class="lit">4</span><span class="pun">,</span><span class="pln">
    optim</span><span class="pun">=</span><span class="str">"adalomo"</span><span class="pun">,</span><span class="pln">
    gradient_checkpointing</span><span class="pun">=</span><span class="kwd">True</span><span class="pun">,</span><span class="pln">
    logging_strategy</span><span class="pun">=</span><span class="str">"steps"</span><span class="pun">,</span><span class="pln">
    logging_steps</span><span class="pun">=</span><span class="lit">1</span><span class="pun">,</span><span class="pln">
    learning_rate</span><span class="pun">=</span><span class="lit">2e-6</span><span class="pun">,</span><span class="pln">
    save_strategy</span><span class="pun">=</span><span class="str">"no"</span><span class="pun">,</span><span class="pln">
    run_name</span><span class="pun">=</span><span class="str">"lomo-imdb"</span><span class="pun">,</span><span class="pln">
</span><span class="pun">)</span><span class="pln">

model_id </span><span class="pun">=</span><span class="pln"> </span><span class="str">"google/gemma-2b"</span><span class="pln">

tokenizer </span><span class="pun">=</span><span class="pln"> </span><span class="typ">AutoTokenizer</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="pln">model_id</span><span class="pun">)</span><span class="pln">
model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">AutoModelForCausalLM</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="pln">model_id</span><span class="pun">,</span><span class="pln"> low_cpu_mem_usage</span><span class="pun">=</span><span class="kwd">True</span><span class="pun">).</span><span class="pln">to</span><span class="pun">(</span><span class="lit">0</span><span class="pun">)</span><span class="pln">

trainer </span><span class="pun">=</span><span class="pln"> trl</span><span class="pun">.</span><span class="typ">SFTTrainer</span><span class="pun">(</span><span class="pln">
    model</span><span class="pun">=</span><span class="pln">model</span><span class="pun">,</span><span class="pln">
    args</span><span class="pun">=</span><span class="pln">args</span><span class="pun">,</span><span class="pln">
    train_dataset</span><span class="pun">=</span><span class="pln">train_dataset</span><span class="pun">,</span><span class="pln">
    dataset_text_field</span><span class="pun">=</span><span class="str">'text'</span><span class="pun">,</span><span class="pln">
    max_seq_length</span><span class="pun">=</span><span class="lit">1024</span><span class="pun">,</span><span class="pln">
</span><span class="pun">)</span><span class="pln">

trainer</span><span class="pun">.</span><span class="pln">train</span><span class="pun">()</span></pre>

<h2 id="acceleratetrainer">
	مكتبة Accelerate والصنف Trainer
</h2>

<p>
	يعتمد الصنف Trainer على مكتبة <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%AF%D8%B1%D9%8A%D8%A8-%D8%A7%D9%84%D9%85%D9%88%D8%B2%D8%B9-%D9%88%D9%85%D9%83%D8%AA%D8%A8%D8%A9-accelerate-%D9%84%D8%AA%D8%B3%D8%B1%D9%8A%D8%B9-%D8%AA%D8%AF%D8%B1%D9%8A%D8%A8-%D9%86%D9%85%D8%A7%D8%B0%D8%AC-%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-r2376/" rel="">Accelerate</a>، والتي هي مكتبة لتدريب نماذج PyTorch بسهولة في البيئات الموزعة مع دعم التكاملات Integrations مثل <a href="https://pytorch.org/blog/introducing-pytorch-fully-sharded-data-parallel-api/" rel="external nofollow">FullyShardedDataParallel</a> -أو FSDP اختصارًا- و <a href="https://www.deepspeed.ai/" rel="external nofollow">DeepSpeed</a>.
</p>

<p>
	<strong>ملاحظة</strong>: يمكن مطالعة المزيد حول استراتيجيات تجزئة FSDP أو FSDP Sharding وتفريغ وحدة المعالجة المركزية CPU Offloading وغير ذلك باستخدام الصنف Trainer في <a href="https://huggingface.co/docs/transformers/fsdp" rel="external nofollow">دليل FSDP</a>.
</p>

<p>
	يمكننا استخدام مكتبة Accelerate مع الصنف Trainer من خلال تشغيل أمر <a href="https://huggingface.co/docs/accelerate/package_reference/cli#accelerate-config" rel="external nofollow"><code>accelerate.config</code></a> لإعداد التدريب لبيئة التدريب الخاصة بنا، حيث ينشئ هذا الأمر ملف <code>config_file.yaml</code> الذي سيُستخدَم عند تشغيل سكربت التدريب. فيما يلي مثلًا بعض عمليات الضبط النموذجية التي يمكننا إعدادها:
</p>

<p>
	عند استخدام DistributedDataParallel:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7587_15" style=""><span class="pln">compute_environment</span><span class="pun">:</span><span class="pln"> LOCAL_MACHINE                                                                                             
distributed_type</span><span class="pun">:</span><span class="pln"> MULTI_GPU                                                                                                    
downcast_bf16</span><span class="pun">:</span><span class="pln"> </span><span class="str">'no'</span><span class="pln">
gpu_ids</span><span class="pun">:</span><span class="pln"> all
machine_rank</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="com"># تغيير الرتبة حسب الجهاز</span><span class="pln">
main_process_ip</span><span class="pun">:</span><span class="pln"> </span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">20.1</span><span class="pln">
main_process_port</span><span class="pun">:</span><span class="pln"> </span><span class="lit">9898</span><span class="pln">
main_training_function</span><span class="pun">:</span><span class="pln"> main
mixed_precision</span><span class="pun">:</span><span class="pln"> fp16
num_machines</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2</span><span class="pln">
num_processes</span><span class="pun">:</span><span class="pln"> </span><span class="lit">8</span><span class="pln">
rdzv_backend</span><span class="pun">:</span><span class="pln"> static
same_network</span><span class="pun">:</span><span class="pln"> true
tpu_env</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[]</span><span class="pln">
tpu_use_cluster</span><span class="pun">:</span><span class="pln"> false
tpu_use_sudo</span><span class="pun">:</span><span class="pln"> false
use_cpu</span><span class="pun">:</span><span class="pln"> false</span></pre>

<p>
	عند استخدام FSDP:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7587_17" style=""><span class="pln">compute_environment</span><span class="pun">:</span><span class="pln"> LOCAL_MACHINE
distributed_type</span><span class="pun">:</span><span class="pln"> FSDP
downcast_bf16</span><span class="pun">:</span><span class="pln"> </span><span class="str">'no'</span><span class="pln">
fsdp_config</span><span class="pun">:</span><span class="pln">
  fsdp_auto_wrap_policy</span><span class="pun">:</span><span class="pln"> TRANSFORMER_BASED_WRAP
  fsdp_backward_prefetch_policy</span><span class="pun">:</span><span class="pln"> BACKWARD_PRE
  fsdp_forward_prefetch</span><span class="pun">:</span><span class="pln"> true
  fsdp_offload_params</span><span class="pun">:</span><span class="pln"> false
  fsdp_sharding_strategy</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
  fsdp_state_dict_type</span><span class="pun">:</span><span class="pln"> FULL_STATE_DICT
  fsdp_sync_module_states</span><span class="pun">:</span><span class="pln"> true
  fsdp_transformer_layer_cls_to_wrap</span><span class="pun">:</span><span class="pln"> </span><span class="typ">BertLayer</span><span class="pln">
  fsdp_use_orig_params</span><span class="pun">:</span><span class="pln"> true
machine_rank</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln">
main_training_function</span><span class="pun">:</span><span class="pln"> main
mixed_precision</span><span class="pun">:</span><span class="pln"> bf16
num_machines</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
num_processes</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2</span><span class="pln">
rdzv_backend</span><span class="pun">:</span><span class="pln"> static
same_network</span><span class="pun">:</span><span class="pln"> true
tpu_env</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[]</span><span class="pln">
tpu_use_cluster</span><span class="pun">:</span><span class="pln"> false
tpu_use_sudo</span><span class="pun">:</span><span class="pln"> false
use_cpu</span><span class="pun">:</span><span class="pln"> false</span></pre>

<p>
	عند استخدام DeepSpeed:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7587_19" style=""><span class="pln">compute_environment</span><span class="pun">:</span><span class="pln"> LOCAL_MACHINE
deepspeed_config</span><span class="pun">:</span><span class="pln">
  deepspeed_config_file</span><span class="pun">:</span><span class="pln"> </span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">user</span><span class="pun">/</span><span class="pln">configs</span><span class="pun">/</span><span class="pln">ds_zero3_config</span><span class="pun">.</span><span class="pln">json
  zero3_init_flag</span><span class="pun">:</span><span class="pln"> true
distributed_type</span><span class="pun">:</span><span class="pln"> DEEPSPEED
downcast_bf16</span><span class="pun">:</span><span class="pln"> </span><span class="str">'no'</span><span class="pln">
machine_rank</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln">
main_training_function</span><span class="pun">:</span><span class="pln"> main
num_machines</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
num_processes</span><span class="pun">:</span><span class="pln"> </span><span class="lit">4</span><span class="pln">
rdzv_backend</span><span class="pun">:</span><span class="pln"> static
same_network</span><span class="pun">:</span><span class="pln"> true
tpu_env</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[]</span><span class="pln">
tpu_use_cluster</span><span class="pun">:</span><span class="pln"> false
tpu_use_sudo</span><span class="pun">:</span><span class="pln"> false
use_cpu</span><span class="pun">:</span><span class="pln"> false</span></pre>

<p>
	عند استخدام DeepSpeed مع إضافة Accelerate:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7587_21" style=""><span class="pln">compute_environment</span><span class="pun">:</span><span class="pln"> LOCAL_MACHINE                                                                                             
deepspeed_config</span><span class="pun">:</span><span class="pln">                                                                                                              
  gradient_accumulation_steps</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
  gradient_clipping</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0.7</span><span class="pln">
  offload_optimizer_device</span><span class="pun">:</span><span class="pln"> cpu
  offload_param_device</span><span class="pun">:</span><span class="pln"> cpu
  zero3_init_flag</span><span class="pun">:</span><span class="pln"> true
  zero_stage</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2</span><span class="pln">
distributed_type</span><span class="pun">:</span><span class="pln"> DEEPSPEED
downcast_bf16</span><span class="pun">:</span><span class="pln"> </span><span class="str">'no'</span><span class="pln">
machine_rank</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pln">
main_training_function</span><span class="pun">:</span><span class="pln"> main
mixed_precision</span><span class="pun">:</span><span class="pln"> bf16
num_machines</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
num_processes</span><span class="pun">:</span><span class="pln"> </span><span class="lit">4</span><span class="pln">
rdzv_backend</span><span class="pun">:</span><span class="pln"> static
same_network</span><span class="pun">:</span><span class="pln"> true
tpu_env</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[]</span><span class="pln">
tpu_use_cluster</span><span class="pun">:</span><span class="pln"> false
tpu_use_sudo</span><span class="pun">:</span><span class="pln"> false
use_cpu</span><span class="pun">:</span><span class="pln"> false</span></pre>

<p>
	يُعَد أمر <a href="https://huggingface.co/docs/accelerate/package_reference/cli#accelerate-launch" rel="external nofollow"><code>accelerate_launch</code></a> الطريقة الموصَى بها لتشغيل سكربت التدريب على نظام موزع باستخدام مكتبة Accelerate والصنف Trainer مع المعاملات المُحدَّدة في الملف <code>config_file.yaml</code> الذي يُحفَظ في مجلد ذاكرة التخزين المؤقت للمكتبة Accelerate ويُحمَّل تلقائيًا عند تشغيل أمر <code>accelerate_launch</code>.
</p>

<p>
	يمكننا مثلًا تشغيل سكربت التدريب <a href="https://github.com/huggingface/transformers/blob/f4db565b695582891e43a5e042e5d318e28f20b8/examples/pytorch/text-classification/run_glue.py#L4" rel="external nofollow"><code>run_glue.py</code></a> مع ضبط FSDP كما يلي:
</p>

<pre class="ipsCode">accelerate launch \
    ./examples/pytorch/text-classification/run_glue.py \
    --model_name_or_path google-bert/bert-base-cased \
    --task_name $TASK_NAME \
    --do_train \
    --do_eval \
    --max_seq_length 128 \
    --per_device_train_batch_size 16 \
    --learning_rate 5e-5 \
    --num_train_epochs 3 \
    --output_dir /tmp/$TASK_NAME/ \
    --overwrite_output_dir
</pre>

<p>
	ويمكن تحديد المعاملات من الملف <code>config_file.yaml</code> في سطر الأوامر كما يلي:
</p>

<pre class="ipsCode">accelerate launch --num_processes=2 \
    --use_fsdp \
    --mixed_precision=bf16 \
    --fsdp_auto_wrap_policy=TRANSFORMER_BASED_WRAP  \
    --fsdp_transformer_layer_cls_to_wrap="BertLayer" \
    --fsdp_sharding_strategy=1 \
    --fsdp_state_dict_type=FULL_STATE_DICT \
    ./examples/pytorch/text-classification/run_glue.py
    --model_name_or_path google-bert/bert-base-cased \
    --task_name $TASK_NAME \
    --do_train \
    --do_eval \
    --max_seq_length 128 \
    --per_device_train_batch_size 16 \
    --learning_rate 5e-5 \
    --num_train_epochs 3 \
    --output_dir /tmp/$TASK_NAME/ \
    --overwrite_output_dir
</pre>

<p>
	ويمكن مطالعة <a href="https://huggingface.co/docs/accelerate/basic_tutorials/launch" rel="external nofollow">المقال الخاص بتشغيل سكربتات Accelerate</a> على منصة Huggingface لمعرفة المزيد حول أمر <code>accelerate_launch</code> وعمليات الضبط المخصَّصة.
</p>

<h2>
	الخاتمة
</h2>

<p>
	وصلنا لختام مقالنا الذي وضحنا فيه استخدام صنف التدريب Trainer من مكتبة Transformers وتعرفنا على طريقة استخدامه وإعداد البيانات والنماذج ومعاملات التدريب التي سيستخدمها، كما ناقشنا أهم المزايا التي يقدمها هذا الصنف والتي تجعله خيارًا مثاليًا لتسريع تدريب النماذج وتحسين أدائها. ننصحكم بتجربة التقنيات التي شرحناها في هذا المقال والاستفادة منها في تحسين مشاريع الذكاء الاصطناعي.
</p>

<p>
	ترجمة -وبتصرّف- للقسم <a href="https://huggingface.co/docs/transformers/main/trainer" rel="external nofollow">Trainer</a> من توثيقات Hugging Face.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%82%D9%88%D8%A7%D9%84%D8%A8-%D8%A7%D9%84%D8%AF%D8%B1%D8%AF%D8%B4%D8%A9-chat-templates-%D9%84%D9%84%D9%86%D9%85%D8%A7%D8%B0%D8%AC-%D8%A7%D9%84%D9%84%D8%BA%D9%88%D9%8A%D8%A9-%D8%A7%D9%84%D9%83%D8%A8%D9%8A%D8%B1%D8%A9-llms-r2486/" rel="">استخدام قوالب الدردشة Chat Templates للنماذج اللغوية الكبيرة LLMs</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%A8%D9%86%D9%8A%D8%A9-%D9%85%D8%AE%D8%B5%D8%B5%D8%A9-%D9%84%D9%86%D9%85%D8%A7%D8%B0%D8%AC-transformers-%D9%81%D9%8A-hugging-face-r2476/" rel="">إنشاء بنية مخصصة لنماذج Transformers في Hugging Face</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%AD%D9%88%D9%91%D9%84%D8%A7%D8%AA-transformers-%D9%85%D9%86-%D9%85%D9%86%D8%B5%D8%A9-hugging-face-r2340/" rel="">تعرف على مكتبة المحوّلات Transformers من منصة Hugging Face</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%85%D8%B4%D8%A7%D8%B1%D9%83%D8%A9-%D9%86%D9%85%D9%88%D8%B0%D8%AC-%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%B9%D9%84%D9%89-%D9%85%D9%86%D8%B5%D8%A9-hugging-face-r2378/" rel="">مشاركة نموذج ذكاء اصطناعي على منصة Hugging Face</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2492</guid><pubDate>Wed, 15 Jan 2025 15:00:00 +0000</pubDate></item><item><title>&#x62A;&#x639;&#x631;&#x641; &#x639;&#x644;&#x649; &#x645;&#x646;&#x635;&#x629; &#x62A;&#x646;&#x633;&#x631;&#x641;&#x644;&#x648; TensorFlow &#x644;&#x644;&#x630;&#x643;&#x627;&#x621; &#x627;&#x644;&#x627;&#x635;&#x637;&#x646;&#x627;&#x639;&#x64A;</title><link>https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D9%86%D8%B5%D8%A9-%D8%AA%D9%86%D8%B3%D8%B1%D9%81%D9%84%D9%88-tensorflow-%D9%84%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-r2491/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2025_01/TensorFlow(1).png.3bf48f9867a0581a369747e3592fe008.png" /></p>
<p>
	تعد تنسرفلو TensorFlow أحد الأدوات الأساسية في جعبة مطوري نماذج الذكاء الاصطناعي، فهي توفر بيئة متكاملة تساعد على تدريب نماذج الذكاء الاصطناعي وتشغيلها واستخدامها في الاستدلال والتنبؤ القرارات المستقبلية بمرونة وكفاءة، سنتعرف في هذه المقالة على أداة تنسرفلو TensorFlow ومميزاتها في تطوير تطبيقات الذكاء الاصطناعي وتعلم الآلة.
</p>

<h2 id="tensorflow-1">
	ما هي تنسرفلو TensorFlow
</h2>

<p>
	تنسرفلو TensorFlow هي منصة مفتوحة المصدر توفر للمطورين وعلماء البيانات الأدوات التي يحتاجونها لبناء نماذج تعلم الآلة، بداية من معالجة البيانات وتجهيزها، إلى التدريب وحتى التشغيل، وتدعم تنسرفلو العديد من لغات البرمجة عن طريق مكتبات مخصصة لكل لغة مثل بايثون و جافاسكريبت وسي و جافا وغيرها من اللغات، وإن كانت لغة <a href="https://academy.hsoub.com/python/" rel="">بايثون</a> هي اللغة الأكثر استخدامًا والأكثر دعمًا.
</p>

<p>
	طورت شركة جوجل منصة تنسرفلو TensorFlow عن طريق فريقها Google Brain في عام 2015 كي تكون بديلًا مفتوح المصدر للنظام السابق الذي كان يُستخدم في تدريب خوارزميات تعلم الآلة والمعروف باسم ديست بليف DistBelief، ومن أبرز مميزات تنسرفلو TensorFlow دعم مبدأ توزيع التدريب على عدة أجهزة لتعزيز كفاءة الأداء، وسهولة تعلمها، وكونها منصة مفتوحة المصدر مما يسمح للجميع بالمساهمة في تحسينها واستخدامها في مختلف المشاريع.
</p>

<p>
	كما تتميز تنسرفلو TensorFlow بقدرتها على استغلال مختلف العتاد الحاسوبي مثل <a href="https://academy.hsoub.com/apps/operating-systems/%D9%88%D8%AD%D8%AF%D8%A9-%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%84%D8%AC%D8%A9-%D8%A7%D9%84%D9%85%D8%B1%D9%83%D8%B2%D9%8A%D8%A9-r879/" rel="">وحدة المعالجة المركزية CPU</a> ووحدة المعالجة الرسومية GPU ومسرعات التدريب المختلفة، وهذا يجلعها تتفوق على بعض المكتبات التقليدية مثل <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-scikit-learn-%D9%88%D8%A3%D9%87%D9%85-%D8%AE%D9%88%D8%A7%D8%B1%D8%B2%D9%85%D9%8A%D8%A7%D8%AA%D9%87%D8%A7-r2485/" rel="">ساي كيت ليرن Scikit learn</a> الشهيرة التي توفر العديد من خوارزميات تعلم الآلة التقليدية ولكنها لا تدعم استخدام وحدات المعالجة الرسومية GPU، ناهيك عن التدريب الموزع، فمن غير الممكن تدريب نماذج ذكاء اصطناعي واسعة النطاق باستخدام مكتبات لا تدعم هذه الإمكانيات المتقدمة مثل التدريب الموزع أو المسرعات.
</p>

<h2 id="tensors">
	معنى Tensors
</h2>

<p>
	تُشتق تسمية تنسرفلو TensorFlow من العمليات التي تنفذها الشبكات العصبية على بيانات متعددة الأبعاد تعرف باسم تنسورات Tensors حيث تتدفق هذه البيانات Flow عبر الشبكات العصبية. لذا من الضروري توضيح معنى كلمة تنسور Tensor أو ما يعرف أيضًا باسم <a href="https://ar.wikipedia.org/wiki/%D9%85%D9%88%D8%AA%D8%B1" rel="external nofollow">مُوتِّر</a> فهو هيكل بيانات فالتنسور Tensor هو مفهوم أكثر شمولًا من المصفوفات Matrices والمتجهات Vectors وحتى القيم المفردة أو المضاعفات Scalars.
</p>

<ul>
	<li>
		المضاعف Scalar<span>: </span>عدد مفرد مثل العدد 5 وهو يُعد موترًا من الرتبة صفر. ونسميه مضاعف ضربه في موتر آخر سيضاعف القيم داخله
	</li>
	<li>
		المتجه Vector: مجموعة من الأرقام منظمة في صف واحد أو عمود واحد من القيم، ويُعد موترًا من الرتبة الأولى
	</li>
	<li>
		المصفوفة Matrix: مجموعة من الأرقام منظمة في صفوف وأعمدة، وتُعد المصفوفة موتر من الرتبة الثانية
	</li>
</ul>

<p>
	ويمكن للتنسورات أن تمتد إلى رتب Ranks أعلى، فكلما علت الرتبة كلما احتوى التنسور على بيانات متعددة الأبعاد تُستخدم في النماذج المعقدة
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="165434" href="https://academy.hsoub.com/uploads/monthly_2025_01/Tensors.png.f02944e02f6ccfe85a32272478172079.png" rel=""><img alt="الموترات tensors" class="ipsImage ipsImage_thumbnailed" data-fileid="165434" data-unique="ua20nqpz3" style="width: 400px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_01/Tensors.thumb.png.e4b245cabed28de9d4925b09e0cc848b.png"> </a>
</p>

<p>
	على سبيل المثال يمكن استخدام تنسور Tensor من الرتبة الرابعة لتمثيل دفعة بيانات batch مكونة من مجموعة من الصور كما يلي:
</p>

<ul>
	<li>
		عدد الصورة في الدفعة: 4 صور
	</li>
	<li>
		ارتفاع الصورة: 64 بكسل
	</li>
	<li>
		عرض الصورة: 64 بكسل
	</li>
	<li>
		قنوات الألوان: ثلاثة هي الأحمر، الأخضر، الأزرق
	</li>
</ul>

<p>
	وبالتالي يمكننا التعبير عن هذه المعلومات باستخدام تنسور Tensor من 4 أبعاد، حيث يعبر البعد الأول عن ترتيب الصورة في الدفعة، ويعبر البعد الثاني عن الارتفاع، والثالث عن العرض، والرابع عن عدد قنوات الألوان كما في الصورة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="165429" href="https://academy.hsoub.com/uploads/monthly_2025_01/4dtensor.png.e08035d6b1ad43df28e3ccea29bc587f.png" rel=""><img alt="4dtensor" class="ipsImage ipsImage_thumbnailed" data-fileid="165429" data-unique="q2aio86pl" style="width: 400px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_01/4dtensor.thumb.png.4aa47af42750d29be13a1968005c376d.png"> </a>
</p>

<p>
	وبالتالي يمكن استخدام هذا التنسور Tensor لتعريف مدخلات الشبكات العصبية الالتفافية CNN التي تتعامل مع الصور، فهو يمكننا من معرفة عدد الصورة المدخلة بالدفعة وأبعادها وعدد قنوات الألوان بسهولة.
</p>

<h2 id="tensorflow-2">
	استخدامات تنسرفلو TensorFlow
</h2>

<p>
	شاع استخدام منصة تنسرفلو TensorFlow في مختلف <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%85%D8%AC%D8%A7%D9%84%D8%A7%D8%AA-%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/" rel="">مجالات الذكاء الاصطناعي</a>، مثل تعلم الآلة و<a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%AD%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA/" rel="">تحليل البيانات</a> وتصنيف الصور والتعرف على الكائنات بالصور ومعالجة اللغات الطبيعية وتطبيقات الذكاء الاصطناعي التوليدي <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%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-%D8%A7%D9%84%D8%AA%D9%88%D9%84%D9%8A%D8%AF%D9%8A-generative-ai-r2234/" rel="">Generative AI</a>.
</p>

<p>
	على سبيل المثال اعتمدت منصة X على تنسرفلو TensorFlow لترتيب التغريدات حسب الأهمية والصلة، فقد يتابع صاحب حساب مئات بل آلاف الأشخاص لذلك يصبح ترتيب التغريدات أمرًا محوريًا في تجربة الاستخدام، كما استخدمت باي بال PayPal خوارزميات مطورة بتنسرفلو TensorFlow لتستطيع كشف المعاملات الاحتيالية ومنعها.
</p>

<h2 id="tensorflowecosystem">
	النظام المتكامل لتنسرفلو TensorFlow Ecosystem
</h2>

<p style="text-align: center;">
	<img alt="النظام المتكامل لتنسرفلو" class="ipsImage ipsImage_thumbnailed" data-fileid="165463" data-ratio="67.33" data-unique="03rohys5x" style="width: 300px; height: auto;" width="518" src="https://academy.hsoub.com/uploads/monthly_2025_01/TensorFlowecosystem.png.3c807b06ba98e56ec225cd67e1c1b827.png">
</p>

<p>
	توفر تنسرفلو TensorFlow نظام بيئي متكامل لمطوري الذكاء الاصطناعي إو إطار شامل يوفر كل ما يلزم لتطوير نماذج الذكاء الاصطناعي وتشغيلها على مختلف الأجهزة سواء الحواسيب الشخصية أو الخوادم الخاصة أو الخوادم السحابية، إلى جانب استخدام نماذج مسبقة التدريب من خلال مكتبة متنوعة من النماذج وهو يوفر أدوات للتعامل مع كل من المراحل التالية:
</p>

<ul>
	<li>
		تدريب النموذج Training
	</li>
	<li>
		توزيع التدريب Distribution strategy
	</li>
	<li>
		التشغيل Deployment
	</li>
	<li>
		الاستدلال Inference
	</li>
</ul>

<p>
	لنشرح كل مرحلة من هذه المراحل بمزيد من التفصيل.
</p>

<h3 id="training">
	التدريب Training
</h3>

<p>
	تدريب النموذج هو الخطوة الأولى في بناء أي تطبيق ذكاء اصطناعي، ويتطلب الوصول لخطوة التدريب معالجة البيانات preprocessing حيث توفر تنسرفلو العديد من الأدوات لمعالجة البيانات وإعدادها لتدريب النماذج، كما توفر طريقة سهلة لبناء وتدريب الشبكات العصبية الاصطناعية Artificial Neural Networks من خلال مكتبة كيراس keras وهي مكتبة مختصة داخل الإطار الشامل لتنسرفلو TensorFlow.
</p>

<h2 id="distributionstrategy">
	توزيع التدريب Distribution strategy
</h2>

<p>
	يوفر إطار عمل تنسرفلو ميزة توزيع مهمة تدريب النموذج على عدة أجهزة من خلال الوحدة <code>tf.distribute</code> فبدلاً من تدريب النموذج على جهاز واحد فقط، يمكننا تقسيم عملية التدريب كي تنجز عبر معالجات متعددة. من الأفضل العمل في وضع شبكة العقد الحسابية Computational Graph mode لأنه مُصمم خصيصًا ليعمل بشكل أكثر كفاءة مع التدريب الموزع. أما إذا كنا نرغب في التجربة والتعديل للوصول إلى نموذج قابل للتطبيق على نطاق واسع، فيمكننا استخدام وضع التنفيذ الفوري Eager execution mode.
</p>

<p>
	هنالك العديد من التفاصيل المتقدمة التي علينا الانتباه لها عند تحديد استراتيجية توزيع التدريب، مثل كيفية مشاركة معاملات النموذج عبر الأجهزة المختلفة وكيفية توزيع المهام، ولكن من الأفضل للمبتدئين البدء بتعلم التدريب على جهاز واحد أولاً للسهولة. وبمجرد إتقان مهمة تطوير نموذج فعّال على جهاز واحد، يمكن العمل على توزيع التدريب على نطاق أوسع لتسريعه وتحسين أداءه.
</p>

<h3 id="deploymentandinference">
	التشغيل Deployment
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="165435" href="https://academy.hsoub.com/uploads/monthly_2025_01/trainTodeploy.png.6999df5976a0a0abf6acdbac419b6411.png" rel=""><img alt="traintodeploy" class="ipsImage ipsImage_thumbnailed" data-fileid="165435" data-unique="q2ocw3vo7" style="width: 400px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_01/trainTodeploy.thumb.png.d83bec884d9ac7f4b6e8f71d9c541928.png"> </a>
</p>

<p>
	يعد الانتقال من مرحلة تطوير وتدريب النموذج إلى مرحلة تشغيل النموذج وطرحه للمستخدمين تحديًا للكثيرين، فنحن بحاجة لعتاد حاسوبي يستضيف النموذج ويستقبل طلبات المستخدمين، ويمكننا توفيره من خلال موفري الخدمات السحابية Cloud provider، حيث يمكنن استئجار موارد حاسوبية لتشغيل النموذج الخاص بنا، وكما ذكرنا سابقًا فإن تنسرفلو TensorFlow هو إطار عمل متكامل لا يتوقف دوره عند تطوير النموذج فحسب، فيمكننا استخدام TensorFlow Serving لإدارة النماذج التي نحتاج لتشغيلها ونجري تحديث مستمر لها كلما توفرت لنا بيانات جديدة لتدريب النموذج عليها، وغيرها من المميزات العديدة الأخرى.
</p>

<h3 id="inference">
	الاستدلال Inference
</h3>

<p>
	ما نعنيه باستدلال نموذج الذكاء الاصطناعي التنبؤ والتوقع المستقبلي باستخدام البيانات المعطاة، برمجيًا يمكن الاستدلال باستخدام الدالة  <code>model.predict</code> في مكتبة Keras المدمجة ضمن TensorFlow فهذه الدالة البرمجية تأخذ البيانات كمدخلات، وتعطينا التوقع المنتظر بناء عليها، يتعرض النموذج أثناء التشغيل لآلاف أو ربما ملايين الطلبات من المستخدمين من أجل الاستدلال بناء على بعض البيانات المعطاة وينتظرون نتيجة سريعة لطلباتهم، لذا تعد سرعة استدلال النموذج عاملًا مهمًا في نجاح تشغيله.
</p>

<p>
	تساعدنا تنسرفلو TensorFlow في تحسين سرعة الاستدلال بعدة أدوات مثل:
</p>

<ul>
	<li>
		تحسين العمليات الحسابية باستخدام شبكة العقد الحسابية Computational graph
	</li>
	<li>
		تحسين تشغيل النماذج على مختلف أنواع العتاد كوحدات المعالجة المركزية CPUs، أو وحدات معالجة الرسومات GPUs، أو وحدات معالجة الموترات Tensor Processing Units TPUs
	</li>
	<li>
		استخدام المعالجة على التوازي Parallelism وهي طريقة لتقسيم الحسابات على أكثر من جهاز
	</li>
	<li>
		تقسيم الطلبات لدفعات Batching لتحسين استخدام سعة شبكات الانترنت Throughput فمع ملايين من الطلبات بنفس الوقت مرفقة بالبيانات قد تصبح سعة الشبكة غير قادرة على التعامل مع كل الطلبات ومعالجتها بسرعة كافية لذا علينا تقسيمها لدفعات أصغر
	</li>
</ul>

<h2 id="tensorflowlight">
	النسخة الخفيفة من تنسرفلو TensorFlow light
</h2>

<p>
	في بعض الحالات، قد نحتاج لتشغيل النماذج على أجهزة محدودة الإمكانيات كالأجهزة المحمولة. على سبيل المثال، تُعد تطبيقات التعرف على البصمة أو الوجه باستخدام كاميرا الهاتف نماذج ذكاء اصطناعي مخصصة للعمل على الهواتف محدودة الموارد. أو نحتاج لاستخدام نماذج الذكاء الاصطناعي غلى الشرائح الإلكترونية في مجالات <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D9%87%D9%88-%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-%D8%A7%D9%84%D8%A3%D8%B4%D9%8A%D8%A7%D8%A1-iot-r1783/" rel="">إنترنت الأشياء IoT</a> والروبوتات بهدف التعرف على الأشخاص أو التحكم في الآلات أو التنقل بشكل آلي دون الحاجة لتوجيه مباشر.
</p>

<p>
	لكن هذه المهام لن تكون ممكنة من دون القدرة على تشغيل النماذج على أجهزة منخفضة الموارد، وهنا يأتي دور النسخة الخفيفة من تنسرفلو TensorFlow Lite، وهي إطار عمل مفتوح المصدر للتعلم العميق يفيدنا في تقليص حجم النماذج وجعلها أسرع، دون التأثير الكبير على دقة التوقعات.
</p>

<h2 id="">
	كيف نستخدم TensorFlow مع مختلف لغات البرمجة
</h2>

<p>
	تدعم تنسرفلو TensorFlow تشغيل النماذج في لغات برمجة متعددة كما ذكرنا سابقًا وتعد لغة بايثون Python هي اللغة الأساسية والأكثر استخدامًا لتطوير النماذج وبناء الحلول باستخدام تنسرفلو TensorFlow. لكن يمكننا استخدام تنسرفلو مع مختلف لغات البرمجة من خلال حفظ النموذج بصيغة موحدة تتيح التعامل معه في لغات مختلفة مثل C و Go و Java وغيرها.
</p>

<p>
	كما تحظى تطبيقات الويب Web Applications بدعم خاص في منصة تنسرفلو، إذ يمكننا تشغيل وتطوير نماذجنا باستخدام JavaScript، مما يتيح لنا تطوير تطبيقات الذكاء الاصطناعي وتشغيلها مباشرة على المتصفح من خلال المكتبة TensorFlow.js.
</p>

<h2 id="tensorflowhub">
	مستودع النماذج مسبقة التدريب TensorFlow Hub
</h2>

<p>
	توفر TensorFlow مكتبة واسعة من النماذج مسبقة التدريب Pre-trained عبر مستودعها <a href="https://www.tensorflow.org/hub" rel="external nofollow">TensorFlow Hub</a>، حيث يمكننا استخدام هذه النماذج وتشغيلها مباشرة دون الحاجة لتطويرها من الصفر. تتميز هذه النماذج بتوفير ميزة الصقل fine-tuning  وتخصيصها باستخدام بيانات مخصصة للمشكلة التي نسعى لحلها. وما يجعل هذه النماذج ذات قيمة كبيرة هو أنها تحتوي على معرفة مسبقة اكتسبتها من تدريبها على مجموعات بيانات ضخمة. لذا، يعد صقلها حلاً مثاليًا في العديد من التطبيقات، حيث يمكننا الحصول على نتائج دقيقة وفعالة بسرعة كبيرة بالاعتماد عليها.
</p>

<h2 id="visualisation">
	التمثيل المرئي للبيانات Visualization في تنسرفلو
</h2>

<p style="text-align: center;">
	<img alt="التمثيل المرئي للبيانات في تنسرفلو" class="ipsImage ipsImage_thumbnailed" data-fileid="165468" data-ratio="53.80" data-unique="ht8sflicm" style="width: 500px; height: auto;" width="893" src="https://academy.hsoub.com/uploads/monthly_2025_01/Visualisationintensorflow.PNG.bcb34d16a7ee5e4114ffe2843a5d8f2d.PNG">
</p>

<p>
	يحتاج مطور نماذج الذكاء الاصطناعي إلى مراقبة النماذج وملاحظة تطور أدائها مع مرور الوقت، لذا سيفيدهم تعزيز مشاريع الذكاء الاصطناعي برسومات بيانية لتحقيق هذا الهدف. توفر تنسرفلو TensorFlow هذه الإمكانية من خلال أداة تسمى <a href="https://www.tensorflow.org/tensorboard" rel="external nofollow">Tensorboard</a> توفر رسومات بيانية ومخططات توضيحية لتوضح معنى الأرقام ودلالتها، وتسهل اكتشاف الأنماط ونقاط الاهتمام.
</p>

<p>
	توفر Tensorboard إمكانية عرض العديد من الرسومات البيانية المفيدة مثل:
</p>

<ul>
	<li>
		رسم بياني لدقة النموذج accuracy وتغيرها بمرور الوقت
	</li>
	<li>
		رسم شبكة العٌقد الحسابية Computational graphs
	</li>
	<li>
		توفير رسومات بيانية لدراسة توزيع الأوزان والمعاملات التي تتغير مع الوقت
	</li>
	<li>
		عرض الصور والنصوص والصوتيات
	</li>
</ul>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة الذكاء الاصطناعي
		</p>

		<p class="banner-subtitle">
			احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة.
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/artificial-intelligence" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<a href="https://academy.hsoub.com/learn/artificial-intelligence" rel=""><img alt="دورة الذكاء الاصطناعي" src="https://academy.hsoub.com/learn/assets/images/courses/artificial-intelligence.png"></a>
	</div>
</div>

<h2 id="tensorflow-3">
	طريقة استخدام تنسرفلو TensorFlow
</h2>

<p>
	تحتاج منصة تنسرفلو TensorFlow إلى إجراء العديد من العمليات الحسابية على البيانات الممثلة في التنسورات Tensors. وبالتالي، تصبح مهمة تنسرفلو هي تحسين هذه العمليات الحسابية التي تتدفق إليها التنسورات، بهدف استغلال الموارد الحاسوبية المتاحة بأفضل طريقة ممكنة. فبعض الخوارزميات قد تستغرق أيامًا أو حتى أشهر لإتمام تدريبها بسبب حجم البيانات الهائل التي تتدفق خلالها في العمليات الحسابية المعقدة.
</p>

<p>
	لنتعرف على طريقة القيام بالتمثيل الرياضي للعمليات الحسابية التي علينا القيام بها أثناء تدريب النموذج أو استدلاله.
</p>

<h3 id="computationalgraph">
	التعامل مع شبكة العقد الحسابية Computational graph
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="165430" href="https://academy.hsoub.com/uploads/monthly_2025_01/computationalGraph.png.003e12d2ae8e24d561d19f5f9eab343a.png" rel=""><img alt="computationalgraph" class="ipsImage ipsImage_thumbnailed" data-fileid="165430" data-unique="lhf2uzp8e" style="width: 400px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_01/computationalGraph.thumb.png.661390fca58a74e7c54f62d215f22134.png"> </a>
</p>

<p>
	شبكة العٌقد الحسابية Computational graph هي الوسيلة التي تستخدمها تنسرفلو TensorFlow لتمثيل العمليات والخوارزميات التي تنفذها، يمكننا التفكير بها على أنها خطة مرسومة لتنفيذ الخوارزميات، إذ تتكون الشبكة من عدة عقد متصلة تتدفق خلالها التنسورات أو البيانات في اتجاه واحد، وتمثل العقدة عملية حسابية مثل الضرب أو الجمع أو غيرها من العمليات.
</p>

<p>
	يكتب المطور الأكواد البرمجية بلغة برمجة مثل بايثون، ثم يأتي دور تنسرفلو TensorFlow بتجهيز شبكة العٌقد الحسابية computational graph التي تتضمن جميع الخطوات لتنفيذ هذه الأكواد، ولتحسينها يجري تبسيط الخطوات المتكررة التي يمكن اختزالها، أو التخلص من الخطوات التي يمكن حذفها لتوفير الموارد الحاسوبية.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="165431" href="https://academy.hsoub.com/uploads/monthly_2025_01/computationalGraph_explained.png.9276fcdff897bef42f8ef08fa5459947.png" rel=""><img alt="computationalgraph explained" class="ipsImage ipsImage_thumbnailed" data-fileid="165431" data-unique="3m7yqeg6o" style="width: 400px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_01/computationalGraph_explained.thumb.png.d24fc5fe6f7a4b4c99419eb35be54291.png"> </a>
</p>

<h4 id="constantfolding">
	 
</h4>

<p>
	كما تستخدم تنسرفلو طريقة تسمى الحساب المسبق للثوابت Constant folding، تتعامل هذه الطريقة مع المتغيرات المعلومة أو التي يمكن حساب قيمتها بشكلٍ مباشر، فتحولها إلي قيمة ثابتة أثناء بناء شبكة العٌقد الحسابية Computational graph، حيث لا نحتاج لحساب هذه القيم وقت التنفيذ.
</p>

<p>
	على سبيل المثال إذا كان <code>a=2</code> ، <code>b=3 </code>و <code>c=a+b</code> فيمكننا إيجاد قيمة المتغير <code>c=5</code> وعدم إجراء العملية الحسابية أينما وجد هذا المتغير مجددًا وقت التنفيذ، فهذا المتغير لا يعتمد سوى على ثوابت معلومة.
</p>

<p>
	كما تعتمد أيضًا على عملية إعادة استخدام الحدود المتكررة Common Subexpression Elimination لتبسيط شبكة العٌقد الحسابية Computational graph بحساب العمليات التي تتكرر مرة واحدة وتستخدم الناتج أينما وجد تكرار للعملية الحسابية.
</p>

<h4 id="commonsubexpressionelimination">
	 
</h4>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="165433" href="https://academy.hsoub.com/uploads/monthly_2025_01/subexpressionElimination.png.e755024e5e10358534240db0a03e4314.png" rel=""><img alt="subexpressionelimination" class="ipsImage ipsImage_thumbnailed" data-fileid="165433" data-unique="lqv08akin" style="width: 400px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_01/subexpressionElimination.thumb.png.e3cb1916f3e42e41d7229f1e6e1fcb10.png"> </a>
</p>

<p>
	على سبيل المثال: إذا كان <code>a=x+y</code>، و <code>b=x+y </code>فإن <code>a=b</code> لذا نقوم بالعملية <code>x+y</code> مرة واحدة ونعوض عنها عندما نجد <code>a</code> أو <code>b</code>.
</p>

<p>
	أخيرًا يمكننا استخدام متغيرات أقل دقة في تنسرفلو TensorFlow كأن نستخدم متغير من نوع <code>float16</code> بدلًا من <code>float32</code> لتسريع الحسابات وتقليل استهلاك الموارد، ويجدر الذكر أن هذه الميزة لا تعمل إلا مع وحدات المعالجة الرسومية GPUs. لاحظ المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4715_12" style=""><span class="kwd">import</span><span class="pln"> tensorflow </span><span class="kwd">as</span><span class="pln"> tf

</span><span class="com"># قم بتعريف رقم عشري</span><span class="pln">
number </span><span class="pun">=</span><span class="pln"> </span><span class="lit">123.456</span><span class="pln">

</span><span class="com"># حدد حجم المتغير الذي تريد أن تحفظ الرقم به ليكون 32</span><span class="pln">
float32 </span><span class="pun">=</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">constant</span><span class="pun">(</span><span class="pln">number</span><span class="pun">,</span><span class="pln"> dtype</span><span class="pun">=</span><span class="pln">tf</span><span class="pun">.</span><span class="pln">float32</span><span class="pun">)</span><span class="pln">

</span><span class="com"># حدد حجم المتغير الذي تريد أن تحفظ الرقم به ليكون 16</span><span class="pln">
float16 </span><span class="pun">=</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">constant</span><span class="pun">(</span><span class="pln">number</span><span class="pun">,</span><span class="pln"> dtype</span><span class="pun">=</span><span class="pln">tf</span><span class="pun">.</span><span class="pln">float16</span><span class="pun">)</span><span class="pln">

</span><span class="com"># لنرى الاختلاف في الدقة بين الرقمين</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"float32: "</span><span class="pun">,</span><span class="pln"> float32</span><span class="pun">.</span><span class="pln">numpy</span><span class="pun">())</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"float16: "</span><span class="pun">,</span><span class="pln"> float16</span><span class="pun">.</span><span class="pln">numpy</span><span class="pun">())</span><span class="pln">

</span><span class="com"># حجم التخزين </span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Size of float32: "</span><span class="pun">,</span><span class="pln"> float32</span><span class="pun">.</span><span class="pln">numpy</span><span class="pun">().</span><span class="pln">nbytes</span><span class="pun">,</span><span class="pln"> </span><span class="str">"bytes"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Size of float16: "</span><span class="pun">,</span><span class="pln"> float16</span><span class="pun">.</span><span class="pln">numpy</span><span class="pun">().</span><span class="pln">nbytes</span><span class="pun">,</span><span class="pln"> </span><span class="str">"bytes"</span><span class="pun">)</span><span class="pln">

</span><span class="str">'''
output
float32:  123.456
float16:  123.44
Size of float32:  4 bytes
Size of float16:  2 bytes
'''</span></pre>

<p>
	قد يصل عدد المتغيرات والمعاملات في نماذج الذكاء الاصطناعي لملايين بل مليارات في بعض الأحيان، لذا من الضروري الاعتماد على تغيير دقة المتغيرات لتسريع عملية التدريب وتقليص حجم النماذج، فأداء النموذج قد يتأثر بنسبة جيدة من هذا التغير.
</p>

<p>
	<strong>ملاحظة</strong>: تجدر الإشارة إلى أن استخدام أسلوب تغيير دقة المتغيرات يستخدم في تقليص حجم نماذج الذكاء الاصطناعي لتعمل على الحافة on Edge أي على الأجهزة محدودة الموارد، مثل الأجهزة المحمولة أو الشرائح الحاسوبية البسيطة، التي قد لا تتسع إلا لبضعة آلاف من البايتات.
</p>

<h3 id="computationalgraph-1">
	استخدام شبكة العقد الحسابية لتنفيذ العمليات
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="165432" href="https://academy.hsoub.com/uploads/monthly_2025_01/graphModeAdd.png.4037754e822cd07fe67e706ae8bd49d1.png" rel=""><img alt="graphmodeadd" class="ipsImage ipsImage_thumbnailed" data-fileid="165432" data-ratio="136.99" data-unique="sejfve1mb" style="width: 200px; height: auto;" width="438" src="https://academy.hsoub.com/uploads/monthly_2025_01/graphModeAdd.thumb.png.7ae6b2e5137ca8b187a2b654d32c5688.png"></a>
</p>

<p>
	تفيدنا شبكة العٌقد الحسابية Computational graphs في جعل عملية تدريب النماذج أكثر مرونة وكفاءة عبر عدة منصات وأجهزة حاسوبية مختلفة، فهي محسنة لتتعامل مع العتاد الحاسوبي بشكل أفضل، كما يمكن نقل شبكة العقد الحسابية بعد تدريب النموذج ليصبح قابلًا للاستخدام على منصات وأجهزة متنوعة ولغات برمجة مختلفة فهي مجرد قالب لتنفيذ مجموعة من الأوامر التي تعطي نتيجة أو توقع في النهاية.
</p>

<p>
	كانت هذه الطريقة هي الوحيدة في الإصدار الأول من تنسرفلو TensorFlow 1.x ، ولكنها عانت من بعض العيوب، فقد كان علينا كمطورين كتابة الأكواد البرمجية بشكل مثالي دون أن نرى نتائج الخطوات الوسيطة، ثم ننتظر تحويل الأكواد المثالية إلي شبكة عقد حسابية محسنة، وهذا يستغرق الكثير من الوقت، بالطبع لن نحصل على النتيجة التي نرجوها من أول محاولة، فالبرمجة عملية تحسن تكرارية وتراكمية، وخاصة عند تطوير نماذج الذكاء الاصطناعي التي تحتاج إلى تجربة العديد من المعاملات حتى نجد التوليفة المناسبة من تلك المعاملات.
</p>

<p>
	لاحظ الكود التالي الذي يوضح كيفية تعريف دالة <code>ConcreteFunction </code>في تنسرفلو وكيفية تحديد المدخلات والمخرجات للعمليات الحسابية حيث سنحول العمليات البرمجية البسيطة مثل الجمع بين متغيرين إلى شبكة عُقد حسابية يمكن تنفيذها بكفاءة على أجهزة مختلفة.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_6478_15" style=""><span class="kwd">import</span><span class="pln"> tensorflow </span><span class="kwd">as</span><span class="pln"> tf

</span><span class="lit">@tf</span><span class="pun">.</span><span class="pln">function </span><span class="com"># لجعل تنسرفلو يستخدم شبكة العٌقد الحسابية </span><span class="pln">
</span><span class="kwd">def</span><span class="pln"> add_numbers</span><span class="pun">(</span><span class="pln">a</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">):</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> a </span><span class="pun">+</span><span class="pln"> b

</span><span class="com"># نعرف ثابتين</span><span class="pln">
a </span><span class="pun">=</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">constant</span><span class="pun">(</span><span class="lit">5</span><span class="pun">)</span><span class="pln">
b </span><span class="pun">=</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">constant</span><span class="pun">(</span><span class="lit">3</span><span class="pun">)</span><span class="pln">

</span><span class="com"># لنقم بعملية الجمع بطريقة شبكة العٌقد الحسابية</span><span class="pln">
result </span><span class="pun">=</span><span class="pln"> add_numbers</span><span class="pun">(</span><span class="pln">a</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">)</span><span class="pln">

</span><span class="com"># لنحصل على الخطوات التي قام بها تنسرفلو</span><span class="pln">
graph_steps </span><span class="pun">=</span><span class="pln"> add_numbers</span><span class="pun">.</span><span class="pln">get_concrete_function</span><span class="pun">(</span><span class="pln">a</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"الخطوات"</span><span class="pun">)</span><span class="pln">

</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">graph_steps</span><span class="pun">)</span><span class="pln">

</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"الخطوات بشكل مفصـل ومبسـط"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> op </span><span class="kwd">in</span><span class="pln"> graph_steps</span><span class="pun">.</span><span class="pln">graph</span><span class="pun">.</span><span class="pln">get_operations</span><span class="pun">():</span><span class="pln">
    </span><span class="kwd">print</span><span class="pun">(</span><span class="pln">op</span><span class="pun">.</span><span class="pln">name</span><span class="pun">)</span></pre>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_6478_7" style=""><span class="pun">الخطــوات</span><span class="pln">
</span><span class="typ">ConcreteFunction</span><span class="pln"> </span><span class="typ">Input</span><span class="pln"> </span><span class="typ">Parameters</span><span class="pun">:</span><span class="pln">
  a </span><span class="pun">(</span><span class="pln">POSITIONAL_OR_KEYWORD</span><span class="pun">):</span><span class="pln"> </span><span class="typ">TensorSpec</span><span class="pun">(</span><span class="pln">shape</span><span class="pun">=(),</span><span class="pln"> dtype</span><span class="pun">=</span><span class="pln">tf</span><span class="pun">.</span><span class="pln">int32</span><span class="pun">,</span><span class="pln"> name</span><span class="pun">=</span><span class="kwd">None</span><span class="pun">)</span><span class="pln">
  b </span><span class="pun">(</span><span class="pln">POSITIONAL_OR_KEYWORD</span><span class="pun">):</span><span class="pln"> </span><span class="typ">TensorSpec</span><span class="pun">(</span><span class="pln">shape</span><span class="pun">=(),</span><span class="pln"> dtype</span><span class="pun">=</span><span class="pln">tf</span><span class="pun">.</span><span class="pln">int32</span><span class="pun">,</span><span class="pln"> name</span><span class="pun">=</span><span class="kwd">None</span><span class="pun">)</span><span class="pln">
</span><span class="typ">Output</span><span class="pln"> </span><span class="typ">Type</span><span class="pun">:</span><span class="pln">
  </span><span class="typ">TensorSpec</span><span class="pun">(</span><span class="pln">shape</span><span class="pun">=(),</span><span class="pln"> dtype</span><span class="pun">=</span><span class="pln">tf</span><span class="pun">.</span><span class="pln">int32</span><span class="pun">,</span><span class="pln"> name</span><span class="pun">=</span><span class="kwd">None</span><span class="pun">)</span><span class="pln">
</span><span class="typ">Captures</span><span class="pun">:</span><span class="pln">
  </span><span class="kwd">None</span><span class="pln">
</span><span class="pun">الخطـوات</span><span class="pln"> </span><span class="pun">بشكـــل</span><span class="pln"> </span><span class="pun">مفصـل</span><span class="pln"> </span><span class="pun">ومبسـط</span><span class="pln">
a
b
a d d
I d e n t i t y</span></pre>

<h3 id="eagerexecution">
	تقنية التنفيذ الفوري للعمليات الحسابية Eager execution
</h3>

<p>
	كانت عملية تطوير النماذج غير تفاعلية في الإصدار الأول من تنسرفلو TensorFlow 1.x، كما ذكرنا في الفقرة السابقة، حيث كان المطورون يكتبون الأكواد ثم ينتظرون لفترة طويلة لتحويل الأكواد إلى شبكة عُقد حسابية محسّنة، هذا جعل من الصعب اكتشاف الأخطاء وتحسين الأداء في الوقت الفعلي. لهذا السبب، وجدت طريقة التنفيذ الفوري للعمليات الحسابية Eager Execution في TensorFlow 2.x لتجعل عملية التطوير أكثر تفاعلية وسهولة.
</p>

<p>
	حيث يمكننا من خلال التنفيذ الفوري Eager Execution بناء العمليات الحسابية بشكل مباشر. على سبيل المثال، عندما نجمع رقمين، سنحصل على النتيجة على الفور دون الحاجة للانتظار لإكمال البرمجة أو إنشاء شبكة العُقد الحسابية. وبالتالي تسهل علينا هذه الطريقة اكتشاف الأخطاء، واختبار التعديلات، وتحسين أداء النموذج بشكل فوري وتفاعلي.
</p>

<p>
	لاحظ الكود التالي لاستخدام التنفيذ الفوري Eager Execution في تنسرفلو:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_6478_11" style=""><span class="kwd">import</span><span class="pln"> tensorflow </span><span class="kwd">as</span><span class="pln"> tf

</span><span class="com"># Eager Mode مفعل بشكل افتراضي</span><span class="pln">
a </span><span class="pun">=</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">constant</span><span class="pun">(</span><span class="lit">5</span><span class="pun">)</span><span class="pln">
b </span><span class="pun">=</span><span class="pln"> tf</span><span class="pun">.</span><span class="pln">constant</span><span class="pun">(</span><span class="lit">3</span><span class="pun">)</span><span class="pln">
c </span><span class="pun">=</span><span class="pln"> a </span><span class="pun">+</span><span class="pln"> b

</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"ناتج العملية الفورية:"</span><span class="pun">,</span><span class="pln"> c</span><span class="pun">.</span><span class="pln">numpy</span><span class="pun">())</span><span class="pln">  
</span><span class="com"># ناتج العملية الفورية: 8</span></pre>

<h3 id="-1">
	الخاتمة
</h3>

<p>
	وصلنا لختام مقالنا الذي شرحنا فيه بالتفصيل إطار العمل الشهير تنسرفلو TensorFlow، وأوضحنا العديد من الأدوات والتقنيات التي تُمكّن المطورين من تطوير نماذج الذكاء الاصطناعي عبر مختلف المراحل، من التدريب وحتى التشغيل. كما قمنا بتطبيق أمثلة عملية بسيطة توضح كيفية استخدام هذه الأدوات بشكل تفصيلي، بدءًا من بناء الشبكات الحسابية حتى التنفيذ الفوري للعمليات الحسابية. ننصح بتجربة هذه المنصة والاستفادة من أدواتها لتحسين وتبسيط عملية تطوير تطبيقات الذكاء الاصطناعي.
</p>

<h3 id="-2">
	اقرأ أيضًا
</h3>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%85%D8%A7-%D9%87%D9%8A-%D9%85%D9%86%D8%B5%D8%A9-hugging-face-%D9%84%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-r2449/" rel="">ما هي منصة Hugging Face للذكاء الاصطناعي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D9%84%D9%85-%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/" rel="">تعلم الذكاء الاصطناعي </a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86-%D9%84%D9%81%D9%87%D9%85-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%82-r1422/" rel="">كل ما تود معرفته عن دراسة الذكاء الاصطناعي </a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A8%D9%86%D8%A7%D8%A1-%D8%B4%D8%A8%D9%83%D8%A9-%D8%B9%D8%B5%D8%A8%D9%8A%D8%A9-%D9%84%D9%84%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%A3%D8%B1%D9%82%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D9%83%D8%AA%D9%88%D8%A8%D8%A9-%D8%A8%D8%AE%D8%B7-%D8%A7%D9%84%D9%8A%D8%AF-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-tensorflow-r1267/" rel="">بناء شبكة عصبية للتعرف على الأرقام المكتوبة بخط اليد باستخدام مكتبة TensorFlow </a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D9%87%D9%85-%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%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-r2372/" rel="">تعرف على أهم مشاريع الذكاء الاصطناعي </a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%AD%D9%88%D9%91%D9%84%D8%A7%D8%AA-transformers-%D9%85%D9%86-%D9%85%D9%86%D8%B5%D8%A9-hugging-face-r2340/" rel="">تعرف على مكتبة المحوّلات Transformers من منصة Hugging Face </a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2491</guid><pubDate>Tue, 14 Jan 2025 15:06:01 +0000</pubDate></item><item><title>&#x62A;&#x637;&#x648;&#x64A;&#x631; &#x628;&#x648;&#x62A; &#x645;&#x62A;&#x639;&#x62F;&#x62F; &#x627;&#x644;&#x623;&#x646;&#x645;&#x627;&#x637; Multi-modal Bot &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x62C;&#x627;&#x646;&#x63A;&#x648;</title><link>https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A8%D9%88%D8%AA-%D9%85%D8%AA%D8%B9%D8%AF%D8%AF-%D8%A7%D9%84%D8%A3%D9%86%D9%85%D8%A7%D8%B7-multi-modal-bot-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%AC%D8%A7%D9%86%D8%BA%D9%88-r2489/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2025_01/BotsDjangoGPT-4WhisperDALL-E_.png.92d9524e3359d8d39a9e36a6befee951.png" /></p>
<p>
	قد نحتاج في تطبيقات الذكاء الاصطناعي المتقدمة لاستخدام بوتات متعددة الأنماط Multi-modal أي تدعم عدة أنواع من المدخلات والمخرجات ويمكنها معالجة اللغة الطبيعية، والتعرف على الصوت، وتوليد الصور. حيث توفر هذه التطبيقات تجربة مميزة للمستخدمين وتوفر طرقًا مختلفة للتفاعل.
</p>

<p>
	نشرح في هذا الدليل تطوير بوت متعددة الأنماط Multi-modal Bot يعتمد على النموذج اللغوي الكبير <a href="https://openai.com/index/gpt-4-research/" rel="external nofollow">GPT-4 Large Language Models (LLM)</a> للذكاء الاصطناعي التحاوري Conversational AI، ونموذج <a href="https://openai.com/index/whisper/" rel="external nofollow">Whisper</a> لتحويل الصوت المنطوق إلى نص مكتوب بدقة، ونموذج <a href="https://openai.com/index/dall-e/" rel="external nofollow">DALL-E</a> لتوليد الصور، وكل من هذه النماذج الثلاثة مقدمة من شركة OpenAI. وسنستخدمها ضمن تطبيق جانغو <a href="https://www.djangoproject.com/start/" rel="external nofollow">Django</a> ينشئ قصصًا مصورة حيث يمكن للمستخدمين تحديد موضوع القصة بالصوت أو بكتابة النص، ويستجيب التطبيق بتأليف قصة نصية مرفقة بصورة مناسبة.
</p>

<p>
	سوف نتبع الخطوات التالية لتطوير بوتات متعددة الأنماط Multi-modal Bots باستخدام Django و GPT-4 و Whisper و DALL-E:
</p>

<ol>
	<li>
		دمج OpenAI Whisper للتعرف على الكلام
	</li>
	<li>
		توليد ردود نصية باستخدام GPT-4
	</li>
	<li>
		توليد الصور باستخدام DALL-E
	</li>
	<li>
		دمج الوسائط لتجربة متكاملة
	</li>
</ol>

<h2 id="">
	متطلبات التطبيق
</h2>

<p>
	لإكمال هذا الدليل التعليمي، ستحتاج إلى التالي:
</p>

<ol>
	<li>
		فهم أساسيات لغة بايثون وإطار عملها جانغو Django، وننصح بمطالعة مقال <a href="https://academy.hsoub.com/programming/python/django/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A5%D8%B7%D8%A7%D8%B1-%D8%B9%D9%85%D9%84-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%AC%D8%A7%D9%86%D8%BA%D9%88-django-r2041/" rel="">مدخل إلى إطار عمل الويب جانغو Django</a>.
	</li>
	<li>
		مفتاح واجهة برمجية <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> key من OpenAI لأننا سنتعامل مع نماذج GPT-4 و DALL-E من OpenAI والتي تتطلب مفتاح واجهة برمجية<abbr> نحصل عليه</abbr> من خلال إنشاء حساب OpenAI ومن ثم <a href="https://platform.openai.com/api-keys" rel="external nofollow">إنشاء مفتاح</a>
	</li>
	<li>
		تثبيت Whisper لتحويل المقاطع الصوتية إلى نص مكتوب، ويمكن مطالعة <a href="https://github.com/openai/whisper" rel="external nofollow">صفحة GitHub الخاصة بـ OpenAI Whisper</a> لمعرفة خطوات التثبيت التفصيلية
	</li>
	<li>
		تثبيت حزمة OpenAI الخاصة ببايثون للتفاعل مع نماذج OpenAI داخل البيئة الافتراضية للمشروع، ويمكن الرجوع للمقال <a href="https://academy.hsoub.com/programming/python/django/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A8%D9%8A%D8%A6%D8%A9-%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%AC%D8%A7%D9%86%D8%BA%D9%88-django-r2049/" rel="">إعداد بيئة تطوير تطبيقات جانغو Django</a>
	</li>
</ol>

<p>
	إذت أنجزنا المتطلبات أعلاه سنكون قد أنشأنا بيئة افتراضية لمشروعنا باسم <code>env</code> داخل مجلد العمل وليكن اسمه <code>django-apps</code>، ويجب التأكد من تفعيل هذه البيئة الافتراضيةوظهور اسمها بين قوسين في بداية السطر في الشاشة الطرفية Terminal. وذلك بكتابة الأمر التالي في نافذة الطرفية بعد الانتقال إلى مسار المجلد الذي يحتوي على ملفات تطبيق جانغو Django الخاص بنا كما يلي:
</p>

<pre class="ipsCode">sammy@ubuntu:$ .env/bin/activate
</pre>

<p>
	بمجرد تفعيل البيئة الافتراضية، سنكتب الأمر التالي لتثبيت حزمة <code>OpenAI</code> الخاصة بلغة بايثون:
</p>

<pre class="ipsCode">(env)sammy@ubuntu:$ pip install openai
</pre>

<p>
	إذا لم يسبق لكم استخدام حزمة OpenAI من قبل فننصح بالرجوع للمقال التالي <a href="https://academy.hsoub.com/programming/python/django/%D8%AF%D9%85%D8%AC-%D9%86%D9%85%D8%A7%D8%B0%D8%AC-gpt-openai-%D9%81%D9%8A-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-django-r2460/" rel="">دمج نماذج GPT من OpenAI في تطبيقات Django</a>. بعدها سنكون قد انتهينا من إعداد بيئة العمل وجاهزين لبدء خطوات تنفيذ المشروع.
</p>

<h2 id="openaiwhisper">
	الخطوة الأولى: دمج OpenAI Whisper للتعرف على الكلام
</h2>

<p>
	في هذه الخطوة، سنُعدّ نموذج <a href="https://platform.openai.com/docs/models/whisper#whisper" rel="external nofollow">OpenAI Whisper</a> في تطبيقنا من أجل تحويل الكلام المنطوق إلى نص مكتوب بدقة عالية. اخترنا  Whisper لكونه نموذجًا قويًا للتعرف على الكلام، مما يجعله خيارًا مثاليًا لدعم البوتات متعددة الأنماط Multi-modal Bots، فمن خلال دمج Whisper، سيكون تطبيقنا قادرًا على فهم المدخلات الصوتية بكفاءة.
</p>

<p>
	أولاً، يجب التأكد من أننا نعمل داخل مجلد مشروع Django الخاص بنا، لننتقل إلى مجلد مشروعنا ونفعّل البيئة الافتراضية الخاصة بالمشروع من خلال كتابة التالي:
</p>

<pre class="ipsCode">sammy@ubuntu:$ cd path_to_your_django_project 
sammy@ubuntu:$ source env/bin/activate
</pre>

<h3 id="whisperdjango">
	إعداد نموذج Whisper في تطبيق Django
</h3>

<p>
	ما يجب فعله الآن هو إنشاء دالة تستخدم Whisper لتحويل ملفات الصوت إلى نص. ننشئ في مجلد المشروع ملف بايثون جديد باسم <code>whisper_transcribe.py</code>.
</p>

<pre class="ipsCode">(env)sammy@ubuntu:$ touch whisper_transcribe.py
</pre>

<p>
	ثم نفتح الملف <code>whisper_transcribe.py</code> في <a href="https://academy.hsoub.com/programming/python/%D9%85%D8%AD%D8%B1%D8%B1-%D8%A3%D9%83%D9%88%D8%A7%D8%AF-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86/" rel="">محرر الأكواد</a> ونستورد مكتبة Whisper. بعد ذلك، ننشئ دالة تأخذ مسار ملف الصوت كمدخل، وتستخدم Whisper لمعالجة الملف، ثم تعيد النص الناتج على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2853_9" style=""><span class="kwd">import</span><span class="pln"> whisper 
model </span><span class="pun">=</span><span class="pln"> whisper</span><span class="pun">.</span><span class="pln">load_model</span><span class="pun">(</span><span class="str">"base"</span><span class="pun">)</span><span class="pln">  

</span><span class="kwd">def</span><span class="pln"> transcribe_audio</span><span class="pun">(</span><span class="pln">audio_path</span><span class="pun">):</span><span class="pln">     
    result </span><span class="pun">=</span><span class="pln"> model</span><span class="pun">.</span><span class="pln">transcribe</span><span class="pun">(</span><span class="pln">audio_path</span><span class="pun">)</span><span class="pln">     
    </span><span class="kwd">return</span><span class="pln"> result</span><span class="pun">[</span><span class="str">"text"</span><span class="pun">]</span></pre>

<p>
	نستخدم في الكود أعلاه نموذج <code>base</code> للتفريغ الصوتي -أي لتحويل الصوت إلى نص-. والجدير بالذكر أن Whisper يوفر <a href="https://github.com/openai/whisper?tab=readme-ov-file#available-models-and-languages" rel="external nofollow">نماذج مختلفة</a> مصممة لتلبية احتياجات مختلفة من حيث الدقة والأداء ويمكن تجربة نماذج أخرى بناءً على متطلبات المشروع في حال احتجنا لسرعة معالجة أو دقة أعلى في تحويل الصوت لنص مكتوب.
</p>

<h4 id="transcription">
	اختبار تحويل الصوت لنص مكتوب Transcription
</h4>

<p>
	لاختبار عملية التفريغ الصوتي وتحويله لنص مكتوب، دعونا نحفظ ملف صوتي داخل مجلد المشروع بعد التأكد من أن هذا الملف بصيغة يدعمها Whisper مثل MP3 أو WAV. ثم نعدّل كود ملف بايثون <code>whisper_transcribe.py</code> بإضافة الكود التالي فى نهايته:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2853_11" style=""><span class="com"># لأغراض الاختبار </span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> __name__ </span><span class="pun">==</span><span class="pln"> </span><span class="str">"__main__"</span><span class="pun">:</span><span class="pln">     
    </span><span class="kwd">print</span><span class="pun">(</span><span class="pln">transcribe_audio</span><span class="pun">(</span><span class="str">"path_to_your_audio_file"</span><span class="pun">))</span></pre>

<p>
	نشغل كود الملف <code>whisper_transcribe.py</code> في الطرفية ونتأكد هل تحول الملف الصوتي لكلام مكتوب بشكل صحيح أم لا:
</p>

<pre class="ipsCode">(env)sammy@ubuntu:$ python whisper_transcribe.py
</pre>

<p>
	إذا أعددنا كل شيء بشكل صحيح فيجب أن نرى النص المُحوّل في الطرفية Termina. تعمل الوظيفة <code>transcribe_audio</code> كأساس للتفاعلات الصوتية داخل تطبيقنا.
</p>

<h2 id="gpt4">
	الخطوة الثانية: توليد الاستجابات النصية باستخدام GPT-4
</h2>

<p>
	في هذه الخطوة، سنستخدم نموذج <a href="https://platform.openai.com/docs/models#gpt-4-turbo-and-gpt-4" rel="external nofollow">GPT-4</a> لتوليد ردود أو استجابات نصية استنادًا إلى النص الذي أدخله المستخدم أو النص المُحوَّل من الصوت في الخطوة السابقة. يتميز GPT-4 بقدرته على معالجة المدخلات اللغوية بذكاء عالي وتقديم استجابات متسقة وذات صلة بسياق الحوار، مما يجعله اختيارًا مثاليًا لتطوير روبوت متعدد الأنماط Multi-modal Bot.
</p>

<p>
	قبل المتابعة، لنتأكد من تثبيت حزمة OpenAI الخاصة بلغة بايثون في البيئة الافتراضية، كما وضحنا في فقرة المتطلبات الأساسية، ومن المهم أيضًا ملاحظة أن نموذج GPT-4 يتطلب مفتاح الواجهة البرمجية <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> key للوصول. ولضمان الأمان، يُفضّل تخزين المفتاح كمتغير بيئة environment variable بدل من إضافته مباشرة في كود بايثون لتجنب اختراقه أو مشاركته عن غير قصد.
</p>

<pre class="ipsCode">(env)sammy@ubuntu:$ export OPENAI_KEY="your-api-key"
</pre>

<h3 id="-1">
	إعداد نموذج إكمال المحادثة
</h3>

<p>
	ننتقل من جديد لمجلد تطبيق Django الخاص بنا وننشئ ملف بايثون جديد باسم <code>chat_completion.py</code>. مهمة هذا الملف الجديد هو التعامل مع الاتصال بنموذج GPT-4 لتوليد استجابات بناءً على النص المُدخل من المستخدم.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_8580_7" style=""><span class="kwd">import</span><span class="pln"> os </span><span class="kwd">from</span><span class="pln"> openai
</span><span class="kwd">import</span><span class="pln"> </span><span class="typ">OpenAI</span><span class="pln"> 

client </span><span class="pun">=</span><span class="pln"> </span><span class="typ">OpenAI</span><span class="pun">(</span><span class="pln">api_key</span><span class="pun">=</span><span class="pln">os</span><span class="pun">.</span><span class="pln">environ</span><span class="pun">[</span><span class="str">"OPENAI_KEY"</span><span class="pun">])</span><span class="pln">
</span><span class="kwd">def</span><span class="pln"> generate_story</span><span class="pun">(</span><span class="pln">input_text</span><span class="pun">):</span><span class="pln">
    </span><span class="com"># استخدام الواجهة البرمجية لتوليد القصة    </span><span class="pln">
    response </span><span class="pun">=</span><span class="pln"> get_story</span><span class="pun">(</span><span class="pln">input_text</span><span class="pun">)</span><span class="pln">     
    </span><span class="com"># تنسيق وإرجاع الاستجابة     </span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> format_response</span><span class="pun">(</span><span class="pln">response</span><span class="pun">)</span></pre>

<p>
	يتحقق الكود أعلاه من إعداد المفتاح الأساسي للمصادقة مع خدمات OpenAI. بعد ذلك، يستدعي دالة مخصصة باسم <code>get_story</code> للتواصل مع واجهة برمجة التطبيقات OpenAI <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> والتي ستولد لنا القصة المطلوبة، ثم يستدعي دالة أخرى باسم <code>format_response</code> وظيفتها تنسيق الاستجابة الواردة من الواجهة البرمجية <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr>.
</p>

<p>
	دعونافي البداية نركز على تنفيذ الدالة <code>get_story</code>. سنضيف ما يلي إلى نهاية ملف <code>chat_completion.py</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_8580_9" style=""><span class="kwd">def</span><span class="pln"> get_story</span><span class="pun">(</span><span class="pln">input_text</span><span class="pun">):</span><span class="pln">
    </span><span class="com"># إعداد الوصف للنظام. يمكن تجربة وصف مختلف.     </span><span class="pln">
    system_prompt </span><span class="pun">=</span><span class="pln"> f</span><span class="str">"""You are a story generator.
    You will be provided with a description of the story the user wants.
    Write a story using the description provided."""</span><span class="pln">

    </span><span class="com"># التواصل مع الواجهة البرمجية</span><span class="pln">
    response </span><span class="pun">=</span><span class="pln"> client</span><span class="pun">.</span><span class="pln">chat</span><span class="pun">.</span><span class="pln">completions</span><span class="pun">.</span><span class="pln">create</span><span class="pun">(</span><span class="pln">         
        model</span><span class="pun">=</span><span class="str">"gpt-4"</span><span class="pun">,</span><span class="pln">         
        messages</span><span class="pun">=[</span><span class="pln">             
            </span><span class="pun">{</span><span class="str">"role"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"system"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"content"</span><span class="pun">:</span><span class="pln"> system_prompt</span><span class="pun">},</span><span class="pln">             
            </span><span class="pun">{</span><span class="str">"role"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"user"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"content"</span><span class="pun">:</span><span class="pln"> input_text</span><span class="pun">},</span><span class="pln">         
        </span><span class="pun">],</span><span class="pln">         
        temperature</span><span class="pun">=</span><span class="lit">0.8</span><span class="pln">     
    </span><span class="pun">)</span><span class="pln">      

    </span><span class="com"># إرجاع استجابة الواجهة البرمجية</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> response</span></pre>

<p>
	تعمل هذه الدالة على إعداد الوصف للنظام لإخبار النموذج بالمهمة التي يجب أن يؤديها، ثم تطلب من الواجهة البرمجية <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> الخاصة بإكمال المحادثة توليد قصة باستخدام الموجّه prompt أو النص المدخل من المستخدم لتوجيه النموذج.
</p>

<p>
	أخيرًا، سنعمل على تنفيذ الدالة <code>format_response</code>. ونضيف ما يلي إلى نهاية ملف <code>chat_completion.py</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_8580_11" style=""><span class="kwd">def</span><span class="pln"> format_response</span><span class="pun">(</span><span class="pln">response</span><span class="pun">):</span><span class="pln">
    </span><span class="com"># استخراج القصة المولدة من الاستجابة     </span><span class="pln">
    story </span><span class="pun">=</span><span class="pln"> response</span><span class="pun">.</span><span class="pln">choices</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">message</span><span class="pun">.</span><span class="pln">content     
    </span><span class="com"># إزالة أي نص غير مرغوب فيه أو تنسيق     </span><span class="pln">
    story </span><span class="pun">=</span><span class="pln"> story</span><span class="pun">.</span><span class="pln">strip</span><span class="pun">()</span><span class="pln">     
    </span><span class="com"># إرجاع القصة المنسقة     </span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> story</span></pre>

<p>
	يستخرج الكود أعلاه القصة المُولّدة، وينسقها من خلال إزالة أي فراغات زائدة أو تنسيقات غير مرغوب بها.
</p>

<h3 id="-2">
	اختبار الاستجابات المولدة
</h3>

<p>
	لاختبار توليد النص بشكل صحيح، سنعدّل كود الملف <code>chat_completion.py</code> بإضافة الكود التالي في نهايته:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_8580_15" style=""><span class="com"># الاختبار </span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> __name__ </span><span class="pun">==</span><span class="pln"> </span><span class="str">"__main__"</span><span class="pun">:</span><span class="pln">     
    user_input </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Tell me a story about a dragon"</span><span class="pln">     
    </span><span class="kwd">print</span><span class="pun">(</span><span class="pln">generate_story</span><span class="pun">(</span><span class="pln">user_input</span><span class="pun">))</span></pre>

<p>
	نشغل ملف <code>chat_completion.py</code> لرؤية الاستجابة المولدة في <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B7%D8%B1%D9%81%D9%8A%D9%91%D8%A9-%D9%84%D9%8A%D9%86%D9%83%D8%B3-linux-terminal-r18/" rel="">الطرفية Terminal</a>:
</p>

<pre class="ipsCode">(env)sammy@ubuntu:$ python chat_completion.py
</pre>

<p>
	يجب أن نحصل الآن على استجابة مولدة بشكل إبداعي من GPT-4 بناءً على المُوجِّه prompt الذي أدخلناه للنموذج، يمكن أن نجرب مُوجّهات مختلفة لرؤية استجابات نصية متنوعة.
</p>

<p>
	سنعمل في الخطوة التالية على إضافة صور إلى النص الناتج المولد من هذه الخطوة.
</p>

<h2 id="dalle">
	الخطوة الثالثة: إنتاج الصور باستخدام DALL-E
</h2>

<p>
	صُمّم نموذج <a href="https://platform.openai.com/docs/models/whisper#dall-e" rel="external nofollow">DALL-E</a> لتوليد صور مفصلة عن طريق الموجهات النصية Prompts. مما يتيح للبوتات متعددة الأنماط Multi-modal Bots تحسين القصص عن طريق الإبداع البصري.
</p>

<p>
	ننشئ ملف بايثون جديد باسم <code>image_generation.py</code> في مجلد تطبيق جانغو Django الخاص بك. سيستخدم هذا الملف نموذج <code>DALL-E</code> في توليد الصور:
</p>

<pre class="ipsCode">(env)sammy@ubuntu:$ touch image_generation.py
</pre>

<p>
	بعدها ننشئ دالة داخل ملف <code>image_generator.py</code> لترسل المُوجّه prompt إلى <code>DALL-E</code> وتستقبل الصورة الناتجة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_8580_17" style=""><span class="kwd">import</span><span class="pln"> os
</span><span class="kwd">from</span><span class="pln"> openai </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">OpenAI</span><span class="pln">
client </span><span class="pun">=</span><span class="pln"> </span><span class="typ">OpenAI</span><span class="pun">(</span><span class="pln">api_key</span><span class="pun">=</span><span class="pln">os</span><span class="pun">.</span><span class="pln">environ</span><span class="pun">[</span><span class="str">"OPENAI_KEY"</span><span class="pun">])</span><span class="pln">
</span><span class="com"># إرسال الموجه لتوليد الصورة</span><span class="pln">
</span><span class="kwd">def</span><span class="pln"> generate_image</span><span class="pun">(</span><span class="pln">text_prompt</span><span class="pun">):</span><span class="pln">
    response </span><span class="pun">=</span><span class="pln"> client</span><span class="pun">.</span><span class="pln">images</span><span class="pun">.</span><span class="pln">generate</span><span class="pun">(</span><span class="pln">
        model</span><span class="pun">=</span><span class="str">"dall-e-3"</span><span class="pun">,</span><span class="pln">
        prompt</span><span class="pun">=</span><span class="pln">text_prompt</span><span class="pun">,</span><span class="pln">
        size</span><span class="pun">=</span><span class="str">"1024x1024"</span><span class="pun">,</span><span class="pln">
        quality</span><span class="pun">=</span><span class="str">"standard"</span><span class="pun">,</span><span class="pln">
        n</span><span class="pun">=</span><span class="lit">1</span><span class="pun">,</span><span class="pln">
    </span><span class="pun">)</span><span class="pln">
    image_url </span><span class="pun">=</span><span class="pln"> response</span><span class="pun">.</span><span class="pln">data</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">url
    </span><span class="kwd">return</span><span class="pln"> image_url</span></pre>

<p>
	سترسل الدالة طلب إلى نموذج <code>DALL-E</code> وتحدد المُوجِّه prompt، وعدد الصور المطلوب توليدها <code>n=1</code>، و أبعاد الصور وجودتها. ثم بعد ذلك تستخرج و تعيد رابط <code>URL</code> للصورة المولدة.
</p>

<h3 id="-3">
	اختبار النص البرمجي
</h3>

<p>
	بهذا نكون قد انتهينا من كتابة تطبيقنا وحان وقت تجربته، يمكن إضافة المثال التالي في نهاية ملف <code>image_generation.py</code> :
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2853_13" style=""><span class="com"># الاختبار</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> __name__ </span><span class="pun">==</span><span class="pln"> </span><span class="str">"__main__"</span><span class="pun">:</span><span class="pln">
    prompt </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Generate an image of a horse and a child playing in a field."</span><span class="pln">
    </span><span class="kwd">print</span><span class="pun">(</span><span class="pln">generate_image</span><span class="pun">(</span><span class="pln">prompt</span><span class="pun">))</span></pre>

<p>
	لننفذ الكود <code>image_generation.py</code> لتوليد صورة بناءً على النص المدخل:
</p>

<pre class="ipsCode">(env)sammy@ubuntu:$ python image_generation.py
</pre>

<p>
	إذا عمل السكربت بنجاح، يفترض أن نرى رابط <code>URL</code> للصورة المولدة في الطرفية، ويمكننا عرض الصورة عن طريق الانتقال إلى هذا الرابط <code>URL</code> في متصفح الويب.
</p>

<p>
	في الخطوة التالية، سنجمع بين التعرف على الكلام، وتوليد النصوص، وتوليد الصور لتوفير تجربة مستخدم موحدة ضمن تطبيقنا.
</p>

<h2 id="-4">
	الخطوة الرابعة: دمج كافة الوسائط المُولّدة
</h2>

<p>
	سندمج كل الوظائف التي طورناها في الخطوات السابقة لتوفير تجربة مستخدم سلسة. سيكون لتطبيق الويب الخاص بنا القدرة على معالجة المدخلات كالنصوص والأصوات من المستخدمين، لتوليد قصص، وتكملتها بالصور المتعلقة بها.
</p>

<h3 id="-5">
	إنشاء عرض متكامل بجمع كل مكونات التطبيق
</h3>

<p>
	أولاً، لنتأكد من تنظيم مشروع جانغو الخاص بنا، ومن وجود الملفات <code>whisper_transcribe.py</code> و<code>chat_completion.py</code> و<code>image_generation.py</code> في مجلد التطبيق. سننشئ الآن <a href="https://academy.hsoub.com/programming/python/django/%D9%85%D8%B9%D8%A7%D9%84%D8%AC%D8%A9-%D8%B7%D9%84%D8%A8%D8%A7%D8%AA-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%B9%D8%A8%D8%B1-%D8%A7%D9%84%D8%B9%D8%B1%D9%88%D8%B6-views-%D9%81%D9%8A-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%AC%D8%A7%D9%86%D8%BA%D9%88-r1629/" rel="">ملف عرض view</a> يجمع بين هذه المكونات.
</p>

<p>
	نفتح ملف <code>views.py</code> ونستورد الوحدات والدوال اللازمة. ثم ننشئ عرضًا جديدًا باسم <code>get_story_from_description</code> كالتالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_8580_21" style=""><span class="kwd">import</span><span class="pln"> uuid
</span><span class="kwd">from</span><span class="pln"> django</span><span class="pun">.</span><span class="pln">core</span><span class="pun">.</span><span class="pln">files</span><span class="pun">.</span><span class="pln">storage </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">FileSystemStorage</span><span class="pln">
</span><span class="kwd">from</span><span class="pln"> django</span><span class="pun">.</span><span class="pln">shortcuts </span><span class="kwd">import</span><span class="pln"> render
</span><span class="kwd">from</span><span class="pln"> </span><span class="pun">.</span><span class="pln">whisper_transcribe </span><span class="kwd">import</span><span class="pln"> transcribe_audio
</span><span class="kwd">from</span><span class="pln"> </span><span class="pun">.</span><span class="pln">chat_completion </span><span class="kwd">import</span><span class="pln"> generate_story
</span><span class="kwd">from</span><span class="pln"> </span><span class="pun">.</span><span class="pln">image_generation </span><span class="kwd">import</span><span class="pln"> generate_image

</span><span class="com"># العروض الأخرى</span><span class="pln">

</span><span class="kwd">def</span><span class="pln"> get_story_from_description</span><span class="pun">(</span><span class="pln">request</span><span class="pun">):</span><span class="pln">
    context </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{}</span><span class="pln">
    user_input </span><span class="pun">=</span><span class="pln"> </span><span class="str">""</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> request</span><span class="pun">.</span><span class="pln">method </span><span class="pun">==</span><span class="pln"> </span><span class="str">"GET"</span><span class="pun">:</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> render</span><span class="pun">(</span><span class="pln">request</span><span class="pun">,</span><span class="pln"> </span><span class="str">"story_template.html"</span><span class="pun">)</span><span class="pln">
    </span><span class="kwd">else</span><span class="pun">:</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="str">"text_input"</span><span class="pln"> </span><span class="kwd">in</span><span class="pln"> request</span><span class="pun">.</span><span class="pln">POST</span><span class="pun">:</span><span class="pln">
            user_input </span><span class="pun">+=</span><span class="pln"> request</span><span class="pun">.</span><span class="pln">POST</span><span class="pun">.</span><span class="pln">get</span><span class="pun">(</span><span class="str">"text_input"</span><span class="pun">)</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">"\n"</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="str">"voice_input"</span><span class="pln"> </span><span class="kwd">in</span><span class="pln"> request</span><span class="pun">.</span><span class="pln">FILES</span><span class="pun">:</span><span class="pln">
            audio_file </span><span class="pun">=</span><span class="pln"> request</span><span class="pun">.</span><span class="pln">FILES</span><span class="pun">[</span><span class="str">"voice_input"</span><span class="pun">]</span><span class="pln">
            file_name </span><span class="pun">=</span><span class="pln"> str</span><span class="pun">(</span><span class="pln">uuid</span><span class="pun">.</span><span class="pln">uuid4</span><span class="pun">())</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="pln">audio_file</span><span class="pun">.</span><span class="pln">name </span><span class="kwd">or</span><span class="pln"> </span><span class="str">""</span><span class="pun">)</span><span class="pln">
            </span><span class="typ">FileSystemStorage</span><span class="pun">(</span><span class="pln">location</span><span class="pun">=</span><span class="str">"/tmp"</span><span class="pun">).</span><span class="pln">save</span><span class="pun">(</span><span class="pln">file_name</span><span class="pun">,</span><span class="pln"> audio_file</span><span class="pun">)</span><span class="pln">
            user_input </span><span class="pun">+=</span><span class="pln"> transcribe_audio</span><span class="pun">(</span><span class="pln">f</span><span class="str">"/tmp/{file_name}"</span><span class="pun">)</span><span class="pln">

        generated_story </span><span class="pun">=</span><span class="pln"> generate_story</span><span class="pun">(</span><span class="pln">user_input</span><span class="pun">)</span><span class="pln">
        image_prompt </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">
            f</span><span class="str">"Generate an image that visually illustrates the essence of the following story: {generated_story}"</span><span class="pln">
        </span><span class="pun">)</span><span class="pln">
        image_url </span><span class="pun">=</span><span class="pln"> generate_image</span><span class="pun">(</span><span class="pln">image_prompt</span><span class="pun">)</span><span class="pln">

        context </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="str">"user_input"</span><span class="pun">:</span><span class="pln"> user_input</span><span class="pun">,</span><span class="pln">
            </span><span class="str">"generated_story"</span><span class="pun">:</span><span class="pln"> generated_story</span><span class="pun">.</span><span class="pln">replace</span><span class="pun">(</span><span class="str">"\n"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"&lt;br/&gt;"</span><span class="pun">),</span><span class="pln">
            </span><span class="str">"image_url"</span><span class="pun">:</span><span class="pln"> image_url</span><span class="pun">,</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">

        </span><span class="kwd">return</span><span class="pln"> render</span><span class="pun">(</span><span class="pln">request</span><span class="pun">,</span><span class="pln"> </span><span class="str">"story_template.html"</span><span class="pun">,</span><span class="pln"> context</span><span class="pun">)</span></pre>

<p>
	يستقبل هذا العرض View المدخلات النصية أو الصوتية من المستخدم. إذا كان هناك ملف صوتي، فإنه يُحفظ باسم فريد باستخدام مكتبة <code>uuid</code> ويستخدم دالة <code>transcribe_audio</code> لتحويل الكلام إلى نص. بعد ذلك، نستدعي الدالة <code>generate_story</code> لتوليد استجابة نصية، والدالة <code>generate_image</code> لتوليد صورة ذات صلة بالقصة. نمرر هذه المخرجات إلى متغير <code>context</code> الذي يشير إلى قاموس Dictionary به مخرجات الدوال السابقة، ثم نعرضها باستخدام قالب <code>story_template.html</code>
</p>

<h3 id="html">
	إنشاء قالب HTML
</h3>

<p>
	ننشئ ملف قالب باسم <code>story_template.html</code> ونضيف له الكود التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8580_23" style=""><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">style</span><span class="pun">=</span><span class="atv">"</span><span class="kwd">padding</span><span class="pun">:</span><span class="lit">3em</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">font-size</span><span class="pun">:</span><span class="lit">14pt</span><span class="pun">;</span><span class="atv">"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;form</span><span class="pln"> </span><span class="atn">method</span><span class="pun">=</span><span class="atv">"post"</span><span class="pln"> </span><span class="atn">enctype</span><span class="pun">=</span><span class="atv">"multipart/form-data"</span><span class="tag">&gt;</span><span class="pln">
        {% csrf_token %}
        </span><span class="tag">&lt;textarea</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"text_input"</span><span class="pln"> </span><span class="atn">placeholder</span><span class="pun">=</span><span class="atv">"Describe the story you would like"</span><span class="pln"> </span><span class="atn">style</span><span class="pun">=</span><span class="atv">"</span><span class="kwd">width</span><span class="pun">:</span><span class="lit">30em</span><span class="pun">;</span><span class="atv">"</span><span class="tag">&gt;&lt;/textarea&gt;</span><span class="pln">
        </span><span class="tag">&lt;br/&gt;&lt;br/&gt;</span><span class="pln">
        </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"file"</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"voice_input"</span><span class="pln"> </span><span class="atn">accept</span><span class="pun">=</span><span class="atv">"audio/*"</span><span class="pln"> </span><span class="atn">style</span><span class="pun">=</span><span class="atv">"</span><span class="kwd">width</span><span class="pun">:</span><span class="lit">30em</span><span class="pun">;</span><span class="atv">"</span><span class="tag">&gt;</span><span class="pln">
        </span><span class="tag">&lt;br/&gt;&lt;br/&gt;</span><span class="pln">
        </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"submit"</span><span class="pln"> </span><span class="atn">value</span><span class="pun">=</span><span class="atv">"Submit"</span><span class="pln"> </span><span class="atn">style</span><span class="pun">=</span><span class="atv">"</span><span class="kwd">width</span><span class="pun">:</span><span class="lit">8em</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">height</span><span class="pun">:</span><span class="lit">3em</span><span class="pun">;</span><span class="atv">"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;/form&gt;</span><span class="pln">

    </span><span class="tag">&lt;p&gt;</span><span class="pln">
        </span><span class="tag">&lt;strong&gt;</span><span class="pln">{{ user_input }}</span><span class="tag">&lt;/strong&gt;</span><span class="pln">
    </span><span class="tag">&lt;/p&gt;</span><span class="pln">
    {% if image_url %}
        </span><span class="tag">&lt;p&gt;</span><span class="pln">
            </span><span class="tag">&lt;img</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"{{ image_url }}"</span><span class="pln"> </span><span class="atn">alt</span><span class="pun">=</span><span class="atv">"Generated Image"</span><span class="pln"> </span><span class="atn">style</span><span class="pun">=</span><span class="atv">"</span><span class="kwd">max-width</span><span class="pun">:</span><span class="lit">80vw</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">width</span><span class="pun">:</span><span class="lit">30em</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">height</span><span class="pun">:</span><span class="lit">30em</span><span class="pun">;</span><span class="atv">"</span><span class="tag">&gt;</span><span class="pln">
        </span><span class="tag">&lt;/p&gt;</span><span class="pln">
    {% endif %}
    {% if generated_story %}
        </span><span class="tag">&lt;p&gt;</span><span class="pln">{{ generated_story | safe }}</span><span class="tag">&lt;/p&gt;</span><span class="pln">
    {% endif %}
</span><span class="tag">&lt;/div&gt;</span></pre>

<p>
	تسمح هذه الاستمارة البسيطة للمستخدمين بإرسال المُوجِّهات prompts الخاصة بهم من خلال كتابة وضف نصي أو تحميل ملف صوتي يصف القصة المطلوب توليدها، بعد ذلك يعرض النص و الصورة التي أنشأها التطبيق.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="165346" href="https://academy.hsoub.com/uploads/monthly_2025_01/770304661_.png.56abcedbbad8a69e84244db19ea9ee81.png" rel=""><img alt="استمارة التطبيق.png" class="ipsImage ipsImage_thumbnailed" data-fileid="165346" data-ratio="95.67" data-unique="oqh84hsa5" style="width: 400px; height: auto;" width="627" src="https://academy.hsoub.com/uploads/monthly_2025_01/.thumb.png.10482fbc757b405885d04fee1875531e.png"></a>
</p>

<h3 id="url">
	إنشاء رابط URL لعرض التطبيق
</h3>

<p>
	الآن بعد أن أصبح العرض <code>get_story_from_description</code> جاهزًا، يجب جعله متاحًا من خلال إعداد رابط <code>URL</code>. نفتح ملف <code>urls.py</code> داخل تطبيق جانغو، ونضيف نمط Pattern لعرض خرج الدالة <code>get_story_from_description</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_8580_27" style=""><span class="kwd">from</span><span class="pln"> django</span><span class="pun">.</span><span class="pln">urls </span><span class="kwd">import</span><span class="pln"> path
</span><span class="kwd">from</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="kwd">import</span><span class="pln"> views

urlpatterns </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
    </span><span class="com"># other patterns</span><span class="pln">
    path</span><span class="pun">(</span><span class="str">'generate-story/'</span><span class="pun">,</span><span class="pln"> views</span><span class="pun">.</span><span class="pln">get_story_from_description</span><span class="pun">,</span><span class="pln"> 
    name</span><span class="pun">=</span><span class="str">'get_story_from_description'</span><span class="pun">),</span><span class="pln">
</span><span class="pun">]</span></pre>

<h3 id="-6">
	اختبار التكامل النهائي بعد ربط جميع عناصر التطبيق
</h3>

<p>
	بإمكاننا الآن زيارة الرابط <code>http://your_domain/generate-story</code> في متصفح الويب لرؤية الاستمارة form المعرفة بداخل قالب <code>story_template.html</code>. سنرسل من خلال الاستمارة نص المُوجّه prompt ضمن الحقل النصي، أو نرفع الملف الصوتي باستخدام حقل اختيار الملف. بعد إرسال الدخل المطلوب للتطبيق، سيعالج تطبيقنا المدخلات، ويولد لنا قصة وصورة مُرفقة، ويعرضهما على الصفحة.
</p>

<p>
	على سبيل المثال، سنطلب توليد قصة بسيطة من المُوجًه prompt التالي لتوليد قصة عن ولد وحصان يلعبان في الحقل، ويمكن تجربة أي مُوجًه مناسب:
</p>

<blockquote class="ipsQuote" data-gramm="false" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix" data-gramm="false">
		<p>
			Tell me a story about a horse and a child playing in a field
		</p>
	</div>
</blockquote>

<p>
	النتيجة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="165344" href="https://academy.hsoub.com/uploads/monthly_2025_01/1470359598_.png.89960926f446ced8c240520ed0e69a72.png" rel=""><img alt="القصة المولدة" class="ipsImage ipsImage_thumbnailed" data-fileid="165344" data-ratio="82.67" data-unique="kkhycj4la" style="width: 500px; height: auto;" width="300" src="https://academy.hsoub.com/uploads/monthly_2025_01/.thumb.png.6a76d0070de3b905701f36338b85ff7a.png"> </a>
</p>

<p>
	باستكمال هذه الخطوة، نكون قد انتهينا من إنشاء تطبيق جانغو يتعامل بسلاسة مع مدخلات المستخدم ويستجيب لها بأشكال متعددة من نصوص وملفات صوتية وصور.
</p>

<h2 id="-7">
	الخاتمة
</h2>

<p>
	تعلمنا في هذا الدرس التعليمي خطوات تطوير بوت متعدد الأنماط Multi-modal Bot باستخدام جانغو Django، مع دمج قدرات نموذج Whisper للتعرف على الكلام، و GPT-4 لتوليد النصوص، و DALL-E لتوليد الصور. يمكن لتطبيقنا فهم مدخلات المستخدم بعدة أشكال والاستجابة لها.<br>
	للتطوير المستقبلي، ننصحكم باستكشاف إصدارات بديلة من النماذج المستخدمة، وتحسين تصميم واجهة التطبيق، أو توسيع وظائف التطبيق لتشمل ميزات تفاعلية إضافية.
</p>

<p>
	ترجمة وبتصرف للمقال <a href="https://www.digitalocean.com/community/tutorials/developing-multi-modal-bots-with-django-gpt-4-whisper-and-dall-e" rel="external nofollow">Developing Multi-Modal Bots with Django, GPT-4, Whisper, and DALL-E</a> لكاتبيه <a href="https://www.digitalocean.com/community/users/ehioroboevans" rel="external nofollow">Evans Ehiorobo</a> و <a href="https://www.digitalocean.com/community/users/asinghwalia" rel="external nofollow">Anish Singh Walia</a>
</p>

<h2 id="-8">
	اقرأ ايضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%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/" rel="">الذكاء الاصطناعي: دليلك الشامل</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%83%D9%84-%D9%85%D8%A7-%D8%AA%D9%88%D8%AF-%D9%85%D8%B9%D8%B1%D9%81%D8%AA%D9%87-%D8%B9%D9%86-%D8%AF%D8%B1%D8%A7%D8%B3%D8%A9-%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-r2362/" rel="">كل ما تود معرفته عن دراسة الذكاء الاصطناعي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/php/%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D9%88%D8%B5%D9%81%D8%A9-%D9%84%D8%A7%D9%82%D8%AA%D8%B1%D8%A7%D8%AD-%D8%A7%D9%84%D9%88%D8%AC%D8%A8%D8%A7%D8%AA-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-chatgpt-%D9%88-dall-e-%D9%81%D9%8A-php-r2005/" rel="">تطوير تطبيق لاقتراح وصفات الطعام باستخدام ChatGPT و DALL-E في PHP</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%88%D9%83%D9%84%D8%A7%D8%A1-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%AD%D9%88%D9%84%D8%A7%D8%AA-transformers-agents-%D9%81%D9%8A-%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-%D8%A7%D9%84%D8%AA%D9%88%D9%84%D9%8A%D8%AF%D9%8A-r2379/" rel="">استخدام وكلاء مكتبة المحولات Transformers Agents في الذكاء الاصطناعي التوليدي</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2489</guid><pubDate>Tue, 14 Jan 2025 15:06:00 +0000</pubDate></item><item><title>&#x627;&#x643;&#x62A;&#x634;&#x641; &#x628;&#x62F;&#x627;&#x626;&#x644; ChatGPT &#x645;&#x641;&#x62A;&#x648;&#x62D;&#x629; &#x627;&#x644;&#x645;&#x635;&#x62F;&#x631;</title><link>https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%83%D8%AA%D8%B4%D9%81-%D8%A8%D8%AF%D8%A7%D8%A6%D9%84-chatgpt-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-r2488/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2025_01/-------ChatGPT.png.a82c0175da6441b4b5c7e31293056009.png" /></p>
<p>
	يعد روبوت الدردشة ChatGPT واحدًا من أشهر <span ipsnoautolink="true">أدوات الذكاء الاصطناعي التوليدي Generative AI Tool</span>، وقد طورته شركة OpenAI ليساعد للعاملين في مختلف المجالات، فهو يتيح طرح الأسئلة حول أي موضوع ويوفر إجابات تفصيلية.
</p>

<p>
	ولكن، بالرغم من فوائده الكثيرة إلا أنه ليس مفتوح المصدر <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D8%A7%D9%84%D9%85%D9%82%D8%B5%D9%88%D8%AF-%D8%A8%D9%85%D8%B5%D8%B7%D9%84%D8%AD-%D9%85%D9%81%D8%AA%D9%88%D8%AD-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-open-source%D8%9F-r885/" rel="">open source</a>، فهو يمنع المطورين من الوصول إلى أكواده المصدرية، وبناء بوتات مخصصة لاحتياجاتهم، وهو متاح للمطورين عبر <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D9%87%D9%8A-%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D9%84%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-api%D8%9F-r1512/" rel="">واجهة برمجية <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr></a> تسمح لهم بالتفاعل مع النموذج واستخدامه داخل تطبيقاتهم، فما هي أهم بدائل ChatGPT مفتوحة المصدر؟ هذا ما سنتعرف عليه في مقالنا حيث نستعرض لكم عدة بدائل مفتوحة المصدر لشات جي بي تي تمكنكم من بناء روبوت الدردشة الخاص بكم بمرونة كبيرة.
</p>

<h2 id="-1">
	أسباب البحث عن بدائل مفتوحة المصدر لشات جي بي تي
</h2>

<p>
	فيما يلي قائمة بأبرز الأسباب التي تدفعنا لاستخدام بدائل لروبوت الدردشة <a href="https://academy.hsoub.com/apps/web/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A8%D9%88%D8%AA-%D8%A7%D9%84%D9%85%D8%AD%D8%A7%D8%AF%D8%AB%D8%A9-%D8%A7%D9%84%D8%B0%D9%83%D9%8A-%D8%B4%D8%A7%D8%AA-%D8%AC%D9%8A-%D8%A8%D9%8A-%D8%AA%D9%8A-chatgpt-r863/" rel="">ChatGPT</a>:
</p>

<ul>
	<li>
		المعرفة الكاملة بطريقة تعامل روبوت الدردشة مع بيانات المستخدمين ومعالجتها
	</li>
	<li>
		إمكانية بناء روبوت دردشة خاص بنا شبيه بروبوت الدردشة مفتوح المصدر دون الحاجة لدفع تكاليف لاستخدامه
	</li>
	<li>
		سهولة تعديل روبوت الدردشة وتخصيصه حسب احتياجاتنا الخاصة
	</li>
	<li>
		المرونة في السياسات وعدم الحاجة للالتزام بسياسات الشركة المالكة لروبوت الدردشة
	</li>
	<li>
		التطور السريع والمستمر في روبوت الدردشة نظرًا لمشاركة عدد ضخم من المطورين في تحديث البوت وترقيته
	</li>
</ul>

<p>
	<strong>ملاحظة</strong>: لا يعني ذلك أنَّ بوت ChatGPT سيء بالطبع ولا ندعو لعدم استخدامه فقد وصل هذا البوت لدرجة عالية من الكفاءة قد تفوق البدائل مفتوحة المصدر، وإنما نقترح عليكم مطالعة هذه الحلول وتجربتها والنظر في إمكانية الاستفادة المثلى منها.
</p>

<p>
	دعونا نستعرض معًا عدد من البدائل مفتوحة المصدر لبوت ChatGPT.
</p>

<h2>
	ديب سيك DeepSeek
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2025_02/deepseek.png.81dba71ee4344950bb6b8a6d2fa85f1b.png" data-fileid="167076" data-fileext="png" rel=""><img alt="DeepSeek" class="ipsImage ipsImage_thumbnailed" data-fileid="167076" data-ratio="72.33" data-unique="pxs7azmmb" style="width: 300px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2025_02/deepseek.thumb.png.5c3f6d86c5bc8bfd9b4e57c3b9da695f.png"></a>
</p>

<p>
	تُعدّ <a href="https://www.deepseek.com/" rel="external nofollow">DeepSeek</a> منصة ذكاء صناعي مفتوحة المصدر مخصصة لإجراء عدة مهام باستخدام تقنيات معالجة اللغة الطبيعية وتعلم الآلة حيث توفر للمطورين نماذج متقدمة في الذكاء الاصطناعي صالحة لمختلف التطبيقات مثل نموذج DeepSeek-VL لفهم الوسائط المتعددة، ونموذج DeepSeek-Coder لتطوير البرمجيات، ونموذج DeepSeek-V2 الذي يركز على الكفاءة في الاستدلال، كما تقدم المنصة للمطورين إمكانية الوصول لواجهتها البرمجية <abbr title="Application Programming Interface | واجهة برمجية">API</abbr> لمزيد من المرونة والتحكم. وتتضمن تطبيقًا مخصصًا للاستخدام على الهواتف المحمولة، بالإضافة إلى روبوت دردشة DeepSeek Chat للتفاعل المباشر مع الذكاء الصناعي والعديد من المميزات الأخرى.
</p>

<h2 id="6huggingchat">
	هاجينج شات HuggingChat
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="165321" href="https://academy.hsoub.com/uploads/monthly_2025_01/huggingchat.jpg.c4853d24d546bd8fc29679d3720cd733.jpg" rel=""><img alt="huggingchat" class="ipsImage ipsImage_thumbnailed" data-fileid="165321" data-unique="o92hk5omn" style="width: 400px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_01/huggingchat.thumb.jpg.2ced569b8e409f1585110996478d6d1a.jpg"> </a>
</p>

<p>
	توفر منصة <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%85%D8%A7-%D9%87%D9%8A-%D9%85%D9%86%D8%B5%D8%A9-hugging-face-%D9%84%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-r2449/" rel="">Huggingface</a> الشهيرة نماذج ذكاء اصطناعي مختلفة للمطورين، وتنشر باستمرار نسخًا تجريبية من بوتات الدردشة، ومن ضمنها روبوت <a href="https://huggingface.co/chat/" rel="external nofollow">HuggingChat </a>المطوّر بواسطة المنصة ليكون بديلًا مفتوح المصدر لشات جي بي تي Chat GPT، فهو يستخدم مجموعة من أفضل نماذج الذكاء الاصطناعي الموجودة في المجتمع التقني، ويمكن تجربته عبر <a href="https://huggingface.co/spaces/huggingchat/chat-ui" rel="external nofollow">صفحة البوت على موقع Huggingface</a>، كما يمكن الاطلاع على <a href="https://huggingface.co/spaces/huggingchat/chat-ui/tree/main" rel="external nofollow">شيفرات البوت المصدرية</a>، وكذلك يمكن استخدام الواجهة الأمامية للبوت الخاص بك، مع تعديل الواجهة الخلفية وتخصيصها بما يتناسب مع الخصائص أو الخدمات التي تريد دمجها، مثل إضافة وظائف جديدة أو تعديل طريقة معالجة البيانات.
</p>

<h2 id="10doly">
	دولي Doly
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="165319" href="https://academy.hsoub.com/uploads/monthly_2025_01/Dolly.jpg.f4ce49572b5a8ac4e39fe6c3e9269265.jpg" rel=""><img alt="dolly" class="ipsImage ipsImage_thumbnailed" data-fileid="165319" data-unique="kg1sfdffp" style="width: 400px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_01/Dolly.thumb.jpg.67d5f3d4529daeb3938836ca75838f47.jpg"> </a>
</p>

<p>
	دولي Doly هو نموذج لغوي درَّبَته منصة تعلم الآلة المدفوعة داتا بريكس Databricks وهي منصة تقدم أدوات وتقنيات متقدمة لبناء وتشغيل تطبيقات الذكاء الاصطناعي وتحليل البيانات،  ويمكن الاطلاع على الشيفرات المصدرية للنموذج عبر <a href="https://github.com/databrickslabs/dolly" rel="external nofollow">مستودع جيت هاب</a>، كما يمكن تجربة النموذج ذاته عبر <a href="https://huggingface.co/databricks/dolly-v2-12b" rel="external nofollow">منصة Huggingface</a>.
</p>

<h2 id="7koala">
	كوالا Koala
</h2>

<p>
	كوالا Koala بوت دردشة تابع إلى <a href="https://github.com/young-geng/EasyLM#koala" rel="external nofollow">EasyLM</a><span style="display: none;">      </span> وهو إطار عمل مفتوح المصدر يهدف إلى تبسيط وتسهيل استخدام النماذج اللغوية الكبيرة مثل GPT و BERT وغيرها. ويمكن استخدامه في العديد من التطبيقات مثل <a href="https://academy.hsoub.com/apps/cat/" rel="">الترجمة الآلية</a> وتحليل المشاعر والتلخيص والعديد من مهام معالجة اللغة الطبيعية. ويمكنك تشغيله محليًا عبر حاسوبك الخاص، وهو مبني على مجموعة بيانات LLaMA، ولمعرفة المزيد من التفاصيل يمكن مطالعة <a href="https://bair.berkeley.edu/blog/2023/04/03/koala/" rel="external nofollow">المدونة الرسمية للبوت</a>.
</p>

<h2 id="8vicuna">
	فيكونا Vicuna
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="165323" href="https://academy.hsoub.com/uploads/monthly_2025_01/vicuna.jpg.cd93368db7fa3655e8f90099d8be4361.jpg" rel=""><img alt="vicuna" class="ipsImage ipsImage_thumbnailed" data-fileid="165323" data-unique="24y0kgag9" style="width: 400px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_01/vicuna.thumb.jpg.08af7b3fc1ec9824892532a3bde77783.jpg"> </a>
</p>

<p>
	يعد فيكونا Vicuna بديلًا آخر مفتوح المصدر لشات جي بي تي، وقد تدرَّب على نموذج LLaMA الضخم الذي طورته Meta، وحسب مطوري البوت فإنَّ جودة نتائجه مقاربة لنتائج الإصدار الرابع من شات جي بي تي <a href="https://openai.com/index/gpt-4/" rel="external nofollow">GPT-4</a>، وللتحقق من هذا الادعاء يمكنكم تجربة البوت والتحقق من أدائه الفعلي عبر <a href="https://chat.lmsys.org/" rel="external nofollow">هذا الرابط</a>، كما يمكنكم مطالعة <a href="https://lmsys.org/blog/2023-03-30-vicuna/" rel="external nofollow">المدونة الرسمية للبوت</a>.
</p>

<h2 id="1openchatkit">
	أوبن شات كيت OpenChatKit
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="165322" href="https://academy.hsoub.com/uploads/monthly_2025_01/OpenChatKit.jpg.fa008b29d2bd84269fe9231c268843e7.jpg" rel=""><img alt="openchatkit" class="ipsImage ipsImage_thumbnailed" data-fileid="165322" data-unique="6tu2v2hra" style="width: 400px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_01/OpenChatKit.thumb.jpg.8445cc1fbc6e3ad10b5443534165d880.jpg"> </a>
</p>

<p>
	يٌعدّ <a href="https://huggingface.co/spaces/togethercomputer/OpenChatKit" rel="external nofollow">OpenChatKit</a> بديلًا متكاملًا لبوت ChatGPT، وقد طورته <a href="https://www.together.ai/" rel="external nofollow">شركة Together</a> متعاونة مع منظمات بحثية مثل LAION لإنشاء مجموعة بيانات تدريبية تساعد البوت على التعلم والتطور، تعتمد شركة Together على <a href="https://www.together.ai/blog/redpajama-7b" rel="external nofollow">نموذج الذكاء الاصطناعي RedPajama</a> الذي يعد واحدًا من أهم وأشهر نماذج الذكاء الاصطناعي مفتوحة المصدر لتشغيل البوت OpenChatKit. ويمكن تجربة هذا البوت ومطالعة سائر تفاصيله التقنية عبر <a href="https://github.com/togethercomputer/OpenChatKit" rel="external nofollow">صفحة البوت على موقع جيت هاب</a>.
</p>

<h2 id="2chatrwkv">
	ChatRWKV
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="165317" href="https://academy.hsoub.com/uploads/monthly_2025_01/chatrwkv.jpg.c605ba4c41c1d67da6a25e259d232124.jpg" rel=""><img alt="chatrwkv" class="ipsImage ipsImage_thumbnailed" data-fileid="165317" data-unique="o6pgp2dx1" style="width: 400px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_01/chatrwkv.thumb.jpg.44ea77cd2fab4dcece6f64206428a9d7.jpg"> </a>
</p>

<p>
	يعد بوت ChatRWKV بديلًا مفتوح المصدر لشات جي بي تي، وهو يعتمد على النموذج اللغوي RNN، ويمكنكم إيجاد نسخة تجريبية منه عبر موقع <a href="https://huggingface.co/spaces/BlinkDL/RWKV-Gradio-2" rel="external nofollow">Huggingface</a>، كما يمكن معرفة سائر المعلومات التقنية ومتابعة الإصدارات عبر <a href="https://github.com/BlinkDL/ChatRWKV" rel="external nofollow">مستودع البوت على موقع جيت هاب</a>، بالإضافة إلى ذلك، يمكن للمطورين وأصحاب الأعمال بناء روبوتات الدردشة الخاصة بهم باستخدام ChatRWKV.
</p>

<h2 id="3colossalchat">
	ColossalChat
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="165318" href="https://academy.hsoub.com/uploads/monthly_2025_01/colossalchat.jpg.67ae961bf3a58556d344755f49d5e4fe.jpg" rel=""><img alt="colossalchat" class="ipsImage ipsImage_thumbnailed" data-fileid="165318" data-unique="79apk7vq6" style="width: 400px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_01/colossalchat.thumb.jpg.1f818661a8dda2eeab6bf5eedcaa620a.jpg"> </a>
</p>

<p>
	تشير Colossal AI إلى مبادرة تساعد المطورين على استخدام نماذج ذكاء اصطناعي مُدرَّبة مسبقًا لتطوير بوتات دردشة شبيهة بشات جي بي تي ChatGPT-Like، أما <a href="https://chat.colossalai.org/" rel="external nofollow">ColossalChat</a> فهو شات بوت مبني باستخدام الأدوات التي توفرها مبادرة Colossal AI، ويمكنكم مطالعة مزيد من التفاصيل حوله عبر <a href="https://github.com/hpcaitech/ColossalAI/tree/main/applications/ColossalChat" rel="external nofollow">مستودع جيت هاب</a>.
</p>

<h2 id="5gpt4all">
	GPT4ALL
</h2>

<p>
	يختلف بوت GPT4ALL عن سائر بوتات الدردشة، ذلك بأنه بوت مفتوح المصدر يهدف لتزويدنا ببوتات دردشة قابلة للعمل في أي مكان، أي يمكننا أن نستخدم الشات بوت محليًا على أجهزتنا الخاصة ونعالج الأوامر عبر وحدة المعالجة المركزية دون الحاجة للاتصال بخوادم أو حتى الاتصال بالإنترنت، كما يدعم العمل على جميع وحدات المعالجة الرسومية تقريبًا، ولا نحتاج سوى تثبيت تطبيق سطح المكتب الخاص بالبوت ثم البدء باستخدامه، ولمعرفة طريقة عمل البوت يمكن الاطلاع على <a href="https://itsfoss.com/open-source-chatgpt-alternatives/" rel="external nofollow">مستودعه على جيت هاب</a>.
</p>

<h2 id="9alpacalora">
	Alpaca-LoRA
</h2>

<p>
	يهدف نموذج ألباكا لوراAlpaca-LoRA إلى توفير نموذج لغوي باستخدام التكيُّف منخفض الرتبة Low-Rank Adaptation، أي يمكن تدريب النموذج وتحسين نتائجه باعتماد عدد قليل من البرامترات، وبالتالي يمكن أن يعمل النموذج بموارد قليلة وتكاليف منخفضة، ما يسمح لنا بتشغيله على الحواسيب المصغرة محدودة الموارد، مثل <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D9%85%D8%A7-%D9%87%D9%88-%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-raspberry-pi%D8%9F-r1578/" rel="">حاسوب راسبيري باي Raspberry Pi</a>، ومن المثير أنه يمكن تدريب النموذج كاملًا باستخدام معالج الرسوميات RTX 4090 GPU خلال ساعات قليلة، ويمكن مطالعة المزيد عنه عبر <a href="https://github.com/tloen/alpaca-lora" rel="external nofollow">مستودع البوت على جيت هاب</a>.
</p>

<h2 id="11h2ogpt">
	 H2oGPT
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="165320" href="https://academy.hsoub.com/uploads/monthly_2025_01/h2ogpt.jpg.17e0df1c141d2d2b137c0572dc777e47.jpg" rel=""><img alt="h2ogpt" class="ipsImage ipsImage_thumbnailed" data-fileid="165320" data-unique="x37ebf2dt" style="width: 400px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_01/h2ogpt.thumb.jpg.c69c153e7b4bd128163c23da9bd113cd.jpg"> </a>
</p>

<p>
	يعد بوت H2oGPT مخصصًا لتلخيص المستندات النصية، وإن كان يمكنك محادثته واستفساره كسائر البوتات، فهو يسمح لنا برفع واستعراض المستندات وتلخيصها عبر واجهته الأمامية، كما تتوافر مثبتات Installers لبوت H2oGPT لنظامي تشغيل ويندوز Windows وماك أو إس MacOS، بينما نحتاج استخدام دوكر Docker لتنصيبه على نظام تشغيل لينكس Linux، ويمكن تجربته عبر المتصفح من <a href="https://huggingface.co/spaces/h2oai/h2ogpt-chatbot2" rel="external nofollow">موقع Huggingface</a>، كما يمكن الاطلاع على شيفراته المصدرية عبر <a href="https://github.com/h2oai/h2ogpt" rel="external nofollow">مستودع جيت هاب</a>.
</p>

<h2 id="12cerebrasgpt">
	Cerebras-GPT
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="165316" href="https://academy.hsoub.com/uploads/monthly_2025_01/cerebras.jpg.00e4abaab1bc9a8aedf273a8ad1fd813.jpg" rel=""><img alt="cerebras" class="ipsImage ipsImage_thumbnailed" data-fileid="165316" data-unique="5v1gf7ays" style="width: 400px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_01/cerebras.thumb.jpg.2cefead1f885ef50aa734d9c2bc9b768.jpg"> </a>
</p>

<p>
	لا يعد Cerebras-GPT بوت دردشة في حد ذاته، ولكنه يوفر نماذج لغوية مفتوحة المصدر مُدرَّبة على بيانات بأحجام ضخمة وشبيهة بنموذج جي بي تي GPT-Like، يساعدنا استخدام هذه النماذج في تطوير البوت الخاص بنا على زيادة دقة البوت ورفع كفاءته الحسابية، ولمطالعة مزيد من المعلومات عن النموذج يمكن زيارة <a href="https://huggingface.co/cerebras/Cerebras-GPT-6.7B" rel="external nofollow">صفحته على Huggingface</a>.
</p>

<h2>
	KoboldAI
</h2>

<p>
	يعد KoboldAI شات بوت يعمل مساعدًا شخصيًا للكُتَّاب، ولا سيما كتاب الروايات، ويُستخدم عبر المتصفح Browser-Based، ويمكن تشغيله مع برنامج Google Colab بسهولة، يتميز KoboldAI بقدرته على الكتابة بأساليب مختلفة، ليساعد الكتاب على إثراء نصوصهم ويساعدهم على توليد أفكار جديدة. ويمكن اختبار أداه والاطلاع على المزيد من التفاصيل حوله عبر <a href="https://github.com/KoboldAI/KoboldAI-Client" rel="external nofollow">مستودع جيت هاب</a>.
</p>

<h2 id="-2">
	الخاتمة
</h2>

<p>
	بهذا نكون وصلنا لنهاية مقالنا الذي عرفناكم فيه على مجموعة من البدائل مفتوحة المصدر لبوت ChatGPT، كل ما عليكم هو تجربتها واستخدامها في تطوير بوتات مخصصة تلائم احتياجات أعمالكم دون الحاجة إلى ميزانية مرتفعة والتحقق من مدى كفاءتها، ونرجب بمشاركة تجربتكم مع أي روبوت دردشة مفتوح المصدر في قسم التعليقات أسفل المقال.
</p>

<p>
	ترجمة -وبتصرف- لمقال <a href="https://itsfoss.com/open-source-chatgpt-alternatives/" rel="external nofollow">Best Open Source ChatGPT Alternatives</a> لكاتبه <a href="https://itsfoss.com/author/ankush/" rel="external nofollow">Ankush Das</a>
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/apps/general/%D8%AA%D8%AF%D8%B1%D9%8A%D8%A8-%D8%A8%D9%88%D8%AA-%D8%A7%D9%84%D9%85%D8%AD%D8%A7%D8%AF%D8%AB%D8%A9-chatgpt-%D9%88%D8%AA%D8%B9%D9%84%D9%8A%D9%85%D9%87-%D9%83%D9%8A%D9%81-%D9%8A%D8%AA%D8%AD%D8%AF%D8%AB-%D9%88%D9%8A%D8%AA%D8%B9%D9%84%D9%85-r897/" rel="">تدريب بوت المحادثة ChatGPT وتعليمه كيف يتحدث ويتعلم</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/php/wordpress/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-11-%D8%B7%D8%B1%D9%8A%D9%82%D8%A9-%D9%8A%D8%B3%D8%A7%D8%B9%D8%AF%D9%83-%D9%81%D9%8A%D9%87%D8%A7-chatgpt-%D9%83%D9%85%D8%B7%D9%88%D8%B1-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-r2342/" rel="">تعرف على 11 طريقة يساعدك فيها ChatGPT كمطور ووردبريس</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/apps/web/%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-chatgpt-api-%D9%84%D8%AA%D8%AD%D8%B3%D9%8A%D9%86-%D8%AE%D8%AF%D9%85%D8%A7%D8%AA%D9%83-%D8%B9%D8%A8%D8%B1-%D8%A7%D9%84%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-r909/" rel="">دليل استخدام ChatGPT <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> لتحسين خدماتك عبر الإنترنت</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A8%D9%86%D8%A7%D8%A1-%D8%B1%D9%88%D8%A8%D9%88%D8%AA-%D8%AF%D8%B1%D8%AF%D8%B4%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-%D9%88-openai-api-r2483/" rel="">بناء روبوت دردشة باستخدام بايثون و OpenAI <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr></a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2488</guid><pubDate>Fri, 10 Jan 2025 15:00:00 +0000</pubDate></item><item><title>&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x642;&#x648;&#x627;&#x644;&#x628; &#x627;&#x644;&#x62F;&#x631;&#x62F;&#x634;&#x629; Chat Templates &#x644;&#x644;&#x646;&#x645;&#x627;&#x630;&#x62C; &#x627;&#x644;&#x644;&#x63A;&#x648;&#x64A;&#x629; &#x627;&#x644;&#x643;&#x628;&#x64A;&#x631;&#x629; LLMs</title><link>https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%82%D9%88%D8%A7%D9%84%D8%A8-%D8%A7%D9%84%D8%AF%D8%B1%D8%AF%D8%B4%D8%A9-chat-templates-%D9%84%D9%84%D9%86%D9%85%D8%A7%D8%B0%D8%AC-%D8%A7%D9%84%D9%84%D8%BA%D9%88%D9%8A%D8%A9-%D8%A7%D9%84%D9%83%D8%A8%D9%8A%D8%B1%D8%A9-llms-r2486/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2025_01/_.png.c2422c823e460704833d3e5192adde7a.png" /></p>
<p>
	نشرح في هذا المقال قوالب الدردشة Chat Templates واستخدامها في النماذج اللغوية الكبيرة LLMs، فالدردشة تعتمد على محادثات مكونة من سلسلة رسائل متعددة بدلاً من النصوص المنفصلة كما هو الحال في النماذج اللغوية التقليدية، كما تحتوي كل رسالة في المحادثة على دور محدد مثل المستخدم User أو المساعد Assistant، بالإضافة إلى محتوى نص الرسالة، وبالتالي نحتاج إلى طريقة منظمة لتحويلها لصيغة تُمكّن النموذج Model من فهمها ومعالجتها بشكل صحيح وإنتاج استجابات ملائمة لها.
</p>

<p>
	تتمثل وظيفة القوالب Chat Templates في تحويل هذه المحادثات إلى تنسيق يمكن للنموذج Model تحليله وفهمه بطريقة مناسبة تمامًا كما هو الحال في <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%B1%D9%85%D8%B2%D8%A7%D8%AA-tokenizers-%D9%81%D9%8A-%D9%85%D9%86%D8%B5%D8%A9-hugging-face-r2470/" rel="">عملية الترميز Tokenization</a>. وتُعدّ القوالب جزءًا أساسيًا من عملية التحضير للنموذج فهي تعمل كآلية تنظم تحويل المحادثات المكونة من قوائم من الرسائل مثل رسائل المستخدم وردود المساعد، إلى سلسلة نصية واحدة متكاملة ومُهيَّأة بطريقة تناسب متطلبات النموذج، مما يضمن فهم النموذج للمدخلات بشكل صحيح ومعالجتها بكفاءة.
</p>

<h2>
	مثال على قالب الدردشة باستخدام نموذج BlenderBot
</h2>

<p>
	لنوضّح مثال على استخدام قالب دردشة باستخدام النموذج <code>BlenderBot</code> الذي يحتوي على قالب افتراضي بسيط مهمته إضافة مسافة أو فراغ بين الرسائل المتبادلة والمنفصلة عن بعضها لتصبح عبارة عن سلسلة نصية واحدة يستطيع النموذج معالجتها بسهولة، بدلاً من التعامل مع كل رسالة بشكل منفصل:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7425_16" style=""><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">AutoTokenizer</span><span class="pln">

</span><span class="com"># تحميل المحول</span><span class="pln">
tokenizer </span><span class="pun">=</span><span class="pln"> </span><span class="typ">AutoTokenizer</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="str">"facebook/blenderbot-400M-distill"</span><span class="pun">)</span><span class="pln">

</span><span class="com"># إعداد المحادثة</span><span class="pln">
chat </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
    </span><span class="pun">{</span><span class="str">"role"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"user"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"content"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"مرحبًا، كيف حالك؟"</span><span class="pun">},</span><span class="pln">
    </span><span class="pun">{</span><span class="str">"role"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"assistant"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"content"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"أنا بخير. كيف يمكنني مساعدتك اليوم؟"</span><span class="pun">},</span><span class="pln">
    </span><span class="pun">{</span><span class="str">"role"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"user"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"content"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"أريد أن أظهر كيفية عمل قوالب الدردشة!"</span><span class="pun">},</span><span class="pln">
</span><span class="pun">]</span><span class="pln">

</span><span class="com"># تطبيق قالب الدردشة</span><span class="pln">
tokenizer</span><span class="pun">.</span><span class="pln">apply_chat_template</span><span class="pun">(</span><span class="pln">chat</span><span class="pun">,</span><span class="pln"> tokenize</span><span class="pun">=</span><span class="kwd">False</span><span class="pun">)</span></pre>

<p>
	سنلاحظ بعدها اختصار المحادثة بأكملها في سلسلة نصية واحدة. وإذا استخدمنا الإعداد الافتراضي <code>tokenize=True</code>، فستخضع هذه السلسلة النصية لتحويل وستُرمَّز هذه السلسلة النصية بشكل وحدات ترميز tokens.
</p>

<p>
	<strong>ملاحظة</strong>: وحدات الترميز tokens هي الأجزاء الأصغر من النص التي يمكن للنموذج معالجتها.
</p>

<h2>
	<span id="cke_bm_1569S" style="display: none;"> </span>مثال على قالب الدردشة باستخدام نموذج Mistral-7B-Instruct
</h2>

<p>
	لنستخدم الآن مثالًا أكثر تعقيدًا وهو النموذج <code>mistralai/Mistral-7B-Instruct-v0.1</code> للمحادثة ونوضح كيفية استخدام قالب دردشة مختلف يختلف عن النموذج البسيط السابق <code>BlenderBot</code>.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7593_8" style=""><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">AutoTokenizer</span><span class="pln">

</span><span class="com"># تحميل المحول</span><span class="pln">
tokenizer </span><span class="pun">=</span><span class="pln"> </span><span class="typ">AutoTokenizer</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="str">"mistralai/Mistral-7B-Instruct-v0.1"</span><span class="pun">)</span><span class="pln">

</span><span class="com"># إعداد المحادثة</span><span class="pln">
chat </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
    </span><span class="pun">{</span><span class="str">"role"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"user"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"content"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"مرحبًا، كيف حالك؟"</span><span class="pun">},</span><span class="pln">
    </span><span class="pun">{</span><span class="str">"role"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"assistant"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"content"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"أنا بخير. كيف يمكنني مساعدتك اليوم؟"</span><span class="pun">},</span><span class="pln">
    </span><span class="pun">{</span><span class="str">"role"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"user"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"content"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"أريد أن أشرح كيفية عمل قالب الدردشة!"</span><span class="pun">},</span><span class="pln">
</span><span class="pun">]</span><span class="pln">

</span><span class="com"># تطبيق قالب الدردشة بدون ترميز بشكل tokens</span><span class="pln">
formatted_chat </span><span class="pun">=</span><span class="pln"> tokenizer</span><span class="pun">.</span><span class="pln">apply_chat_template</span><span class="pun">(</span><span class="pln">chat</span><span class="pun">,</span><span class="pln"> tokenize</span><span class="pun">=</span><span class="kwd">False</span><span class="pun">)</span><span class="pln">

</span><span class="com"># طباعة النتيجة</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">formatted_chat</span><span class="pun">)</span></pre>

<p>
	نلاحظ هنا أن المرمِّز أضاف رموز التحكم <code>[INST]</code> و ‎<code>[/INST]</code>‎ هذه المرة للإشارة إلى بداية ونهاية رسائل المستخدم دون استخدامها مع رسائل المساعد، تساعد هذه الرموز النموذج على فهم الرسائل بشكل أفضل لأنها تتماشى مع الطريقة التي تدرب عليها، حيث دُرِّب النموذج الحالي باستخدام هذه الرموز على عكس النموذج <code>BlenderBot</code>.
</p>

<h2 id="">
	طريقة استخدام قوالب الدردشة
</h2>

<p>
	قوالب الدردشة سهلة الاستخدام، فلاستخدامها ليس علينا سوى إنشاء قائمة بالرسائل مع مفاتيح الدور <code>role</code> والمحتوى <code>content</code>، ثم تمريرها إلى التابع <a href="https://huggingface.co/docs/transformers/v4.44.0/en/internal/tokenization_utils#transformers.PreTrainedTokenizerBase.apply_chat_template" rel="external nofollow"><code>apply_chat_template()‎</code></a>، وسنحصل على خرج جاهز للاستخدام. يُفضَّل أيضًا استخدام <code>add_generation_prompt=True</code> لإضافة موجِّه توليد Generation Prompt عند استخدام قوالب الدردشة كدخل لتوليد النموذج.
</p>

<p>
	فيما يلي مثال لتجهيز الدخل للتابع <code>model.generate()‎</code> باستخدام النموذج المساعد <code>Zephyr</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7593_10" style=""><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">AutoModelForCausalLM</span><span class="pun">,</span><span class="pln"> </span><span class="typ">AutoTokenizer</span><span class="pln">

</span><span class="com"># تعيين نقطة التحقق</span><span class="pln">
checkpoint </span><span class="pun">=</span><span class="pln"> </span><span class="str">"HuggingFaceH4/zephyr-7b-beta"</span><span class="pln">
tokenizer </span><span class="pun">=</span><span class="pln"> </span><span class="typ">AutoTokenizer</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="pln">checkpoint</span><span class="pun">)</span><span class="pln">
model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">AutoModelForCausalLM</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="pln">checkpoint</span><span class="pun">)</span><span class="pln"> </span><span class="com"># قد ترغب باستخدام تنسيق bfloat16 أو الانتقال إلى وحدة معالجة الرسومات GPU هنا</span><span class="pln">

</span><span class="com"># إعداد الرسائل</span><span class="pln">
messages </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="str">"role"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"system"</span><span class="pun">,</span><span class="pln">
        </span><span class="str">"content"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"أنت روبوت دردشة ودود ترد دائمًا بأسلوب القراصنة"</span><span class="pun">,</span><span class="pln">
    </span><span class="pun">},</span><span class="pln">
    </span><span class="pun">{</span><span class="str">"role"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"user"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"content"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"كم عدد الطائرات المروحية التي يمكن للإنسان تناولها في وجبة واحدة؟"</span><span class="pun">},</span><span class="pln">
</span><span class="pun">]</span><span class="pln">

</span><span class="com"># تطبيق قالب الدردشة وتحويله لشكل ملائم للنموذج</span><span class="pln">
tokenized_chat </span><span class="pun">=</span><span class="pln"> tokenizer</span><span class="pun">.</span><span class="pln">apply_chat_template</span><span class="pun">(</span><span class="pln">messages</span><span class="pun">,</span><span class="pln"> tokenize</span><span class="pun">=</span><span class="kwd">True</span><span class="pun">,</span><span class="pln"> add_generation_prompt</span><span class="pun">=</span><span class="kwd">True</span><span class="pun">,</span><span class="pln"> return_tensors</span><span class="pun">=</span><span class="str">"pt"</span><span class="pun">)</span><span class="pln">

</span><span class="com"># طباعة النص المستخرج بعد فك الترميز</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">tokenizer</span><span class="pun">.</span><span class="pln">decode</span><span class="pun">(</span><span class="pln">tokenized_chat</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]))</span></pre>

<p>
	سيؤدي ذلك إلى الحصول على سلسلة نصية بتنسيق الدخل الذي يتوقعه النموذج <code>Zephyr</code> كما يلي:
</p>

<pre class="ipsCode" id="ips_uid_7425_18">&lt;|system|&gt; أنت روبوت دردشة ودود يرد دائمًا بأسلوب القراصنة &lt;/s&gt;
&lt;|user|&gt; كم عدد الطائرات المروحية التي يمكن للإنسان تناولها في جلسة واحدة؟ &lt;/s&gt;
&lt;|assistant|&gt;
</pre>

<p>
	نسّقنا الدخل ليناسب النموذج <code>Zephyr </code>وذلك على النحو التالي:
</p>

<ul>
	<li>
		<code>&lt;|system|&gt;</code>: يحدد أن المساعد هو روبوت دردشة ودود ويجب أن يجيب دائمًا بأسلوب القراصنة
	</li>
	<li>
		<code>&lt;|user|&gt;</code>: يحدد أن المستخدم يطرح السؤال
	</li>
	<li>
		<code>&lt;|assistant|&gt;</code>: يحدد الموضع الذي سيظهر فيه رد المساعد
	</li>
</ul>

<p>
	يمكننا الآن استخدام النموذج لتوليد استجابة لسؤال المستخدم كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7425_20" style=""><span class="pln">outputs </span><span class="pun">=</span><span class="pln"> model</span><span class="pun">.</span><span class="pln">generate</span><span class="pun">(</span><span class="pln">tokenized_chat</span><span class="pun">,</span><span class="pln"> max_new_tokens</span><span class="pun">=</span><span class="lit">128</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">tokenizer</span><span class="pun">.</span><span class="pln">decode</span><span class="pun">(</span><span class="pln">outputs</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]))</span></pre>

<p>
	وسنحصل على النتيجة التالية:
</p>

<pre class="ipsCode" id="ips_uid_7425_22">&lt;|system|&gt; أنت روبوت دردشة ودود يرد دائمًا بأسلوب القراصنة &lt;/s&gt;
&lt;|user|&gt; كم عدد الطائرات المروحية التي يمكن للإنسان تناولها في جلسة واحدة؟ &lt;/s&gt;
&lt;|assistant|&gt; 
يا رفيقي، يؤسفني أن أخبرك أن البشر لا يستطيعون تناول الطائرات المروحية. الطائرات المروحية ليست طعامًا، بل هي آلات طائرة. الطعام مخصص للأكل، مثل طبق غني من الخمر، أو وعاء شهي من الحساء، أو رغيف لذيذ من الخبز. أما الطائرات المروحية، فهي للنقل والحركة، وليس للأكل. لذلك، أقول لا شيء، يا أصدقائي. لا شيء على الإطلاق. 
</pre>

<h2 id="pipeline">
	استخدام خط أنابيب Pipeline آلي للدردشة
</h2>

<p>
	خطوط الأنابيب Pipelines هي طريقة تلقائية ومبسطة لاستخدام النماذج اللغوية للدردشة، فهي عبارة عن واجهات جاهزة توفرها مكتبة Transformers من Hugging Face لتسهيل استخدام النماذج المختلفة دون الحاجة إلى كتابة الكثير من الكود. تدعم خطوط أنابيب توليد نصوص مدخلات الدردشة، مما يسهّل علينا استخدام نماذج الدردشة. وقد اعتدنا سابقًا على استخدام الصنف <code>ConversationalPipeline</code> المخصَّص، ولكنه أُهمِل الآن ودُمِجت وظائفه مع الصنف <a href="https://huggingface.co/docs/transformers/v4.44.0/en/main_classes/pipelines#transformers.TextGenerationPipeline" rel="external nofollow"><code>TextGenerationPipeline</code></a>.
</p>

<p>
	لنستخدم مثال <code>Zephyr</code> مرة أخرى، ولكن باستخدام خط أنابيب هذه المرة كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7593_13" style=""><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> pipeline

</span><span class="com"># إنشاء أنبوب لتوليد النصوص باستخدام النموذج HuggingFaceH4/zephyr-7b-beta</span><span class="pln">
pipe </span><span class="pun">=</span><span class="pln"> pipeline</span><span class="pun">(</span><span class="str">"text-generation"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"HuggingFaceH4/zephyr-7b-beta"</span><span class="pun">)</span><span class="pln">

</span><span class="com"># تعريف الرسائل بين المستخدم والنظام</span><span class="pln">
messages </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="str">"role"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"system"</span><span class="pun">,</span><span class="pln">  </span><span class="com"># دور النظام: تحديد سلوك المساعد</span><span class="pln">
        </span><span class="str">"content"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"أنت روبوت دردشة ودود يرد دائمًا بأسلوب القراصنة"</span><span class="pun">,</span><span class="pln">  </span><span class="com"># محتوى النظام</span><span class="pln">
    </span><span class="pun">},</span><span class="pln">
    </span><span class="pun">{</span><span class="str">"role"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"user"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"content"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"كم عدد طائرات الهليكوبتر التي يمكن للإنسان أن يأكلها في جلسة واحدة؟"</span><span class="pun">},</span><span class="pln">  </span><span class="com"># سؤال المستخدم</span><span class="pln">
</span><span class="pun">]</span><span class="pln">

</span><span class="com"># توليد النص بناءً على الرسائل</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">pipe</span><span class="pun">(</span><span class="pln">messages</span><span class="pun">,</span><span class="pln"> max_new_tokens</span><span class="pun">=</span><span class="lit">128</span><span class="pun">)[</span><span class="lit">0</span><span class="pun">][</span><span class="str">'generated_text'</span><span class="pun">][-</span><span class="lit">1</span><span class="pun">])</span><span class="pln">  </span><span class="com"># طباعة آخر حرف من رد المساعد</span></pre>

<p>
	وهذه هي استجابة النموذج:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7425_26" style=""><span class="pun">{</span><span class="str">'role'</span><span class="pun">:</span><span class="pln"> </span><span class="str">'assistant'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'content'</span><span class="pun">:</span><span class="pln"> </span><span class="str">"يا صديقي، أخشى أنني يجب أن أخبرك أن البشر لا يستطيعون أكل الطائرات الهليكوبتر. الطائرات الهليكوبتر ليست طعامًا، إنها آلات طيران. الطعام يجب أن يُؤكل، مثل طبق كبير من الخمر، أو وعاء شهي من الحساء، أو رغيف لذيذ من الخبز. ولكن الطائرات الهليكوبتر، هي للنقل والتحرك، وليست للأكل. لذلك، أقول لا شيء، يا أصدقائي. لا شيء على الإطلاق."</span><span class="pun">}</span></pre>

<p>
	سيتولى خط الأنابيب جميع تفاصيل الترميز واستدعاء دالة <code>apply_chat_template</code> نيابة عنا. كل ما علينا فعله هو تهيئة خط الأنابيب وتمرير قائمة الرسائل إليه بعد تزويد النموذج بقالب الدردشة.
</p>

<h2 id="generationprompts">
	ما هي موجّهات التوليد Generation Prompts
</h2>

<p>
	مُوجّهات التوليد Generation Prompts هي تعليمات أو إشارات تضاف إلى المحادثة أو المدخلات التي تقدمها إلى النموذج لتحفيز استجابة معينة. وفي سياق النماذج اللغوية مثل <a href="https://academy.hsoub.com/apps/web/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A8%D9%88%D8%AA-%D8%A7%D9%84%D9%85%D8%AD%D8%A7%D8%AF%D8%AB%D8%A9-%D8%A7%D9%84%D8%B0%D9%83%D9%8A-%D8%B4%D8%A7%D8%AA-%D8%AC%D9%8A-%D8%A8%D9%8A-%D8%AA%D9%8A-chatgpt-r863/" rel="">ChatGPT</a>، نستخدم هذه الموجّهات لتحديد كيفية بدء الاستجابة أو توجيه النموذج للاستجابة بطريقة معينة.
</p>

<p>
	فعندما نتفاعل مع نموذج دردشة مثل بوت الدردشة، علينا إرسال سلسلة من الرسائل تتضمن ما يقوله المستخدم مثل "مرحبًا" وما يرد به المساعد مثل "أهلاً، تشرفت بلقائك" وموجّه التوليد يوفر تعليمات إضافية تُضاف للمحادثة لتوجيه النموذج حول كيفية التفاعل. فيمكن لموجّهات التوليد أن تحدد مثلاً أين يجب أن يبدأ النموذج في الرد، أو كيف يجب أن يبدو الرد.
</p>

<p>
	نلاحظ أن التابع <code>apply_chat_template</code> يحتوي على الوسيط <code>add_generation_prompt</code>، حيث يخبر هذا الوسيط القالب Template بإضافة رموز tokens تشير إلى بداية استجابة البوت Bot، فمثلًا ليكن لدينا الدردشة التالية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7593_20" style=""><span class="pln">messages </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
    </span><span class="pun">{</span><span class="str">"role"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"user"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"content"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"مرحبًا"</span><span class="pun">},</span><span class="pln"> 
    </span><span class="pun">{</span><span class="str">"role"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"assistant"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"content"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"أهلًا تشرفت بلقائك"</span><span class="pun">},</span><span class="pln"> 
    </span><span class="pun">{</span><span class="str">"role"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"user"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"content"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"هل يمكنني طرح سؤال؟"</span><span class="pun">}</span><span class="pln">
</span><span class="pun">]</span></pre>

<p>
	وستكون النتيجة كما يلي بدون موجّه التوليد وباستخدام قالب <code> ChatML </code> الذي رأيناه في مثال نموذج <code>Zephyr</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7425_32" style=""><span class="pln">tokenizer</span><span class="pun">.</span><span class="pln">apply_chat_template</span><span class="pun">(</span><span class="pln">messages</span><span class="pun">,</span><span class="pln"> tokenize</span><span class="pun">=</span><span class="kwd">False</span><span class="pun">,</span><span class="pln"> add_generation_prompt</span><span class="pun">=</span><span class="kwd">False</span><span class="pun">)</span><span class="pln">
</span><span class="str">"""&lt;|im_start|&gt;user
مرحبًا!&lt;|im_end|&gt;
&lt;|im_start|&gt;assistant
تشرفت بلقائك!&lt;|im_end|&gt;
&lt;|im_start|&gt;user
هل يمكنني طرح سؤال؟&lt;|im_end|&gt;
"""</span></pre>

<p>
	وستكون النتيجة كما يلي عند استخدام موجّه التوليد:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7425_34" style=""><span class="pln">tokenizer</span><span class="pun">.</span><span class="pln">apply_chat_template</span><span class="pun">(</span><span class="pln">messages</span><span class="pun">,</span><span class="pln"> tokenize</span><span class="pun">=</span><span class="kwd">False</span><span class="pun">,</span><span class="pln"> add_generation_prompt</span><span class="pun">=</span><span class="kwd">True</span><span class="pun">)</span><span class="pln">
</span><span class="str">"""&lt;|im_start|&gt;user
مرحبًا!&lt;|im_end|&gt;
&lt;|im_start|&gt;assistant
تشرفت بلقائك!&lt;|im_end|&gt;
&lt;|im_start|&gt;user
هل يمكنني طرح سؤال؟&lt;|im_end|&gt;
&lt;|im_start|&gt;assistant
"""</span></pre>

<p>
	إذًا، عندما نستخدم نماذج الدردشة، سنحتاج إلى إخبار النموذج Model بما يجب عليه فعله بالضبط، خصوصًا فيما يتعلق بكيفية الرد على المستخدم. على سبيل المثال، لن يعرف النموذج تلقائيًا أين يبدأ في كتابة استجابة البوت المساعد، لذا نضيف رموز أو موجهات توليد خاصة في المكان الذي نريد أن تبدأ فيه استجابة البوت.
</p>

<p>
	فالموجه الذي نضيفه هنا مثل <code>&lt;|im_start|&gt;assistant</code>، سيخبر النموذج بأن هناك بداية لاستجابة البوت في هذه النقطة، وبدونه، قد يخطئ النموذج في فهم السياق ويبدأ في كتابة استجابة في مكان غير مناسب، مثل متابعة رسالة المستخدم.
</p>

<p>
	<strong>ملاحظة</strong>: لا تحتاج كل النماذج إلى هذه الموجهات، فبعض النماذج مثل <code> BlenderBot</code> و <code>LlaMA</code> لا تستخدم أي رموز خاصة، لأن هذه النماذج تعرف تلقائيًا أين تبدأ استجابة البوت. وبالتالي، لن نحتاج لإضافة موجّهات توليد في هذه الحالة.
</p>

<h2 id="-1">
	هل يمكن استخدام قوالب الدردشة في التدريب
</h2>

<p>
	يمكن استخدام قوالب الدردشة في التدريب، وهي طريقة جيدة للتأكّد من أن قالب الدردشة يطابق الرموز التي يراها النموذج أثناء التدريب، لذا يُوصَى بتطبيق قالب الدردشة كخطوة معالجة مسبقَة لمجموعة بياناتك، ويمكننا بعد ذلك ببساطة المتابعة مثل أي مهمة لتدريب نموذج لغوي آخر. يجب عند التدريب ضبط <code>add_generation_prompt=False</code> لأن الرموز المضافة لموجّه استجابة المساعد لن تكون مفيدة أثناء التدريب. ليكن لدينا المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7425_36" style=""><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">AutoTokenizer</span><span class="pln">
</span><span class="kwd">from</span><span class="pln"> datasets </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">Dataset</span><span class="pln">

tokenizer </span><span class="pun">=</span><span class="pln"> </span><span class="typ">AutoTokenizer</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="str">"HuggingFaceH4/zephyr-7b-beta"</span><span class="pun">)</span><span class="pln">

chat1 </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
    </span><span class="pun">{</span><span class="str">"role"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"user"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"content"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"أيّهما أكبر، القمر أم الشمس؟"</span><span class="pun">},</span><span class="pln">
    </span><span class="pun">{</span><span class="str">"role"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"assistant"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"content"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"الشمس."</span><span class="pun">}</span><span class="pln">
</span><span class="pun">]</span><span class="pln">
chat2 </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
    </span><span class="pun">{</span><span class="str">"role"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"user"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"content"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"أيّهما أكبر، الفيروس أم البكتيريا؟"</span><span class="pun">},</span><span class="pln">
    </span><span class="pun">{</span><span class="str">"role"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"assistant"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"content"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"البكتيريا."</span><span class="pun">}</span><span class="pln">
</span><span class="pun">]</span><span class="pln">

dataset </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Dataset</span><span class="pun">.</span><span class="pln">from_dict</span><span class="pun">({</span><span class="str">"chat"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="pln">chat1</span><span class="pun">,</span><span class="pln"> chat2</span><span class="pun">]})</span><span class="pln">
dataset </span><span class="pun">=</span><span class="pln"> dataset</span><span class="pun">.</span><span class="pln">map</span><span class="pun">(</span><span class="kwd">lambda</span><span class="pln"> x</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="str">"formatted_chat"</span><span class="pun">:</span><span class="pln"> tokenizer</span><span class="pun">.</span><span class="pln">apply_chat_template</span><span class="pun">(</span><span class="pln">x</span><span class="pun">[</span><span class="str">"chat"</span><span class="pun">],</span><span class="pln"> tokenize</span><span class="pun">=</span><span class="kwd">False</span><span class="pun">,</span><span class="pln"> add_generation_prompt</span><span class="pun">=</span><span class="kwd">False</span><span class="pun">)})</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">dataset</span><span class="pun">[</span><span class="str">'formatted_chat'</span><span class="pun">][</span><span class="lit">0</span><span class="pun">])</span></pre>

<p>
	وسنحصل على النتيجة التالية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7425_38" style=""><span class="pun">&lt;|</span><span class="pln">user</span><span class="pun">|&gt;</span><span class="pln">
</span><span class="pun">أيّهما</span><span class="pln"> </span><span class="pun">أكبر،</span><span class="pln"> </span><span class="pun">القمر</span><span class="pln"> </span><span class="pun">أم</span><span class="pln"> </span><span class="pun">الشمس؟&lt;/</span><span class="pln">s</span><span class="pun">&gt;</span><span class="pln">
</span><span class="pun">&lt;|</span><span class="pln">assistant</span><span class="pun">|&gt;</span><span class="pln">
</span><span class="pun">الشمس.&lt;/</span><span class="pln">s</span><span class="pun">&gt;</span></pre>

<p>
	 بعد تطبيق قالب الدردشة وتنسيق المحادثات، نتابع التدريب على النموذج بنفس الطريقة التي نتبعها في تدريب نماذج اللغة الأخرى باستخدام العمود <code>formatted_chat</code> الذي يحتوي على المحادثات بتنسيق يتوافق مع طريقة التدريب التي يتوقعها النموذج.
</p>

<p>
	<strong>ملاحظة</strong>: إذا نسّقنا النص باستخدام <code>apply_chat_template(tokenize=False)‎</code> ثم رمّزناه في خطوة منفصلة، فيجب أن نضبط الوسيط <code>add_special_tokens=False</code>، وإذا استخدمنا <code>apply_chat_template(tokenize=True)‎</code>، فلا داعي للقلق بشأن ذلك.<br>
	تضيف بعض المرمِّزات رموزًا خاصة مثل <code>&lt;bos&gt;</code> و <code>&lt;eos&gt;</code> إلى النص الذي نرمّزه افتراضيًا، لذا يجب أن تتضمن قوالب الدردشة دائمًا جميع الرموز الخاصة التي نحتاجها، وبالتالي يمكن أن تؤدي إضافة رموز خاصة إضافية باستخدام <code>add_special_tokens=True</code> الافتراضي إلى ظهور رموز خاصة غير صحيحة أو مكرَّرة، مما سيضر بأداء النموذج.
</p>

<h2 id="-2">
	متقدم: دخل إضافي لقوالب الدردشة
</h2>

<p>
	الوسيط الوحيد الذي يتطلبه <code>apply_chat_template</code> هو <code>messages</code>، ولكن يمكننا تمرير أيّ وسيط كلمات مفتاحية Keyword Argument إلى <code>apply_chat_template</code> وسيكون متاحًا ضمن القالب، مما يمنحنا قدرة على استخدام قوالب الدردشة للعديد من الأغراض. لا توجد قيود على أسماء أو تنسيق هذه الوسطاء، حيث يمكن تمرير السلاسل النصية أو القوائم أو القواميس أو أيّ شيء آخر تريده.
</p>

<p>
	توجد بعض حالات الاستخدام الشائعة لهذه الوسطاء الإضافية مثل تمرير أدوات لاستدعاء الدوال أو مستندات للتوليد باستخدام الاسترجاع المعزَّز Retrieval-augmented، حيث توجد بعض التوصيات حول ما يجب أن تكون عليه أسماء وتنسيقات هذه الوسطاء والتي سنوضحها لاحقًا، لذا نشجّع مطوري النماذج على جعل قوالب الدردشة الخاصة بهم متوافقة مع هذا التنسيق لتسهيل نقل الشيفرة البرمجية لاستدعاء الأدوات فيما بين النماذج.
</p>

<h2 id="-3">
	متقدم: استخدام الأدوات واستدعاء الدوال
</h2>

<p>
	يمكن للنماذج اللغوية الكبيرة LLMs الخاصة باستخدام الأدوات اختيار استدعاء الدوال كأدوات خارجية قبل توليد إجابة، حيث يمكن ببساطة تمرير قائمة من الدوال إلى الوسيط <code>tools</code> عند تمرير الأدوات إلى نموذج استخدام الأدوات Tool-use كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7425_42" style=""><span class="kwd">import</span><span class="pln"> datetime

</span><span class="kwd">def</span><span class="pln"> current_time</span><span class="pun">():</span><span class="pln">
    </span><span class="str">"""احصل على الوقت المحلي الحالي كسلسلة نصية."""</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> str</span><span class="pun">(</span><span class="pln">datetime</span><span class="pun">.</span><span class="pln">now</span><span class="pun">())</span><span class="pln">

</span><span class="kwd">def</span><span class="pln"> multiply</span><span class="pun">(</span><span class="pln">a</span><span class="pun">:</span><span class="pln"> float</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">:</span><span class="pln"> float</span><span class="pun">):</span><span class="pln">
    </span><span class="str">"""
    دالة ضرب رقمين

    المعاملات:
        a: الرقم الأول 
        b: الرقم الثاني 
    """</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> a </span><span class="pun">*</span><span class="pln"> b

tools </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">current_time</span><span class="pun">,</span><span class="pln"> multiply</span><span class="pun">]</span><span class="pln">

model_input </span><span class="pun">=</span><span class="pln"> tokenizer</span><span class="pun">.</span><span class="pln">apply_chat_template</span><span class="pun">(</span><span class="pln">
    messages</span><span class="pun">,</span><span class="pln">
    tools</span><span class="pun">=</span><span class="pln">tools
</span><span class="pun">)</span></pre>

<p>
	علينا الدوال بالتنسيق السابق لكي تعمل بالطريقة الصحيحة، وبالتالي يمكن تحليلها تحليلًا صحيحًا بوصفها أدوات، لذا يجب علينا اتباع القواعد التالية:
</p>

<ul>
	<li>
		يجب أن يكون للدالة اسم يصف عملها
	</li>
	<li>
		يجب أن يكون لكل وسيط تلميح لنوعه Type Hint
	</li>
	<li>
		يجب أن يكون للدالة سلسلة نصية توثيقية Docstring وفق نمط جوجل Google المعياري أو وصف أولي للدالة، وتتبعه كتلة <code>Args:‎</code> التي تصف الوسطاء، إلّا في حالة عدم احتواء الدالة على وسطاء
	</li>
	<li>
		لا تضمّن الأنواع في كتلة <code>Args:‎</code>  فمثلًا نكتب <code>a:الرقم الأول </code>وليس <code>a(int):الرقم الأول</code>  حيث يتوجب علينا وضع تلميحات الأنواع في ترويسة الدالة بدلًا من ذلك
	</li>
	<li>
		يمكن أن يكون للدالة نوع للقيمة المعادة وكتلة <code>Returns:‎</code> في السلسلة النصية التوثيقية، ولكنها اختيارية لأن معظم نماذج استخدام الأدوات تتجاهلها
	</li>
</ul>

<h3 id="-4">
	تمرير نتائج الأدوات إلى النموذج
</h3>

<p>
	تكفي الشيفرة البرمجية التجريبية السابقة لسرد الأدوات المتاحة لنموذجنا، ولكن إذا أردنا استخدام أداة فعليًا، فيجب أن:
</p>

<ol>
	<li>
		نحلّل خرج النموذج للحصول على اسم أو أسماء الأدوات ووسطائها
	</li>
	<li>
		نضيف استدعاء أو استدعاءات أداة النموذج إلى المحادثة
	</li>
	<li>
		نستدعي الدالة أو الدوال المقابلة مع تلك الوسطاء
	</li>
	<li>
		نضيف النتيجة أو النتائج إلى المحادثة
	</li>
</ol>

<h3 id="-5">
	مثال كامل لاستخدام أداة
</h3>

<p>
	سنستخدم في هذا المثال نموذج <code>Hermes-2-Pro</code> بحجم 8B لأنه أحد أعلى نماذج استخدام الأدوات أداءً في فئته الحجمية حاليًا. إذا كان لدينا ذاكرة كافية، فيمكن التفكير في استخدام نموذج أكبر بدلًا من ذلك مثل النموذجين <a href="https://huggingface.co/CohereForAI/c4ai-command-r-v01" rel="external nofollow">Command-R</a> أو <a href="https://huggingface.co/mistralai/Mixtral-8x22B-Instruct-v0.1" rel="external nofollow">Mixtral-8x22B</a>، ويدعم كلاهما استخدام الأدوات ويقدّمان أداءً أقوى.
</p>

<p>
	لنحمّل أولًا النموذج والمرمِّز كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7425_44" style=""><span class="kwd">import</span><span class="pln"> torch
</span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">AutoModelForCausalLM</span><span class="pun">,</span><span class="pln"> </span><span class="typ">AutoTokenizer</span><span class="pln">

checkpoint </span><span class="pun">=</span><span class="pln"> </span><span class="str">"NousResearch/Hermes-2-Pro-Llama-3-8B"</span><span class="pln">

</span><span class="com"># تحميل المرمِّز Tokenizer باستخدام نقطة التحقق checkpoint وتحديد النسخة المناسبة</span><span class="pln">
tokenizer </span><span class="pun">=</span><span class="pln"> </span><span class="typ">AutoTokenizer</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="pln">checkpoint</span><span class="pun">,</span><span class="pln"> revision</span><span class="pun">=</span><span class="str">"pr/13"</span><span class="pun">)</span><span class="pln">

</span><span class="com"># تحميل النموذج Model باستخدام نقطة التحقق checkpoint، مع تحديد نوع البيانات bfloat16 وتوزيع النموذج على الأجهزة device_map</span><span class="pln">
model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">AutoModelForCausalLM</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="pln">checkpoint</span><span class="pun">,</span><span class="pln"> torch_dtype</span><span class="pun">=</span><span class="pln">torch</span><span class="pun">.</span><span class="pln">bfloat16</span><span class="pun">,</span><span class="pln"> device_map</span><span class="pun">=</span><span class="str">"auto"</span><span class="pun">)</span></pre>

<p>
	ثم نعرّف قائمة الأدوات كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7425_46" style=""><span class="kwd">def</span><span class="pln"> get_current_temperature</span><span class="pun">(</span><span class="pln">location</span><span class="pun">:</span><span class="pln"> str</span><span class="pun">,</span><span class="pln"> unit</span><span class="pun">:</span><span class="pln"> str</span><span class="pun">)</span><span class="pln"> </span><span class="pun">-&gt;</span><span class="pln"> float</span><span class="pun">:</span><span class="pln">
    </span><span class="str">"""
    الحصول على درجة الحرارة الحالية في موقع معين.

    Args:
        location: الموقع الذي سيتم الحصول على درجة حرارته، بصيغة "المدينة، البلد".
        unit: الوحدة التي سيتم إرجاع درجة الحرارة بها. (الخيارات: ["مئوية"، "فهرنهايت"]).
    Returns:
        درجة الحرارة الحالية في الموقع المحدد بوحدات القياس المحددة، كعدد عشري (float).
    """</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">22.</span><span class="pln">  </span><span class="com"># يُحتمل أن تقوم الدالة الحقيقية بالحصول على درجة الحرارة الفعلية</span><span class="pln">

</span><span class="kwd">def</span><span class="pln"> get_current_wind_speed</span><span class="pun">(</span><span class="pln">location</span><span class="pun">:</span><span class="pln"> str</span><span class="pun">)</span><span class="pln"> </span><span class="pun">-&gt;</span><span class="pln"> float</span><span class="pun">:</span><span class="pln">
    </span><span class="str">"""
    الحصول على سرعة الرياح الحالية بالكيلومتر في الساعة (km/h) في موقع معين.

    Args:
        location: الموقع الذي سيتم الحصول على سرعة الرياح فيه، بصيغة "المدينة، البلد".
    Returns:
        سرعة الرياح الحالية في الموقع المحدد بالكيلومتر في الساعة (km/h)، كعدد عشري (float).
    """</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">6.</span><span class="pln">  </span><span class="com"># يُحتمل أن تقوم الدالة الحقيقية بالحصول على سرعة الرياح الفعلية</span><span class="pln">

tools </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">get_current_temperature</span><span class="pun">,</span><span class="pln"> get_current_wind_speed</span><span class="pun">]</span></pre>

<p>
	لنُعِدّ الآن محادثة البوت كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7425_48" style=""><span class="pln">messages </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
  </span><span class="pun">{</span><span class="str">"role"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"system"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"content"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"أنت بوت يجيب على استفسارات الطقس. يجب أن ترد بوحدة القياس المستخدمة في الموقع الذي تم الاستفسار عنه."</span><span class="pun">},</span><span class="pln">
  </span><span class="pun">{</span><span class="str">"role"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"user"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"content"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"مرحبًا، ما هي درجة الحرارة في باريس الآن؟"</span><span class="pun">}</span><span class="pln">
</span><span class="pun">]</span></pre>

<p>
	ونطبّق قالب الدردشة ونولّد استجابةً كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7425_50" style=""><span class="pln">inputs </span><span class="pun">=</span><span class="pln"> tokenizer</span><span class="pun">.</span><span class="pln">apply_chat_template</span><span class="pun">(</span><span class="pln">messages</span><span class="pun">,</span><span class="pln"> chat_template</span><span class="pun">=</span><span class="str">"tool_use"</span><span class="pun">,</span><span class="pln"> tools</span><span class="pun">=</span><span class="pln">tools</span><span class="pun">,</span><span class="pln"> add_generation_prompt</span><span class="pun">=</span><span class="kwd">True</span><span class="pun">,</span><span class="pln"> return_dict</span><span class="pun">=</span><span class="kwd">True</span><span class="pun">,</span><span class="pln"> return_tensors</span><span class="pun">=</span><span class="str">"pt"</span><span class="pun">)</span><span class="pln">
inputs </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">k</span><span class="pun">:</span><span class="pln"> v</span><span class="pun">.</span><span class="pln">to</span><span class="pun">(</span><span class="pln">model</span><span class="pun">.</span><span class="pln">device</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">for</span><span class="pln"> k</span><span class="pun">,</span><span class="pln"> v </span><span class="kwd">in</span><span class="pln"> inputs</span><span class="pun">.</span><span class="pln">items</span><span class="pun">()}</span><span class="pln">
out </span><span class="pun">=</span><span class="pln"> model</span><span class="pun">.</span><span class="pln">generate</span><span class="pun">(**</span><span class="pln">inputs</span><span class="pun">,</span><span class="pln"> max_new_tokens</span><span class="pun">=</span><span class="lit">128</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">tokenizer</span><span class="pun">.</span><span class="pln">decode</span><span class="pun">(</span><span class="pln">out</span><span class="pun">[</span><span class="lit">0</span><span class="pun">][</span><span class="pln">len</span><span class="pun">(</span><span class="pln">inputs</span><span class="pun">[</span><span class="str">"input_ids"</span><span class="pun">][</span><span class="lit">0</span><span class="pun">]):]))</span></pre>

<p>
	سنحصل على النتيجة التالية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7425_52" style=""><span class="pun">&lt;</span><span class="pln">tool_call</span><span class="pun">&gt;</span><span class="pln">
</span><span class="pun">{</span><span class="str">"arguments"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="str">"location"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"باريس، فرنسا"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"unit"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"مئوية"</span><span class="pun">},</span><span class="pln"> </span><span class="str">"name"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"get_current_temperature"</span><span class="pun">}</span><span class="pln">
</span><span class="pun">&lt;/</span><span class="pln">tool_call</span><span class="pun">&gt;&lt;|</span><span class="pln">im_end</span><span class="pun">|&gt;</span></pre>

<p>
	استدعى النموذج الدالة مع وسطاء صالحة وبالتنسيق الذي تطلبه السلسلة النصية التوثيقية للدالة، واستدل النموذج أننا نشير إلى باريس في فرنسا، وتذكّرَ أنه يجب بالتأكيد عرض درجة الحرارة في فرنسا بالدرجة المئوية باعتبارها موطن نظام الوحدات الدولي.
</p>

<p>
	سنضيف الآن استدعاء الأداة الخاصة بالنموذج إلى المحادثة، حيث نولّد معرّف <code>tool_call_id</code> عشوائي. لا تستخدم جميع النماذج هذه المعرّفات، ولكنها تسمح للنماذج بإنشاء استدعاءات أدوات متعددة في وقتٍ واحد وتتبع الاستجابة المقابلة لكلّ استدعاء. يمكنك توليد هذه المعرّفات بأيّ طريقة تريدها، ولكن يجب أن تكون فريدة في كل دردشة.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7425_54" style=""><span class="pln">tool_call_id </span><span class="pun">=</span><span class="pln"> </span><span class="str">"vAHdf3"</span><span class="pln">  </span><span class="com"># معرّف عشوائي، ويجب أن يكون فريدًا لكل استدعاء أداة</span><span class="pln">
tool_call </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="str">"name"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"get_current_temperature"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"arguments"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="str">"location"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"باريس، فرنسا"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"unit"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"مئوية"</span><span class="pun">}}</span><span class="pln">
messages</span><span class="pun">.</span><span class="pln">append</span><span class="pun">({</span><span class="str">"role"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"assistant"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"tool_calls"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[{</span><span class="str">"id"</span><span class="pun">:</span><span class="pln"> tool_call_id</span><span class="pun">,</span><span class="pln"> </span><span class="str">"type"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"function"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"function"</span><span class="pun">:</span><span class="pln"> tool_call</span><span class="pun">}]})</span></pre>

<p>
	أضفنا استدعاء الأداة إلى المحادثة، ويمكننا الآن استدعاء الدالة وإضافة النتيجة إلى المحادثة، حيث نستخدم في هذا المثال دالة وهمية تعيد القيمة <code>22.0</code> دائمًا، لذا يمكننا إضافة هذه النتيجة مباشرةً. يجب أن يتطابق المعرّف <code>tool_call_id</code> مع المعرّف المستخدَم في استدعاء الأداة السابق.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7425_56" style=""><span class="pln">messages</span><span class="pun">.</span><span class="pln">append</span><span class="pun">({</span><span class="str">"role"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"tool"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"tool_call_id"</span><span class="pun">:</span><span class="pln"> tool_call_id</span><span class="pun">,</span><span class="pln"> </span><span class="str">"name"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"get_current_temperature"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"content"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"22.0"</span><span class="pun">})</span></pre>

<p>
	أخيرًا، سندع المساعد يقرأ خرج الدالة ويتابع الدردشة مع المستخدم كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7425_104" style=""><span class="pln">inputs </span><span class="pun">=</span><span class="pln"> tokenizer</span><span class="pun">.</span><span class="pln">apply_chat_template</span><span class="pun">(</span><span class="pln">messages</span><span class="pun">,</span><span class="pln"> chat_template</span><span class="pun">=</span><span class="str">"tool_use"</span><span class="pun">,</span><span class="pln"> tools</span><span class="pun">=</span><span class="pln">tools</span><span class="pun">,</span><span class="pln"> add_generation_prompt</span><span class="pun">=</span><span class="kwd">True</span><span class="pun">,</span><span class="pln"> return_dict</span><span class="pun">=</span><span class="kwd">True</span><span class="pun">,</span><span class="pln"> return_tensors</span><span class="pun">=</span><span class="str">"pt"</span><span class="pun">)</span><span class="pln">
inputs </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">k</span><span class="pun">:</span><span class="pln"> v</span><span class="pun">.</span><span class="pln">to</span><span class="pun">(</span><span class="pln">model</span><span class="pun">.</span><span class="pln">device</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">for</span><span class="pln"> k</span><span class="pun">,</span><span class="pln"> v </span><span class="kwd">in</span><span class="pln"> inputs</span><span class="pun">.</span><span class="pln">items</span><span class="pun">()}</span><span class="pln">
out </span><span class="pun">=</span><span class="pln"> model</span><span class="pun">.</span><span class="pln">generate</span><span class="pun">(**</span><span class="pln">inputs</span><span class="pun">,</span><span class="pln"> max_new_tokens</span><span class="pun">=</span><span class="lit">128</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">tokenizer</span><span class="pun">.</span><span class="pln">decode</span><span class="pun">(</span><span class="pln">out</span><span class="pun">[</span><span class="lit">0</span><span class="pun">][</span><span class="pln">len</span><span class="pun">(</span><span class="pln">inputs</span><span class="pun">[</span><span class="str">"input_ids"</span><span class="pun">][</span><span class="lit">0</span><span class="pun">]):]))</span></pre>

<p>
	وسنحصل على النتيجة التالية:
</p>

<pre class="ipsCode" id="ips_uid_7425_102">درجة الحرارة الحالية في باريس، فرنسا هي 22.0 درجة مئوية</pre>

<p>
	وضّحنا مثالًا بسيطًا باستخدام أدوات وهمية واستدعاء واحد، ولكن ستعمل التقنية نفسها مع أدوات حقيقية متعددة ومحادثات أطول، ويمكن أن تكون هذه الطريقة فعّالة لتوسيع قدرات وكلاء المحادثة باستخدام معلومات في الوقت الحقيقي أو أدوات حسابية مثل الآلات الحاسبة أو الوصول إلى قواعد بيانات كبيرة.
</p>

<p>
	<strong>ملاحظة</strong>: لا تستخدم كل النماذج جميع ميزات استدعاء الأدوات السابقة، إذ تستخدم بعض النماذج معرّفات استدعاء الأدوات، ويستخدم البعض الآخر ببساطة اسم الدالة ويطابق استدعاءات الأدوات مع النتائج باستخدام الترتيب، وتوجد عدة نماذج لا تستخدم أي من هاتين الطريقتين وتنشئ استدعاء أداة واحد فقط في كل مرة لتجنب الالتباس. إذا أردنا أن تكون شيفرتنا البرمجية متوافقة مع أكبر عدد ممكن من النماذج، فيُوصَى ببناء استدعاءات الأدوات الخاصة بنا كما وضّحنا سابقًا، وإعادة نتائج الأدوات بالترتيب الذي أنشأه النموذج، ويجب أن نتعامل قوالب الدردشة في كل نموذج مع المهام المتبقية.
</p>

<h3 id="toolschemas">
	فهم مخططات الأدوات Tool Schemas
</h3>

<p>
	تُحوَّل كل دالة تمرّرها إلى الوسيط <code>tools</code> الخاص بالدالة <code>apply_chat_template</code> إلى مخطط JSON، ثم تُمرَّر هذه المخططات إلى قالب دردشة النموذج، حيث لا ترى نماذج استخدام الأدوات دوالك مباشرةً، ولا ترى الشيفرة البرمجية الفعلية التي بداخلها أبدًا، فما يهمها هو تعريفات الدوال والوسطاء التي تحتاج إلى تمريرها إليها، إذ تهتم بما تفعله الأدوات وكيفية استخدامها، وليس بكيفية عملها. الأمر متروك لك لقراءة خرج هذه الدوال واكتشاف طلبها لاستخدام أداة وتمرير وسطائها إلى دالة الأداة وإعادة الاستجابة في الدردشة.
</p>

<p>
	يجب أن يكون توليد مخططات JSON لتمريرها إلى القالب تلقائيًا وغير مرئي بما أن دوالك تتبع المواصفات السابقة، ولكن إذا واجهنا مشكلات، أو أردنا مزيدًا من التحكم في التحويل، فيمكن التعامل مع التحويل يدويًا. فيما يلي مثال على تحويل مخطط يدويًا:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7425_98" style=""><span class="kwd">from</span><span class="pln"> transformers</span><span class="pun">.</span><span class="pln">utils </span><span class="kwd">import</span><span class="pln"> get_json_schema

</span><span class="kwd">def</span><span class="pln"> multiply</span><span class="pun">(</span><span class="pln">a</span><span class="pun">:</span><span class="pln"> float</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">:</span><span class="pln"> float</span><span class="pun">):</span><span class="pln">
    </span><span class="str">"""
    دالة تقوم بضرب عددين

    الوسائط:
        a: العدد الأول الذي سيتم ضربه
        b: العدد الثاني الذي سيتم ضربه
    """</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> a </span><span class="pun">*</span><span class="pln"> b

schema </span><span class="pun">=</span><span class="pln"> get_json_schema</span><span class="pun">(</span><span class="pln">multiply</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">schema</span><span class="pun">)</span></pre>

<p>
	وسنحصل على النتيجة التالية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7425_95" style=""><span class="pun">{</span><span class="pln">
  </span><span class="str">"type"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"function"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"function"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="str">"name"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"multiply"</span><span class="pun">,</span><span class="pln">
    </span><span class="str">"description"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"دالة تقوم بضرب عددين"</span><span class="pun">,</span><span class="pln">
    </span><span class="str">"parameters"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      </span><span class="str">"type"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"object"</span><span class="pun">,</span><span class="pln">
      </span><span class="str">"properties"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="str">"a"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
          </span><span class="str">"type"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"number"</span><span class="pun">,</span><span class="pln">
          </span><span class="str">"description"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"العدد الأول الذي سيتم ضربه"</span><span class="pln">
        </span><span class="pun">},</span><span class="pln">
        </span><span class="str">"b"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
          </span><span class="str">"type"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"number"</span><span class="pun">,</span><span class="pln">
          </span><span class="str">"description"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"العدد الثاني الذي سيتم ضربه"</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
      </span><span class="pun">},</span><span class="pln">
      </span><span class="str">"required"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="str">"a"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"b"</span><span class="pun">]</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يمكن أيضًا تعديل هذه المخططات أو كتابتها من الصفر بنفسنا بدون استخدام <code>get_json_schema</code> على الإطلاق، حيث يمكن تمرير مخططات JSON مباشرةً إلى الوسيط <code>tools</code> في <code>apply_chat_template</code>، مما يمنحنا قدرًا كبيرًا من القوة لتعريف مخططات دقيقة لدوال أكثر تعقيدًا، ولكن يجب توخي الحذر، فكلما كانت المخططات أكثر تعقيدًا، كلما زاد احتمال ارتباك النموذج عند التعامل معها. يُوصى باستخدام توقيعات دوال بسيطة simple function signatures إن أمكن ذلك مع إبقاء الحد الأدنى من الوسطاء وخاصة الوسطاء المعقدة والمتداخلة.
</p>

<p>
	فيما يلي مثال لتعريف المخططات يدويًا وتمريرها إلى <code>apply_chat_template</code> مباشرة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7425_93" style=""><span class="com"># دالة بسيطة لا تأخذ أي وسائط</span><span class="pln">
current_time </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="str">"type"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"function"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"function"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="str">"name"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"current_time"</span><span class="pun">,</span><span class="pln">
    </span><span class="str">"description"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"الحصول على الوقت المحلي الحالي كسلسلة نصية."</span><span class="pun">,</span><span class="pln">
    </span><span class="str">"parameters"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      </span><span class="str">'type'</span><span class="pun">:</span><span class="pln"> </span><span class="str">'object'</span><span class="pun">,</span><span class="pln">
      </span><span class="str">'properties'</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{}</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com"># دالة أكثر اكتمالًا تأخذ وسيطين عدديين</span><span class="pln">
multiply </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="str">'type'</span><span class="pun">:</span><span class="pln"> </span><span class="str">'function'</span><span class="pun">,</span><span class="pln">
  </span><span class="str">'function'</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="str">'name'</span><span class="pun">:</span><span class="pln"> </span><span class="str">'multiply'</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'description'</span><span class="pun">:</span><span class="pln"> </span><span class="str">'دالة لضرب عددين'</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'parameters'</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      </span><span class="str">'type'</span><span class="pun">:</span><span class="pln"> </span><span class="str">'object'</span><span class="pun">,</span><span class="pln">
      </span><span class="str">'properties'</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="str">'a'</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
          </span><span class="str">'type'</span><span class="pun">:</span><span class="pln"> </span><span class="str">'number'</span><span class="pun">,</span><span class="pln">
          </span><span class="str">'description'</span><span class="pun">:</span><span class="pln"> </span><span class="str">'العدد الأول الذي سيتم ضربه'</span><span class="pln">
        </span><span class="pun">},</span><span class="pln">
        </span><span class="str">'b'</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
          </span><span class="str">'type'</span><span class="pun">:</span><span class="pln"> </span><span class="str">'number'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'description'</span><span class="pun">:</span><span class="pln"> </span><span class="str">'العدد الثاني الذي سيتم ضربه'</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
      </span><span class="pun">},</span><span class="pln">
      </span><span class="str">'required'</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="str">'a'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'b'</span><span class="pun">]</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

model_input </span><span class="pun">=</span><span class="pln"> tokenizer</span><span class="pun">.</span><span class="pln">apply_chat_template</span><span class="pun">(</span><span class="pln">
    messages</span><span class="pun">,</span><span class="pln">
    tools</span><span class="pun">=[</span><span class="pln">current_time</span><span class="pun">,</span><span class="pln"> multiply</span><span class="pun">]</span><span class="pln">
</span><span class="pun">)</span></pre>

<h2 id="retrievalaugmentedgeneration">
	متقدم: التوليد المعزز بالاسترجاع Retrieval-augmented Generation
</h2>

<p>
	يمكن للتوليد المعزز بالاسترجاع Retrieval-augmented Generation -أو RAG اختصارًا- الخاص بالنماذج اللغوية الكبيرة LLM البحث في مجموعة من المستندات للحصول على معلومات قبل الرد على استعلام، مما يسمح للنماذج بتوسيع قاعدة المعرفة الخاصة بها بما يتجاوز حجم السياق المحدود. يجب أن يأخذ قالب نماذج RAG الوسيط <code>documents</code>، والذي يجب أن يمثّل قائمة من المستندات، حيث يكون كل مستند قاموسًا واحدًا مع مفتاحي العنوان <code>title</code> والمحتويات <code>contents</code>، وهما سلاسل نصية. لا توجد دوال مساعدة ضرورية لأن هذا التنسيق أبسط بكثير من مخططات JSON المُستخدَمة مع الأدوات.
</p>

<p>
	فيما يلي مثال لقالب RAG:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7425_91" style=""><span class="pln">document1 </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="str">"title"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"القمر: عدونا القديم"</span><span class="pun">,</span><span class="pln">
    </span><span class="str">"contents"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"لطالما حلم الإنسان بتدمير القمر. في هذه المقالة، سأناقش..."</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

document2 </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="str">"title"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"الشمس: صديقنا القديم"</span><span class="pun">,</span><span class="pln">
    </span><span class="str">"contents"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"على الرغم من قلة تقديرها في كثير من الأحيان، إلا أن الشمس تقدم العديد من الفوائد الملحوظة..."</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

model_input </span><span class="pun">=</span><span class="pln"> tokenizer</span><span class="pun">.</span><span class="pln">apply_chat_template</span><span class="pun">(</span><span class="pln">
    messages</span><span class="pun">,</span><span class="pln">
    documents</span><span class="pun">=[</span><span class="pln">document1</span><span class="pun">,</span><span class="pln"> document2</span><span class="pun">]</span><span class="pln">
</span><span class="pun">)</span></pre>

<h2 id="-6">
	متقدم: كيف تعمل قوالب الدردشة
</h2>

<p>
	يُخزَّن قالب الدردشة الخاص بالنموذج في السمة <code>tokenizer.chat_template</code>، ويُستخدَم القالب الافتراضي لصنف هذا النموذج عند عدم ضبط قالب دردشة. لنلقِ نظرة أولًا على قالب <code>BlenderBot</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7425_89" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">AutoTokenizer</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> tokenizer </span><span class="pun">=</span><span class="pln"> </span><span class="typ">AutoTokenizer</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="str">"facebook/blenderbot-400M-distill"</span><span class="pun">)</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> tokenizer</span><span class="pun">.</span><span class="pln">default_chat_template
</span><span class="str">"{% for message in messages %}{% if message['role'] == 'user' %}{{ ' ' }}{% endif %}{{ message['content'] }}{% if not loop.last %}{{ '  ' }}{% endif %}{% endfor %}{{ eos_token }}"</span></pre>

<p>
	قد يكون ذلك معقدًا بعض الشيء، لذا لننظّفه قليلًا لجعله مقروءًا أكثر، ونتأكّد في هذه العملية أيضًا من أن الأسطر الجديدة والمسافات البادئة التي نضيفها غير مُضمَّنة في خرج القالب كما سنوضّح في قسم إزالة المسافات البيضاء من السلاسل النصية Trimming Whitespace لاحقًا.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7425_87" style=""><span class="pln">{%- for message in messages %}
    {%- if message['role'] == 'user' %}
        {{- ' ' }}
    {%- endif %}
    {{- message['content'] }}
    {%- if not loop.last %}
        {{- '  ' }}
    {%- endif %}
{%- endfor %}
{{- eos_token }}</span></pre>

<p>
	يُعَد ذلك <a href="https://academy.hsoub.com/programming/python/flask/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D9%85%D8%AD%D8%B1%D9%83-%D8%A7%D9%84%D9%82%D9%88%D8%A7%D9%84%D8%A8-jinja-%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D9%84-%D9%88%D8%A7%D9%84%D9%85%D8%B1%D8%B4%D8%AD%D8%A7%D8%AA-r440/" rel="">محرك قوالب Jinja</a>، والتي هي لغة قوالب تسمح بكتابة شيفرة برمجية بسيطة تولّد نصًا، حيث تشبه شيفرتها البرمجية وصياغتها <a href="https://academy.hsoub.com/python/" rel="">لغة بايثون Python</a>، إذ سيبدو القالب السابق في لغة بايثون كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7425_85" style=""><span class="kwd">for</span><span class="pln"> idx</span><span class="pun">,</span><span class="pln"> message </span><span class="kwd">in</span><span class="pln"> enumerate</span><span class="pun">(</span><span class="pln">messages</span><span class="pun">):</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> message</span><span class="pun">[</span><span class="str">'role'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="str">'user'</span><span class="pun">:</span><span class="pln">
        </span><span class="kwd">print</span><span class="pun">(</span><span class="str">' '</span><span class="pun">)</span><span class="pln">
    </span><span class="kwd">print</span><span class="pun">(</span><span class="pln">message</span><span class="pun">[</span><span class="str">'content'</span><span class="pun">])</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="kwd">not</span><span class="pln"> idx </span><span class="pun">==</span><span class="pln"> len</span><span class="pun">(</span><span class="pln">messages</span><span class="pun">)</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pun">:</span><span class="pln">  </span><span class="com"># التحقق من الرسالة الأخيرة في المحادثة</span><span class="pln">
        </span><span class="kwd">print</span><span class="pun">(</span><span class="str">'  '</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">eos_token</span><span class="pun">)</span></pre>

<p>
	ينجز هذا القالب ثلاثة أشياء هي:
</p>

<ol>
	<li>
		إذا كانت الرسالة رسالة مستخدم، فسيضيف مسافة فارغة قبلها بالنسبة لكل رسالة، وإلا فلن يطبع شيئًا
	</li>
	<li>
		يضيف محتوى الرسالة
	</li>
	<li>
		إن لم تكن الرسالة هي الرسالة الأخيرة، فسيضيف مسافتَين بعدها، ويطبع رمز EOS بعد الرسالة الأخيرة
	</li>
</ol>

<p>
	هذا القالب بسيط جدًا، فهو لا يضيف رموز تحكم ولا يدعم رسائل النظام، ويُعَد طريقة شائعة لإعطاء النموذج توجيهات حول كيفية التصرّف في المحادثة اللاحقة. تمنحك لغة القوالب Jinja الكثير من المرونة لهذه الأشياء، لذا لنوضّح فيما يلي قالب Jinja الذي يمكنه تنسيق الدخل بطريقة مماثلة للطريقة التي ينسقّ قالب LLaMA بها هذا الدخل، حيث يتضمن قالب LLaMA الحقيقي معالجة رسائل النظام الافتراضية ورسائل النظام المختلفة قليلًا، ولكن لا نستخدم هذا القالب في شيفرتنا البرمجية الفعلية.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7425_83" style=""><span class="pun">{%-</span><span class="pln"> </span><span class="kwd">for</span><span class="pln"> message </span><span class="kwd">in</span><span class="pln"> messages </span><span class="pun">%}</span><span class="pln">
    </span><span class="pun">{%-</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> message</span><span class="pun">[</span><span class="str">'role'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="str">'user'</span><span class="pln"> </span><span class="pun">%}</span><span class="pln">
        </span><span class="pun">{{-</span><span class="pln"> bos_token </span><span class="pun">+</span><span class="pln"> </span><span class="str">'[INST] '</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> message</span><span class="pun">[</span><span class="str">'content'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">' [/INST]'</span><span class="pln"> </span><span class="pun">}}</span><span class="pln">
    </span><span class="pun">{%-</span><span class="pln"> </span><span class="kwd">elif</span><span class="pln"> message</span><span class="pun">[</span><span class="str">'role'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="str">'system'</span><span class="pln"> </span><span class="pun">%}</span><span class="pln">
        </span><span class="pun">{{-</span><span class="pln"> </span><span class="str">'&lt;&lt;SYS&gt;&gt;\\n'</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> message</span><span class="pun">[</span><span class="str">'content'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">'\\n&lt;&lt;/SYS&gt;&gt;\\n\\n'</span><span class="pln"> </span><span class="pun">}}</span><span class="pln">
    </span><span class="pun">{%-</span><span class="pln"> </span><span class="kwd">elif</span><span class="pln"> message</span><span class="pun">[</span><span class="str">'role'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="str">'assistant'</span><span class="pln"> </span><span class="pun">%}</span><span class="pln">
        </span><span class="pun">{{-</span><span class="pln"> </span><span class="str">' '</span><span class="pln">  </span><span class="pun">+</span><span class="pln"> message</span><span class="pun">[</span><span class="str">'content'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">' '</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> eos_token </span><span class="pun">}}</span><span class="pln">
    </span><span class="pun">{%-</span><span class="pln"> endif </span><span class="pun">%}</span><span class="pln">
</span><span class="pun">{%-</span><span class="pln"> endfor </span><span class="pun">%}</span></pre>

<p>
	يضيف هذا القالب رموزًا Tokens محددة بناءً على دور كل رسالة، والتي تمثّل مَن أرسلها، إذ يمكن أن يميّز النموذج بين رسائل المستخدم والمساعد والنظام بوضوح بسبب الرموز الموجودة ضمنها.
</p>

<h2 id="-7">
	متقدم: إضافة وتعديل قوالب الدردشة
</h2>

<p>
	سنوضّح فيما يلي كيفية إضافة وتعديل قوالب الدردشة.
</p>

<h3 id="chattemplates">
	كيف ننشئ قالب دردشة Chat Templates
</h3>

<p>
	إنشاء قالب دردشة أمر بسيط، حيث نكتب قالب Jinja ونضبط السمة <code>tokenizer.chat_template</code>، ولكن قد نجد أن من الأسهل البدء بقالب موجود مسبقًا من نموذج آخر وتعديله لتلبية احتياجاتنا، فمثلًا يمكن أخذ قالب LLaMA السابق وإضافة الرموز <code>"[ASST]"</code> و<code>"[‎/ASST]"</code> إلى رسائل المساعد كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7425_81" style=""><span class="pun">{%-</span><span class="pln"> </span><span class="kwd">for</span><span class="pln"> message </span><span class="kwd">in</span><span class="pln"> messages </span><span class="pun">%}</span><span class="pln">
    </span><span class="pun">{%-</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> message</span><span class="pun">[</span><span class="str">'role'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="str">'user'</span><span class="pln"> </span><span class="pun">%}</span><span class="pln">
        </span><span class="pun">{{-</span><span class="pln"> bos_token </span><span class="pun">+</span><span class="pln"> </span><span class="str">'[INST] '</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> message</span><span class="pun">[</span><span class="str">'content'</span><span class="pun">].</span><span class="pln">strip</span><span class="pun">()</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">' [/INST]'</span><span class="pln"> </span><span class="pun">}}</span><span class="pln">
    </span><span class="pun">{%-</span><span class="pln"> </span><span class="kwd">elif</span><span class="pln"> message</span><span class="pun">[</span><span class="str">'role'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="str">'system'</span><span class="pln"> </span><span class="pun">%}</span><span class="pln">
        </span><span class="pun">{{-</span><span class="pln"> </span><span class="str">'&lt;&lt;SYS&gt;&gt;\\n'</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> message</span><span class="pun">[</span><span class="str">'content'</span><span class="pun">].</span><span class="pln">strip</span><span class="pun">()</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">'\\n&lt;&lt;/SYS&gt;&gt;\\n\\n'</span><span class="pln"> </span><span class="pun">}}</span><span class="pln">
    </span><span class="pun">{%-</span><span class="pln"> </span><span class="kwd">elif</span><span class="pln"> message</span><span class="pun">[</span><span class="str">'role'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="str">'assistant'</span><span class="pln"> </span><span class="pun">%}</span><span class="pln">
        </span><span class="pun">{{-</span><span class="pln"> </span><span class="str">'[ASST] '</span><span class="pln">  </span><span class="pun">+</span><span class="pln"> message</span><span class="pun">[</span><span class="str">'content'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">' [/ASST]'</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> eos_token </span><span class="pun">}}</span><span class="pln">
    </span><span class="pun">{%-</span><span class="pln"> endif </span><span class="pun">%}</span><span class="pln">
</span><span class="pun">{%-</span><span class="pln"> endfor </span><span class="pun">%}</span></pre>

<p>
	وما علينا الآن سوى ضبط السمة <code>tokenizer.chat_template</code>، وسيستخدم التابع <code>apply_chat_template()‎</code> قالبنا الجديد في المرة التالية التي تستخدمه فيها. تُحفَظ هذه السمة في الملف <code>tokenizer_config.json</code>، لذا يمكننا استخدام التابع <a href="https://huggingface.co/docs/transformers/v4.44.0/en/main_classes/model#transformers.utils.PushToHubMixin.push_to_hub" rel="external nofollow"><code>push_to_hub()‎</code></a> لتحميل القالب الجديد إلى <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%85%D8%A7-%D9%87%D9%8A-%D9%85%D9%86%D8%B5%D8%A9-hugging-face-%D9%84%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-r2449/" rel="">مستودع FacHugging e Hub</a> والتأكد من أن الجميع يستخدمون القالب الصحيح لنموذجنا.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7425_79" style=""><span class="pln">template </span><span class="pun">=</span><span class="pln"> tokenizer</span><span class="pun">.</span><span class="pln">chat_template
template </span><span class="pun">=</span><span class="pln"> template</span><span class="pun">.</span><span class="pln">replace</span><span class="pun">(</span><span class="str">"SYS"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"SYSTEM"</span><span class="pun">)</span><span class="pln">  </span><span class="com"># تغيير رمز النظام</span><span class="pln">
tokenizer</span><span class="pun">.</span><span class="pln">chat_template </span><span class="pun">=</span><span class="pln"> template  </span><span class="com"># ضبط القالب الجديد</span><span class="pln">
tokenizer</span><span class="pun">.</span><span class="pln">push_to_hub</span><span class="pun">(</span><span class="str">"model_name"</span><span class="pun">)</span><span class="pln">  </span><span class="com"># رفع قالبك الجديد إلى مستودع‫ Hub</span></pre>

<p>
	يستدعي الصنف <a href="https://huggingface.co/docs/transformers/v4.44.0/en/main_classes/pipelines#transformers.TextGenerationPipeline" rel="external nofollow">TextGenerationPipeline</a> التابع <code>apply_chat_template()‎</code> الذي يستخدم قالب الدردشة الخاص بك، لذا سيصبح النموذج متوافقًا تلقائيًا مع هذا الصنف بعد ضبط قالب الدردشة الصحيح.
</p>

<p>
	<strong>ملاحظة</strong>: عند صقل Fine-tune نموذج دردشة باستخدام قالب الدردشة، يجب إضافة رموز تحكم جديدة إلى المرمِّز بوصفها رموزًا خاصة. هذه الرموز لا تُقسَم أبدًا، مما يعني أنها ستظل دائمًا تعامل كرموز فردية بدلاً من أن تُقسَّم إلى أجزاء أثناء عملية الترميز. بالإضافة إلى ذلك، يجب تعيين سمة أداة المرمِّز <code>eos_token</code> إلى الرمز الذي يمثل نهاية عمليات التوليد الخاصة بالبوت في قالبنا. هذا يضمن أن أدوات توليد النص تتعرف بشكل صحيح على اللحظة التي يجب فيها التوقف عن توليد النص.
</p>

<h3 id="-8">
	لماذا تحتوي بعض النماذج قوالب متعددة
</h3>

<p>
	تستخدم بعض النماذج قوالب مختلفة لحالات استخدام مختلفة، فمثلًا قد نستخدم قالبًا للدردشة العادية وقالبًا آخر لاستخدام الأداة أو التوليد المعزز بالاسترجاع، حيث تكون السمة <code>tokenizer.chat_template</code> قاموسًا في هذه الحالات. قد يؤدي ذلك إلى بعض الارتباك، لذا يُوصَى باستخدام قالب واحد لجميع حالات الاستخدام إن أمكننا ذلك. يمكننا استخدام تعليمات Jinja مثل <code>if tools is defined</code> وتعريفات ‎<code>{% macro %}</code>‎ لتغليف مسارات الشيفرة البرمجية المتعددة في قالب واحد بسهولة.
</p>

<p>
	إذا كان للمرمِّز قوالب متعددة، فستكون السمة <code>tokenizer.chat_template</code> قاموسًا <code>dict</code>، حيث يكون كل مفتاح هو اسم القالب. يمتلك التابع <code>apply_chat_template</code> معالجة خاصة لأسماء قوالب معينة، حيث يبحث عن قالب باسم <code>default</code> في معظم الحالات، ويعطي خطأ إن لم يتمكن من العثور عليه، ولكن إذا كان القالب <code>tool_use</code> موجودًا عندما يمرّر المستخدم الوسيط <code>tools</code>، فسيستخدمه بدلًا من ذلك. يمكن الوصول إلى القوالب ذات الأسماء الأخرى من خلال تمرير اسم القالب الذي نريده إلى الوسيط <code>chat_template</code> الخاص بالتابع <code>apply_chat_template()‎</code>.
</p>

<p>
	قد يكون ذلك مربكًا بعض الشيء للمستخدمين، لذا إذا أدرنا كتابة قالب بنفسنا، فيُوصى باستخدام قالب واحد إن أمكن ذلك.
</p>

<h3 id="-9">
	ما القالب الذي يجب استخدامه
</h3>

<p>
	يجب أن نتأكد من أن القالب يتطابق مع تنسيق الرسالة الذي شاهده النموذج أثناء التدريب عند ضبط هذا القالب للنموذج المُدرَّب مسبقًا للدردشة، وإلّا فقد ينخفض الأداء. يحدث الشيء نفسه حتى إن درّبنا النموذج أكثر، فمن المحتمل أن نحصل على الأداء الأفضل إذا أبقينا رموز الدردشة ثابتة، ويُعَد ذلك مشابهًا جدًا للترميز، حيث نحصل على الأداء الأفضل للاستدلال Inference أو الصقل Fine-tuning عندما نطابق بدقة الترميز المُستخدَم أثناء التدريب.
</p>

<p>
	إذا درّبنا نموذجًا من الصفر أو صقلنا نموذج لغوي أساسي للدردشة، فلدينا الحرية لاختيار قالب مناسب، حيث تتمتع النماذج اللغوية الكبيرة LLM بالذكاء الكافي لتعلّم كيفية التعامل مع الكثير من تنسيقات الدخل المختلفة، وأحد الخيارات الشائعة هو تنسيق <code>ChatML</code> الذي يُعَد خيارًا جيدًا ومرنًا للعديد من حالات الاستخدام، والذي يبدو كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7425_77" style=""><span class="pun">{%-</span><span class="pln"> </span><span class="kwd">for</span><span class="pln"> message </span><span class="kwd">in</span><span class="pln"> messages </span><span class="pun">%}</span><span class="pln">
    </span><span class="pun">{{-</span><span class="pln"> </span><span class="str">'&lt;|im_start|&gt;'</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> message</span><span class="pun">[</span><span class="str">'role'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">'\n'</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> message</span><span class="pun">[</span><span class="str">'content'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">'&lt;|im_end|&gt;'</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">'\n'</span><span class="pln"> </span><span class="pun">}}</span><span class="pln">
</span><span class="pun">{%-</span><span class="pln"> endfor </span><span class="pun">%}</span></pre>

<p>
	إذا أعجبنا التنسيق السابق، فلدينا صيغة مؤلفةً من سطر واحد وجاهزةً للنسخ في شيفرتنا البرمجية، حيث تتضمن هذه الصيغة دعمًا لموجّهات التوليد Generation Prompts، ولكنها لا تضيف رموز BOS أو EOS. إذا توقّع نموذجنا هذه الرموز، فلن يضيفها التابع <code>apply_chat_template</code> تلقائيًا، حيث سيُرمَّز النص باستخدام <code>add_special_tokens=False</code> لتجنب التعارضات المحتملة بين القالب والمنطق البرمجي <code>add_special_tokens</code>. إذا توقّع نموذجنا رموزًا خاصة، فعلينا التأكّد من إضافتها إلى القالب.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7425_75" style=""><span class="pln">tokenizer</span><span class="pun">.</span><span class="pln">chat_template </span><span class="pun">=</span><span class="pln"> </span><span class="str">"{% if not add_generation_prompt is defined %}{% set add_generation_prompt = false %}{% endif %}{% for message in messages %}{{'&lt;|im_start|&gt;' + message['role'] + '\n' + message['content'] + '&lt;|im_end|&gt;' + '\n'}}{% endfor %}{% if add_generation_prompt %}{{ '&lt;|im_start|&gt;assistant\n' }}{% endif %}"</span></pre>

<p>
	يغلّف هذا القالب كل رسالة برمزَي ‎<code>&lt;|im_start|&gt;</code>‎ و ‎<code>&lt;|im_end|&gt;</code>‎، ويكتب الدور كسلسلة نصية، مما يسمح بالمرونة في الأدوار التي تتدرب بها، وسيبدو الخرج كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7425_73" style=""><span class="pun">&lt;|</span><span class="pln">im_start</span><span class="pun">|&gt;</span><span class="pln">system
</span><span class="pun">أنت</span><span class="pln"> </span><span class="pun">روبوت</span><span class="pln"> </span><span class="pun">محادثة</span><span class="pln"> </span><span class="pun">مفيد</span><span class="pln"> </span><span class="pun">يبذل</span><span class="pln"> </span><span class="pun">قصارى</span><span class="pln"> </span><span class="pun">جهده</span><span class="pln"> </span><span class="pun">لعدم</span><span class="pln"> </span><span class="pun">قول</span><span class="pln"> </span><span class="pun">شيء</span><span class="pln"> </span><span class="pun">سخيف</span><span class="pln"> </span><span class="pun">يجذب</span><span class="pln"> </span><span class="pun">الانتباه</span><span class="pln"> </span><span class="pun">على</span><span class="pln"> </span><span class="pun">تويتر.&lt;|</span><span class="pln">im_end</span><span class="pun">|&gt;</span><span class="pln">
</span><span class="pun">&lt;|</span><span class="pln">im_start</span><span class="pun">|&gt;</span><span class="pln">user
</span><span class="pun">كيف</span><span class="pln"> </span><span class="pun">حالك؟&lt;|</span><span class="pln">im_end</span><span class="pun">|&gt;</span><span class="pln">
</span><span class="pun">&lt;|</span><span class="pln">im_start</span><span class="pun">|&gt;</span><span class="pln">assistant
</span><span class="pun">أنا</span><span class="pln"> </span><span class="pun">بأفضل</span><span class="pln"> </span><span class="pun">حال!&lt;|</span><span class="pln">im_end</span><span class="pun">|&gt;</span></pre>

<p>
	تُعَد أدوار المستخدم والنظام والمساعد هي الأدوار المعيارية للدردشة، ويُوصَى باستخدامها عندما يكون ذلك منطقيًا، وخاصةً إذا أردنا أن يعمل نموذجنا بنجاح مع الصنف <code>TextGenerationPipeline</code>، ولكن لا يقتصر الأمر على هذه الأدوار، إذ تُعَد عملية إنشاء القوالب مرنة ويمكن أن تمثّل أيّ سلسلة نصية دورًا.
</p>

<h3 id="-10">
	كيف نبدأ بإضافة قوالب الدردشة
</h3>

<p>
	إذا كان لدينا نموذج دردشة، فيجب ضبط السمة <code>tokenizer.chat_template</code> الخاصة به واختباره باستخدام التابع <code>apply_chat_template()‎</code>، ثم دفع المُرمِّز المحدَّث إلى مستودع Hugging Face Hub. يُطبَّق الشيء نفسه حتى إن لم نكن مالكي النموذج، فإذا استخدمنا نموذجًا مع قالب دردشة فارغ أو نموذجًا لا يزال يستخدم قالب الصنف الافتراضي، فيجب فتح <a href="https://huggingface.co/docs/hub/repositories-pull-requests-discussions" rel="external nofollow">طلب سحب</a> Pull Request إلى مستودع النموذج حتى نتمكّن من ضبط هذه السمة بطريقة صحيحة.
</p>

<p>
	نصبح جاهزين بعد ضبط هذه السمة، إذ سيعمل التابع <code>tokenizer.apply_chat_template</code> الآن بنجاح مع هذا النموذج، مما يعني أنه مدعوم تلقائيًا أيضًا في أماكن أخرى مثل الصنف <code>TextGenerationPipeline</code>.
</p>

<p>
	يمكننا ضمان استفادة المجتمع بالكامل من الإمكانيات الكاملة للنماذج مفتوحة المصدر من خلال التأكد من تضمين هذه السمة في النماذج. فقد كان عدم تطابق التنسيق مشكلة قائمة في هذا المجال، مما أثر سلبًا على الأداء لفترة طويلة، ولذلك حان الوقت لوضع حد لهذه المشكلة.
</p>

<h2 id="-11">
	متقدم: نصائح لكتابة القوالب
</h2>

<p>
	إن لم نكن على دراية بلغة القوالب Jinja، فسنجد أن أسهل طريقة لكتابة قالب دردشة هي أولًا كتابة كود قصير بلغة بايثون ينسّق الرسائل بالطريقة التي نريدها ثم تحويل هذا السكربت إلى قالب.
</p>

<p>
	لنتذكّر أن معالج القالب سيستقبل سجل المحادثة كمتغير بالاسم <code>messages</code>، وسنتمكّن من الوصول إلى هذا المتغير في قالبنا كما تفعل في لغة بايثون، حيث يمكننا تكراره ضمن حلقة باستخدام التعليمة <code>{% for message in messages %}</code> أو الوصول إلى الرسائل الفردية باستخدام التعليمة ‎<code>{{ messages[0] }}</code>‎ مثلًا.
</p>

<p>
	يمكن أيضًا استخدام النصائح التالية لتحويل شيفرتنا البرمجية إلى لغة القوالب Jinja.
</p>

<h3 id="trimmingwhitespace">
	إزالة المسافات البيضاء من السلاسل النصية
</h3>

<p>
	ستطبع لغة القوالب Jinja افتراضيًا أي مسافات Whitespace مثل الفراغات والسطور الجديدة تأتي قبل أو بعد كتلة ما، والذي قد يشكّل مشكلة بالنسبة لقوالب الدردشة التي نريد أن تكون دقيقة مع الفراغات، حيث يمكن تجنب ذلك من خلال كتابة قوالبك كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7425_71" style=""><span class="pln">{%- for message in messages %}
    {{- message['role'] + message['content'] }}
{%- endfor %}</span></pre>

<p>
	بدلًا من الطريقة التالية:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7425_69" style=""><span class="pln">{% for message in messages %}
    {{ message['role'] + message['content'] }}
{% endfor %}</span></pre>

<p>
	ستؤدي إضافة الرمز <code>-</code> إلى إزالة أي مسافة بيضاء تأتي قبل الكتلة. قد يبدو أن المثال الثاني لا يسبب مشكلات، ولكنه قد يتضمّن الخرجُ السطرَ الجديد والمسافة البادئة، وهو الشيء الذي نريد تجنبّه.
</p>

<h3 id="for">
	حلقات For
</h3>

<p>
	تبدو حلقات For في لغة Jinja كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7425_67" style=""><span class="pln">{%- for message in messages %}
    {{- message['content'] }}
{%- endfor %}</span></pre>

<p>
	نلاحظ أن كل ما يوجد ضمن <code>{{ كتلة التعبير }}</code> سيُطبَع في الخرج، ويمكنك استخدام معاملات مثل <code>+</code> لدمج السلاسل النصية ضمن كتل التعبير.
</p>

<h3 id="if">
	تعليمات If
</h3>

<p>
	تبدو تعليمات If في لغة Jinja كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7425_65" style=""><span class="pln">{%- if message['role'] == 'user' %}
    {{- message['content'] }}
{%- endif %}</span></pre>

<p>
	تستخدم لغة بايثون المسافات البيضاء لتمييز بدايات ونهايات كتل <code>for</code> و <code>if</code>، وتطلب لغة Jinja إنهاءها صراحةً باستخدام <code>{% endfor %}</code> و <code>{% endif %}</code>.
</p>

<h3 id="-12">
	المتغيرات الخاصة
</h3>

<p>
	يمكن الوصول إلى قائمة الرسائل <code>messages</code> داخل قالبنا، ولكن يمكنك أيضًا الوصول إلى العديد من المتغيرات الخاصة الأخرى، والتي تتضمّن الرموز الخاصة مثل <code>bos_token</code> و <code>eos_token</code>، بالإضافة إلى المتغير <code>add_generation_prompt</code> الذي ناقشناه سابقًا. يمكن أيضًا استخدام المتغير <code>loop</code> للوصول إلى معلومات حول تكرار الحلقة الحالي مثل استخدام ‎<code>{% if loop.last %}</code>‎ للتحقق مما إذا كانت الرسالة الحالية هي الرسالة الأخيرة في المحادثة.
</p>

<p>
	فيما يلي مثال يجمع بين هذه الأفكار لإضافة موجّه توليد في نهاية المحادثة إذا كانت قيمة <code>add_generation_prompt</code> هي <code>True</code>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7425_63" style=""><span class="pln">{%- if loop.last and add_generation_prompt %}
    {{- bos_token + 'المساعد:\n' }}
{%- endif %}</span></pre>

<h3 id="jinja">
	التوافق مع لغة قوالب Jinja التي لا تستخدم لغة بايثون
</h3>

<p>
	توجد تطبيقات متعددة للغة قوالب Jinja التي تستخدم لغات مختلفة، ويكون لها عادةً الصياغة نفسها، ولكن الاختلاف الرئيسي هو إمكانية استخدام توابع بايثون عند كتابة قالب باستخدام بايثون مثل استخدام التابع ‎<code>.lower()</code>‎ مع السلاسل النصية أو التابع ‎<code>.items()</code>‎ مع القواميس. سيتوقف ذلك إذا حاول شخص ما استخدام قالبك على تطبيق للغة قوالب Jinja التي لا تستخدم لغة بايثون، فالتطبيقات التي لا تستخدم لغة بايثون شائعة الاستخدام وخاصةً في بيئات النشر حيث تحظى لغة <a href="https://academy.hsoub.com/programming/javascript/" rel="">جافاسكربت JS</a> و<a href="https://academy.hsoub.com/programming/rust/" rel="">رَست Rust</a> بشعبية كبيرة.
</p>

<p>
	فيما يلي بعض التغييرات السهلة التي يمكن إجراؤها على قوالبنا لضمان توافقها مع جميع تطبيقات Jinja:
</p>

<ul>
	<li>
		نستخدم مرشّحات Jinja بدل توابع بايثون، حيث يكون لها الاسم نفسه عادة، فمثلًا يتحوّل <code>string.lower()‎</code> إلى <code>string|lower</code>، ويتحوّل <code>dict.items()‎</code> إلى <code>dict|items</code>. أحد التغييرات الملحوظة هو أن <code>string.strip()‎</code> يصبح <code>string|trim</code>. ويمكن مطالعة  <a href="https://jinja.palletsprojects.com/en/3.1.x/templates/#builtin-filters" rel="external nofollow">قائمة المرشحات المضمنة في توثيق Jinja</a> لمزيد من المعلومات
	</li>
	<li>
		نضع <code>true</code> و <code>false</code> و <code>none</code> بدل <code>True</code> و <code>False</code> و <code>None</code> الخاصة بلغة بايثون
	</li>
	<li>
		قد يؤدي عرض القاموس أو القائمة مباشرةً إلى نتائج مختلفة في تطبيقات أخرى، فمثلًا قد تتغير إدخالات السلسلة النصية من علامتي اقتباس مفردتين إلى علامتي اقتباس مزدوجتين، لذا يمكن أن تساعدنا إضافة مرشّح <code>tojson</code> في ضمان التناسق
	</li>
</ul>

<h2>
	الخاتمة
</h2>

<p>
	بهذا نكون وصلنا لختام مقالنا الشامل الذي شرحنا فيه كيفية تحويل الدردشات إلى تنسيق قابل للاستخدام في نماذج Hugging Face باستخدام قوالب الدردشة Chat Templates، وتعرفنا على أمثلة مختلفة توضح طريقة تطبيقها لتحسين التفاعل بين النظام والمستخدم والتأكد من أن البيانات المدخلة تتماشى مع طريقة تدريب النموذج.
</p>

<p>
	ترجمة -وبتصرّف- للقسم <a href="https://huggingface.co/docs/transformers/chat_templating" rel="external nofollow">Templates for Chat Models</a> من توثيقات Hugging Face.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%83%D9%8A%D9%81-%D8%AA%D8%A8%D8%AF%D8%A3-%D9%81%D9%8A-%D9%85%D8%AC%D8%A7%D9%84-%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-r2075/" rel="">كيف تبدأ في مجال الذكاء الاصطناعي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%85%D8%B4%D8%A7%D8%B1%D9%83%D8%A9-%D9%86%D9%85%D9%88%D8%B0%D8%AC-%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%B9%D9%84%D9%89-%D9%85%D9%86%D8%B5%D8%A9-hugging-face-r2378/" rel="">مشاركة نموذج ذكاء اصطناعي على منصة Hugging Face</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%AF%D8%B1%D9%8A%D8%A8-%D9%86%D9%85%D9%88%D8%B0%D8%AC-%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%B9%D9%84%D9%89-%D8%AA%D9%84%D8%AE%D9%8A%D8%B5-%D8%A7%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D9%83%D8%AA%D8%A8%D8%A9-transformers-r2373/" rel="">تدريب نموذج ذكاء اصطناعي على تلخيص النصوص باستخدام المكتبة Transformers</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D8%B3%D8%A3%D9%84-%D9%85%D9%87%D9%86%D8%AF%D8%B3-%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-%D8%A3%D8%B3%D8%A6%D9%84%D8%A9-%D8%B4%D8%A7%D8%A6%D8%B9%D8%A9-%D8%AD%D9%88%D9%84-%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-r2313/" rel="">أسئلة شائعة حول الذكاء الاصطناعي</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2486</guid><pubDate>Wed, 08 Jan 2025 15:00:00 +0000</pubDate></item><item><title>&#x62A;&#x639;&#x631;&#x641; &#x639;&#x644;&#x649; &#x645;&#x643;&#x62A;&#x628;&#x629; Scikit learn &#x648;&#x623;&#x647;&#x645; &#x62E;&#x648;&#x627;&#x631;&#x632;&#x645;&#x64A;&#x627;&#x62A;&#x647;&#x627;</title><link>https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-scikit-learn-%D9%88%D8%A3%D9%87%D9%85-%D8%AE%D9%88%D8%A7%D8%B1%D8%B2%D9%85%D9%8A%D8%A7%D8%AA%D9%87%D8%A7-r2485/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2025_01/Scikitlearn_.png.49b13c7089adc84c369349bc1f14ec3a.png" /></p>
<p>
	يمر أغلب مهندسي الذكاء الاصطناعي و تعلم الآلة أثناء تعلمهم للعديد من الخوارزميات الأساسية والتقليدية في تعلم الآلة بمكتبة ساي كيت ليرن Scikit Learn التي توفر هذه الخوارزميات وتوثيقًا جيدًا لها، في هذه المقالة سوف نستكشف هذه المكتبة القوية واستخداماتها ومميزاتها، وما الخوارزميات التي يوفرها، ونستعرض بعض الأمثلة العملية على حالات الاستخدام.
</p>

<h2 id="scikitlearn-1">
	ما هي مكتبة ساي كيت ليرن Scikit Learn
</h2>

<p>
	تعد ساي كيت ليرن Scikit Learn أحد أشهر مكتبات أو أطر عمل لغة بايثون وأكثرها استعمالًا خاصة في مجالات <a href="https://academy.hsoub.com/programming/general/%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA/" rel="">علوم البيانات</a> و<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9/" rel="">تعلم الآلة</a>، فهي توفر مجموعة من <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AE%D9%88%D8%A7%D8%B1%D8%B2%D9%85%D9%8A%D8%A7%D8%AA-%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/" rel="">خوارزميات الذكاء الاصطناعي </a>المبنية بكفاءة، وتتيح لنا استخدامها بسلاسة حيث تمتلك جميع خوارزميات التعلم المبنية بها طريقة شبه موحدة للتعامل معها، فاستخدام خوارزمية أخرى لنفس الغرض يتطلب ببساطة تغيير سطر واحد من الكود، وتوفر هذه المكتبة إمكانيات كبيرة عند بناء النماذج ومعالجة البيانات وتجهيزها، وحفظ النماذج في صيغة يمكن إعادة استخدامها لاحقًا.
</p>

<h2 id="scikitlearn-2">
	مميزات مكتبة ساي كيت ليرن Scikit Learn
</h2>

<p>
	تسهل مكتبة ساي كيت ليرن Scikit Learn تطوير نماذج تعلم الآلة على المبتدئين والراغبين باختبار الأمور بسرعة، وتوفر لهم العديد من المميزات التي سنسردها ونتعرف عليها مثل:
</p>

<ul>
	<li>
		<strong>التوثيق الجيد</strong>: تتميز المكتبة بوجود توثيق مفصل وأمثلة استخدام كثيرة تساعدنا في البدء بتطوير واستخدام الخوارزميات المختلفة ومعرفة المعاملات التي يمكن ضبطها لتغير أداء النموذج وطريقة تدريبها
	</li>
	<li>
		<strong>القيم الافتراضية لمعاملات التحكم</strong> : لا داعي للقلق إن كنا نتعلم خوارزمية جديدة ونرغب في تجربتها دون الدخول في جميع التفاصيل وتأثيرات ضبط قيم معاملات التحكم أوالمعاملات الفائقة hyperparameters حيث تضبط المكتبة أغلب العوامل بقيم  افتراضية مناسبة لأغلب الاستخدامات، لذا يمكننا التركيز على العوامل الأهم وفهمها بشكل أفضل
	</li>
	<li>
		<strong>أدوات للمفاضلة بين النماذج</strong>: مع تنوع الخوارزميات المبنية في المكتبة التي يمكنها القيام بنفس المهمة بطرق مختلفة يكون من الصعب على المبتدئ تقرير أي الخوارزميات هو الأفضل للمهمة التي يحاول إنجازها، لذلك توفر لنا المكتبة أدوات للمقارنة بين الخوارزميات المختلفة وعوامل التحكم المختلفة بسلاسة
	</li>
	<li>
		<strong>مكتبة غنية بالخوارزميات والأدوات</strong>: توفر المكتبة أغلب خوارزميات تعلم الآلة التقليدية، مما يغنينا عن عناء بناء هذه الخوارزميات من الصفر، إذ تتوفر عشرات الخوارزميات التي يمكن تطبيقها من خلال سطور معدودة من الكود، فيمكننا التركيز على تحسين معالجة البيانات وتحسين جودتها واختيار النموذج الأنسب للمشكلة التي لدينا
	</li>
	<li>
		<strong>التوافق مع المكتبات الأخرى</strong>: تعمل المكتبة بشكل سلس مع المكتبات الأخرى مثل باندا Pandas و نمباي NumPy التي توفر <a href="https://academy.hsoub.com/programming/general/%D9%87%D9%8A%D8%A7%D9%83%D9%84-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-data-structures/" rel="">هياكل بيانات</a> وعمليات تسهل اكتشاف أنماط البيانات وتحليلها ومعالجتها لتصبح جاهزة للنموذج الذي نحتاج لتدريبه
	</li>
</ul>

<h2 id="datapreprocessingwithscikitlearn">
	معالجة البيانات باستخدام ساي كيت ليرن
</h2>

<p>
	توفر ساي كيت ليرن Scikit Learn العديد من الأدوات الجيدة لمعالجة البيانات وتجهيزها لتدريب النماذج عليها، وكما نعرف تٌعد البيانات وجودتها العامل الأهم في تحسين دقة توقعات النماذج المستخدمة، لذلك هنالك بعض الخطوات التي نحتاج للقيام بها لمعالجة البيانات فمثلًا إذا كانت هناك قيم غير رقمية فنحن بحاجة لتحويلها إلى أرقام فنماذج تعلم الآلة هي نماذج رياضية ولن نستطيع القيام بعمليات حسابية على النصوص أو الصور بشكلها الأصلي.
</p>

<h3>
	<strong>أمثلة على معالجة البيانات</strong>
</h3>

<ul>
	<li>
		<strong>الترميز Encoding</strong><span>:</span> هو عملية تبديل بعض البيانات بأرقام يسهل إجراء عمليات رياضية عليها، مع إمكانية إرجاعها لأصلها، يمكن ترميز البيانات في مكتبة Scikit Learn باستخدام الكود التالي:
	</li>
</ul>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9049_10" style=""><span class="kwd">from</span><span class="pln"> sklearn</span><span class="pun">.</span><span class="pln">preprocessing </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">LabelEncoder</span><span class="pln">

</span><span class="com"># ترميز البيانات الوصفية </span><span class="pln">
city </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"القاهرة"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"الرياض"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"دمشق"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"القاهرة"</span><span class="pun">]</span><span class="pln">

</span><span class="com"># نعرف المٌرمز الذي يعوض عن اسمٍ برقم يعبر عنه</span><span class="pln">
encoder </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LabelEncoder</span><span class="pun">()</span><span class="pln">

</span><span class="com"># تقوم هذه الدالة بتجهيز المٌرمز </span><span class="pln">
</span><span class="com"># حيث سيمكننا أن نستخدمه أكثر من مرة بعد هذه الخطوة لترميز البيانات المدخلة له بناءً على أول بيانات أعطت له</span><span class="pln">
encoder</span><span class="pun">.</span><span class="pln">fit</span><span class="pun">(</span><span class="pln">city</span><span class="pun">)</span><span class="pln">

</span><span class="com"># الآن يمكننا استخدامه على أي بيانات أخرى لترميزها</span><span class="pln">
city_encoded </span><span class="pun">=</span><span class="pln"> encoder</span><span class="pun">.</span><span class="pln">transform</span><span class="pun">(</span><span class="pln">city</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">city_encoded</span><span class="pun">)</span><span class="pln">  </span><span class="com"># Output: [1 0 2 1]</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">encoder</span><span class="pun">.</span><span class="pln">transform</span><span class="pun">([</span><span class="str">"الرياض"</span><span class="pun">]))</span><span class="pln">  </span><span class="com"># Output: [0]</span><span class="pln">

</span><span class="com"># عكس الترميز </span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">encoder</span><span class="pun">.</span><span class="pln">inverse_transform</span><span class="pun">(</span><span class="pln">city_encoded</span><span class="pun">))</span><span class="pln">  </span><span class="com"># Output: ['القاهرة' 'الرياض' 'دمشق' 'القاهرة']</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">encoder</span><span class="pun">.</span><span class="pln">inverse_transform</span><span class="pun">([</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">]))</span><span class="pln">  </span><span class="com"># Output: ['دمشق' 'القاهرة' 'الرياض' 'الرياض' 'القاهرة'](city_encoded)</span></pre>

<ul>
	<li>
		<p>
			<strong>التعامل مع القيم المفقودة</strong> : قد تتضمن البيانات بعض القيم المفقودة ويمكن التعامل معها في مكتبة Scikit Learn بسهولة من خلال حذف الصفوف التي تحتوي قيمًا مفقودة إن كانت قليلة للغاية، أو التعويض عنها باستخدام المعلومات الإحصائية كالمتوسط الحسابي للقيم، أو بناء نموذج لتوقعها بحسب القيم الموجودة بالفعل.
		</p>
	</li>
</ul>

<h2 id="machinelearningwithscikitlearn">
	خوارزميات تعلم الآلة في مكتبة Scikit Learn
</h2>

<p>
	تتضمن مكتبة Scikit Learn العديد من خوارزميات تعلم الآلة التي تساعدنا على تنفيذ مهام متنوعة، وفيما يلي نبذة عن أهم هذه الخوارزميات:
</p>

<h3 id="supervisedlearningalgorithms">
	أولًا: خوارزميات التعلم الخاضع للإشراف
</h3>

<p>
	التعلم الخاضع للإشراف Supervised Learning هو نوع من التعلم الآلي يصف المهام التي تكون فيها البيانات المراد توقعها معلوم مخرجاتها الممكنة مسبقًا وتوجد بيانات تحتوي على ملاحظات سابقة تتضمن الوسوم Labels المراد تعليم النموذج توقعها، وسنوضح تاليًا أبرز الخوازرميات التي تندرج تحت هذه النوع.
</p>

<h4>
	<strong>خوارزميات توقع الانحدار Regression</strong>
</h4>

<p>
	توقع الانحدار هو نوع من المهام التي يمكننا القيام بها باستخدام خوارزميات مضمنة في<strong> </strong>ساي كيت ليرن Scikit Learn، يتوقع هذا النوع من الخوارزميات الحصول على أمثلة سابقة يتعلم منها العلاقة بين المدخلات المعطاة والوسم المراد توقعه، والذي يكون قيمة عددية مستمرة continuous مثل توقع درجة الحرارة أو توقع أسعار المنازل.
</p>

<p>
	<strong>أمثلة على خوارزميات توقع الانحدار:</strong>
</p>

<ul>
	<li>
		توقع الانحدار الخطي Linear Regression
	</li>
	<li>
		توقع الانحدار بالدوال متعددة الحدود Polynomial Regression
	</li>
</ul>

<h4 id="classification">
	خوزارزميات التصنيف Classification
</h4>

<p>
	يصنف البشر كل شيء حولهم من الحيوانات والجمادات إلى أنواع الأفلام والروايات، وتتوفر  خوارزميات تستطيع محاكاة البشر وتتعلم تصنيف الأشياء المختلفة بإعطاء نماذج وملاحظات سابقة لتصنيفات قام بها البشر من قبل حتي تستطيع الآلة تعلم التصنيف، يمكن الاستفادة من التصنيف في أتمتة العديد من المهام المرجو فيها تصنيف عدد ضخم من العناصر في وقت قليل بالتالي توفير الوقت وزيادة الكفاءة، عملية التصنيف تخرج لنا قيمًا منفصلة discrete.
</p>

<p>
	من الأمثلة على استخدام هذه الخوارزميات توقع حالة الطقس هل هو مشمس أم غائم أم ماطر أم حار ...إلخ. وتصنيف الصور، وتوقع تقييمات الأفلام.
</p>

<p>
	<strong>أمثلة على خوارزميات التصنيف</strong>
</p>

<ul>
	<li>
		الانحدار اللوجستي Logistic Regression
	</li>
	<li>
		مٌصنّف الجار الأقرب Nearest Neighbors Classification
	</li>
	<li>
		شجرة القرار Decision Tree
	</li>
</ul>

<h4 id="modelsensemble">
	خوارزميات تجميع النماذج Models Ensemble
</h4>

<p>
	تتيح لنا ساي كيت ليرن Scikit Learn القدرة على دمج أكثر من نموذج تعلم آلة ليشكلوا نموذجًا أقوى، يمكن تشبيه الأمر بلجنة أو فريق من الأصدقاء كل منهم خبير في مجال معين وعند جمع خبرتهم معًا يغطون على نقاط الضعف الخاصة بهم.
</p>

<p>
	يمكن تجميع النماذج باستخدام التصويت Voting حيث نجري تدريب لعدد من النماذج ثم نأخذ بتوقع الأغلبية في حالة كون المشكلة تصنيفية، أما أن كانت المشكلة توقع انحدار يمكن أن تأخذ متوسط التوقعات، لنلاحظ الكود التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9049_12" style=""><span class="kwd">from</span><span class="pln"> sklearn</span><span class="pun">.</span><span class="pln">ensemble </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">VotingClassifier</span><span class="pln">
</span><span class="com"># التصنيف اللوجيستي</span><span class="pln">
model1 </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LogisticRegression</span><span class="pun">()</span><span class="pln">
</span><span class="com"># شجرة القرارات</span><span class="pln">
model2 </span><span class="pun">=</span><span class="pln"> tree</span><span class="pun">.</span><span class="typ">DecisionTreeClassifier</span><span class="pun">()</span><span class="pln">
</span><span class="com">#  مٌصنف أقرب الجيران </span><span class="pln">
model3 </span><span class="pun">=</span><span class="pln"> </span><span class="typ">KNeighborsClassifier</span><span class="pun">(</span><span class="pln">n_neighbors</span><span class="pun">=</span><span class="lit">3</span><span class="pun">)</span><span class="pln">
</span><span class="com"># تجميع لتوقعات النماذج باستخدام التصويت </span><span class="pln">
model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">VotingClassifier</span><span class="pun">(</span><span class="pln">estimators</span><span class="pun">=[(</span><span class="str">'lr'</span><span class="pun">,</span><span class="pln"> model1</span><span class="pun">),</span><span class="pln"> </span><span class="pun">(</span><span class="str">'dt'</span><span class="pun">,</span><span class="pln"> model2</span><span class="pun">),</span><span class="pln"> </span><span class="pun">(</span><span class="str">'knn'</span><span class="pun">,</span><span class="pln"> model3</span><span class="pun">)],</span><span class="pln"> voting</span><span class="pun">=</span><span class="str">'hard'</span><span class="pun">)</span><span class="pln">
</span><span class="com"># تدريب النموذج</span><span class="pln">
</span><span class="com"># لاحظ أن مدخلات هذه الدالة هي الخواص المطلوب من النموذج تعلم الأنماط بها</span><span class="pln">
</span><span class="com"># بالإضافة إلى الوسم المٌراد توقعه</span><span class="pln">
</span><span class="com"># تمثل هذه المدخلات التجارب المٌراد للنموذج التعلم منها</span><span class="pln">
</span><span class="com"># يمكنك أن تستخدم هذه الدالة في تدريب أي نموذج في ساي كيت ليرن</span><span class="pln">
model</span><span class="pun">.</span><span class="pln">fit</span><span class="pun">(</span><span class="pln">X_train</span><span class="pun">,</span><span class="pln"> y_train</span><span class="pun">)</span><span class="pln">
</span><span class="com"># استخدام النموذج في التوقع</span><span class="pln">
</span><span class="com"># البيانات المدخلة للنموذج لم يرها من قبل</span><span class="pln">
</span><span class="com"># ولكنها تحتوي نفس الخواص والأعمدة التي تم تدريب النموذج عليها</span><span class="pln">
</span><span class="com"># نرغب في تدريب النموذج على التعميم لبيانات لم يرها من قبل</span><span class="pln">
y_pred </span><span class="pun">=</span><span class="pln"> model</span><span class="pun">.</span><span class="pln">predict</span><span class="pun">(</span><span class="pln">X_test</span><span class="pun">)</span></pre>

<p>
	جمعنا في الكود أعلاه عدد من النماذج الضعيفة ومحدودة المعرفة حيث يتدرب كل نموذج على جزء من البيانات، وجمعنا معرفتهم معًا للخروج بتوقع واحد مثال على هذا النوع هو خوارزمية الغابة العشوائية Random Forest وهي تجميع لنماذج من شجرة القرارات Decision Tree البسيطة.
</p>

<p>
	تقلل هذه الطريقة من فرص حفظ النموذج للبيانات وتمنحه مرونة أكثر لتعلم الأنماط الحقيقية التي تمكنه من توقع الإجابات الصحيحة عند تعرضه لبيانات جديدة عند تشغيل النموذج.
</p>

<h3 id="unsupervisedlearningalgorithms">
	خوارزميات التعلم غير الخاضع للإشراف
</h3>

<p>
	التعلم غير الخاضع للإشراف Unsupervised Learning هو نوع من تعلم الآلة تكون فيه البيانات غير موسومة، ومهمة النموذج تعلم الأنماط بين البيانات ليكتشف الفروقات بينها، مثلًا إن كانت المدخلات صور فتكون المهمة معرفة أي الصور يمكن اعتبارها تابعة لنفس الشيء دون إعطاء وسم للبيانات في عملية التدريب، ما يعرفه النموذج هو الخواص المُراد للنموذج التعلم منها فقط للتميز بين الصور بناء عليها، وسنوضح تاليًا أبرز الخوازرميات التي تندرج تحت هذه النوع.
</p>

<h4 id="clustering">
	خوزارميات العنقدة أو التصنيف العنقودي Clustering
</h4>

<p>
	لا نوفر للنموذج في هذه الحالة التصنيفات والوسوم المتوقع انتماء البيانات لها على غرار التصنيف العادي، ففي العنقدة Clustering على النموذج أن يكتشف هذا بنفسه من خلال تعلم الأنماط الموجودة بالبيانات للتمييز بينها.
</p>

<p>
	تستخدم <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%AE%D9%88%D8%A7%D8%B1%D8%B2%D9%85%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%B9%D9%86%D9%82%D8%AF%D8%A9-%D9%84%D8%AA%D8%AC%D8%B2%D8%A6%D8%A9-%D8%B9%D9%85%D9%84%D8%A7%D8%A1-%D9%85%D8%AA%D8%AC%D8%B1-%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A-r1477/" rel="">خوزارميات العنقدة</a> في أنظمة التوصية Recommendation systems لتقديم اقتراحات شخصية للمستخدمين تناسب اهتماماتهم، أو فصل عناصر الصورة Image segmentation من خلال تحديد البكسلات التي تنتمي لنفس العنصر Object في الصورة بالتالي تفريقها عن باقي العناصر.
</p>

<p>
	<strong>أمثلة على خوارزميات العنقدة:</strong>
</p>

<ul>
	<li>
		العنقدة حول عدد من نقاط التمركز k-means
	</li>
	<li>
		العنقدة الهرمية Hierarchical clustering
	</li>
</ul>

<h4 id="datareduction">
	خوارزميات اختزال البيانات
</h4>

<p>
	نحتاج لاختزال البيانات Data Reduction في كثير من الحالات بسبب محدودية القدرة الحاسوبية وعدم تأثير كل هذه البيانات بشكل ملحوظ على أداء النموذج، ونجري اختزال البيانات عادة من خلال تقليل أبعادها بدمج بعض الأعمدة أو الخواص بدون خسارة المعلومات الهامة قدر الإمكان، فمثلًا يمكننا تقليل أبعاد الصورة مع الاحتفاظ بملامحها ودقتها قدر الإمكان، أو تقليل عدد الأعمدة من 100 إلى 10 مع احتفاظ الأعمدة العشرة بأغلبية المعلومات التي تؤثر على التوقعات.
</p>

<p>
	من أمثلة خوارزميات اختزال البيانات خوارزمية تحليل العنصر الأساسي Principal Component Analysis التي تمكننا من اختزال عدد الأعمدة أو الأبعاد بالبيانات مع الاحتفاظ بأكبر قدر ممكن من المعلومات.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9049_14" style=""><span class="com"># تساعدنا هذه المكتبة على صنع هياكل بيانات مصفوفة </span><span class="pln">
</span><span class="com"># والقيام بالعديد من العمليات الحسابية</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> numpy </span><span class="kwd">as</span><span class="pln"> np
</span><span class="com"># هذه الخوارزمية التي سنستخدمها لاختزال البيانات</span><span class="pln">
</span><span class="kwd">from</span><span class="pln"> sklearn</span><span class="pun">.</span><span class="pln">decomposition </span><span class="kwd">import</span><span class="pln"> PCA
</span><span class="com"># في البداية لنصنع بيانات عشوائية لنقوم بالتجربة</span><span class="pln">
</span><span class="com"># يضمن لنا هذا السطر ثبات القيم العشوائية عند إعادة تشغيل هذا الكود</span><span class="pln">
np</span><span class="pun">.</span><span class="pln">random</span><span class="pun">.</span><span class="pln">seed</span><span class="pun">(</span><span class="lit">0</span><span class="pun">)</span><span class="pln">
</span><span class="com"># نعرف مصفوفة عشوائية التوليد، تتكون من 10 صفوف و100 عمود</span><span class="pln">
X </span><span class="pun">=</span><span class="pln"> np</span><span class="pun">.</span><span class="pln">random</span><span class="pun">.</span><span class="pln">rand</span><span class="pun">(</span><span class="lit">10</span><span class="pun">,</span><span class="pln"> </span><span class="lit">100</span><span class="pun">)</span><span class="pln">
</span><span class="com"># لنعرف الخوارزمية التي استوردناها</span><span class="pln">
pca </span><span class="pun">=</span><span class="pln"> PCA</span><span class="pun">(</span><span class="pln">n_components</span><span class="pun">=</span><span class="lit">10</span><span class="pun">)</span><span class="pln"> </span><span class="com"># نضع هنا عدد الأعمدة التي نرغب أن تصبح البيانات عليها</span><span class="pln">
</span><span class="com"># لنقم بتشغيل الخوارزمية على البيانات التي معنا </span><span class="pln">
x_pca </span><span class="pun">=</span><span class="pln"> pca</span><span class="pun">.</span><span class="pln">fit_transform</span><span class="pun">(</span><span class="pln">X</span><span class="pun">)</span><span class="pln"> </span><span class="com"># هذا السطر يقوم بتدريب الخوارزمية على اختزال البيانات وفي نفس الوقت يقوم باختزال البيانات المدخلة</span><span class="pln">

</span><span class="com"># لنرى النتائج</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"حجم البيانات قبل الاختزال"</span><span class="pun">,</span><span class="pln"> X</span><span class="pun">.</span><span class="pln">shape</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"حجم البيانات بعد الاختزال"</span><span class="pun">,</span><span class="pln"> x_pca</span><span class="pun">.</span><span class="pln">shape</span><span class="pun">)</span><span class="pln">

</span><span class="str">'''
المـــــــــخــرجـــــــــــــات
-------------------------------------
حجم البيانات قبل الاختزال (10, 100)
حجم البيانات بعد الاختزال (10, 10)
'''</span></pre>

<h4 id="anomalydetection">
	خوارزميات كشف الشذوذ
</h4>

<p>
	كشف الشذوذ Anomaly Detection هو عملية ملاحظة الغير مألوف والخارج عن الأغلبية في البيانات. يستخدم في حالات عددية مثل اكتشاف المعاملات الاحتيالية في البنوك، واكتشاف الأنماط غير المعتادة في تدفق الشبكات مما قد يساعد على منع هجمات إغراق الشبكة بالطلبات، واكتشاف المنتجات المعيبة في خطوط الإنتاج واكتشاف الأنماط غير المعتادة للمؤشرات الحيوية لجسم الإنسان التي تستخدمها تطبيقات الساعات الذكية التي تجمع هذه المؤشرات.
</p>

<p>
	من الخوارزميات التي تطبق كشف الشذوذ خوارزمية غابة العزل  Isolation Forest، وفيما يلي مثال على طريقة استخدامها:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9049_20" style=""><span class="com"># استيراد نموذج كشف كشف الشذوذ</span><span class="pln">
</span><span class="kwd">from</span><span class="pln"> sklearn</span><span class="pun">.</span><span class="pln">ensemble </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">IsolationForest</span><span class="pln">
</span><span class="com"># سنستخدمها لتوليد بعض البيانات</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> numpy </span><span class="kwd">as</span><span class="pln"> np

</span><span class="com"># نولد البيانات لتجربة النموذج</span><span class="pln">
X </span><span class="pun">=</span><span class="pln"> np</span><span class="pun">.</span><span class="pln">array</span><span class="pun">([[</span><span class="lit">10</span><span class="pun">,</span><span class="pln"> </span><span class="lit">10</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">12</span><span class="pun">,</span><span class="pln"> </span><span class="lit">12</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">8</span><span class="pun">,</span><span class="pln"> </span><span class="lit">8</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">9</span><span class="pun">,</span><span class="pln"> </span><span class="lit">9</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">200</span><span class="pun">,</span><span class="pln"> </span><span class="lit">200</span><span class="pun">]])</span><span class="pln">  </span><span class="com"># يمكنك ملاحظة أن النقطة الأخيرة شاذة عن باقي النقاط</span><span class="pln">

</span><span class="com"># لنقم بتعريف وتدريب النموذج</span><span class="pln">
clf </span><span class="pun">=</span><span class="pln"> </span><span class="typ">IsolationForest</span><span class="pun">(</span><span class="pln">contamination</span><span class="pun">=</span><span class="lit">0.2</span><span class="pun">)</span><span class="pln">  </span><span class="com"># %يفترض هذا المعامل أن نسبة شذوذ 20</span><span class="pln">
</span><span class="com"># لاحظ أن التدريب يتم بدون استخدام وسوم حيث أن هذا النموذج غير خاضع للإشراف</span><span class="pln">
clf</span><span class="pun">.</span><span class="pln">fit</span><span class="pun">(</span><span class="pln">X</span><span class="pun">)</span><span class="pln">

</span><span class="com"># في حالة اكتشاف شذوذ سيتم وسمه بسالب واحد لتميزه</span><span class="pln">
predictions </span><span class="pun">=</span><span class="pln"> clf</span><span class="pun">.</span><span class="pln">predict</span><span class="pun">(</span><span class="pln">X</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">predictions</span><span class="pun">)</span><span class="pln">  </span><span class="com"># Output: [ 1  1  1  1 -1]</span></pre>

<h3 id="semisupervisedlearningalgorithms">
	خوارزميات التعلم الخاضع لإشراف جزئي
</h3>

<p>
	يستخدم التعلم الخاضع لإشراف جزئي Semi-supervised Learning بيانات تتكون من خليط من البيانات الموسومة Labeled data والبيانات غير الموسومة Unlabeled data أثناء التدريب، يمكن أن يصبح هذا الأسلوب مفيدًا للغاية عندما يكون من الصعب الحصول على بيانات موسومة كافية أو يحتاج الحصول عليها إلى وقت ومجهود ضخم.
</p>

<p>
	يستخدم عادة في ترشيح المحتوى في أنظمة التوصية فبعض البيانات قد تكون متوفرة بشكل صريح مثل تقييمات المستخدم للمنتجات والتي يمكن الاستدلال بها لاقتراح المزيد من العناصر، ولكن يمكن أيضًا الاستفادة من المعلومات غير الموسومة والمعروفة ضمنية من خلال تفاعلات المستخدم.
</p>

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

<h4 id="selftraining">
	خوراززميات التعلم الذاتي Self Training
</h4>

<p>
	يمكننا استخدام التعلم الذاتي Self Training في ساي كيت ليرن Scikit Learn لتحويل أي نموذج تصنيف تقليدي إلى نموذج يمكنه التدريب على البيانات الموسومة وغير الموسومة معًا، شريطة أن يكون النموذج قادرًا على توقع التصنيفات كاحتمالات، ونحتاج لاستخدام نموذج يسمى <code>SelfTrainingClassifier</code> لتحويل النماذج العادية لنماذج خاضعة لإشراف جزئي، لاحظ الكود التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9049_22" style=""><span class="kwd">from</span><span class="pln"> sklearn</span><span class="pun">.</span><span class="pln">tree </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">DecisionTreeClassifier</span><span class="pln">
</span><span class="kwd">from</span><span class="pln"> sklearn</span><span class="pun">.</span><span class="pln">semi_supervised </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">SelfTrainingClassifier</span><span class="pln">
</span><span class="com"># نعرف أي مصنف ليكون نموذج الأساس</span><span class="pln">
base_classifier </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DecisionTreeClassifier</span><span class="pun">()</span><span class="pln">
</span><span class="com"># نقوم بإحاطة نموذج الأساس ليصبح قادرًا على التعلم الذاتي</span><span class="pln">
self_training_model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">SelfTrainingClassifier</span><span class="pun">(</span><span class="pln">base_classifier</span><span class="pun">)</span><span class="pln">

</span><span class="com"># نقوم بتدريب النموذج مثل أي نموذج تقليدي</span><span class="pln">
self_training_model</span><span class="pun">.</span><span class="pln">fit</span><span class="pun">(</span><span class="pln">X_train</span><span class="pun">,</span><span class="pln"> y_train</span><span class="pun">)</span></pre>

<p data-gramm="false">
	<strong>ملاحظة</strong>:<strong> </strong>عند تجهيزنا لبيانات التدريب نحتاج لوسم البيانات غير الموسومة بقيمة <code>1-</code> حيث أننا لا نستطيع أن نمرر البيانات خلال النموذج وهي غير موسومة.
</p>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة الذكاء الاصطناعي
		</p>

		<p class="banner-subtitle">
			احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة.
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/artificial-intelligence" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<a href="https://academy.hsoub.com/learn/artificial-intelligence" rel=""><img alt="دورة الذكاء الاصطناعي AI" src="https://academy.hsoub.com/learn/assets/images/courses/artificial-intelligence.png"></a>
	</div>
</div>

<h2 id="modelselectionandevaluation">
	اختيار النموذج المناسب
</h2>

<p>
	قد يبدو اختيار النموذج المناسب في مكتبة ساي كيت ليرن معقدًا، إذ يمكن استخدام أكثر من خوارزمية لحل نفس المشكلة. ولكل خوارزمية معاملات تحكم مختلفة، لذلك يجب علينا استخدام أدوات تساعدنا في مقارنة النماذج وقياس أدائها. فيما يلي بعض المعايير الرئيسية التي يمكن استخدامها:
</p>

<ul>
	<li>
		<strong>الدقة Accuracy</strong>: عدد التوقعات الصحيحة التي توقعها النموذج مقسومًا على إجمالي البيانات. كلما كانت النسبة أعلى، كان النموذج أفضل
	</li>
	<li>
		<strong>خطأ المتوسط التربيعي Mean Squared Error</strong><span>: </span>الفرق بين القيمة الفعلية التي نريد التنبؤ بها والقيمة التي توقعها النموذج، ثم تربيع هذا الفرق. وهو يساعد في تحديد مدى دقة التوقعات
	</li>
	<li>
		<strong>بحث مصفوفة المعاملات GridSearch</strong><span>:</span> يستخدم لاختبار عدد من المعاملات أو إعدادات النماذج المختلفة دفعة واحدة والعثور على أفضل مجموعة معاملات تحقق أفضل أداء. تستهلك هذه الطريقة وقتًا وموارد حاسوبية كبيرة خاصة إذا كانت المعاملات كثيرة جدًا
	</li>
</ul>

<h2 id="scikitlearntensorflow">
	مقارنة بين ساي كيت ليرن Scikit Learn و تنسورفلو TensorFlow
</h2>

<p>
	يكمن الفرق الرئيسي بين تنسورفلو TensorFlow وبين ساي كيت ليرن Scikit Learn في تخصص الاستخدام، حيث أن ساي كيت ليرن مكتبة متخصصة بخوارزميات تعلم الآلة التقليدية Traditional Machine Learning بينما تنسورفلو TensorFlow إطار عمل شامل لتطوير وتشغيل نماذج التعلم العميق Deep Learning المبنية على الشبكات العصبية الاصطناعية.
</p>

<p>
	وعلى الرغم من إمكانية تدريب شبكات عصبية اصطناعية باستخدام ساي كيت ليرن فهي ليست محسنة لأجل هذا الغرض، إذ لا تستطيع المكتبة الاستفادة من وحدات المعالجة الرسومية GPUs التي تستطيع تسريع تدريب النماذج العميقة بشكل أفضل من وحدات المعالجة المركزية CPUs، بينما لا يقف دعم تنسورفلو TensorFlow عند استخدام GPU واحد، حيث يمكن توزيع التدريب على عدة أجهزة على التوازي وهو شيء صعب التحقيق باستخدام ساي كيت ليرن.
</p>

<h2 id="">
	الخلاصة
</h2>

<p>
	تعرفنا في هذه المقالة على مكتبة الذكاء الاصطناعي الشهيرة ساي كيت ليرن Scikit Learn وأبرز مميزاتها ووضحنا بعض التطبيقات الواسعة لخوارزميات التعلم المبنية بها، وكذلك تعرفنا على الفرق بينها وبين إطار العمل تنسورفلو TensorFlow.ننصح بتعلم استخدام هذه المكتبة وتجربتها في بناء وتطبيق نماذج تعلم آلة مخصصة، فهي توفر أدوات قوية ومرنة تمكنكم من تنفيذ حلول مبتكرة في مختلف مجالات الذكاء الاصطناعي.
</p>

<h2 id="-1">
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%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/" rel="">الذكاء الاصطناعي: دليلك الشامل</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A8%D9%86%D8%A7%D8%A1-%D9%85%D8%B5%D9%86%D9%81-%D8%A8%D8%A7%D9%84%D8%A7%D8%B9%D8%AA%D9%85%D8%A7%D8%AF-%D8%B9%D9%84%D9%89-%D8%B7%D8%B1%D9%82-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-%D8%A8%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-scikit-learn-r1266/" rel="">بناء مصنف بالاعتماد على طرق تعلم الآلة بلغة البايثون باستخدام مكتبة Scikit-Learn</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D9%85%D9%84%D9%81%D8%A7%D8%AA-csv-%D9%88%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-json-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r2388/" rel="">العمل مع ملفات CSV وبيانات JSON باستخدام لغة بايثون</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%AF%D8%B1%D9%8A%D8%A8-%D8%A7%D9%84%D9%85%D9%88%D8%B2%D8%B9-%D9%88%D9%85%D9%83%D8%AA%D8%A8%D8%A9-accelerate-%D9%84%D8%AA%D8%B3%D8%B1%D9%8A%D8%B9-%D8%AA%D8%AF%D8%B1%D9%8A%D8%A8-%D9%86%D9%85%D8%A7%D8%B0%D8%AC-%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-r2376/" rel="">استخدام التدريب الموزع ومكتبة Accelerate لتسريع تدريب نماذج الذكاء الاصطناعي</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2485</guid><pubDate>Tue, 07 Jan 2025 15:04:00 +0000</pubDate></item><item><title>&#x628;&#x646;&#x627;&#x621; &#x631;&#x648;&#x628;&#x648;&#x62A; &#x62F;&#x631;&#x62F;&#x634;&#x629; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x628;&#x627;&#x64A;&#x62B;&#x648;&#x646; &#x648; OpenAI API</title><link>https://academy.hsoub.com/programming/artificial-intelligence/%D8%A8%D9%86%D8%A7%D8%A1-%D8%B1%D9%88%D8%A8%D9%88%D8%AA-%D8%AF%D8%B1%D8%AF%D8%B4%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-%D9%88-openai-api-r2483/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2025_01/TerminalOpenAI(1).png.eb41dca0a5a34b1239d42823ff09bd37.png" /></p>
<p>
	أصبحت روبوتات الدردشة التفاعلية أكثر شيوعًا من ذي قبل، لما توفره من مساعدة للمستخدمين في حل المشكلات، وتوفير المعلومات، وتنفيذ المهام بسرعة وفعالية. ومع تطور تقنيات الذكاء الاصطناعي، أصبحت هذه الروبوتات أكثر ذكاءً، على سبيل المثال تتيح نماذج GPT التابعة لشركة OpenAI للمطورين إنشاء وكلاء محادثة Chat Agents يمكنها التحاور مع المستخدمين البشريين بلغتهم الطبيعية.
</p>

<p>
	سنشرح لكم في هذا المقال خطوات بناء ونشر بوت دردشة شخصي يعمل من خلال الطرفية Terminal باستخدام لغة البرمجة بايثون وواجهة برمجة التطبيقاتOpenAI <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr>، ونوضح طريقة نشره على خادم ديجتال أوشن يعمل بنظام أبونتو Ubuntu. وبتنفيذ كامل الخطوات الموضحة في فقرات المقال سيكون لدينا روبوت دردشة كامل الوظائف يمكنه التعامل مع استفسارات المستخدمين مباشرة من الطرفية بفعالية وكفاءة.
</p>

<h2 id="">
	المتطلبات الأساسية
</h2>

<p>
	قبل الدخول في شرح خطوات التنفيذ، يجب التأكد من توفر المتطلبات التالية:
</p>

<ol>
	<li>
		خادم DigitalOcean Droplet بذاكرة وصول عشوائي Ram لا تقل عن 4 جيجابايت ووحدتي معالجة مركزية CPU، للحصول على تعليمات الإعداد يمكن مطالعة مقال <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AA%D9%87%D9%8A%D8%A6%D8%A9-%D8%A7%D9%84%D8%A3%D9%88%D9%84%D9%8A%D8%A9-%D9%84%D8%AE%D8%A7%D8%AF%D9%85-%D8%A3%D9%88%D8%A8%D9%88%D9%86%D8%AA%D9%88-1804-r431/" rel="">التهيئة الأولية لخادم أوبونتو</a><span style="display: none;"> </span>
	</li>
	<li>
		نسخة بايثون Python 3.7 أو أعلى <a href="https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A8%D9%8A%D8%A6%D8%AA%D9%87-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D8%B9%D9%84%D9%89-%D8%AE%D8%A7%D8%AF%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1804-r709/" rel="">مثبتة على خادم Ubuntu</a> الخاص بك
	</li>
	<li>
		معرفة أساسية <a href="https://academy.hsoub.com/programming/python/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r1815/" rel="">بلغة البرمجة بايثون</a>
	</li>
	<li>
		حساب <a href="https://platform.openai.com/" rel="external nofollow">OpenAI</a> مع الوصول إلى الواجهات البرمجية <a href="https://platform.openai.com/account/api-keys" rel="external nofollow">OpenAI <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr></a>
	</li>
</ol>

<h2 id="-1">
	الخطوة الأولى: إعداد بيئة العمل
</h2>

<p>
	سنعمل بداية على إعداد بيئة العمل المخصصة لبناء ونشر روبوت ChatGPT الخاص بنا في الطرفية terminal على خادم ديجيتال أوشن DigitalOcean يعمل بنظام Ubuntu.
</p>

<h3 id="digitaloceandroplet">
	إنشاء خادم DigitalOcean Droplet
</h3>

<p>
	نسجل دخولنا إلى <a href="https://cloud.digitalocean.com/" rel="external nofollow">حساب في DigitalOcean</a>، ثم ننشئ خادم افتراضي Droplet باتباع الخطوات التالية:
</p>

<ul>
	<li>
		ننتقل إلى قسم Droplets
	</li>
	<li>
		ننقر على Create Droplet
	</li>
	<li>
		نختار نظام التشغيل Ubuntu ويفضل أحدث إصدار ذي دعم طويل الأمد LTS
	</li>
	<li>
		نختار الخطة المناسبة بناء على متطلبات تطبيقنا
	</li>
	<li>
		نحدد منطقة مركز البيانات data center ويفضل اختيار البلد الأقرب لبلدنا
	</li>
	<li>
		نضيف مفاتيح <a href="https://academy.hsoub.com/devops/security/ssh/%D9%85%D8%A7-%D9%87%D9%8A-%D8%AA%D9%82%D9%86%D9%8A%D8%A9-ssh%D8%9F-r793/" rel=""><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></a> الخاصة بنا للاتصال الآمن مع الخادم
	</li>
	<li>
		ننقر على Create Droplet
	</li>
</ul>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="165060" href="https://academy.hsoub.com/uploads/monthly_2025_01/1146970161_.png.874e084e3fa7e84f9d5afad921345884.png" rel=""><img alt="إنشاء الخادم" class="ipsImage ipsImage_thumbnailed" data-fileid="165060" data-unique="7u8yuxhvx" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_01/.thumb.png.6587cf6da8cfc465d5bc5ed8c15ccdf3.png"> </a>
</p>

<h3 id="droplet">
	الاتصال بخادم Droplet
</h3>

<p>
	نفتح الطرفية terminal على جهازنا المحلي، ثم نستخدم الأمر التالي لتسجيل الدخول إلى الخادم، مع الانتباه لاستبدال<code>&lt;your_droplet_ip&gt;</code> بعنوان IP لخادم Droplet الخاص بنا:
</p>

<pre class="ipsCode" id="ips_uid_4259_9">ssh root@&lt;your_droplet_ip&gt;
</pre>

<h3 id="-2">
	إعداد بيئة برمجة لغة بايثون
</h3>

<p>
	نشغل الأوامر التالية للتأكد من تحديث النظام:
</p>

<pre class="ipsCode">sudo apt update 
sudo apt upgrade
</pre>

<p>
	بعدها نثبت لغة بايثون python ومدير الحزم pip باستخدام الأمر التالي:
</p>

<pre class="ipsCode">sudo apt install python3 python3-pip
</pre>

<p>
	يفضل أن نثبت المكتبة <code>virtualenv</code> لتساعدنا على إنشاء بيئة افتراضية معزولة لتطبيقاتنا بكتابة الأمر التالي:
</p>

<pre class="ipsCode">sudo pip3 install virtualenv
</pre>

<p>
	ننتقل إلى الدليل المطلوب وننشئ مجلد المشروع:
</p>

<pre class="ipsCode" id="ips_uid_7497_14">mkdir my_chatgpt_bot 
cd my_chatgpt_bot
</pre>

<p>
	ثم ننشئ بيئة افتراضية ونفعّلها:
</p>

<pre class="ipsCode">virtualenv venv 
source venv/bin/activate
</pre>

<p>
	ولمعرفة المزيد عن كيفية إنشاء وإعداد بيئة برمجية بلغة بايثون ننصح بمطالعة مقال <a href="https://academy.hsoub.com/programming/python/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A8%D9%8A%D8%A6%D8%A9-%D8%A7%D9%84%D8%B9%D9%85%D9%84-%D9%84%D9%84%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D9%85%D8%B9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r1751/" rel="">إعداد بيئة العمل لمشاريع بايثون</a>
</p>

<h3 id="apikeyopenai">
	تكوين مفتاح الواجهة البرمجية
</h3>

<p>
	أولاً، نحصل على مفتاح <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> الخاص بنا من OpenAI، من خلال إنشاء حساب جديد أو تسجيل الدخول إلى <a href="https://platform.openai.com/account" rel="external nofollow">حسابنا في OpenAI</a>، ثم ننتقل إلى <a href="https://openai.com/index/openai-api/" rel="external nofollow">قسم <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr></a> للحصول على مفتاح الواجهة البرمجية <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> key.
</p>

<p>
	بعدها نحتاج لأن نخزن المفتاح الخاص بنا بأمان في متغير بيئة. نفتح ملف الإعدادات <code>bashrc.</code> أو <code>bash_profile.</code> ونضيف التعليمة التالية:
</p>

<pre class="ipsCode">export OPENAI_API_KEY='your-api-key-here'
</pre>

<p>
	نعيد تحميل متغيرات البيئة:
</p>

<pre class="ipsCode">source ~/.bashrc
</pre>

<p>
	نتأكد من تعيين متغير البيئة باستخدام الأمر التالي من الطرفية terminal:
</p>

<pre class="ipsCode">echo $OPENAI_API_KEY
</pre>

<p>
	بعد إعداد البيئة، يمكننا البدء في تطوير <a href="https://academy.hsoub.com/apps/web/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A8%D9%88%D8%AA-%D8%A7%D9%84%D9%85%D8%AD%D8%A7%D8%AF%D8%AB%D8%A9-%D8%A7%D9%84%D8%B0%D9%83%D9%8A-%D8%B4%D8%A7%D8%AA-%D8%AC%D9%8A-%D8%A8%D9%8A-%D8%AA%D9%8A-chatgpt-r863/" rel="">روبوت الدردشة ChatGPT</a> الخاص بنا. سنكتب في الخطوة التالية كود بوت الدردشة المخصص للتعامل مع استفسارات المستخدمين والتفاعل مع واجهة برمجة التطبيقات OpenAI <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr>.
</p>

<h2 id="chatgptbot">
	الخطوة الثانية: بناء روبوت الدردشة
</h2>

<p>
	الآن بعد أن أعددنا بيئتنا البرمجية، دعنا نبني روبوتنا الخاص. ستستخدم نموذج <code>gpt-3.5-turbo</code>، وستستخدم هنا ثلاث مكتبات أساسية للقيام بالمطلوب وهي openai للتفاعل مع واجهات برمجة التطبيقات الخاصة بشركة OpenAI و textract لاستخراج النصوص و glob للبحث عن الملفات. وفيما يلي تفصيل أكبر لكل مكتبة منها.
</p>

<h3 id="openai-1">
	مكتبة OpenAI
</h3>

<p>
	تعد شركة <a href="https://openai.com/" rel="external nofollow">OpenAI </a> مؤسسة رائدة في أبحاث الذكاء الاصطناعي وقد طورت واجهة برمجة تطبيقات قوية تسمح لنا بالتفاعل مع <a href="https://academy.hsoub.com/apps/web/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A8%D9%88%D8%AA-%D8%A7%D9%84%D9%85%D8%AD%D8%A7%D8%AF%D8%AB%D8%A9-%D8%A7%D9%84%D8%B0%D9%83%D9%8A-%D8%B4%D8%A7%D8%AA-%D8%AC%D9%8A-%D8%A8%D9%8A-%D8%AA%D9%8A-chatgpt-r863/" rel="">روبوت الدردشةChatGPT</a> الشهير. باستخدام واجهة برمجة تطبيقات OpenAI <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr>، يمكننا إرسال الأوامر والحصول على الردود من نموذج ChatGPT، مما يمكّننا من إنشاء روبوتات محادثة ذكية. يمكن مطالعة المزيد عن <a href="https://openai.com/" rel="external nofollow">OpenAI</a> و<a href="https://platform.openai.com/docs/overview" rel="external nofollow">نظرة عامة عنها</a> من خلال التوثيقات التي تقدمها.
</p>

<h3>
	مكتبة <span ipsnoautolink="true">textract</span>
</h3>

<p>
	تقدم مكتبة <a href="https://textract.readthedocs.io/en/stable/" rel="external nofollow">textract</a> بلغة بايثون إمكانية استخراج النصوص من تنسيقات ملفات مختلفة، بما في ذلك:
</p>

<ul>
	<li>
		التنسيقات النصية: TXT ،CSV ،JSON ،XML ،HTML ،Markdown ،LaTeX
	</li>
	<li>
		تنسيقات المستندات: DOC ،DOCX ،XLS ،XLSX ،PPT ،PPTX ،ODT ،ODS
	</li>
	<li>
		تنسيقات الكتب الإلكترونية: EPUB ،MOBI ،AZW ،FB2
	</li>
	<li>
		تنسيقات الصور مع نص مُضمّن: JPG ،PNG ،BMP ،GIF ،TIFF، و PDF سواء القابلة للبحث أو الممسوحة ضوئيًا
	</li>
	<li>
		ملفات الشيفرة البرمجية: Python ،C ،C++ ،Java ،JavaScript ،PHP ،Ruby وغيرها
	</li>
</ul>

<h3>
	مكتبة glob<span style="display: none;"> </span>
</h3>

<p>
	تسمح مكتبة <a href="https://docs.python.org/3/library/glob.html" rel="external nofollow">glob</a> المضمنة في بايثون بالبحث عن الملفات والمجلدات باستخدام مطابقة الأنماط patterns.فهي تبحث عن الملف أو المجلد الذي يطابق اسم أو امتداد معين، وسوف يستخدمها الروبوت لتوفير الإجابات بناءً على البيانات التي نغذيها على نظامنا المحلي أي في بنية الملفات الخاصة بجهازنا وسنستخدمها هنا للبحث داخل ملفات المجلد الفرعي <code>data</code> في مجلد المشروع الرئيسي الخاص بنا.
</p>

<p>
	سنحتاج بداية لتثبيت المكتبة <code>openai</code> و <code>textract</code>، لأنها ليست جزءًا من مكتبات بايثون الافتراضية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7497_26" style=""><span class="pln">pip install openai
pip install textract</span></pre>

<p>
	الآن، ننشئ ملف بايثون جديد لكتابة كود روبوت دردشة الخاص بنا، وسنسميه على سبيل المثال <code>mygptbot.py</code>، نستخدم الأمر التالي لإنشاء الملف باستخدام محرر الأكواد vim، ويمكن استخدام أي <a href="https://academy.hsoub.com/programming/python/%D9%85%D8%AD%D8%B1%D8%B1-%D8%A3%D9%83%D9%88%D8%A7%D8%AF-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86/" rel="">محرر أكواد بايثون</a> آخر.
</p>

<pre class="ipsCode" id="ips_uid_7497_28">vi mygptbot.py
</pre>

<p>
	نضيف التعليمات التالية داخل الملف:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7497_33" style=""><span class="kwd">import</span><span class="pln"> os 
</span><span class="kwd">import</span><span class="pln"> glob 
</span><span class="kwd">import</span><span class="pln"> openai 
</span><span class="kwd">import</span><span class="pln"> textract 

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Chatbot</span><span class="pun">:</span><span class="pln"> 
    </span><span class="kwd">def</span><span class="pln"> __init__</span><span class="pun">(</span><span class="pln">self</span><span class="pun">):</span><span class="pln"> 
        self</span><span class="pun">.</span><span class="pln">openai_api_key </span><span class="pun">=</span><span class="pln"> os</span><span class="pun">.</span><span class="pln">getenv</span><span class="pun">(</span><span class="str">"OPENAI_API_KEY"</span><span class="pun">)</span><span class="pln"> 
        self</span><span class="pun">.</span><span class="pln">chat_history </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[]</span><span class="pln"> 

    </span><span class="com"># تضيف رسالة المستخدم إلى سجل المحادثة المخزن في القائمة </span><span class="pln">
    </span><span class="kwd">def</span><span class="pln"> append_to_chat_history</span><span class="pun">(</span><span class="pln">self</span><span class="pun">,</span><span class="pln"> message</span><span class="pun">):</span><span class="pln"> 
        self</span><span class="pun">.</span><span class="pln">chat_history</span><span class="pun">.</span><span class="pln">append</span><span class="pun">(</span><span class="pln">message</span><span class="pun">)</span><span class="pln"> 

    </span><span class="kwd">def</span><span class="pln"> read_personal_file</span><span class="pun">(</span><span class="pln">self</span><span class="pun">,</span><span class="pln"> file_path</span><span class="pun">):</span><span class="pln"> 
        </span><span class="kwd">try</span><span class="pun">:</span><span class="pln"> 
            </span><span class="com"># تحويل محتوى الملفات إلى نص عادي</span><span class="pln">
            text </span><span class="pun">=</span><span class="pln"> textract</span><span class="pun">.</span><span class="pln">process</span><span class="pun">(</span><span class="pln">file_path</span><span class="pun">).</span><span class="pln">decode</span><span class="pun">(</span><span class="str">"utf-8"</span><span class="pun">)</span><span class="pln">  
            </span><span class="kwd">return</span><span class="pln"> text 
        </span><span class="kwd">except</span><span class="pln"> </span><span class="typ">Exception</span><span class="pln"> </span><span class="kwd">as</span><span class="pln"> e</span><span class="pun">:</span><span class="pln"> 
            </span><span class="kwd">print</span><span class="pun">(</span><span class="pln">f</span><span class="str">"Error reading file {file_path}: {e}"</span><span class="pun">)</span><span class="pln"> 
            </span><span class="kwd">return</span><span class="pln"> </span><span class="str">""</span><span class="pln"> 

    </span><span class="com"># جمع البيانات الشخصية المحلية لتغذية النموذج </span><span class="pln">
    </span><span class="kwd">def</span><span class="pln"> collect_user_data</span><span class="pun">(</span><span class="pln">self</span><span class="pun">):</span><span class="pln"> 
        data_directory </span><span class="pun">=</span><span class="pln"> </span><span class="str">"./data"</span><span class="pln"> 
        data_files </span><span class="pun">=</span><span class="pln"> glob</span><span class="pun">.</span><span class="pln">glob</span><span class="pun">(</span><span class="pln">os</span><span class="pun">.</span><span class="pln">path</span><span class="pun">.</span><span class="pln">join</span><span class="pun">(</span><span class="pln">data_directory</span><span class="pun">,</span><span class="pln"> </span><span class="str">"*.*"</span><span class="pun">))</span><span class="pln"> 
        </span><span class="com"># تستخدم الدالة السابقة لاسترجاع قائمة بمسارات الملفات التي تتطابق مع نمط محدد داخل مجلد معين. </span><span class="pln">
        </span><span class="com"># في هذه الحالة النمط هو "*.*"، والتي تتطابق مع جميع الملفات بأي امتداد. </span><span class="pln">
        user_data </span><span class="pun">=</span><span class="pln"> </span><span class="str">""</span><span class="pln"> 
        </span><span class="kwd">for</span><span class="pln"> file </span><span class="kwd">in</span><span class="pln"> data_files</span><span class="pun">:</span><span class="pln"> 
            file_extension </span><span class="pun">=</span><span class="pln"> os</span><span class="pun">.</span><span class="pln">path</span><span class="pun">.</span><span class="pln">splitext</span><span class="pun">(</span><span class="pln">file</span><span class="pun">)[</span><span class="lit">1</span><span class="pun">].</span><span class="pln">lower</span><span class="pun">()</span><span class="pln">
            </span><span class="com"># التحقق من امتداد الملف  </span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> file_extension </span><span class="kwd">in</span><span class="pln"> </span><span class="pun">(</span><span class="str">".pdf"</span><span class="pun">,</span><span class="pln"> </span><span class="str">".docx"</span><span class="pun">,</span><span class="pln"> </span><span class="str">".xlsx"</span><span class="pun">,</span><span class="pln"> </span><span class="str">".xls"</span><span class="pun">):</span><span class="pln">
                </span><span class="com"># تحويل محتوى الملفات إلى نص عادي وإضافته </span><span class="pln">
                user_data </span><span class="pun">+=</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">read_personal_file</span><span class="pun">(</span><span class="pln">file</span><span class="pun">)</span><span class="pln"> 
            </span><span class="kwd">else</span><span class="pun">:</span><span class="pln"> 
                </span><span class="com"># تساعد الشيفرة التالية فى التعامل مع الملفات و تبسيط معالجة الاستثناءات</span><span class="pln">
                </span><span class="com"># حيث تقرأ محتوى الملف و تخزنه داخل المتغير</span><span class="pln">
                </span><span class="kwd">with</span><span class="pln"> open</span><span class="pun">(</span><span class="pln">file</span><span class="pun">,</span><span class="pln"> </span><span class="str">"r"</span><span class="pun">,</span><span class="pln"> encoding</span><span class="pun">=</span><span class="str">"utf-8"</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">as</span><span class="pln"> f</span><span class="pun">:</span><span class="pln"> 
                    user_data </span><span class="pun">+=</span><span class="pln"> f</span><span class="pun">.</span><span class="pln">read</span><span class="pun">()</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">"\n"</span><span class="pln"> 
        </span><span class="kwd">return</span><span class="pln"> user_data 

        </span><span class="kwd">def</span><span class="pln"> create_chat_response</span><span class="pun">(</span><span class="pln">self</span><span class="pun">,</span><span class="pln"> message</span><span class="pun">):</span><span class="pln"> 
            </span><span class="com"># تضيف رسالة المستخدم إلى سجل المحادثة المخزن في قائمة </span><span class="pln">
            self</span><span class="pun">.</span><span class="pln">append_to_chat_history</span><span class="pun">(</span><span class="pln">message</span><span class="pun">)</span><span class="pln"> 
            chat_history</span><span class="pun">.</span><span class="pln"> user_data </span><span class="pun">=</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">collect_user_data</span><span class="pun">()</span><span class="pln"> 
            messages </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> 
                </span><span class="com"># توفير رسائل تعليمات عالية المستوى أو رسائل تحديد السياق </span><span class="pln">
                </span><span class="pun">{</span><span class="str">"role"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"system"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"content"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"You are the most helpful assistant."</span><span class="pun">},</span><span class="pln"> 
                </span><span class="com"># يمثل دور المستخدم  الرسائل أو الاستفسارات من المستخدم </span><span class="pln">
                </span><span class="pun">{</span><span class="str">"role"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"user"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"content"</span><span class="pun">:</span><span class="pln"> message</span><span class="pun">},</span><span class="pln"> 
                </span><span class="com"># يمثل دور المساعد الردود التي ينتجها النموذج  </span><span class="pln">
                </span><span class="pun">{</span><span class="str">"role"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"assistant"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"content"</span><span class="pun">:</span><span class="pln"> message</span><span class="pun">},</span><span class="pln"> 
            </span><span class="pun">]</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> user_data</span><span class="pun">:</span><span class="pln"> 
                messages</span><span class="pun">.</span><span class="pln">append</span><span class="pun">({</span><span class="str">"role"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"user"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"content"</span><span class="pun">:</span><span class="pln"> user_data</span><span class="pun">})</span><span class="pln">

            </span><span class="com"># الدالة الرئيسية التي تشغل النموذج على المعطيات المحددة  </span><span class="pln">
            response </span><span class="pun">=</span><span class="pln"> openai</span><span class="pun">.</span><span class="typ">ChatCompletion</span><span class="pun">.</span><span class="pln">create</span><span class="pun">(</span><span class="pln"> 
                model</span><span class="pun">=</span><span class="str">"gpt-3.5-turbo"</span><span class="pun">,</span><span class="pln"> 
                messages</span><span class="pun">=</span><span class="pln">messages</span><span class="pun">,</span><span class="pln"> 
                temperature</span><span class="pun">=</span><span class="lit">0.7</span><span class="pun">,</span><span class="pln"> 
                max_tokens</span><span class="pun">=</span><span class="lit">256</span><span class="pun">,</span><span class="pln"> 
                top_p</span><span class="pun">=</span><span class="lit">0.9</span><span class="pun">,</span><span class="pln"> 
                n</span><span class="pun">=</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> 
                stop</span><span class="pun">=</span><span class="kwd">None</span><span class="pun">,</span><span class="pln"> 
                frequency_penalty</span><span class="pun">=</span><span class="lit">0.9</span><span class="pun">,</span><span class="pln"> 
                presence_penalty</span><span class="pun">=</span><span class="lit">0.9</span><span class="pln"> 
            </span><span class="pun">)</span><span class="pln">  
            self</span><span class="pun">.</span><span class="pln">append_to_chat_history</span><span class="pun">(</span><span class="pln">response</span><span class="pun">.</span><span class="pln">choices</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">message</span><span class="pun">.</span><span class="pln">content</span><span class="pun">.</span><span class="pln">strip</span><span class="pun">())</span><span class="pln"> 
            </span><span class="com"># إضافة الردود المولدة بواسطة النموذج إلى ذاكرة الروبوت أو سجل المحادثة لجعل الروبوت أكثر تفاعلاً وذكاءً </span><span class="pln">
            </span><span class="kwd">return</span><span class="pln"> response</span><span class="pun">.</span><span class="pln">choices</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">message</span><span class="pun">.</span><span class="pln">content</span><span class="pun">.</span><span class="pln">strip</span><span class="pun">()</span><span class="pln"> 

    </span><span class="kwd">def</span><span class="pln"> start_chatting</span><span class="pun">(</span><span class="pln">self</span><span class="pun">):</span><span class="pln"> 
        </span><span class="kwd">while</span><span class="pln"> </span><span class="kwd">True</span><span class="pun">:</span><span class="pln"> 
            user_input </span><span class="pun">=</span><span class="pln"> input</span><span class="pun">(</span><span class="str">"user:  "</span><span class="pun">)</span><span class="pln"> 
            </span><span class="kwd">if</span><span class="pln"> user_input</span><span class="pun">.</span><span class="pln">lower</span><span class="pun">()</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="str">"exit"</span><span class="pun">:</span><span class="pln"> 
                </span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Chatbot: Goodbye boss, have a wonderful day ahead!"</span><span class="pun">)</span><span class="pln"> 
                </span><span class="kwd">break</span><span class="pln"> 
            bot_response </span><span class="pun">=</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">create_chat_response</span><span class="pun">(</span><span class="pln">user_input</span><span class="pun">)</span><span class="pln"> 
            </span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Chatbot: "</span><span class="pun">,</span><span class="pln"> bot_response</span><span class="pun">)</span><span class="pln"> 


</span><span class="com"># إنشاء نسخة من الصنف المُعرف وبدء المحادثة </span><span class="pln">
chatbot </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Chatbot</span><span class="pun">()</span><span class="pln"> 
chatbot</span><span class="pun">.</span><span class="pln">start_chatting</span><span class="pun">()</span></pre>

<p>
	لنشرح معاملات النموذج المستخدمة في الكود أعلاه بإيجاز:
</p>

<ul>
	<li>
		<p>
			<strong>درجة الحرارة <code>temperature</code></strong>: يتحكم هذا المعامل في دقة أو عشوائية الردود المولدة. وتتراوح قيمته من 0 إلى 2، فالقيم الكبيرة تجعل الردود الناتجة أكثر إبداعًا وتنوعًا وعشوائية، بينما القيم الأقل تجعلها محددة وأكثر تركيزًا ودقة
		</p>
	</li>
	<li>
		<p>
			<strong>أقصى عدد للوحدات اللغوية <code>max_tokens</code></strong>: يحدد العدد الأقصى للوحدات اللغوية tokens المكوِّنة للرد وبالتالى تحد من طول الرد الذي يولده النموذج. إذا كان مصطلح الوحدات اللغوية tokens جديدًا ننصح بالإطلاع على <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D8%B3%D8%AA%D9%83%D8%B4%D9%81-%D9%85%D8%B5%D8%B7%D9%84%D8%AD%D8%A7%D8%AA-%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-%D8%A7%D9%84%D8%AA%D9%88%D9%84%D9%8A%D8%AF%D9%8A-r2399/" rel="">مقال مصطلحات تتعلق بآلية عمل الذكاء الاصطناعي</a>.
		</p>
	</li>
	<li>
		<p>
			<strong>المعامل <code>top_p</code><span>: </span></strong>يحدد الحد التراكمي للاحتمالات عند اختيار الرمز التالي أثناء توليد الذكاء الاصطناعي للاستجابات. فبدلاً من النظر إلى جميع الخيارات الممكنة، يستخدم النموذج <code>top_p</code> ويركز فقط على الكلمات الأكثر احتمالاً التي تشكل نسبة معينة من إجمالي الاحتمالات. على سبيل المثال، عند ضبطه بالقيمة 0.3، سيأخذ النموذج في الاعتبار فقط أصغر مجموعة من الكلمات التي تشكل 30% من مجموع الاحتمالات الكلي. هذا يقلل من احتمال اختيار كلمات أقل أهمية أو غير مناسبة، مما يؤدي إلى توليد استجابات أدق
		</p>
	</li>
</ul>

<p>
	<strong>ملاحظة:</strong> تنصح وثائق OpenAI بتغيير قيمة <code>top_p</code> أو<code>temperature</code> ولكن ليس كلاهما
</p>

<ul>
	<li>
		<p>
			<strong>عدد الردود المولدة <code>n</code></strong><span>:</span> يحدد هذا المعامل عدد الردود المختلفة التي ينتجها النموذج، مما يساعد على توليد ردود مختلفة واستكشاف احتمالات جديدة
		</p>
	</li>
	<li>
		<p>
			<strong>عبارة الإيقاف <code>Stop</code></strong><span>: </span>يحدد عبارة إيقاف أو أكثر للإشارة إلى نهاية الرد وإيقاف توليد المزيد من الوحدات اللغوية tokens
		</p>
	</li>
	<li>
		<p>
			<strong>عقوبة كثرة تكرار نفس الكلمات <code>frequency_penalty</code></strong>: يتحكم في احتمالية تكرار النموذج لنفس الكلمة أكثر من مرة في الرد الواحد، تتراوح قيمته بين -2.0 و 2.0، فالقيم الموجبة تعاقب النموذج على معدل تكرار نفس الكلمات والعبارات مما يقلل من تكرار نفس الكلام فى الردود المولدة
		</p>
	</li>
	<li>
		<p>
			<strong>عقوبة استخدام كلمات موجودة مسبقاً <code>presence_penalty</code> </strong>يتحكم في مدى استخدام النموذج لكلمة تكررت في المحادثة ككل، تتراوح قيمته بين -2.0 و 2.0، فالقيم الموجبة تعاقب النموذج عند استخدام كلمات أو عبارات سبق أن ظهرت في المحادثة، هذا يشجع النموذج على استكشاف مواضيع جديدة أو تقديم أفكار جديدة بدلاً من تكرار نفسه
		</p>
	</li>
</ul>

<p>
	يمكن العثور على المزيد من المعلومات لتحسين هذه المعاملات في <a href="https://platform.openai.com/docs/api-reference/chat" rel="external nofollow">الوثائق الخاصة بالواجهة البرمجية OpenAI <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr>.</a>
</p>

<p>
	لنشرح الآن أهم الدوال المستخدمة المستخدمة في الكود:
</p>

<ul>
	<li>
		تضيف الدالة ‎<code>append_to_chat_history(message) </code>رسالة المستخدم إلى سجل المحادثة المخزن في قائمة
	</li>
	<li>
		تستخرج الدالة <code>chat_history.read_personal_file(file_path)</code>النص من الملفات الشخصية. وبعدها تحاول فك تشفير النص المستخرج باستخدام ترميز UTF-8 وتعرض رسالة خطأ إذا حدثت أخطاء أثناء عملية الاستخراج
	</li>
	<li>
		تجمع الدالة <code>()collect_user_data</code> البيانات الخاصة بالمستخدم والمخزنة في مجلد <code>data</code> الموجود داخل مجلد العمل الحالي. فهي تمر على كافة الملفات في المجلد ثم تحدد أنواع الملفات، وتستخدم الطريقة المناسبة لاستخراج النصوص من الملف وتعيد البيانات التي جمعتها كسلسلة نصية string فى النهاية
	</li>
	<li>
		تسترجع الدالة <code>glob.glob(os.path.join(data_directory, “_._”))‎</code> قائمة بمسارات الملفات التى توافق نمط pattern معين في المجلد المعطى، وهي هنا تعثر على أي ملف بأي امتداد داخل المجلد
	</li>
	<li>
		تنشئ الدالة <code>create_chat_response(message)</code> استجابة باستخدام واجهة برمجة التطبيقات <a href="https://platform.openai.com/docs/guides/text-generation" rel="external nofollow">OpenAI ChatCompletion <abbr title="Application Programming Interface | واجهة برمجية">API</abbr></a>. حيث تضيف رسالة المستخدم والبيانات المجمعة عنه إذا كانت موجودة إلى قائمة الرسائل، ثم تستدعي الواجهة البرمجية باستخدام الرسائل المقدمة. بعد ذلك، تخزّن الرد في متغير، ثم تضيفه لسجل المحادثة قبل إرجاعه
	</li>
	<li>
		تبدأ الدالة <code>()start_chatting</code> جلسة محادثة تفاعلية مع المستخدم. حيث تطلب منه المستخدم إدخال المُوجّه prompt، ثم تولد الاستجابة باستخدام دالة <code>create_chat_response </code>وتطبعها. تستمر المحادثة في طلب إدخال الموجه من المستخدم من خلال حلقة تكرارية while True حتى يكتب المستخدم exit للخروج.
	</li>
</ul>

<h2 id="gptterminal">
	الخطوة الثالثة: تشغيل روبوت الدردشة في الطرفية
</h2>

<p>
	ستحتاج إلى فتح وحدة التحكم في خادم Droplet الخاصة بنا، وتشغيل ملف بايثون بواسطة الأمر التالي:
</p>

<pre class="ipsCode">python chatGPTbot.py
</pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="165061" href="https://academy.hsoub.com/uploads/monthly_2025_01/577489164_.png.e7de05196388af16d33ba4e84638553c.png" rel=""><img alt="تشغيل البوت" class="ipsImage ipsImage_thumbnailed" data-fileid="165061" data-unique="e8lp8674n" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_01/.thumb.png.9ae58fd808ef148563385129e69d5813.png"> </a>
</p>

<p>
	بهذه الطريقة، يمكننا التفاعل بسهولة مع بوت ChatGPT واستخدامه للقيام بمهام متعددة، وطرح الأسئلة، والكثير من الأمور الأخرى. إن بوت ChatGPT الشخصي الخاص بنا جاهز الآن للدردشة. دعونا نبدأ بالتفاعل معه عن طريق إدخال الرسائل ونختبر هل سيرد البوت وفقًا لذلك. عندما ننتهي، نكتب exit لإنهاء المحادثة.
</p>

<h2 id="-4">
	الخاتمة
</h2>

<p>
	شرحنا في مقال اليوم كيفية إنشاء ونشر بوت ChatGPT باستخدام لغة البرمجة بايثون Python. يتيح هذا البوت تضمين البيانات الشخصية للمستخدم من تنسيقات ملفات مختلفة، ويوفر تجربة مستخدم مخصصة، كما يمكننا دمجه مع منصات أخرى أو بناء روبوت دردشة قائم على الويب. فمع تعدد استخدامات ChatGPT وبساطة لغة بايثون، سيكون أمامنا احتمالات لا حصر لها ونتمكن بسهولة تخصيص وتحسين قدرات البوت الخاص بنا ليوافق متطلباتنا.
</p>

<p>
	ترجمة وبتصرف للمقال <a href="https://www.digitalocean.com/community/tutorials/openai-terminal-chatbot" rel="external nofollow">Build and Deploy Your Personal Terminal ChatGPT Bot in Python with OpenAI APIs</a> لكاتبه <a href="https://www.digitalocean.com/community/users/asinghwalia" rel="external nofollow">Anish Singh Walia</a>
</p>

<h2 id="-5">
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/python/%D8%A8%D9%86%D8%A7%D8%A1-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-%D9%8A%D8%AC%D9%8A%D8%A8-%D8%B9%D9%84%D9%89-%D8%A3%D8%B3%D8%A6%D9%84%D8%A9-%D9%85%D9%84%D9%81-pdf-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%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-r2265/" rel="">بناء تطبيق بايثون يجيب على أسئلة ملف PDF باستخدام الذكاء الاصطناعي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%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/" rel="">الذكاء الاصطناعي: دليلك الشامل</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%88%D9%83%D9%84%D8%A7%D8%A1-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%AD%D9%88%D9%84%D8%A7%D8%AA-transformers-agents-%D9%81%D9%8A-%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-%D8%A7%D9%84%D8%AA%D9%88%D9%84%D9%8A%D8%AF%D9%8A-r2379/" rel="">استخدام وكلاء مكتبة المحولات Transformers Agents في الذكاء الاصطناعي التوليدي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%83%D9%84-%D9%85%D8%A7-%D8%AA%D9%88%D8%AF-%D9%85%D8%B9%D8%B1%D9%81%D8%AA%D9%87-%D8%B9%D9%86-%D8%AF%D8%B1%D8%A7%D8%B3%D8%A9-%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-r2362/" rel="">كل ما تود معرفته عن دراسة الذكاء الاصطناعي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D8%B3%D8%AA%D9%83%D8%B4%D9%81-%D9%85%D8%B5%D8%B7%D9%84%D8%AD%D8%A7%D8%AA-%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-%D8%A7%D9%84%D8%AA%D9%88%D9%84%D9%8A%D8%AF%D9%8A-r2399/" rel="">استكشف مصطلحات الذكاء الاصطناعي التوليدي</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2483</guid><pubDate>Mon, 06 Jan 2025 15:03:01 +0000</pubDate></item><item><title>&#x628;&#x646;&#x627;&#x621; &#x646;&#x645;&#x627;&#x630;&#x62C; &#x645;&#x62E;&#x635;&#x635;&#x629; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x645;&#x643;&#x62A;&#x628;&#x629; Transformers &#x641;&#x64A; Hugging Face</title><link>https://academy.hsoub.com/programming/artificial-intelligence/%D8%A8%D9%86%D8%A7%D8%A1-%D9%86%D9%85%D8%A7%D8%B0%D8%AC-%D9%85%D8%AE%D8%B5%D8%B5%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-transformers-%D9%81%D9%8A-hugging-face-r2481/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2025_01/Transformers_.png.46266bae1730455ae274692ee30998f5.png" /></p>
<p>
	صُمِّمت مكتبة المحوّلات Transformers المتخصصة في بناء نماذج الذكاء الاصطناعي من منصة Huggingface بحيث يمكن توسيعها بسهولة، وتُكتَب النماذج Models بالكامل في مجلد فرعي محدَّد من المستودع بدون تجريد أو إخفاء لأي من تفاصيل العمل، لذا يمكننا بسهولة نسخ أي ملف نموذج وتعديله وفقًا لاحتياجاتنا. وإذا أردنا كتابة نموذج Model جديد خاص بنا، فيمكن البدء بالنموذج من الصفر.
</p>

<p>
	سنوضّح في هذا المقال كيفية كتابة نموذج مخصَّص وضبطه Configuration لنتمكّن من استخدامه بشكل يتوافق مع <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%AD%D9%88%D9%91%D9%84%D8%A7%D8%AA-transformers-%D9%85%D9%86-%D9%85%D9%86%D8%B5%D8%A9-hugging-face-r2340/" rel="">مكتبة المحوّلات Transformers</a>، وسنوضّح كيفية مشاركته مع المجتمع مع شيفرته البرمجية ليتمكن أي شخص من استخدامه، حتى إن لم يكن موجودًا في مكتبة المحوّلات Transformers، حيث سنرى كيفية إضافة أو تعديل الوظائف التي يقدمها إطار العمل الافتراضي في مكتبة Transformers باستخدام أدوات برمجية كالخطافات Hooks والشيفرة البرمجية الخاصة بنا. سنستخدم في هذا المقال نموذج ResNet الذي هو جزء من المكتبة <a href="https://github.com/huggingface/pytorch-image-models" rel="external nofollow"><code>timm</code></a> ونعدّله ليعمل كجزء من مكتبة Transformers وسنغلفه ضمن النموذج<code> </code><a href="https://huggingface.co/docs/transformers/v4.44.2/en/main_classes/model#transformers.PreTrainedModel" rel="external nofollow"><code>PreTrainedModel</code></a> الذي يعد أساس جميع النماذج في Transformers.
</p>

<h2 id="configuration">
	كتابة ضبط Configuration مخصص
</h2>

<p>
	عند إنشاء نموذج في مكتبة Transformers، يجب علينا أولاً إعداد كائن ضبط النموذج، فضبط النموذج هو كائن يحتوي على جميع المعلومات الضرورية لبناء النموذج، ولا يمكن للنموذج أن يأخذ إلا الكائن <code>config</code> لتهيئته كما سنرى في القسم التالي، لذا يجب أن يكون هذا الكائن مكتملًا قدر الإمكان.
</p>

<p>
	<strong>ملاحظة</strong>: لا حاجة لتمرير كل وسيط بشكل فردي عند إنشاء النموذج، حيث تتبع النماذج في مكتبة المحوّلات Transformers منهجية تمرير كائن واحد <code>config</code> إلى التابع <code>__init__</code> الخاص بالنموذج. بعد ذلك، يُمرَّر هذا الكائن بالكامل إلى الطبقات الفرعية للنموذج بدلاً من تقسيمه إلى عدة وسطاء. هذا يجعل الشيفرة البرمجية بسيطة ومنظمة من خلال الاحتفاظ بجميع الإعدادات في مكان واحد يسهل الوصول إليه، كما يساهم هذا النهج في تحسين قابلية إعادة استخدام الشيفرة البرمجية مع نماذج أخرى في مكتبة المُحوِّلات.
</p>

<h3 id="">
	إنشاء كائن ضبط النموذج
</h3>

<p>
	سنأخذ في المثال التالي، بعض الإعدادات أو الوسطاء من الصنف <code>ResNet</code> والتي نرغب في تعديلها. بعد ذلك، ستوفر عمليات الضبط المختلفة أنواعًا متنوعة من أصناف <code>ResNet</code> المحتملة. ثم سنُخزّن هذه الوسطاء بعد التحقق من صحتها.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9732_8" style=""><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">PretrainedConfig</span><span class="pln">
</span><span class="kwd">from</span><span class="pln"> typing </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">List</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ResnetConfig</span><span class="pun">(</span><span class="typ">PretrainedConfig</span><span class="pun">):</span><span class="pln">
    model_type </span><span class="pun">=</span><span class="pln"> </span><span class="str">"resnet"</span><span class="pln">

    </span><span class="kwd">def</span><span class="pln"> __init__</span><span class="pun">(</span><span class="pln">
        self</span><span class="pun">,</span><span class="pln">
        block_type</span><span class="pun">=</span><span class="str">"bottleneck"</span><span class="pun">,</span><span class="pln">
        layers</span><span class="pun">:</span><span class="pln"> </span><span class="typ">List</span><span class="pun">[</span><span class="pln">int</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">],</span><span class="pln">
        num_classes</span><span class="pun">:</span><span class="pln"> int </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">,</span><span class="pln">
        input_channels</span><span class="pun">:</span><span class="pln"> int </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln">
        cardinality</span><span class="pun">:</span><span class="pln"> int </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln">
        base_width</span><span class="pun">:</span><span class="pln"> int </span><span class="pun">=</span><span class="pln"> </span><span class="lit">64</span><span class="pun">,</span><span class="pln">
        stem_width</span><span class="pun">:</span><span class="pln"> int </span><span class="pun">=</span><span class="pln"> </span><span class="lit">64</span><span class="pun">,</span><span class="pln">
        stem_type</span><span class="pun">:</span><span class="pln"> str </span><span class="pun">=</span><span class="pln"> </span><span class="str">""</span><span class="pun">,</span><span class="pln">
        avg_down</span><span class="pun">:</span><span class="pln"> bool </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">False</span><span class="pun">,</span><span class="pln">
        </span><span class="pun">**</span><span class="pln">kwargs</span><span class="pun">,</span><span class="pln">
    </span><span class="pun">):</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> block_type </span><span class="kwd">not</span><span class="pln"> </span><span class="kwd">in</span><span class="pln"> </span><span class="pun">[</span><span class="str">"basic"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"bottleneck"</span><span class="pun">]:</span><span class="pln">
            </span><span class="kwd">raise</span><span class="pln"> </span><span class="typ">ValueError</span><span class="pun">(</span><span class="pln">f</span><span class="str">"`block_type` must be 'basic' or bottleneck', got {block_type}."</span><span class="pun">)</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> stem_type </span><span class="kwd">not</span><span class="pln"> </span><span class="kwd">in</span><span class="pln"> </span><span class="pun">[</span><span class="str">""</span><span class="pun">,</span><span class="pln"> </span><span class="str">"deep"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"deep-tiered"</span><span class="pun">]:</span><span class="pln">
            </span><span class="kwd">raise</span><span class="pln"> </span><span class="typ">ValueError</span><span class="pun">(</span><span class="pln">f</span><span class="str">"`stem_type` must be '', 'deep' or 'deep-tiered', got {stem_type}."</span><span class="pun">)</span><span class="pln">

        self</span><span class="pun">.</span><span class="pln">block_type </span><span class="pun">=</span><span class="pln"> block_type
        self</span><span class="pun">.</span><span class="pln">layers </span><span class="pun">=</span><span class="pln"> layers
        self</span><span class="pun">.</span><span class="pln">num_classes </span><span class="pun">=</span><span class="pln"> num_classes
        self</span><span class="pun">.</span><span class="pln">input_channels </span><span class="pun">=</span><span class="pln"> input_channels
        self</span><span class="pun">.</span><span class="pln">cardinality </span><span class="pun">=</span><span class="pln"> cardinality
        self</span><span class="pun">.</span><span class="pln">base_width </span><span class="pun">=</span><span class="pln"> base_width
        self</span><span class="pun">.</span><span class="pln">stem_width </span><span class="pun">=</span><span class="pln"> stem_width
        self</span><span class="pun">.</span><span class="pln">stem_type </span><span class="pun">=</span><span class="pln"> stem_type
        self</span><span class="pun">.</span><span class="pln">avg_down </span><span class="pun">=</span><span class="pln"> avg_down
        super</span><span class="pun">().</span><span class="pln">__init__</span><span class="pun">(**</span><span class="pln">kwargs</span><span class="pun">)</span></pre>

<p>
	الأمور الثلاثة المهمة التي يجب تذكرها عند كتابة الضبط الخاص بنا هي كالتالي:
</p>

<ul>
	<li>
		يجب أن يرث الصنف المخصص<code> ResnetConfig</code> من الصنف الأب <code>PretrainedConfig</code>
	</li>
	<li>
		يجب أن يقبل التابع <code>__init__</code> من الصنف المخصص أي وسطاء <code>kwargs</code>
	</li>
	<li>
		يجب تمرير هذه الوسطاء <code>kwargs</code> إلى الصنف الأب للتابع <code>__init__</code>
	</li>
</ul>

<p>
	تعني الوراثة Inheritance التأكد من الحصول على جميع الوظائف من مكتبة المحوّلات Transformers، ويمثّل القيدان الآخران احتواء الصنف <code>PretrainedConfig</code> على حقول أكثر من الحقول التي نضبطها، ويجب أن يقبل ضبطنا كافة هذه الحقول ثم تُرسَل إلى الصنف الأب عند إعادة تحميل الضبط باستخدام التابع <code>from_pretrained</code>.
</p>

<p>
	لا يُعَد تحديد السمة <code>model_type</code> للضبط الخاص بنا بالقيمة <code>model_type="resnet"‎</code> هنا إلزاميًا، إلا إذا أردنا تسجيل نموذجنا في الأصناف التلقائية Auto Classes كما سنوضح لاحقًا. يمكننا بعد ذلك إنشاء وحفظ الضبط الخاص بنا بسهولة كما نفعل مع أي ضبط نموذج آخر للمكتبة. لاحظ المثال التالي الذي يوضّح كيفية إنشاء الضبط <code>resnet50d</code> وحفظه:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9732_10" style=""><span class="pln">resnet50d_config </span><span class="pun">=</span><span class="pln"> </span><span class="typ">ResnetConfig</span><span class="pun">(</span><span class="pln">block_type</span><span class="pun">=</span><span class="str">"bottleneck"</span><span class="pun">,</span><span class="pln"> stem_width</span><span class="pun">=</span><span class="lit">32</span><span class="pun">,</span><span class="pln"> stem_type</span><span class="pun">=</span><span class="str">"deep"</span><span class="pun">,</span><span class="pln"> avg_down</span><span class="pun">=</span><span class="kwd">True</span><span class="pun">)</span><span class="pln">
resnet50d_config</span><span class="pun">.</span><span class="pln">save_pretrained</span><span class="pun">(</span><span class="str">"custom-resnet"</span><span class="pun">)</span></pre>

<p>
	سيؤدي هذا لحفظ ملف بالاسم <code>config.json</code> ضمن المجلد <code>custom-resnet</code>، يمكننا بعدها إعادة تحميل ملف الضبط الخاص باستخدام التابع <code>from_pretrained</code> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9732_12" style=""><span class="pln">resnet50d_config </span><span class="pun">=</span><span class="pln"> </span><span class="typ">ResnetConfig</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="str">"custom-resnet"</span><span class="pun">)</span></pre>

<p>
	ويمكننا أيضًا استخدام أي تابع آخر من الصنف <a href="https://huggingface.co/docs/transformers/v4.44.2/en/main_classes/configuration#transformers.PretrainedConfig" rel="external nofollow"><code>PretrainedConfig</code></a> مثل التابع <a href="https://huggingface.co/docs/transformers/v4.44.2/en/main_classes/model#transformers.utils.PushToHubMixin.push_to_hub" rel="external nofollow"><code>push_to_hub()‎</code></a> لرفع الضبط الخاص بنا إلى المستودع Hub مباشرة.
</p>

<h2 id="-1">
	كتابة نموذج مخصص
</h2>

<p>
	أصبح لدينا ضبط مخصص لنموذجنا <code>ResNet</code>، ويمكننا الآن كتابة النموذج نفسه، حيث سنكتب نموذجين الأول يستخرج الميزات المخفية من مجموعة الصور مثل النموذج <a href="https://huggingface.co/docs/transformers/v4.44.2/en/model_doc/bert#transformers.BertModel" rel="external nofollow"><code>BertModel</code></a>، والثاني لتصنيف الصور وفق الفئات المختلفة مثل النموذج <a href="https://huggingface.co/docs/transformers/v4.44.2/en/model_doc/bert#transformers.BertForSequenceClassification" rel="external nofollow"><code>BertForSequenceClassification</code></a>.
</p>

<p>
	لن نكتب نموذج كامل بل سنكتب فقط مغلِّف wrapper بسيط للنموذج للسهولة، سيكون بمثابة هيكل بسيط للنموذج يمكننا تمرير الإعدادات أو الضبط إليه. وقبل أن نكتب الصنف <code>ResNet</code> أو النموذج نفسه، يجب أن نحدد أنواع الكتل في النموذج مثل basic أو bottleneck، ونحدد كيفية بناء هذه الكتل أو الطبقات في النموذج. بمجرد تحديد هذه الأمور، سنستخدم الضبط الذي حددناه سابقًا لتمرير هذه الإعدادات إلى الصنف <code>ResNet</code> لإنشاء النموذج بناءً على هذه الإعدادات.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9732_14" style=""><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">PreTrainedModel</span><span class="pln">
</span><span class="kwd">from</span><span class="pln"> timm</span><span class="pun">.</span><span class="pln">models</span><span class="pun">.</span><span class="pln">resnet </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">BasicBlock</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Bottleneck</span><span class="pun">,</span><span class="pln"> </span><span class="typ">ResNet</span><span class="pln">
</span><span class="kwd">from</span><span class="pln"> </span><span class="pun">.</span><span class="pln">configuration_resnet </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">ResnetConfig</span><span class="pln">

BLOCK_MAPPING </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="str">"basic"</span><span class="pun">:</span><span class="pln"> </span><span class="typ">BasicBlock</span><span class="pun">,</span><span class="pln"> </span><span class="str">"bottleneck"</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Bottleneck</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ResnetModel</span><span class="pun">(</span><span class="typ">PreTrainedModel</span><span class="pun">):</span><span class="pln">
    config_class </span><span class="pun">=</span><span class="pln"> </span><span class="typ">ResnetConfig</span><span class="pln">

    </span><span class="kwd">def</span><span class="pln"> __init__</span><span class="pun">(</span><span class="pln">self</span><span class="pun">,</span><span class="pln"> config</span><span class="pun">):</span><span class="pln">
        super</span><span class="pun">().</span><span class="pln">__init__</span><span class="pun">(</span><span class="pln">config</span><span class="pun">)</span><span class="pln">
        block_layer </span><span class="pun">=</span><span class="pln"> BLOCK_MAPPING</span><span class="pun">[</span><span class="pln">config</span><span class="pun">.</span><span class="pln">block_type</span><span class="pun">]</span><span class="pln">
        self</span><span class="pun">.</span><span class="pln">model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">ResNet</span><span class="pun">(</span><span class="pln">
            block_layer</span><span class="pun">,</span><span class="pln">
            config</span><span class="pun">.</span><span class="pln">layers</span><span class="pun">,</span><span class="pln">
            num_classes</span><span class="pun">=</span><span class="pln">config</span><span class="pun">.</span><span class="pln">num_classes</span><span class="pun">,</span><span class="pln">
            in_chans</span><span class="pun">=</span><span class="pln">config</span><span class="pun">.</span><span class="pln">input_channels</span><span class="pun">,</span><span class="pln">
            cardinality</span><span class="pun">=</span><span class="pln">config</span><span class="pun">.</span><span class="pln">cardinality</span><span class="pun">,</span><span class="pln">
            base_width</span><span class="pun">=</span><span class="pln">config</span><span class="pun">.</span><span class="pln">base_width</span><span class="pun">,</span><span class="pln">
            stem_width</span><span class="pun">=</span><span class="pln">config</span><span class="pun">.</span><span class="pln">stem_width</span><span class="pun">,</span><span class="pln">
            stem_type</span><span class="pun">=</span><span class="pln">config</span><span class="pun">.</span><span class="pln">stem_type</span><span class="pun">,</span><span class="pln">
            avg_down</span><span class="pun">=</span><span class="pln">config</span><span class="pun">.</span><span class="pln">avg_down</span><span class="pun">,</span><span class="pln">
        </span><span class="pun">)</span><span class="pln">

    </span><span class="kwd">def</span><span class="pln"> forward</span><span class="pun">(</span><span class="pln">self</span><span class="pun">,</span><span class="pln"> tensor</span><span class="pun">):</span><span class="pln">
         </span><span class="kwd">return</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">model</span><span class="pun">.</span><span class="pln">forward_features</span><span class="pun">(</span><span class="pln">tensor</span><span class="pun">)</span></pre>

<p>
	الآن، سنعدّل التابع <code>forward</code> فقط بالنسبة للنموذج <code>ResNet</code> المخصص لتصنيف الصور، فهذا التابع يتعامل مع البيانات المدخلة، ويحدد كيف تتم معالجتها عبر طبقات النموذج للحصول على النتيجة المطلوبة، سنجري التعديل كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9732_16" style=""><span class="kwd">import</span><span class="pln"> torch

</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ResnetModelForImageClassification</span><span class="pun">(</span><span class="typ">PreTrainedModel</span><span class="pun">):</span><span class="pln">
    config_class </span><span class="pun">=</span><span class="pln"> </span><span class="typ">ResnetConfig</span><span class="pln">

    </span><span class="kwd">def</span><span class="pln"> __init__</span><span class="pun">(</span><span class="pln">self</span><span class="pun">,</span><span class="pln"> config</span><span class="pun">):</span><span class="pln">
        super</span><span class="pun">().</span><span class="pln">__init__</span><span class="pun">(</span><span class="pln">config</span><span class="pun">)</span><span class="pln">
        block_layer </span><span class="pun">=</span><span class="pln"> BLOCK_MAPPING</span><span class="pun">[</span><span class="pln">config</span><span class="pun">.</span><span class="pln">block_type</span><span class="pun">]</span><span class="pln">
        self</span><span class="pun">.</span><span class="pln">model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">ResNet</span><span class="pun">(</span><span class="pln">
            block_layer</span><span class="pun">,</span><span class="pln">
            config</span><span class="pun">.</span><span class="pln">layers</span><span class="pun">,</span><span class="pln">
            num_classes</span><span class="pun">=</span><span class="pln">config</span><span class="pun">.</span><span class="pln">num_classes</span><span class="pun">,</span><span class="pln">
            in_chans</span><span class="pun">=</span><span class="pln">config</span><span class="pun">.</span><span class="pln">input_channels</span><span class="pun">,</span><span class="pln">
            cardinality</span><span class="pun">=</span><span class="pln">config</span><span class="pun">.</span><span class="pln">cardinality</span><span class="pun">,</span><span class="pln">
            base_width</span><span class="pun">=</span><span class="pln">config</span><span class="pun">.</span><span class="pln">base_width</span><span class="pun">,</span><span class="pln">
            stem_width</span><span class="pun">=</span><span class="pln">config</span><span class="pun">.</span><span class="pln">stem_width</span><span class="pun">,</span><span class="pln">
            stem_type</span><span class="pun">=</span><span class="pln">config</span><span class="pun">.</span><span class="pln">stem_type</span><span class="pun">,</span><span class="pln">
            avg_down</span><span class="pun">=</span><span class="pln">config</span><span class="pun">.</span><span class="pln">avg_down</span><span class="pun">,</span><span class="pln">
        </span><span class="pun">)</span><span class="pln">

    </span><span class="kwd">def</span><span class="pln"> forward</span><span class="pun">(</span><span class="pln">self</span><span class="pun">,</span><span class="pln"> tensor</span><span class="pun">,</span><span class="pln"> labels</span><span class="pun">=</span><span class="kwd">None</span><span class="pun">):</span><span class="pln">
        logits </span><span class="pun">=</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">model</span><span class="pun">(</span><span class="pln">tensor</span><span class="pun">)</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> labels </span><span class="kwd">is</span><span class="pln"> </span><span class="kwd">not</span><span class="pln"> </span><span class="kwd">None</span><span class="pun">:</span><span class="pln">
            loss </span><span class="pun">=</span><span class="pln"> torch</span><span class="pun">.</span><span class="pln">nn</span><span class="pun">.</span><span class="pln">cross_entropy</span><span class="pun">(</span><span class="pln">logits</span><span class="pun">,</span><span class="pln"> labels</span><span class="pun">)</span><span class="pln">
            </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">{</span><span class="str">"loss"</span><span class="pun">:</span><span class="pln"> loss</span><span class="pun">,</span><span class="pln"> </span><span class="str">"logits"</span><span class="pun">:</span><span class="pln"> logits</span><span class="pun">}</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">{</span><span class="str">"logits"</span><span class="pun">:</span><span class="pln"> logits</span><span class="pun">}</span></pre>

<p>
	نلاحظ في كلتا الحالتين كيف ورثنا الصنف <code>PreTrainedModel</code> واستدعينا تهيئة الصنف الأب باستخدام الضبط <code>config</code> كما يحدث عندما نكتب وحدة <code>torch.nn.Module</code> عادية في <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A5%D8%B7%D8%A7%D8%B1-%D8%B9%D9%85%D9%84-%D8%A8%D8%A7%D9%8A-%D8%AA%D9%88%D8%B1%D8%B4-pytorch-%D9%88%D8%A3%D9%87%D9%85%D9%8A%D8%AA%D9%87-%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%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-r2311/" rel="">PyTorch</a>. ولا يُعَد السطر الذي يضبط <code>config_class</code> إلزاميًا، إلا إذا أردنا تسجيل نموذجنا في الأصناف التلقائية Auto Classes أي عندما نرغب بأن نتيح لمنصة Hugging Face تحديد النموذج تلقائيًا بناءً على الضبط كما سنوضح لاحقًا.
</p>

<p>
	<strong>ملاحظة</strong>: إذا كان نموذجنا مماثلًا لنموذج آخر موجود مسبقًا في المكتبة Transformers، فيمكن إعادة استخدام الضبط الخاص بهذا النموذج نفسه.
</p>

<p>
	يمكن جعل نموذجنا يعيد أي مخرجات نريدها، ولكن ستؤدي إعادة قاموس Dictionary كما فعلنا مع الصنف <code>ResnetModelForImageClassification</code> مع تضمين الخسارة عند تمرير التسميات التوضيحية Labels إلى جعل نموذجك قابلًا للاستخدام مباشرة في الصنف <a href="https://huggingface.co/docs/transformers/v4.44.2/en/main_classes/trainer#transformers.Trainer" rel="external nofollow"><code>Trainer</code></a>. يُعدّ استخدام تنسيق خرج آخر جيدًا طالما أنك تخطط لاستخدام حلقة تدريب خاصة بك أو أي مكتبة أخرى للتدريب.
</p>

<p>
	أصبح لدينا صنف النموذج الخاص بنا، فلننشئ الآن نموذجًا كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9732_18" style=""><span class="pln">resnet50d </span><span class="pun">=</span><span class="pln"> </span><span class="typ">ResnetModelForImageClassification</span><span class="pun">(</span><span class="pln">resnet50d_config</span><span class="pun">)</span></pre>

<p>
	يمكننا استخدام أي تابع من توابع الصنف <code>PreTrainedModel</code> مثل التابع <a href="https://huggingface.co/docs/transformers/v4.44.2/en/main_classes/model#transformers.PreTrainedModel.save_pretrained" rel="external nofollow"><code>save_pretrained()‎</code></a> أو <code>push_to_hub()‎</code>، حيث سنستخدم التابع الثاني في القسم التالي وسنرى كيفية دفع أوزان النموذج باستخدام الشيفرة البرمجية الخاصة بنموذجنا، ولكن لنحمّل أولًا بعض الأوزان المدرَّبة مسبقًا في نموذجنا.
</p>

<p>
	يمكن أن ندرّب نموذجنا المخصّص على بياناتنا الخاصة في حالة استخدامه بشكل مخصص، ولكن سنستخدم في هذا المقال النسخة المدرَّبة مسبقًا من الضبط <code>resnet50d</code>، وبما أن نموذجنا يحتوي على مغلِّف فقط، فسيكون من السهل نقل هذه الأوزان كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9732_20" style=""><span class="kwd">import</span><span class="pln"> timm

pretrained_model </span><span class="pun">=</span><span class="pln"> timm</span><span class="pun">.</span><span class="pln">create_model</span><span class="pun">(</span><span class="str">"resnet50d"</span><span class="pun">,</span><span class="pln"> pretrained</span><span class="pun">=</span><span class="kwd">True</span><span class="pun">)</span><span class="pln">
resnet50d</span><span class="pun">.</span><span class="pln">model</span><span class="pun">.</span><span class="pln">load_state_dict</span><span class="pun">(</span><span class="pln">pretrained_model</span><span class="pun">.</span><span class="pln">state_dict</span><span class="pun">())</span></pre>

<p>
	لنوضّح الآن كيفية التأكد من حفظ شيفرة النموذج البرمجية عند تنفيذ التابع <code>save_pretrained()‎</code> أو <code>push_to_hub()‎</code>.
</p>

<h2 id="autoclasses">
	تسجيل النموذج في الأصناف التلقائية Auto Classes
</h2>

<p>
	إذا أردنا كتابة مكتبة توسّع المكتبة Transformers، فقد نرغب في توسيع الأصناف التلقائية لتضمين نموذجنا الخاص، ويختلف ذلك عن دفع الشيفرة البرمجية إلى المستودع Hub، إذ سيحتاج المستخدمون لاستيراد مكتبتنا هذه للحصول على النموذج المخصَّص على عكس تنزيل شيفرة النموذج البرمجية تلقائيًا من المستودع Hub.
</p>

<p>
	إذا احتوى الضبط على السمة <code>model_type</code> التي تختلف عن أنواع النماذج الموجودة مسبقًا واحتوت أصناف نموذجنا على سمات <code>config_class</code> الصحيحة، فيمكن إضافتها إلى الأصناف التلقائية كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9732_22" style=""><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">AutoConfig</span><span class="pun">,</span><span class="pln"> </span><span class="typ">AutoModel</span><span class="pun">,</span><span class="pln"> </span><span class="typ">AutoModelForImageClassification</span><span class="pln">

</span><span class="typ">AutoConfig</span><span class="pun">.</span><span class="pln">register</span><span class="pun">(</span><span class="str">"resnet"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">ResnetConfig</span><span class="pun">)</span><span class="pln">
</span><span class="typ">AutoModel</span><span class="pun">.</span><span class="pln">register</span><span class="pun">(</span><span class="typ">ResnetConfig</span><span class="pun">,</span><span class="pln"> </span><span class="typ">ResnetModel</span><span class="pun">)</span><span class="pln">
</span><span class="typ">AutoModelForImageClassification</span><span class="pun">.</span><span class="pln">register</span><span class="pun">(</span><span class="typ">ResnetConfig</span><span class="pun">,</span><span class="pln"> </span><span class="typ">ResnetModelForImageClassification</span><span class="pun">)</span></pre>

<p>
	نلاحظ أن الوسيط الأول المُستخدَم عند تسجيل ضبطنا المخصص في الصنف التلقائي <a href="https://huggingface.co/docs/transformers/v4.44.2/en/model_doc/auto#transformers.AutoConfig" rel="external nofollow"><code>AutoConfig</code></a> يجب أن يتطابق مع السمة <code>model_type</code> لضبطنا المخصص، ويجب أن يتطابق الوسيط الأول المُستخدَم عند تسجيل النماذج المخصَّصة في أي صنف نموذج تلقائي مع السمة <code>config_class</code> لتلك النماذج.
</p>

<h2 id="hub">
	إرسال الشيفرة البرمجية للمستودع
</h2>

<p>
	علينا التأكّد أولًا من تعريف نموذجنا الكامل في ملف بايثون <code>‎.py</code>، حيث يمكن الاعتماد على الاستيراد النسبي لبعض الملفات الأخرى طالما أن جميع الملفات موجودة في المجلد نفسه، فالوحدات الفرعية لهذه الميزة غير مدعومة حتى الآن. سنعرّف في مثالنا ملف <code>modeling_resnet.py</code> وملف <code>configuration_resnet.py</code> في مجلد ضمن مجلد العمل الحالي <code>resnet_model</code>، ويحتوي ملف الضبط على الشيفرة البرمجية الخاصة بالصنف <code>ResnetConfig</code>، ويحتوي ملف النموذج على الشيفرة البرمجية الخاصة بالصنفين <code>ResnetModel</code> و <code>ResnetModelForImageClassification</code>.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9732_24" style=""><span class="pun">.</span><span class="pln">
</span><span class="pun">└──</span><span class="pln"> resnet_model
    </span><span class="pun">├──</span><span class="pln"> __init__</span><span class="pun">.</span><span class="pln">py
    </span><span class="pun">├──</span><span class="pln"> configuration_resnet</span><span class="pun">.</span><span class="pln">py
    </span><span class="pun">└──</span><span class="pln"> modeling_resnet</span><span class="pun">.</span><span class="pln">py</span></pre>

<p>
	يمكن أن يكون الملف <code>‎__init__.py</code> فارغًا، لكنه موجود لتتمكّن <a href="https://academy.hsoub.com/python/" rel="">لغة بايثون</a> من اكتشاف إمكانية استخدام <code>resnet_model</code> كوحدة <a href="https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D9%88%D8%AD%D8%AF%D8%A7%D8%AA-modules-%D9%88%D8%A7%D9%84%D8%AD%D8%B2%D9%85-packages-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r329/" rel="">Module</a> مما يعني أنه يمكن استيراد المكونات والملفات من هذا المجلد في برامج بايثون أخرى.
</p>

<p>
	<strong>ملاحظة1</strong>: إذا أردنا نسخ ملفات النموذج من المكتبة إلى مشروعنا الخاص، فيجب استبدال جميع تعليمات الاستيراد النسبية في أعلى الملف واستيرادها مباشرة من حزمة <code>transformers</code>.
</p>

<p>
	<strong>ملاحظة2</strong>: تُعدّ <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-api-r1314/" rel="">واجهة التطبيقات البرمجية <abbr title="Application Programming Interface | واجهة برمجية">API</abbr></a> هذه تجريبية وقد تحتوي على بعض التغييرات في الإصدارات اللاحقة.
</p>

<p>
	بإمكاننا إعادة استخدام أو إنشاء صنف فرعي لضبط أو لنموذج موجود مسبقًا، ويمكن <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%85%D8%B4%D8%A7%D8%B1%D9%83%D8%A9-%D9%86%D9%85%D9%88%D8%B0%D8%AC-%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%B9%D9%84%D9%89-%D9%85%D9%86%D8%B5%D8%A9-hugging-face-r2378/" rel="">مشاركة نموذجنا</a> مع المجتمع من خلال استيراد نموذج وضبط <code>ResNet</code> أولًا من الملفات التي أنشأناها كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9732_26" style=""><span class="kwd">from</span><span class="pln"> resnet_model</span><span class="pun">.</span><span class="pln">configuration_resnet </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">ResnetConfig</span><span class="pln">
</span><span class="kwd">from</span><span class="pln"> resnet_model</span><span class="pun">.</span><span class="pln">modeling_resnet </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">ResnetModel</span><span class="pun">,</span><span class="pln"> </span><span class="typ">ResnetModelForImageClassification</span></pre>

<p>
	بعد ذلك، علينا إخبار المكتبة بأننا نريد نسخ ملفات الشيفرة البرمجية لتلك الكائنات عند استخدام التابع <code>save_pretrained</code> وتسجيلها بطريقة صحيحة في صنف تلقائي محدّد وخاصةً بالنسبة للنماذج، لذا ننفّذ التعليمات التالية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9732_28" style=""><span class="typ">ResnetConfig</span><span class="pun">.</span><span class="pln">register_for_auto_class</span><span class="pun">()</span><span class="pln">
</span><span class="typ">ResnetModel</span><span class="pun">.</span><span class="pln">register_for_auto_class</span><span class="pun">(</span><span class="str">"AutoModel"</span><span class="pun">)</span><span class="pln">
</span><span class="typ">ResnetModelForImageClassification</span><span class="pun">.</span><span class="pln">register_for_auto_class</span><span class="pun">(</span><span class="str">"AutoModelForImageClassification"</span><span class="pun">)</span></pre>

<p>
	نلاحظ أنه لا حاجة لتحديد صنف تلقائي للضبط Config، إذ يوجد صنف تلقائي واحد فقط له هو <code>AutoConfig</code>، ولكن يختلف الأمر بالنسبة للنموذج Model، فالنماذج في مكتبة المحولات Transformers قد تُستَخدم في مهام مختلفة مثل <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D9%88%D9%84%D9%8A%D8%AF-%D8%A7%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D9%86%D9%85%D8%A7%D8%B0%D8%AC-%D8%A7%D9%84%D9%84%D8%BA%D9%88%D9%8A%D8%A9-%D8%A7%D9%84%D9%83%D8%A8%D9%8A%D8%B1%D8%A9-llms-r2380/" rel="">توليد النصوص</a>، أو الترجمة أو تصنيف الصور، لذا يتوجب علينا تحديد الصنف التلقائي المناسب بناءً على نوع النموذج والمهمة التي يؤديها.
</p>

<p>
	عندما نريد جعل نموذجنا الخاص قابلاً للاستخدام في مكتبة Transformers وتسجيله ضمن النماذج التلقائية مثل AutoModel, AutoConfig، يجب استخدام التابع<code>register_for_auto_class()‎</code> لتسجيل النموذج بشكل صحيح، وإذا كنا نفضل استخدام الشيفرة البرمجية الموجودة على المستودع Hub من مستودع آخر، فلن تحتاج لاستدعاء هذا التابع. يمكننا تعديل الملف <code>config.json</code> مباشرة باستخدام البنية التالية في الحالات التي يوجد فيها أكثر من صنف تلقائي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9732_30" style=""><span class="str">"auto_map"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">     
    </span><span class="str">"AutoConfig"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"&lt;your-repo-name&gt;--&lt;config-name&gt;"</span><span class="pun">,</span><span class="pln">     
    </span><span class="str">"AutoModel"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"&lt;your-repo-name&gt;--&lt;config-name&gt;"</span><span class="pun">,</span><span class="pln">
    </span><span class="str">"AutoModelFor&lt;Task&gt;"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"&lt;your-repo-name&gt;--&lt;config-name&gt;"</span><span class="pun">,</span><span class="pln">    
</span><span class="pun">},</span></pre>

<p>
	لننشئ بعد ذلك الضبط والنماذج كما فعلنا سابقًا:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9732_32" style=""><span class="pln">resnet50d_config </span><span class="pun">=</span><span class="pln"> </span><span class="typ">ResnetConfig</span><span class="pun">(</span><span class="pln">block_type</span><span class="pun">=</span><span class="str">"bottleneck"</span><span class="pun">,</span><span class="pln"> stem_width</span><span class="pun">=</span><span class="lit">32</span><span class="pun">,</span><span class="pln"> stem_type</span><span class="pun">=</span><span class="str">"deep"</span><span class="pun">,</span><span class="pln"> avg_down</span><span class="pun">=</span><span class="kwd">True</span><span class="pun">)</span><span class="pln">
resnet50d </span><span class="pun">=</span><span class="pln"> </span><span class="typ">ResnetModelForImageClassification</span><span class="pun">(</span><span class="pln">resnet50d_config</span><span class="pun">)</span><span class="pln">

pretrained_model </span><span class="pun">=</span><span class="pln"> timm</span><span class="pun">.</span><span class="pln">create_model</span><span class="pun">(</span><span class="str">"resnet50d"</span><span class="pun">,</span><span class="pln"> pretrained</span><span class="pun">=</span><span class="kwd">True</span><span class="pun">)</span><span class="pln">
resnet50d</span><span class="pun">.</span><span class="pln">model</span><span class="pun">.</span><span class="pln">load_state_dict</span><span class="pun">(</span><span class="pln">pretrained_model</span><span class="pun">.</span><span class="pln">state_dict</span><span class="pun">())</span></pre>

<p>
	لنتأكّد الآن من تسجيل الدخول لإرسال النموذج إلى المستودع Hub، لذا نشغّل الأمر التالي في الطرفية <a href="https://academy.hsoub.com/devops/servers/%D9%85%D8%A7-%D9%87%D9%88-%D8%B3%D8%B7%D8%B1-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D8%9F-r353/" rel="">Terminal</a>:
</p>

<pre class="ipsCode">huggingface-cli login
</pre>

<p>
	أو نكتب من تطبيق <a href="https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D9%87%D9%8A%D8%A6%D8%A9-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A7%D9%84%D9%85%D9%81%D9%83%D8%B1%D8%A9-jupyter-notebook-%D9%84%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-python-3-r388/" rel="">المفكرة</a> ما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9732_35" style=""><span class="kwd">from</span><span class="pln"> huggingface_hub </span><span class="kwd">import</span><span class="pln"> notebook_login

notebook_login</span><span class="pun">()</span></pre>

<p>
	يمكن بعد ذلك رفع النموذج إلى فضاء الأسماء Namespace الخاص بحسابنا على Hugging Face كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9732_37" style=""><span class="pln">resnet50d</span><span class="pun">.</span><span class="pln">push_to_hub</span><span class="pun">(</span><span class="str">"custom-resnet50d"</span><span class="pun">)</span></pre>

<p>
	ترفع التعليمة النموذج <code>resnet50d</code> إلى المستودع Hugging Face Hub باسم  <code>custom-resnet50d</code> وتجعل النموذج متاحًا لاستخدامه مباشرة في <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%85%D8%A7-%D9%87%D9%8A-%D9%85%D9%86%D8%B5%D8%A9-hugging-face-%D9%84%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-r2449/" rel="">المنصة Hugging Face</a>. حيث تُنسَخ ملفات <code>‎.py</code> للنموذج وللضبط بالإضافة إلى أوزان النموذج والضبط بتنسيق json في المجلد <code>custom-resnet50d</code> وستُرفَع النتيجة للمستودع Hub، ويمكننا التحقق من النتيجة في <a href="https://huggingface.co/sgugger/custom-resnet50d" rel="external nofollow">مستودع النماذج</a> على منصة Huggingface.<br>
	وللمزيد حول طريقة الدفع إلى المستودع Hub ننصح بمطالعة مقال <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%85%D8%B4%D8%A7%D8%B1%D9%83%D8%A9-%D9%86%D9%85%D9%88%D8%B0%D8%AC-%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%B9%D9%84%D9%89-%D9%85%D9%86%D8%B5%D8%A9-hugging-face-r2378/" rel="">مشاركة نموذج ذكاء اصطناعي على منصة Hugging Face</a> .
</p>

<h2 id="-2">
	استخدام نموذج مع شيفرة برمجية مخصصة
</h2>

<p>
	يمكن استخدام أي ضبط أو نموذج أو مرمِّز Tokenizer مع ملفات الشيفرة البرمجية المخصَّصة في مستودعها باستخدام الأصناف التلقائية والتابع <code>from_pretrained</code>، حيث تُفحَص جميع الملفات والشيفرات البرمجية المرفوعة إلى المستودع Hub بحثًا عن البرامج الضارة، ولمزيد من التفاصيل يُنصَح بمطالعة توثيق <a href="https://huggingface.co/docs/hub/security#malware-scanning" rel="external nofollow">أمان Hub</a>، ويجب أيضًا مراجعة شيفرة النموذج والتحقق من كاتبها لتجنّب تنفيذ شيفرة برمجية ضارة.
</p>

<p>
	سنضبط القيمة <code>trust_remote_code=True</code> لاستخدام نموذج مع شيفرة برمجية مخصصة كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9732_40" style=""><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">AutoModelForImageClassification</span><span class="pln">

model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">AutoModelForImageClassification</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="str">"sgugger/custom-resnet50d"</span><span class="pun">,</span><span class="pln"> trust_remote_code</span><span class="pun">=</span><span class="kwd">True</span><span class="pun">)</span></pre>

<p>
	يُفضَّل أيضًا تمرير قيمة تعمية الإيداع Commit Hash إلى سمة المراجعة <code>revision</code> للتأكّد من أن كاتب النماذج لم يُحدّث الشيفرة البرمجية ببعض الأسطر الجديدة الضارة.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9732_42" style=""><span class="pln">commit_hash </span><span class="pun">=</span><span class="pln"> </span><span class="str">"ed94a7c6247d8aedce4647f00f20de6875b5b292"</span><span class="pln">
model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">AutoModelForImageClassification</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="pln">
    </span><span class="str">"sgugger/custom-resnet50d"</span><span class="pun">,</span><span class="pln"> trust_remote_code</span><span class="pun">=</span><span class="kwd">True</span><span class="pun">,</span><span class="pln"> revision</span><span class="pun">=</span><span class="pln">commit_hash
</span><span class="pun">)</span></pre>

<p>
	نلاحظ وجود زر لنسخ قيمة تعمية الإيداع commit hash يمكننا من خلاله نسخ التعديل بسهولةعند تصفح سجل الإيداعات الخاص بمستودع النماذج الموجود على Hugging Face Hub.
</p>

<h2 id="-3">
	الخلاصة
</h2>

<p>
	شرحنا في مقال اليوم كيفية كتابة نموذج مخصَّص وضبطه وطريقة استخدامه في مكتبة المحوّلات Transformers، كما شرحنا كيفية مشاركته مع المجتمع على مستودع Hugging Face Hub ليتمكّن أي شخص من استخدامه.
</p>

<p>
	ترجمة -وبتصرّف- للقسم <a href="https://huggingface.co/docs/transformers/custom_models" rel="external nofollow">Building custom models</a> من توثيقات Hugging Face.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%B1%D9%85%D8%B2%D8%A7%D8%AA-tokenizers-%D9%81%D9%8A-%D9%85%D9%86%D8%B5%D8%A9-hugging-face-r2470/" rel=""> استخدام مكتبة المرمزات Tokenizers في منصة Hugging Face</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%88%D9%83%D9%84%D8%A7%D8%A1-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%AD%D9%88%D9%84%D8%A7%D8%AA-transformers-agents-%D9%81%D9%8A-%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-%D8%A7%D9%84%D8%AA%D9%88%D9%84%D9%8A%D8%AF%D9%8A-r2379/" rel="">استخدام وكلاء مكتبة المحولات Transformers Agents في الذكاء الاصطناعي التوليدي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%AF%D8%B1%D9%8A%D8%A8-%D8%A7%D9%84%D9%85%D9%8B%D9%83%D9%8A%D9%91%D9%8E%D9%81%D8%A7%D8%AA-peft-adapters-%D8%A8%D8%AF%D9%84-%D8%AA%D8%AF%D8%B1%D9%8A%D8%A8-%D9%86%D9%85%D8%A7%D8%B0%D8%AC-%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-%D8%A8%D8%A7%D9%84%D9%83%D8%A7%D9%85%D9%84-r2377/" rel="">تدريب المًكيَّفات PEFT Adapters بدل تدريب نماذج الذكاء الاصطناعي بالكامل</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%AF%D8%B1%D9%8A%D8%A8-%D8%A7%D9%84%D9%85%D9%88%D8%B2%D8%B9-%D9%88%D9%85%D9%83%D8%AA%D8%A8%D8%A9-accelerate-%D9%84%D8%AA%D8%B3%D8%B1%D9%8A%D8%B9-%D8%AA%D8%AF%D8%B1%D9%8A%D8%A8-%D9%86%D9%85%D8%A7%D8%B0%D8%AC-%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-r2376/" rel="">استخدام التدريب الموزع ومكتبة Accelerate لتسريع تدريب نماذج الذكاء الاصطناعي</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2481</guid><pubDate>Thu, 02 Jan 2025 15:00:01 +0000</pubDate></item><item><title>&#x623;&#x647;&#x62F;&#x627;&#x641; &#x627;&#x644;&#x630;&#x643;&#x627;&#x621; &#x627;&#x644;&#x627;&#x635;&#x637;&#x646;&#x627;&#x639;&#x64A;</title><link>https://academy.hsoub.com/programming/artificial-intelligence/%D8%A3%D9%87%D8%AF%D8%A7%D9%81-%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-r2469/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_12/836012349_.jpg.26f52f81960ec90b154332dcc6a7ae19.jpg" /></p>
<p>
	تطور الذكاء الاصطناعي تطورًا كبيرًا في الآونة الأخيرة، وساهم بفعالية في كافة نواحي حياتنا، كما تنوعت الأهداف التي يسعى الذكاء الاصطناعي لتحقيقها من أجل تحسين الكفاءة وزيادة إنتاجيتنا وتوفير حلول مبتكرة للتحديات التي نواجهها نحن البشر في مختلف الصناعات، ونناقش في مقال اليوم أبرز هذه أهداف الذكاء الاصطناعي ونوضح أهم فوائده ومحدودياته.
</p>

<h2 id="-1">
	مفهوم الذكاء الاصطناعي
</h2>

<p>
	قبل التعرف على أهداف <a href="https://academy.hsoub.com/programming/artificial-intelligence/%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/" rel="">الذكاء الاصطناعي</a> لنوضح مفهوم الذكاء الاصطناعي وما يسعه فعله. فالذكاء الاصطناعي هو مجال يختص ببناء أجهزة وأنظمة حاسوبية تستطيع التفكير والتعلم والتصرف كالإنسان، كما يمكنها  <a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%AD%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA/" rel="">تحليل البيانات</a> واستخراج نتائج مفيدة منها واتخاذ قرارات فعالة بناء عليها كما لو أن إنسانًا هو من حلل هذه البيانات.
</p>

<p>
	ولعلك تتساءل لماذا نستعين بالذكاء الاصطناعي لمحاكاة طرق تفكيرنا نحن البشر؟ والجواب هو أن الذكاء الاصطناعي يمكننا من تحليل ا<a href="https://academy.hsoub.com/programming/general/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D9%85%D9%81%D9%87%D9%88%D9%85-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D8%B6%D8%AE%D9%85%D8%A9-big-data-r1579/" rel="">لبيانات الضخمة Big Data</a> التي يستحيل على عقلنا البشري استيعابها وفهم العلاقات فيما بينها والأنماط التي تحكمها، وبهذا نستعين بالذكاء الاصطناعي للوصول إلى المعلومات والقرارات المناسبة التي لم نكن لنصل إليها بمفردنا ونطور <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%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/" rel="">تطبيقات ذكية</a> لم يكن يتسنى لنا تطويرها دون الاعتماد عليه مثل السيارات ذاتية القيادة، وبرمجيات الترجمة الفورية وغيرها من <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%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/" rel="">التطبيقات الذكية</a> الأخرى.
</p>

<h2>
	أهمية البيانات لتحقيق أهداف الذكاء الاصطناعي
</h2>

<p>
	يعتمد الذكاء الاصطناعي اعتمادًا كليًا على البيانات لتحقيق هذه الأهداف، فالبيانات هي وقود خوارزميات ونماذج الذكاء الاصطناعي، وهي الأدوات التي تمكّننا من اتخاذ قرارات مدروسة، والتعرف على الأنماط، وإجراء التنبؤات. فكلما زادت كمية وجودة البيانات التي تتدرب عليها نماذج الذكاء الاصناعي وكانت أكثر تنوعًا، كلما زادت خبرتها ودقتها في أداء المهام المختلفة.
</p>

<p>
	على سبيل المثال، لا يمكن لأنظمة التعرف على الصور التمييز بين صورة قطة وصور كلب إلا إذا دربناها على عدد كبير من الصور المتنوعة للحيوانات. وبالمثل، تعتمد تطبيقات الذكاء الاصطناعي الأخرى مثل <a href="https://academy.hsoub.com/apps/cat/" rel="">الترجمة الآلية</a> والمساعدات الذكية الافتراضية على مجموعات <a href="https://academy.hsoub.com/programming/general/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D9%85%D9%81%D9%87%D9%88%D9%85-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D8%B6%D8%AE%D9%85%D8%A9-big-data-r1579/" rel="">بيانات ضخمة Big Data</a> لتحسين قدرتها على الفهم والتواصل. فالبيانات هي وقود الذكاء الاصطناعي وهي العامل الأساسي لتحقيق أهدافه المختلفة كالأتمتة، والتنبؤ، واتخاذ القرارات وتحقيق النتائج المرجوة منها.
</p>

<h2 id="-2">
	أهداف الذكاء الاصطناعي
</h2>

<p>
	تتعدد أهداف الذكاء الاصطناعي، ومن أهمها:
</p>

<ul>
	<li>
		أتمتة المهام
	</li>
	<li>
		حل المشكلات
	</li>
	<li>
		تحسين اتخاذ القرارات
	</li>
	<li>
		رفع القدرات البشرية
	</li>
	<li>
		خدمة المجتمعات
	</li>
	<li>
		تعزيز البحث العملي
	</li>
</ul>

<p>
	دعونا نتعمق في استعراض التفاصيل المتعلقة بهذه الأهداف.
</p>

<h3 id="-3">
	أتمتة المهام
</h3>

<p>
	من أبرز أهداف الذكاء الاصطناعي أتمتة المهام وإنجازها بسرعة وسهولة وتقليل الحاجة للموارد البشرية مما يوفر الوقت والموارد، فالذكاء الاصطناعي يفيد العاملين في خطوط الإنتاج كالمصانع وغيرها، وفي مواقع تقديم الخدمات، كما يهدف الذكاء الاصطناعي لمساعدة <span ipsnoautolink="true">المبرمجين</span><span style="display: none;"> </span> والمطورين على كتابة الشيفرات البرمجية وحل المشكلات، ويساعد العاملين في قطاع الرعاية الصحية على تحليل الصور الطبية وتشخيص الأمراض بدقة وسرعة، ويوفر للمعلمين أدوات مخصصة للتعلم لمساعدة الطلاب على تحسين أدائهم وتطوير مهاراتهم، كما يسهم الذكاء الاصطناعي المتخصصين في مجال التجارة الإلكترونية لتحسين تجربة العملاء من خلال أنظمة التوصية الذكية التي تعتمد على تحليل بيانات السلوك الشرائي مما يزيد المبيعات ويعزز رضا العملاء. كما تساعد تطبيقات الذكاء الاصطناعي على أتمتة المهام المتكررة مثل إدخال البيانات أو إعداد التقارير الإدارية الشركات على توجيه جهود موظفيها لتنفيذ أعمال أكثر إبداعًا.
</p>

<h3 id="-4">
	حل المشكلات
</h3>

<p>
	تهدف نماذج الذكاء الاصطناعي لحل كثير من المشكلات المختلفة، سواء كانت هذه المشكلات برمجية كالمساعدة في كتابة الأكواد <a href="https://academy.hsoub.com/programming/general/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D8%A3%D8%AE%D8%B7%D8%A7%D8%A1-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-r1342/" rel="">وتصحيح الأخطاء البرمجية</a>، أو مشكلات عملية كمساعدة موظفي الموارد البشرية في اختيار أفضل المرشحين للوظائف واتخاذ القرارات المناسبة لسير العمل، أو حل غيرها من المشكلات التي نواجهها في الحياة أو العمل وهذه الأهداف تساعدنا نحن البشر على تخطي العقبات التي تعيق تقدمنا ويساعدنا على زيادة إنتاجيتنا وتسريع وتيرة أعمالنا.
</p>

<p>
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="360" id="ips_uid_3554_6" referrerpolicy="strict-origin-when-cross-origin" src="https://academy.hsoub.com/applications/core/interface/index.html" title="متى أستخدم الذكاء الاصطناعي في مشاريعي البرمجية؟" width="640" data-embed-src="https://www.youtube.com/embed/lxdkVY0ikr0"></iframe>
</p>

<h3 id="-5">
	تحسين اتخاذ القرارات
</h3>

<p>
	يعد اتخاذ القرارات الذكية أحد أهم وأبرز أهداف الذكاء الاصطناعي، حيث تتيح النماذج الذكية المتقدمة لأصحاب الأعمال اتخاذ قرارات دقيقة وفعالة ترتقي بأعمالهم إلى مستويات أعلى من النجاح. تعتمد هذه النماذج على تحليل شامل لكل جوانب العمل، مما يمكّنها من اتخاذ قرارات متوازنة ومدروسة، تعتمد على كميات هائلة من البيانات والتحليلات الدقيقة، والنتيجة اتخاذ قرارات تتسم بدرجة عالية من الدقة، وتتفوق في كثير من الأحيان على القرارات البشرية التي قد تتأثر بالعاطفة أو نقص المعلومات.
</p>

<p>
	على سبيل المثال، تستخدم كبرى شركات التجارة الإلكترونية أنظمة متقدمة لإدارة سلاسل التوريد، وتساعد على تحليل بيانات المخزون والتنبؤ بالاحتياجات المستقبلية، مما يضمن توفر المنتجات المطلوبة في الوقت المناسب مع تقليل الفاقد. كما أصبحت أنظمة تحليل البيانات المالية أداة أساسية في عالم الاستثمار، إذ توفر رؤى دقيقة لصناديق الاستثمار لاتخاذ قرارات مثالية في شراء وبيع الأسهم، بناءً على تحليل تاريخ السوق والتوقعات المستقبلية.
</p>

<h3 id="-6">
	رفع القدرات البشرية
</h3>

<p>
	من أعظم أهداف الذكاء الاصطناعي رفع القدرات البشرية، فهو يمنح البشر أدوات غير مسبوقة لتحقيق ما كان يومًا يبدو مستحيلًا. فالذكاء الاصطناعي لا يحل محل العقل البشري، بل يعززه ويثريه، مما يفتح آفاقًا جديدة للإبداع والابتكار. وعند الجمع بين الإبداع البشري وقدرة الذكاء الاصطناعي على التحليل العميق واستخراج الأنماط، ستظهر فرص هائلة لابتكار منتجات وخدمات تُحسن جودة حياة الإنسان وتحقق مزيدًا من الراحة والرفاهية.
</p>

<p>
	على سبيل المثال، أصبحت روبوتات التنظيف المنزلية الذكية من الأدوات اليومية التي تسهّل الأعمال المنزلية، حيث يمكنها تنظيف الأرضيات بكفاءة دون تدخل بشري. كما مكّنت أنظمة التحكم الصوتي كتلك المستخدمة في المنازل الحديثة المستخدمين من التحكم بالإضاءة ودرجة الحرارة وتشغيل الأجهزة بكلمات بسيطة، مما يوفر الوقت والجهد.
</p>

<h3 id="-8">
	خدمة المجتمعات
</h3>

<p>
	أصبح الذكاء الاصطناعي جزءًا أساسيًا من حياتنا اليومية، ومن أهدافه الأساسية خدمة المجمتع ومساعدته على التقدم والتحسن، فمثلًا صرنا نرى في المطارات استخدامات متعددة لأنظمة الذكاء الاصطناعي في تسريع عمليات الفحص الأمني، وروبوتات لتقديم خدمات مخصصة للمسافرين، مثل الإرشادات التفاعلية واستقبال الزوار بلغات متعددة، وكذلك بدأت السيارات ذاتية القيادة في الانتشار رويدًا رويدً ما ساعد على تقليل الحوادث، كما توجد صور أخرى عديدة ومختلفة لخدمة الذكاء الاصطناعي للمجتمعات، مثل الرعاية الصحية والمساعدة في إدارة الميزانية وتحسين الأنظمة الأمنية وغيرها.
</p>

<h3 id="-9">
	تعزيز البحث العملي
</h3>

<p>
	صار الذكاء الاصطناعي مساعدًا للعلماء في أبحاثهم العلمية، إذ يساعدهم على نقد جميع جوانب نظرياتهم قبل اختبارها معمليًا وتضييع الموارد هباءً لخطأ مسهو عنه، وكذلك يساعد العلماء على زيادة سرعة تعلمهم للمفاهيم المعقدة، ويساعدهم في تطوير أبحاثهم، ويقدم لهم توصيات مستندة إلى البيانات لتحسين القرارات المتعلقة بالأبحاث العلمية. ولعلَّ أبرز تطبيقات الذكاء الاصطناعي التي تدخل في هذا الهدف هي الأنظمة الخبيرة Expert Systems فالنظام الخبير هو محاولة جمع الخبرة البشرية المتعلقة بمجال محدد ليحل محل الخبير، ويمكن القول أنّه برنامج ذكي مصمم لينفذ مهام متعلقة بالخبرة البشرية، وهذا يتضمن التحليل والتشخيص واتخاذ القرارات والتنفيذ أيضًا.
</p>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة الذكاء الاصطناعي
		</p>

		<p class="banner-subtitle">
			احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة.
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/artificial-intelligence" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<a href="https://academy.hsoub.com/learn/artificial-intelligence" rel=""><img alt="دورة الذكاء الاصطناعي AI" src="https://academy.hsoub.com/learn/assets/images/courses/artificial-intelligence.png"></a>
	</div>
</div>

<h2 id="-10">
	فوائد تحقيق أهداف الذكاء الاصطناعي
</h2>

<p>
	من أهم الفوائد التي ستعود علينا من تحقيق أهداف الذكاء الاصطناعي ما يلي:
</p>

<ul>
	<li>
		رفع الإنتاجية الفردية والجماعية من خلال أتمتة المهام المتكررة، وتبسيط العمليات في مجالات متعددة مثل خدمة العملاء والصناعات
	</li>
	<li>
		تخصيص التجارب والخدمات وفقًا للاحتياجات الفردية. على سبيل المثال، تساعد أنظمة التوصية المعتمدة على الذكاء الاصطناعي في تقديم محتوى أو منتجات ملائمة بناءً على اهتمامات وسلوك الأفراد، وتعزيز الرعاية الصحية بتصميم خطط علاج فردية
	</li>
	<li>
		تسريع البحث العلمي والابتكار من خلال تسريع العمليات الحسابية المعقدة واختبار الفرضيات المختلفة، مما يوفر الكثير من الوقت والجهد
	</li>
	<li>
		تحسين السلامة والأمان في العديد من المجالات، مثل تقليل حوادث الطرقات عبر السيارات الذاتية القيادة، وكذلك في مجال الأمن السيبراني من خلال الكشف عن <a href="https://academy.hsoub.com/devops/security/%D9%85%D8%A7-%D9%87%D9%88-%D8%A7%D9%84%D8%A3%D9%85%D9%86-%D8%A7%D9%84%D8%B3%D9%8A%D8%A8%D8%B1%D8%A7%D9%86%D9%8A-%D9%88%D9%85%D8%A7-%D8%A3%D9%87%D9%85%D9%8A%D8%AA%D9%87%D8%9F-r664/" rel="">الهجمات السيبرانية</a> والتصدي لها
	</li>
	<li>
		تحسين الابتكار من خلال معالجة كميات هائلة من البيانات بسرعات تفوق القدرة البشرية، مما يسمح لنا باتخاذ قرارات صائبة مدعومة بالبيانات ويعزز ابتكاراتنا في مجالات عديدة كاكتشاف الأدوية والبحث المناخي
	</li>
</ul>

<h2 id="-16">
	الآثار السلبية للذكاء الاصطناعي
</h2>

<p>
	كما أنَّ للذكاء الاصطناعي مميزات وفوائد لا حصر لها، فإنّ له عيوبًا معدودة تجدر الإشارة لها كذلك، ومن أهمها:
</p>

<ul>
	<li>
		تهديد الوظائف البشرية
	</li>
	<li>
		التحيز والتمييز
	</li>
	<li>
		فقدان الخصوصية
	</li>
	<li>
		إضعاف القدرات البشرية
	</li>
	<li>
		المسؤولية القانونية والأخلاقية
	</li>
</ul>

<p>
	دعنا نناقش هذه المحدوديات ونتعرفْ على تفاصيلها عن كثب
</p>

<h3 id="-17">
	تهديد الوظائف البشرية
</h3>

<p>
	كما لا يخفى على أحدٍ فقد بات الذكاء الاصطناعي يهدد العمالة البشرية تهديدًا كبيرًا، وذلك في شتى المجالات؛ بدءًا من السائقين الذي تستبدلهم السيارات ذاتية القيادة رويدًا رويدًا، مرورًا بالعاملين في مجالات الكتابة والتصميم والتسويق وغيرها، وصولًا إلى المبرمجين أنفسهم الذين صارت أدوات الذكاء الاصطناعي تنوب عنهم في أعمالهم، واستبدلت هذه الأدوات جزءًا كبيرًا منهم، والعمل الذي كان ينجزه فريق صار قادرًا على إنجازه مبرمجٌ واحدٌ مستعينًا بأدوات الذكاء الاصطناعي.
</p>

<p>
	ولكنَّ الأمرَ ليس معتمًا جدًّا، فكما يغلق الذكاء الاصطناعي أبوابًا لبعض الوظائف فإنَّه يفتح أبوابًا أخرى لوظائف جديدة، منها مثلًا وظائف تحليل البيانات وهندسة الذكاء الاصطناعي، ويُتوَقع أن تبدأَ وظائف أخرى في الظهور مع استقرار الذكاء الاصطناعي وتوغله في كل شيءٍ ومع تطوره المستمر، كما حدث عند اختراع الحواسيب؛ حين استبدلت الأنظمة الذكية العمال في المصانع، ثم بعد سنوات قليلة أظهرت لنا هذه الأنظمة حاجة لوظائف لا حصر لها في مجالات الهندسة وغيرها.
</p>

<h3 id="-18">
	التحيز والتمييز
</h3>

<p>
	تنتج بعض التحيزات والتمييزات أحيانًا في إجابات الذكاء الاصطناعي ونتائجه، وهو ما يُعرف بمصطلح AI Bias، وتكون هذه التحيزات ناتجة عن تلف في مجموعات بيانات التدريب، أو احتواء مجموعات البيانات على ما يسيء لجماعة معينة عندها سيكون النموذج متحيزًا لأنه سيطلق الأحكام بناء على هذه المجموعة من البيانات.
</p>

<h3 id="-19">
	فقدان الخصوصية
</h3>

<p>
	يعتمد الذكاء الاصطناعي كليًّا على البيانات، فبذلك صار التساؤل عن خصوصية بيانات المستخدمين وعن مصير هذه البيانات مطروحًا، ولا تزال الأبحاث قائمةً لتحديد أكثر الطرق الموثوقة لتأمين بيانات المستخدمين، ومنع الذكاء الاصطناعي من استخدام هذه البيانات هذه في مآرب أخرى غير مساعدة المستخدم صاحب البيانات.
</p>

<h3 id="-20">
	إضعاف القدرات البشرية
</h3>

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

<h3 id="-21">
	المسؤولية القانونية والأخلاقية
</h3>

<p>
	تشكل المسؤولية القانونية والأخلاقية أبرز العوامل التي يتوجب مراعاتها في أنظمة الذكاء الاصطناعي، فحينما يرتكب الإنسان جريمة تسهل معاقبته وردعه عن جريمته، لكن ماذا إذا ارتكب الذكاء الاصطناعي جريمة سواءً كانت عن أخطاء تقنية أو بتوجيه بشري دون معرفة صاحب النظام فكيف ستعاقبه السلطات حينها، هذا من الأسئلة التي لا إجابة عليها إلى الآن. لذا من الضروري تطوير أسس قانونية وأخلاقية تضمن أن أنظمة الذكاء الاصطناعي تُستخدم بشكل آمن وعادل، مع تحديد واضح لمسؤولية الأفعال الناتجة عن هذه الأنظمة.
</p>

<h2 id="-22">
	الخلاصة
</h2>

<p>
	تعرفنا في مقال اليوم على أبرز أهداف الذكاء الاصطناعي، وما الفوائد التي سنجنيها من تطبيقه كما ذكرنا بعض التحديات المرتبطة به. والسؤال الذي يطرح نفسه هل يشكّل الذكاء الاصطناعي تهديدًا لنا نحن البشر أم أنه على العكس يسهم في جعل مستقبلنا أكثر سهولة وازدهارًا وتطورًا، وهل من أهداف أخرى تجد أنها مهمة وتستحق أن نسعى لتحقيقها بتطبيقه. نرحب بمشاركاتكم في التعليقات أسفل المقال.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A3%D9%87%D9%85%D9%8A%D8%A9-%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-r2243/" rel="">أهمية الذكاء الاصطناعي</a>
	</li>
	<li>
		<a href="http://xn--%20%20%20%20-64f8aabacaa5az9d8d8a0bznoaegi6b4g" rel="external nofollow">مجالات الذكاء الاصطناعي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%83%D9%8A%D9%81-%D8%A3%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-%D8%AA%D9%82%D9%86%D9%8A%D8%A7%D8%AA-%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%81%D9%8A-%D8%B9%D9%85%D9%84%D9%8A%D8%9F-r2416/" rel="">كيف أستخدم تقنيات الذكاء الاصطناعي في عملي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A3%D9%85%D8%AB%D9%84%D8%A9-%D8%B9%D9%84%D9%89-%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-r2396/" rel="">أمثلة على الذكاء الاصطناعي</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2469</guid><pubDate>Tue, 31 Dec 2024 16:02:01 +0000</pubDate></item><item><title>&#x625;&#x646;&#x634;&#x627;&#x621; &#x628;&#x646;&#x64A;&#x629; &#x645;&#x62E;&#x635;&#x635;&#x629; &#x644;&#x646;&#x645;&#x627;&#x630;&#x62C; Transformers &#x641;&#x64A; Hugging Face</title><link>https://academy.hsoub.com/programming/artificial-intelligence/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%A8%D9%86%D9%8A%D8%A9-%D9%85%D8%AE%D8%B5%D8%B5%D8%A9-%D9%84%D9%86%D9%85%D8%A7%D8%B0%D8%AC-transformers-%D9%81%D9%8A-hugging-face-r2476/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_12/Transformers_.png.74eff315e69bb20067aceee6f1121015.png" /></p>
<p>
	توفر مكتبة Transformers من منصة Hugging Face العديد من الأدوات المفيدة لبناء وتشغيل النماذج اللغوية الحديثة. ومن بين هذه الأدوات الصنف <a href="https://huggingface.co/docs/transformers/model_doc/auto" rel="external nofollow"><code>AutoClass</code></a> لتحميل النماذج مسبقة التدريب بسهولة، حيث يحمّل AutoClass الإعدادات والأوزان المدربة مسبقًا بما يتناسب مع بنية النموذج، لكن هناك بعض الحالات التي قد نحتاج فيها لتحكم أكبر في معاملات النموذج، وإنشاء نموذج مخصص دون الاعتماد على الصنف <code>AutoClass</code>، وهو ما سنوضحه في هذا المقال.
</p>

<h2 id="transformers-1">
	أهمية بناء نموذج مخصص
</h2>

<p>
	يستدل الصنف <a href="https://huggingface.co/docs/transformers/model_doc/auto" rel="external nofollow"><code>AutoClass</code></a> في مكتبة المحوّلات Transformers على بنية النموذج تلقائيًا ويحمّل الضبط Configuration والأوزان المدربة مسبقًا، حيث يوصى باستخدام هذا الصنف لإنتاج شيفرة برمجية مستقلة عن نقاط التحقق Checkpoint، ولكن يمكن للمستخدمين الذين يريدون مزيدًا من التحكم في معاملات النموذج المحددة إنشاء نموذج مخصص باستخدام <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%AD%D9%88%D9%91%D9%84%D8%A7%D8%AA-transformers-%D9%85%D9%86-%D9%85%D9%86%D8%B5%D8%A9-hugging-face-r2340/" rel="">مكتبة المحولات Transformers</a> من بعض الأصناف الأساسية فقط. يمكن أن يكون ذلك مفيدًا لأي شخص مهتم بدراسة أو تدريب أو تجربة نموذج من مكتبة Transformers من منصة Huggingface، لذا سنتعمق أكثر في إنشاء نموذج مخصص بدون الصنف <code>AutoClass</code>، حيث سنتعلم كيفية:
</p>

<ul>
	<li>
		تحميل ضبط النموذج وتخصيصه
	</li>
	<li>
		إنشاء بنية نموذج
	</li>
	<li>
		إنشاء مرمِّز Tokenizer للنص
	</li>
	<li>
		إنشاء معالج صور للمهام البصرية
	</li>
	<li>
		إنشاء مستخرج ميزات للمهام الصوتية
	</li>
	<li>
		إنشاء معالج مهام متعددة الوسائط
	</li>
</ul>

<h2 id="configuration">
	الضبط Configuration
</h2>

<p>
	يمثّل الضبط <a href="https://huggingface.co/docs/transformers/main_classes/configuration" rel="external nofollow">Configuration</a> السمات Attributes المحدَّدة للنموذج، حيث يكون لكل ضبط خاص بالنموذج سمات مختلفة، فمثلًا تحتوي جميع نماذج معالجة اللغات الطبيعية NLP على السمات <code>hidden_size</code> و <code>num_attention_heads</code> و <code>num_hidden_layers</code> و <code>vocab_size</code> وتحدّد هذه السمات عدد رؤوس الانتباه Attention Heads أو الطبقات المخفية التي سنبني نموذجًا باستخدامها.
</p>

<p>
	يمكن مطالعة على سمات النموذج <a href="https://huggingface.co/docs/transformers/model_doc/distilbert" rel="external nofollow"><code>DistilBERT</code></a> من خلال الوصول إلى صنف الضبط <a href="https://huggingface.co/docs/transformers/v4.44.2/en/model_doc/distilbert#transformers.DistilBertConfig" rel="external nofollow"><code>DistilBertConfig</code></a> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2656_7" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">DistilBertConfig</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> config </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DistilBertConfig</span><span class="pun">()</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">print</span><span class="pun">(</span><span class="pln">config</span><span class="pun">)</span><span class="pln">
</span><span class="typ">DistilBertConfig</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="str">"activation"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"gelu"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"attention_dropout"</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0.1</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"dim"</span><span class="pun">:</span><span class="pln"> </span><span class="lit">768</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"dropout"</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0.1</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"hidden_dim"</span><span class="pun">:</span><span class="pln"> </span><span class="lit">3072</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"initializer_range"</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0.02</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"max_position_embeddings"</span><span class="pun">:</span><span class="pln"> </span><span class="lit">512</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"model_type"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"distilbert"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"n_heads"</span><span class="pun">:</span><span class="pln"> </span><span class="lit">12</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"n_layers"</span><span class="pun">:</span><span class="pln"> </span><span class="lit">6</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"pad_token_id"</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"qa_dropout"</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0.1</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"seq_classif_dropout"</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0.2</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"sinusoidal_pos_embds"</span><span class="pun">:</span><span class="pln"> false</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"transformers_version"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"4.16.2"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"vocab_size"</span><span class="pun">:</span><span class="pln"> </span><span class="lit">30522</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يعرض الصنف <code>DistilBertConfig</code> جميع السمات الافتراضية المستخدمة لبناء النموذج <a href="https://huggingface.co/docs/transformers/v4.44.2/en/model_doc/distilbert#transformers.DistilBertModel" rel="external nofollow"><code>DistilBertModel</code></a> الأساسي، وتكون جميع السمات قابلة للتخصيص، مما يعطينا مساحة للتجريب، فمثلًا يمكننا تخصيص نموذج افتراضي بهدف:
</p>

<ul>
	<li>
		تجربة دالة تنشيط مختلفة باستخدام المعامل <code>activation</code>
	</li>
	<li>
		استخدام نسبة تسرب Dropout Ratio أعلى لاحتمالات الانتباه باستخدام المعامل <code>attention_dropout</code>
	</li>
</ul>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2656_9" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> my_config </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DistilBertConfig</span><span class="pun">(</span><span class="pln">activation</span><span class="pun">=</span><span class="str">"relu"</span><span class="pun">,</span><span class="pln"> attention_dropout</span><span class="pun">=</span><span class="lit">0.4</span><span class="pun">)</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">print</span><span class="pun">(</span><span class="pln">my_config</span><span class="pun">)</span><span class="pln">
</span><span class="typ">DistilBertConfig</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="str">"activation"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"relu"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"attention_dropout"</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0.4</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"dim"</span><span class="pun">:</span><span class="pln"> </span><span class="lit">768</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"dropout"</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0.1</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"hidden_dim"</span><span class="pun">:</span><span class="pln"> </span><span class="lit">3072</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"initializer_range"</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0.02</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"max_position_embeddings"</span><span class="pun">:</span><span class="pln"> </span><span class="lit">512</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"model_type"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"distilbert"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"n_heads"</span><span class="pun">:</span><span class="pln"> </span><span class="lit">12</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"n_layers"</span><span class="pun">:</span><span class="pln"> </span><span class="lit">6</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"pad_token_id"</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"qa_dropout"</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0.1</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"seq_classif_dropout"</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0.2</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"sinusoidal_pos_embds"</span><span class="pun">:</span><span class="pln"> false</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"transformers_version"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"4.16.2"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"vocab_size"</span><span class="pun">:</span><span class="pln"> </span><span class="lit">30522</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	<strong>ملاحظة</strong>: معدل التسرب Dropout Ratio هو تقنية مفيدة في تدريب الشبكات العصبية تساعد على منع الإفراط في التكيّف من خلال تعطيل بعض الخلايا العصبية عشوائيًا أثناء التدريب، وهذا يزيد قدرة النموذج على التعميم ويجعله أكثر قدرة على التعامل مع بيانات جديدة.
</p>

<p>
	يمكننا تعديل سمات النموذج المدرَّب مسبقًا في الدالة <a href="https://huggingface.co/docs/transformers/v4.44.2/en/main_classes/configuration#transformers.PretrainedConfig.from_pretrained" rel="external nofollow"><code>from_pretrained()‎</code></a> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2656_11" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> my_config </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DistilBertConfig</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="str">"distilbert/distilbert-base-uncased"</span><span class="pun">,</span><span class="pln"> activation</span><span class="pun">=</span><span class="str">"relu"</span><span class="pun">,</span><span class="pln"> attention_dropout</span><span class="pun">=</span><span class="lit">0.4</span><span class="pun">)</span></pre>

<p>
	يمكننا حفظ ضبط النموذج باستخدام الدالة <a href="https://huggingface.co/docs/transformers/v4.44.2/en/main_classes/configuration#transformers.PretrainedConfig.save_pretrained" rel="external nofollow"><code>save_pretrained()‎</code></a> بعد الانتهاء منه كما يلي، ويُخزَّن ملف الضبط الخاص بنا كملف JSON في مجلد الحفظ المحدَّد:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2656_13" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> my_config</span><span class="pun">.</span><span class="pln">save_pretrained</span><span class="pun">(</span><span class="pln">save_directory</span><span class="pun">=</span><span class="str">"./your_model_save_path"</span><span class="pun">)</span></pre>

<p>
	يمكننا إعادة استخدام ملف الضبط من خلال تحميله باستخدام الدالة <code>from_pretrained()‎</code> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2656_15" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> my_config </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DistilBertConfig</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="str">"./your_model_save_path/config.json"</span><span class="pun">)</span></pre>

<p>
	<strong>ملاحظة</strong>: يمكننا أيضًا حفظ ملف الضبط الخاص بنا على هيئة قاموس Dictionary أو حتى كمجرد فرق بين سمات الضبط المخصصة وسمات الضبط الافتراضية. يمكن الاطلاع على <a href="https://huggingface.co/docs/transformers/main_classes/configuration" rel="external nofollow">توثيق الضبط</a> على منصة Huggingface لمزيد من التفاصيل.
</p>

<h2 id="model">
	النموذج Model
</h2>

<p>
	سننشئ الآن نموذجًا، حيث يحدّد النموذج أو كما يشار إليه أحيانًا باسم البنية Architecture ما تفعله كل طبقة وما هي العمليات التي تحدث، وتُستخدَم السمات مثل <code>num_hidden_layers</code> من الضبط لتحديد هذه البنية. تتشارك جميع النماذج في الصنف الأساسي <a href="https://huggingface.co/docs/transformers/v4.44.2/en/main_classes/model#transformers.PreTrainedModel" rel="external nofollow"><code>PreTrainedModel</code></a> وبعض التوابع المشتركة مثل تغيير حجم تضمينات الإدخال وتقليم Pruning رؤوس الانتباه الذاتي Self-attention Heads أو تقليل الأجزاء غير الضرورية أو الفائضة من النموذج لتحسين كفاءته. تكون جميع النماذج أيضًا إما الصنف الفرعي <a href="https://pytorch.org/docs/stable/generated/torch.nn.Module.html" rel="external nofollow"><code>torch.nn.Module</code></a> أو <a href="https://www.tensorflow.org/api_docs/python/tf/keras/Model" rel="external nofollow"><code>tf.keras.Model</code></a> أو <a href="https://flax.readthedocs.io/en/latest/api_reference/flax.linen/module.html" rel="external nofollow"><code>flax.linen.Module</code></a>، وهذا يعني أن النماذج متوافقة مع استخدام كل إطار عمل خاص بها.
</p>

<p>
	في حال كنا نستخدم إطار العمل بايتورش <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A5%D8%B7%D8%A7%D8%B1-%D8%B9%D9%85%D9%84-%D8%A8%D8%A7%D9%8A-%D8%AA%D9%88%D8%B1%D8%B4-pytorch-%D9%88%D8%A3%D9%87%D9%85%D9%8A%D8%AA%D9%87-%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%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-r2311/" rel="">Pytorch</a> نحمّل سمات الضبط المخصصة الخاصة بنا في النموذج كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2656_17" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">DistilBertModel</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> my_config </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DistilBertConfig</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="str">"./your_model_save_path/config.json"</span><span class="pun">)</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DistilBertModel</span><span class="pun">(</span><span class="pln">my_config</span><span class="pun">)</span></pre>

<p>
	مما يؤدي لإنشاء نموذج مع قيم عشوائية بدل أوزان مُدرَّبة مسبقًا، ولكننا لن نتمكّن من استخدام هذا النموذج استخدامًا مفيدًا حتى ندرّبه. فالتدريب عملية مكلفة وتستغرق وقتًا طويلًا، لذا يُفضَّل استخدام نموذج مدرب مسبقًا للحصول على نتائج أفضل وأسرع مع استخدام جزء بسيط فقط من الموارد المطلوبة للتدريب، لذا سننشئ نموذجًا مدربًا مسبقًا باستخدام الدالة <code>from_pretrained()‎</code> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2656_19" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DistilBertModel</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="str">"distilbert/distilbert-base-uncased"</span><span class="pun">)</span></pre>

<p>
	يُحمَّل ضبط النموذج الافتراضي تلقائيًا عند تحميل الأوزان المُدرَّبة مسبقًا إذا وفرت <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%AD%D9%88%D9%91%D9%84%D8%A7%D8%AA-transformers-%D9%85%D9%86-%D9%85%D9%86%D8%B5%D8%A9-hugging-face-r2340/" rel="">مكتبة المحوّلات Transformers</a> هذا النموذج، ولكن لا يزال بإمكاننا وضع سماتنا الخاصة مكان بعض أو جميع سمات ضبط النموذج الافتراضي إذا أردنا ذلك كما يلي:
</p>

<pre class="ipsCode">&gt;&gt;&gt; model = DistilBertModel.from_pretrained("distilbert/distilbert-base-uncased", config=my_config)
</pre>

<p>
	وفي حال استخدمنا إطار العمل تنسرفلو TensorFlow، فحمّل سمات الضبط المخصصة في النموذج كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2656_21" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">TFDistilBertModel</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> my_config </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DistilBertConfig</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="str">"./your_model_save_path/my_config.json"</span><span class="pun">)</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> tf_model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">TFDistilBertModel</span><span class="pun">(</span><span class="pln">my_config</span><span class="pun">)</span></pre>

<p>
	مما يؤدي إلى إنشاء نموذج مع قيم عشوائية بدلًا من أوزان مُدرَّبة مسبقًا، ولكن لن نتمكّن من استخدام هذا النموذج استخدامًا مفيدًا حتى ندربه. إذ يُعَد التدريب عملية مكلفة وتستغرق وقتًا طويلًا، لذا يُفضّل استخدام نموذج مدرّب مسبقًا للحصول على نتائج أفضل وأسرع مع استخدام جزء بسيط فقط من الموارد المطلوبة للتدريب، لذا سننشئ نموذجًا مدربًا مسبقًا باستخدام الدالة <code>from_pretrained()‎</code> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2656_23" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> tf_model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">TFDistilBertModel</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="str">"distilbert/distilbert-base-uncased"</span><span class="pun">)</span></pre>

<p>
	يُحمَّل ضبط النموذج الافتراضي تلقائيًا عند تحميل الأوزان المُدرَّبة مسبقًا إذا وفّرت مكتبة المحوّلات Transformers هذا النموذج، ولكن لا يزال بإمكاننا وضع سماتنا الخاصة مكان بعض أو جميع سمات ضبط النموذج الافتراضي إذا أردنا ذلك كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2656_25" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> tf_model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">TFDistilBertModel</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="str">"distilbert/distilbert-base-uncased"</span><span class="pun">,</span><span class="pln"> config</span><span class="pun">=</span><span class="pln">my_config</span><span class="pun">)</span></pre>

<h3 id="modelheads">
	رؤوس النماذج Model heads
</h3>

<p>
	أصبح لدينا نموذج <code>DistilBERT</code> أساسي يعطي الحالات المخفية Hidden States التي تُمرَّر كدخل إلى رأس النموذج لإنتاج الخرج النهائي. توفر مكتبة المحوّلات Transformers رأس نموذج مختلف لكل مهمة طالما أن النموذج يدعم المهمة، أي لا يمكنك استخدام النموذج <code>DistilBERT</code> لمهمة التحويل من تسلسل إلى آخر Sequence-to-Sequence مثل مهمة الترجمة.
</p>

<p>
	في حال استخدمنا <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%AD%D9%88%D9%91%D9%84%D8%A7%D8%AA-transformers-%D9%85%D9%86-%D9%85%D9%86%D8%B5%D8%A9-hugging-face-r2340/" rel="">إطار العمل Pytorch</a> مع مكتبة Transformers، فإن النموذج <a href="https://huggingface.co/docs/transformers/v4.44.2/en/model_doc/distilbert#transformers.DistilBertForSequenceClassification" rel="external nofollow"><code>DistilBertForSequenceClassification</code></a> مثلًا هو نموذج <code>DistilBERT</code> أساسي مع رأس لتصنيف التسلسل، وهو بمثابة طبقة خطية فوق الخرج المجمَّع. إذًا سننشئ هذا النموذج كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2656_27" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">DistilBertForSequenceClassification</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DistilBertForSequenceClassification</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="str">"distilbert/distilbert-base-uncased"</span><span class="pun">)</span></pre>

<p>
	يمكننا إعادة استخدام نقطة التحقق السابقة بسهولة لمهمة أخرى من خلال التبديل إلى رأس نموذج مختلف، حيث يمكنك استخدام رأس النموذج <a href="https://huggingface.co/docs/transformers/v4.44.2/en/model_doc/distilbert#transformers.DistilBertForQuestionAnswering" rel="external nofollow"><code>DistilBertForQuestionAnswering</code></a> بالنسبة لمهمة الإجابة على سؤال كما يلي، إذ يشبه رأس الإجابة على سؤال رأس تصنيف التسلسل باستثناء أنه طبقة خطية فوق خرج الحالات المخفية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2656_29" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">DistilBertForQuestionAnswering</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DistilBertForQuestionAnswering</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="str">"distilbert/distilbert-base-uncased"</span><span class="pun">)</span></pre>

<p>
	وإذا كنا تستخدم إطار العمل تنسرفلو TensorFlow، فإن النموذج <a href="https://huggingface.co/docs/transformers/v4.44.2/en/model_doc/distilbert#transformers.TFDistilBertForSequenceClassification" rel="external nofollow"><code>TFDistilBertForSequenceClassification</code></a> مثلًا هو نموذج <code>DistilBERT</code> أساسي مع رأس لتصنيف التسلسل، والذي يُعَد طبقة خطية فوق الخرج المجمَّع. إذًا لننشئ هذا النموذج كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2656_31" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">TFDistilBertForSequenceClassification</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> tf_model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">TFDistilBertForSequenceClassification</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="str">"distilbert/distilbert-base-uncased"</span><span class="pun">)</span></pre>

<p>
	يمكننا إعادة استخدام نقطة التحقق السابقة بسهولة لمهمة أخرى من خلال التبديل إلى رأس نموذج مختلف، حيث يمكننا استخدام رأس النموذج <a href="https://huggingface.co/docs/transformers/v4.44.2/en/model_doc/distilbert#transformers.TFDistilBertForQuestionAnswering" rel="external nofollow"><code>TFDistilBertForQuestionAnswering</code></a> بالنسبة لمهمة الإجابة على سؤال كما يلي، إذ يشبه رأس الإجابة على سؤال رأس تصنيف التسلسل باستثناء أنه طبقة خطية فوق خرج الحالات المخفية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2656_33" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">TFDistilBertForQuestionAnswering</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> tf_model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">TFDistilBertForQuestionAnswering</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="str">"distilbert/distilbert-base-uncased"</span><span class="pun">)</span></pre>

<h2 id="tokenizer">
	المرمّز Tokenizer
</h2>

<p>
	الصنف الأساسي الأخير الذي نحتاجه قبل استخدام نموذج للبيانات النصية هو المرمّز <a href="https://huggingface.co/docs/transformers/main_classes/tokenizer" rel="external nofollow">tokenizer</a> لتحويل النص الأولي إلى موترات Tensors، حيث يوجد نوعان من المرمّزات يمكنك استخدامهما مع مكتبة المحولات Transformers هما:
</p>

<ul>
	<li>
		<a href="https://huggingface.co/docs/transformers/v4.44.2/en/main_classes/tokenizer#transformers.PreTrainedTokenizer" rel="external nofollow"><code>PreTrainedTokenizer</code></a> وهو تنفيذ لغة بايثون Python للمرمّز
	</li>
	<li>
		<a href="https://huggingface.co/docs/transformers/v4.44.2/en/main_classes/tokenizer#transformers.PreTrainedTokenizerFast" rel="external nofollow"><code>PreTrainedTokenizerFast</code></a>: هو مرمّز من مكتبة Tokenizer ويستند إلى <a href="https://academy.hsoub.com/programming/rust/" rel="">لغة رست Rust</a>، وتكون سرعة هذا النوع من المرمّزات ملحوظة وخاصة أثناء الترميز الدفعي Batch Tokenization بسبب تنفيذه باستخدام لغة رست. ويقدّم المرمِّز السريع توابع إضافية مثل ربط الإزاحة Offset Mapping الذي يربط الرموز Tokens بكلماتها أو محارفها الأصلية.
	</li>
</ul>

<p>
	يدعم هذان المرمِّزان التوابع الشائعة مثل التشفير وفك التشفير وإضافة رموز جديدة وإدارة الرموز الخاصة.
</p>

<p>
	<strong>ملاحظة</strong>: لا تدعم جميع النماذج المرمِّز السريع، لذا ألقِ نظرة على الجدول الموجود في مقال <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%AD%D9%88%D9%91%D9%84%D8%A7%D8%AA-transformers-%D9%85%D9%86-%D9%85%D9%86%D8%B5%D8%A9-hugging-face-r2340/" rel="">مكتبة المحوّلات Transformers من منصة Hugging Face</a> للتحقق من دعم النموذج للمرمِّز السريع.
</p>

<p>
	يمكنك إنشاء مرمّز من ملف المفردات vocabulary الخاص بنا كما يلي لإنشاء خاص مرمّز بنا:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2656_35" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">DistilBertTokenizer</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> my_tokenizer </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DistilBertTokenizer</span><span class="pun">(</span><span class="pln">vocab_file</span><span class="pun">=</span><span class="str">"my_vocab_file.txt"</span><span class="pun">,</span><span class="pln"> do_lower_case</span><span class="pun">=</span><span class="kwd">False</span><span class="pun">,</span><span class="pln"> padding_side</span><span class="pun">=</span><span class="str">"left"</span><span class="pun">)</span></pre>

<p>
	يجب أن نتذكر أن المفردات القادمة من المرمّز المخصَّص ستكون مختلفة عن المفردات التي يولّدها مرمّز النموذج المُدرَّب مسبقًا، لذا سنحتاج لاستخدام مفردات نموذج مدرب مسبقًا إذا استخدمنا نموذج مُدرَّب مسبقًا، وإلّا لن يكون للدخل أي معنى. لننشئ مرمّز باستخدام مفردات نموذج مدرب مسبقًا باستخدام الصنف <a href="https://huggingface.co/docs/transformers/v4.44.2/en/model_doc/distilbert#transformers.DistilBertTokenizer" rel="external nofollow"><code>DistilBertTokenizer</code></a> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2656_37" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">DistilBertTokenizer</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> slow_tokenizer </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DistilBertTokenizer</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="str">"distilbert/distilbert-base-uncased"</span><span class="pun">)</span></pre>

<p>
	ولننشئ مرمّز سريع باستخدام الصنف <a href="https://huggingface.co/docs/transformers/v4.44.2/en/model_doc/distilbert#transformers.DistilBertTokenizerFast" rel="external nofollow"><code>DistilBertTokenizerFast</code></a> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2656_39" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">DistilBertTokenizerFast</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> fast_tokenizer </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DistilBertTokenizerFast</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="str">"distilbert/distilbert-base-uncased"</span><span class="pun">)</span></pre>

<p>
	<strong>ملاحظة</strong>: سيحاول الصنف <a href="https://huggingface.co/docs/transformers/v4.44.2/en/model_doc/auto#transformers.AutoTokenizer" rel="external nofollow"><code>AutoTokenizer</code></a> افتراضيًا تحميل مرمّز سريع، ولكن يمكنك تعطيل هذا السلوك من خلال ضبط القيمة <code>use_fast=False</code> في الدالة <code>from_pretrained</code>.
</p>

<h2 id="imageprocessor">
	معالج الصور Image Processor
</h2>

<p>
	يعالج معالج الصور المدخلات البصرية، وهو يرث الصنف <a href="https://huggingface.co/docs/transformers/v4.44.2/en/internal/image_processing_utils#transformers.ImageProcessingMixin" rel="external nofollow"><code>ImageProcessingMixin</code></a> الأساسي، ويمكن استخدامه من خلال إنشاء معالج صور مرتبط بالنموذج الذي تستخدمه، فمثلًا يمكننا إنشاء صنف <a href="https://huggingface.co/docs/transformers/v4.44.2/en/model_doc/vit#transformers.ViTImageProcessor" rel="external nofollow"><code>ViTImageProcessor</code></a> افتراضي كما يلي، إذا كنا نستخدم النموذج <a href="https://huggingface.co/docs/transformers/model_doc/vit" rel="external nofollow">ViT</a> أو المحوّل البصري Vision Transformer لتصنيف الصور:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2656_41" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">ViTImageProcessor</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> vit_extractor </span><span class="pun">=</span><span class="pln"> </span><span class="typ">ViTImageProcessor</span><span class="pun">()</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">print</span><span class="pun">(</span><span class="pln">vit_extractor</span><span class="pun">)</span><span class="pln">
</span><span class="typ">ViTImageProcessor</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="str">"do_normalize"</span><span class="pun">:</span><span class="pln"> true</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"do_resize"</span><span class="pun">:</span><span class="pln"> true</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"image_processor_type"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"ViTImageProcessor"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"image_mean"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
    </span><span class="lit">0.5</span><span class="pun">,</span><span class="pln">
    </span><span class="lit">0.5</span><span class="pun">,</span><span class="pln">
    </span><span class="lit">0.5</span><span class="pln">
  </span><span class="pun">],</span><span class="pln">
  </span><span class="str">"image_std"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
    </span><span class="lit">0.5</span><span class="pun">,</span><span class="pln">
    </span><span class="lit">0.5</span><span class="pun">,</span><span class="pln">
    </span><span class="lit">0.5</span><span class="pln">
  </span><span class="pun">],</span><span class="pln">
  </span><span class="str">"resample"</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"size"</span><span class="pun">:</span><span class="pln"> </span><span class="lit">224</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	<strong>ملاحظة</strong>: إن لم نكن نريد تخصيص أيّ شيء، فما علينا سوى استخدام التابع <code>from_pretrained</code> لتحميل معاملات معالج الصور الافتراضية للنموذج.
</p>

<p>
	لنعدّل الآن أحد معاملات الصنف <code>ViTImageProcessor</code> لإنشاء معالج الصور المخصَّص كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2656_43" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">ViTImageProcessor</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> my_vit_extractor </span><span class="pun">=</span><span class="pln"> </span><span class="typ">ViTImageProcessor</span><span class="pun">(</span><span class="pln">resample</span><span class="pun">=</span><span class="str">"PIL.Image.BOX"</span><span class="pun">,</span><span class="pln"> do_normalize</span><span class="pun">=</span><span class="kwd">False</span><span class="pun">,</span><span class="pln"> image_mean</span><span class="pun">=[</span><span class="lit">0.3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.3</span><span class="pun">])</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">print</span><span class="pun">(</span><span class="pln">my_vit_extractor</span><span class="pun">)</span><span class="pln">
</span><span class="typ">ViTImageProcessor</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="str">"do_normalize"</span><span class="pun">:</span><span class="pln"> false</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"do_resize"</span><span class="pun">:</span><span class="pln"> true</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"image_processor_type"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"ViTImageProcessor"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"image_mean"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
    </span><span class="lit">0.3</span><span class="pun">,</span><span class="pln">
    </span><span class="lit">0.3</span><span class="pun">,</span><span class="pln">
    </span><span class="lit">0.3</span><span class="pln">
  </span><span class="pun">],</span><span class="pln">
  </span><span class="str">"image_std"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
    </span><span class="lit">0.5</span><span class="pun">,</span><span class="pln">
    </span><span class="lit">0.5</span><span class="pun">,</span><span class="pln">
    </span><span class="lit">0.5</span><span class="pln">
  </span><span class="pun">],</span><span class="pln">
  </span><span class="str">"resample"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"PIL.Image.BOX"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"size"</span><span class="pun">:</span><span class="pln"> </span><span class="lit">224</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2 id="backbone">
	العمود الفقري Backbone
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="164365" href="https://academy.hsoub.com/uploads/monthly_2024_12/01--.png.39d5003d4cbf31454b27e826ea3c7a93.png" rel=""><img alt="01 العمود الفقري" class="ipsImage ipsImage_thumbnailed" data-fileid="164365" data-unique="jv4mstjz2" src="https://academy.hsoub.com/uploads/monthly_2024_12/01--.thumb.png.f042c975115b9731d08fbc6c63a2e74d.png"> </a>
</p>

<p>
	تتكون نماذج الرؤية الحاسوبية من العمود الفقري Backbone والعنق Neck والرأس Head، حيث يستخرج العمود الفقري الميزات Features من صورة الدخل، ويجمع العنق الميزات المستخرجة ويحسّنها، ويُستخدم الرأس للمهمة الرئيسية مثل اكتشاف الكائنات. دعنا نبدأ بتهيئة العمود الفقري في ضبط النموذج ونحدد تحميل أوزان مدرَّبة مسبقًا أو تحميل أوزان مُهيَّأة عشوائيًا، ثم يمكننا تمرير ضبط النموذج إلى الرأس.
</p>

<p>
	إذا أردنا مثلًا تحميل العمود الفقري <code>ResNet</code> في النموذج <code>MaskFormer</code> باستخدام رأس تقسيم أجزاء الصورة كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2656_45" style=""><span class="pun">&lt;</span><span class="pln">hfoptions id</span><span class="pun">=</span><span class="str">"backbone"</span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln">hfoption id</span><span class="pun">=</span><span class="str">"pretrained weights"</span><span class="pun">&gt;</span></pre>

<p>
	فيجب ضبط القيمة <code>use_pretrained_backbone=True</code> لتحميل أوزان ResNet المدرَّبة مسبقًا للعمود الفقري كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2656_47" style=""><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">MaskFormerConfig</span><span class="pun">,</span><span class="pln"> </span><span class="typ">MaskFormerForInstanceSegmentation</span><span class="pln">

config </span><span class="pun">=</span><span class="pln"> </span><span class="typ">MaskFormerConfig</span><span class="pun">(</span><span class="pln">backbone</span><span class="pun">=</span><span class="str">"microsoft/resnet-50"</span><span class="pun">,</span><span class="pln"> use_pretrained_backbone</span><span class="pun">=</span><span class="kwd">True</span><span class="pun">)</span><span class="pln"> </span><span class="com"># ضبط العمود الفقري والعنق</span><span class="pln">
model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">MaskFormerForInstanceSegmentation</span><span class="pun">(</span><span class="pln">config</span><span class="pun">)</span><span class="pln"> </span><span class="com"># الرأس</span></pre>

<p>
	وإذا أردنا تحميل العمود الفقري <code>ResNet</code> في النموذج <code>MaskFormer</code> باستخدام رأس تقسيم أجزاء الصورة كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2656_49" style=""><span class="pun">&lt;/</span><span class="pln">hfoption</span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln">hfoption id</span><span class="pun">=</span><span class="str">"random weights"</span><span class="pun">&gt;</span><span class="pln"> </span></pre>

<p>
	فيجب ضبط القيمة <code>use_pretrained_backbone=False</code> لتهيئة العمود الفقري ResNet عشوائيًا كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2656_51" style=""><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">MaskFormerConfig</span><span class="pun">,</span><span class="pln"> </span><span class="typ">MaskFormerForInstanceSegmentation</span><span class="pln">

config </span><span class="pun">=</span><span class="pln"> </span><span class="typ">MaskFormerConfig</span><span class="pun">(</span><span class="pln">backbone</span><span class="pun">=</span><span class="str">"microsoft/resnet-50"</span><span class="pun">,</span><span class="pln"> use_pretrained_backbone</span><span class="pun">=</span><span class="kwd">False</span><span class="pun">)</span><span class="pln"> </span><span class="com"># ضبط العمود الفقري والعنق</span><span class="pln">
model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">MaskFormerForInstanceSegmentation</span><span class="pun">(</span><span class="pln">config</span><span class="pun">)</span><span class="pln"> </span><span class="com"># الرأس</span></pre>

<p>
	يمكن أيضًا تحميل ضبط العمود الفقري بطريقة منفصلة ثم تمريره إلى ضبط النموذج كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2656_53" style=""><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">MaskFormerConfig</span><span class="pun">,</span><span class="pln"> </span><span class="typ">MaskFormerForInstanceSegmentation</span><span class="pun">,</span><span class="pln"> </span><span class="typ">ResNetConfig</span><span class="pln">

backbone_config </span><span class="pun">=</span><span class="pln"> </span><span class="typ">ResNetConfig</span><span class="pun">()</span><span class="pln">
config </span><span class="pun">=</span><span class="pln"> </span><span class="typ">MaskFormerConfig</span><span class="pun">(</span><span class="pln">backbone_config</span><span class="pun">=</span><span class="pln">backbone_config</span><span class="pun">)</span><span class="pln">
model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">MaskFormerForInstanceSegmentation</span><span class="pun">(</span><span class="pln">config</span><span class="pun">)</span></pre>

<p>
	تُحمَّل نماذج المكتبة <a href="https://huggingface.co/docs/timm/index" rel="external nofollow"><code>timm</code></a> ضمن نموذج كما يلي باستخدام القيمة <code>use_timm_backbone=True</code> أو باستخدام الصنف <a href="https://huggingface.co/docs/transformers/v4.44.2/en/main_classes/backbones#transformers.TimmBackbone" rel="external nofollow"><code>TimmBackbone</code></a> والصنف <a href="https://huggingface.co/docs/transformers/v4.44.2/en/main_classes/backbones#transformers.TimmBackboneConfig" rel="external nofollow"><code>TimmBackboneConfig</code></a>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2656_55" style=""><span class="pun">&lt;/</span><span class="pln">hfoption</span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">&lt;/</span><span class="pln">hfoptions id</span><span class="pun">=</span><span class="str">"timm backbone"</span><span class="pun">&gt;</span><span class="pln"> </span></pre>

<p>
	لذا سنستخدم القيمة <code>use_timm_backbone=True</code> و <code>use_pretrained_backbone=True</code> لتحميل أوزان <code>timm</code> المدرَّبة مسبقًا للعمود الفقري كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2656_57" style=""><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">MaskFormerConfig</span><span class="pun">,</span><span class="pln"> </span><span class="typ">MaskFormerForInstanceSegmentation</span><span class="pln">

config </span><span class="pun">=</span><span class="pln"> </span><span class="typ">MaskFormerConfig</span><span class="pun">(</span><span class="pln">backbone</span><span class="pun">=</span><span class="str">"resnet50"</span><span class="pun">,</span><span class="pln"> use_pretrained_backbone</span><span class="pun">=</span><span class="kwd">True</span><span class="pun">,</span><span class="pln"> use_timm_backbone</span><span class="pun">=</span><span class="kwd">True</span><span class="pun">)</span><span class="pln"> </span><span class="com"># ضبط العمود الفقري والعنق</span><span class="pln">
model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">MaskFormerForInstanceSegmentation</span><span class="pun">(</span><span class="pln">config</span><span class="pun">)</span><span class="pln"> </span><span class="com"># الرأس</span></pre>

<p>
	ولنضبط الآن القيمة <code>use_timm_backbone=True</code> و <code>use_pretrained_backbone=False</code> لتحميل العمود الفقري <code>timm</code> المهيَّأ عشوائيًا كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2656_59" style=""><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">MaskFormerConfig</span><span class="pun">,</span><span class="pln"> </span><span class="typ">MaskFormerForInstanceSegmentation</span><span class="pln">

config </span><span class="pun">=</span><span class="pln"> </span><span class="typ">MaskFormerConfig</span><span class="pun">(</span><span class="pln">backbone</span><span class="pun">=</span><span class="str">"resnet50"</span><span class="pun">,</span><span class="pln"> use_pretrained_backbone</span><span class="pun">=</span><span class="kwd">False</span><span class="pun">,</span><span class="pln"> use_timm_backbone</span><span class="pun">=</span><span class="kwd">True</span><span class="pun">)</span><span class="pln"> </span><span class="com"># ضبط العمود الفقري والعنق</span><span class="pln">
model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">MaskFormerForInstanceSegmentation</span><span class="pun">(</span><span class="pln">config</span><span class="pun">)</span><span class="pln"> </span><span class="com"># الرأس</span></pre>

<p>
	يمكننا أيضًا تحميل ضبط العمود الفقري واستخدامه لإنشاء الصنف <code>TimmBackbone</code> أو تمريره إلى ضبط النموذج، حيث ستحمّل الأعمدة الفقرية Timm الأوزان المدرَّبة مسبقًا افتراضيًا، لذا سنضبط القيمة <code>use_pretrained_backbone=False</code> لتحميل الأوزان المُهيَّأة عشوائيًا كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2656_61" style=""><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">TimmBackboneConfig</span><span class="pun">,</span><span class="pln"> </span><span class="typ">TimmBackbone</span><span class="pln">

backbone_config </span><span class="pun">=</span><span class="pln"> </span><span class="typ">TimmBackboneConfig</span><span class="pun">(</span><span class="str">"resnet50"</span><span class="pun">,</span><span class="pln"> use_pretrained_backbone</span><span class="pun">=</span><span class="kwd">False</span><span class="pun">)</span><span class="pln">

</span><span class="com"># إنشاء صنف العمود الفقري</span><span class="pln">
backbone </span><span class="pun">=</span><span class="pln"> </span><span class="typ">TimmBackbone</span><span class="pun">(</span><span class="pln">config</span><span class="pun">=</span><span class="pln">backbone_config</span><span class="pun">)</span><span class="pln">

</span><span class="com"># إنشاء نموذج باستخدام العمود الفقري‫ timm</span><span class="pln">
</span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">MaskFormerConfig</span><span class="pun">,</span><span class="pln"> </span><span class="typ">MaskFormerForInstanceSegmentation</span><span class="pln">

config </span><span class="pun">=</span><span class="pln"> </span><span class="typ">MaskFormerConfig</span><span class="pun">(</span><span class="pln">backbone_config</span><span class="pun">=</span><span class="pln">backbone_config</span><span class="pun">)</span><span class="pln">
model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">MaskFormerForInstanceSegmentation</span><span class="pun">(</span><span class="pln">config</span><span class="pun">)</span></pre>

<h2 id="featureextractor">
	مستخرج الميزات Feature Extractor
</h2>

<p>
	يعالج مستخرج الميزات المدخلات الصوتية، وهو يرث الصنف <a href="https://huggingface.co/docs/transformers/v4.44.2/en/main_classes/feature_extractor#transformers.FeatureExtractionMixin" rel="external nofollow"><code>FeatureExtractionMixin</code></a> الأساسي، ويمكن أن يرث أيضًا الصنف <a href="https://huggingface.co/docs/transformers/v4.44.2/en/main_classes/feature_extractor#transformers.SequenceFeatureExtractor" rel="external nofollow"><code>SequenceFeatureExtractor</code></a> لمعالجة المدخلات الصوتية. لننشئ الآن مستخرج ميزات مرتبط بالنموذج الذي تستخدمه مثل إنشاء صنف <a href="https://huggingface.co/docs/transformers/v4.44.2/en/model_doc/wav2vec2#transformers.Wav2Vec2FeatureExtractor" rel="external nofollow"><code>Wav2Vec2FeatureExtractor</code></a> افتراضي كما يلي إذا كنت تستخدم النموذج <a href="https://huggingface.co/docs/transformers/model_doc/wav2vec2" rel="external nofollow"><code>Wav2Vec2</code></a> لتصنيف الأصوات:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2656_63" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">Wav2Vec2FeatureExtractor</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> w2v2_extractor </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Wav2Vec2FeatureExtractor</span><span class="pun">()</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">print</span><span class="pun">(</span><span class="pln">w2v2_extractor</span><span class="pun">)</span><span class="pln">
</span><span class="typ">Wav2Vec2FeatureExtractor</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="str">"do_normalize"</span><span class="pun">:</span><span class="pln"> true</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"feature_extractor_type"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"Wav2Vec2FeatureExtractor"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"feature_size"</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"padding_side"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"right"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"padding_value"</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0.0</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"return_attention_mask"</span><span class="pun">:</span><span class="pln"> false</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"sampling_rate"</span><span class="pun">:</span><span class="pln"> </span><span class="lit">16000</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	<strong>ملاحظة</strong>: إن لم نكن نرغب بتخصيص أيّ شيء، فما علينا سوى استخدام التابع <code>from_pretrained</code> لتحميل معاملات مستخرج الميزات الافتراضية الخاصة بالنموذج.
</p>

<p>
	لنعدّل الآن أحد معاملات الصنف <code>Wav2Vec2FeatureExtractor</code> لإنشاء مستخرج الميزات المخصَّص الخاص بنا كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2656_65" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">Wav2Vec2FeatureExtractor</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> w2v2_extractor </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Wav2Vec2FeatureExtractor</span><span class="pun">(</span><span class="pln">sampling_rate</span><span class="pun">=</span><span class="lit">8000</span><span class="pun">,</span><span class="pln"> do_normalize</span><span class="pun">=</span><span class="kwd">False</span><span class="pun">)</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">print</span><span class="pun">(</span><span class="pln">w2v2_extractor</span><span class="pun">)</span><span class="pln">
</span><span class="typ">Wav2Vec2FeatureExtractor</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="str">"do_normalize"</span><span class="pun">:</span><span class="pln"> false</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"feature_extractor_type"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"Wav2Vec2FeatureExtractor"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"feature_size"</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"padding_side"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"right"</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"padding_value"</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0.0</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"return_attention_mask"</span><span class="pun">:</span><span class="pln"> false</span><span class="pun">,</span><span class="pln">
  </span><span class="str">"sampling_rate"</span><span class="pun">:</span><span class="pln"> </span><span class="lit">8000</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2 id="processor">
	المعالج Processor
</h2>

<p>
	تقدم مكتبة المحوِّلات Transformers صنف المعالج الذي يغلِّف أصناف المعالجة مثل مستخرج الميزات والمرمِّز في كائن واحد بالنسبة للنماذج التي تدعم المهام متعددة الوسائط. لنستخدم مثلًا الصنف <a href="https://huggingface.co/docs/transformers/v4.44.2/en/model_doc/wav2vec2#transformers.Wav2Vec2Processor" rel="external nofollow"><code>Wav2Vec2Processor</code></a> لمهمة التعرّف التلقائي على الكلام Automatic Speech Recognition أو ASR اختصارًا، والتي تحوّل الصوت إلى نص، لذا ستحتاج إلى مستخرج ميزات ومرمّز.
</p>

<p>
	لننشئ أولًا مستخرج ميزات للتعامل مع المدخلات الصوتية كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2656_67" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">Wav2Vec2FeatureExtractor</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> feature_extractor </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Wav2Vec2FeatureExtractor</span><span class="pun">(</span><span class="pln">padding_value</span><span class="pun">=</span><span class="lit">1.0</span><span class="pun">,</span><span class="pln"> do_normalize</span><span class="pun">=</span><span class="kwd">True</span><span class="pun">)</span></pre>

<p>
	ثم ننشئ مرمّز للتعامل مع المدخلات النصية كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2656_69" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">Wav2Vec2CTCTokenizer</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> tokenizer </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Wav2Vec2CTCTokenizer</span><span class="pun">(</span><span class="pln">vocab_file</span><span class="pun">=</span><span class="str">"my_vocab_file.txt"</span><span class="pun">)</span></pre>

<p>
	ثم ندمج مستخرج الميزات والمرمّز في الصنف <code>Wav2Vec2Processor</code> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2656_71" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">Wav2Vec2Processor</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> processor </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Wav2Vec2Processor</span><span class="pun">(</span><span class="pln">feature_extractor</span><span class="pun">=</span><span class="pln">feature_extractor</span><span class="pun">,</span><span class="pln"> tokenizer</span><span class="pun">=</span><span class="pln">tokenizer</span><span class="pun">)</span></pre>

<h2>
	الخلاصة
</h2>

<p>
	يمكننا إنشاء أي من النماذج التي تدعمها مكتبة المحولات Transformers من منصة Huggingface باستخدام صنفين أساسيين للضبط والنموذج وصنف إضافي للمعالجة المسبَقة مثل مرمِّز أو معالج صور أو مُستخرج ميزات أو معالج، وتكون هذه الأصناف الأساسية قابلة للضبط، مما يسمح لنا باستخدام السمات المحدَّدة التي نريدها، ويمكن بسهولة إعداد نموذج للتدريب أو تعديل نموذج مُدرَّب مسبقًا لصقله Fine-tune.
</p>

<p>
	ترجمة -وبتصرّف- للقسم <a href="https://huggingface.co/docs/transformers/create_a_model" rel="external nofollow">Create a custom architecture</a> من توثيقات Hugging Face.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%AD%D9%88%D9%91%D9%84%D8%A7%D8%AA-transformers-r2352/" rel="">تثبيت مكتبة المحوّلات Transformers</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%85%D8%A7-%D9%87%D9%8A-%D9%85%D9%86%D8%B5%D8%A9-hugging-face-%D9%84%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-r2449/" rel="">ما هي منصة Hugging Face للذكاء الاصطناعي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%85%D8%B4%D8%A7%D8%B1%D9%83%D8%A9-%D9%86%D9%85%D9%88%D8%B0%D8%AC-%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%B9%D9%84%D9%89-%D9%85%D9%86%D8%B5%D8%A9-hugging-face-r2378/" rel="">مشاركة نموذج ذكاء اصطناعي على منصة Hugging Face</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A8%D9%86%D8%A7%D8%A1-%D8%B1%D9%88%D8%A8%D9%88%D8%AA%D8%A7%D8%AA-%D9%84%D9%84%D8%B9%D8%A8-%D8%A7%D9%84%D8%A3%D9%84%D8%B9%D8%A7%D8%A8-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%B7%D8%B1%D9%8A%D9%82%D8%A9-%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D9%85%D8%B9%D8%B2%D8%B2-%D9%88%D9%85%D8%B4%D8%AA%D9%82%D8%A7%D8%AA%D9%87%D8%A7-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-tensorflow-r1268/" rel="">بناء روبوتات للعب الألعاب باستخدام طريقة التعلم المعزز ومشتقاتها باستخدام مكتبة TensorFlow</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A8%D9%86%D8%A7%D8%A1-%D8%B4%D8%A8%D9%83%D8%A9-%D8%B9%D8%B5%D8%A8%D9%8A%D8%A9-%D9%84%D9%84%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%A3%D8%B1%D9%82%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D9%83%D8%AA%D9%88%D8%A8%D8%A9-%D8%A8%D8%AE%D8%B7-%D8%A7%D9%84%D9%8A%D8%AF-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-tensorflow-r1267/" rel="">بناء شبكة عصبية للتعرف على الأرقام المكتوبة بخط اليد باستخدام مكتبة TensorFlow</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2476</guid><pubDate>Mon, 30 Dec 2024 16:07:05 +0000</pubDate></item><item><title>&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x645;&#x643;&#x62A;&#x628;&#x629; &#x627;&#x644;&#x645;&#x631;&#x645;&#x632;&#x627;&#x62A; Tokenizers &#x641;&#x64A; &#x645;&#x646;&#x635;&#x629; Hugging Face</title><link>https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%B1%D9%85%D8%B2%D8%A7%D8%AA-tokenizers-%D9%81%D9%8A-%D9%85%D9%86%D8%B5%D8%A9-hugging-face-r2470/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_12/Tokenizers_.png.2c7f9cdeba95a369d9f7e5f7fb5e6c14.png" /></p>
<p>
	نشرح في هذا المقال كيفية استخدام مكتبة ترميز النصوص Tokenizers التي توفرها منصة Hugging Face ونشرح طريقة استخدامها لتقسيم النصوص إلى رموز أو وحدات صغيرة تسمى Tokens، كما نوضح الخطوات المتبعة لإنشاء مقسِّم نصوص باستخدام خوارزمية <a href="https://ar.wikipedia.org/wiki/%D8%AA%D8%B1%D9%85%D9%8A%D8%B2_%D8%B2%D9%88%D8%AC_%D8%A7%D9%84%D8%A8%D8%A7%D9%8A%D8%AA%D8%A7%D8%AA" rel="external nofollow">ترميز زوج البتات Byte Pair Encoding</a> التي توفرها المكتبة ونشرح طريقة استخدامه وتدريبه على بيانات مخصصة.
</p>

<h2 id="">
	إنشاء مرمز نصوص
</h2>

<p>
	سنستخدم الصنف <code>PreTrainedTokenizerFast</code> من المكتبة <a href="https://huggingface.co/docs/tokenizers/index" rel="external nofollow">Tokenizers</a> التابعة لمنصة Hugging Face والتي توفر لنا العديد من التوابع لترميز النصوص بسرعة وكفاءة، كما تتيح لنا إمكانية تحميل المُرمِّزات التي أنشأناها بسهولة للعمل داخل <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%AD%D9%88%D9%91%D9%84%D8%A7%D8%AA-transformers-%D9%85%D9%86-%D9%85%D9%86%D8%B5%D8%A9-hugging-face-r2340/" rel="">مكتبة المحولات Transformers</a>، مما يسهل دمجها مع النماذج اللغوية.
</p>

<p>
	لنفهم أساسيات بناء مرمِّز مخصص باستخدام مكتبة <code>Tokenizers</code> من أجل تخصيصه لبيانات محددة أو تطبيقات خاصة، بدلاً من الاعتماد على مرمزات جاهزة قد لا تكون مثالية لجميع الحالات. لنبدأ أولًا بإنشاء مرمِّز تجريبي كما يلي قبل الدخول بالتفاصيل:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9116_9" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> tokenizers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">Tokenizer</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> tokenizers</span><span class="pun">.</span><span class="pln">models </span><span class="kwd">import</span><span class="pln"> BPE
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> tokenizers</span><span class="pun">.</span><span class="pln">trainers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">BpeTrainer</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> tokenizers</span><span class="pun">.</span><span class="pln">pre_tokenizers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">Whitespace</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> tokenizer </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Tokenizer</span><span class="pun">(</span><span class="pln">BPE</span><span class="pun">(</span><span class="pln">unk_token</span><span class="pun">=</span><span class="str">"[UNK]"</span><span class="pun">))</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> trainer </span><span class="pun">=</span><span class="pln"> </span><span class="typ">BpeTrainer</span><span class="pun">(</span><span class="pln">special_tokens</span><span class="pun">=[</span><span class="str">"[UNK]"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"[CLS]"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"[SEP]"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"[PAD]"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"[MASK]"</span><span class="pun">])</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> tokenizer</span><span class="pun">.</span><span class="pln">pre_tokenizer </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Whitespace</span><span class="pun">()</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> files </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[...]</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> tokenizer</span><span class="pun">.</span><span class="pln">train</span><span class="pun">(</span><span class="pln">files</span><span class="pun">,</span><span class="pln"> trainer</span><span class="pun">)</span></pre>

<p>
	أصبح لدينا الآن مُرمِّز مُدرَّب على الملفات التي حددناها والتي تحتوي على النصوص المستخدمة لتدريب المرمِّز، وبالتالي يمكننا الاستمرار في استخدامه في وقت التشغيل أو حفظه في ملف JSON لإعادة استخدامه لاحقًا.
</p>

<h2 id="-1">
	التحميل المباشر من كائن المرمز
</h2>

<p>
	لنوضح الآن كيف يمكننا الاستفادة من كائن المرمِّز الذي أنشأناه في الفقرة السابقة داخل <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%AD%D9%88%D9%91%D9%84%D8%A7%D8%AA-transformers-%D9%85%D9%86-%D9%85%D9%86%D8%B5%D8%A9-hugging-face-r2340/" rel="">مكتبة المحوّلات Transformers</a> المخصصة لمعالجة اللغات الطبيعية NLP، حيث يسمح الصنف <code>PreTrainedTokenizerFast</code> بإنشاء نسخ جديدة بسهولة من خلال قبول نسخة كائن المرمِّز <code>tokenizer</code> كوسيط كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_776_11" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">PreTrainedTokenizerFast</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> fast_tokenizer </span><span class="pun">=</span><span class="pln"> </span><span class="typ">PreTrainedTokenizerFast</span><span class="pun">(</span><span class="pln">tokenizer_object</span><span class="pun">=</span><span class="pln">tokenizer</span><span class="pun">)</span></pre>

<p>
	ويمكن الآن استخدام هذا الكائن مع جميع التوابع المشتركة بين مرمِّزات مكتبة المحوّلات Transformers والتي تساعد في تحويل النصوص إلى تمثيلات قابلة للاستخدام في النماذج اللغوية، مما يسهل عملية التدريب والتنبؤ باستخدام نماذج المحوّلات المختلفة.
</p>

<h2 id="json">
	تحميل المرمز من ملف JSON
</h2>

<p>
	يمكن تحميل مرمَّز من ملف JSON من خلال حفظ المرمِّز أولًا كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_776_7" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> tokenizer</span><span class="pun">.</span><span class="pln">save</span><span class="pun">(</span><span class="str">"tokenizer.json"</span><span class="pun">)</span></pre>

<p>
	يمكننا بعد ذلك تمرير المسار الذي حفظنا فيه هذا الملف إلى تابع التهيئة الخاص بهذا الصنف <code>PreTrainedTokenizerFast</code> باستخدام المعامل <code>tokenizer_file</code> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_776_9" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">PreTrainedTokenizerFast</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> fast_tokenizer </span><span class="pun">=</span><span class="pln"> </span><span class="typ">PreTrainedTokenizerFast</span><span class="pun">(</span><span class="pln">tokenizer_file</span><span class="pun">=</span><span class="str">"tokenizer.json"</span><span class="pun">)</span></pre>

<p>
	ويمكن الآن استخدام هذا الكائن مع جميع التوابع المشتركة بين مرمِّزات مكتبة المحوِّلات Transformers.
</p>

<h1 id="multilingualmodels">
	استخدام النماذج متعددة اللغات Multilingual Models للاستدلال
</h1>

<p>
	توفر مكتبة المحوِّلات Transformers العديد من النماذج متعددة اللغات، وهي نماذج مدربة على بيانات متعددة اللغات ويمكنها التعامل مع نصوص بلغات مختلفة، يختلف استخدام هذه النماذج في الاستدلال والتنبؤ وتحليل النصوص عن النماذج التي تدعم لغة واحدة فقط في بعض الأحيان، ومع ذلك، يمكن استخدام معظم النماذج متعددة اللغات بنفس طريقة استخدام النماذج أحادية اللغة.
</p>

<p>
	على سبيل المثال، يمكننا استخدام نموذج مثل <code><a href="https://huggingface.co/google-bert/bert-base-multilingual-uncased" rel="external nofollow">bert/bert-base-multilingual-uncased</a></code> من جوجل بنفس طريقة استخدام النماذج أحادية اللغة، لكننا سنركز في الفقرات التالية على شرح النماذج متعددة اللغات التي يختلف استخدامها عن استخدام النماذج أحادية اللغة لإجراء عمليات الاستدلال.
</p>

<h2 id="xlm">
	نموذج XLM
</h2>

<p>
	يحتوي نموذج XLM متعدد اللغات على عشر نقاط تحقق Checkpoints مختلفة تمثل حالات مختلفة من تدريب النموذج، وتكون نقطة واحدة منها فقط أحادية اللغة بينما تتعامل النقاط التسع الأخرى مع لغات متعددة، ويمكن تقسيم هذه النقاط التسع إلى فئتين هما: نقاط التحقق التي تستخدم تضمينات اللغة Language Embeddings للتمييز بين اللغات المختلفة ونقاط التحقق التي لا تستخدم هذه التضمينات.
</p>

<p>
	<strong>ملاحظة</strong>: التضمينات اللغوية Language Embeddings هي طريقة لتحويل الكلمات والجمل إلى أرقام يمكن للنماذج الحاسوبية التعامل معها، الهدف منها هو جعل الحاسوب قادرًا على فهم اللغة البشرية ومعاني الكلمات بناءً على سياقها، فكلما كانت الكلمات ذات معاني مشابهة، ستكون تضميناتها العددية أقرب لبعضها وتستخدم في مجال الترجمة الآلية وتصنيف النصوص وتحليل المشاعر.
</p>

<h3 id="xlm-1">
	نماذج XLM التي تستخدم تضمينات اللغة
</h3>

<p>
	تستخدم نماذج XLM التالية تضمينات اللغة لتحديد اللغة المستخدمة في الاستدلال:
</p>

<ul>
	<li>
		<code><a href="https://huggingface.co/FacebookAI/xlm-mlm-ende-1024" rel="external nofollow">FacebookAI/xlm-mlm-ende-1024</a></code> لنمذجة اللغة المقنّعة Masked Language Modeling، ويدعم اللغتين الإنجليزية والألمانية
	</li>
	<li>
		<code><a href="https://huggingface.co/FacebookAI/xlm-mlm-enfr-1024" rel="external nofollow">FacebookAI/xlm-mlm-enfr-1024</a></code> لنمذجة اللغة المقنّعة، ويدعم الإنجليزية والفرنسية
	</li>
	<li>
		<code><a href="https://huggingface.co/FacebookAI/xlm-mlm-enro-1024" rel="external nofollow">FacebookAI/xlm-mlm-enro-1024</a></code> لنمذجة اللغة المقنّعة، ويدعم الإنجليزية والرومانية
	</li>
	<li>
		<code><a href="https://huggingface.co/FacebookAI/xlm-mlm-xnli15-1024" rel="external nofollow">FacebookAI/xlm-mlm-xnli15-1024</a></code> لنمذجة اللغة المقنعة، ويعمل مع مجموعة اللغات المدرجة في مجموعة بيانات XNLI
	</li>
	<li>
		<code><a href="https://huggingface.co/FacebookAI/xlm-mlm-tlm-xnli15-1024" rel="external nofollow">FacebookAI/xlm-mlm-tlm-xnli15-1024</a></code> لنمذجة اللغة المقنعة والترجمة، ويعمل مع لغات XNLI
	</li>
	<li>
		<code><a href="https://huggingface.co/FacebookAI/xlm-clm-enfr-1024" rel="external nofollow">FacebookAI/xlm-clm-enfr-1024</a></code> لنمذجة اللغة السببية Causal Language Modeling ويعمل مع اللغة الإنجليزية والفرنسية
	</li>
	<li>
		<code><a href="https://huggingface.co/FacebookAI/xlm-clm-ende-1024" rel="external nofollow">FacebookAI/xlm-clm-ende-1024</a></code> لنمذجة اللغة السببية ويعمل مع اللغتين الإنجليزية والألمانية
	</li>
</ul>

<p>
	يُمثَّل تضمين اللغة على شكل <a href="https://ar.wikipedia.org/wiki/%D9%85%D9%88%D8%AA%D8%B1" rel="external nofollow">موتر Tensor</a> وهو بنية على شكل مصفوفة متعددة الأبعاد لها نفس حجم بنية <code>input_ids</code> المُمرَّرة إلى النموذج، وتعتمد القيم الموجودة في هذه الموترات على اللغة المستخدمة وتحددها السمات التالية <code>lang2id</code> و <code>id2lang</code> الخاصة بالمرمّز.
</p>

<p>
	<strong>ملاحظة</strong>: نمذجة اللغة السببية Causal Language Modeling هي نوع من نماذج <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9/" rel="">تعلم الآلة</a> تهدف إلى فهم وتوليد النصوص بناء على الترتيب السببي للكلمات، في هذا النوع من النمذجة يتنبأ النموذج بالكلمة التالية في تسلسل الكلمات بناءً على الكلمات التي جاءت قبلها فقط وليس بعدها. أي يتعامل النموذج مع النص بشكل أحادي الاتجاه من اليسار لليمين ويتوقع الكلمة التالية بناءً على الكلمات السابقة لها. على سبيل المثال لترميز الجملة "Wikipedia was used to" باستخدام المرمِّز Tokenizer وتحويلها لتسلسل من الأرقام التعريفية IDs التي يمكن للنموذج معالجتها سنحمّل بداية نقطة تحقق نموذج <code><a href="https://huggingface.co/FacebookAI/xlm-clm-enfr-1024" rel="external nofollow">FacebookAI/xlm-clm-enfr-1024</a></code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_776_15" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">import</span><span class="pln"> torch
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">XLMTokenizer</span><span class="pun">,</span><span class="pln"> </span><span class="typ">XLMWithLMHeadModel</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> tokenizer </span><span class="pun">=</span><span class="pln"> </span><span class="typ">XLMTokenizer</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="str">"FacebookAI/xlm-clm-enfr-1024"</span><span class="pun">)</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">XLMWithLMHeadModel</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="str">"FacebookAI/xlm-clm-enfr-1024"</span><span class="pun">)</span></pre>

<p>
	تحتوي السمة <code>lang2id</code> الخاصة بالمرمِّز على اللغات المدعومة في النموذج ومعرّفاتها <code>IDs</code>، كما في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_776_17" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">print</span><span class="pun">(</span><span class="pln">tokenizer</span><span class="pun">.</span><span class="pln">lang2id</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="str">'en'</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="str">'fr'</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">}</span></pre>

<p>
	لننشئ بعد ذلك الدخل التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_776_19" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> input_ids </span><span class="pun">=</span><span class="pln"> torch</span><span class="pun">.</span><span class="pln">tensor</span><span class="pun">([</span><span class="pln">tokenizer</span><span class="pun">.</span><span class="pln">encode</span><span class="pun">(</span><span class="str">"Wikipedia was used to"</span><span class="pun">)])</span><span class="pln">  </span><span class="com"># حجم الدفعة هو 1</span></pre>

<p>
	ثم نضبط معرّف اللغة على القيمة <code>"en"</code> ونستخدمه لتحديد تضمين اللغة وهو موتر tensor يحتوي على القيمة 0 التي تمثل معرّف اللغة الإنجليزية، ويجب أن يكون له نفس حجم البنية <code>input_ids</code>.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_776_21" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> language_id </span><span class="pun">=</span><span class="pln"> tokenizer</span><span class="pun">.</span><span class="pln">lang2id</span><span class="pun">[</span><span class="str">"en"</span><span class="pun">]</span><span class="pln">  </span><span class="com"># 0</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> langs </span><span class="pun">=</span><span class="pln"> torch</span><span class="pun">.</span><span class="pln">tensor</span><span class="pun">([</span><span class="pln">language_id</span><span class="pun">]</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> input_ids</span><span class="pun">.</span><span class="pln">shape</span><span class="pun">[</span><span class="lit">1</span><span class="pun">])</span><span class="pln">  </span><span class="com"># torch.tensor([0, 0, 0, ..., 0])</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="com"># ‫نعيد تشكيله ليكون بحجم (batch_size, sequence_length)</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> langs </span><span class="pun">=</span><span class="pln"> langs</span><span class="pun">.</span><span class="pln">view</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pun">)</span><span class="pln">  </span><span class="com"># ‫أصبح الآن بالشكل ‎[1, sequence_length]‎ (حجم الدفعة هو 1)</span></pre>

<p>
	ويمكنك الآن تمرير البنية <code>input_ids</code> وتضمين اللغة إلى النموذج من أجل فهم النص وتحليله كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_776_23" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> outputs </span><span class="pun">=</span><span class="pln"> model</span><span class="pun">(</span><span class="pln">input_ids</span><span class="pun">,</span><span class="pln"> langs</span><span class="pun">=</span><span class="pln">langs</span><span class="pun">)</span></pre>

<p>
	سيؤدي تنفيذ السكربت <a href="https://github.com/huggingface/transformers/blob/main/examples/pytorch/text-generation/run_generation.py" rel="external nofollow">run_generation.py</a> إلى توليد نص مع تضمينات اللغة باستخدام نقاط تحقق <code>xlm-clm</code>.
</p>

<h3 id="xlm-2">
	نماذج XLM التي لا تستخدم تضمينات اللغة
</h3>

<p>
	لا تتطلب نماذج XLM التالية تضمينات اللغة أثناء الاستدلال إذ يستطيع النموذج فهم اللغة التي يتعامل معها بدون الحاجة إلى معرّف اللغة وهي:
</p>

<ul>
	<li>
		<code><a href="https://huggingface.co/FacebookAI/xlm-mlm-17-1280" rel="external nofollow">FacebookAI/xlm-mlm-17-1280</a></code> لنمذجة اللغة المقنّعة ويدعم 17 لغة
	</li>
	<li>
		<code><a href="https://huggingface.co/FacebookAI/xlm-mlm-100-1280" rel="external nofollow">FacebookAI/xlm-mlm-100-1280</a></code> لنمذجة اللغة المقنّعة ويدعم 100 لغة
	</li>
</ul>

<p>
	تستخدم هذه النماذج تمثيلات الجمل المُعمَّمة Generic Sentence Representations، على عكس نقاط تحقق نموذج XLM السابقة.
</p>

<h2 id="bert">
	نموذج BERT
</h2>

<p>
	يمكن استخدام نماذج BERT التالية للمهام متعددة اللغات:
</p>

<ul>
	<li>
		<code><a href="https://huggingface.co/google-bert/bert-base-multilingual-uncased" rel="external nofollow">google-bert/bert-base-multilingual-uncased</a></code> لنمذجة اللغة المقنعة وتوقع الجملة التالية، تدعم 102 لغة
	</li>
	<li>
		<code><a href="https://huggingface.co/google-bert/bert-base-multilingual-cased" rel="external nofollow">google-bert/bert-base-multilingual-cased</a></code> لنمذجة اللغة المقنعة وتوقع الجملة التالية، وتدعم 104 لغات
	</li>
</ul>

<p>
	لا تتطلب هذه النماذج تضمينات اللغة أثناء الاستدلال، فهي تحدِّد اللغة من السياق وتستدل عليها وفقًا لذلك.
</p>

<h2 id="xlmroberta">
	نموذج XLM-RoBERTa
</h2>

<p>
	يمكن استخدام نماذج XLM-RoBERTa التالية للمهام متعددة اللغات:
</p>

<ul>
	<li>
		<code><a href="https://huggingface.co/FacebookAI/xlm-roberta-base" rel="external nofollow">FacebookAI/xlm-roberta-base</a></code> لنمذجة اللغة المقنعة، وتدعم 100 لغة
	</li>
	<li>
		<code><a href="https://huggingface.co/FacebookAI/xlm-roberta-large" rel="external nofollow">FacebookAI/xlm-roberta-large</a></code> لنمذجة اللغة المقنعة، وتدعم 100 لغة
	</li>
</ul>

<p>
	دُرِّب نموذج XLM-RoBERTa على 2.5 تيرابايت من بيانات CommonCrawl المُنشَأة والمُنظَّفة حديثًا وذلك في 100 لغة، ويحقق هذا النموذج تحسينات كبيرة بالمقارنة مع النماذج متعددة اللغات الصادرة سابقًا مثل mBERT أو XLM في المهام النهائية مثل التصنيف Classification والوسم أو تحديد التسميات تسلسليًا Sequence Labeling والإجابة على الأسئلة Question Answering.
</p>

<h2 id="m2m100">
	نموذج M2M100
</h2>

<p>
	يمكن استخدام نماذج M2M100 التالية للترجمة متعددة اللغات:
</p>

<ul>
	<li>
		<code><a href="https://huggingface.co/facebook/m2m100_418M" rel="external nofollow">facebook/m2m100_418M</a></code>  للترجمة
	</li>
	<li>
		<code><a href="https://huggingface.co/facebook/m2m100_1.2B" rel="external nofollow">facebook/m2m100_1.2B</a></code> للترجمة
	</li>
</ul>

<p>
	لنحمّل مثلًا نقطة تحقق النموذج <code>facebook/m2m100_418M</code> للترجمة من الصينية إلى الإنجليزية، حيث يمكنك ضبط لغة المصدر في المرمِّز كالتالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_776_25" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> M2M100ForConditionalGeneration</span><span class="pun">,</span><span class="pln"> M2M100Tokenizer

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> en_text </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Do not meddle in the affairs of wizards, for they are subtle and quick to anger."</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> chinese_text </span><span class="pun">=</span><span class="pln"> </span><span class="str">"不要插手巫師的事務, 因為他們是微妙的, 很快就會發怒."</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> tokenizer </span><span class="pun">=</span><span class="pln"> M2M100Tokenizer</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="str">"facebook/m2m100_418M"</span><span class="pun">,</span><span class="pln"> src_lang</span><span class="pun">=</span><span class="str">"zh"</span><span class="pun">)</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> model </span><span class="pun">=</span><span class="pln"> M2M100ForConditionalGeneration</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="str">"facebook/m2m100_418M"</span><span class="pun">)</span></pre>

<p>
	ونرمِّز النص كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_776_27" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> encoded_zh </span><span class="pun">=</span><span class="pln"> tokenizer</span><span class="pun">(</span><span class="pln">chinese_text</span><span class="pun">,</span><span class="pln"> return_tensors</span><span class="pun">=</span><span class="str">"pt"</span><span class="pun">)</span></pre>

<p>
	يفرض النموذج M2M100 أن يكون معرّف اللغة المستهدفة هو أول Token مُولَّد لترجمته إلى اللغة المستهدفة، لذا نضبط المعرّف<code> forced_bos_token_id</code> على القيمة <code>en</code> في التابع <code>generate</code> للترجمة إلى اللغة الإنجليزية كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_776_29" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> generated_tokens </span><span class="pun">=</span><span class="pln"> model</span><span class="pun">.</span><span class="pln">generate</span><span class="pun">(**</span><span class="pln">encoded_zh</span><span class="pun">,</span><span class="pln"> forced_bos_token_id</span><span class="pun">=</span><span class="pln">tokenizer</span><span class="pun">.</span><span class="pln">get_lang_id</span><span class="pun">(</span><span class="str">"en"</span><span class="pun">))</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> tokenizer</span><span class="pun">.</span><span class="pln">batch_decode</span><span class="pun">(</span><span class="pln">generated_tokens</span><span class="pun">,</span><span class="pln"> skip_special_tokens</span><span class="pun">=</span><span class="kwd">True</span><span class="pun">)</span><span class="pln">
</span><span class="str">'Do not interfere with the matters of the witches, because they are delicate and will soon be angry.'</span></pre>

<h2 id="mbart">
	النموذج MBart
</h2>

<p>
	يمكن استخدام نماذج MBart التالية للترجمة متعددة اللغات:
</p>

<ul>
	<li>
		<code><a href="https://huggingface.co/facebook/mbart-large-50-one-to-many-mmt" rel="external nofollow">facebook/mbart-large-50-one-to-many-mmt</a></code> للترجمة الآلية متعددة اللغات من لغة إلى عدة لغات، ويدعم 50 لغة
	</li>
	<li>
		<code><a href="https://huggingface.co/facebook/mbart-large-50-many-to-many-mmt" rel="external nofollow">facebook/mbart-large-50-many-to-many-mmt</a></code> للترجمة الآلية متعددة اللغات من عدة لغات إلى عدة لغات، ويدعم 50 لغة
	</li>
	<li>
		<code><a href="https://huggingface.co/facebook/mbart-large-50-many-to-one-mmt" rel="external nofollow">facebook/mbart-large-50-many-to-one-mmt</a></code> للترجمة الآلية متعددة اللغات من عدة لغات إلى لغة واحدة، ويدعم 50 لغة
	</li>
	<li>
		<code><a href="https://huggingface.co/facebook/mbart-large-50" rel="external nofollow">facebook/mbart-large-50</a></code> للترجمة متعددة اللغات، ويدعم 50 لغة
	</li>
	<li>
		<code><a href="https://huggingface.co/facebook/mbart-large-cc25" rel="external nofollow">facebook/mbart-large-cc25</a></code> للترجمة الآلية متعددة اللغات، ويعمل مع 25 لغة
	</li>
</ul>

<p>
	لنحمّل مثلًا نقطة تحقق النموذج <code>facebook/mbart-large-50-many-to-many-mmt</code> لترجمة اللغة الفنلندية إلى اللغة الإنجليزية، ويمكنك ضبط لغة المصدر في المرمِّز كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_776_31" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">from</span><span class="pln"> transformers </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">AutoTokenizer</span><span class="pun">,</span><span class="pln"> </span><span class="typ">AutoModelForSeq2SeqLM</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> en_text </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Do not meddle in the affairs of wizards, for they are subtle and quick to anger."</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> fi_text </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Älä sekaannu velhojen asioihin, sillä ne ovat hienovaraisia ja nopeasti vihaisia."</span><span class="pln">

</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> tokenizer </span><span class="pun">=</span><span class="pln"> </span><span class="typ">AutoTokenizer</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="str">"facebook/mbart-large-50-many-to-many-mmt"</span><span class="pun">,</span><span class="pln"> src_lang</span><span class="pun">=</span><span class="str">"fi_FI"</span><span class="pun">)</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> model </span><span class="pun">=</span><span class="pln"> </span><span class="typ">AutoModelForSeq2SeqLM</span><span class="pun">.</span><span class="pln">from_pretrained</span><span class="pun">(</span><span class="str">"facebook/mbart-large-50-many-to-many-mmt"</span><span class="pun">)</span></pre>

<p>
	ونرمِّز النص كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_776_33" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> encoded_en </span><span class="pun">=</span><span class="pln"> tokenizer</span><span class="pun">(</span><span class="pln">en_text</span><span class="pun">,</span><span class="pln"> return_tensors</span><span class="pun">=</span><span class="str">"pt"</span><span class="pun">)</span></pre>

<p>
	يفرض النموذج MBart معرّف اللغة المستهدفة بوصفه أول رمز مُولَّد لترجمته إلى اللغة المستهدفة، لذا اضبط المعرّف <code>forced_bos_token_id</code> على القيمة <code>en</code> في التابع <code>generate</code> للترجمة إلى اللغة الإنجليزية كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_776_35" style=""><span class="pun">&gt;&gt;&gt;</span><span class="pln"> generated_tokens </span><span class="pun">=</span><span class="pln"> model</span><span class="pun">.</span><span class="pln">generate</span><span class="pun">(**</span><span class="pln">encoded_en</span><span class="pun">,</span><span class="pln"> forced_bos_token_id</span><span class="pun">=</span><span class="pln">tokenizer</span><span class="pun">.</span><span class="pln">lang_code_to_id</span><span class="pun">[</span><span class="str">"en_XX"</span><span class="pun">])</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> tokenizer</span><span class="pun">.</span><span class="pln">batch_decode</span><span class="pun">(</span><span class="pln">generated_tokens</span><span class="pun">,</span><span class="pln"> skip_special_tokens</span><span class="pun">=</span><span class="kwd">True</span><span class="pun">)</span><span class="pln">
</span><span class="str">"Don't interfere with the wizard's affairs, because they are subtle, will soon get angry."</span></pre>

<p>
	إذا أدرتَ استخدام نقطة تحقق النموذج <code>facebook/mbart-large-50-many-to-one-mmt</code>، فلن تحتاج إلى فرض معرّف اللغة المستهدفة بوصفه أول رمز مُولَّد، وإلّا فسيبقى الاستخدام نفسه مع النماذج الأخرى.
</p>

<h2 id="-2">
	الخلاصة
</h2>

<p>
	تعلمنا في هذا المقال كيفية استخدام مكتبة المرمزات Tokenizers من منصة Hugging Face، والتي تتيح تقسيم النصوص إلى رموز أو وحدات صغيرة Token. كما تناولنا طريقة إنشاء مرمِّز باستخدام أسلوب BPE وتدريبه على بيانات مخصصة. وشرحنا كيفية استخدام المرمِّز المُدرَّب داخل مكتبة المحولات Transformers وكيفية حفظه لإعادة استخدامه. واستعرضنا النماذج مثل XLM وBERT و XLM-RoBERTa التي تدعم تحليل النصوص بلغات متعددة وتستخدم لتطبيقات متنوعة مثل الترجمة والتنبؤ وتحليل النصوص.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AC%D9%88%D9%84%D8%A9-%D8%B3%D8%B1%D9%8A%D8%B9%D8%A9-%D9%84%D9%84%D8%A8%D8%AF%D8%A1-%D9%85%D8%B9-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%AD%D9%88%D9%91%D9%84%D8%A7%D8%AA-transformers-r2351/" rel="">جولة سريعة للبدء مع مكتبة المحوّلات Transformers</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%AD%D9%88%D9%91%D9%84%D8%A7%D8%AA-transformers-%D9%85%D9%86-%D9%85%D9%86%D8%B5%D8%A9-hugging-face-r2340/" rel="">تعرف على مكتبة المحوّلات Transformers من منصة Hugging Face</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%85%D8%B4%D8%A7%D8%B1%D9%83%D8%A9-%D9%86%D9%85%D9%88%D8%B0%D8%AC-%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%B9%D9%84%D9%89-%D9%85%D9%86%D8%B5%D8%A9-hugging-face-r2378/" rel="">مشاركة نموذج ذكاء اصطناعي على منصة Hugging Face</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%AD%D9%88%D9%91%D9%84%D8%A7%D8%AA-transformers-r2352/" rel="">تثبيت مكتبة المحوّلات Transformers</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2470</guid><pubDate>Thu, 26 Dec 2024 16:00:00 +0000</pubDate></item><item><title>&#x62A;&#x635;&#x645;&#x64A;&#x645; &#x623;&#x646;&#x638;&#x645;&#x629; &#x648;&#x633;&#x645; &#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A; &#x641;&#x639;&#x627;&#x644;&#x629; &#x644;&#x62A;&#x637;&#x628;&#x64A;&#x642;&#x627;&#x62A; &#x62A;&#x639;&#x644;&#x645; &#x627;&#x644;&#x622;&#x644;&#x629;</title><link>https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D9%88%D8%B3%D9%85-%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%81%D8%B9%D8%A7%D9%84%D8%A9-%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-r2480/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_12/355228310_.png.9afbee760b8bc5f46d2621c41403cb3b.png" /></p>
<p>
	تتدرب نماذج التعلم الآلي على مجموعات من البيانات الضخمة حيث توسم نقاط الاهتمام في البيانات -أي الأجزاء المهمة في التي نريد التركيز عليها والتعلم منها- لإعطائها معنى وسياق. نتعمق في هذه المقالة في وصف طرق بناء أنظمة وسم البيانات data labeling من الصفر مركزين على تدفق البيانات في النظام وكيفية تأمينها وضمان جودتها.
</p>

<h2>
	ما معنى وسم البيانات
</h2>

<p>
	ينتج الذكاء المتأصل في <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D9%81%D9%8A-%D8%AA%D8%AE%D8%B5%D8%B5-%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-r2466/" rel="">الذكاء الاصطناعي</a> من تعرضه لكميات من البيانات التي تتدرب عليها نماذج تعلم الآلة، ومع التقدم الحالي في النماذج اللغوية الضخمة مثل GPT-4 وجيمناي Gemini التي يمكنها معالجة تريليونات الوحدات اللغوية الصغيرة التي تسمى tokens، ولا تتكون هذه البيانات المستخدمة في التدريب من معلومات أولية مستخلصة من الإنترنت فقط فهي تتضمن أيضًا وسومًا حتى يكون التدريب فعالًا.
</p>

<p>
	وسم البيانات data labeling هو عملية تحويل البيانات الأولية والمعلومات غير المعالجة إلى بيانات موسومة أو بيانات معنونة لإضافة سياق ومعنى واضح لها، وتحسّن هذه العملية من دقة تدريب النموذج، فأنت توضح وتشير إلى ما ترغب للنظام أن يتعرف عليه، وتتضمن الأمثلة على وسم البيانات مهام مثل <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%AD%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%85%D8%B4%D8%A7%D8%B9%D8%B1-%D9%81%D9%8A-%D8%A7%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D8%A7%D9%84%D8%B9%D8%B1%D8%A8%D9%8A%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%82-r1476/" rel="">تحليل المشاعر في النصوص</a> حيث توسم النصوص في هذه الحالة بمشاعر معينة مثل إيجابي أو سلبي أو محايد، ومهام التعرف على الكائنات في الصور إذ يوسم كل كائن في الصورة بتصنيف معين. وكذلك تستخدم في تنصيص الكلام المنطوق في الملفات الصوتية، أو وسم الأفعال في مشاهد الفيديو.
</p>

<p>
	تلعب جودة البيانات دورًا هائلًا في تدريب البيانات، فالمدخلات الرديئة تؤدي إلى مخرجات رديئة فلا يمكننا توقع أداء مبهر من نموذج لم يُدرّب إلا على بيانات رديئة الجودة، فالنماذج التي تتدرب على بيانات بها أخطاء وتناقض في الوسوم ستواجه صعوبة في محاولة التأقلم مع البيانات الجديدة التي لم تراها في التدريب وربما تكون متحيزة في توقعاتها مسببة أخطاء في المخرجات، ويمكن أن يؤدي تراكم البيانات الرديئة في المراحل المختلفة إلى تأثير مركب مما يؤثر على كل الخطوات والنماذج التي تعتمد عليها.
</p>

<p>
	يهدف هذا المقال لتوضيح طرق تعزيز جودة البيانات واكتساب أفضلية تنافسية في كافة مراحل وسم البيانات. وللسهولة سنركز على المنصات والأدوات التي تستخدم في عملية وسم البيانات ونقارن بين مميزات ومحدوديات كل تقنية وأداة، وبعد ذلك ننتقل إلى اعتبارات أخرى لا تقل أهمية مثل تقليل التحيز، وحماية الخصوصية، وزيادة دقة وسم البيانات.
</p>

<h2 id="-1">
	دور وسم البيانات في سير عمل تطبيقات تعلم الآلة
</h2>

<p>
	يقسم تدريب نماذج <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9/" rel="">تعلم الآلة</a> إلى ثلاثة تصنيفات عامة وهي التعلم الخاضع للإشراف Supervised learning والتعلم غير الخاضع لإشراف Unsupervised learning والتعلم المعزز Reinforcement learning.
</p>

<p>
	يعتمد التعلم الخاضع للإشراف على البيانات الموسومة labeled training data، والتي تحتوي نقاط الاهتمام في البيانات بها على وسوم بالتوقع أو العنوان الصحيح، فيتعلم النموذج أن يربط بين خواص المدخلات والوسوم أو التسميات الصحيحة المرتبطة بها مما يعطيه القدرة على تخمين وسوم البيانات الجديدة التي لم يتدرب عليها من قبل ولا يعرف ما وسمها الحقيقي، من جهة أخرى يحلل التعلم غير الخاضع للإشراف البيانات غير الموسومة بحثًا عن الأنماط المخفية أو التجميعات الموجودة في البيانات، وأما في التعلم المعزز فتكون عملية التدريب بالتجربة والخطأ ويمكننا التدخل في مرحلة التقييم والمراجعة لتوجيه عملية التعلم.
</p>

<p>
	تُدرّب معظم نماذج التعلم الآلي باستخدام أسلوب التعلم الخاضع للإشراف supervised learning. ونظرًا لأهمية البيانات عالية الجودة فينبغي اعتبارها في كل خطوة من عملية التدريب لذلك يلعب وسم البيانات دورًا حيويًا في هذه العملية.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="164789" href="https://academy.hsoub.com/uploads/monthly_2024_12/ML_lifecycle.png.5c62bb5be8cb93660d9f3efff7705c0e.png" rel=""><img alt="خطوات تطوير نموذج تعلم آلي" class="ipsImage ipsImage_thumbnailed" data-fileid="164789" data-ratio="44.50" data-unique="xw7mp65hu" style="width: 600px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2024_12/ML_lifecycle.thumb.png.90e01132af848d890bb99e41a23aa7b6.png"></a>
</p>

<p>
	إن <strong>تحضير وجمع البيانات</strong> هي العملية التي تسبق وسم البيانات، حيث تُجمع البيانات الأولية أو الخام من مصادر متنوعة مثل المستشعرات الإلكترونية sensors، وقواعد البيانات، وسجلات العمليات logs، وواجهات برمجة التطبيقات <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-api-r1314/" rel="">APIs</a>، وفي الغالب لا تخضع هذه البيانات لهيكل أو تنسيق ثابت وقد تحتوي على تناقضات وشوائب مثل قيم مفقودة أو قيم شاذة outliers أي قيما غير مألوفة وتختلف بشكل كبير عن باقي البيانات، أو قيم متكررة، لذا في عملية المعالجة تُنظّف البيانات وتُنسَّق وتُحوّل لتكون جاهزة لوسمها labeling، وتستخدم استراتيجيات عديدة للتعامل مع معالجة البيانات مثل حذف الصفوف المكررة، أو حذف الصفوف التي تحتوي على قيم مفقودة أو التعويض عن هذه القيم باستخدام نماذج تخمين إحصائية، كما يمكننا إحصائيًا اكتشاف القيم الشاذة outliers ومعالجتها.
</p>

<p>
	تلي معالجة البيانات في الخطوات عملية <strong>وسم البيانات</strong> لتوفير المعلومات التي يحتاجها نموذج التعلم الآلي كي يتعلم، وتختلف استراتيجيات وسم البيانات باختلاف نوع هذه البيانات والغرض من النموذج، فوسم الصور يتطلب أساليب مختلفة عن وسم النصوص، وعلى الرغم من وجود أدوات وسم آلية ولكن التدخل البشري يحسن بشكل كبير من عملية الوسم خاصة عندما يتعلق الأمر بالدقة أو تفادي التحيز الذي قد يوجد في الأدوات الآلية، وبعد أن توسم البيانات تاتي مرحلة تأكيد الجودة والتي تضمن الدقة والتناسق واكتمال الوسوم، ويعمل فريق تأكيد الجودة على توظيف أسلوب الوسم المزدوج إذ يقوم أكثر من شخص بوسم عينة من البيانات بشكل مستقل ويقارنون نتائجهم لحل أي اختلاف في الآراء.
</p>

<p>
	الخطوة التالية هي خضوع النموذج للتدريب باستخدام البيانات الموسومة ليتعلم الأنماط والعلاقات بين المدخلات والوسوم المرتبطة بها، حيث تعدل معاملات النموذج في عملية تكرارية من التخمين وتقييم الخطأ حتى تتحسن الدقة بالنسبة للوسوم المعلومة، ولتقييم فعالية النموذج يختبر على بيانات موسومة لم يرها من قبل، وتقاس صحة تخميناته وتوقعاته باستخدام معايير رقمية مثل نسبة الصواب accuracy <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D9%82%D9%8A%D9%8A%D9%85-%D9%88%D8%A7%D8%AE%D8%AA%D9%8A%D8%A7%D8%B1-%D9%86%D9%85%D8%A7%D8%B0%D8%AC-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-r1635/#:~:text=%3D%2070%25-,%D9%85%D9%82%D9%8A%D8%A7%D8%B3%20%D8%A7%D9%84%D8%AF%D9%82%D8%A9%20Precision,-%D9%85%D9%82%D9%8A%D8%A7%D8%B3%20%D8%A7%D9%84%D8%AF%D9%82%D8%A9%20Precision" rel="">والدقة precision</a> <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D9%82%D9%8A%D9%8A%D9%85-%D9%88%D8%A7%D8%AE%D8%AA%D9%8A%D8%A7%D8%B1-%D9%86%D9%85%D8%A7%D8%B0%D8%AC-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-r1635/#:~:text=%3D%2075%25-,%D9%85%D9%82%D9%8A%D8%A7%D8%B3%20%D8%A7%D9%84%D8%A7%D8%B3%D8%AA%D8%B0%D9%83%D8%A7%D8%B1%20Recall,-%D9%85%D9%82%D9%8A%D8%A7%D8%B3%20%D8%A7%D9%84%D8%A7%D8%B3%D8%AA%D8%B0%D9%83%D8%A7%D8%B1%20Recall" rel="">والاستذكار Recall أو الحساسية sensitivity</a>، فإذا كان أداء النموذج ضعيفًا تُعدل بعض الأشياء قبل إعادة التدريب مثل تحسين جودة بيانات التدريب بتقليل الضوضاء بالبيانات data noise أو تقليل التحيز وتحسين عملية وسم البيانات، وفي النهاية بعد إعادة التدريب وتحسين النموذج يصبح جاهزًا للتشغيل deployment ويمكنه التفاعل مع البيانات في العالم الحقيقي. وأخيرًا من المهم مراقبة أداء النموذج لكشف وتحديد أي مشكلات قد تتطلب تحديث النموذج أو إعادة تدريبه.
</p>

<h2 id="-2">
	تحديد أنواع وطرق وسم البيانات
</h2>

<p>
	تَسبق عملية تحديد نوع البيانات مرحلةَ تصميم وبناء معمارية وسم البيانات، حيث توجد البيانات في تنسيقات وهياكل متنوعة تشمل النصوص والصور ومقاطع الفيديو والملفات الصوتية، وكل نوع من البيانات يأتي بمجموعة من التحديات المميزة التي تتطلب طريقة خاصة في التعامل معها لتحقيق تناسق ودقة في عملية وسم البيانات، بالإضافة لذلك فبعض البرمجيات المستخدمة في وسم البيانات تتضمن أدوات مصممة للتعامل مع أنواع معينة من البيانات، وكذلك تتخصص فرق الوسم في وسم نوع محدد من البيانات، لذلك يعتمد اختيار البرمجيات والفريق المناسب بشكلٍ كبير على المشروع.
</p>

<p>
	على سبيل المثال، قد تطلب عملية وسم بيانات للرؤية الحاسوبية computer vision تصنيف الصور الرقمية ومقاطع الفيديو وإنشاء مستطيلات التحديد bounding boxes لعنونة الكائنات الموجودة داخلها. وتحتوي <a href="https://waymo.com/open/about" rel="external nofollow">مجموعة بيانات وايمو المفتوحة waymo's open dataset</a> مثلًا على مجموعة بيانات موسومة لمهام الرؤية الحاسوبية computer vision للسيارات ذاتية القيادة، وقد وُسمت هذه البيانات بجهود مجموعة من الأفراد عبر الإنترنت مع مساهمات واسمين فرديين. ومن التطبيقات الأخرى للرؤية الحاسوبية computer vision التصوير الطبي، والاستطلاع الجوي، والمراقبة، والتأمين، والواقع المعزز augmented reality.
</p>

<p>
	ويمكن وسم النصوص ومعالجتها باستخدام خوارزميات معالجة اللغات الطبيعية Natural Language processing بمجموعة متنوعة من الطرق، تشمل تحليل المشاعر sentiment analysis من النصوص مثل المشاعر الإيجابية والسلبية، واستخلاص الكلمات المفتاحية مثل العبارات ذات الصلة، وكذلك التعرف على الكيانات الموجودة في النص مثل الأشخاص والأماكن والتواريخ، يمكن أيضًا تصنيف النصوص القصيرة. على سبيل المثال، يمكن تحديد فيما إذا كانت رسالة بريد إلكتروني رسالة مزعجة spam أم لا، ويمكن التعرف على لغة النص كالعربية أو الانجليزية، وتستخدم نماذج معالجة اللغات الطبيعية في تطبيقات مثل أنظمة المحادثة chatbots والمساعدات البرمجية coding assistants والمترجمات translators ومحركات البحث search engines.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="164550" href="https://academy.hsoub.com/uploads/monthly_2024_12/doccano_light.png.c219f61f087eebe222d4fc4563666045.png" rel=""><img alt="doccano light" class="ipsImage ipsImage_thumbnailed" data-fileid="164550" data-unique="uu11aflv0" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/doccano_light.thumb.png.06c81cd2e9d7d8df2d3ecea8663dab4d.png"> </a>
</p>

<p>
	كما تستخدم البيانات الصوتية في تطبيقات متنوعة تشمل تصنيف الصوتيات، والتعرف على الصوت، والتعرف على الكلام، والتحليل الصوتي، ويمكن وسم الملفات الصوتية للتعرف على كلمات معينة مثل "يا سيري" أو "Hey Siri"، وحتى تصنيف أنواع مختلفة من الأصوات، أو تحويل الكلام المنطوق إلى كلمات مكتوبة.
</p>

<p>
	إن العديد من نماذج التعلم الآلي هي نماذج متعددة multimodal أي أنها نماذج قادرة على تفسير والتعامل مع البيانات من مصادر مختلفة بشكل متزامن، فيمكن للسيارات ذاتية القيادة جمع معلومات بصرية مثل إشارات المرور والمارين في الطريق وتجمع بيانات صوتية مثل صوت أبواق السيارات، مما يتطلب وسمًا متعددًا multimodal labeling حيث يقوم الواسمون البشريون بجمع ووسم أنواع مختلفة من البيانات بطريقة تراعي العلاقات والتفاعلات بين تلك الأنواع.
</p>

<p>
	من المهم اختيار الطريقة الأنسب لوسم البيانات قبل الشروع في بناء النظام الخاص بنا، وقد كان الوسم البشري للبيانات سابقًا هو الطريقة المتبعة، ولكن مع التقدم الهائل في التعلم الآلي ازدادت إمكانيات الأتمتة مما جعل العملية أكثر كفاءة وأقل تكلفةً، ولكن تجدر الإشارة أنه وعلى الرغم من تحسن دقة أدوات الوسم الآلية فإنها لاتزال غير قادرة على مواكبة الدقة والاعتمادية التي يوفرها البشر.
</p>

<p>
	لذا يلجأ المختصون عادة لأسلوب مختلط يتضمن مشاركة البشر والبرامج الآلية في عملية وسم البيانات، حيث تستخدم برامج آلية لتوليد الوسوم الأولية ثم تجري مراجعتها وتدقيقها وتصحيحها بواسطة الواسم البشري، وتضاف الوسوم المصححة إلى مجموعة بيانات التدريب لتحسين دقة وأداء البرنامج الآلي، وهذا يضمن الحفاظ على مستوى جيد من الدقة والتناسق وهو أكثر الاستراتيجيات شيوعًا في وسم البيانات.
</p>

<h2 id="-3">
	اختيار مكونات نظام وسم البيانات
</h2>

<p>
	تبدأ عملية وسم البيانات بخطوة تجميع البيانات وتخزينها، حيث تجمع البيانات إما بشكل يدوي باستخدام أساليب مثل المقابلات الشخصية والاستبيانات واستطلاعات الرأي أو بشكل آلي مثل استخلاص البيانات من الإنترنت <a href="https://academy.hsoub.com/programming/python/%D8%A7%D8%B3%D8%AA%D8%AE%D8%B1%D8%A7%D8%AC-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%85%D9%86-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D8%B9%D8%A8%D8%B1-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-python-r2366/" rel="">web scraping</a>.
</p>

<p>
	في حال عدم امتلاكك للموارد الكافية لجمع البيانات على نطاق واسع فيمكن الاعتمدا على مجموعات البيانات مفتوحة المصدر المتوفرة على منصات مثل <a href="https://www.kaggle.com/datasets" rel="external nofollow">كاجل Kaggle</a> أو <a href="https://archive.ics.uci.edu/" rel="external nofollow">مستودع مجموعات البيانات الخاص بجامعة كاليفورنيا ايفرين UCI repository</a> أو <a href="https://datasetsearch.research.google.com/" rel="external nofollow">بحث جوجل لمجموعات البيانات Google dataset search</a> أو <a href="https://github.com/" rel="external nofollow">جت هاب GitHub</a> فكلها مصادر جيدة، بالإضافة لمصادر البيانات المصنعة باستخدام نماذج رياضية لتحاكي البيئات الحقيقة، ولتخزين هذه البيانات يمكنك تأجير مساحات تخزينية من مزودي خدمات سحابية مثل جوجل أو مايكروسوفت حتى تتوسع حسب احتياجاتك، فبشكل نظري يمكنهم توفير مساحة تخزين غير محدودة مع توفير ميزات مدمجة تزيد من التأمين، ولكن إذا كنت تعمل مع بيانات شديدة السرية وتحتاج للامتثال لقوانين وأنظمة معينة مثل مثل قانون حماية البيانات العامة GDPR فحلول التخزين المحلية هي الخيار المناسب.
</p>

<p>
	يمكنك أن تبدأ في وسم البيانات فور أن تنتهي من تجميعها، وتعتمد عملية الوسم بشكل رئيسي على نوع البيانات، ولكن في العموم تحدد كل نقاط الاهتمام في البيانات وتصنف باستراتيجية إبقاء الإنسان مشاركًا في العملية، وتوجد العديد من المنصات المتاحة التي تبسط هذه العملية المعقدة، وبعضها مفتوح المصدر مثل <a href="https://github.com/doccano/doccano" rel="external nofollow">Doccano</a> و<a href="https://labelstud.io/" rel="external nofollow"> LabelStudio</a> و<a href="https://github.com/cvat-ai/cvat?tab=readme-ov-file" rel="external nofollow"> CVAT</a> ومنصات تجارية مثل <a href="https://scale.com/data-engine" rel="external nofollow">scale data engine</a> و <a href="https://labelbox.com/" rel="external nofollow">labelbox</a> و <a href="https://supervisely.com/" rel="external nofollow">Supervisely</a>.
</p>

<p>
	تُراجَع الوسوم بعد إنشائها بواسطة فريق ضمان الجودة لضمان الدقة والتناسق وحل أي تناقضات موجودة في الوسوم أو اختلافات في تقرير الوسم من خلال الطرق اليدوية مثل تقرير الأغلبية أو اللجوء للمعايير أو استشارة خبراء في هذا التخصص، ويمكن تخفيف التناقضات بطرق آلية مثل استخدام نماذج إحصائية مثل <a href="https://paperswithcode.com/paper/fast-dawid-skene-a-fast-vote-aggregation" rel="external nofollow">Dawid-Skene</a> لجمع الوسوم المختلفة من عدة مصادر في وسم واحد معتمد أكثر، فور الاتفاق على الوسوم بواسطة ذوي الصلة تعد الحقائق مطلقة يمكن استخدامها لتدريب نماذج التعلم الآلي، بعد التأكد من أن الوسوم دقيقة ومتسقة، تصبح هذه الوسوم حقائق ثابتة يمكن استخدامها لتدريب نماذج تعلم الآلة.
</p>

<p>
	هنالك أيضًا أدوات مفتوحة المصدر وأخرى تجارية تساعدنا في مراجعة الوسوم والتحقق من الجودة وتدقيق البيانات، قد تكون الأدوات التجارية أكثر تطورًا وتوفر ميزات إضافية مثل التدقيق الآلي، ونظام إدارة المراجعات، والموافقة عليها أو رفضها وأدوات تعقب لمعايير الجودة.
</p>

<h2 id="-4">
	مقارنة بين أدوات وسم البيانات
</h2>

<p>
	تُعد الأدوات مفتوحة المصدر نقطة بداية جيدة، فعلى الرغم من محدودية وظائفها وميزاتها مقارنة بالأدوات التجارية فإن غياب رسوم الترخيص يمثل ميزة مهمة للمشاريع الصغيرة، وتقدم الأدوات التجارية وسم أولي مدعوم بالذكاء الاصطناعي ويمكن تعويض هذه الميزة في الأدوات مفتوحة المصدر عن طريق دمجها مع نموذج تعلم آلي خارجي.
</p>

<table>
	<thead>
		<tr>
			<th>
				الاسم
			</th>
			<th>
				أنواع البيانات المدعومة
			</th>
			<th>
				إدارة سير العمل
			</th>
			<th>
				تأكيد الجودة
			</th>
			<th>
				دعم التخزين السحابي
			</th>
			<th>
				ملاحظات إضافية
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				استديو الوسم النسخة العامة Label Studio Community Edition
			</td>
			<td>
				نصوص، صور، صوتيات، مقاطع فيديو، بيانات زمنية
			</td>
			<td>
				نعم
			</td>
			<td>
				لا
			</td>
			<td>
				التخزين السحابي لجوجل، التخزين السحابي لمايكروسوفت أزور
			</td>
			<td>
				تحتوي النسخة المجانية على مجموعة واسعة من الميزات، ولكن <span ipsnoautolink="true">النسخة المدفوعة الخاصة بالشركات</span> أكثر احترافية
			</td>
		</tr>
		<tr>
			<td>
				سي في أيه تي CVAT
			</td>
			<td>
				صور ومقاطع فيديو
			</td>
			<td>
				نعم
			</td>
			<td>
				نعم
			</td>
			<td>
				التخزين السحابي لجوجل، التخزين السحابي لمايكروسوفت أزور
			</td>
			<td>
				يدعم LiDAR وهو نظام لقياس المسافات ووسم المجسمات المكعبة ثلاثية الأبعاد 3D Cuboid، بالإضافة إلى وسم الأوضاع المختلفة لهيكل مبسط من نقاط مفصلية في جسد الإنسان ويمكن استخدامه لتخمين وقفته أو حركته
			</td>
		</tr>
		<tr>
			<td>
				دوكانو Doccano
			</td>
			<td>
				نصوص وصور وملفات صوتية
			</td>
			<td>
				نعم
			</td>
			<td>
				لا
			</td>
			<td>
				التخزين السحابي لجوجل
			</td>
			<td>
				مصمم لوسم النصوص
			</td>
		</tr>
		<tr>
			<td>
				ڤيا VIA (VGG Image Annotator)
			</td>
			<td>
				صور وملفات صوتية ومقاطع فيديو
			</td>
			<td>
				لا
			</td>
			<td>
				لا
			</td>
			<td>
				لا
			</td>
			<td>
				يعتمد على المتصفح
			</td>
		</tr>
		<tr>
			<td>
				ميك سينس MakeSense.AI
			</td>
			<td>
				صور
			</td>
			<td>
				لا
			</td>
			<td>
				لا
			</td>
			<td>
				لا
			</td>
			<td>
				يعتمد على المتصفح
			</td>
		</tr>
	</tbody>
</table>

<p>
	توفر المنصات مفتوحة المصدر العديد من الميزات المطلوبة لمشاريع وسم البيانات ولكن المشاريع المعقدة لتعلم الآلة تتطلب ميزات متقدمة مثل الأتمتة والقابلية للتوسع وتتاح هذه الميزات الإضافية في المنصات التجارية، بالإضافة لمزايا تأمينية والدعم الفني ومزايا مٌسّاعدة في عملية الوسم باستخدام نماذج التعلم الآلي وشاشة التقارير والرسومات البيانية التحليلية كل هذه الميزات تجعل المنصات التجارية تستحق الزيادة في التكلفة.
</p>

<table>
	<thead>
		<tr>
			<th>
				الاسم
			</th>
			<th>
				أنواع البيانات المدعومة
			</th>
			<th>
				إدارة سير العمل
			</th>
			<th>
				تأكيد الجودة
			</th>
			<th>
				دعم التخزين السحابي
			</th>
			<th>
				ملاحظات إضافية
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				Lablbox
			</td>
			<td>
				نصوص، صور، مقاطع فيديو، ملفات صوتية، HTML
			</td>
			<td>
				نعم
			</td>
			<td>
				نعم
			</td>
			<td>
				التخزين السحابي لجوجل، التخزين السحابي لمايكروسوفت أزور
			</td>
			<td>
				توفر المنصة فرقًا متخصصة في الوسم وفي المجالات المرتبطة بالبيانات من خلال خدمة Boost
			</td>
		</tr>
		<tr>
			<td>
				Supervisely
			</td>
			<td>
				صور، مقاطع فيديو، <a href="https://supervisely.com/labeling-toolbox/3d-lidar-sensor-fusion/" rel="external nofollow">بيانات ثلاثية الأبعاد مجمعة من عدة مستشعرات 3D sensor fusion</a>، الصور الطبية بصيغة <a href="https://ar.wikipedia.org/wiki/%D8%A7%D9%84%D8%AA%D8%B5%D9%88%D9%8A%D8%B1_%D8%A7%D9%84%D8%B1%D9%82%D9%85%D9%8A_%D9%88%D8%A7%D9%84%D8%A7%D8%AA%D8%B5%D8%A7%D9%84%D8%A7%D8%AA_%D9%81%D9%8A_%D8%A7%D9%84%D8%B7%D8%A8" rel="external nofollow">DICOM</a>
			</td>
			<td>
				نعم
			</td>
			<td>
				نعم
			</td>
			<td>
				التخزين السحابي لجوجل، التخزين السحابي لميكروسوفت أزور
			</td>
			<td>
				بيئة متكاملة مفتوحة للدمج مع مئات التطبيقات المبنية على محرك التطبيقات الخاص بهم، يدعم LiDAR و RADAR وهي أنظمة لقياس البعد واكتشاف الأجسام بالإضافة إلى الصور الطبية متعددة الشرائح أو المستويات
			</td>
		</tr>
		<tr>
			<td>
				Scale AI Data Engine
			</td>
			<td>
				النصوص، الصور، ملفات الصوت، مقاطع الفيديو، البيانات ثلاثية الأبعاد المجمعة من عدة مستشعرات 3D sensor fusion، الخرائط
			</td>
			<td>
				نعم
			</td>
			<td>
				نعم
			</td>
			<td>
				التخزين السحابي لجوجل، التخزين السحابي لمايكروسوفت أزور
			</td>
			<td>
				يوفر أدوات متخصصة في قطاعات وصناعات محددة
			</td>
		</tr>
		<tr>
			<td>
				SuperAnnotate
			</td>
			<td>
				النصوص، الصور، الملفات الصوتية، مقاطع الفيديو، PDF ،HTML
			</td>
			<td>
				نعم
			</td>
			<td>
				نعم
			</td>
			<td>
				التخزين السحابي لجوجل، التخزين السحابي لميكروسوفت أزور
			</td>
			<td>
				يوفر فرق وسم متعددة اللغات وخبراء متخصصين في مجالات مختلفة<span style="display: none;"> </span>
			</td>
		</tr>
	</tbody>
</table>

<p>
	وإذا كنا بحاجة لميزات خاصة لا تتوفر في الأدوات المتاحة فيمكننا في هذه الحالة بناء منصة وسم محلية نقرر من خلالها ما هي البيانات التي سندعمها وما هي تنسيقاتها ونحديد أنوع الوسوم المستخدمة، كما يمكننا تصميم وبناء ميزات مثل الوسم الأولي ومراجعة الوسوم وتأكيد الجودة وأدوات لإدارة سير العمل، ولكن تكلفة بناء وتشغيل منصة تضاهي المنصات التجارية تكلفة باهظة لأغلب الشركات.
</p>

<p>
	يعتمد الاختيار في النهاية على عدة عوامل، مثلًا إن لم تكن الأدوات المتاحة من خلال الأطراف الخارجية تناسب متطلبات المشروع أو إذا كانت البيانات سرية فحينها سيكون بناء منصة مخصصة محليًا هو الحل الأمثل، بينما يمكن لمشاريع أخرى أن تستفيد من نظام مختلط فالمهام الأساسية للوسم تُنفَّذ بواسطة الأدوات التجارية بينما الميزات المخصصة يمكن تطويرها محليًا ودمجها مع المنصات الخارجية.
</p>

<h2 id="-5">
	ضمان الجودة والأمان في أنظمة وسم البيانات
</h2>

<p>
	يشمل نظام وسم البيانات العديد من المكونات التي تجعله معقدًا فهو يتعامل مع كميات هائلة من البيانات ومستويات مختلفة من البنية التحتية الحاسوبية وسياسات مختلفة وأنظمة سير عمل متعددة الطبقات والمستويات، كل هذا يجعل من عملية تشغيل هذه المكونات معًا بشكل سلسل مهمة مليئة بالتحديات وقد تؤثر على جودة وسم البيانات وفعاليته بالإضافة لمخاطر الأمان والخصوصية الموجودة في كل المراحل التي تمر بها العملية.
</p>

<h3 id="-6">
	تحسين دقة وسم البيانات
</h3>

<p>
	تسرع الأتمتة من عملية الوسم ولكن الاعتماد المفرط على الأدوات المؤتمتة لوسم البيانات يمكن أن يقلل من دقة العملية التي تتطلب وعيًا بالسياق والمجال أو قدرة على الحكم الموضوعي وهذه قدرات لا يستطيع حاليًا أي نظامٍ برمجي تقديمها، لذا من المهم وضع توجيه لعملية الوسم بشكل بشري واكتشاف الاخطاء ومعالجتها لضمان جودة وسم البيانات.
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="164790" href="https://academy.hsoub.com/uploads/monthly_2024_12/labelingPipeline.png.5447d0ac1b7e3dc069dc581eabef5357.png" rel=""><img alt="كيفية التعامل مع البيانات" class="ipsImage ipsImage_thumbnailed" data-fileid="164790" data-ratio="58.67" data-unique="ut96md7l9" style="width: 600px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2024_12/labelingPipeline.thumb.png.1019f330ef227f9b1fcaa1f1b9e73bbc.png"></a>
</p>

<p>
	يمكننا أيضًا تجميع آراء عدد من الواسمين المستقلين عن نفس نقطة الاهتمام في البيانات ومقارنة نتائجهم فهذا من شأنه أن يؤدي إلى درجة أعلى من الدقة. فالاتفاق بين الواسمين Inter-annotator-agreement أو ما يعرف بمعيار IAA اختصارًا هو معيار مستخدم لقياس درجة الاتفاق هذه، أي أن نقطة الاهتمام في البيانات التي تحصل على أرقام منخفضة لهذا المعيار تتطلب عملية مراجعة لتقرير الوسم الأنسب لها.
</p>

<p>
	كما يساهم تتبع واكتشاف الأخطاء بشكل كبير في تحسين دقة الوسوم، وكشف الأخطاء وهذا يمكن أن ينفذ آليًا باستخدام برامج مثل <a href="https://cleanlab.ai/" rel="external nofollow">كلين لاب Cleanlab</a> حيث تجري مقارنة للبيانات الموسومة باستخدام القواعد المعرفة مسبقًا لإكتشاف أي أخطاء أو اختلافات، فبالنسبة للصور يمكن اكتشاف التداخل بين مستطيلات التحديد bounding boxes آليًا، بينما في النصوص يمكن اكتشاف الوسوم المفقودة أو التنسيقات الخاطئة، وتجري مراجعة جميع الأخطاء بعد ذلك من قبل فريق ضمان الجودة، كما يمكن الاستعانة <a href="https://academy.hsoub.com/programming/artificial-intelligence/%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/" rel="">بالذكاء الاصطناعي</a> الذي توفره العديد من المنصات التجارية لاكتشاف الأخطاء التي تحدد الأخطاء المحتملة باستخدام نماذج تعلم آلي مدربة مسبقًا على بيانات موسومة، بعد تحديد ومراجعة نقاط الاهتمام في البيانات وتقرير الوسم الأصح يضاف لبيانات التدريب الخاصة بالنموذج لتحسين دقته من خلال عملية التعلم.
</p>

<p>
	يوفر تتبع الأخطاء تقييمًا في غاية الأهمية ويُحسّن عملية الوسم من خلال التعلم المستمر الذي يجري بتتبع عدة معايير مفتاحية مثل دقة الوسم ودرجة الإجماع بين الواسمين، فإن كان هناك مهام معينة تكثر فيها أخطاء الواسمين فينبغي تحديد الأسباب المؤدية لهذه الأخطاء، وتوفر العديد من المنصات التجارية أدوات مبنية بها تساعد على المراقبة والتقييم من خلال الرسومات البيانية التفاعلية التي توضح سجل الوسم وتوزيع الأخطاء، ويمكن تحسين الأداء بتعديل المعايير والإرشادات لتوضيح كيفية التعامل مع الإرشادات غير الواضحة وتحسين القواعد التي تساعد في اكتشاف الأخطاء.
</p>

<h3 id="-7">
	التعامل مع التحيز وضمان العدالة
</h3>

<p>
	تعتمد عملية وسم البيانات بشكل مكثف على الحكم والتفسير الشخصي، مما يشكل تحديًا على الواسمين ليقومو بوسم البيانات بشكل عادل وغير متحيز حتى عندما تكون البيانات غير واضحة، فمثلًا عند تصنيف النصوص يمكن أن تكون بعض العبارات والمشاعر مزاحًا أو سخرية ومن السهل أن يساء فهمها، ومثالٌ آخر في تصنيف تعابير الوجه التي يمكن أن يصنفها البعض على أنه وجه حزين والبعض الآخر يراه وجه يشعر بالملل، لذا فنسبية التصنيف أو الوسم تفتح الباب أمام التحيز أو الخطأ، ويمكن أن تكون مجموعة البيانات نفسها منحازة اعتمادًا على المصدر أو التركيب السكاني أو وجهة نظر جامعها ويمكن أن تكون غير ممثلة للمجتمع، وتدريب نماذج التعلم الآلي على بيانات منحازة يمكن أن يؤدي إلى توقعات خاطئة مثل تشخيص خاطئ للمرض بسبب تحيز البيانات الطبية المستخدمة للتدريب.
</p>

<p>
	لتقليل التحيز في عملية الوسم ينبغي أن يكون فريق الواسمين وفريق تأكيد الجودة من خلفيات متنوعة، فالوسم المزدوج والمتعدد يمكن أن يقلل من تأثير التحيز الناتج عن الأفراد، وعلى البيانات المستخدمة في التدريب أن تعكس العالم الحقيقي بتمثيل متوازن للتركيبة السكانية والجغرافية ويمكن جمع البيانات من مصادر واسعة التنوع وإضافة بيانات مخصوصة لمواجهة أي تحيز موجود في المصادر الأولية للبيانات، بالإضافة لذلك يمكنها أن تقلل طرق تعزيز وزيادة البيانات data augmentation مثل قلب الصور وإعادة صياغة النصوص من التحيز وتزيد تنوع البيانات بشكل مصطنع، فقلب الصورة مثلًا يُمكّن النموذج من تعلم التعرف على الكائنات بالصورة بغض النظر عن زاوية العرض مما يقلل التحيز لزاوية دوران الصورة، وإعادة صياغة النصوص تعرض النموذج لطرق أخرى للتعبير عن المعلومات مما يقلل التحيز تجاه صياغة أو كلمات معينة.
</p>

<p>
	كما يمكن أن تقلل الرقابة الخارجية من التحيز الموجود في عملية الوسم، وذلك من خلال دعوة فريق خارجي من المختصين بالمجال <a href="https://academy.hsoub.com/programming/general/%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA/" rel="">وعلماء البيانات</a> وخبراء تعلم الآلة لتقييم سير العمل والإشراف على مراجعة وسم البيانات، وتقديم النصائح والاقتراحات التي تساعد على تحسين عملية الوسم وتقليل التحيز.
</p>

<h3 id="-8">
	خصوصية وأمان البيانات
</h3>

<p>
	تتضمن مشروعات وسم البيانات في الغالب بيانات سرية أو خاصة لذا ينبغي أن تحتوي جميع المنصات على ميزات تضمن السرية والأمان للبيانات مثل التشفير والمصادقة المتعددة للتحكم بوصول المستخدمين. فمن أجل حماية خصوصية البيانات ينبغي أن يتم حذف البيانات الشخصية أو جعلها مجهولة الهوية، بالإضافة لذلك ينبغي تدريب كل فرد في فريق الوسم على أفضل ممارسات <a href="https://academy.hsoub.com/programming/general/%D8%A3%D9%85%D9%86-%D8%A7%D9%84%D9%85%D8%B9%D9%84%D9%88%D9%85%D8%A7%D8%AA/" rel="">تأمين البيانات</a> مثل استخدام كلمات مرور قوية وتفادي مشاركة البيانات غير المقصود.
</p>

<p>
	كما ينبغي أن تخضع منصات وسم البيانات للقوانين واللوائح المنظمة والتي تشمل اللائحة الشاملة لحماية البيانات GDPR وقانون كاليفورنيا لخصوصية المستخدم CCPA بالإضافة إلى قانون نقل التأمين الصحي والمساءلة HIPAA، وإخضاع المنصات التجارية للمراجعة والإشراف الخارجي والالتزام بمبادئ الثقة الخمسة وهي: الأمان والإتاحة والشفافية والموثوقية والخصوصية.
</p>

<h2 id="-9">
	مستقبل نظام وسم البيانات
</h2>

<p>
	تحدث عملية وسم البيانات في الكواليس بالنسبة للمستخدم النهائي ولكنها ذات دور محوري في تطوير نماذج التعلم الآلي وأنظمة الذكاء الاصطناعي لذلك ينبغي أن يكون نظام الوسم قابلًا للتوسع ليواكب أي تغير في المتطلبات.
</p>

<p>
	تُحدَّث منصات الوسم التجارية ومفتوحة المصدر بانتظام لدعم الاحتياجات النامية لوسم البيانات، لذلك ينبغي على أنظمة الوسم المطورة محليًا أن تبني بطريقة تجعل تحديثها أمرًا سلسًا، فالتصميم المعتمد على الوحدات والمكونات القابلة للتبديل بدون التأثير على باقي النظام تٌسهّل عملية التحديث والتطوير، على سبيل المثال يمكن لتوفر ميزة دمج أنظمة وسم البيانات مع مكتبات وأطر عمل مفتوحة المصدر أن تضيف نوعًا من التكييف والتأقلم، حيث يمكن تحديثها وتطويرها باستمرار مع تطور المجال.
</p>

<p>
	كما توفر الحلول المبنية على خدمات <a href="https://academy.hsoub.com/devops/cloud-computing/" rel="">الحوسبة السحابية</a> ميزة ملحوظة للمشاريع الضخمة في وسم البيانات والتي لا يمكن أن توفرها الأنظمة المُدارة ذاتيًا، فالمنصات السحابية قابلة للتوسع آليًا في تخزينها وفي قدراتها الحاسوبية مما يقلل من الحاجة للتطويرات المكلفة في البنية التحتية.
</p>

<p>
	وينبغي أيضًا توسيع قدرة فريق العمل المسؤول عن وسم البيانات مع نمو حجم مجموعات البيانات، وتدريب الواسمين الجدد بسرعة على وسم البيانات بدقة وبفعالية. والتمتع بالمرونة في سد الاحتياجات في قوة العمل باستخدام خدمات الوسم المُدارة أو التعاون مع واسمين مستقلين، وينبغي أن تكون عملية التدريب والضم للفريق قابلة للتوسع في المكان واللغة وأوقات العمل.
</p>

<h2>
	الخلاصة
</h2>

<p>
	تعرفنا في مقال اليوم على أسس وسم البيانات لنماذج تعلم الآلة ووجدنا أن المفتاح الرئيسي لتحسين أداء ودقة نموذج التعلم الآلي هو جودة البيانات الموسومة التي ندرب النموذج عليها، وتوفير الأنظمة المختلطة التي تجمع بين البشر والأدوات المؤتمتة في وسم البيانات لتتيح للذكاء الاصطناعي تحسين الطريقة التي يعمل بها والحصول على نتائج أكثر كفاءة وفعالية.
</p>

<p>
	ترجمة وبتصرف لمقال <a href="https://www.toptal.com/artificial-intelligence/how-to-label-data" rel="external nofollow">Architecting Effective Data Labeling Systems for Machine Learning Pipelines</a> لكاتبه <a href="https://www.toptal.com/resume/reza-fazeli" rel="external nofollow">Reza Fazeli</a>
</p>

<h2 id="-10">
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/python/%D9%85%D8%B9%D8%A7%D9%84%D8%AC%D8%A9-%D8%A7%D9%84%D8%B5%D9%88%D8%B1-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-python-r2408/" rel="">معالجة الصور باستخدام لغة بايثون Python</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D8%B3%D8%AA%D9%83%D8%B4%D9%81-%D9%85%D8%B5%D8%B7%D9%84%D8%AD%D8%A7%D8%AA-%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-%D8%A7%D9%84%D8%AA%D9%88%D9%84%D9%8A%D8%AF%D9%8A-r2399/" rel="">استكشف مصطلحات الذكاء الاصطناعي التوليدي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D9%81%D8%B6%D9%84-%D8%A3%D8%B7%D8%B1-%D8%B9%D9%85%D9%84-%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%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-r2475/" rel="">تعرف على أفضل أطر عمل الذكاء الاصطناعي لمشاريع تعلم الآلة </a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A3%D9%81%D8%B6%D9%84-%D9%85%D9%85%D8%A7%D8%B1%D8%B3%D8%A7%D8%AA-%D9%87%D9%86%D8%AF%D8%B3%D8%A9-%D8%A7%D9%84%D9%85%D9%8F%D9%88%D8%AC%D9%91%D9%90%D9%87%D8%A7%D8%AA/" rel="">أفضل ممارسات هندسة المُوجِّهات Prompt Engineering: نصائح وحيل وأدوات</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2480</guid><pubDate>Thu, 26 Dec 2024 16:00:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x645;&#x641;&#x627;&#x647;&#x64A;&#x645; &#x627;&#x644;&#x623;&#x633;&#x627;&#x633;&#x64A;&#x629; &#x644;&#x644;&#x630;&#x643;&#x627;&#x621; &#x627;&#x644;&#x627;&#x635;&#x637;&#x646;&#x627;&#x639;&#x64A;</title><link>https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%84%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-r2478/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_12/10.jpg.b3db6d21d004301173959bd726534bd3.jpg" /></p>
<p>
	يتطور مجال الذكاء الاصطناعي يومًا بعد الآخر ويزداد الاهتمام بمعرفة مفاهيمه ومبادئه الأساسية وفهمهما جيدًا، وسنستعرض لكم في مقال اليوم أهم مفاهيم الذكاء الاصطناعي التي يحتاج أي مهتم بهذا الاختصاص لمعرفتها عن كثب.
</p>

<h2 id="-1">
	أهم مفاهيم الذكاء الاصطناعي
</h2>

<p>
	سنناقش في الفقرات التالية العديد من مفاهيم الذكاء اصطناعي التي يُبنى عليها المجال بأكمله، والتي ينبغي على كل مهتم <a href="https://academy.hsoub.com/artificial-intelligence/" rel="">بتعلم الذكاء الاصطناعي</a> فهمها ومعرفة مدلولاتها وهي:
</p>

<ul>
	<li>
		<a href="#artificialintelligence" rel="">الذكاء الاصطناعي Artificial Intelligence </a>
	</li>
	<li>
		<a href="#generativeartificialintelligence" rel="">الذكاء الاصطناعي التوليدي Generative Artificial Intelligence </a>
	</li>
	<li>
		<a href="#machinelearning" rel="">تعلم الآلة Machine Learning </a>
	</li>
	<li>
		<a href="#deeplearning" rel="">التعلم العميق Deep Learning </a>
	</li>
	<li>
		<a href="#computervision" rel="">الرؤية الحاسوبية Computer Vision </a>
	</li>
	<li>
		<a href="#naturallanguagprocessing" rel="">معالجة اللغة الطبيعية Natural Language Processing </a>
	</li>
	<li>
		<a href="#trainingdata" rel="">بيانات التدريب Training Data </a>
	</li>
	<li>
		<a href="#aimodels" rel="">نماذج الذكاء الاصطناعي Artificial Intelligence Models</a>
	</li>
	<li>
		<a href="#aialgorithms" rel="">خوارزميات الذكاء الاصطناعي Artificial Intelligence Algorithms</a>
	</li>
	<li>
		<a href="#ann" rel="">الشبكات العصبية الاصطناعية Artificial Neural Networks </a>
	</li>
	<li>
		<a href="#llms" rel="">النماذج اللغوية الكبيرة Large Language Models </a>
	</li>
	<li>
		<a href="#expertsystems" rel="">الأنظمة الخبيرة Expert Systems </a>
	</li>
	<li>
		<a href="#robotics" rel="">علم الروبوتات Robotics </a>
	</li>
</ul>

<p>
	لنتعرف على كل مفهوم من مفاهيم الذكاء الاصطناعي السابقة بمزيد من التفصيل في فقراتنا التالية.
</p>

<h3 id="artificialintelligence">
	الذكاء الاصطناعي Artificial Intelligence
</h3>

<p>
	<a href="https://academy.hsoub.com/programming/artificial-intelligence/%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/" rel="">الذكاء الاصطناعي</a> Artificial Intelligence أو AI اختصارًا، هو تخصص تقني يهتم بتمكين الآلات والأنظمة الإلكترونية من محاكاة طريقة البشر في التفكير وحل المشكلات، وتتمكن من معالجة المدخلات أو البيانات كما لو أن إنسانًا يعالجها، واستخراج نتائج مفيدة منها، وابتكار مخرجات جديدة بناء عليها، وتجمع هذه الأنظمة بين قدراتها الهائلة على التذكر والتنظيم مع قدرة البشر على التفكير والتحليل، لتصنع ما لا يستطيع الإنسان صنعه، وتخرج لنا بتطبيقات ذكية كانت أٌقرب للخيال العلمي.
</p>

<h3 id="generativeartificialintelligence">
	الذكاء الاصطناعي التوليدي Generative Artificial Intelligence
</h3>

<p>
	الذكاء الاصطناعي التوليدي  Generative AI هو نوع أنواع من الذكاء الاصطناعي جرى تدريبه على ابتكار وتوليد محتوى جديد بشكل ذاتي، كتوليد النصوص المختلفة من مقالات وقصائد، أو توليد الصور والمقاطع الصوتية وغيرها من أنواع المحتوى. وقد تتساءل كيف يتمكن الذكاء الاصطناعي من القيام بذلك والجواب هو أنه يتعلم الأنماط والقواعد من كميات البيانات الضخمة الفعلية التي تدرب عليها فتمكن بعدها من محاكاتها وتقليدها وتوليد محتوى جديد.
</p>

<p>
	على سبيل المثال، إذا دربنا نظام ذكاء اصطناعي على مجموعة كبيرة من صور الطيور، فإنه سيتعلم الأنماط التي تميز الطيور عن الأشياء الأخرى وسيكون قادرًا على إنشاء صورة جديدة لطير لم يرها من قبل ولكنها تبدو حقيقية وتشبه الطيور فعلًا، ويعتمد الذكاء الاصطناعي التوليدي في هذا الأمر على مفهوم  التعلم العميق الذي سنشرحه في فقرة لاحقة.
</p>

<h3 id="machinelearning">
	تعلم الآلة Machine Learning
</h3>

<p>
	تعلم الآلة Machine Learning أو ML اختصارًا هو أحد المفاهيم الفرعية الأساسية للذكاء الاصطناعي وهو يعني تمكين الآلات من التعلم من البيانات دون الحاجة إلى برمجتها مسبقًا، وتمكينها من تحسين أداءها مع مرور الوقت، وتعزيز قدرتها على اتخاذ القرارات وإجراء التنبؤات وأداء المهام بالاعتماد على تلك البيانات.
</p>

<p>
	على سبيل المثال، إذا أردنا تدريب نظام للتعرف على محتوى الصور، فعلينا تغذيته بصور تحتوي على أشياء مختلفة مثل صور الأشخاص والسيارات والحيوانات وغيرها، وسيتعلم هذا النظام بعد التدريب كيف يميز محتوى الصور، وكلما زادت كمية وجودة البيانات المقدمة لها النظام، كلما تحسن أداؤه مع مرور الوقت.
</p>

<p>
	ويوجد ثلاثة أنواع من لتعلم الآلة وهي:
</p>

<h4>
	1. التعلم تحت إشراف Supervised Learning
</h4>

<p>
	وفيه تتدرب خوارزميات الذكاء الاصطناعي على مجموعات بيانات مصنفة ومنظمة، أي مجموعات بيانات تحتوي على أمثلة للمدخلات والمخرجات التي يُفترض أن تنتجها الخوارزمية بناء على هذه المدخلات. فمثلًا إذا أردنا تطوير خوارزمية للتفريق بين القطط والكلاب باستخدام أسلوب التعلم مع إشرافٍ فإننا نعطي الخوارزمية مجموعة بيانات تحتوي على صور قطط تحت تصنيف أو وسم بعنوان قطط، وصور كلاب تحت تصنيف بعنوان كلاب، ثم نسمح للخوارزمية بتحليل الصور ومعرفة سبب تصنيفها، وبالتالي التعرف على صفات الكلاب والقطط، فإذا ما انتهت الخوارزمية من التدرب يمكن أن نعطيها بعد ذلك صورًا جديدة لكلاب وقطط لم تتدرب عليها من قبل، ونسألها إذا ما كان في الصور كلب أم قطة، فإن أجابت الخوارزمية بدقة فقد نجحنا، وأما إذا لم تكن إجابات الخوارزمية دقيقة فنحن حينئذ بحاجة إلى تدريبها على مجموعات بيانات أكبر، أو إلى تعديل الخوارزمية لزيادة دقتها.
</p>

<h4>
	2. التعلم بدون إشراف Unsupervised Learning
</h4>

<p>
	يختلف التعلم بدون إشراف عن التعلم تحت إشراف في أن الخوارزميات تتدرب على مجموعات بيانات غير مصنفة أو موسومة، ويعمل نموذج الذكاء الاصطناعي بنفسه على تصنيفها تلقائيًا بناء على أوجه التشابه والاختلاف بين البيانات، فمثلًا عند تطوير نموذج ذكاء اصطناعي للتعرف على أنواع الأشجار فإننا لا نزود النموذج بأسماء الأنواع، ولا نصنف الأنواع في مجموعة البيانات، وإنما نعطي للنموذج صورًا لهذه الأنواع فقط، فيبدأ في تصنيف الأشجار ضمن فئات استنادًا إلى أشكالها وأحجام أوراقها والخصائص المشتركة بينها، ويشيع استخدام هذا النوع من التعلم في المهام المعقدة التي تتطلب تصنيفًا وترتيبًا لكميات كبيرة من البيانات غير المنظمة.
</p>

<h4>
	التعلم المعزز Reinforcement Learning
</h4>

<p>
	يعتمد التعلم المعزز على مبدأ التجربة والخطأ والمكافأة، إذ تتخذ الخوارزمية قرارات فتُمنح مكافأة عند اتخاذها قرارًا صحيحًا وعقابًا عند الخطأ، فتتعلم من هذا الخطأ، مما يعزز من فرصها لتحقيق النتائج الصحيحة، ويُستخدم التعلم المعزز بشكل واسع في ألعاب مثل الشطرنج، حيث تُدرّب برامج الشطرنج مثل ستوك فيش Stockfish وألفا زيرو AlphaZero عبر لعب ملايين المباريات ضد نفسها، ومن خلال التجربة والخطأ وتلقي المكافآت، تتمكن هذه البرامج من استيعاب قواعد الشطرنج بالكامل وتعلم كيفية اتخاذ أفضل القرارات وحساب جميع الاحتمالات دون الحاجة إلى تدخل بشري.
</p>

<h3 id="deeplearning">
	التعلم العميق Deep Learning
</h3>

<p>
	<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86-%D9%84%D9%81%D9%87%D9%85-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%82-r1422/" rel="">التعلم العميق Deep Leaning </a>هو فرع متقدم من تعلم الآلة يركز على حل المشكلات المعقدة والتعامل مع <a href="https://academy.hsoub.com/programming/general/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D9%85%D9%81%D9%87%D9%88%D9%85-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D8%B6%D8%AE%D9%85%D8%A9-big-data-r1579/" rel="">البيانات الضخمة Big Data</a>. يعتمد في عمله على مفهوم <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%B4%D8%A8%D9%83%D8%A9-%D8%B9%D8%B5%D8%A8%D9%8A%D8%A9-%D8%B5%D9%86%D8%B9%D9%8A%D8%A9-%D9%88%D8%AA%D8%AF%D8%B1%D9%8A%D8%A8%D9%87%D8%A7-%D9%84%D9%84%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D9%88%D8%AC%D9%88%D9%87-r1198/" rel="">الشبكات العصبية الاصطناعية</a> التي تعمل بشكل مشابه لعمل دماغنا البشري. ومن أبرز استخدامات التعلم العميق الرؤية الحاسوبية Computer Vision التي تمكًن الآلات من فهم الصور ومقاطع الفيديو والتعرف على الأشياء الموجودة فيها.
</p>

<h3 id="computervision">
	الرؤية الحاسوبية Computer Vision
</h3>

<p>
	يعد مفهوم الرؤية الحاسوبية Computer Vision من مفاهيم الذكاء الاصطناعي المهمة التي تهدف إلى تمكين الحواسيب والأنظمة من استخراج معلومات ذات معنى من الصور الرقمية ومقاطع الفيديو والمدخلات البصرية الأخرى، ثم اتخاذ إجراءات أو تقديم توصيات عند ملاحظة مشكلات أو عيوب في هذه المدخلات، وتتضمن تطبيقات الرؤية الحاسوبية أنظمة التعرف على الوجوه والأشياء وأنظمة السيارات ذاتية القيادة.
</p>

<h3 id="naturallanguageprocessing">
	معالجة اللغة الطبيعية Natural Language Processing
</h3>

<p>
	يشير مفهوم معالجة اللغة الطبيعية Natural Language Processing أو NLP اختصارًا إلى قدرة الآلات على فهم لغتنا البشرية  مثل العربية والإنجليزية والألمانية سواء كانت لمكتوبة أو منطوقة، وذلك من خلال استخدام تقنيات متقدمة كالتعلم العميق، وبهذا تتمكن الآلات من التفاعل معنا نحن البشر بلغتنا وتؤدي لنا المهام المختلفة مثل تحليل النصوص وتصنيفها و<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D9%84%D8%AE%D9%8A%D8%B5-%D8%A7%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%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-r2315/" rel="">تلخيص النصوص</a> الطويلة <a href="https://academy.hsoub.com/apps/cat/" rel="">وترجمتها </a>من لغة إلى أخرى والإجابة على الأسئلة وغيرها من المهام التي من شأنها تحسين التواصل بيننا نحن البشر وبين الآلات من حولنا.
</p>

<p>
	تعتمد معالجة اللغة الطبيعية على عدة مفاهيم في عملها أهمها الترميز Tokenization، وهو تقسيم النص إلى كلمات أو رموز Tokens، والتحليل النحوي Parsing لتركيب الجمل، والتحليل العاطفي Sentiment analysis لفهم العواطف والمشاعر في النصوص وهي تُستخدم في العديد من المجالات، مثل تحليل الأخبار والتقارير المالية، وخدمة العملاء لتوفير دعم فوري عبر روبوتات الدردشة.
</p>

<h3 id="data">
	بيانات التدريب Training Data
</h3>

<p>
	يقوم مجال الذكاء الاصطناعي من أبسط أشكاله إلى أعقدها على بيانات التدريب Training Data، فالبيانات هي الوقود الذي تتغذى عليه نماذج الذكاء الاصطناعي، وهي التي تعلمه كيفية التعرف على الأنماط وإجراء التوقعات. على سبيل المثال، إذا كان لدينا الكثير من الصور لأنواع مختلفة من الطيور ودربناه عليها، سيتعلم نموذج الذكاء الاصطناعي تدريجيًا كيفية تمييز الأنماط في هذه الصور ويتعرف على الخصائص والسمات المشتركة التي تمير الطيور، ويصبح قادرًا مع مرور الوقت على تحديد نوع الطائر في صورة جديدة لم يسبق له أن رآها أو تدرب عليها.
</p>

<h3 id="aimodels">
	نماذج الذكاء الاصطناعي
</h3>

<p>
	يعد نموذج الذكاء الاصطناعي AI Model برنامج أو أداة جاهزة  دُرّبت مسبقًا على كم هائل من البيانات في مجال محدد لتكون قادرة على حل مشكلات أو أداء مهام معينة بدون الحاجة إلى برمجة كل خطوة يدويًا، حيث يمكن لهذه النماذج التنبؤ بما بالقرارات المستقبلية وإيجاد الحلول لمشكلات معينة بناء على خبرتها السابقة، فمثلًا لو أعطينا نموذج ذكاء اصطناعي بيانات عن الطقس ودرجة الحرارة والرطوبة لعدد كبير من الأيام فسيتمكن النموذج من التنبؤ بطقس اليوم التالي بناء على الأنماط التي تعلّمها من البيانات السابقة، ولو دربناه على عدد كبير من الأكواد البرمجية فسيتمكن من فهم الأنماط البرمجية وتقديم اقتراحات لحلول برمجية أو حتى كتابة كود جديد لحل مشكلة معينة، كما الحال مع نموذج GitHub Copilot مثلًا، ولو دربناه على مجموعات متنوعة من البيانات العامة فسيتمكن من الرد على الأسئلة في مجالات متعددة كنموذج <a href="https://academy.hsoub.com/apps/web/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A8%D9%88%D8%AA-%D8%A7%D9%84%D9%85%D8%AD%D8%A7%D8%AF%D8%AB%D8%A9-%D8%A7%D9%84%D8%B0%D9%83%D9%8A-%D8%B4%D8%A7%D8%AA-%D8%AC%D9%8A-%D8%A8%D9%8A-%D8%AA%D9%8A-chatgpt-r863/" rel="">ChatGPT</a>.
</p>

<h3 id="aialgorithms">
	خوارزميات الذكاء الاصطناعي
</h3>

<p>
	إذا اعتبرنا أن نموذج الذكاء الاصطناعي حل جاهز يمكن استخدامه لإجراء التنبؤات وأداء المهام بناء على التدريب الذي تلقاه. فإن الخوارزميات هي التي تعلّم هذا النموذج كيف يقوم بمهامه، لذا يمكن القول أن <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AE%D9%88%D8%A7%D8%B1%D8%B2%D9%85%D9%8A%D8%A7%D8%AA-%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/" rel="">خوارزميات الذكاء الاصطناعي</a> هي دستور نماذج الذكاء الاصطناعي، فكلمة <a href="https://academy.hsoub.com/programming/advanced/%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%B1%D8%B2%D9%85%D9%8A%D8%A7%D8%AA/" rel="">خوارزمية </a>ما هي إلا مجموعة من الخطوات والقواعد المتبعة لحل مشكلة محددة أو تنفيذ مهمة، وخوارزميات الذكاء الاصطناعي هي من يحدد لنموذج الذكاء الاصطناعي طريقة التعامل مع البيانات المدخلة له، وتودهه لكيفية استكشاف الأنماط في هذه البيانات وتحليلها لتقديم النتائج أو التنبؤات الصحيحة. ومن الأمثلة على خوارزميات الذكاء الاصطناعي نذكر:
</p>

<ul>
	<li>
		خوارزمية الانحدار الخطي Linear Regression التي تتوقع القيم العددية بناءً على علاقة خطية بين المتغيرات
	</li>
	<li>
		خوارزمية أشجار Decision Trees التي تتخذ القرارات من خلال تقسيم البيانات إلى مجموعات فرعية بناء على سمات معينة
	</li>
	<li>
		خوارزمية الجار الأقرب K-Nearest Neighbors لتصنيف البيانات بناء على أقرب الجيران في فضاء البيانات
	</li>
	<li>
		خوارزمية الدعم الآلي للمتجه Support Vector Machines لتصنيف البيانات وتحديد الفئات بناءً على خطوط فاصلة بين الفئات المختلف
	</li>
</ul>

<p>
	تعتمد هذه الخوارزميات على أساليب مختلفة لمعالجة البيانات وتعلم الأنماط، وهي تشكل الأساس الذي يبني عليه الذكاء الاصطناعي ليحقق النتائج المطلوبة.
</p>

<h3 id="ann">
	الشبكات العصبية الاصطناعية Artificial Neural Networks
</h3>

<p style="text-align: center;">
	<img alt="الشبكات العصبية الاصطناعية" class="ipsImage ipsImage_thumbnailed" data-fileid="164497" data-ratio="60.40" data-unique="s2e0h4y4h" style="width: 500px; height: auto;" width="750" src="https://academy.hsoub.com/uploads/monthly_2024_12/1057175163_.png.7ff23a4df64f8b9648d68d6cfcd3f8b8.png">
</p>

<p>
	يمكن اعتبار الشبكة العصبية نوعًا من أنواع نماذج أو خوارزميات تعلم الآلة، وتصميمها مستوحى من تصميم الدماغ البشري، وهي أكثر تعقيدًا من الخوارزميات التقليدية، لذا تدخل الشبكات العصبية عادة في بناء نماذج الذكاء الاصطناعي التي تتعامل مع بيانات معقدة، مثل نماذج الرؤية الحاسوبية ونماذج التعرف على الأصوات، وتستفيد هذه الشبكات من البيانات، كما أنها تتعلم من الأخطاء السابقة لتحسن دقة قراراتها بمرور الوقت، وتُستخدم مفاهيم الشبكات العصبية في العديد من المجالات مثل تصنيف الصور والنصوص، وكذلك التنبؤ بأسعار الأسهم ودرجات الحرارة وغيرها من المجالات و<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%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/" rel="">التطبيقات</a>.
</p>

<p>
	تُبنى الشبكات العصبية من وحدات بسيطة تسمى العقد أو الخلايا العصبية وتنظم على هيئة عدة طبقات مترابطة فيما بينها وهي:
</p>

<ul>
	<li>
		طبقة الدخل التي تستقبل البيانات وتمررها إلى الطبقة التالية
	</li>
	<li>
		الطبقات المخفية التي تحلل البيانات وتعالجها بعمق وقد تحتوي الشبكة على عدة طبقات مخفية تحاول كل طبقة التعرف على نمط معين في البيانات
	</li>
	<li>
		طبقة الخرج التي تعرض النتيجة النهائية بعد معالجة البيانات
	</li>
</ul>

<h3 id="llms">
	النماذج اللغوية الكبيرة Large Language Models
</h3>

<p>
	النماذج اللغوية الكبيرة Large Language Models أو LLMs اختصارًا هي نوع من نماذج الذكاء الاصطناعي المدربة على كميات ضخمة من البيانات النصية. تهدف هذه النماذج إلى فهم وتوليد اللغة البشرية بطريقة مشابهة لكيفية فهم البشر للكلمات والنصوص، فقد تدربت هذه النماذج على ملايين الجمل والنصوص من مصادر متنوعة مثل الكتب والمقالات، . هذا سمح لها بالتعلم عن قواعد اللغة وترابط الكلمات والعلاقات بين الجمل وحتى الفهم البسيط للمنطق ومكنها من التنبؤ بالكلمات التالية أو إنشاء نصوص جديدة بناء على ما تعلمته. على سبيل المثال، يمكن للنموذج اللغوي الكبير LLM الإجابة على الأسئلة وكتابة مقاطع نصية وتقديم اقتراحات لتحسين الكتابة.
</p>

<p>
	ومن الأمثلة على تطبيقات النماذج اللغوية الكبيرة:
</p>

<ul>
	<li>
		مساعدات الكتابة مثل Grammarly التي تساعد في تصحيح النصوص
	</li>
	<li>
		روبوتات الدردشة الذكية مثل <a href="https://academy.hsoub.com/apps/web/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A8%D9%88%D8%AA-%D8%A7%D9%84%D9%85%D8%AD%D8%A7%D8%AF%D8%AB%D8%A9-%D8%A7%D9%84%D8%B0%D9%83%D9%8A-%D8%B4%D8%A7%D8%AA-%D8%AC%D9%8A-%D8%A8%D9%8A-%D8%AA%D9%8A-chatgpt-r863/" rel="">ChatGPT</a> التي تستطيع التفاعل مع المستخدمين عبر المحادثات
	</li>
	<li>
		المساعدين الشخصيين مثل Siri وAlexa التي يمكنها تنفيذ الأوامر الصوتية
	</li>
</ul>

<h3 id="expertsystems">
	الأنظمة الخبيرة Expert Systems
</h3>

<p>
	تهتم الأنظمة الخبيرة Expert Systems بتطوير أنظمة متخصصة في مجال محدد لتحاكي في هذا المجال أكثر العاملين فيه خبرة، ومن ثم تساعد هذه الأنظمة المتخصصين في المجال على تسريع عملهم والإبداع فيه والابتكار، وتعتمد الأنظمة الخبيرة في عملها على قاعدة معرفية Knowledge Base تتكون من مجموعة من المعلومات والقواعد التي يستخدمها الخبراء في مجال النظام لحل المشكلات، بالإضافة إلى محرك استدلال Inference Engine لتحليل المعلومات والقواعد بالقاعدة المعرفية واتخاذ القرارات بناءً على هذه التحليلات.
</p>

<h3 id="robotics">
	علم الروبوتات Robotics
</h3>

<p>
	يعد مجال <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%B1%D9%88%D8%A8%D9%88%D8%AA-%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-r1855/" rel="">الروبوتات</a> أو علم الروبوتات من المجالات سريعة التطور، ويعد أحد المجالات ذات المستقبل الباهر، ويسعى مهندسو الروبوتات إلى بناء أنظمةٍ تساعد عتاد الروبوت على استيعاب البيئة المحيطة والتعرف على الأشياء من حوله، وكذلك تنفيذ المهام المطلوبة منه بدقة وسرعة، ومن أبرز تطبيقات مجال هندسة الروبوتات روبوتات المصانع وروبوتات التنظيف وروبوتات التمريض وغيرها.
</p>

<p>
	والجدير بالذكر معرفة الفرق بين الروبوتات المقصودة هنا وبين روبوتات الدردشة الذكية مثل ChatGPT فالروبوتات التي نشرحها هنا هي آلات مادية تقوم بمهامها الفعلية في العالم الواقعي باستخدام مكونات ميكانيكية وإلكترونية. أما روبوتات الدردشة الذكية فهي برمجيات رقمية تعتمد على الذكاء الاصطناعي للقيام بمهامها دون الحاجة إلى مكونات مادية.
</p>

<h2 id="-3">
	مفاهيم واعتبارات تتعلق بالذكاء الاصطناعي
</h2>

<p>
	إضافة للمفاهيم الأساسية التي شرحناها سابقًا، يتضمن مجال الذكاء الاصطناعي على عدة اعتبارات ومفاهيم يجب إدراكها ومعرفة دلالتها، سنكتفي بذكر ثلاثة منهم:
</p>

<ul>
	<li>
	<a href="#aibias" rel="">		هلوسة الذكاء الاصطناعي AI Bias </a>
	</li>
	<li>
<a href="#aihallucination" rel="">	 		تحيز الذكاء الاصطناعي AI Hallucination </a>
	</li>
	<li>
		<a href="#finetuning" rel="">	 تقنية الصقل Fine-Tuning </a>
	</li>
</ul>

<p>
	لنوضح أكثر كل مفهوم من هذه المفاهيم.
</p>

<h3 id="aibias">
	تحيز الذكاء الاصطناعي AI Bias
</h3>

<p>
	تحيز الذكاء الاصطناعي مفهوم أساسي في الذكاء الاصطناعي يجب الانتباه له، حيث يقع التحيز عندما تتخذ أنظمة الذكاء الاصطناعي قرارات غير عادلة بسبب وجود تحيزات في البيانات التي تدربت عليها في الأساس. على سبيل المثال، إذا دربنا نظام ما على قبول أو رفض طلبات القروض في البنك باستخدام بيانات معينة جرى فيها رفض معظم قروض العملاء ذوي الدخل المنخفض أو الذين ينتمون لعرق أو جنس معين، فإن النظام قد يتعلم بطريقة غير عادلة ويبدأ في تصنيف العملاء الجدد بطريقة خاطئة بناء على هذه التحيزات المسبقة في مجموعات بيانات التدريب.
</p>

<h3 id="aihallucination">
	هلوسة الذكاء الاصطناعي AI Hallucination
</h3>

<p>
	تشير هلوسة الذكاء الاصطناعي إلى فشل نموذج الذكاء الاصطناعي في توليد نتائج صحيحة ومفيدة، أو أن يولد النموذج نتائج متداخلة غير منطقية وغير مفهومة كأن تطلب منه اقتراح مميزات هاتف جوال ما فخبرك أن بإمكانه الطيران أو تطلب توليد صورة لغروب الشمس على البحر مع مجموعة من الطيور الطائرة في السماء فيولد لك صورة فيها طيور تسبح في الماء بدل أن تطير، فغالبًا ما تحدث هلوسات الذكاء الاصطناعي في النماذج التوليدية، ولا سيما في نماذج توليد الصور والنصوص، وتحدث عادة بسبب استخراج النموذج لنمط غير صحيح أو لا وجود له من الأساس في بيانات التدريب.
</p>

<h3 id="finetuning">
	تقنية الصقل Fine-Tuning
</h3>

<p>
	<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%B7%D8%B1%D9%8A%D9%82%D8%A9-%D8%A7%D9%84%D8%B5%D9%82%D9%84-fine-tune-%D9%84%D9%86%D9%85%D9%88%D8%B0%D8%AC-%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D9%85%D9%8F%D8%AF%D8%B1%D9%91%D9%8E%D8%A8-%D9%85%D9%8F%D8%B3%D8%A8%D9%82%D9%8B%D8%A7-r2367/" rel="">الصقل</a> Fine-Tuning هو مفهوم يشير إلى نقل خبرات نموذج ذكاء اصطناعي عام إلى نموذج آخر جديد، ثم تكييف هذا النموذج الجديد وتخصيصه لتأدية مهمة محددة أو استخدامه في حالات معدودة، على سبيل المثال بفرض لدينا نموذج ذكاء اصطناعي عام يستخدم لترجمة النصوص، يمكن صقله ليتخصص في فهم وترجمة المصطلحات الطبية. لذلك، يمكننا تدريبه على بيانات طبية محددة، ليصبح أكثر دقة في التعامل مع هذه المصطلحات بدل تدريب النموذج من الصفر، وهي تقنية مفيدة توفر الكثير من الوقت والجهد والموارد التي يبذلها <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%85%D9%86-%D9%87%D9%88-%D9%85%D9%87%D9%86%D8%AF%D8%B3-%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%88%D9%85%D8%A7-%D8%A3%D8%A8%D8%B1%D8%B2-%D9%85%D9%87%D8%A7%D9%85%D9%87-r2319/" rel="">مهندسو الذكاء الاصطناعي</a>.
</p>

<h2>
	تعلم المزيد حول مفاهيم الذكاء الاصطناعي
</h2>

<p>
	حاولنا أن نوضح لكم أبرز المفاهيم المتعلقة بالذكاء الاصطناعي، وإن كنتم تهدفون إلى التعمق في معرفة المزيد حول كل المفاهيم الخاصة بالذكاء الاصطناعي وتعلم الآلة Machine Learning والتعلم العميق Deep Learning والرؤية الحاسوبية Computer Vision وغيرها، وتعزيز معرفتكم النظرية بمشاريع عملية حقيقة تعزز خبراتكم وتصقلها، فقد وفرت لكم أكاديمية حسوب دورة مميزة تحقق لكم أهدافكم وتنقلكم لمستوى متقدم واحترافي، فالتطبيق العملي في أي تخصص تقني ولا سيما في <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D9%81%D9%8A-%D8%AA%D8%AE%D8%B5%D8%B5-%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-r2466/" rel="">تخصص الذكاء الاصطناعي</a> هو المفتاح الرئيسي لتطوير المهارات وتحقيق التميز والنجاح.
</p>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة الذكاء الاصطناعي
		</p>

		<p class="banner-subtitle">
			احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة.
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/artificial-intelligence" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<a href="https://academy.hsoub.com/learn/artificial-intelligence" rel=""><img alt="دورة الذكاء الاصطناعي AI" src="https://academy.hsoub.com/learn/assets/images/courses/artificial-intelligence.png"></a>
	</div>
</div>

<p>
	كما توفر أكاديمية حسوب الكثير من مقالات ودروس الذكاء الاصطناعي الاحترافية المميزة التي تشرح كل ما تحتاجونه من المستوى المبتدئ للمتقدم، إضافة إلى <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D9%87%D9%85-%D9%83%D8%AA%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-%D8%A7%D9%84%D9%85%D8%AC%D8%A7%D9%86%D9%8A%D8%A9-r2330/" rel="">كتب الذكاء الاصطناعي</a> القيًمة المتوفرة في قسم كتب أكاديمية حسوب والمتاحة لتحميلها بالمجان فهي مصدر مهم يساعدكم لتعلم الكثير حول هذا التخصص الرائد بطريقة منهجية ومنظمة.
</p>
<iframe allowfullscreen="" class="ipsEmbed_finishedLoading" data-controller="core.front.core.autosizeiframe" data-embedauthorid="3889" data-embedcontent="" data-embedid="embed1163737943" src="https://academy.hsoub.com/files/17-%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%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%88%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9/?do=embed" style="overflow: hidden; height: 468px; max-width: 500px; margin: auto;"></iframe>

<h2 id="-4">
	الخلاصة
</h2>

<p>
	تحدثنا في مقال اليوم أهم مفاهيم الذكاء الاصطناعي، ووضحنا المفاهيم الأساسية والتقنية المرتبطة بهذا المجال، كما شرحنا بعض الاعتبارات والمصطلحات المرتبطة بمجال الذكاء الاصطناعي وأهم مصادر تعلمه واحترافه بشكل عملي، إذا كنتم مهتمين بمعرفة المزيد عن هذا المجال أو كان لديكم تساؤل عن أحد المفاهيم التي أوردناها يمكنكم إضافة أسئلتكم في قسم التعليقات أسفل المقال.
</p>

<h2 id="-5">
	اقرأ أيضًا
</h2>

<ul>
	<li>
		 <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D8%B3%D8%AA%D9%83%D8%B4%D9%81-%D9%85%D8%B5%D8%B7%D9%84%D8%AD%D8%A7%D8%AA-%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-%D8%A7%D9%84%D8%AA%D9%88%D9%84%D9%8A%D8%AF%D9%8A-r2399/" rel="">استكشف مصطلحات الذكاء الاصطناعي التوليدي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%85%D8%B5%D8%B7%D9%84%D8%AD%D8%A7%D8%AA-%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%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86-r2363/" rel="">مصطلحات الذكاء الاصطناعي للمبتدئين</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-r1009/" rel="">المفاهيم الأساسية لتعلم الآلة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%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/" rel="">الذكاء الاصطناعي: دليلك الشامل</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A3%D9%87%D8%AF%D8%A7%D9%81-%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-r2469/" rel="">أهداف الذكاء الاصطناعي</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2478</guid><pubDate>Tue, 24 Dec 2024 15:02:00 +0000</pubDate></item><item><title>&#x62A;&#x639;&#x631;&#x641; &#x639;&#x644;&#x649; &#x623;&#x641;&#x636;&#x644; &#x623;&#x637;&#x631; &#x639;&#x645;&#x644; &#x627;&#x644;&#x630;&#x643;&#x627;&#x621; &#x627;&#x644;&#x627;&#x635;&#x637;&#x646;&#x627;&#x639;&#x64A; &#x644;&#x645;&#x634;&#x627;&#x631;&#x64A;&#x639; &#x62A;&#x639;&#x644;&#x645; &#x627;&#x644;&#x622;&#x644;&#x629;</title><link>https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D9%81%D8%B6%D9%84-%D8%A3%D8%B7%D8%B1-%D8%B9%D9%85%D9%84-%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%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-r2475/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_12/1440428145_.png.dba2ec23b58d09a8afa496a7d1ec595a.png" /></p>
<p>
	كثيرًا ما يتردد على مسامعنا مصطلح تعلم الآلة Machine Learning في الآونة الأخيرة، ويزداد الاهتمام به يومًا بعد يوم، فما هو تعلم الآلة بالضبط؟ وما هي أفضل أطر العمل البرمجية والأدوات التي تساعدنا على استثماره وتحقيق أقصى استفادة منه في مشاريعنا؟ هذا ما سنتعرف عليه في مقال اليوم.
</p>

<h2 id="-1">
	ما هو تعلم الآلة
</h2>

<p>
	هناك تعريفات متنوعة <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9/" rel="">لتعلم الآلة</a> تصب جميعها في الفكرة الأساسية التالية: تعلم الآلة Machine Learning أو ML اختصارًا، هو ببساطة جعل الحاسوب يتعلم الأشياء من تلقاء نفسه، وهذا هو الرابط بين تعلم الآلة و<a href="https://academy.hsoub.com/programming/artificial-intelligence/" rel="">الذكاء الاصطناعي AI</a>، فالذكاء الاصطناعي يعني جعل الآلة تفكر وتتعلم كما يفعل الإنسان.
</p>

<p>
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="450" id="ips_uid_8596_6" referrerpolicy="strict-origin-when-cross-origin" src="https://academy.hsoub.com/applications/core/interface/index.html" title="ماذا يعني تعلم الآلة Machine Learning؟" width="930" data-embed-src="https://www.youtube.com/embed/7up0GP1Y8aM"></iframe>
</p>

<p>
	إذًا كيف ننجح في جعل الحاسوب يتعلم من تلقاء نفسه؟ أسهل طريقة لتحقيق ذلك هي باستخدام أطر عمل الذكاء الاصطناعي AI Frameworks فهي الطريقة المثلى للنجاح، وقبل أن نتعرف على هذه الأطر دعنا نستذكر في البداية معنى <a href="https://academy.hsoub.com/programming/general/%D8%A5%D8%B7%D8%A7%D8%B1-%D8%B9%D9%85%D9%84-framework/" rel="">إطار العمل في البرمجة</a>.
</p>

<p>
	إطار العمل framework في جوهره هو طريقة لتنفيذ العمل، فمن خلالها يمكن تنظيم العمل البرمجي وتهيئة البيئة المناسبة لتحسين عملية التطوير وتسريعها، ولعل الكفاءة والفعالية هي أبرز فوائد استخدام إطار العمل.
</p>

<p>
	سنعرض في هذا المقال 11 إطار عمل شهير من أفضل أطر عمل الذكاء الاصطناعي التي يمكننا استخدامها في مشاريع تعلم الآلة، وهي:
</p>

<ol>
	<li>
		تنسرفلو TensorFlow
	</li>
	<li>
		تورش Torch
	</li>
	<li>
		ثينو Theano
	</li>
	<li>
		كافيه Caffe
	</li>
	<li>
		كيراس Keras
	</li>
	<li>
		إطار عمل مايكروسوفت CNTK
	</li>
	<li>
		ساي كيت ليرن Scikit-learn
	</li>
	<li>
		أزور Azure ML Studio
	</li>
	<li>
		أكورد دوت نت Accord.NET
	</li>
	<li>
		سبارك Spark MLlib
	</li>
	<li>
		إطار عمل أمازون لتعلم الآلة Amazon Machine Learning
	</li>
</ol>

<p>
	دعونا نوضح كل إطار من هذه الأطر وأبرز مميزاته واستخداماته بمزيد من التفصيل
</p>

<h2 id="1tensorflow">
	1. تنسرفلو TensorFlow
</h2>

<p>
	يتمتع إطار العمل تنسرفلو TensorFlow بالعديد من المميزات التي تجعله خيارًا مناسبًا للمطورين الباحثين عن أداة فعالة <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D9%87%D9%85-%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%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-r2372/" rel="">لمشاريع الذكاء الاصطناعي</a>، ولعل أبرز مميزاته أنه من تطوير شركة جوجل العالمية التي تمنحه دعمًا واسع النطاق وتوفر له تحديثات منتظمة ومستمرة لجعله يواكب آخر مستجدات التعلم الآلي.
</p>

<p>
	ولا يخفى على أحد الدعم رفيع المستوى الذي تقدمه شركة بعراقة جوجل لمنتجاتها، فضلًا عن مجتمع المطورين الضخم الذي يستخدم تنسرفلو TensorFlow حول العالم والذي من شأنه توفير عون كبير من خلال مساهماته وإجاباته عن كل التساؤلات، وإضافة لميزات الدعم القوي، يتميز إطار تنسرفلو بالمرونة فهو نظام مقسم لأجزاء أو وحدات modular system، بمعنى يمكننا استخدام كل جزء من هذه الأجزاء بمفرده أو استخدام الأجزاء معًا حسب متطلبات مشروعنا، كما أنه يتمتع بقابلية النقل Portability وهذه ميزة مهمة يفضلها معظم مستخدميه، حتى أن بإمكاننا استعماله على الهاتف الجوال في حال لم يتوفر لنا الوصول إلى حاسوب مكتبي أو محمول لتثبيته.
</p>

<p>
	ولمطالعة المزيد من المعلومات حول هذا الإطار واستخدامه عمليًا، ننصح بقراءة مقال <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A8%D9%86%D8%A7%D8%A1-%D8%B4%D8%A8%D9%83%D8%A9-%D8%B9%D8%B5%D8%A8%D9%8A%D8%A9-%D9%84%D9%84%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%A3%D8%B1%D9%82%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D9%83%D8%AA%D9%88%D8%A8%D8%A9-%D8%A8%D8%AE%D8%B7-%D8%A7%D9%84%D9%8A%D8%AF-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-tensorflow-r1267/" rel="">بناء شبكة عصبية للتعرف على الأرقام المكتوبة بخط اليد باستخدام مكتبة TensorFlow</a>.
</p>

<h2 id="2torch">
	2. تورش Torch
</h2>

<p>
	أطلق إطار عمل تورش Torch لأول مرة في العام 2002، وهو أقرب إلى المكتبة منه إلى إطار العمل التقليدي، حيث يتكون من مجموعة خوارزميات تستخدم في مجال تعلُّم الآلة، ومن أبرز المميزات التي يوفرها Torch لمستخدميه نذكر:
</p>

<ul>
	<li>
		المصفوفات متعددة الأبعاد N-dimensional arrays
	</li>
	<li>
		واجهة خاصة <a href="https://academy.hsoub.com/programming/c/" rel="">للغة البرمجة C</a>
	</li>
	<li>
		عمليات الجبر الخطي الروتينية
	</li>
	<li>
		دعم سريع وفعال لوحدة معالجة الرسومياتGPU
	</li>
	<li>
		السرعة والمرونة في تطوير المشاريع
	</li>
</ul>

<p>
	إلى جانب مجتمع المطورين الكبير الذي يستخدمه والذي من شأنه توفير الدعم المطلوب عند الحاجة، ويُحسَب لمجتمع Torch نشاطه الواسع على <a href="https://academy.hsoub.com/programming/workflow/git/%D9%83%D9%8A%D9%81-%D8%AA%D8%B3%D8%A7%D9%87%D9%85-%D9%81%D9%8A-%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-%D8%B9%D9%84%D9%89-github-r265/" rel="">GitHub</a> والسعي الدائم لتطوير هذه المكتبة.
</p>

<p>
	<strong>ملاحظة</strong>: تورش هي مكتبة تعلم آلي مفتوحة المصدر تُستخدم لإنشاء الشبكات العصبية العميقة وهي مكتوبة بلغة البرمجة Lua، أما بايتورش PyTorch فهو إطار عمل مفتوح المصدر لتعلم الآلة يعتمد على لغة البرمجة بايثون ومكتبة تورش Torch وننصح بقراءة مقال <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A5%D8%B7%D8%A7%D8%B1-%D8%B9%D9%85%D9%84-%D8%A8%D8%A7%D9%8A-%D8%AA%D9%88%D8%B1%D8%B4-pytorch-%D9%88%D8%A3%D9%87%D9%85%D9%8A%D8%AA%D9%87-%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%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-r2311/" rel="">تعرف على إطار عمل باي تورش PyTorch وأهميته لتطبيقات الذكاء الاصطناعي</a> للتعرف أكثر على هذا الإطار.
</p>

<h2 id="3theano">
	3. ثينو Theano
</h2>

<p>
	تحظى الأداة ثينو Theano بشعبية كبيرة بين أُطر عمل الذكاء الاصطناعي، رغم أنه ليس حديثًا، لكنه يستند إلى <a href="https://academy.hsoub.com/programming/python/" rel="">لغة بايثون</a> واسعة الانتشار وسهلة التعلُّم والمناسبة تمامًا لمشاريع تعلم الآلة والذكاء الاصطناعي وهذا يعطي ثينو قيمة مضافة.
</p>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة تطوير التطبيقات باستخدام لغة Python
		</p>

		<p class="banner-subtitle">
			احترف تطوير التطبيقات مع أكاديمية حسوب والتحق بسوق العمل فور انتهائك من الدورة
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/python-application-development" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<a href="https://academy.hsoub.com/learn/python-application-development" rel=""><img alt="دورة تطوير التطبيقات باستخدام لغة Python" src="https://academy.hsoub.com/learn/assets/images/courses/python-application-development.png"></a>
	</div>
</div>

<p>
	يمكن أن نقول أن أداة Theano بمثابة معيار في مجال تعلُّم الآلة والذكاء الاصطناعي فهي قديمة نسبيًا وقد اعتمدت عليها الكثير من الأدوات الأخرى سواء على صعيد البنية أو الوظيفة، وأكثر ما يميزها الاختبار الشامل الذي تنفذه على الشيفرات البرمجية قبل إطلاقها وهي في الواقع رائدة في هذا المجال.
</p>

<p>
	كما أنها تسهل التعامل مع التعبيرات الرياضية، وتدعم العمل مع التمايز الرمزي symbolic differentiation ووحدة معالجة الرسوميات GPU التي تسرّع إنجاز العمليات الحسابية بشكل كبير.
</p>

<h2 id="4caffe">
	4. كافيه Caffe
</h2>

<p>
	صدر إطار العمل كافيه Caffe في العام 2017 وهو أحد أطر العمل الحديثة، ومكتوب <a href="https://academy.hsoub.com/programming/cpp/" rel="">بلغة ++C</a> وهذا يجعله خيارًا مناسبًا للكثير من المبرمجين و<a href="https://academy.hsoub.com/programming/general/%D9%85%D9%87%D9%86%D8%AF%D8%B3-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA-%D9%85%D9%86-%D9%87%D9%88-%D9%88%D9%85%D8%A7-%D9%87%D9%8A-%D9%85%D9%87%D8%A7%D9%85%D9%87-r2264/" rel="">مهندسي البرمجيات</a> الذين غالبًا ما يجيدون هذه اللغة والتي ما زالت تستخدم على نطاق واسع.
</p>

<p>
	ويُعَدّ Caffe أفضل أطر العمل المستخدمة في بناء الشبكات الالتفافية Convolutional networks وهي نوعٌ خاص من <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A8%D9%86%D8%A7%D8%A1-%D8%B4%D8%A8%D9%83%D8%A9-%D8%B9%D8%B5%D8%A8%D9%8A%D8%A9-%D9%84%D8%AA%D8%B1%D8%AC%D9%85%D8%A9-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A5%D8%B4%D8%A7%D8%B1%D8%A9-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A5%D9%86%D8%AC%D9%84%D9%8A%D8%B2%D9%8A%D8%A9-r2259/" rel="">الشبكات العصبية</a> لذا من الجيد اعتماده من البداية إذا كنا ننوي بناء هذا النوع من الشبكات في مشروعنا.
</p>

<p>
	ومن مميزاته أيضًا العمل بسلاسة مع وحدة مالجة الرسوميات GPU المناسبة، فقد لا يستغرق Caffe أكثر من يوم واحد لمعالجة عشر ملايين صورة، فإذا كانت السرعة من أولوياتنا فسيكون هذا الإطار خيارًا مثاليًا لنا.
</p>

<h2 id="5keras">
	5. كيراس Keras
</h2>

<p>
	إطار العمل كيراس Keras بسيط وسهل التعلُّم، كما يتمتع Keras بصغر حجمه lightweight وهذا يجعله سريع الأداء لقلة الموارد الحاسوبية التي يحتاجها لإنجاز مهمة معينة مقارنة بغيره من أطر العمل، ويوفر كيراس بالإضافة إلى ما سبق واجهة للعمل مع <a href="https://academy.hsoub.com/programming/python/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-python-r2325/" rel="">بايثون</a>، وقد تحدثنا عن أهمية هذه اللغة لمستخدمي الذكاء الاصطناعي، ويُعدّ خيارًا ممتازًا في بناء الشبكات العصبية التكرارية recurrent networks، والشبكات العصبية الالتفافية convolutional networks، على عكس Caffe الذي يتخصص فقط بالشبكات العصبية الالتفافية.
</p>

<p>
	 
</p>

<p>
	وهذه قائمة بالمهام التي يتعامل معها كيراس بطريقة جيدة لتعرف في أي نوع من المشاريع يمكنك استخدامه:
</p>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-r1009/#%D8%A7%D9%84%D8%AA%D8%B5%D9%86%D9%8A%D9%81" rel="">التصنيف Classification</a>
	</li>
	<li>
		توليد النص Generating text
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D9%84%D8%AE%D9%8A%D8%B5-%D8%A7%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%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-r2315/" rel="">تلخيص النص</a> Summarizing a text
	</li>
	<li>
		الترجمة Translations
	</li>
	<li>
		التعرف على الكلام Speech recognition
	</li>
	<li>
		ويمكن اعتماده للعديد من المهام المعقدة الأخرى
	</li>
</ul>

<h2 id="6microsoftcntk">
	6. Microsoft CNTK
</h2>

<p>
	يُعَدّ CNTK من مايكروسوفت منافسًا قويًّا <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%85%D9%83%D8%AA%D8%A8%D8%A7%D8%AA-%D9%88%D8%A3%D8%B7%D8%B1-%D8%B9%D9%85%D9%84-%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/" rel="">لأُطر عمل الذكاء الاصطناعي</a> شائعة الاستخدام مثل TensorFlow وغيره، فهو يتعامل مع مختلف عمليات التعلُّم الآلي مثل: بناء الشبكات العصبية الالتفافية والتكرارية والشبكات ذات الذّاكرة الطويلة قصيرة المدى LSTMs.
</p>

<p>
	وقد جَهِدَت مايكروسوفت منذ إطلاقه لجعل CNTK مرنًا، وفعَّالًا، وعالي الأداء، وقد نجحت مايكروسوفت في مسعاها، فقد حصل CNTK على نتائج جيدة في معظم اختبارات الأداء المعيارية benchmark tests التي خضع لها، فهو يقدم أداءً جيدًا في كل عملية ينفذها ضمن وقت محدد، كما أنه يتعامل بمرونة وفعالية مع جميع أنواع المهام التي تُعطى له، مثل: التعرّف على الكلام، والتعرّف على الصور ومعالجتها، وتوليد النصوص، وتدريب أنظمة الإنتاج. كما أنه يعمل بكفاءة مع نظامي <a href="https://academy.hsoub.com/apps/operating-systems/windows/" rel="">ويندوز</a> و <a href="https://academy.hsoub.com/devops/linux/" rel="">لينكس</a> على حد سواء.
</p>

<h2 id="7scikitlearn">
	7. ساي كيت ليرن Scikit-learn
</h2>

<p>
	أكثر ما يميز Scikit-learn أنه منصة <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D8%A7%D9%84%D9%85%D9%82%D8%B5%D9%88%D8%AF-%D8%A8%D9%85%D8%B5%D8%B7%D9%84%D8%AD-%D9%85%D9%81%D8%AA%D9%88%D8%AD-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-open-source%D8%9F-r885/" rel="">مفتوحة المصدر</a> تتمتع بمجتمع نشط للغاية يساندنا في أي مشكلة قد تواجهنا، فالإجابات متوفرة بكثرة في منتديات المنصة، وإن لم نجد نبحث عنه بين المواضيع المنشورة كل ما علينا هو طرح سؤال جديد وترقب الإجابات فالمجتمع متفاعل وسيجيبنا بسرعة، ويمكننا دائمًا الاستعانة بالتوثيقات التي توفرها Scikit-learn.
</p>

<p>
	وفضلًا عن الدعم المميز لهذا الإطار فهو سريع الأداء، ويؤمن لمستخدميه <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-api-r1314/" rel="">واجهة برمجة تطبيقات <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr></a> واضحة ومنظمة وجاهزة للعمل مع مختلف الاحتياجات. ولمطالعة المزيد حول استخدام ساي كيت ليرن عمليًا ننصح بمقال <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A8%D9%86%D8%A7%D8%A1-%D9%85%D8%B5%D9%86%D9%81-%D8%A8%D8%A7%D9%84%D8%A7%D8%B9%D8%AA%D9%85%D8%A7%D8%AF-%D8%B9%D9%84%D9%89-%D8%B7%D8%B1%D9%82-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-%D8%A8%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-scikit-learn-r1266/" rel="">بناء مصنف بالاعتماد على طرق تعلم الآلة بلغة البايثون باستخدام مكتبة Scikit-Learn</a>.
</p>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة الذكاء الاصطناعي
		</p>

		<p class="banner-subtitle">
			احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة.
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/artificial-intelligence" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<a href="https://academy.hsoub.com/learn/artificial-intelligence" rel=""><img alt="دورة الذكاء الاصطناعي" src="https://academy.hsoub.com/learn/assets/images/courses/artificial-intelligence.png"></a>
	</div>
</div>

<h2 id="8azuremlstudio">
	8. Azure ML Studio
</h2>

<p>
	تختلف Azure ML Studio عن غيرها من أطر عمل الذكاء الاصطناعي بكونها تمتلك نسختين، نسخة مدفوعة وأخرى مجانية، بالإضافة لكونها أداةً تفاعلية وسحابية، وهذا ما سنشرحه تاليًّا.
</p>

<p>
	تُنشئ Azure ML Studio التحليلات التنبؤية لنماذج تعلُّم الآلة بطريقة تفاعلية، فتتنبأ بالنتائج وفقًا للبيانات التي تقدمها لها، كما تتيح لنا بناء نماذجنا الخاصة بسهولة بواسطة السحب والإفلات ثم التنبؤ بالنتيجة استنادًا إلى المدخلات، وزيادة في دقة النتائج توفر Azure مكتبة مضمّنة built-in library تحتوي مجموعة واسعة من خوارزميات الذكاء الاصطناعي الكفيلة بتحسين تنبؤاتنا. وأكثر ما يميزها  أنها سحابية، فلن نحتاج لتثبيت أي تطبيق على جهازنا، إذ كل ما يتطلبه الأمر حاسوب شخصي أو محمول متصل بالإنترنت.
</p>

<h2 id="9accordnet">
	9. أكورد دوت نت Accord.NET
</h2>

<p>
	يُستخدم إطار العمل Accord.NET في معالجة الصور وتعلم الآلة، وهو مكتوب بلغة <a href="https://academy.hsoub.com/programming/c-sharp/" rel="">#C</a> المستخدمة بكثرة في بناء البرامج والتطبيقات، ويتضمن مكتبات متنوعة للحوسبة العلمية بما فيها <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D9%83%D8%AA%D8%A8%D8%A9-%D8%A7%D9%84%D9%85%D8%AD%D9%88%D9%91%D9%84%D8%A7%D8%AA-transformers-%D9%85%D9%86-%D9%85%D9%86%D8%B5%D8%A9-hugging-face-r2340/" rel="">مكتبات تعلُّم الآلة</a>، وهذه أبرز المميزات التي يوفرها:
</p>

<ul>
	<li>
		دعم آلات المتجهات Support for vector machines
	</li>
	<li>
		خوارزمية التجميع باستخدام نموذج غاوس المختلط Gaussian Mixture Models
	</li>
	<li>
		خوارزمية k-Means
	</li>
	<li>
		أشجار القرار Decision Trees
	</li>
	<li>
		النماذج البايزية البسيطة Naive Bayesian models
	</li>
</ul>

<p>
	لمعرفة المزيد عن هذه الخوارزميات وغيرها ننصح بقراءة مقال <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%86%D9%85%D8%A7%D8%B0%D8%AC-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9-r1938/" rel="">أدوات برمجة نماذج تعلم الآلة</a>.
</p>

<p>
	<strong>ملاحظة</strong>: ذكرنا أن Accord.NET مميز في التعامل مع الصور، وبالتالي فهو مناسب للعمل مع كائنات <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%B4%D8%A8%D9%83%D8%A9-%D8%B9%D8%B5%D8%A8%D9%8A%D8%A9-%D8%B5%D9%86%D8%B9%D9%8A%D8%A9-%D9%88%D8%AA%D8%AF%D8%B1%D9%8A%D8%A8%D9%87%D8%A7-%D9%84%D9%84%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D9%88%D8%AC%D9%88%D9%87-r1198/" rel="">اكتشاف الوجوه</a> ومعالجتها إذ يحوّلها إلى تدفقات من الصور، وبالمثل أيضًا للمهام المتعلقة بالصوتيات audio فهو قادر على معالجة الإشارات الصوتية وتحويلها وفلترتها لتناسب برامج التعلم الآلي والتطبيقات الإحصائية.
</p>

<h2 id="10sparkmllib">
	10. سبارك Spark MLlib
</h2>

<p>
	يعمل إطار العمل Spark MLlib كمكتبة لتعلّم الآلة على غرار معظم الأدوات التي عرضناها سابقًا، وهو يتضمن عدة خوارزميات ملائمة للمهام التالية:
</p>

<ul>
	<li>
		التصنيف classification لتحديد الصنف الذي ينتمي إليه عنصر ما بناءً على خصائصه
	</li>
	<li>
		التجميع clustering لتقسيم مجموعة من البيانات إلى مجموعات أو عناقيد بحيث تكون العناصر في كل مجموعة متشابهة فيما بينها وتختلف عن العناصر في المجموعات الأخرى
	</li>
	<li>
		الانحدار regression لفهم وتوقع العلاقات بين المتغيرات
	</li>
	<li>
		التصفية التعاونية collaborative filtering لتوقع تفضيلات المستخدم بناءً على معلومات جُمعت من عدة مستخدمين سابقين وغيرها.
	</li>
</ul>

<p>
	ومن أبرز مميزات Spark MLlib بساطته وتوافقه مع الأدوات والأطر الأخرى، إذ يتيح لنا هذا التوافق الاهتمام بجوانب معينة من مشروعنا وتنفيذها بالتطبيق المناسب لها طالما أن يتوافق مع إطار العمل، وهو ما يضمن تطويرًا أسرع وأكثر كفاءة.
</p>

<p>
	ويتمتع Spark MLlib بمحرك فعّال يتفوق على لغتي البرمجة بايثون و <a href="https://academy.hsoub.com/programming/r-language/" rel="">R</a> اللتين لطالما استخدمهما <a href="https://academy.hsoub.com/programming/general/%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA/" rel="">علماء البيانات</a> في التعامل مع مهام التعلم الآلي، إذ يعالج Spark MLlib المشكلات التي لا تستطيع بايثون و R معالجتها بطريقة تفاعلية وعلى نطاق أوسع.
</p>

<p>
	<strong>ملاحظة</strong>: يمكننا اختيار لغة البرمجة التي نريدها للعمل مع Spark MLlib من بين اللغات التالية: <a href="https://academy.hsoub.com/python/" rel="">بايثون</a>، و R، و Scala، و<a href="https://academy.hsoub.com/programming/javascript/%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7-%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-%D9%85%D9%86-%D8%A7%D9%84%D8%B5%D9%81%D8%B1-%D8%AD%D8%AA%D9%89-%D8%A7%D9%84%D8%A7%D8%AD%D8%AA%D8%B1%D8%A7%D9%81-r2046/" rel="">جافا</a>.
</p>

<h2 id="11amazonmachinelearning">
	11. Amazon Machine Learning
</h2>

<p>
	يمكننا إضافة ميزات الذكاء الاصطناعي إلى مختلف أنواع التطبيقات بالاستعانة بأداة تعلّم الآلة من منصة أمازون AWS، ومن هذه الميزات تحليل الكلام، وروبوتات الدردشة chatbot، والرؤية الحاسوبية computer vision.
</p>

<p>
	ما يميز AWS إمكانية استخدامها مع أطر عمل الذكاء الاصطناعي الأخرى مثل TensorFlow و Caffe، وهو ما يمنحنا بيئة متقنة وفعّالة لتطبيقات تعلّم الآلة وإمكانية الاستفادة فيها من وظائف TensorFlow و Caffe جنبًا إلى جنب مع وظائف AWS.
</p>

<p>
	توفر AWS أداة مُضَمّنة تدعى Amazon Sagemaker تساعدنا على بناء نماذجنا الخاصة للتعلُّم الآلي ونشرها بسهولة وكفاءة، وتفيدنا بشكل كبير إذا كنا نخطط لاستخدام Amazon Machine Learning كإطار عمل في مشروعنا.
</p>

<h2 id="-2">
	الخلاصة
</h2>

<p>
	بهذا نكون قد وصلنا لنهاية مقالنا الذي اكتشفنا فيه أهم أُطر عمل الذكاء الاصطناعي المتخصصة في تعلُّم الآلة، حيث قد عرضنا بعجالة سريعة أحد عشر إطار عمل من أفضل الأُطر المتوفرة حاليًا، ولكل منها مزاياه الخاصة والجوانب التي يتفوق فيها على غيره سواء من ناحية الأداء أو التحديثات أو التوافق مع لغات البرمجة أو التخصص في نوع معين من المعالجة مثل معالجة الصور أو غيرها. يمكننا الآن الانطلاق من هنا واختيار المنتج الذي يناسبنا والبحث عنه أكثر ثم البدء بتعلمه،
</p>

<p>
	ترجمة -وبتصرف- لمقال <a href="https://www.binpress.com/best-ai-framework-machine-learning/" rel="external nofollow">11 Best AI Framework for Machine Learning</a> لصاحبه Mark Bynum.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D9%87%D9%85-%D9%83%D8%AA%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-%D8%A7%D9%84%D9%85%D8%AC%D8%A7%D9%86%D9%8A%D8%A9-r2330/" rel="">تعرف على أهم كتب الذكاء الاصطناعي المجانية</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%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/" rel="">برمجة الذكاء الاصطناعي: بناء مستقبل الآلات الذكية</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%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-%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86-r2239/" rel="">أساسيات الذكاء الاصطناعي: دليل المبتدئين</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%85%D9%83%D8%AA%D8%A8%D8%A7%D8%AA-%D9%88%D8%A3%D8%B7%D8%B1-%D8%B9%D9%85%D9%84-%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/" rel="">مكتبات وأطر عمل الذكاء الاصطناعي: القوة الكامنة خلف الأنظمة الذكية</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2475</guid><pubDate>Fri, 20 Dec 2024 15:08:03 +0000</pubDate></item><item><title>&#x62A;&#x639;&#x632;&#x64A;&#x632; &#x625;&#x646;&#x62A;&#x627;&#x62C;&#x64A;&#x629; &#x627;&#x644;&#x645;&#x637;&#x648;&#x631;&#x64A;&#x646; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x627;&#x644;&#x630;&#x643;&#x627;&#x621; &#x627;&#x644;&#x627;&#x635;&#x637;&#x646;&#x627;&#x639;&#x64A; &#x627;&#x644;&#x62A;&#x648;&#x644;&#x64A;&#x62F;&#x64A;</title><link>https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B2%D9%8A%D8%B2-%D8%A5%D9%86%D8%AA%D8%A7%D8%AC%D9%8A%D8%A9-%D8%A7%D9%84%D9%85%D8%B7%D9%88%D8%B1%D9%8A%D9%86-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%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-%D8%A7%D9%84%D8%AA%D9%88%D9%84%D9%8A%D8%AF%D9%8A-r2473/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_12/-.png.cdc7a37684b71ecd4c7f2d2853f78f8b.png" /></p>
<p>
	نوضح في هذا المقال مجموعة من النصائح المفيدة للمطورين للاستفادة المثلى من الذكاء الاصطناعي التوليدي الذي أعاد تشكيل الطريقة التي يكتب بها المطورون ومهندسو البرمجيات شيفراتهم البرمجية، واستطاعت هذه التقنية الحديثة التي غزت العالم من بضع سنوات فقط أن تنال شعبية كبيرة وتستخدم في العديد من المجالات.
</p>

<h2 id="-1">
	الذكاء الاصطناعي التوليدي ومستقبل البرمجيات
</h2>

<p>
	كشف <a href="https://cloud.google.com/blog/products/devops-sre/announcing-the-2023-state-of-devops-report" rel="external nofollow">تقرير State of DevOps لعام 2023</a> أن 60% من المساهمين في الاستبيان استخدموا الذكاء الاصطناعي في تحليل البيانات وتوليد الأكواد البرمجية وتحسينها، بالإضافة لتعليم أنفسهم مهارات وتقنيات جديدة، ويكتشف المطورون طرقًا جديدة باستمرار لاستخدام هذه الأدوات التي تتطور بشكل متسارع.
</p>

<p>
	كما زعمت شركة Cognition Labs المتخصصة في تطوير تقنيات الذكاء الاصطناعي في ربيع عام 2024 أن منتجها يمكنه أن يستبدل المطورين ومهندسي البرمجيات في حل المشكلات البرمجية المطروحة على جت هاب Github issues بنسبة 13.86% وقد لا يبدو هذا الرقم مبهرًا للوهلة الأولى لكنه سيكون كذلك عندما تعرف أن أفضل أداء مسجل لهذه المهمة في عام 2023 لم يتجاوز نسبة حله 1.96%، ينبغي ملاحظة أن إمكانيات ديفين Devin AI تم تضخيمها لتبدو أكثر من الواقع فتحقيق النسبة المزعومة يتطلب إشراف بشري، كما ولم يستطيع تنفيذ المهام على مواقع العمل الحر، لذا حتى الآن لا يمكننا أن نعتبر ديفين Devin AI ذكاء اصطناعي يضاهي البشر في البرمجة، ولكن مع تطور الذكاء الاصطناعي يمكن أن نرى الأدوات المماثلة تتحسن.
</p>

<p>
	كما زعمت شركة Cognition Labs في ربيع 2024، منتجها <a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D9%87%D9%85-%D8%A8%D8%B1%D8%A7%D9%85%D8%AC-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r2303/#:~:text=%D9%83%D9%88%D8%A8%D8%A7%D9%8A%D9%84%D9%88%D9%86%20%D9%88%D8%A3%D9%85%D8%A7%D8%B2%D9%88%D9%86%20%D9%88%D9%8A%D8%B3%D8%A8%D9%8A%D8%B1%D8%B1.-,%D8%AF%D9%8A%D9%81%D9%86%20Devin,-%D9%8A%D8%B9%D8%AF%20%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC%20Devin" rel="">ديفين Devin AI </a>يمكنه أن يستبدل المطورين ومهندسي البرمجيات في حل المشكلات البرمجية المطروحة على جت هاب Github issues بنسبة 13.86% وقد لا يبدو هذا الرقم مبهرًا للوهلة الأولى لكنه سيكون كذلك عندما تعرف أن أفضل أداء مسجل لهذه المهمة في عام 2023 لم يتجاوز نسبة 1.96%، وتجدر الإشارة هنا لأن إمكانيات ديفين Devin AI لم تكن في الواقع كما زعمت الشركة فتحقيق هذه النسبة كان يتطلب إشرافًا بشريَّا، كما ولم يستطيع ديفن تنفيذ المهام على مواقع العمل الحر، لذا لا يمكننا حتى اللحظة اعتبار ديفين Devin AI ذكاء اصطناعي يضاهي البشر في البرمجة، ولكن مع تطور الذكاء الاصطناعي السريع يمكن أن يتحقق ذلك.
</p>

<p>
	هذا يدفعنا للتساؤل كيف يتأقلم مهندسو البرمجيات مع تقنيات وبرامج الذكاء الاصطناعي التي يمكنها كتابة برمجيات أخرى؟ ما الذي ستؤول له مسؤوليات <a href="https://academy.hsoub.com/programming/general/%D9%85%D9%87%D9%86%D8%AF%D8%B3-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA-%D9%85%D9%86-%D9%87%D9%88-%D9%88%D9%85%D8%A7-%D9%87%D9%8A-%D9%85%D9%87%D8%A7%D9%85%D9%87-r2264/" rel="">مهندسي البرمجيات</a> مع مرور الوقت في عالم تستحوذ فيه هذه التقنية بشكل تدريجي على كتابة الأكواد؟ هل سنستغني عن العنصر البشرية أم ستكون هناك حاجة دائمة لمهندس برمجيات متخصص يوجه السفينة؟
</p>

<p>
	نناقش في الفقرات التالية كل هذه التساؤلات ونوضح آراء خبراء في المجالات التقنية المتنوعة مثل تطوير الويب وتطوير الواجهات الخلفية backend وتعلم الآلة والطريقة التي يستخدمون بها الذكاء الاصطناعي التوليدي لصقل مهاراتهم وتعزيز إنتاجيتهم في أعمالهم اليومية. ونسلط الضوء على النقاط التي يبرع بها الذكاء الاصطناعي التوليدي ونقاط الضعف التي يعاني منها، وكيف يمكن للمطورين الآخرين تحقيق الاستفادة القصوى من الذكاء الاصطناعي التوليدي في تعزيز إنتاجيتهم خلال عملية تطوير البرمجيات، وما هو مستقبل صناعة البرمجيات في ظل صعود تقنيات الذكاء الاصطناعي التوليدي.
</p>

<h2 id="-2">
	كيف يستخدم المطورون الذكاء الاصطناعي التوليدي
</h2>

<p>
	من أشهر برامج الذكاء الاصطناعي التي يعتمد عليها المطورون في تطوير البرمجيات نذكر <a href="https://academy.hsoub.com/apps/web/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A8%D9%88%D8%AA-%D8%A7%D9%84%D9%85%D8%AD%D8%A7%D8%AF%D8%AB%D8%A9-%D8%A7%D9%84%D8%B0%D9%83%D9%8A-%D8%B4%D8%A7%D8%AA-%D8%AC%D9%8A-%D8%A8%D9%8A-%D8%AA%D9%8A-chatgpt-r863/" rel="">شات جي بي تي ChatGPT</a> و <a href="https://github.com/features/copilot" rel="external nofollow">جت هاب كوبايلوت Github Copilot</a>، حيث يوفر شات جي بي تي ChatGPT للمستخدمين واجهة نصية تفاعلية يمكن للمستخدم من خلالها توجيه <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D8%B3%D8%AA%D9%83%D8%B4%D9%81-%D9%85%D8%B5%D8%B7%D9%84%D8%AD%D8%A7%D8%AA-%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-%D8%A7%D9%84%D8%AA%D9%88%D9%84%D9%8A%D8%AF%D9%8A-r2399/#:~:text=%D8%A7%D9%84%D9%86%D9%85%D8%A7%D8%B0%D8%AC%20%D8%A7%D9%84%D9%84%D8%BA%D9%88%D9%8A%D8%A9%20%D8%A7%D9%84%D8%B6%D8%AE%D9%85%D8%A9%20(Large%20Language%20Models%20(LLMs)" rel="">النماذج اللغوية الضخمة Large Language Model</a> باستخدام <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A3%D9%81%D8%B6%D9%84-%D9%85%D9%85%D8%A7%D8%B1%D8%B3%D8%A7%D8%AA-%D9%87%D9%86%D8%AF%D8%B3%D8%A9-%D8%A7%D9%84%D9%85%D9%8F%D9%88%D8%AC%D9%91%D9%90%D9%87%D8%A7%D8%AA/" rel="">الموجهات</a> المناسبة فهذه النماذج لديها معرفة شاملة عن مواضيع متنوعة من بينها الأكواد البرمجية بمختلف لغات البرمجة وأطر عملها ومكتباتها، وتنبع هذه المعرفة من التدريب الذي خضعت له هذه النماذج فقد جرى تدريبها على كم هائل من البيانات مفتوحة المصدر المتوفرة على الإنترنت، ويدمج كوبايلوت Copilot <a href="https://academy.hsoub.com/programming/workflow/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A8%D9%8A%D8%A6%D8%A9-%D8%A7%D9%84%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D9%85%D8%AA%D9%83%D8%A7%D9%85%D9%84%D8%A9-ide-r1513/" rel="">مباشرة في بيئة التطوير المتكاملة IDE</a> ليوفر للمطور قدرات متقدمة في إكمال الأكواد البرمجية واقتراح الأسطر القادمة لكتابتها، فقد تدرّب على كل <a href="https://academy.hsoub.com/programming/workflow/git/%D8%A7%D9%84%D8%A5%D8%B4%D8%B1%D8%A7%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-%D8%B9%D8%A8%D8%B1-%D8%BA%D9%8A%D8%AA-%D9%87%D8%A8-github-r1585/" rel="">الأكواد مفتوحة المصدر المتوفرة على Github</a>، وجمع هاتين الأداتين معًا من شأنه مساعدة المطور في حل أي مشكلة تقنية يمكن أن تواجهه.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="164706" href="https://academy.hsoub.com/uploads/monthly_2024_12/1.png.d31caf8c2c61e9b49059c775c5ebd79b.png" rel=""><img alt="أدوات الذكاء الاصطناعي التوليدي المشهورة" class="ipsImage ipsImage_thumbnailed" data-fileid="164706" data-ratio="83.68" data-unique="b3mwbe4ti" style="width: 500px; height: auto;" width="717" src="https://academy.hsoub.com/uploads/monthly_2024_12/1.thumb.png.c93ad362b08e61ad5ad93712986f03d5.png"></a>
</p>

<h3 id="-3">
	الذكاء الاصطناعي في دور الخبير والمتدرب
</h3>

<p>
	يعتمد المطورون بشكل متزايد على أدوات الذكاء الاصطناعي التوليدي لتحسين سير العمل وتبسيط العمليات البرمجية، حيث تُظهر هذه الأدوات مرونة وفعالية في تأدية دورين أساسيين الأول دور الخبير الذي يقدم الإرشاد والدعم الفني، والثاني دور المتدرب الذي ينجز المهام التكرارية والبسيطة.
</p>

<p>
	وفيما يلي دراسة حالة لمطورين خبراء بتخصصات مختلفة يوضح كل منهم كيف اعتمد على الذكاء الاصطناعي التوليدي لمساعدته في تأدية مهامه.
</p>

<h3>
	الحالة الأولى مطور ويب كامل
</h3>

<p>
	عند سؤال مطور ويب كامل full-stack web developer  ومهندس ذكاء اصطناعي بخبرة تتجاوز 20 عامًا عن استخدام الذكاء الاصطناعي صرّح بما يلي: "أنا استخدم كوبايلوت copilot يوميًا، فهو يتنبأ بسطر الكود الذي أنوي كتابته أغلب المرات بدقة كبيرة. ويمكن للذكاء الاصطناعي أن يؤدي وظفتين، الأولى زميل خبير يساعد في <a href="https://academy.hsoub.com/design/user-experience/%D8%A7%D9%84%D9%85%D8%B1%D8%AD%D9%84%D8%A9-%D8%A7%D9%84%D8%AB%D8%A7%D9%84%D8%AB%D8%A9-%D9%81%D9%8A-%D8%B9%D9%85%D9%84%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%81%D9%83%D9%8A%D8%B1-%D8%A7%D9%84%D8%AA%D8%B5%D9%85%D9%8A%D9%85%D9%8A-%D9%85%D8%B1%D8%AD%D9%84%D8%A9-%D8%A7%D9%84%D8%AA%D9%81%D9%83%D9%8A%D8%B1-r697/#:~:text=%D9%82%D9%88%D8%A7%D8%B9%D8%AF%20%D8%A7%D9%84%D8%B9%D8%B5%D9%81%20%D8%A7%D9%84%D8%B0%D9%87%D9%86%D9%8A.-,%D9%82%D9%88%D8%A7%D8%B9%D8%AF%20%D8%A7%D9%84%D8%B9%D8%B5%D9%81%20%D8%A7%D9%84%D8%B0%D9%87%D9%86%D9%8A,-%D8%AA%D8%AA%D8%B6%D9%85%D9%86%20%D8%AC%D9%84%D8%B3%D8%A9%20%D8%A7%D9%84%D8%B9%D8%B5%D9%81" rel="">العصف الذهني </a> بمستوى يكافئ خبراتك وتفكيرك، والثانية كمطور مبتدئ يتولى المهام البسيطة والمتكررة في كتابة الكود".
</p>

<p>
	وقد وضح أنه استفاد من الواجهة البرمجية OpenAI <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> لما هو أبعد من مجرد التنبؤ بسطر الكود، حيث طوّر إضافة مفتوحة المصدر لتطبيق أوبسيدين <a href="https://obsidian.md/" rel="external nofollow">Obsidian</a> وهو تطبيق مشابه <a href="https://www.notion.so/" rel="external nofollow">لنوشن Notion</a> مع ميزات مختلفة، إذ تستعمل هذه الإضافة الواجهة البرمجية التي تشغل كلًا من شات جي بي تي ChatGPT و كوبايلوت Copilot، وتسمح للمستخدمين بإنشاء شخصيات مخصصة بالذكاء الاصطناعي والتفاعل معها.
</p>

<p>
	ويرى المطور أن مهام الذكاء الاصطناعي التوليدي الأكثر أهمية هي تلك التي تطلب وقتًا أطول لإكمالها يدويًا، ويمكن بسهولة التأكد من صحتها ودقتها في وقت قصير مثل تحويل الملف من تنسيق إلى آخر، كما يبرع جي بي تي GPT في توليد نصوص تلخص وظائف الأكواد البرمجية، مع ذلك مازلنا بحاجة لمطور خبير يمكنه فهم التفاصيل التقنية لهذا التلخيص.
</p>

<h3>
	الحالة الثانية مطور تطبيقات iOS
</h3>

<p>
	عند سؤال مطور تطبيقات جوال خبير عن استخدام الذكاء الاصطناعي في عمله أفاد بأنه لاحظ تحسنًا ملحوظًّا في سير عمله اليومي منذ أن دمج الذكاء الاصطناعي التوليدي به، فهو يستخدم شات جي بي تي ChatGPT و<a href="https://codeium.com/" rel="external nofollow">كوديوم Codeium</a> وهو تطبيق ينافس Copilot لحل المشكلات البرمجية وصرح بما يلي: "يساعدني الذكاء الاصطناعي التوليدي في حل 80% من المشكلات البرمجية بسرعة وفي تفادي هذه المعرقلات في غضون ثواني، دون الحاجة لوقت طويل من الذهاب للبحث والعودة للتجربة من أجل إيجاد حل المشكلات المعقدة".
</p>

<p>
	فهو يرى أن هذه أدوات الذكاء الاصطناعي تلعب دور الخبير الموضوعي والمتدرب الذي لا يكل ولا يمل من تنفيذ المهام البسيطة والمتكررة، وتساعده في تفادي المهام المرهقة واليدوية عند كتابة الكود مثل الأنماط المتكررة في الكود أو إجراء تحسين هيكلية الكود البرمجي و<a href="https://wiki.hsoub.com/Refactoring" rel="external">إعادة تصميمه Refactoring</a> أو هيكلة طلبات <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-api-r1314/" rel="">الواجهات البرمجية <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr></a> بشكل صحيح، فقبل ظهور هذه الأدوات، كانت المشكلات غير المألوفة تشكل عائقًا كبيرًا أمام التقدم في المهام. ويظهر هذا التحدي بشكل خاص عند العمل على مشاريع تتطلب التعامل مع واجهات برمجية APIs أو <a href="https://academy.hsoub.com/programming/general/%D8%A5%D8%B7%D8%A7%D8%B1-%D8%B9%D9%85%D9%84-framework/" rel="">أطر عمل</a> غير مألوفة تحتاج لبذل جهد ذهني إضافي لفهم كيفية حل مشكلاتها.
</p>

<h3>
	الحالة الثالثة مهندس تعلم آلة
</h3>

<p>
	أشار مهندس تعلم آلة خبير لأهمية التأكد من صحة الأكواد المهمّة وخلوّها من الأخطاء قبل تشغيلها فهذه خطوة أساسية وضرورية جدًّا، ولن يكون من الحكمة مطلقًا نسخ الكود الذي يولده الذكاء الاصطناعي، ولصقه مباشرةً وافتراض أنه يعمل بشكل صحيح، فحتى لو تغاضينا مشكلة <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D8%B3%D8%AA%D9%83%D8%B4%D9%81-%D9%85%D8%B5%D8%B7%D9%84%D8%AD%D8%A7%D8%AA-%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-%D8%A7%D9%84%D8%AA%D9%88%D9%84%D9%8A%D8%AF%D9%8A-r2399/#:~:text=%D8%A7%D9%84%D9%87%D9%84%D9%88%D8%B3%D8%A9%20Hallucination" rel="">الهلوسة</a> التي قد يعاني منها الذكاء الاصطناعي سيكون هناك في الغالب أسطر من الكود تحتاج للتعديل من طرف المطور البشري، فالذكاء الاصطناعي لا يمتلك السياق الكامل للمشروع ولا يدري ما هي أهدافه وتفاصيله.
</p>

<p>
	وأسدى نصيحة للمطورين الراغبين في تحقيق الاستفادة القصوى من الذكاء الاصطناعي التوليدي في كتابة الأكواد، بعدم إعطائه الكثير من المسؤوليات المهمة مرة واحدة، فهذه الأدوات تعمل جيدًا عندما نعطيها مهامًا محددة ومعرّفة بوضوح وتتبع أنماط الحل المتوقعة والشائعة، ففي حال أعطيناه مهام أكثر تعقيدًا أو مهام عامة غير محددة فهذا سيتسبب بجعله يعاني من الهلوسة ويعطي نتائج غير صحيحة.
</p>

<h3 id="-4">
	الذكاء الاصطناعي كمعلم شخصي وباحث
</h3>

<p>
	يمكن استخدام الذكاء الاصطناعي التوليدي في تعلم أدوات ولغات برمجية جديدة، على سبيل المثال أشار مهندس تعلم الآلة أنه تمكن من تعلم أساسيات <a href="https://academy.hsoub.com/devops/general/%D8%AA%D8%B9%D9%84%D9%85-devops/#:~:text=Puppet%20%D9%88%20Ansible.-,Terraform,-%D8%AA%D9%88%D9%81%D8%B1%20%D8%A3%D8%AF%D8%A7%D8%A9%20Terraform" rel="">تيرافورم Terraform</a> في غضون ساعة باستخدام GPT-4، وذلك من خلال كتابة موجهات لكتابة الأكواد البرمجية ثم شرحها، ثم طلب منه بعض التغيرات على الكود وتوفير العديد من المزايا والخواص والتحقق فيما إذا كانت قابلة للتطبيق، ويعقّب أنه وجد هذه الطريقة في التعلم أسرع وأكثر فعالية من محاولة اكتساب نفس القدر من المعلومات من خلال البحث في المتصفح أو قراءة الدروس التعليمية.
</p>

<p>
	وللتأكيد، تنجح هذه الطريقة مع المطورين الذين يمتلكون خبرة تقنية مسبقة ومعرفة بكيفية سير الأمور فقط، فهؤلاء يمكنهم اكتشاف الحالات التي يخطئ فيها النموذج. لكن ستبدأ هذه الأدوات في الفشل عندما نظن أنها ستكون دقيقة 100% لذا لا يمكننا أن نعتمد عليها بالمطلق وبثقة عمياء، وعندما نواجه مهام حساسة لا تتحمل أي نسبة خطأ فيجب علينا التحقق دومًا من صحة الكود بدمج طرق بحث المتصفح التقليدية ومخرجات الذكاء الاصطناعي للتأكد من صحة المعلومات من مصادر موثوقة.
</p>

<p>
	ويشدد المطورون الخبراء على ضرورة استخدام النسخ الأحدث من النماذج، فالنسخ الأحدث لها قدرة أفضل على فهم المنطق المعقد مقارنة بالنسخ القديمة فوفقًا لأوبن أيه آي OpenAI يوفر GPT-4 على سبيل المثال دقة أكبر متجاوزًا سلفه بمقدار 40%، ولذا يجب على من يرغب في استخدام أحد نماذج الذكاء الاصطناعي كمعلم شخصي أن يستخدم النسخ الأحدث فهو قادر على دعم الحقائق التي يولدها بالمصادر التي يمكنك تصفحها والتأكد منها مما يقلل من احتمال النتائج الخاطئة.
</p>

<p>
	يفيد استخدام الذكاء الاصطناعي التوليدي أيضًا لدراسة الواجهات البرمجية APIs الجديدة وفي العصف الذهني لإيجاد حلول للمشكلات التي تواجه المطورين، فعند استغلال قدرات النماذج اللغوية الضخمة بأقصى حد يمكن تقليل وقت البحث ليقارب الصفر بفضل نافذة السياق الضخمة لتلك النماذج.
</p>

<p>
	<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D8%B3%D8%AA%D9%83%D8%B4%D9%81-%D9%85%D8%B5%D8%B7%D9%84%D8%AD%D8%A7%D8%AA-%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-%D8%A7%D9%84%D8%AA%D9%88%D9%84%D9%8A%D8%AF%D9%8A-r2399/" rel="">نافذة السياق Context Window</a> هي حجم المعلومات التي يمكن للنموذج استيعابها والعمل عليها في لحظة معينة، فبينما يستطيع البشر التفكير في بضعة أمور مرتبطة بالسياق في نفس الوقت كحد أقصى، يمكن للنماذج اللغوية الضخمة معالجة عدد متزايد من الملفات المصدرية والوثائق في نفس الوقت، يمكن توضيح الفرق من خلال مثال قراءة كتاب فنحن البشر يمكننا أن نتصفح صفحتين في ذات الوقت بحد أقصى ويمكننا أن نعتبر أن هذا هو حجم نافذة السياق البشرية، ولكن بالنسبة للنماذج اللغوية الضخمة فهي تمتلك القدرة على رؤية كل صفحات الكتاب بشكل متزامن، لقد غير هذا بشكلٍ جزي طريقتنا في تحليل البيانات وإجراء البحوث.
</p>

<p data-gramm="false">
	"بدأ ChatGPT بنافذة سياق تتسع 3000 كلمة، وقد وصل حاليًا باستخدام نموذج GPT-4 إلى دعم نافذة سياق تصل إلى 100 ألف كلمة، بينما يمتلك Gemini سعة استيعاب ما يصل إلى مليون كلمة، وهي سعة تجعل البحث عن كلمة أو جملة تطبيقًا فعليًا لمثال البحث عن إبرة في كومة قش، ويستطيع جيميناي التعامل مع هذه النافذة الضخمة من السياق بدقة عالية. كان بالإمكان سابقًا إعطاء النسخ الأولية من هذه الأدوات أجزاء ومقاطع من الكود كسياق من المشاريع التي تعمل عليها، وأصبح من الممكن لاحقًا إعطاؤها <a href="https://academy.hsoub.com/programming/workflow/git/%D8%A7%D9%84%D8%A5%D8%B4%D8%B1%D8%A7%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-%D8%B9%D8%A8%D8%B1-%D8%BA%D9%8A%D8%AA-%D9%87%D8%A8-github-r1585/#:~:text=%D9%85%D9%84%D9%81%20%D8%B4%D9%8A%D9%81%D8%B1%D8%AA%D9%83%20%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9%3A-,%D9%85%D9%84%D9%81%20README.md,-%D8%8C%20%D8%A7%D9%84%D8%B0%D9%8A%20%D9%8A%D9%82%D8%AF%D9%85%20%D9%85%D9%84%D8%AE%D8%B5%D9%8B%D8%A7" rel="">ملف اقرأني README</a> مع الكود المصدري للمشروع بالكامل فأصبح إرفاق المشروع كاملًا كنافذة سياق قبل طرح الأسئلة أمرًا في غاية البساطة."
</p>

<h2 id="-5">
	نصائح لتحسين استخدام أدوات الذكاء الاصطناعي التوليدي
</h2>

<p>
	يمكن للذكاء الاصطناعي التوليدي تعزيز إنتاجية المطورين في كتابة الأكواد والتعلم والبحث شريطة التعامل معه بشكل صحيح، فبدون سياق كافي، يصبح ChatGPT أقرب للهلوسة ولتوليد ردود غير مناسبة، وقد أظهرت <a href="https://arxiv.org/abs/2308.02312" rel="external nofollow">دراسة تجريبية لخصائص إجابات ChatGPT على أسئلة Stack Overflow</a> أن ردود GPT 3.5 في الأسئلة البرمجية تحتوي على معلومات خاطئة بنسبة 53%، ويمكن للسياق الخاطئ أن يكون أسوأ من عدم وجود سياق على الإطلاق، فإن قدمت حلًا ضعيفًا لمشكلة ما في الكود على أنها حل جيد سيفترض ChatGPT أن بإمكانه توليد الردود القادمة على بناء على هذا الأساس الضعيف.
</p>

<p>
	ولتحقيق الاستفادة القصوى من أدوات الذكاء الاصطناعي التوليدي، ينبغي أن نحدد له المهام بوضوح، ونقدم المعلومات التقنية ذات الصلة، وحدد الدور المطلوب منه والنتائج المتوقعة، كما يفيد توفير السياق للنموذج في تحسين في أداءه بشكل ملحوظ.
</p>

<p>
	لكن احذر من إعطاء معلومات خاصة أو حساسة للنماذج العامة، فمن الممكن أن تستخدم هذه البيانات للتدريب عليها وغالبًا ستفعل ذلك، وقد وجد الباحثون أن <a href="https://blog.gitguardian.com/yes-github-copilot-can-leak-secrets/" rel="external nofollow">من الممكن استخراج مفاتيح واجهات برمجية ومعلومات خاصة</a> باستخدام كوبايلوت Copilot و بعض النماذج الأخرى نتيجة لخطأ المطورين بتركهم تلك المعلومات والمفاتيح السرية غير مشفرة في تطبيقاتهم، ووفقًا <a href="https://www.ibm.com/reports/data-breach" rel="external nofollow">لتقرير آي بي ام IBM</a> عن تكلفة تسريبات البيانات فإن السبب الأكبر عالميًا لحدوث تسريبات للبيانات هي بيانات الاعتماد السرية التي تستخدم لتوثيق هوية المستخدم credentials والتي يتم تسريبها.
</p>

<h3 id="-6">
	استراتيجيات هندسة الموجهات لتوليد حلول أفضل
</h3>

<p>
	تؤثر طرق استخدام الموجهات prompts مع الذكاء الاصطناعي التوليدي على جودة الردود المستلمة. لقد أصبحت هذه الطرق محورية للغاية لدرجة أنها أصبحت مجالًا فرعيًا للدراسة يُسمى <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A3%D9%81%D8%B6%D9%84-%D9%85%D9%85%D8%A7%D8%B1%D8%B3%D8%A7%D8%AA-%D9%87%D9%86%D8%AF%D8%B3%D8%A9-%D8%A7%D9%84%D9%85%D9%8F%D9%88%D8%AC%D9%91%D9%90%D9%87%D8%A7%D8%AA/" rel="">هندسة الموجهات Prompt engineering</a>، وهو يركز على كتابة وتحسين الموجهات بهدف توليد مخرجات عالية الجودة. تعتمد هندسة الموجهات على فكرة أن الذكاء الاصطناعي يستفيد بشكل أكبر من السياق وينتج إجابات أفضل عندما يعطى وصفًا دقيقًا ومحددًا للرد المطلوب.
</p>

<p>
	على سبيل المثال، بدلاً من توجيهه بطلب عام مثل "اكتب قائمة"، يمكننا كتابة مُوّجه أدق مثل: "اكتب قائمة مرقمة ورتب عناصرها حسب الأهمية". فهذه التوجيهات المحسّنة تساعد الذكاء الاصطناعي في فهم المطلوب بشكل أفضل وتوليد استجابات مفيدة.
</p>

<p>
	تطبق هندسة الموجهات العديد من <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A3%D9%81%D8%B6%D9%84-%D9%85%D9%85%D8%A7%D8%B1%D8%B3%D8%A7%D8%AA-%D9%87%D9%86%D8%AF%D8%B3%D8%A9-%D8%A7%D9%84%D9%85%D9%8F%D9%88%D8%AC%D9%91%D9%90%D9%87%D8%A7%D8%AA/" rel="">الممارسات والحيل</a> لتستخرج من النموذج أفضل الردود الممكنة، ومن هذه الطرق:
</p>

<ul>
	<li>
		تجربة تقنيات التعلم بصفر محاولة zero-shot وبمحاولة واحدة one-shot وببضعة محاولات few-show: فهذه لتحدد كيفية التعامل مع المهام دون تدريب مخصص أو مع تدريب محدود، فيمكنك أن لا توفر للنموذج أية أمثلة أو توفر له مثال واحد أو بضعة أمثلة للحصول على المطلوب، الفكرة هي توفير أقل سياق ممكن للنموذج مع التركيز على المعرفة المسبقة لدى النموذج وقدراته المنطقية دون الحاجة إلى تدريب مكثف
	</li>
	<li>
		توجيه النموذج من خلال <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A3%D9%81%D8%B6%D9%84-%D9%85%D9%85%D8%A7%D8%B1%D8%B3%D8%A7%D8%AA-%D9%87%D9%86%D8%AF%D8%B3%D8%A9-%D8%A7%D9%84%D9%85%D9%8F%D9%88%D8%AC%D9%91%D9%90%D9%87%D8%A7%D8%AA/#:~:text=7.%20%D8%AC%D8%B1%D8%A8%20%D8%AA%D8%B3%D9%84%D8%B3%D9%84%20%D8%A7%D9%84%D9%85%D9%8F%D9%88%D8%AC%D9%91%D9%90%D9%87%D8%A7%D8%AA" rel="">تسلسل الأفكار Chain-of-thought prompting:</a> فهذا الأسلوب يساعد الذكاء الاصطناعي في تقديم إجابات دقيقة من خلال شرح خطوات تفكيره بشكل منطقي قبل الوصول إلى الإجابة النهائية ويمكننا من فهم الكيفية التي توصل من خلالها لهذه الإجابات
	</li>
	<li>
		التوجيه التكرار وهو يعني ضرورة توجيه الذكاء الاصطناعي للمخرجات المطلوبة وتحسين نتائجه من خلال تعديل الموجهات بشكل متتابع وتكراري.
	</li>
	<li>
		التوجيه السلبي أي إخبار الذكاء الاصطناعي بما لا ينبغي عليه فعله، فمثلًا يمكننا توجيه لعدم توليد محتوى معين
	</li>
</ul>

<p>
	ومن المهم أيضًا إلى جانب ما سبق توجيه أنظمة الدردشة الآلية الذكية لجعل ردودها مختصرة فغالبية الردود التي يولدها GPT حشو لا فائدة منه، ويمكننا اختزالها عن طريق موجه prompt لتوليد ردود مختصرة، وينصح أيضاً بطلب تلخيص الموجهات والتعليمات التي طلبناها منها لتضمن أنه يدرك جيدًا ما تريده.
</p>

<p>
	وعند استخدام النماذج اللغوية الضخمة للمساعدة في تحسين الموجهات بنفسها من المفيد اختيار عينة لم يقم فيها النموذج بتنفيذ المطلوب كما نرغب والاستفسار منه عن سبب توليد هذا الرد، حيث يحسن هذا من صياغة الموجّهات في المرات التالية، ويمكنك في الواقع أن تطلب من النموذج اللغوي الضخم اقتراح التعديلات التي يمكن تنفيذها على الموجه للحصول على الردود التي تتوقعها.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="164707" href="https://academy.hsoub.com/uploads/monthly_2024_12/2.png.c93868528a0e36ca18acef3abdfb4ad7.png" rel=""><img alt="أفضل ممارسات هندسة الموجهات" class="ipsImage ipsImage_thumbnailed" data-fileid="164707" data-ratio="73.86" data-unique="dfxvesood" style="width: 500px; height: auto;" width="812" src="https://academy.hsoub.com/uploads/monthly_2024_12/2.thumb.png.cf99330d5aee0d3ad6757a956eb6f95d.png"></a>
</p>

<p>
	كما أن المهارات البشرية في التواصل لازالت مفيدة حتى عند التعامل مع الذكاء الاصطناعي، فالذكاء الاصطناعي يتعلم بقراءة النصوص البشرية، لذا الالتزام يمكن الالتزام ببعض القواعد المستخدمة في التواصل البشري فهي فعالة أيضًا من قبيل كن مهذبًا، أو كن واضحًا واحترافيًا. تواصل معه كأنك المدير. على سبيل المثال يمكن توجيه الذكاء الاصطناعي المتقمص لدور مراجع باستخدام نصوص الموجهات التالية الذي يوضح للذكاء الاصطناعي من هو وما المتوقع منه من خلال كتابة سلسلة الموجهات التالية:
</p>

<p data-gramm="false">
	"أنت ذكاء اصطناعي يراجع الأكواد، ومصمم لتدقق وتراجع وتحسن ملفات الأكواد المصدرية، ودورك أن تتصرف كناقد يراجع الكود التي يوفرها المستخدم ويقترح التحسينات المطلوبة عليها، فأنت خبير في تحسين جودة ملف الكود بدون تغيير وظيفته. ينبغي أن تكون محترفًا في تعاملك مع المستخدم وأن تكون طريقة كلامك مهذبة ومهنية، وأن تكون مراجعتك بناءةً وتوفر شرحًا واضحًا للتحسينات المقترحة، وعليك منح أولوية للتعديلات التي تصلح الأخطاء، موضحًا أي هذه التعديلات اختياري وأيها غير اختياري. هدفك مساعدة المستخدم بتحسين جودة الكود الخاص بهم تحسينًا لا يمكنك بعده أن تجد أي شيء قابل للتطوير أبعد من ذلك، وعند وصولك لهذا المستوى وضح للمستخدم أنه لا يمكنك إيجاد شيء لتحسينه مشيرًا إلى جهوزية الكود للتشغيل أو الاستخدام. استلهم عملك من مبادئ <a href="https://academy.hsoub.com/programming/advanced/%D8%A3%D9%86%D9%85%D8%A7%D8%B7-%D8%A7%D9%84%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A-design-patterns-r498/" rel="">أنماط التصميم البرمجية</a> واعتمده كدليل أساسي في تصميم البرمجيات، عليك أن تجتهد في تطبيق ثلاثة مبادئ في الأكواد التي تراجعها وتحللها مشددًا على ضمان صحة الكود وتنسيقه الجيد وتصميمه المتقن. امنح أولوية لصحة الكود وللتحسينات، فضع دومًا التعديلات الأهم والأخطر أولًا قبل التعديلات الأقل أهمية. وقسم مراجعتك إلى ثلاثة أقسامٍ رئيسية وهي التنسيق والتصحيح والتحليل ويحتوي كل قسم على قائمة من التحسينات الممكنة تحت عنوان القسم.
</p>

<p>
	اتبع هذه التعليمات:
</p>

<ol>
	<li>
		ابدأ بمراجعة تنسيق الكود، مكتشفًا أي خطأ في المسافات أو محاذاة العناصر النصية للكود، فتحسن الكود من الناحية الجمالية وتجعله أسهل في القراءة
	</li>
	<li>
		تاليًا، ركز على صحة الكود وخلوه من الأخطاء النصية والوظيفية
	</li>
	<li>
		أخيرًا، أجري تحليل عالي المستوى للكود، باحثًا عن طرق لتحسين <a href="https://academy.hsoub.com/programming/general/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D8%A3%D8%AE%D8%B7%D8%A7%D8%A1-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-r1342/" rel="">معالجة الأخطاء error handling</a> والتعامل مع الحالات الخاصة بالإضافة لضمان جعل الكود موثقًا ويعمل بكفاءة وقابلاً للصيانة والتحديث
	</li>
</ol>

<p>
	يمكن القول أن هندسة الموجهات Prompt engineering فن أكثر من كونها علم، وهي تتطلب قدرًا معينًا من التجربة والمحاولة والخطأ للخروج بالمطلوب، إذ تفرض طبيعة تقنيات معالجة اللغات الطبيعية NLP عدم وجود حل واحد يناسب جميع المشكلات، تمامًا كما أن محادثتك مع أشخاص مختلفين تتطلب اختيارًا مختلفًا للكلمات، والموازنة بين الوضوح والتعقيد والإيجاز والإسهاب، فلكل هذا تأثير على فهم الآخرين لاحتياجاتك ولقصدك."
</p>

<h2 id="-13">
	مستقبل الذكاء الاصطناعي التوليدي في تطوير البرمجيات
</h2>

<p>
	بعد تطور تقنيات الذكاء الاصطناعي التوليدي وأدواته ظهرت ادعاءات ومزاعم عديدة تفترض أن المهارات البرمجية ستصبح عديمة النفع، وأن الذكاء الاصطناعي سيلغي عمل المطورين ويكون قادرًا على بناء تطبيق كامل من الصفر، ولن تشكل معرفة المطورين وقدرتهم على كتابة الأكواد البرمجية أي فرق، وردًا على هذه المزاعم والافتراضات فإنه من الصعب حدوث هذا على الأقل في المدى القريب، فالذكاء الاصطناعي التوليدي لا يمكنه أن يكتب تطبيقًا مكتاملًا لنا، ولا زال يعاني من قصور في تصميم واجهات المستخدم، فلا يوجد حتى الآن أي أداة ذكاء اصطناعي حاليًا قادرة على تصميم واجهات تطبيق تتناسب مع الهوية البصرية الموجودة بالفعل.
</p>

<p>
	وهذا القصور ليس نتيجة لنقص المجهود في هذا المجال، فقد ظهرت منصة <a href="https://v0.dev/" rel="external nofollow">v0</a> التي تقدم خدماتها عبر السحابة كواحدة من الأدوات المتخصصة في عالم واجهات المستخدمين المولدة بالذكاء الاصطناعي، ولكنها مازالت مقتصرة على استخدام أكواد رياكت ومكوناتها الموجودة في <a href="https://ui.shadcn.com/" rel="external nofollow">شاد سي إن shadcn ui components</a>، ويمكن أن تكون نتائجها النهائية مفيدة للنماذج الأولية من المشروع ولكنها تحتاج لمطور واجهة ماهر ليستطيع أن يبني واجهات تناسب الهوية البصرية، وعلى ما يبدو لازالت هذه التقنيات بحاجة لمزيد من التطوير قبل أن تنافس الخبرة البشرية.
</p>

<p>
	وقد أصبح تطوير البرمجيات كمنتج منتشرًا بكثرة اليوم، فالمطورون الآن مطالبون بفهم مشكلات العملاء واستخدام الأكواد لحلها بدلاً من مجرد كتابة الكود. وهذا التحول يعني أن الدور التقليدي للمطورين يتغير، ويجب عليهم التركيز على تحقيق أهداف الأعمال بدلاً من مجرد تنفيذ المهام البرمجية. وبالرغم أن هذه التحديات قد تكون صعبة للبعض، فإن تبني تقنيات مثل الذكاء الاصطناعي التوليدي يمكن أن يمنح المطورين ميزة تنافسية.
</p>

<h2 id="-14">
	الخلاصة
</h2>

<p>
	يمكن أن نخلص من حالات الاستخدام والنقاشات الواردة في هذا المقال إلى أن الذكاء الاصطناعي سيظل بحاجة مستمرة للخبراء في توجيه واختبار مخرجاته، ولن يكون بديلاً كاملاً للمطورين المحترفين. لكن في الوقت ذاته، سيصبح أداة قوية لتعزيز إنتاجية المطورين، مما يستدعي الاستعداد لمخاطر استخدامه في تطوير البرمجيات بشكل آمن وفعال.
</p>

<p>
	فقد تُرك الحبل على الغارب لإنتاج الكثير من النماذج اللغوية الضخمة، ويبدو أن استخدام الذكاء الاصطناعي سيكون جزءًا أساسيًا في تطوير البرمجيات ولا يمكن تجاهله، لذا، يجب على المؤسسات المعنية تجهيز فرقها بأدوات جديدة لزيادة الإنتاجية ولتوضيح المخاطر الأمنية المرتبطة باستخدام الذكاء الاصطناعي في سير العمل.
</p>

<p>
	ترجمة -وبتصرف- لمقال <a href="https://www.toptal.com/software/increase-developer-productivity-generative-ai" rel="external nofollow">Increase Developer Productivity With Generative AI: Tips From Leading Software Engineers</a> لكاتبه Sam Sycamore
</p>

<h2 id="-15">
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%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-%D8%A7%D9%84%D8%AA%D9%88%D9%84%D9%8A%D8%AF%D9%8A-generative-ai-r2234/" rel="">مقدمة إلى الذكاء الاصطناعي التوليدي Generative AI</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%83%D9%84-%D9%85%D8%A7-%D8%AA%D9%88%D8%AF-%D9%85%D8%B9%D8%B1%D9%81%D8%AA%D9%87-%D8%B9%D9%86-%D8%AF%D8%B1%D8%A7%D8%B3%D8%A9-%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-r2362/" rel="">كل ما تود معرفته عن دراسة الذكاء الاصطناعي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D8%B3%D8%AA%D9%83%D8%B4%D9%81-%D9%85%D8%B5%D8%B7%D9%84%D8%AD%D8%A7%D8%AA-%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-%D8%A7%D9%84%D8%AA%D9%88%D9%84%D9%8A%D8%AF%D9%8A-r2399/" rel="">استكشف مصطلحات الذكاء الاصطناعي التوليدي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%85%D8%B3%D8%AA%D9%82%D8%A8%D9%84-%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/" rel="">مستقبل الذكاء الاصطناعي</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2473</guid><pubDate>Tue, 17 Dec 2024 15:07:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62F;&#x644;&#x64A;&#x644; &#x627;&#x644;&#x634;&#x627;&#x645;&#x644; &#x641;&#x64A; &#x62A;&#x62E;&#x635;&#x635; &#x627;&#x644;&#x630;&#x643;&#x627;&#x621; &#x627;&#x644;&#x627;&#x635;&#x637;&#x646;&#x627;&#x639;&#x64A;</title><link>https://academy.hsoub.com/programming/artificial-intelligence/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D9%81%D9%8A-%D8%AA%D8%AE%D8%B5%D8%B5-%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-r2466/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_12/-----.png.cc8b0743c5b8a96dcdee89fb043daf0b.png" /></p>
<p>
	أصبح تخصص الذكاء الاصطناعي Artificial Intelligence واحدًا من أهم التخصصات المطلوبة في سوق العمل اليوم. فمع تطور التقنية واعتماد معظم المجالات على الذكاء الاصطناعي، ازداد الطلب على المتخصصين فيه بشكل كبير وتوفرت لهم فرص عمل ممتازة برواتب عالية تضمن مستقبلًا وظيفيًا آمنًا. فما هو تخصص الذكاء الاصطناعي؟ وما خطوات تعلمه، وما أبرز المجالات التي يندرج تحتها؟ سنجيب في الفقرات التالية على كل هذه الأسئلة.
</p>

<h2 id="-1">
	ما هو تخصص الذكاء الاصطناعي
</h2>

<p>
	تخصص <a href="https://academy.hsoub.com/programming/artificial-intelligence/%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/" rel="">الذكاء الاصطناعي</a> هو فرع من <a href="https://academy.hsoub.com/computer-science/" rel="">علوم الحاسوب</a>، يركز على تصميم وتطوير أنظمة ذكاء اصطناعي قادرة على محاكاة الذكاء البشري في طريقة التفكير وحل المشكلات وفهم الأمور المختلفة، يعمل خبراء الذكاء الاصطناعي على بناء خوارزميات وبرمجيات تُعلّم الآلات التعرف على الأنماط وتحليل البيانات واستنتاج حلول للمشكلات المختلفة. تعتمد هذه الأنظمة على تعلم البيانات وتحسين أدائها مع مرور الوقت.
</p>

<h2>
	أهمية الخوارزميات والبيانات لأنظمة الذكاء الاصطناعي
</h2>

<p>
	تعتمد أنظمة الذكاء الاصطناعي على ركيزتين أساسيتين هما <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AE%D9%88%D8%A7%D8%B1%D8%B2%D9%85%D9%8A%D8%A7%D8%AA-%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/" rel="">الخوارزميات</a> والبيانات. إذ تشكل <a href="https://academy.hsoub.com/programming/advanced/%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%B1%D8%B2%D9%85%D9%8A%D8%A7%D8%AA/" rel="">الخوارزميات</a> حجر الأساس لهذه الأنظمة، فهي تمثل مجموعة من القواعد والتعليمات التي توجه النظام للتعامل مع البيانات بشكل منهجي ودقيق، بهدف استخلاص استنتاجات ذات قيمة واتخاذ القرارات المطلوبة بكفاءة، بعد تصميم الخوارزمية، تأتي خطوة تجهيز كميات ضخمة من البيانات. تستخدم هذه البيانات لتدريب الخوارزمية على العمل بكفاءة من خلال استكشاف الأنماط الموجودة داخلها واستخراج نتائج عملية.
</p>

<p>
	إلى جانب هاتين الخطوتين، يتضمن تطوير أنظمة الذكاء الاصطناعي العديد من المهام الأخرى، مثل جمع البيانات وتنقيحها، واختيار النموذج الأنسب لبناء النظام. بعد بناء النموذج، يخضع لاختبارات دقيقة ويُطوَّر تدريجيًا باستخدام بيانات أكثر تعقيدًا، أخيرًا، <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%85%D8%B4%D8%A7%D8%B1%D9%83%D8%A9-%D9%86%D9%85%D9%88%D8%B0%D8%AC-%D8%B0%D9%83%D8%A7%D8%A1-%D8%A7%D8%B5%D8%B7%D9%86%D8%A7%D8%B9%D9%8A-%D8%B9%D9%84%D9%89-%D9%85%D9%86%D8%B5%D8%A9-hugging-face-r2378/" rel="">ينشر النموذج في بيئة الإنتاج</a>، حيث يُراقب أداؤه ويُحدّث باستمرار اعتمادًا على التغذية الراجعة والبيانات الجديدة التي تدرب عليها لضمان فعاليته واستمراريته في تحسين أدائه ونتائجه.
</p>

<h2 id="-2">
	أهمية تخصص الذكاء الاصطناعي
</h2>

<p>
	ازادت أهمية تخصص الذكاء الاصطناعي في الآونة الأخيرة زيادة كبيرة، وذلك لأسباب عديدة، لنستعرض أهمها في الفقرات التالية:
</p>

<h3>
	زيادة الاعتماد على التطبيقات الذكية
</h3>

<p>
	ذاع صيت أدوات وتطبيقات الذكاء الاصطناعي وانتشرت بين المبرمجين وغيرهم، ما زاد من شهرة تخصص الذكاء الاصطناعي وجعله على رأس أكثر المجالات حاجةً لمتخصصين وخبراء، وزاد ذلك بدوره من الطلب على تخصص الذكاء الاصطناعي. وتشير <a href="https://survey.stackoverflow.co/2023/#ai-sentiment-and-usage" rel="external nofollow">إحصائية موقع ستاك أوفر فلو Stack OverFlow</a> على سبيل المثال إلى أن 44% من المطورين المحترفين يستخدمون أدوات الذكاء الاصطناعي في عملهم على <a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA/" rel="">تطوير البرمجيات</a>، أضف إلى ذلك يستخدم المترجمون وصانعو المحتوى والمصممون والمدرسون والفنانون اليوم أدوات الذكاء الاصطناعي المختلفة لمساعدتهم في أعمالهم.
</p>

<h3>
	الأمان الوظيفي
</h3>

<p>
	ففي ظل التحول الرقمي، تشير التنبؤات إلى أنّ الطب سيزداد على تخصص الذكاء الاصطناعي ويُتوقع أنه سيستبدل الكثير من العاملين البشريين في المجالات المختلفة، لكن هذا الأمر لا ينطبق بالطبع على متخصصي الذكاء الاصطناعي فهم من يطوره ويعملون على صيانته وتحسينه وبالتالي لن يتم استبدالهم، ما يجعل الأمان الوظيفي لتخصص الذكاء الاصطناعي عاليًا.
</p>

<h3>
	الرواتب العالية
</h3>

<p>
	إن رواتب العاملين في تخصص الذكاء الاصطناعي من أعلى الرواتب أجرًا ولا سيما الخبراء منهم، وذلك لقلة المتميزين في هذا المجال، وصراع الشركات على توظيف هذه الثلة القليلة من المميزين الذين يتقنون المجال ويعرفون خباياه وأسراره.
</p>

<h2 id="-3">
	ما مجالات تخصص الذكاء الاصطناعي؟
</h2>

<p>
	يعد الذكاء الاصطناعي تخصصًا واسعًا يضم الكثير من المجالات الفرعية، وأهمها:
</p>

<ul>
	<li>
		تعلم الآلة Machine Learning
	</li>
	<li>
		التعلم العميق Deep Learning
	</li>
	<li>
		معالجة اللغات الطبيعية Natural Language Processing
	</li>
	<li>
		الرؤية الحاسوبية Computer Vision
	</li>
	<li>
		الأنظمة الخبيرة Expert Systems
	</li>
	<li>
		برمجة الروبوتات Robots Programming
	</li>
</ul>

<p>
	لنناقش كل تخصص من هذه التخصصات الفرعية ونتعرف على طبيعة كل تخصص وأهم تطبيقاته.
</p>

<h3 id="machinelearning">
	تعلم الآلة Machine Learning
</h3>

<p>
	يعمل مهندسو <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9/" rel="">تعلم الآلة</a> على تطوير خوارزميات الذكاء الاصطناعي وتحسين طريقة تعاملها مع البيانات، وتمكينها من التعامل مع مواقف أكثر وبيانات أعقد، ويهتمون بدراسة الطرق التي يتعلم بها نظام الذكاء الاصطناعي من البيانات، كالتعلم مع إشراف Supervised Learning والتعلم بدون إشراف Unsupervised Learning والتعلم المعزز Rainforcement Learning.
</p>

<p>
	ومن أهم تطبيقات مجال تعلم الآلة أنظمة ترشيح المحتوى في منصات تواصل الاجتماعي وأنظمة تحليل الأسواق والتنبؤ بمستقبل السوق، وتحليل البيانات الطبية للتشخيص المبكر للأمراض، وأنظمة اكتشاف الاحتيال في المعاملات المالية وغيرها من التطبيقات العديدة الأخرى.
</p>

<h3 id="deeplearning">
	التعلم العميق Deep Learning
</h3>

<p>
	يتفرع مجال <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86-%D9%84%D9%81%D9%87%D9%85-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%82-r1422/" rel="">التعلم العميق</a> من مجال تعلم الآلة، ويتعامل المتخصصون في التعلم العميق مع الشبكات العصبية المعقدة التي تتألف من عدة طبقات متداخلة، والتي تستطيع التعلم من مجموعات بيانات غير منظمة، ولعل هذا هو الفارق الجوهري بين التعلم العميق وتعلم الآلة، إذ لا تتعلم خوارزميات تعلم الآلة سوى من بيانات منظمة حصرًا، وتعد تطبيقات التعرف على الأصوات مثل مساعدات الذكاء الاصطناعي مثل Siri وGoogle Assistant وتطبيقات التعرف على الصور وتمييز الوجوه من أهم تطبيقات التعلم العميق.
</p>

<h3 id="naturallanguageprocessing">
	معالجة اللغات الطبيعية Natural Language Processing
</h3>

<p>
	يجعل مجال معالجة اللغات الطبيعية NLP التخاطب بين الآلات والبشر ممكنًا، إذ يهتم مهندسو معالجة اللغات الطبيعية بتمكين الآلات من فهم اللغات البشرية من عربية وإنجليزية وغيرها ويشمل هذا الفهم تحليل السياق، واستخلاص المعاني، والتعرف على الأنماط اللغوية، وتوليد نصوص بهذه اللغات، وتبرز أنظماة الترجمة الآلية، وأنظمة تحليل المشاعر مثل تحليل تقييمات المنتجات أو تعليقات وسائل التواصل الاجتماعي، وبوتات الدردشة من أبرز تطبيقات تخصص معالجة اللغات الطبيعية.
</p>

<h3 id="computervision">
	الرؤية الحاسوبية Computer Vision
</h3>

<p>
	صارت الآلات تتعرف على الأشياء في الصور وتستطيع تحليل العناصر المرئية وفهمها بفضل تخصص الرؤية الحاسوبية، الذي يعد أحد التخصصات الفرعية للذكاء الاصطناعي القوية فهو يسمح للآلات والأنظمة المختلفة بتحليل الصور تحليلًا دقيقًا واستخراج عناصر الصورة وتمييز كل كائنٍ في الصورة عن الآخر، ولعل من أشهر تطبيقات الرؤية الحاسوبية أنظمة التعرف على الوجوه والسيارات ذاتية القيادة التي تعتمد على تحليل البيئة المحيطة لتحديد العوائق والمسارات، وتطبيقات تحليل الصور الطبية لتشخيص الأمراض، وتقنيات الواقع المعزز التي تدمج العناصر الافتراضية مع العالم الحقيقي في الوقت الفعلي.
</p>

<h3 id="expertsystems">
	الأنظمة الخبيرة
</h3>

<p>
	تعد الأنظمة الخبيرة Expert Systems تخصصًا فرعيًا من الذكاء الاصطناعي وهي أنظمة مصممة لمحاكاة الخبرات والمعارف البشرية في مجالات محددة، فيسعى مهندسو الذكاء الاصطناعي مثلًا إلى تطوير أنظمة خبيرة طبية لتحاكي طرق تفكير الأطباء الخبراء في التشخيص الطبي والعلاج أو أنظمة خبيرة في التخطيط المالي لاتخاذ قرارات استثمارية مناسبة بناءً على تحليل بيانات السوق، وكذلك فإنَّ لمجال الأنظمة الخبيرة تطبيقات في ميادين مختلفة، مثل الاقتصاد والتعليم وتطوير البرمجيات والكيمياء وغيرها.
</p>

<h3 id="robotsprogramming">
	برمجة الروبوتات
</h3>

<p>
	يتفرع مجال <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%B1%D9%88%D8%A8%D9%88%D8%AA-%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-r1855/" rel="">برمجة الروبوتات</a> من تخصص الذكاء الاصطناعي، ويعمل مبرمجو الروبوتات على بناء أنظمة تشغيل الروبوتات وكتابة الشيفرات التي تسمح للروبوت بتحريك الأجزاء المختلفة من جسمه وتفادي العواقب والتعرف على الأشياء، وتعتمد الروبوتات في عملها على مجموعة متنوعة من الحساسات مثل الكاميرات والرادارات وأجهزة الاستشعار للتعرف على الأشياء في البيئة المحيطة بها ثم تبرمج خوارزميات ذكية لتفسير البيانات الواردة من هذه الحساسات واتخاذ قرارات بشأن كيفية التصرف لتفادي العقبات أو التفاعل مع الأجسام. ولعل أشهر تطبيقٍ لهذا المجال روبوتات المصانع والروبوتات الطبية.
</p>

<h2 id="-4">
	مواد تخصص الذكاء الاصطناعي
</h2>

<p>
	إذا قررت دراسة هذا التخصص عليك دراسة العديد من المواد والمفاهيم، ومن أهمها:
</p>

<ul>
	<li>
		علوم الحاسوب Computer Science
	</li>
	<li>
		الرياضيات Mathematics
	</li>
	<li>
		علم البيانات Data Science
	</li>
	<li>
		أمان الذكاء الاصطناعي AI Security
	</li>
</ul>

<p>
	لنتعرف أكثر عن كل مفهوم منها بمزيد من التفصيل.
</p>

<h3 id="-5">
	علوم الحاسوب
</h3>

<p>
	يقوم تخصص الذكاء الاصطناعي أساسًا على الحاسوب، ما يجعل المعرفة بأساسيات علوم الحاسوب ضرورية لفهم تخصص الذكاء الاصطناعي، ويندرج تحت علوم الحاسوب مواد عديدة أخرى، ومن أهمها:
</p>

<ul>
	<li>
		لغات البرمجة وأطر العمل إذ تتعدد لغات البرمجة وأطر العمل المستخدمة في تخصص الذكاء الاصطناعي، ولعل أهمها وأسهلها <a href="https://academy.hsoub.com/python/" rel="">لغة بايثون Python</a> وإطار عمل تينسر فلو TensorFlow.
	</li>
	<li>
		<strong>الخوارزميات وهياكل البيانات</strong>، فالخوارزميات هي القواعد التي يضعها المطور لنموذج الذكاء الاصطناعي ليتعلم ويتطور بكفاءة ويؤدي دوره دون أخطاء، و<a href="https://academy.hsoub.com/programming/general/%D9%87%D9%8A%D8%A7%D9%83%D9%84-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-data-structures/" rel="">هياكل البيانات</a> تساعد على تنظيم وتخزين البيانات التي تعد أساس الذكاء الاصطناعي.
	</li>
	<li>
		<strong>أنظمة التشغيل</strong> إذ يحتاج كل مطور للتعامل مع <a href="https://academy.hsoub.com/apps/operating-systems/%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84/" rel="">أنظمة التشغيل</a> وإدارة العمليات والموارد، فتعلم نظم التشغيل يساعد على تخصيص نظام الذكاء الاصطناعي وتطويره بالطريقة المثلى.
	</li>
</ul>

<h3 id="mathematicsandstatistics">
	الرياضيات والإحصاء
</h3>

<p>
	يحتاج متخصص الذكاء الاصطناعي لمعرفة جيدة بأساسيات الرياضيات، ولا سيما في فروع الجبر الخطي والتفاضل والتكامل والتحليل العددي والرياضيات المتقطعة والإحصاء والاحتمالات والإحصاء، لما ينبني عليها من خوارزمياتٍ وطرق لتحليل البيانات وفهم الأنماط والاتجاهات من خلال أدوات وتقنيات إحصائية يقوم عليها تخصص الذكاء الاصطناعي كله.
</p>

<h3 id="datascience">
	علم البيانات
</h3>

<p>
	يرتبط تخصص الذكاء الاصطناعي مع <a href="https://academy.hsoub.com/programming/general/%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA/" rel="">علم البيانات Data Science</a> بشكل وثيق فالذكاء الاصطناعي قائم على البيانات، ويحتاج لتوفر بيانات ملائمة لبناء نماذج الذكاء الاصطناعي وتحسين أدائها، فعلم البيانات هو الذي يوفر الأدوات والتقنيات اللازمة لجمع وتحليل البيانات كي تُستخدم في تدريب وتقييم نماذج الذكاء الاصطناعي. فمن دون بيانات عالية الجودة، تكون قدرة نماذج الذكاء الاصطناعي على التعلم والتنبؤ محدودة.
</p>

<p>
	تشمل علوم البيانات نمذجة البيانات Data Modelling، وهي عملية جمع البيانات وتنقيحها وتنسيقها وتجهيزها للتحليل والاستخدام، و<a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%AD%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA/" rel="">تحليل البيانات</a> Data Analysis للخروج من البيانات باستنتاجات مفيدة وإحصاءات مهمة كما تضم التمثيل المرئي Data Visualization للنتائج لجعلها سهلة الفهم.
</p>

<h3 id="aisecurity">
	أمان الذكاء الاصطناعي AI Security
</h3>

<p>
	تعتمد نماذج الذكاء الاصطناعي بشكل كبير على معالجة معلومات المستخدمين، والتي قد تتضمن بيانات شخصية أو حساسة. لذلك، تقع على عاتق متخصص الذكاء الاصطناعي مسؤولية كبيرة في حماية هذه البيانات وضمان سريتها وأمانها، فمثلًا لو لم يكن <a href="https://academy.hsoub.com/apps/web/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A8%D9%88%D8%AA-%D8%A7%D9%84%D9%85%D8%AD%D8%A7%D8%AF%D8%AB%D8%A9-%D8%A7%D9%84%D8%B0%D9%83%D9%8A-%D8%B4%D8%A7%D8%AA-%D8%AC%D9%8A-%D8%A8%D9%8A-%D8%AA%D9%8A-chatgpt-r863/" rel="">شات جي بي تي</a> آمنًا لما استخدمه الناس في مهامهم المختلفة، فيجب أن تكون خصوصية البيانات وأمانها على رأس أولويات أنظمة وتطبيقات الذكاء الاصطناعي.
</p>

<h2 id="-6">
	دراسة تخصص الذكاء الاصطناعي
</h2>

<p>
	إذا كنت مهتمًا بدراسة تخصص الذكاء الاصطناعي فستقف أمام خيارين، وهما الدراسة الأكاديمية في أحد الكليات المتخصصة، والدراسة الذاتية.
</p>

<p>
	تتميز الدراسة الأكاديمية بالمسار الواضح والمناهج الدراسية المنظمة، وكذلك فستحظى خلالها بدعم من الأساتذة المتخصصين، وستجد حولك جمعًا من الزملاء والأصدقاء المشاركين لك في رحلتك في <a href="https://academy.hsoub.com/artificial-intelligence/" rel="">تعلم الذكاء الاصطناعي</a>، مما يساعدك على التزام الطريق والاستمرار فيه، كما تمنحك الجامعة شهادة معتمدة تثبت دراستك للمجال.
</p>

<p>
	ولكن يعيب الدراسة الجامعية طول مدتها المبالغ فيه وتركيزها على الجانب النظري من المواد دون التطبيق العملي، ما يضع فجوة بين الطالب حين يتخرج ومتطلبات سوق العمل، حيث ستجد أنك تملك زخمًا من المعلومات النظرية الكثيفة، لكنك لا تستطيع تطبيقها في <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D9%87%D9%85-%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%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-r2372/" rel="">مشاريع ذكاء اصطناعي</a> حقيقية.
</p>

<p>
	من ناحية أخرى، تتسم بالمرونة والتنوع في الأساتذة وإمكانية الاختيار بينهم، وتتميز كذلك بالتركيز على متطلبات سوق العمل والتطبيق العملي أكثر من الدراسة النظرية المملة، ويستغرق الطالب مدة أقل من الدراسة الأكاديمية لكي يكون مؤهلًا لسوق العمل.
</p>

<p>
	لكن الدراسة الذاتية تتطلب انضباطًا ذاتيًا شديدًا، وقدرة على تخطي العقبات والإحباطات والإخفاقات، وكذلك سيكون من الصعب الوصول إلى خبير يرشدك في طريقك، مما يضيع عليك أحيانًا الكثير من الوقت في السير في طريق خاطئ.
</p>

<p>
	إذا كنت ترغب في الجمع بين مميزات الدراسة الجامعية مثل الدعم الأكاديمي والمنهج الواضح والشهادة المعتمدة، ومميزات الدراسة الذاتية من تطبيقٍ عملي ومرونة ومواكبة لسوق العمل، ننصحك بمطالعة <a href="https://academy.hsoub.com/store/12-%D8%AF%D9%88%D8%B1%D8%A9-%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/" rel="">دورة الذكاء الاصطناعي من أكاديمية حسوب</a> فهي تقدم لك الفرصة لدراسة التخصص من البداية حتى الاحتراف، بإشراف مدربين محترفين يجيبون على تساؤلاتك ويشرحون لك ما يصعب عليك فهمه ويكسبونك الخبرة لتطوير تطبيقات عملية عديدة تعزز معرض أعمالك وتزيد فرصتك في الحصول على عمل.
</p>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة الذكاء الاصطناعي
		</p>

		<p class="banner-subtitle">
			احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة.
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/artificial-intelligence" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<a href="https://academy.hsoub.com/learn/artificial-intelligence" rel=""><img alt="دورة الذكاء الاصطناعي AI" src="https://academy.hsoub.com/learn/assets/images/courses/artificial-intelligence.png"></a>
	</div>
</div>

<p>
	كما ستجد في أكاديمية حسوب مصادر أخرى تساعدك على بدء رحلتك في الذكاء الاصطناعي، مثل: <a href="https://academy.hsoub.com/programming/" rel="">المقالات والدروس المتخصصة</a> و<a href="https://academy.hsoub.com/files/c5-programming/" rel="">الكتب المجانية الشاملة</a>، وإذا كنت تشعر بالتشتت أو تخشى البداية الخاطئة في هذا المجال الواسع، فابدأ من <a href="https://academy.hsoub.com/artificial-intelligence/" rel="">صفحة تعلم الذكاء الاصطناعي</a> التي تضم جميع المعلومات والإرشادات التي تحتاجها للبدء في هذا المجال.
</p>

<h2>
	نصائح لتعلم تخصص الذكاء الاصطناعي
</h2>

<ol>
	<li>
		حدد هدفك من التعلم واختر مجالًا محددًا من مجالات الذكاء الاصطناعي وركز على تعلمه
	</li>
	<li>
		تعلم المفاهيم الأساسية في علوم الحاسوب والرياضيات والإحصاء والتفاضل والتكامل لأنها ضرورية في جميع مجالات الذكاء الاصطناعي
	</li>
	<li>
		تعلم الخوارزميات والتفكير المنطقي وأساسيات لغات البرمجة
	</li>
	<li>
		تعلم المفاهيم النظرية للذكاء الاصطناعي وأهم <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%85%D8%B5%D8%B7%D9%84%D8%AD%D8%A7%D8%AA-%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%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86-r2363/" rel="">مصطلحاته</a>
	</li>
	<li>
		احترف إحدى لغات برمجة للذكاء الاصطناعي مثل لغة بايثون
	</li>
	<li>
		تعلم التعامل مع منصات ومكتبات الذكاء الاصطناعي مثل <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%85%D8%A7-%D9%87%D9%8A-%D9%85%D9%86%D8%B5%D8%A9-hugging-face-%D9%84%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-r2449/" rel="">Hugging Face</a> وباي تورش <a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A5%D8%B7%D8%A7%D8%B1-%D8%B9%D9%85%D9%84-%D8%A8%D8%A7%D9%8A-%D8%AA%D9%88%D8%B1%D8%B4-pytorch-%D9%88%D8%A3%D9%87%D9%85%D9%8A%D8%AA%D9%87-%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%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-r2311/" rel="">PyTorch</a> و Scikit-learn وغيرها لتسريع تطوير التطبيقات الذكية
	</li>
	<li>
		افهم كيفية معالجة وتنظيف البيانات وتحويلها إلى شكل مناسب لاستخدامها في الخوارزميات
	</li>
	<li>
		طبق كل ما تعلمته على مشاريع عملية بسيطة في البداية، ثم انتقل لمشاريع أكثر تعقيدًا لتعزيز مهاراتك
	</li>
	<li>
		ابحث عن فرصة عمل تمكنك من تنفيذ مشاريع حقيقية على أرض الواقع
	</li>
</ol>

<h2 id="-7">
	الخلاصة
</h2>

<p>
	عرفنا في مقال اليوم ماهية تخصص الذكاء الاصطناعي وأهميته، ثم عرفنا شيئًا من مجالاته، ومن بعدها مواده التخصصية وسبل دراسة التخصص، فبعدما عرفت قدرًا من المعلومات عن تخصص الذكاء الاصطناعي، فهل ترى أن هذا التخصص يناسبك ويوافق تطلعاتك المستقبلية؟ شاركنا برأيك في التعليقات أسفل المقال.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%85%D8%B3%D8%AA%D9%82%D8%A8%D9%84-%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/" rel="">مستقبل الذكاء الاصطناعي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%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/" rel="">تطبيقات الذكاء الاصطناعي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D9%83%D9%8A%D9%81-%D8%A3%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-%D8%AA%D9%82%D9%86%D9%8A%D8%A7%D8%AA-%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%81%D9%8A-%D8%B9%D9%85%D9%84%D9%8A%D8%9F-r2416/" rel="">كيف أستخدم تقنيات الذكاء الاصطناعي في عملي؟</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%A3%D9%85%D8%AB%D9%84%D8%A9-%D8%B9%D9%84%D9%89-%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-r2396/" rel="">أمثلة على الذكاء الاصطناعي</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2466</guid><pubDate>Tue, 10 Dec 2024 15:00:01 +0000</pubDate></item></channel></rss>
