<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Prompt Engineering on kenji.blog</title><link>http://kenji.blog/ar/tags/prompt-engineering/</link><description>Recent content in Prompt Engineering on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>ar</language><copyright>kenjinote</copyright><lastBuildDate>Fri, 11 Sep 2026 20:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/ar/tags/prompt-engineering/index.xml" rel="self" type="application/rss+xml"/><item><title>للمهندسين: أساسيات هندسة التلقين وتطبيقاتها في التطوير</title><link>http://kenji.blog/ar/p/prompt-engineering-for-engineers/</link><pubDate>Fri, 11 Sep 2026 20:00:00 +0900</pubDate><guid>http://kenji.blog/ar/p/prompt-engineering-for-engineers/</guid><description>&lt;img src="http://kenji.blog/p/prompt-engineering-for-engineers/img/eyecatch.jpg" alt="Featured image of post للمهندسين: أساسيات هندسة التلقين وتطبيقاتها في التطوير" />&lt;h1 id="مقدمة-لماذا-يجب-على-المهندسين-تعلم-هندسة-التلقين">مقدمة: لماذا يجب على المهندسين تعلم هندسة التلقين
&lt;/h1>&lt;p>يشهد عالم تطوير البرمجيات تحولاً جذرياً غير مسبوق بسبب التطور السريع للنماذج اللغوية الكبيرة (LLM). ليس من المبالغة القول إننا ننتقل الآن من &amp;ldquo;البرمجيات 2.0&amp;rdquo; (التطوير باستخدام الشبكات العصبية) التي اقترحها Andrejs Karpathy، إلى &amp;ldquo;البرمجيات 3.0&amp;rdquo; (التطوير الموجه بالتلقين باستخدام اللغة الطبيعية).&lt;/p>
&lt;p>مع انتشار أدوات المساعدة بالذكاء الاصطناعي مثل GitHub Copilot و Cursor، أو باستخدام واجهات برمجة التطبيقات (APIs) لنماذج LLM المختلفة، تحولت المهام الأساسية للمهندس من &amp;ldquo;كتابة التعليمات البرمجية من الصفر&amp;rdquo; إلى &amp;ldquo;تصميم التعليمات لجعل الذكاء الاصطناعي يُنشئ الكود المقصود، ثم مراجعة الكود المُنشأ ودمجه&amp;rdquo;.&lt;/p>
&lt;p>المهارة الأكثر أهمية في منهجية التطوير الجديدة هذه هي &lt;strong>هندسة التلقين (Prompt Engineering)&lt;/strong>. غالباً ما يُتحدث عن هندسة التلقين ككلمة طنانة لغير المهندسين تحت مسمى &amp;ldquo;الدردشة الجيدة مع الذكاء الاصطناعي&amp;rdquo;، ولكن جوهرها هو &lt;strong>شكل جديد من لغات البرمجة للأنظمة الحسابية غير الحتمية (Non-deterministic)&lt;/strong>.&lt;/p>
&lt;p>في هذه المقالة، نستهدف مهندسي البرمجيات ومعماريي الأنظمة، ونشرح بالتفصيل الممل في حوالي 10,000 حرف، بدءاً من الأسس الرياضية والمعمارية الكامنة وراء LLM، مروراً بتقنيات هندسة التلقين المتقدمة مثل Few-Shot و Chain-of-Thought و ReAct، وصولاً إلى سير عمل التطوير الفعلي وكيفية دمجها في واجهات برمجة التطبيقات (APIs).&lt;/p>
&lt;hr>
&lt;h2 id="1-أساسيات-النماذج-اللغوية-الكبيرة-llm-والخلفية-الرياضية">1. أساسيات النماذج اللغوية الكبيرة (LLM) والخلفية الرياضية
&lt;/h2>&lt;p>من أجل تحسين التلقين (Prompt) والحصول على المخرجات المقصودة بشكل مستقر، من الضروري فهم &amp;ldquo;ما بداخل الصندوق الأسود&amp;rdquo; بشكل رياضي وهيكلي، وكيف تقوم نماذج LLM بمعالجة النصوص والأكواد وتوليدها داخلياً. معظم نماذج LLM الحديثة هي نماذج لغوية ذاتية الانحدار (Auto-regressive) تستخدم بنية المحولات (Transformer).&lt;/p>
&lt;h3 id="11-التقسيم-إلى-رموز-tokenization-و-bpe">1.1 التقسيم إلى رموز (Tokenization) و BPE
&lt;/h3>&lt;p>نماذج LLM لا تعالج السلاسل النصية الخام مباشرة. بل يتم تقسيم النص إلى وحدات صغيرة تسمى &lt;strong>الرموز (Tokens)&lt;/strong>. تستخدم العديد من النماذج خوارزمية تُعرف باسم تشفير أزواج البايت (Byte-Pair Encoding - BPE).&lt;/p>
&lt;p>يُعد فهم التقسيم إلى رموز أمراً مهماً للمهندسين. وذلك لأن كيفية تقسيم المسافات البادئة (المسافات) والرموز الخاصة في لغات البرمجة تؤثر بشكل مباشر على جودة الكود المُنشأ. على سبيل المثال، في توليد كود Python، غالباً ما يُعامل عدد المسافات البيضاء (أربع مسافات أم علامة جدولة Tab) كرمز مستقل، وعدم توضيح قواعد المسافات البادئة في التلقين قد يكون سبباً في حدوث أخطاء في بناء الجملة (Syntax Errors).&lt;/p>
&lt;h3 id="12-التنبؤ-بالرمز-التالي-next-token-prediction">1.2 التنبؤ بالرمز التالي (Next Token Prediction)
&lt;/h3>&lt;p>المهمة الأساسية لنموذج LLM ذي الانحدار الذاتي هي التنبؤ بـ &amp;ldquo;الرمز التالي الأكثر احتمالاً&amp;rdquo; الذي يتبع تسلسل الإدخال المعطى (السياق). عند التعبير عن ذلك رياضياً، فإنه يصبح مسألة تعظيم الاحتمال الشرطي التالي:&lt;/p>
$$ P(w_t | w_{1}, w_{2}, \dots, w_{t-1}) $$
&lt;p>حيث يمثل $w_i$ الرمز، و $t$ هي الخطوة الزمنية الحالية. يحسب النموذج التوزيع الاحتمالي للرمز التالي من مجموعة الرموز المدخلة من خلال شبكته العصبية الداخلية. يُضاف الرمز المولد كمدخل للخطوة التالية بطريقة ذاتية الانحدار، وتتكرر هذه العملية حتى يتم إخراج رمز الانتهاء (مثل &lt;code>&amp;lt;EOS&amp;gt;&lt;/code>).&lt;/p>
&lt;h3 id="13-آلية-الانتباه-attention-mechanism-ونافذة-السياق">1.3 آلية الانتباه (Attention Mechanism) ونافذة السياق
&lt;/h3>&lt;p>جوهر بنية Transformer هو آلية الانتباه الذاتي (Self-Attention). يسمح هذا للنموذج بحساب التبعيات بين الرموز المتباعدة داخل التسلسل.&lt;/p>
$$ \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{Q K^T}{\sqrt{d_k}}\right) V $$
&lt;p>هنا، $Q$ (الاستعلام Query)، $K$ (المفتاح Key)، و $V$ (القيمة Value) هي مصفوفات تم إنشاؤها من تمثيل الإدخال، و $d_k$ هو عامل القياس. ما تعنيه هذه المعادلة هو عملية &amp;ldquo;حساب أي كلمة سابقة (المفتاح) يجب أن تركز عليها (انتباه) الكلمة التي تتم معالجتها حالياً (الاستعلام)، ودمج تلك المعلومات (القيمة)&amp;rdquo;.&lt;/p>
&lt;p>لماذا يُعد فهم هذه الآلية مهماً في هندسة التلقين؟ لأنه يرتبط ارتباطاً مباشراً بمفهوم &lt;strong>نافذة السياق (Context Window)&lt;/strong>. إذا كان تلقين الإدخال طويلاً جداً، فقد تُدفن التعليمات المهمة في منتصف السياق، وتتشتت أوزان الانتباه مما يؤدي إلى حدوث ظاهرة تسمى &amp;ldquo;الضياع في المنتصف (Lost in the middle)&amp;rdquo;. بدلاً من رمي مستندات أو قواعد برمجية ضخمة بأكملها في التلقين، يُطلب استخراج وتمرير الأجزاء (Chunks) الضرورية بدقة فقط.&lt;/p>
&lt;h3 id="14-التحكم-في-أخذ-العينات-باستخدام-معلمة-درجة-الحرارة-temperature">1.4 التحكم في أخذ العينات باستخدام معلمة درجة الحرارة (Temperature)
&lt;/h3>&lt;p>في طبقة الإخراج، تُستخدم عادةً دالة Softmax لتحويل اللوغاريتمات (Logits) (المخرجات الخام للنموذج) إلى توزيع احتمالي. هنا، يتم إدخال &lt;strong>درجة الحرارة (Temperature $T$)&lt;/strong> للتحكم في تنوع (عشوائية) التوليد.&lt;/p>
$$ p_i = \frac{\exp(z_i / T)}{\sum_j \exp(z_j / T)} $$
&lt;ul>
&lt;li>$z_i$ هي درجة اللوغاريتم (Score) للرمز $i$ في المفردات.&lt;/li>
&lt;li>عندما يكون $T = 1.0$، فإنه يمثل دالة Softmax القياسية.&lt;/li>
&lt;li>كلما اقتربت $T \to 0$، يصبح التوزيع الاحتمالي أكثر حدة، ويتم اختيار الرمز ذي الاحتمالية الأعلى فقط (حتمي، فك التشفير الجشع Greedy Decoding).&lt;/li>
&lt;li>عندما يكون $T > 1.0$، يصبح التوزيع الاحتمالي مسطحاً، وتزداد احتمالية اختيار رموز نادرة لا تُختار عادةً (تزداد الإبداعية).&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>نهج عملي للمهندسين:&lt;/strong>
عند إجراء توليد للكود أو استخراج بيانات JSON (Structured Output) عبر واجهة برمجة التطبيقات (API)، من المعتاد ضبط قيمة منخفضة جداً لـ $T=0.0 \sim 0.2$ لمنع الهلوسة (Hallucination) وزيادة قابلية التكرار. من ناحية أخرى، في المهام الاستكشافية مثل العصف الذهني للبنية المعمارية أو ابتكار أفكار لاصطلاحات التسمية، يتم ضبطها على $T=0.7 \sim 1.0$.&lt;/p>
&lt;hr>
&lt;h2 id="2-البنية-الهيكلية-للتلقين-system-prompt-مقابل-user-prompt">2. البنية الهيكلية للتلقين: System Prompt مقابل User Prompt
&lt;/h2>&lt;p>عند بناء تطبيقات الذكاء الاصطناعي باستخدام واجهات برمجة تطبيقات OpenAI (مثل GPT-4) أو Anthropic (مثل Claude)، لا يتم هيكلة التلقين ككتلة نصية واحدة، بل كمصفوفة من الرسائل. وأهم جزء في ذلك هو الفصل بين &amp;ldquo;التلقين النظامي (System Prompt)&amp;rdquo; و &amp;ldquo;تلقين المستخدم (User Prompt)&amp;rdquo;.&lt;/p>
&lt;h3 id="21-التلقين-النظامي-تعريف-القيود-العالمية-والشخصية">2.1 التلقين النظامي: تعريف القيود العالمية والشخصية
&lt;/h3>&lt;p>التلقين النظامي هو ما يحدد &lt;strong>القيود العالمية، والشخصية (الدور)، والقواعد الأساسية للسلوك&lt;/strong> لنموذج LLM. إذا شبهناه بتصميم البرمجيات، فهو يلعب دوراً مشابهاً لـ &amp;ldquo;متغيرات البيئة (Environment Variables)&amp;rdquo; أو &amp;ldquo;الفئة الأساسية (Base Class)&amp;rdquo; للتطبيق، أو &amp;ldquo;Dockerfile&amp;rdquo; للحاوية (Container).&lt;/p>
&lt;p>يعمل التلقين النظامي الممتاز على استقرار جودة وتنسيق المخرجات بشكل كبير.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"># مثال على التلقين النظامي (System Prompt)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">أنت مهندس Go رفيع المستوى (Senior Go Engineer) من الطراز العالمي، وخبير في تصميم المعالجة المتزامنة (Goroutine/Channel).
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">يرجى توليد الإجابات وفقاً للقواعد الصارمة التالية.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">【القواعد】
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1. عند تقديم الكود، يجب تقديمه دائماً كدالة كاملة قابلة للتنفيذ.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2. لا تتجاهل معالجة الأخطاء (Error Handling)، وعالجها بوضوح باستخدام `if err != nil` وفقاً لأعراف لغة Go.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">3. التفسيرات خارج كتل الكود يجب أن تكون في شكل نقاط، ولا تتجاوز 3 جمل.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">4. في حالة طُلب منك تنفيذ محفوف بالمخاطر الأمنية (مثل SQL Injection أو Race Condition)، قدم بديلاً آمناً.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">5. يجب أن يقتصر تنسيق الإخراج على الشروحات وكتل كود Markdown فقط.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="22-تلقين-المستخدم-المهام-المؤقتة-وحقن-البيانات">2.2 تلقين المستخدم: المهام المؤقتة وحقن البيانات
&lt;/h3>&lt;p>يوفر تلقين المستخدم مهاماً محددة أو أسئلة أو بيانات الإدخال المراد معالجتها. وهو يعادل &amp;ldquo;استدعاء الدالة (تمرير الوسائط للدالة)&amp;rdquo; الذي يتم تنفيذه داخل بيئة السياق المبنية بواسطة التلقين النظامي.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"># مثال على تلقين المستخدم (User Prompt)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">يرجى تنفيذ دالة تقوم بتنزيل الصور بشكل غير متزامن من قائمة كبيرة من عناوين URL وحفظها على القرص المحلي.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">اجعل عدد العمال (Workers) قابلاً للتحكم من خلال وسيطة (Argument)، وقم بتضمين معالجة انتهاء المهلة (Timeout) في التنفيذ باستخدام السياق (context.Context).
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>من خلال ضبط التلقين النظامي بقوة، يمكنك ضمان استقرار المخرجات ضد تلقينات المستخدم شديدة التغير التي يتم حقنها من قبل المستخدمين (أو المكونات الأخرى للنظام). كما أنه يعمل كخط دفاع أول ضد هجمات &amp;ldquo;حقن التلقين (Prompt Injection)&amp;rdquo; الناتجة عن مدخلات المستخدمين الضارة.&lt;/p>
&lt;hr>
&lt;h2 id="3-تقنيات-هندسة-التلقين-الأساسية">3. تقنيات هندسة التلقين الأساسية
&lt;/h2>&lt;p>من هنا، سنشرح النماذج التلقينية المحددة التي تعمل على تحسين دقة مهام تطوير البرمجيات بشكل كبير.&lt;/p>
&lt;h3 id="31-zero-shot-prompting-و-few-shot-prompting">3.1 Zero-Shot Prompting و Few-Shot Prompting
&lt;/h3>&lt;p>&lt;strong>Zero-Shot Prompting&lt;/strong> هو أسلوب يُطلب فيه من النموذج الإجابة من خلال إعطائه تعليمات المهمة فقط، دون تقديم أي أمثلة. بالنسبة للطلبات العامة مثل &amp;ldquo;اكتب خوارزمية الترتيب السريع (Quicksort) بلغة Python&amp;rdquo;، تعمل نماذج LLM المتقدمة الحالية بشكل جيد كفاية باستخدام Zero-Shot.&lt;/p>
&lt;p>ومع ذلك، إذا كنت ترغب في إجباره على اتباع اصطلاحات الترميز الخاصة بمشروعك، أو إذا كنت تريد منه إخراج مخطط JSON محدد، فإن احتمال خروج التنسيق عن السيطرة يرتفع مع Zero-Shot. ما يحل هذه المشكلة هو &lt;strong>Few-Shot Prompting&lt;/strong>.&lt;/p>
&lt;p>Few-Shot Prompting هو أسلوب يتم فيه تقديم بعض &amp;ldquo;أزواج الإدخال والمخرجات المتوقعة (أمثلة توضيحية)&amp;rdquo; داخل التلقين. وهو يستفيد من ظاهرة تسمى &amp;ldquo;التعلم داخل السياق (In-Context Learning)&amp;rdquo; حيث يتعلم النموذج الأنماط داخل سياق التلقين دون تحديث معلماته (Parameters).&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"># مثال على Few-Shot Prompting (مهمة تحليل السجلات)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">يرجى تحليل السجلات الخام (Raw Logs) التالية واستخراج كائنات JSON المهيكلة.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">مثال 1:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">الإدخال: &amp;#34;[2023-10-01 10:00:05] ERROR [AuthService] Failed to authenticate user id=12345: Invalid password&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">المخرجات: {&amp;#34;timestamp&amp;#34;: &amp;#34;2023-10-01T10:00:05Z&amp;#34;, &amp;#34;level&amp;#34;: &amp;#34;ERROR&amp;#34;, &amp;#34;service&amp;#34;: &amp;#34;AuthService&amp;#34;, &amp;#34;message&amp;#34;: &amp;#34;Failed to authenticate user&amp;#34;, &amp;#34;user_id&amp;#34;: 12345}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">مثال 2:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">الإدخال: &amp;#34;[2023-10-01 10:05:12] WARN [DBPool] Connection timeout approaching for query_id=987&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">المخرجات: {&amp;#34;timestamp&amp;#34;: &amp;#34;2023-10-01T10:05:12Z&amp;#34;, &amp;#34;level&amp;#34;: &amp;#34;WARN&amp;#34;, &amp;#34;service&amp;#34;: &amp;#34;DBPool&amp;#34;, &amp;#34;message&amp;#34;: &amp;#34;Connection timeout approaching&amp;#34;, &amp;#34;query_id&amp;#34;: 987}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">إدخال المهمة:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">الإدخال: &amp;#34;[2023-10-01 10:15:30] FATAL [PaymentGateway] API rate limit exceeded. Retry after 60s&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">المخرجات:
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>من خلال تقديم الأمثلة بهذه الطريقة، يتعلم النموذج ضمنياً تنسيق &lt;code>timestamp&lt;/code> (التحويل إلى ISO 8601)، وقواعد تسمية المفاتيح، وسيقوم بإخراج JSON مثالي.&lt;/p>
&lt;h3 id="32-chain-of-thought-cot-و-zero-shot-cot">3.2 Chain-of-Thought (CoT) و Zero-Shot CoT
&lt;/h3>&lt;p>كان &lt;strong>Chain-of-Thought (CoT: سلسلة الأفكار)&lt;/strong> بمثابة اختراق كبير فيما يتعلق بقدرات الاستدلال لنماذج LLM. في المهام التي تتطلب منطقاً معقداً (مثل: تنفيذ خوارزميات معقدة، تتبع أخطاء برمجية غامضة، بناء تعبيرات نمطية، إلخ)، إذا تركت نموذج LLM يُخرج الكود النهائي فجأة، فمن المرجح أن تحدث قفزات منطقية أو أخطاء (هلوسة).&lt;/p>
&lt;p>CoT هو أسلوب يجعل النموذج يعبر لفظياً عن عملية الاستدلال المتوسطة (عملية التفكير) قبل إخراج الإجابة النهائية. من خلال جعل النموذج يحلل الموقف خطوة بخطوة بنفسه، يصبح السياق أغنى مع كل رمز (Token) يتم إنشاؤه، مما يحسن من دقة الاستنتاج النهائي بشكل جذري.&lt;/p>
&lt;p>التقنية الأبسط والأقوى هي &lt;strong>Zero-Shot CoT&lt;/strong>، والتي تضيف الكلمات السحرية &amp;ldquo;&lt;strong>دعنا نفكر خطوة بخطوة (Let&amp;rsquo;s think step by step)&lt;/strong>&amp;rdquo; في نهاية التلقين.&lt;/p>
&lt;p>في التطوير، يتم تطبيق هذا المفهوم وهيكلة التلقين على النحو التالي:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;span class="lnt">9
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">يرجى إنشاء مكون React (React Component) يفي بالمواصفات التالية.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">【المواصفات】...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">قبل إنشاء الكود، يرجى كتابة عملية التفكير (داخل علامات &amp;lt;thinking&amp;gt;) بالخطوات التالية:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1. تحديد الحالة (State) المطلوبة وتصميم بنية البيانات
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2. دراسة الحالات الحدية (Edge Cases) التي قد تحدث وكيفية معالجة الأخطاء
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">3. دراسة وحدة تقسيم المكونات
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">بعد اكتمال عملية التفكير، يرجى كتابة كود TypeScript النهائي.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="mermaid">graph TD
A["تلقين المستخدم: تعريف المتطلبات المعقدة"] --> B["بدء عملية الاستدلال لـ LLM"]
B --> C["الخطوة 1: التقسيم المنطقي للمتطلبات"]
C --> D["الخطوة 2: تصميم بنية البيانات والأنواع"]
D --> E["الخطوة 3: اختيار الخوارزمية وتقييم التعقيد الحسابي"]
E --> F["الخطوة 4: دراسة حالات الزوايا (Corner Cases) والأمان"]
F --> G["توليد الكود النهائي المُحسّن"]&lt;/div>
&lt;h3 id="33-tree-of-thoughts-tot">3.3 Tree of Thoughts (ToT)
&lt;/h3>&lt;p>امتداد لمفهوم CoT هو &lt;strong>Tree of Thoughts (ToT)&lt;/strong>. في حين أن CoT يتبع مسار استدلالي ذو اتجاه واحد (خطي)، فإن ToT يقوم بتوسيع مسارات استدلالية (فروع) متعددة بالتوازي مثل شجرة البحث، ويجعل النموذج يُقيّم كل مسار ذاتياً، ويتراجع (Backtrack) للوصول إلى الحل الأمثل.&lt;/p>
&lt;p>تُعد تقنية ToT فعالة جداً في المشكلات التي تكون فيها مساحة البحث واسعة والتي يسهل الوقوع فيها في التحسين المحلي (Local Optima)، مثل تصميم بنية النظام (System Architecture)، تصميم مخطط قاعدة بيانات معقد، أو خطط إعادة هيكلة كود واسعة النطاق (Refactoring).&lt;/p>
&lt;div class="mermaid">graph TD
Root["المشكلة الأولية: استراتيجية التقسيم من بنية متجانسة (Monolith) إلى خدمات مصغرة (Microservices)"]
Root --> Path1["مسار التفكير A: التقسيم القائم على التصميم الموجه بالمجال (DDD)"]
Root --> Path2["مسار التفكير B: التقسيم حسب جداول قاعدة البيانات"]
Root --> Path3["مسار التفكير C: التقسيم بناءً على حركة المرور / الحمل (Traffic/Load)"]
Path1 --> Eval1["التقييم الذاتي: يمكن الحصول على تماسك عالٍ، لكن تكلفة النمذجة في مراحل التطوير الأولى كبيرة."]
Path2 --> Eval2["التقييم الذاتي: التنفيذ سهل، ولكن هناك خطر كبير من زيادة درجة الارتباط بين الخدمات في المستقبل."]
Path3 --> Eval3["التقييم الذاتي: يمكن ضمان قابلية التوسع، لكن إدارة المعاملات (Transactions) ستصبح معقدة."]
Eval1 --> Select["القرار: التركيز على قابلية الصيانة على المدى الطويل، واعتماد المسار A (المبني على DDD)."]
Eval2 --> Discard1["مرفوض"]
Eval3 --> Discard2["مرفوض"]
Select --> Detail["بناءً على الاستراتيجية المعتمدة، سيتم إخراج مقترح محدد لتقسيم الخدمات وتصميم واجهة برمجة التطبيقات (API)."]&lt;/div>
&lt;p>لتنفيذ ToT من خلال التلقين، نوجه التعليمة كالتالي: &amp;ldquo;يرجى اقتراح أساليب متعددة، وتقييم مزايا وعيوب كل منها، ثم اعتماد وتنفيذ الأسلوب الأفضل.&amp;rdquo;&lt;/p>
&lt;hr>
&lt;h2 id="4-سير-العمل-الوكيلي-agentic-workflow-و-react-الاستدلال-والتصرف">4. سير العمل الوكيلي (Agentic Workflow) و ReAct (الاستدلال والتصرف)
&lt;/h2>&lt;p>يتطور تطبيق نماذج LLM بسرعة من مجرد إدخال وإخراج للنصوص الفردية، إلى مجال &lt;strong>وكلاء الذكاء الاصطناعي (AI Agents)&lt;/strong> الذين يخططون بشكل مستقل وينفذون المهام أثناء التفاعل مع البيئة الخارجية. النموذج الأساسي الذي يشكل جوهر هذه البنية الوكيلة هو &lt;strong>ReAct (Reasoning and Acting)&lt;/strong>.&lt;/p>
&lt;h3 id="41-مفهوم-إطار-عمل-react">4.1 مفهوم إطار عمل ReAct
&lt;/h3>&lt;p>نماذج LLM التقليدية يمكنها &amp;ldquo;التفكير قبل الإجابة (CoT)&amp;quot;، ولكن لا يمكنها &amp;ldquo;اتخاذ إجراء&amp;rdquo; لتعويض النقص في معرفتها. يخترق إطار عمل ReAct هذا القيد من خلال جعل LLM يتناوب بين &amp;ldquo;التفكير (Thought)&amp;rdquo; و &amp;ldquo;الفعل (Action)&amp;rdquo;.&lt;/p>
&lt;p>يحلل النموذج المشكلة (Thought)، وإذا حدد أن المعلومات غير كافية، فإنه ينفذ أداة خارجية (بحث ويب، استعلام قاعدة بيانات، أمر Shell، استدعاء API، وما إلى ذلك) (Action). يتلقى نتيجة تنفيذ الأداة (Observation)، ويستخدمها كسياق جديد لمزيد من التفكير، ويكرر هذه الحلقة حتى يصل إلى الإجابة النهائية (Finish).&lt;/p>
&lt;div class="mermaid">graph LR
Start["بدء المهمة"] --> Thought["Thought (تحليل الموقف والتخطيط)"]
Thought --> Action["Action (اختيار الأداة المناسبة وتنفيذها)"]
Action --> Environment["البيئة الخارجية (API / DB / Shell / Code Interpreter)"]
Environment --> Observation["Observation (نتيجة التنفيذ من الأداة / سجل الأخطاء)"]
Observation --> Thought
Thought -->|تم جمع معلومات كافية| Finish["Finish (المخرجات النهائية للإجابة أو الكود)"]&lt;/div>
&lt;h3 id="42-التنفيذ-من-خلال-استدعاء-الدوال-function-calling">4.2 التنفيذ من خلال استدعاء الدوال (Function Calling)
&lt;/h3>&lt;p>الواجهة القياسية لدمج ReAct في الأنظمة هي &lt;strong>Function Calling (استدعاء الدوال / استخدام الأدوات)&lt;/strong> التي توفرها شركات مثل OpenAI و Anthropic.&lt;/p>
&lt;p>يمرر المهندسون لنموذج LLM &amp;ldquo;تعريفاً لمجموعة الأدوات المتاحة (مخطط JSON)&amp;rdquo; جنباً إلى جنب مع التلقين النظامي. يحلل LLM سياق التلقين، وإذا قرر أنه يجب استخدام أداة، فإنه يُخرج &amp;ldquo;اسم الدالة المراد استدعاؤها&amp;rdquo; و &amp;ldquo;متغيرات JSON لتلك الدالة&amp;rdquo; بدلاً من النص العادي. يتم تنفيذ الدالة على جانب التطبيق، وتُعاد النتيجة إلى LLM، مما يُشكل حلقة مغلقة.&lt;/p>
&lt;p>&lt;strong>أمثلة على التطبيق في التطوير (وكيل تصحيح أخطاء مستقل):&lt;/strong>
عند بناء وكيل (Agent) يحقق في سبب فشل الاختبارات في مسار CI/CD وينشئ تصحيحاً (Patch)، يتم تزويد LLM بالأدوات التالية:&lt;/p>
&lt;ol>
&lt;li>&lt;code>search_codebase(regex_pattern)&lt;/code>: يبحث في الأكواد الموجودة في المستودع (Repository) باستخدام التعبيرات النمطية.&lt;/li>
&lt;li>&lt;code>view_file_content(file_path, start_line, end_line)&lt;/code>: يقرأ محتويات ملف محدد.&lt;/li>
&lt;li>&lt;code>run_unit_test(test_file_path)&lt;/code>: يشغل اختبار وحدة (Unit Test) محدد ويحصل على تتبع الأخطاء (Traceback).&lt;/li>
&lt;li>&lt;code>propose_patch(file_path, diff_content)&lt;/code>: يقترح تصحيحاً للإصلاح.&lt;/li>
&lt;/ol>
&lt;p>يستنتج LLM ويتصرف بشكل مستقل على النحو التالي:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Thought&lt;/strong>: بالنظر إلى سجل الاختبار، حدث خطأ &lt;code>KeyError: 'user_id'&lt;/code> في السطر 45 من الملف &lt;code>src/auth.py&lt;/code>. يجب التحقق من الكود المحيط به.&lt;/li>
&lt;li>&lt;strong>Action&lt;/strong>: &lt;code>view_file_content(file_path=&amp;quot;src/auth.py&amp;quot;, start_line=30, end_line=60)&lt;/code>&lt;/li>
&lt;li>&lt;strong>Observation&lt;/strong>: (يقرأ التطبيق محتويات الملف ويعيدها إلى LLM)&lt;/li>
&lt;li>&lt;strong>Thought&lt;/strong>: فهمت، التحقق من الصحة (Validation) للحالة التي لا يتضمن فيها JSON لرد الـ API المفتاح &lt;code>user_id&lt;/code> مفقود. سأقوم بإنشاء تصحيح يعيد كتابته باستخدام طريقة &lt;code>.get()&lt;/code> الآمنة.&lt;/li>
&lt;li>&lt;strong>Action&lt;/strong>: &lt;code>propose_patch(...)&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>بهذه الطريقة، يتم رفع مستوى هندسة التلقين من &amp;ldquo;التحكم في توليد النص&amp;rdquo; إلى بعد &amp;ldquo;تعريف الأدوات وتصميم حلقة الوكيل (التنسيق Orchestration)&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h2 id="5-التوليد-المعزز-بالاسترجاع-rag-وتكامله-مع-قواعد-الأكواد">5. التوليد المعزز بالاسترجاع (RAG) وتكامله مع قواعد الأكواد
&lt;/h2>&lt;p>أحد أكبر نقاط الضعف في نماذج LLM هو أنها لا تعرف &amp;ldquo;المعلومات الخاصة&amp;rdquo; أو &amp;ldquo;أحدث المعلومات&amp;rdquo; التي لم يتم تضمينها في بيانات التدريب المسبق. إذا سألتها عن مستودع خاص داخلي في الشركة أو عن مواصفات API مخصصة، فإن LLM سيهلوس بكل هدوء أو سيقدم إجابات عامة فقط.&lt;/p>
&lt;p>البنية المعمارية التي تحل هذه المشكلة هي &lt;strong>RAG (التوليد المعزز بالاسترجاع - Retrieval-Augmented Generation)&lt;/strong>. يعتبر RAG تقنية تجمع بين استرجاع المعلومات (Retrieval) وقدرة التوليد (Generation) لـ LLM.&lt;/p>
&lt;h3 id="51-التضمينات-embeddings-والبحث-المتجهي">5.1 التضمينات (Embeddings) والبحث المتجهي
&lt;/h3>&lt;p>أساس RAG هو نموذج الفضاء المتجهي الرياضي (Vector Space Model). يتم تحويل الكود المصدري والمستندات الداخلية إلى متجهات عالية الأبعاد (على سبيل المثال، مصفوفة من أرقام الفاصلة العائمة المكونة من 1536 بُعداً) بواسطة نموذج تضمين (Embedding Model) (مثل &lt;code>text-embedding-3-small&lt;/code>) ويتم تخزينها في قاعدة بيانات موجهة (Vector Database).&lt;/p>
&lt;p>عندما يقوم المستخدم بإدخال سؤال (استعلام)، يتم أيضاً تحويل الاستعلام إلى متجهات باستخدام نفس النموذج، ويتم حساب &lt;strong>تشابه جيب التمام (Cosine Similarity)&lt;/strong> بينه وبين متجهات المستندات الموجودة في قاعدة البيانات.&lt;/p>
$$ \text{Cosine Similarity}(A, B) = \frac{A \cdot B}{\|A\| \|B\|} = \frac{\sum_{i=1}^{n} A_i B_i}{\sqrt{\sum_{i=1}^{n} A_i^2} \sqrt{\sum_{i=1}^{n} B_i^2}} $$
&lt;p>يتم استرداد مقتطفات التعليمات البرمجية أو المستندات القليلة الأولى التي تحتوي على تشابه عالٍ (قريبة دلالياً)، ويتم حقنها ديناميكياً في تلقين المستخدم على أنها &amp;ldquo;سياق&amp;rdquo;.&lt;/p>
&lt;h3 id="52-تطبيق-rag-في-سير-عمل-التطوير">5.2 تطبيق RAG في سير عمل التطوير
&lt;/h3>&lt;p>من خلال دمج RAG في أدوات التطوير، يمكن تحقيق وظائف قوية داخل بيئة التطوير المتكاملة (IDE) كما يلي:&lt;/p>
&lt;div class="mermaid">sequenceDiagram
participant Engineer["المهندس"]
participant RAG_System["إضافة IDE (RAG)"]
participant VectorDB["Vector Database (قاعدة بيانات الأكواد)"]
participant LLM["LLM API"]
Engineer->>RAG_System: "أين يتم تنفيذ معالجة التراجع (Rollback) للمعاملات في تدفق الدفع الحالي؟"
RAG_System->>VectorDB: "تحويل الاستعلام إلى متجهات وتنفيذ بحث دلالي"
VectorDB-->>RAG_System: "مقتطفات التعليمات البرمجية ذات الصلة (مثل payment_service.go, db_tx.go)"
RAG_System->>LLM: "التلقين النظامي + مقتطفات الكود المسترجعة + سؤال المهندس"
LLM-->>RAG_System: "شرح دقيق وتحليل هيكلي بناءً على الكود المستخرج"
RAG_System-->>Engineer: "تقديم الإجابة مع روابط للأسطر المقابلة في الكود المصدري"&lt;/div>
&lt;p>كأسلوب مهم لهندسة التلقين عند بناء RAG لقواعد الأكواد البرمجية، بالإضافة إلى تقسيم الكود ببساطة، فإن تضمين &amp;ldquo;الملخصات التي تم إنشاؤها من سلاسل التوثيق (Docstrings) لكل دالة أو أشجار البنية المجردة (AST) للفئات&amp;rdquo; في المتجهات، يؤدي إلى تحسين دقة البحث بشكل كبير.&lt;/p>
&lt;hr>
&lt;h2 id="6-حالات-الاستخدام-العملية-وأمثلة-التلقين-المتقدمة-في-الهندسة">6. حالات الاستخدام العملية وأمثلة التلقين المتقدمة في الهندسة
&lt;/h2>&lt;p>سنقدم حالات استخدام عملية وتقنيات التلقين حول كيفية تطبيق نظرية هندسة التلقين لأتمتة وتسهيل مهام التطوير اليومية.&lt;/p>
&lt;h3 id="61-أتمتة-مراجعة-الأكواد-واستكمال-التحليل-الثابت">6.1 أتمتة مراجعة الأكواد واستكمال التحليل الثابت
&lt;/h3>&lt;p>يتم دمج LLM في مسار التكامل المستمر (CI)، ويُطلب منه إجراء مراجعة تلقائية للكود عند إنشاء طلب سحب (Pull Request - PR). الغرض من ذلك هو الإشارة إلى التناقضات في منطق الأعمال أو الأنماط المضادة (Anti-patterns) في التصميم والتي لا يمكن لأدوات Lint أو أدوات التحليل الثابت اكتشافها.&lt;/p>
&lt;p>&lt;strong>مثال على التلقين (طلب مخرجات منظمة):&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">أنت مهندس برمجيات رفيع المستوى (Senior Software Engineer) صارم وذو خبرة.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">يرجى تحليل فروق طلب السحب المقدمة (Git Diff) وإجراء مراجعة للكود.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">【مجالات التركيز في المراجعة】
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1. الثغرات الأمنية (الحقن Injection، XSS، تجاوز التفويض، إلخ)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2. اختناقات الأداء (مشكلة N+1 استعلام، الحسابات المتكررة غير الفعالة، إلخ)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">3. قابلية الصيانة والقراءة (انتهاك مبادئ SOLID، التداخل المعقد للغاية، إلخ)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">【القيود】
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- لا تشر إلى مجرد انتهاكات التنسيق (مثل المسافات البادئة) لأن ذلك دور أدوات Lint.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- إذا لم تكن هناك مشكلة، فلا تجبر نفسك على العثور على أخطاء، وأعد مصفوفة فارغة.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- يجب أن تتبع المخرجات دائماً مخطط JSON التالي. لا تقم بتغليفها بعلامات الاقتباس المائلة لـ Markdown (```json).
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">【تنسيق إخراج JSON المتوقع】
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;review_comments&amp;#34;: [
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;file_path&amp;#34;: &amp;#34;string&amp;#34;,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;line_number&amp;#34;: &amp;#34;integer&amp;#34;,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;severity&amp;#34;: &amp;#34;High | Medium | Low&amp;#34;,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;issue_title&amp;#34;: &amp;#34;string&amp;#34;,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;detailed_description&amp;#34;: &amp;#34;string&amp;#34;,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;#34;suggested_code_fix&amp;#34;: &amp;#34;string&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> }
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[Git Diff Data]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{{PR_DIFF}}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>النقاط الأساسية في هذا التلقين هي إجبار LLM على إخراج JSON الذي يسهل تحليله برمجياً (Parse)، والفصل الواضح بين دور أدوات Lint ودور LLM (تعريف حدود النظام).&lt;/p>
&lt;h3 id="62-التلقين-الدفاعي-defensive-prompting-أثناء-التوليد-الصفري-للأكواد-zero-shot">6.2 &amp;ldquo;التلقين الدفاعي (Defensive Prompting)&amp;rdquo; أثناء التوليد الصفري للأكواد (Zero-shot)
&lt;/h3>&lt;p>من المشكلات الشائعة عند جعل الذكاء الاصطناعي يكتب الكود هي &amp;ldquo;استيراد (import) مكتبات غير موجودة (هلوسة) من تلقاء نفسه&amp;rdquo; أو &amp;ldquo;تخطي تعريفات المتغيرات الضرورية (يتم اختصارها بـ &lt;code># اكتب المعالجة هنا&lt;/code>)&amp;rdquo;. لمنع ذلك، نستخدم &amp;ldquo;التلقين الدفاعي&amp;rdquo; الذي يضع حواجز حماية قوية داخل التلقين.&lt;/p>
&lt;p>&lt;strong>العناصر المهمة في التلقين الدفاعي:&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>&lt;strong>حظر الاختصار:&lt;/strong> &amp;ldquo;لا تختصر الكود أو تستخدم عناصر نائبة (مثل &lt;code>// ...&lt;/code>)، وقم بإنشاء ملف كامل يمكن نسخه ولصقه وتشغيله كما هو.&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>منع الهلوسة:&lt;/strong> &amp;ldquo;إذا لم تكن هناك مكتبة قياسية تلبي المتطلبات، فلا تخترع مكتبات جهات خارجية غير موجودة. في هذه الحالة، اقترح كوداً يستخدم المكتبات الأكثر قياسية (مثل: requests) مع توضيح أنه يجب تثبيت مكتبة خارجية.&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>متطلب الاكتفاء الذاتي:&lt;/strong> &amp;ldquo;يجب تعريف جميع المتغيرات والدوال بشكل صحيح داخل كتلة الكود.&amp;rdquo;&lt;/li>
&lt;/ol>
&lt;h3 id="63-التوليد-التلقائي-للاختبارات-القائمة-على-الخصائص--اختبارات-الحالات-الحدية-edge-cases">6.3 التوليد التلقائي للاختبارات القائمة على الخصائص / اختبارات الحالات الحدية (Edge Cases)
&lt;/h3>&lt;p>بالنسبة للدوال التي ينفذها المهندسون، يُطلب من LLM العثور على الحالات الطرفية (Corner Cases) وتوليد أكواد الاختبار لها. هذا فعال جداً في القضاء على الافتراضات البشرية الخاطئة.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">تقوم دالة Python التالية بتحديد ما إذا كانت السلسلة النصية المعطاة عنوان IPv4 صالحاً أم لا.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">يرجى كتابة مجموعة اختبارات وحدة شاملة تعتمد على pytest لهذه الدالة.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">【الشروط】
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- لا تقتصر على حالات الاختبار العادية، بل قم بتغطية الحالات الحدية (Edge Cases) التالية بشكل شامل:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - القيم الحدية (0، 255، 256، إلخ)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - مدخلات بأنواع مختلفة (عدد صحيح، None، قائمة، إلخ)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - سلاسل نصية تحتوي على مسافات أو أحرف خاصة
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - الحالات التي يكون فيها عدد النقاط غير صحيح (أقل من 3، أو 4 فأكثر)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- استخدم الاختبارات المعلمية (Parameterized Tests) (`@pytest.mark.parametrize`) للحفاظ على كود الاختبار موجزاً.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[كود الدالة]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">def is_valid_ipv4(ip_str):
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> # التنفيذ...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h2 id="7-تقييم-التلقينات-وعمليات-تشغيل-llm-llmops-و-eval">7. تقييم التلقينات وعمليات تشغيل LLM (LLMOps و Eval)
&lt;/h2>&lt;p>في عالم هندسة البرمجيات، يسمى الكود الذي لم يتم اختباره بالكود القديم (Legacy Code). يمكن قول الشيء نفسه تماماً في هندسة التلقين. إن نشر &amp;ldquo;تلقين تمت تجربته يدوياً بضع مرات وعمل بشكل جيد&amp;rdquo; في بيئة الإنتاج أمر في غاية الخطورة.&lt;/p>
&lt;p>بسبب ترقيات إصدار النماذج الأساسية، أو التغييرات في بيانات المجال (Domain Data) المعالجة، يمكن أن ينكسر سلوك التلقين بسهولة. لمنع ذلك، من الضروري بناء نظام &lt;strong>تقييم (Evaluation - Eval)&lt;/strong> (LLMOps) لتقييم مخرجات التلقين كمياً.&lt;/p>
&lt;h3 id="71-llm-as-a-judge-تقييم-llm-بواسطة-llm">7.1 LLM-as-a-Judge (تقييم LLM بواسطة LLM)
&lt;/h3>&lt;p>في مهام مثل توليد الأكواد وتلخيص النصوص، يستحيل إجراء اختبار المطابقة التامة (Exact Match). ومقاييس التقييم الكلاسيكية لمعالجة اللغات الطبيعية (مثل BLEU و ROUGE) ليست قوية بما يكفي لقياس الدقة الدلالية.&lt;/p>
&lt;p>المعيار الحالي في الصناعة هو نهج &lt;strong>LLM-as-a-Judge&lt;/strong>، الذي يستخدم نموذجاً قوياً (مثل GPT-4o أو Claude 3.5 Sonnet) كـ &amp;ldquo;قاضٍ (Judge)&amp;rdquo; لتقييم المخرجات التي أنتجها نموذج LLM المستهدف.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>تجهيز مجموعة الاختبار (Test Set)&lt;/strong>: قم بإعداد العشرات إلى المئات من أزواج بيانات الإدخال والمخرجات المثالية (أو معايير التقييم).&lt;/li>
&lt;li>&lt;strong>التنفيذ&lt;/strong>: اجعل التلقين والنموذج المستهدفين بالتقييم يولدون مخرجات لمجموعة الاختبار.&lt;/li>
&lt;li>&lt;strong>التقييم&lt;/strong>: قم بإعداد تلقين للتقييم (Meta-prompt)، ووجه القاضي LLM قائلاً: &amp;ldquo;هل تفي المخرجات المولدة بالمتطلبات؟ قم بتقييمها من 1 إلى 5 درجات&amp;rdquo;.&lt;/li>
&lt;/ol>
&lt;p>يتيح هذا إمكانية الاكتشاف التلقائي للتراجع في الأداء (Regression) عند تعديل التلقين في مسار CI/CD. لقد تطورت هندسة التلقين من &amp;ldquo;العبث بالتلقينات&amp;rdquo; كحرفة يدوية، إلى &amp;ldquo;هندسة (Engineering)&amp;rdquo; قابلة للتكرار وتعتمد على البيانات.&lt;/p>
&lt;hr>
&lt;h2 id="8-الخاتمة-التلقين-هو-المكون-الجديد-في-البرمجيات">8. الخاتمة: التلقين هو المكون الجديد في البرمجيات
&lt;/h2>&lt;p>في عصر يكتب فيه الذكاء الاصطناعي الأكواد، أحياناً يصرخ البعض بـ &amp;ldquo;نهاية البرمجة&amp;rdquo;، لكن الواقع مختلف تماماً. كل ما في الأمر أن مستوى التجريد المطلوب من المهندسين قد ارتفع درجة واحدة.&lt;/p>
&lt;p>في الماضي، من خلال الانتقال من لغة التجميع (Assembly) إلى لغة C، ثم إلى لغات المستوى العالي المزودة بميزة جمع القمامة (Garbage Collection)، تحررنا من متاعب إدارة الذاكرة وأصبح بإمكاننا التركيز على بناء منطق أعمال أكثر تعقيداً. تعد نماذج LLM وهندسة التلقين الموجة التالية من التجريد التي تلي ذلك.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>فهم البنية المعمارية&lt;/strong>: فهم الطبيعة الاحتمالية لنماذج LLM (الانحدار الذاتي، Attention، Temperature) والتحكم في عدم حتمية النظام.&lt;/li>
&lt;li>&lt;strong>تصميم السياق&lt;/strong>: إيصال النوايا بوضوح من خلال القيود المفروضة بواسطة System Prompt، والاستفادة من Few-Shot/CoT.&lt;/li>
&lt;li>&lt;strong>التفكير الوكيلي وتكامل الأدوات&lt;/strong>: الاستفادة الكاملة من نموذج ReAct، واستخدام LLM كمنسق (Orchestrator) للنظام.&lt;/li>
&lt;li>&lt;strong>التقييم المستمر&lt;/strong>: إدارة إصدارات التلقينات كجزء من الكود، ومواصلة التحسين القائم على الاختبار من خلال Eval.&lt;/li>
&lt;/ol>
&lt;p>من خلال إتقان هذه المبادئ، يصبح التلقين أكثر من مجرد سلسلة نصية؛ بل يصبح مكوناً برمجياً قوياً وقابلاً للتوسع. نأمل أن تقوم بدمج تقنيات هندسة التلقين المتقدمة المشروحة في هذه المقالة في سير عملك البرمجي ومنتجاتك، وأن تزدهر كمهندس يقود الجيل القادم من &amp;ldquo;البرمجيات 3.0&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;p>&lt;em>تم الإنشاء باستخدام تقنيات هندسة التلقين.&lt;/em>&lt;/p></description></item></channel></rss>