أساسيات النماذج اللغوية للمختبِرين

النموذج اللغوي الكبير (Large Language Model – LLM) نموذج دُرِّب على كمية ضخمة من النصوص ليتنبأ بالرمز (Token) التالي، ثم دُرِّب بعد ذلك على اتباع التعليمات. ويرسل إليه التطبيق طلباً واحداً يحتوي التعليمات والمحادثة حتى الآن، وغالباً أوصاف أدوات يمكنه استخدامها. ثم يكتب النموذج إجابته رمزاً رمزاً، ويُختار كل رمز من بين تتمّات محتملة، حتى يتوقف أو يبلغ حدّاً للطول.

مثال: يتلقى مساعد الدعم في متجر إلكتروني الرسالة «أين طلبي رقم ⁦5521⁩؟». فيرسل التطبيق موجّه النظام والرسالة وتعريف أداة اسمها get_order_status. لا يبحث النموذج عن شيء بنفسه، بل يعيد طلباً لاستدعاء الأداة مع رقم الطلب. فيُجري التطبيق البحث، ويضيف النتيجة، ويرسل طلباً ثانياً، وعندها فقط يكتب النموذج الإجابة التي يراها العميل.

لماذا يهم

كل آلية من هذه الآليات مصدر للعيوب. فأخذ العيّنات (Sampling) يجعل المدخل نفسه يعطي إجابات مختلفة، ونافذة السياق (Context window) تحدد ما يراه النموذج، وحدود المخرجات تقطع الإجابات، وموجّه النظام نص لا قاعدة مُلزِمة، واستدعاء الأداة يحوّل النص المولَّد إلى فعل. والمختبِر الذي لا يعرف ذلك إما أن يكتب اختبارات مطابقة حرفية تفشل عشوائياً، وإما أن يقبل عبارة «الذكاء الاصطناعي هكذا» فيمرّر عيوباً حقيقية.

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

الرموز ونافذة السياق

يقسم مقسِّم الرموز (Tokenizer) النص كله إلى رموز: كلمات شائعة، وأجزاء من كلمات أطول، وأجزاء من أرقام، وعلامات ترقيم. وتختلف مقسِّمات الرموز بين عائلات النماذج، فقد يعطي النص نفسه أعداداً مختلفة في نماذج مختلفة، وقد تستهلك الجملة بالعربية أو الهندية رموزاً أكثر منها بالإنجليزية. والحدود والتكلفة تُحسب بالرموز، ويطول زمن الاستجابة بزيادة الرموز المولَّدة، فاستخدم أداة عدّ الرموز لدى المزوّد أو الاستهلاك الذي تُبلغ عنه الواجهة البرمجية بدلاً من التقدير من عدد الأحرف.

نافذة السياق هي أقصى عدد من الرموز يستطيع النموذج التعامل معه في طلب واحد، وتشمل عادةً المدخلات والمخرجات معاً. ويجب أن يتسع لها كل ما يعرفه النموذج عن الموقف: موجّه النظام، وتعريفات الأدوات، والمحادثة، والمستندات المسترجَعة، ونتائج الأدوات، ومساحة الإجابة. والنموذج لا يتذكر شيئاً بين الطلبات؛ فالمحادثة تبدو وكأنها تتذكر فقط لأن الرسائل السابقة تُرسَل من جديد مع كل طلب، والتطبيق هو الذي يرسلها عادةً.

حين تتجاوز المحادثة النافذة، يقتطعها التطبيق أو يلخّصها، وإلا فشل الطلب، وقد تضيع تعليمة أو رقم طلب ذُكر في البداية. والحد الأقصى لرموز المخرجات (Max output tokens) حدّ منفصل: فالإجابة التي تبلغه تنقطع، وكثيراً ما يحدث ذلك في منتصف الجملة، ويذكر ذلك سبب التوقف (Stop reason) في الاستجابة. وكلا الحدّين قيمة حدّية، فطبّق عليهما تحليل القيم الحدّية، وبمدخلات طويلة بالعربية والهندية أيضاً؛ ويساعدك نص حشو مولَّد تقيسه بأداة String Length Counter على تكبير المدخل خطوة بخطوة.

