اكتشف خصائص المخطط التي قد تطرح أكثر من سؤال — واطّلع على القراءات المتنافسة جنبًا إلى جنب، وثبّت كل خاصية على معنى واحد قبل جمع البيانات.
يتعامل Entity Enricher مع نماذج LLM بوصفها قواعد معرفة قابلة للاستعلام، واسم الخاصية هو السؤال الذي تطرحه. وحين يحتمل الاسم عدة قراءات، يختار كل نموذج واحدة منها بهدوء — فتعود خاصية size على شركة عددَ موظفين من نموذج، ورقمَ إيرادات من آخر، ومساحةَ أرضية من ثالث. لم تختلف النماذج على حقيقة، بل أجابت عن أسئلة مختلفة، وصار عمودك يحوي خليطًا من الإجابات لا يستطيع أي مستهلك لاحق التمييز بينها.
تثبيت المعنى هو ما يجعل الإثراء قابلاً للمقارنة بين النماذج وثابتاً عبر الزمن. كما أنه يُصلح كل ما يأتي بعده: فيتوقف الدمج متعدد النماذج عن رؤية تعارضات ليست في حقيقتها سوى سؤالين مختلفين، وتتوقف مقارنات المعيار المرجعي عن معاقبة النماذج لأنها قرأت مخططك على نحو يخالف قراءة المرجع.
الحقيقة التي تتغيّر بمرور الوقت ليست التباسًا. المخطط عقد دائم، لذا فإن خاصية باسم صريح مثل ceo تعني «الرئيس التنفيذي وقت الإثراء»، وإعادة تشغيل المخطط العام المقبل ينبغي أن تُعيد الرئيس الجديد. ولا يقترح الفحص أبدًا تثبيت تاريخ داخل الاسم — فذلك يُعطّل كل تشغيل مستقبلي.
الفحص كله سؤال واحد يُطرح على كل خاصية: عند قراءة اسمها في سياق الكائن الأصل الذي تنتمي إليه، كم عدد الأشياء المتمايزة التي قد تطلبها؟ العدد هو الحكم.
| القراءات | الحكم | ما معنى ذلك |
|---|---|---|
| واحدة بالضبط | مسح | تبحث كل النماذج عن الشيء نفسه. لا شارة، ولا شيء يحتاج إصلاحًا. |
| اثنان أو أكثر | غامض | يستقرّ كل نموذج على قراءته الخاصة، فيخلط العمود بصمت بين إجابات عن أسئلة مختلفة. ويسمّي الفحص القراءات المتنافسة ويقترح صياغة تُبقي واحدة منها. |
| لا شيء | غير قابل للتعيين | الاسم لا يسمّي أي شيء يملكه الكائن الأصل، فلا يستطيع النموذج البحث عن قيمة — بل يختلقها. والقراءات المدرجة هي التي نظر فيها المحلِّل ورفضها، والعلاج إما إعادة تسمية وإما حذف: فلا وصف يمكنه أن يمنح كياناً خاصية لا يملكها. |
قد تُعلَّم خاصيةٌ تسمّي شيئًا واحدًا بالضبط حين تكون القيمة غير مؤطَّرة — فالقارئ يعرف ما المطلوب، لكنه لا يعرف بأي صيغة سيعود. وهذه هي الأنماط المتكررة:
| حالة فرعية | مثال | ما الذي يبقى مفتوحاً |
|---|---|---|
| مرجع غير واضح | Companysize | يشير الاسم إلى عدة حقائق متمايزة يملكها الكائن الأصل فعلاً — عدد الموظفين، الإيرادات، المساحة. ولا شيء في الاسم يحسم الاختيار بينها. |
| مقياس أو وحدة غير واضحة | Companyannual_revenue | حقيقة واحدة، لكن دون عملة ولا فترة زمنية ولا تحديد للإجمالي أو الصافي — فقد تخطئ إجابة معقولة بثلاث مراتب عشرية وتظل «صحيحة». |
| سُلَّم أو اتجاه غير واضح | Supplierrisk_score | لا نطاق مذكور ولا اتجاه مذكور: هل هو 0–10 أم 0–100، وهل الرقم المرتفع يعني أماناً أكبر أم خطراً أكبر؟ قد يعطي نموذجان نتيجتين متعاكستين. |
| نطاق أو حدود غير واضحة | Companyemployees | أي مجموعة فرعية، وأي مستوى تجميع، ومن أي منظور — المجموعة بأكملها أم هذا الموقع، عدد الأفراد أم المعادل بدوام كامل، مع احتساب المتعاقدين أو بدونهم. |
| غير قابل للتعيين | Authorrelease_year | المؤلّف ليست له سنة إصدار — بل كتبه هي التي لها ذلك. ولا يستطيع النموذج البحث عن هذه المعلومة، فيختلقها. أعد تسميتها إلى شيء يملكه الكيان الأصل، أو انقلها إلى الكائن الذي يملكها. |
الخصائص النصية — description وsummary وnotes وbio — لا يُشار إليها أبداً. فمن البديهي أن تختلف صياغتها من نموذج إلى آخر، لكن السؤال المطروح واضح تماماً، وهذا كل ما يحكم عليه هذا الفحص. فالالتباس يتعلق بالسؤال، لا بمدى تشابه الإجابات.
الحكم وحده («هذا غير واضح») يتركك تخمّن ما قصده المحلّل. لذا تحمل كل ملاحظة تفسيراتها: قراءتان إلى أربع قراءات قصيرة ومتمايزة تحتملها الخاصية، الأرجح أولًا. تلك القائمة هي الملاحظة نفسها — وإذا لم يستطع المحلّل تسمية قراءتين، تُسقَط الملاحظة باعتبارها ضجيجًا بدل عرضها عليك.
annual_revenue على كيان Companyوإلى جانبها يأتي وصف مقترح يُبقي قراءة واحدة بالضبط — هنا: «إجمالي إيرادات المجموعة بالدولار الأمريكي عن آخر سنة مالية مكتملة، قبل خصم المرتجعات». وتطبيقه لا يكلّف شيئًا: فالوصف يصل إلى نموذج الإثراء تمامًا كما يصل الاسم، لكن الخاصية تحتفظ باسمها فلا يتغيّر أي عقد بيانات. وحين يكون الاسم نفسه هو مصدر التضليل، تحمل الملاحظة أيضًا أسماء مقترحة.
عادةً ما يحسم عرضُ القراءات مكتوبةً أمرَ الخاصية أسرع من أي شرح: فتتعرّف على القراءة التي قصدتها، أما البقية فهي ما كنت تتلقاه دون أن تدري.
بعد توليد عيّنة، يراجع المحلّل أسماء خصائصها ويعيد تقرير التباس. وتُطبَّق عمليات إعادة التسمية غير الملتبسة تلقائيًا على المفاتيح التي ابتكرها الذكاء الاصطناعي (ولا تُطبَّق أبدًا على الحقول التي سمّيتها بنفسك)، فتصبح العيّنة التي تراجعها أوضح قراءةً. كما يعلّم الخصائص المفرطة في التخصيص — سمات تسرّبت من المثال المستخدم ولا تناسب إلا نوعًا فرعيًا (ميداليات رياضي على كيان Person عام) — ويقترح نوع كيان أضيق. ويُجرى فحص نطاق الهوية هنا كاستدعاء مستقل مباشرةً بعده: فهو يحسم شكل العناصر المرتبطة قبل مراجعتك للعيّنة. أما العيّنات المستندة إلى مستندات مرفقة فتُستثنى — إذ تأتي قيمها من المستند المصدر لا من استرجاع النموذج.
بمجرد حفظ مخطط مُولَّد، تقوم مرحلة لاحقة بتوصيف كل خاصية بحكم الالتباس الخاص بها، واقتراح أسماء بديلة للخصائص التي لا تزال ملتبسة. أما مواضع العلاقات فتكون موصَّفة بحلول ذلك الوقت — إذ تحكم عملية التوليد على نطاقها بنفسها ضمن إحدى خطواتها — لذا تقتصر المرحلة اللاحقة على أسماء الخصائص. وتُبذل في هذه الخطوة أفضل جهد ممكن: فإن أخفقت، لا يتأثر التوليد نفسه.
يشغّل زر «إعادة الفحص» كلا الفحصين — أسماء الخصائص ومواضع العلاقات — في استدعاءين متوازيين. وهو الموضع الوحيد الذي يقترح إعادة صياغة الوصف بدلاً من إعادة التسمية. ولا يحلل سوى ما لم يُوصَّف بعد، ثم ينتقل إلى إعادة تحليل شاملة متى أصبح كل شيء موصَّفاً.
يمكن تحليل عينة JSON التي تلصقها لإنشاء مخطط تحليلاً عديم الحالة — فتحصل على تقرير بأسماء الخصائص الملتبسة وغير القابلة للربط، وبالعناصر المرتبطة التي تخلط حقائق الكيان بحقائق الاقتران، دون تعديل أي شيء.
قد تقترح النتيجة نفسها إعادة تسمية في موضع، ووصفاً في موضع آخر، والسبب جدير بالمعرفة. فعند التوليد لا يكون الوصف موجوداً بصورة مستقلة بعد — إذ يُكتب انطلاقاً من الاسم، فلا يسعه إلا أن يكرر الالتباس. والاسم هو الشيء الوحيد القابل للإصلاح، ولا شيء يعتمد عليه بعد. ولهذا يقترح كلٌّ من توليد العينة والمرحلة اللاحقة لتوليد المخطط إعادة التسمية.
بعد أن يصبح المخطط قيد التشغيل، تؤدي إعادة تسمية أي خاصية إلى نقل الأعمدة وتعطيل الاستعلامات وإعادة ترميز مفاتيح الجداول المتزامنة، في حين يصل الوصف الأدق إلى النموذج بالمباشرة نفسها دون أن يغيّر أي شيء آخر. لذا فالقاعدة بسيطة: قبل أن يعتمد أي شيء على المخطط، أعِد التسمية؛ وبعد أن يصبح قيد التشغيل، ثبِّت المعنى في الوصف — واحتفظ بإعادة التسمية للحالات التي يكون فيها الاسم نفسه هو المشكلة.
هذا الفحص استشاري فقط. فلا شيء يحلل مخططاتك المحفوظة في الخلفية: إنه يعمل عند التوليد، وعند الضغط على «إعادة الفحص». وهو لا يمنع التوليد أبداً، ولا يرفض أي إثراء، وتُحذف توصيفاته من كل مُوجّه يُرسل إلى نماذج الإثراء — فهو يُعلمك أنت، لا الذكاء الاصطناعي.
تعرض الخصائص المعلَّمة شارة «ملتبس» في محرّر سير العمل: كهرمانية حين تتداخل القراءات في معظمها ولا تختلف إلا في الحالات الطرفية، وحمراء حين تؤدي القراءات المتنافسة إلى بيانات مختلفة جوهريًا. أما الخصائص التي حُكم بوضوحها فلا تحمل أي شارة. وتمرير المؤشّر فوق الشارة يُظهر ملاحظة المحلّل والقراءات المتنافسة التي وجدها والوصف أو الأسماء المقترحة — فيجتمع القرار والإصلاح في التلميح نفسه.
يصدر الحكم على اسم الخاصية ووصفها معًا — لذا فإن إعادة تسمية خاصية أو تعديل وصفها يُسقط تعليقها التوضيحي. ويبرز المحرّر هذه الخصائص باعتبارها قديمة ويعرض إعادة الفحص، التي تحلّل ما ينقص فقط. وهذا تحديدًا ما تريده بعد تطبيق إصلاح مقترح: تؤكّد إعادة الفحص ما إذا كانت الصياغة الجديدة تُثبّت قراءة واحدة فعلًا.
تحديد نطاق الهوية فحص ثانٍ، يُنفَّذ باستدعاء نموذج مستقل إلى جانب فحص الالتباس ويُعرض معه. وهو يراجع كل موضع علاقة — عناصر المصفوفة المرتبطة، والكائنات المتداخلة: فحين يخلط أحدها حقائق عن الكيان المرتبط نفسه (اسمه، بلده) بحقائق عن الاقتران (دور يشغله لدى هذا الأب، أو تسمية خاصة بكل أب)، يتشارك الاثنان هوية واحدة — وتكتب عمليات الإثراء المتكرّرة فوق حقائق الاقتران عبر الآباء. وتحمل هذه المواضع رقاقة «حقائق مختلطة» كهرمانية يعرض تلميحها الشكل الموصى به: حقول الكيان الخاصة به مُدرجة داخل كائن فرعي، وحقول الاقتران باقية على العنصر. وإذا كان العنصر يحمل كائنًا فرعيًا كهذا بالفعل، فالإصلاح أبسط — إذ تُنقل الحقول الموضوعة في غير موضعها إلى الكائن الموجود.
يُطبَّق الفصل أثناء توليد العيّنة، قبل موافقتك عليها: تُحسم البنية عند العيّنة الأولى، ويُدرَج كل موضع أُعيدت هيكلته في تحذيرات التوليد، وتُولَّد بقية عيّنات الدفعة وفق البنية المحسومة. لذا تخرج المخططات المولّدة من عيّنة جديدة نظيفة عادةً. أما العيّنات المستندة إلى مستندات مرفقة فتُترك كما أوحت مصادرها، وتحصل على الشريحة بدلًا من ذلك.
لا يعيد توليد المخطط بحدّ ذاته هيكلة العيّنة التي وافقت عليها أبدًا — بل يحكم على المواضع نفسها ويُبلّغ عمّا يجده. لذا تكون الشريحة، في مخطط قائم أو مكتوب يدويًا، هي موضع الإصلاح: فهي تتيح فصلًا بنقرة واحدة يعيد هيكلة العيّنة ويعيد توليد المخطط منها. فالبنية هي العقد، ولذلك تُغيَّر بإعادة التوليد من عيّنة جديدة، ولا تُرقَّع في مكانها أبدًا. والموضع الذي تختار عدم فصله يظل يعمل — لكنه يحتفظ بهوية واحدة مشتركة، وبالشريحة. وتختفي الشريحة من تلقاء نفسها عندما تتغيّر مجموعة حقول العنصر.
يمكن تعطيل الفحص لكل مخطط على حدة من قائمة الخيارات الإضافية في محرِّر سير العمل. وعند تعطيله، تُتخطّى المرحلة اللاحقة للتوليد، وتُخفى الشارات وزر إعادة الفحص وتنبيهات التقادم، وتردّ نقاط نهاية التحليل بخطأ ambiguity_check_disabled. وتبقى التوصيفات الحالية محفوظة (مخفية فقط)، أما إعادة تفعيل الفحص على مخطط لم يُحلَّل من قبل فتُشغِّله تلقائياً.
يبدأ كل مخطط مولَّد وفحص الالتباس فيه مُفعَّلًا، بما في ذلك المخططات المولَّدة من المستندات المرفقة. فالالتباس صفة في صياغة المخطط، لا في مصدر القيم في تشغيل واحد: فقد حسم المستند تلك القيم مرة واحدة، بينما يُعاد استخدام المخطط لاحقًا مع كيانات لم يشملها قط. أما ما يغيّره المستند فعلًا فهو خطوة العيّنة — إذ تأتي أسماء خصائصها من مفردات المستند المصدر نفسه، فلا يُعاد تسميتها في الشيفرة أبدًا، ويحمل المخطط المبني عليها الفحص بدلًا من ذلك.
«الإيرادات السنوية للشركة» لا تضيف أي معلومة لم يحملها الاسم أصلًا، لذا يعامل المحلّل مثل هذا الوصف كأنه غير موجود ويحكم على الاسم وحده. الوصف يستحق مكانه حين يحدّد الوحدة أو الفترة أو المقياس أو الحدّ.
تُكتب ملاحظات المحلّل وتفسيراته بلغة واجهتك — فالمستخدم الفرنسي يرى قراءات بالفرنسية، والياباني يراها باليابانية. أما أسماء الخصائص المقترحة فتبقى بالإنجليزية، اتساقًا مع أعراف تسمية المخططات.
كل تحليل هو استدعاء فعلي (زهيد التكلفة) للنموذج — واستدعاءان متوازيان حين تكون هناك أيضًا مواضع علاقات يلزم تحديد نطاقها. ويُسجَّل كلٌّ منهما كموجّه مستقل على السجل، تحت نوع ambiguity_analysis، ويُخصم من الأرصدة كأي استخدام آخر للذكاء الاصطناعي. أما عمليات إعادة الفحص التدريجية فلا تُحتسب إلا على الخصائص والمواضع التي جرى تحليلها فعلًا.
عمليتا توليد العينة والمخطط مُوجَّهتان أصلاً إلى تسمية شيء واحد لكل خاصية، وإلى كتابة أوصاف تذكر الوحدة والسُّلَّم والحد الفاصل — ومع القوائم القابلة للجدل، إلى ذكر حد أعلى في الوصف بدلاً من فرض عدد داخل الاسم. لذا تخرج معظم المخططات سليمة، ولا يبقى على المحلِّل سوى التقاط الحالات الشاردة.
الفحص متاح برمجياً:
| السطح | الوصف |
|---|---|
POST /api/schema/analyze-sample | تحليل عيّنة JSON ملصوقة — الفحصان معًا خلف طلب واحد، تقرير عديم الحالة، ولا يُعدَّل أي شيء |
POST /api/schema/saved/{id}/analyze | تحليل مخطط محفوظ وكتابة تعليقات الفحصين — تزايدي افتراضيًا، وforce=true يعيد تحليل الكل |
POST /api/schema/scoping-split | تطبيق عملية فصل واحدة لـ "الحقائق المختلطة" على مجموعة عيّنات — حتمية ومجانية ولا يُحفظ شيء؛ أعِد إدخال العيّنات الناتجة في توليد المخطط |
analyze_sample | أداة MCP — التقرير نفسه عديم الحالة للعيّنة، بالفحصين معًا، من Claude أو أي عميل MCP |
analyze_schema | أداة MCP — لتوصيف مخطط محفوظ؛ اجمعها مع update_schema لتطبيق وصف مقترح أو إعادة تسمية |
تعود الملاحظات ومعها kind (ambiguous أو unmappable) وlevel وملاحظة نصية وقائمة interpretations والإصلاح المقترح. وعلى مخطط محفوظ تُخزَّن على كل خاصية باسم ambiguity؛ أما توليد العيّنة فيعيدها تحت ambiguity_report.
راجع مرجع API ودليل خادم MCP للاطّلاع على المصادقة وكتالوج الأدوات الكامل.