أذكرها وكأنها البارحة. كانت الساعة تقارب الثانية بعد منتصف الليل في المكتب، ورائحة القهوة المرة تختلط برائحة الميرمية التي اعتدتُ على شربها في ليالي العمل الطويلة. لم يكن في المكتب سواي وأنس، الشاب اليافع في فريق الامتثال (Compliance). كان أنس يحدق في شاشتين أمامه، عيناه محمرتان من التعب، وعلى إحدى الشاشات قائمة PDF طويلة من إحدى الجهات الرقابية، وعلى الأخرى نظامنا الداخلي.
رن هاتفي فجأة، وكان المتصل مدير المنتج في إحدى الشركات التي نقدم لها حلولنا المالية. صوته كان حاداً ومتوتراً: “أبو عمر، شو القصة يا خال؟ عنا عملاء بستنوا يومين وتلات عشان يتفعل حسابهم! النظام الآلي اللي بعتونا إياه طلع مش آلي ولا إشي!”.
شعرت بالحرارة تتصاعد في وجهي. كان محقاً. لقد بنينا لهم نظام “اعرف عميلك” (KYC) متطوراً، يقوم بقراءة الهوية الشخصية وجواز السفر آلياً باستخدام تقنيات OCR، ويتحقق من صحة المستندات، كل شيء كان يتم في أقل من دقيقة… إلا خطوة واحدة كانت بمثابة الجحيم: التحقق من قوائم المراقبة (Watchlists).
نظرت إلى أنس الذي كان لا يزال يقوم بعملية بحث يدوية (Ctrl+F) عن اسم “محمد أحمد علي” في ملف PDF يحتوي على آلاف الأسماء. هذه العملية اليدوية كانت عنق الزجاجة الذي يخنق نظامنا الآلي بالكامل. في تلك اللحظة، أدركت أننا لا نستطيع الاستمرار هكذا. لم تكن المشكلة في سرعة أنس، بل في بدائية العملية نفسها. كان لا بد من حل جذري، حل تقني يحررنا من هذا الكابوس اليدوي. ومن هنا بدأت رحلتنا.
ما هو جحيم قوائم المراقبة اليدوية؟
قبل أن نغوص في الحل، دعونا نفهم المشكلة جيداً. في عالم التكنولوجيا المالية (Fintech)، يعد التحقق من هوية العميل (KYC) حجر الزاوية للامتثال للقوانين الدولية لمكافحة غسيل الأموال (AML) وتمويل الإرهاب (CTF). جزء أساسي من هذا التحقق هو التأكد من أن العميل ليس مدرجاً في أي من قوائم المراقبة العالمية.
ما هي قوائم المراقبة (Watchlists)؟
هي قوائم تصدرها هيئات حكومية ودولية (مثل مكتب مراقبة الأصول الأجنبية الأمريكي OFAC، الأمم المتحدة، الاتحاد الأوروبي) وتحتوي على أسماء أفراد وكيانات مفروض عليهم عقوبات أو يعتبرون “أشخاصاً ذوي خطورة سياسية” (Politically Exposed Persons – PEPs). التعامل مع أي شخص في هذه القوائم يعرض شركتك لغرامات باهظة ومشاكل قانونية ضخمة.
المشكلة الحقيقية: الفوضى اليدوية
كان سير العمل القديم لدينا يبدو “آلياً” على الورق، ولكنه في الحقيقة كان كابوساً تشغيلياً:
- التقديم الآلي: يقوم العميل برفع هويته، ويقوم نظامنا باستخلاص البيانات (الاسم، تاريخ الميلاد، الجنسية) في ثوانٍ.
- عنق الزجاجة اليدوي: يتم إرسال تنبيه لموظف الامتثال (المسكين أنس في قصتنا).
- البحث المضني: يقوم الموظف بفتح عدة ملفات (PDF, CSV) من مصادر مختلفة.
- لعبة “ابحث عن الاختلافات”: يبدأ الموظف بالبحث عن الاسم يدوياً. وهنا تبدأ المشاكل الحقيقية:
- تشابه الأسماء: اسم شائع مثل “أحمد محمود” قد يظهر مئات المرات.
- اختلافات إملائية: هل الاسم “Mohammad” أم “Muhammad” أم “Mohammed”؟ هل هو “عبد الرحمن” أم “Abdelrahman”؟
- الأسماء المستعارة والألقاب: القوائم مليئة بالأسماء الحركية والألقاب.
- التحقق الإضافي: عند العثور على تطابق محتمل، يجب على الموظف مقارنة تاريخ الميلاد والجنسية وأي معلومات أخرى متاحة يدوياً لتجنب النتائج الإيجابية الخاطئة (False Positives).
هذه العملية كانت تستغرق من 15 دقيقة إلى عدة ساعات لكل عميل، وفي أوقات الذروة، كانت الطلبات تتراكم لأيام. كان الأمر مكلفاً، بطيئاً، ومحفوفاً بخطر الخطأ البشري.
مهمة الإنقاذ: بناء محرك المطابقة الذكي
كان الهدف واضحاً: نحتاج إلى نظام آلي بالكامل يقوم بفحص قوائم المراقبة في ثوانٍ، وبدقة تفوق دقة الإنسان. قسمنا المشروع إلى ثلاث مراحل رئيسية.
المرحلة الأولى: تجميع البيانات وتوحيدها
لا يمكن لأي نظام ذكي أن يعمل على ملفات PDF متفرقة. كانت خطوتنا الأولى هي بناء قاعدة بيانات مركزية وموحدة لجميع قوائم المراقبة.
نصيحة أبو عمر: يا جماعة، قبل ما تكتبوا سطر كود واحد، ابحثوا عن واجهة برمجية (API). وقتكم أثمن من إعادة اختراع العجلة. العديد من الجهات الرقابية توفر بياناتها بصيغة منظمة (XML, CSV)، وبعض الشركات التجارية (RegTech) توفر APIs مجمعة لكل القوائم مقابل اشتراك. هذا يوفر عليك شهوراً من العمل.
قمنا بالاشتراك في خدمة توفر لنا وصولاً عبر API لأغلب القوائم العالمية المحدثة باستمرار. بنينا خدمة صغيرة (Microservice) تقوم بسحب هذه البيانات يومياً وتخزينها في قاعدة بيانات Elasticsearch، والتي تتميز بقدراتها الفائقة في البحث النصي.
المرحلة الثانية: سحر المطابقة التقريبية (Fuzzy Matching)
هنا يكمن قلب الحل. مقارنة النصوص بشكل حرفي (e.g., `name1 == name2`) هي وصفة للفشل. نحتاج إلى خوارزميات تفهم أن “محمد خليل” و “Mohamad Al-Khalil” هما على الأرجح نفس الشخص.
هذا ما يسمى بـ “المطابقة التقريبية” أو Fuzzy Matching. بدلاً من إعطاء نتيجة (نعم/لا)، تعطي هذه الخوارزميات درجة تشابه بين 0 و 100.
هناك العديد من الخوارزميات لهذا الغرض، أشهرها:
- مسافة ليفنشتاين (Levenshtein Distance): تحسب عدد التعديلات (حذف، إضافة، استبدال) اللازمة لتحويل كلمة إلى أخرى.
- خوارزمية Jaro-Winkler: تعطي وزناً أكبر للأحرف المتشابهة في بداية الكلمة، وهي ممتازة للأسماء الشخصية.
استخدمنا مكتبة بايثون شهيرة تسمى fuzzywuzzy والتي تبسط استخدام هذه الخوارزميات.
مثال كود بسيط بلغة بايثون
هذا مثال بسيط يوضح كيف يمكن استخدام المكتبة لمقارنة اسمين:
from fuzzywuzzy import fuzz
def get_match_score(user_name, watchlist_name):
"""
Calculates a composite fuzzy match score.
"""
# يقارن السلاسل النصية كما هي
simple_ratio = fuzz.ratio(user_name.lower(), watchlist_name.lower())
# يتجاهل ترتيب الكلمات، ممتاز للأسماء مثل "علي أحمد" و "أحمد علي"
token_sort_ratio = fuzz.token_sort_ratio(user_name.lower(), watchlist_name.lower())
# يأخذ أعلى درجة من الخوارزميات المختلفة
# هذا يعطينا مرونة أكبر في التعامل مع أنواع مختلفة من الاختلافات
final_score = max(simple_ratio, token_sort_ratio)
return final_score
# --- التجربة ---
user_name_from_id = "Mohamad N. Khalil"
watchlist_name_1 = "Mohammed Nazmi Al-Khalil"
watchlist_name_2 = "John Smith"
score1 = get_match_score(user_name_from_id, watchlist_name_1)
score2 = get_match_score(user_name_from_id, watchlist_name_2)
print(f"Score for '{watchlist_name_1}': {score1}")
# Expected output: درجة عالية، مثلاً 85 أو أعلى
print(f"Score for '{watchlist_name_2}': {score2}")
# Expected output: درجة منخفضة جداً
نصيحة أبو عمر التقنية: لا تعتمدوا على خوارزمية واحدة فقط. قمنا بدمج عدة مقاييس (مثل `ratio` و `token_sort_ratio`) وأعطينا أوزاناً مختلفة لكل منها. كما قمنا بمعالجة الأسماء مسبقاً (Preprocessing) عن طريق إزالة الألقاب الشائعة (مثل Mr, Mrs)، وتحويل الأحرف إلى حالة صغيرة (lowercase)، وتوحيد بعض الأحرف (مثل إزالة النقاط من “أ” و “إ” لتصبح “ا”). هذا يزيد من دقة المطابقة بشكل كبير.
المرحلة الثالثة: نظام تسجيل النقاط واتخاذ القرار
الحصول على درجة تشابه 85% لا يعني بالضرورة أن الشخص هو نفسه. الخطوة الأخيرة كانت بناء نظام تسجيل نقاط (Scoring System) يأخذ في الاعتبار عوامل أخرى:
- مطابقة الاسم: درجة المطابقة التقريبية (Fuzzy Score) لها الوزن الأكبر.
- مطابقة تاريخ الميلاد: هل يتطابق تاريخ الميلاد؟ حتى التطابق الجزئي (نفس السنة والشهر) يزيد من النقاط.
- مطابقة الجنسية/بلد الإقامة: تطابق هذه المعلومة يزيد من النقاط بشكل كبير.
بناءً على النتيجة الإجمالية، يقوم النظام باتخاذ واحد من ثلاثة قرارات:
- Auto-Approve (موافقة آلية): إذا كانت النتيجة النهائية أقل من حد معين (مثلاً 40). العميل يتم تفعيله في ثوانٍ. ✅
- Manual Review (مراجعة يدوية): إذا كانت النتيجة في نطاق متوسط (مثلاً بين 40 و 85). يتم إرسال تنبيه لموظف الامتثال مع كل المعلومات مجمعة أمامه لمراجعتها. هذا هو المكان الذي يتدخل فيه الإنسان، ولكن فقط للحالات الرمادية والمشكوك فيها. ⚠️
- Auto-Reject / High Alert (رفض آلي / تنبيه عالي): إذا كانت النتيجة عالية جداً (مثلاً أعلى من 85) مع تطابق في معلومات أخرى. يتم إيقاف العملية فوراً وإرسال تنبيه عالي الأولوية لفريق الامتثال. 🛑
النتائج: من أيام إلى ثوانٍ
بعد إطلاق النظام الجديد، كانت النتائج مذهلة وفاقت توقعاتنا:
- 95% من العملاء أصبحت تتم الموافقة على حساباتهم في أقل من 30 ثانية.
- 4% من الحالات فقط أصبحت تتطلب مراجعة يدوية، مما حرر فريق الامتثال للتركيز على الحالات المعقدة حقاً.
- انخفضت تكاليف التشغيل المتعلقة بعملية KYC بنسبة تقارب 70%.
- الأهم من ذلك، ارتفع رضا عملاء عملائنا بشكل كبير، وتحولت الشكاوى إلى إشادات بسرعة الإنجاز.
الخلاصة ونصيحة أخيرة 🚀
يا أصدقائي المبرمجين ورواد الأعمال، قصة تحول نظام الـ KYC لدينا هي مثال حي على أن الأتمتة الذكية ليست مجرد رفاهية تقنية، بل هي ضرورة حتمية للبقاء والنمو في عالم التكنولوجيا المالية. المشاكل التي تبدو معقدة ومستحيلة الحل يدوياً، يمكن تفكيكها وحلها بكفاءة مذهلة باستخدام الأدوات البرمجية الصحيحة والعقلية الهندسية السليمة.
نصيحتي الأخيرة لكم: لا تخافوا من تحدي العمليات اليدوية في شركاتكم. ابحثوا عن عنق الزجاجة، تلك العملية البطيئة والمملة التي يكرهها الجميع. غالباً ما تكون هذه هي الفرصة الأكبر للابتكار وتحقيق قفزة نوعية. ابدأوا اليوم، ولو بخطوة صغيرة، لأن منافسيكم بالتأكيد قد بدأوا بالفعل.