Illustrative split (every tokenizer differs):
  "Where is my order 5521?"  ->  Where| is| my| order| 55|21|?   (7 tokens)

Context budget for one request (example model with a 16,000-token window)
  System prompt                            1,200
  Tool definitions (3 tools)                 900
  Conversation so far (18 messages)       11,500
  New customer message                       400
  Reserved for the answer (max output)     2,000
  Total                                   16,000   <- window full

جرّبها: عدّاد طول السلاسل النصية جرّبها: مولّد Lorem Ipsum

كيف يُختار الرمز التالي: درجة الحرارة وأخذ العيّنات

في كل خطوة يعطي النموذج كل رمز في مفرداته احتمالاً لأن يكون التالي. ويُسمّى أخذ الرمز الأرجح دائماً فكّ الترميز الجشع (Greedy decoding)؛ أما كثير من التطبيقات فتأخذ عيّنة، أي تختار عشوائياً بنسبة الاحتمالات، فتختلف الإجابات من تشغيل لآخر.

تعيد درجة الحرارة (Temperature) تحجيم هذه الاحتمالات: ما دون ⁦1⁩ يفضّل الرمز الأرجح، وما فوق ⁦1⁩ يمنح الرموز الأقل ترجيحاً فرصاً أكبر. ويُبقي top-p، أو أخذ العيّنات النووي (Nucleus sampling)، أصغر مجموعة من الرموز الأرجح يبلغ مجموع احتمالاتها p على الأقل؛ ويُبقي top-k أرجح k رموز. ولا يقبل كل نموذج كل معامل، فسجّل القيم المرسلة فعلاً.

في المثال أدناه سياسة المتجر ⁦30⁩ يوماً، ومع ذلك يُختار رقم خاطئ في نحو تشغيل من كل أربعة عند درجة الحرارة ⁦1.0⁩، وفي أربعة من كل عشرة عند ⁦2.0⁩، والإجابة الطويلة تتضمن مئات من هذه الاختيارات. وخفض درجة الحرارة يقلل التباين لكنه عملياً لا يضمن مخرجات متطابقة. فاختبر بإعدادات الإنتاج، وشغّل الحالات المهمة عدة مرات، وقارن التشغيلات، مثلاً بأداة Text Diff.

Context: "... unused items can be returned within"   (illustrative probabilities;
assume these four candidates hold all the probability)

Next token       temperature 0.5   temperature 1.0   temperature 2.0
" 30"                      91.5%             70.0%             48.6%
" 14"                       7.5%             20.0%             26.0%
" 7"                        0.9%              7.0%             15.4%
" thirty"                   0.2%              3.0%             10.1%

Wrong number (14 or 7)      8.4%             27.0%             41.3%

جرّبها: مقارنة النصوص (Diff)

موجّه النظام واستخدام الأدوات

الطلب قائمة رسائل لكل منها دور. ويحمل موجّه النظام (System prompt)، الذي يسميه بعض المزوّدين رسالة النظام أو رسالة المطوّر، تعليمات التطبيق: الدور والقواعد والنطاق واللغة والصيغة. وتُدرَّب النماذج على إعطائه الأولوية، لكنه غير مُلزِم: إنه نص في السياق نفسه مع مدخلات المستخدم. فقد يخفق النموذج في اتباعه، وقد يحاول نص المستخدم أو مستند ما تجاوزه، وهذا حقن الموجّهات (Prompt injection، البند LLM01:2025 في OWASP Top 10 لتطبيقات LLM)، وقد يتسرّب محتواه (System Prompt Leakage، البند LLM07:2025). فأبقِ الأسرار خارجه، وطبّق الصلاحيات والأسعار والحدود في الكود.

