التسليم والحدود
درس 3 من 3
3التسليم والحدود
الصورة الكبيرةالنظام لا يكون جاهزًا حين ينجح عندك، بل حين يستخدمه ثلاثة أشخاص لا يعرفونك دون أن تشرح لهم. هذا الدرس عن الخطوة الأخيرة: اختبار الغرباء، ووثيقة حدود تقول بصراحة ما لا يستطيعه نظامك ومتى يخطئ، وحماية بيانات من يستخدمه، وعرض نهائي يُظهر الأرقام والفشل معًا.
ماذا تشاهد في الرسم: مهمة «سؤالان معًا» فشلت مع اثنين من ثلاثة، وهي نفس الشريحة التي ظهرت في تحليل الأخطاء. حين يتفق التقييم الآلي والمستخدمون الحقيقيون على نفس الضعف، يصير أهم سطر في وثيقة الحدود.
خارطة هذا الجزء
المفاهيم بالترتيب، اضغط أيًّا منها للقفز إليه:
طريقان إلى نفس الفكرة
النظام لا يكتمل حتى يستخدمه ناس لا يعرفونك ولا يجاملونك. تعطيه لثلاثة منهم وتراقب أين يتعثرون. ثم تكتب ورقة صريحة: ما الذي يفعله نظامك جيدًا، وما الذي لا يفعله، ومتى يجب ألا يثق به أحد.
اختبار مع مستخدمين حقيقيين مع تسجيل المهام والأخطاء، ثم بطاقة نموذج model card تذكر الاستخدام المقصود والبيانات والمقاييس والحدود والمخاطر والتحيّزات المعروفة. مع رابط تشغيل وتعليمات إعادة الإنتاج.
قبل أن تبدأ
🏗️البناء والتقييم
عندك نسخة تعمل ورقم اختبار مقاس مرة، وتعرف الشرائح التي تفشل فيها.
📡المراقبة والانجراف
رأيت كيف تُنقّح البيانات الشخصية قبل كتابة السجل.
الفكرة الجوهرية
الخطوة الأخيرة أربعة أجزاء بالترتيب: اختبار الغرباء، ثم وثيقة الحدود، ثم حماية البيانات في السجلّات، ثم عرض نهائي يُظهر الأرقام والفشل معًا.
1اختبار الغرباء
النظام جاهز حين يستخدمه ثلاثة لا يعرفونك دون أن تشرح لهم. أنت تتجنّب أخطاءه دون أن تنتبه، والغريب يجدها بسرعة.
انظر إلى الرسم: ثلاثة غرباء في الصفوف وخمس مهام في الأعمدة. تراقب كل خانة بصمت وتسجّل: هل أنجز المهمة، وكم استغرق، وأين تعثّر.
خمس عشرة مهمة لا تكفي لرقم دقيق، فالمدى من 48% إلى 89%. هدفها أن تجد ما يفشل، وقد فشلت مهمة «سؤالان معًا» مع اثنين من ثلاثة.
2وثيقة الحدود
وثيقة الحدود جزء من المنتج لا اعتراف بالضعف. من يستخدم نظامك يحتاج أن يعرف متى يثق به ومتى يتحقّق بنفسه.
انظر إلى الرسم: الدقة بحسب الشريحة، وهي ما تكتبه الوثيقة بدل وعد عام بأن النظام «ذكي».
صفحة واحدة ترافق النظام، يقرؤها المستخدم قبل أن يعتمد عليه.
# Limits: shipping reply drafts for <shop name> (v1.2, 2026-10)
Built for: short Arabic support messages about order status
Not built for: refunds, complaints, legal questions, other languages
beyond basic English
How well it works (150 frozen real messages, labelled by the owner):
shipping precision 96% (95% range 91% .. 98%) bar: 95%
drafts sent unedited 64% (owner's log, 2 weeks) bar: 60%
keyword baseline 85% accuracy, same set
Where it fails:
- messages with two requests: 45% accuracy -> always routed to a human
- Gulf dialect spelling not seen in training: ~82%
- names and street addresses are NOT removed from logs
When unsure (confidence < 0.7) it drafts nothing and flags the message.
Data: messages kept 30 days, phones/emails/IBANs/IDs removed before
logging, never used for training without the owner's consent.
Contact for errors: <owner email>
كل رقم بمداه، وكل ضعف معروف مكتوب مع ما يفعله النظام حياله، وما لا يُحذف من السجلّات مذكور صراحة. هذه الصفحة هي ما سيقرؤه من يقيّم مشروعك قبل الكود، وهي التي تقول إنك تفهم نظامك.
الفكرة نفسها في بطاقات النماذج (Model Cards) التي ترافق النماذج المنشورة: الاستخدام المقصود، والأداء بحسب الشريحة، والقيود المعروفة.
3الخصوصية تبدأ في السجلّات
أغلب التسرّب في المشاريع الصغيرة يأتي من سجلّات تحفظ كل رسالة كما هي. انظر إلى الرسم: كل رسالة تمرّ على دالة تنقيح قبل أن تُكتب، لا بعد.
دالة صغيرة تمرّ عليها كل رسالة قبل أن تصل للسجل: البريد، ورقم الآيبان، ورقم الجوال السعودي، ورقم الهوية.
import re
PATTERNS = [
("EMAIL", re.compile(r"[\w.+-]+@[\w-]+\.[\w.]+")),
("IBAN", re.compile(r"\bSA\d{22}\b")),
("PHONE", re.compile(r"(?<!\d)(?:\+?966|0)?5\d{8}(?!\d)")),
("NATIONAL_ID", re.compile(r"\b[12]\d{9}\b")),
]
def redact(text):
found = []
for name, pattern in PATTERNS:
text, n = pattern.subn(f"[{name}]", text)
found += [name] * n
return text, found
logs = [
"طلبي ما وصل، جوالي 0551234567 وإيميلي sara.m@example.com",
"حوّلوا المبلغ على SA0380000000608010167519",
"رقم هويتي 1012345678 وأبي أغيّر العنوان",
"كم سعر التوصيل لأبها؟",
]
for line in logs:
clean, found = redact(line)
print(clean, " <-", ", ".join(found) or "nothing")
النص يبقى مفيدًا للتحليل، فما زلت تعرف أن الرسالة عن طلب متأخر، لكن لا أحد يقرأ السجل يستطيع أن يتّصل بصاحبها. الترتيب مهم: الآيبان قبل الجوال حتى لا يلتقط نمط الجوال جزءًا من رقم الحساب. والتعابير النمطية لا تلتقط كل شيء، فالأسماء والعناوين تحتاج أدوات أقوى، ولهذا تُكتب هذه الحدود أيضًا في وثيقة الحدود.
وإن كانت البيانات عن أشخاص في الاتحاد الأوروبي، أو في السعودية تحت نظام حماية البيانات الشخصية، فهناك التزامات قانونية بالموافقة والحذف عند الطلب.
4العرض النهائي
العرض يحكي القصة بترتيب ثابت. انظر إلى الرسم: المشكلة والمستخدم، ثم النظام على حالة حقيقية، ثم الأرقام مقابل المعيار وخط الأساس، ثم حالة يفشل فيها.
اعرض حالة الفشل قبل أن يكتشفها أحد. رسالة فيها طلبان يحيلها النظام لإنسان لأنه يخطئ فيها، وهذا يبني ثقة لا يبنيها عرض مثالي.
كيف يعمل، خطوة بخطوة: كيف تُجري اختبار الغرباء
تكتب خمس مهام مسبقًا، وتجد ثلاثة أشخاص لا يعرفونك ولا يعرفون النظام.
تراقب بصمت، وتسجّل لكل مهمة هل اكتملت وكم استغرقت وأين تعثّر المستخدم.
إن اضطررت للتدخّل، تسجّل المهمة فاشلة مع ما احتاج شرحًا.
تجمع الفشل بحسب المهمة، وتنقل ما تكرّر إلى وثيقة الحدود مع ما يفعله النظام فيه.
أعمق قليلًا
الخصوصية تبدأ في السجلّات لا في سياسة الخصوصية. أغلب تسرّب البيانات في المشاريع الصغيرة يأتي من سجلّات تحفظ كل رسالة كما هي، أرقام جوالات وهويات وحسابات بنكية، في ملف يقرؤه كل من له وصول للخادم. احذف هذه المعلومات قبل أن تُكتب، لا بعد. وإن كانت بيانات أشخاص في الاتحاد الأوروبي، أو في السعودية تحت نظام حماية البيانات الشخصية، فهناك التزامات قانونية بالموافقة والحذف عند الطلب.
مثال محلول
أنت تعرف كيف «يجب» أن يُستخدم نظامك، فتتجنّب أخطاءه دون أن تشعر. الغريب لا يعرف، فيجد الأخطاء بسرعة. ثلاثة مستخدمين، خمس مهام لكل منهم، وأنت تراقب صامتًا وتكتب: هل أنجز المهمة، وكم استغرق.
١. نتائج اختبار الغرباء
import math
def wilson(k, n, z=1.96):
p = k / n
c = (p + z * z / (2 * n)) / (1 + z * z / n)
h = z * math.sqrt(p * (1 - p) / n + z * z / (4 * n * n)) / (1 + z * z / n)
return c - h, c + h
# three strangers, five tasks each, observed without help
sessions = {
"user A": [("track order", True, 40), ("ask about size", True, 25), ("return item", False, 180),
("report damage", True, 60), ("two questions at once", False, 150)],
"user B": [("track order", True, 30), ("ask about size", True, 20), ("return item", True, 90),
("report damage", True, 45), ("two questions at once", False, 200)],
"user C": [("track order", True, 35), ("ask about size", False, 120), ("return item", True, 70),
("report damage", True, 50), ("two questions at once", True, 110)],
}
tasks = [t for s in sessions.values() for t in s]
done = sum(ok for _, ok, _ in tasks)
low, high = wilson(done, len(tasks))
print(f"tasks completed: {done}/{len(tasks)} = {done / len(tasks):.0%} (95% range {low:.0%} .. {high:.0%})")
failed_on = {}
for user, s in sessions.items():
for name, ok, _ in s:
if not ok:
failed_on.setdefault(name, []).append(user)
print("failures by task:")
for name, users in sorted(failed_on.items(), key=lambda kv: -len(kv[1])):
print(f" {name:<22} {len(users)}/3 ({', '.join(users)})")
أحد عشر من خمس عشرة مهمة، لكن المدى من 48% إلى 89%، فخمس عشرة مهمة لا تكفي لرقم دقيق، وليس هذا هدفها. هدفها أن تجد ما يفشل: مهمة «سؤالان معًا» فشلت مع اثنين من ثلاثة، وهي نفس الشريحة التي ظهرت في تحليل الأخطاء. حين يتّفق التقييم الآلي ومستخدمون حقيقيون على نفس الضعف، فهذا أهم سطر في وثيقة الحدود.
جرّب بلا كود
خرافة مقابل حقيقة
| الخرافة | الحقيقة |
|---|---|
| وثيقة الحدود اعتراف بالضعف يُضعف الثقة. | هي جزء من المنتج: تخبر المستخدم متى يثق ومتى يتحقّق بنفسه، فتجعل النظام أكثر أمانًا وقابلية للاستخدام. |
| الخصوصية تبدأ بكتابة سياسة الخصوصية. | تبدأ في السجلّات. أغلب التسرّب في المشاريع الصغيرة من سجلّات تحفظ كل رسالة كما هي. ما لا يُكتب لا يتسرّب. |
| العرض الناجح يُظهر النظام بلا أخطاء. | أظهر حالة الفشل بنفسك قبل أن يكتشفها غيرك، مع ما يفعله النظام فيها. هذا يبني ثقة لا يبنيها عرض مثالي. |
جرّب بنفسك
أين يُحذف رقم جوال العميل من الرسالة؟
ما لا يُكتب لا يتسرّب. الحذف اللاحق يترك نافذة زمنية، ونسخًا احتياطية، وسجلّات منسوخة لأماكن أخرى، وكلها تحمل الرقم.
ماذا يجب أن تتضمّن وثيقة الحدود عن شريحة يفشل فيها النظام؟
جملة عامة لا تساعد المستخدم أن يقرّر متى يتحقّق بنفسه. الشريحة المحدّدة ورقمها وسلوك النظام فيها هي ما يجعل الوثيقة قابلة للاستخدام.
بطاقات مراجعة سريعة
تحقق من فهمك
مستخدم في اختبار الغرباء كتب رسالة بشكل لم تتوقّعه وفشل النظام. شرحت له كيف يكتبها فنجح. كيف تسجّل هذه المهمة؟
فاشلة، مع ملاحظة ما احتاج الشرح. المستخدم الحقيقي لن يكون معك ليشرح له أحد. وهذه الملاحظة أثمن من النجاح، لأنها تخبرك إما بشريحة تحتاج معالجة، أو بحدّ يُكتب في وثيقة الحدود، أو بواجهة تحتاج أن توضّح ما المتوقّع.
في دالة التنقيح، لماذا يأتي نمط IBAN قبل نمط الجوال؟
حتى لا يلتقط نمط الجوال جزءًا من رقم الحساب. بعد استبدال IBAN كاملًا لا يبقى من أرقامه ما يطابقه نمط آخر.
خمس عشرة مهمة أعطت مدى من 48% إلى 89%. لماذا لا تزال مفيدة؟
لأن غرضها ليس رقمًا دقيقًا بل كشف ما يفشل. وقد كشفت أن مهمة السؤالين معًا فشلت مع اثنين من ثلاثة.
مصادر هذا الدرس
مرتّبة بالنوع. ابدأ بالتوثيق الرسمي إذا تبي المرجع الدقيق، وبالمقال أو الفيديو إذا تبي الشرح أولًا.
خلّصت الدرس؟
سجّل الدخول ليُحفظ تقدّمك.