في استخدام الأدوات (Tool use)، أو استدعاء الدوال (Function calling)، يصف التطبيق كل أداة باسم ووصف ومخطط JSON Schema لمعاملاتها، وهو مستند يحدد الحقول والأنواع والقيم المسموح بها في المعاملات، ويُكتب هو نفسه بصيغة JSON، أي الصيغة النصية التي تكتب البيانات حقولاً مسمّاة وقيماً، مثل {"order_id": "5521"}، وتتبادلها معظم الواجهات البرمجية على الويب. والنموذج لا يشغّل شيئاً أبداً: بل يعيد طلباً منظّماً لاستدعاء أداة بمعاملات ولّدها هو، فيتحقق التطبيق منها ويشغّل الأداة ويعيد النتيجة في طلب جديد. وعامل المعاملات المولَّدة كمدخلات غير موثوقة؛ فقد تأتي بصيغة خاطئة، أو بصيغة صحيحة ومعنى خاطئ، كرقم طلب لم يذكره العميل قط. وتتحقق أداة JSON Schema Validator من المعاملات المسجّلة مقابل المخطط. والأدوات التي تغيّر شيئاً هي حيث تحوّل الوكالة المفرطة (Excessive agency، البند LLM06:2025) الإجابة الخاطئة إلى فعل خاطئ.

طلب LLM واحد من بدايته إلى نهايته: يجمّع التطبيق السياق، ويكتب النموذج الإجابة رمزاً رمزاً بأخذ العيّنات، وبعد استدعاء أداة يشغّلها التطبيق ويعيد نتيجتها في طلب جديد. نموذج مفاهيمي
  1. 1اجمع الطلبموجّه النظام، وتعريفات الأدوات، والمحادثة حتى الآن، والرسالة الجديدة، والمعاملات
  2. 2قسّم النص إلى رموزالحدود والتكلفة تُحسب بالرموز

    فرع: طويل جداً: يقتطع التطبيق أو يلخّص أو يفشل الطلب؛ اختبر ما يضيعتنبيه

    بوابة: يتسع لنافذة السياق

  3. 3قدّر احتمال كل رمز تالٍ ممكنبناءً على تدريب النموذج والرموز الموجودة في السياق
  4. 4اختر رمزاً واحداًتحدد درجة الحرارة وtop-p إلى أي مدى قد يبتعد الاختيار عن الرمز الأرجح

    يتكرر: كرّر رمزاً رمزاً حتى يتوقف النموذج أو يبلغ حدّ المخرجات

  5. 5أعِد المخرجاتنص أو استدعاء أداة، مع سبب التوقف واستهلاك الرموز

    فرع: توقف عند حدّ المخرجات: الإجابة مقطوعةتنبيه

  6. 6يتصرّف التطبيقيعرض الإجابة، أو يتحقق من معاملات الأداة ثم يشغّلها

عودة إلى الخطوة 1 تُضاف نتيجة الأداة إلى المحادثة: طلب جديد

تبسيط: يختلف المزوّدون في أسماء الحقول والحدود وطريقة عدّ الرموز.

Request 1 (simplified and provider-neutral; field names differ by provider)
  model: example-model-v3    temperature: 0.7    max output tokens: 500
  system: "You are the support assistant of an online store. Answer in the
           customer's language. Hand every refund request to a human agent."
  tools: get_order_status(order_id: a string of 4 to 10 digits)
  messages: user: "Where is my order 5521?"

Response 1   stop reason: tool call
             get_order_status({"order_id": "5521"})
Application  validates the argument, runs the lookup, adds the result:
             {"order_id": "5521", "status": "shipped", "eta": "2026-10-08"}
Request 2    the same context plus the tool call and its result
Response 2   stop reason: end of turn
             "Your order 5521 has shipped and should arrive on 8 October."

جرّبها: مدقّق JSON Schema

أنماط الإخفاق الشائعة

تقع معظم عيوب LLM في عائلات قليلة، تعود كل منها إلى إحدى الآليات السابقة؛ وتسمية الآلية تدلّ على الإصلاح وعلى اختبار الانحدار.

  • الهلوسة (Hallucination): محتوى سلس وواثق لكنه خاطئ أو بلا سند، مثل سياسة أو حالة طلب مختلَقة، وتسمّيها وثيقة ⁦NIST AI 600-1⁩ الاختلاق (Confabulation). فالنموذج ينتج نصاً مرجّحاً لا حقائق متحقَّقاً منها، فاختبر أسئلة لا تتوفر إجابتها، وتوقّع «لا أعرف» أو تحويلاً إلى موظف.
  • انحراف التعليمات (Instruction drift): لغة خاطئة أو صيغة خاطئة أو نصيحة خارج النطاق، وغالباً في أواخر المحادثات الطويلة. ورفض طلب مشروع إخفاق أيضاً.
  • عدم الاتساق (Inconsistency): المدخل نفسه يُقبل في تشغيل ويُرفض في آخر؛ وفي قرار يجب أن يكون ثابتاً، التقلّب نفسه هو العيب.
  • الاقتطاع وضياع السياق (Truncation and lost context): إجابة مقطوعة عند حدّ المخرجات مع JSON غير مغلق، أو معلومة اختفت بعد اقتطاع السجل.
  • المخرجات المنظّمة المعيبة (Malformed structured output): JSON غير صالح، أو حقول ناقصة أو زائدة، أو نص حول JSON يكسر المحلّل.
  • أخطاء استخدام الأدوات: استدعاء خاطئ أو مفقود، ومعاملات مختلَقة، وخطأ أداة تغطيه نتيجة مختلَقة، وحلقات تكرار، أو فعل دون التأكيد المطلوب.
  • الحقن والتسرّب: نص من مستخدم أو صفحة أو مستند يتجاوز التعليمات أو يستخرج موجّه النظام؛ ويقدّم دليل اختبار أمان LLM اختبارات آمنة لذلك.

مثال تطبيقي: تتبّع إجابة خاطئة واحدة حتى سببها

يشتكي عميل من أن مساعد الدعم وعده بوصول طلبه الثاني «غداً» مع أنه لم يُشحن. وبدلاً من الإبلاغ بأن «البوت يختلق التواريخ»، يقرأ المختبِر الطلب المسجَّل لتلك الجولة من المحادثة كما أُرسل فعلاً.

إنها الرسالة ⁦31⁩، «وماذا عن الطلب الثاني؟»، ولا يوجد استدعاء أداة في الاستجابة. كان رقم الطلب قد ذُكر في الرسالة ⁦3⁩، لكن التطبيق يحتفظ بآخر ⁦20⁩ رسالة فقط، فلم تكن لدى النموذج قيمة للمعامل الإلزامي order_id، وبدلاً من أن يسأل كتب إجابة تبدو مقنعة. وعند درجة الحرارة ⁦0.7⁩ أعطت إعادة إرسال الطلب المسجَّل خمس مرات تاريخاً مختلَقاً أربع مرات وسؤالاً عن رقم الطلب مرة واحدة.

  • تقرير الخطأ: إصدار النموذج والموجّه، والمعاملات، والطلب بعد الاقتطاع، وسبب التوقف، وعبارة «تاريخ مختلَق في ⁦4⁩ من ⁦5⁩ تشغيلات»، والسبب: الاقتطاع أسقط رقم الطلب، والموجّه لا يتضمن قاعدة لحالة غيابه.
  • اختبارات جديدة: محادثة من ⁦30⁩ رسالة لا يظهر فيها رقم الطلب إلا في الرسالة ⁦3⁩، وسؤال دون أي رقم طلب. النتيجة المتوقعة في كل تشغيل: يبحث المساعد عن الطلب أو يسأل عن الرقم، ولا يذكر تاريخاً أبداً دون نتيجة من الأداة.
  • سؤال للفريق: هل يجب أن تبقى المعلومات الأساسية، مثل أرقام الطلبات، في السياق بعد اقتطاع السجل؟

أخطاء شائعة

  • افتراض أن درجة الحرارة ⁦0⁩ تضمن مخرجات متطابقة، أو الاختبار بإعدادات أخذ عيّنات تختلف عن الإنتاج.
  • الحكم على حالة من تشغيل واحد؛ فالحالة التي تنجح في ⁦3⁩ من ⁦5⁩ تشغيلات عيبٌ إذا كان القرار يجب أن يكون ثابتاً.
  • معاملة موجّه النظام كضابط أمني أو كمكان آمن للأسرار وقواعد الصلاحيات.
  • اختبار المحادثات والمدخلات القصيرة فقط، فلا تُبلغ نافذة السياق ولا اقتطاع السجل ولا حدّ المخرجات، ولا سيما بالعربية أو الهندية.
  • الوثوق بمعاملات الأدوات والمخرجات المنظّمة لأن النموذج أنتجها، بدلاً من التحقق منها كمدخلات غير موثوقة.
  • وصف كل إجابة خاطئة بأنها «هلوسة» دون البحث عن الآلية، فيبقى الإصلاح واختبار الانحدار كلاهما غير واضح.

من منظور ضمان الجودة

قبل تصميم اختبارات لميزة مبنية على LLM، اطلب «تشريح الطلب»: النموذج وهل إصداره مثبَّت، ومعاملات أخذ العيّنات وحدّ المخرجات، وإصدار موجّه النظام، والأدوات وأيّها له آثار جانبية، وقاعدة اقتطاع السجل. وعامل كل بند كإعداد تحت الاختبار، فأي تغيير فيه خطر انحدار. واتفق مع مالك المنتج على السلوكيات التي يجب أن تثبت في كل تشغيل، مثل رفض النصيحة الطبية، وعلى ما يجوز أن تختلف صياغته.

اطلب من المطورين تسجيل كل استجابة مع إصدار النموذج والموجّه، والمعاملات، والطلب كما أُرسل، وسبب التوقف، واستهلاك الرموز، دون بيانات شخصية لا تحتاجها السجلات، حتى تذكر تقارير أخطائك ما يُعاد إرساله وكم مرة يفشل. وهذه الأساسيات تُضاف إلى أدواتك في ضمان الجودة: فمراجعة المتطلبات وتحليل المخاطر والقيم الحدّية واختبار الانحدار ما زالت تؤدي معظم العمل.

تمرين عملي

شخّص أربعة إخفاقات مسجّلة لمساعد حجز المواعيد

المطلوب

مساعد المواعيد في إحدى العيادات يحجز الزيارات عبر أداتين، وإعداداته وأربع مشكلات مسجّلة أدناه. لكل سجل، سمِّ نمط الإخفاق والآلية الأرجح، واكتب حالة اختبار واحدة بنتيجة متوقعة يجب أن يحققها كل رد مقبول.

ثم اكتب ما يجب أن تتضمنه تقارير الأخطاء. تكفي الورقة والقلم.

المادة
Assistant: clinic appointments      Model: example-model-v3 (pinned)
Parameters: temperature 0.9, max output tokens 150
System prompt v5: "Reply in the patient's language. Offer free slots with
  find_slots(date). Book with book_appointment(slot_id) only after the patient
  confirms a slot. Never give medical advice."

Log 1  user: "Is 10:30 tomorrow free?"
       tool call: find_slots(date: "2026-11-12")
       tool result: [{"slot_id": "S-1201", "time": "09:00"},
                     {"slot_id": "S-1202", "time": "11:15"}]
       reply: "Yes, 10:30 tomorrow is free."
Log 2  user: "Book me with Dr Salem on Sunday."
       tool call: book_appointment(slot_id: "S-0912")  (no find_slots, no confirmation)
Log 3  "Can I eat before my blood test?" sent 5 times:
       3 replies refer the patient to the clinic, 2 replies give advice
Log 4  user writes in Arabic     stop reason: max output tokens (150 of 150 used)
       reply: {"message": "...a long confirmation in Arabic...", "slot": "11:15",
               "status": "confir
الخطوات
  1. دوّن كل إعداد قد يكون مؤثراً: المعاملات والحدود وقواعد الأدوات.
  2. لكل سجل، سمِّ نمط الإخفاق والآلية.
  3. اكتب حالة اختبار لكل سجل: المدخل، وعدد التشغيلات، والنتيجة المتوقعة.
  4. اكتب المعلومات التي يحتاجها كل تقرير خطأ.
إظهار الإجابة النموذجية
الإجابة النموذجية

السجل ⁦1⁩، هلوسة: يناقض الرد نتيجة الأداة التي لا تتضمن ⁦10:30⁩. الاختبار: اطلب وقتاً لا تذكره النتيجة، في ⁦5⁩ تشغيلات. النتيجة المتوقعة في كل تشغيل: «غير متاح»، ولا أوقات إلا من نتيجة الأداة (⁦09:00⁩ و⁦11:15⁩).

السجل ⁦2⁩، خطأ في استخدام الأدوات مع وكالة مفرطة: لا استدعاء لـfind_slots، ولا تأكيد، ولم يرد S-0912 في أي نتيجة أداة. الاختبار: «احجز لي يوم الأحد»، في ⁦5⁩ تشغيلات. النتيجة المتوقعة في كل تشغيل: تُعرض مواعيد من نتيجة find_slots ولا يُحجز شيء قبل تأكيد المريض. وأضف اختباراً للتطبيق: يرفض الكود book_appointment لموعد لم يُرجعه أي استدعاء لـfind_slots، لأن قاعدة الموجّه وحدها لا تفرض شيئاً.

السجل ⁦3⁩، عدم اتساق في قرار يخص السياسة، زادت احتماله درجة الحرارة ⁦0.9⁩؛ وكل رد يقدّم نصيحة يخالف أيضاً قاعدة «لا تقدّم نصيحة طبية أبداً» (انحراف التعليمات). وهو عيب لا تذبذب. الاختبار: السؤال ⁦10⁩ مرات بإعدادات الإنتاج. النتيجة المتوقعة: ⁦10⁩ ردود من ⁦10⁩ تحيل المريض إلى العيادة. واسأل لماذا يحتاج مساعد حجز إلى درجة حرارة بهذا الارتفاع.

السجل ⁦4⁩، اقتطاع: استهلكت الرسالة العربية الطويلة كامل حدّ المخرجات البالغ ⁦150⁩ رمزاً، فتلقّى المحلّل JSON غير مغلق؛ وهذا الحدّ لا يكفي لهذا الرد. الاختبارات: أطول رد متوقع، وبالعربية أيضاً، في ⁦5⁩ تشغيلات: ينتهي كل تشغيل بسبب توقف عادي ويجتاز مخطط JSON Schema الخاص به؛ وحين يكون سبب التوقف بلوغ حدّ المخرجات، يعرض التطبيق خطأً أو يعيد المحاولة بدلاً من التحليل.

يحتاج كل تقرير خطأ إلى إصدار النموذج والموجّه (v5)، والمعاملات، والطلب الكامل كما أُرسل، واستدعاءات الأدوات ونتائجها، وسبب التوقف، واستهلاك الرموز، وعدد التشغيلات الفاشلة من بين عدد التشغيلات الكلي.

أسئلة شائعة

هل الرمز (Token) هو الكلمة نفسها؟

لا. الرمز وحدة من وحدات مقسِّم الرموز في النموذج: كلمة شائعة، أو جزء من كلمة أطول، أو علامة ترقيم، أو مسافة ملتصقة بكلمة. ويتوقف عدد الرموز في نص ما على مقسِّم الرموز وعلى اللغة. وللحصول على عدد دقيق، استخدم أداة عدّ الرموز لدى المزوّد أو استهلاك الرموز الذي تعيده الواجهة البرمجية مع كل استجابة.

إذا ضبطت درجة الحرارة على ⁦0⁩، هل أستطيع مقارنة المخرجات حرفياً؟

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

هل يتعلم النموذج من محادثات الاختبار التي أجريها؟

ليس أثناء الطلب: فأوزان النموذج (Weights)، أي الأرقام التي تعلّمها في التدريب، لا تتغير وهو يجيب، ولا يستخدم إلا ما في السياق. أما إمكانية أن يستخدم المزوّد البيانات المرسلة إليه في تدريب لاحق فتتوقف على شروطه وعلى عقدكم معه، فراجعها، ولا تضع بيانات شخصية حقيقية في موجّهات الاختبار أبداً.

هل أحتاج إلى فهم طريقة عمل النموذج من الداخل؟

لا. يحتاج المختبِر إلى السلوك عند الواجهة: ما يدخل في السياق، وكيف تُولَّد المخرجات وتُحدّ، وكيف تُستدعى الأدوات. ومعرفة البنية الداخلية قد تفيد، لكنها ليست شرطاً لاختبار تطبيق LLM جيداً.

المراجع

تدرّب بأدوات متقن

ولّد نصاً بديلاً (placeholder) على شكل فقرات أو جمل أو كلمات — باللاتينية أو العربية أو الهندية.

أدوات مساعدة

التحقق من مستند JSON مقابل مخطط JSON Schema (الكلمات المفتاحية الأساسية في draft-07 / 2019-09 / 2020-12).

JSON والبيانات

للتعمّق أكثر

تقدّمك في هذا الموضوع

جزء من مسار تعلم ضمان الجودة