إعداد ملف تدريب محادثات متعددة الخطوات (Multi-turn) لمساعد بنكي

تفاصيل المشروع

أنا أعمل على مساعد بنكي ذكي (LLM) خاص لمساعد بنكي، والموديل يعتمد على JSON ثابت فيه حقول مثل:

conversation

entities

session

message

reply

metadata

success

حاليًا عندي Dataset مبدئي لأمثلة بسيطة (جملة واحدة → رد واحد) للخدمات التالية:

alias_transfer (تحويل بالاسم)

mobile_transfer (تحويل لرقم موبايل)

check_balance (الاستعلام عن الرصيد)

find_atms (البحث عن أقرب صراف آلي)

customer_support (الدعم العام والخدمات)

null (رسائل خارج نطاق الخدمات البنكية)

وأيضًا عندي مثال جاهز لسيناريو اسمه:

UWallet Multi-turn Reset Training Examples

مثل الحوار التالي:

"بدي احول 100 دينار لمحمد"

"خليهم 50"

"خليهم 70"

"رجع من الأول"

"بدي احول 20 دينار لعلي"

"نعم"

المطلوب من المستقل

أحتاج مستقل يساعدني في:

تصميم وكتابة أمثلة تدريب Multi-turn (محادثات كاملة) لكل خدمة من الخدمات التالية:

alias_transfer

mobile_transfer

check_balance

find_atms

customer_support

null (أسئلة عامة/طلبات غير بنكية)

كل سيناريو يكون عبارة عن حوار كامل (3–10 رسائل) مع مراعاة الحالات التالية:

تعديل المبلغ أكثر من مرة قبل التأكيد

تغيير المستفيد (من محمد → علي، أو من alias → mobile والعكس)

عبارات مثل:

"رجع من الأول" (إعادة العملية من الصفر)

"لا، غير المبلغ"

"لا، خليه لرقم 079..."

رسائل غير بنكية وسط عملية التحويل مثل:

"بدي شورما" → النظام يحافظ على الكيانات ويطلب من المستخدم إذا يحب يكمل العملية أو لا

تأكيد نهائي: "نعم" / "ايوا" / "حولهم"

إلغاء: "لا" / "بعدين" / "ما بدي"

كل خطوة في الحوار لازم يكون لها JSON Output جاهز بنفس الشكل الموجود عندي الآن، مثل المثال التالي (فقط مثال للتنسيق):

{

"conversation": {

"state": "confirming",

"intent": "alias_transfer",

"requires_confirmation": true,

"is_complete": false

},

"entities": {

"amount": 20.0,

"currency": "JOD",

"alias": "محمد",

"mobile_number": null

},

"session": {

"action": "keep",

"status": "active"

},

"message": "هل تؤكد التحويل 20.0 JOD إلى محمد؟"

}

المهم:

عدم تغيير بنية الـ JSON ولا أسماء الحقول

فقط نغيّر القيم حسب سياق الحوار (state, intent, entities, session.action, message, …)

تنظيم البيانات في ملف واحد بصيغة JSONL مثل الموجود عندي حاليًا:

{"input": "...", "output": "...json..."}

{"input": "...", "output": "...json..."}

...

input = إمّا رسالة واحدة، أو "Context: {...}\n\nنص الرسالة"

output = JSON كنص (string) جاهز للاستخدام في التدريب.

المخرجات المتوقعة

ملف multi_turn_training.jsonl يحتوي تقريبًا:

محتاج 100-150 حوار كامل (كل حوار 5-10 خطوات) سيناريو متعدد الخطوات موزّعة على كل Intent

مع التركيز على:

التحويل + التعديل

التحويل + switch بين alias/mobile

التحويل + رسائل غير بنكية (شورما/سؤال عام)

reset: "رجع من الأول"

ملف توضيحي بسيط (README.md أو ملاحظات) يشرح:

أنواع السيناريوهات

كيف تم تمثيل الـ Context

أي افتراضات مهمة استخدمتها

المهارات المطلوبة

خبرة في التعامل مع LLMs وبيانات التدريب (prompt / completion أو input / output).

فهم جيد للغة العربية (لهجة أردنية/عامية) والتعابير البنكية اليومية.

إتقان JSON ويفضّل Python لتوليد الملف بسهولة.

دقة في الحفاظ على نفس شكل الـ JSON الحالي بدون تغيير.

import json

# أمثلة تدريب لسيناريو حوار متعدد الخطوات مع "رجع من الأول"

# الحوار:

# 1) "بدي احول 100 دينار لمحمد"

# 2) "خليهم 50"

# 3) "خليهم 70"

# 4) "رجع من الأول"

# 5) "بدي احول 20 دينار لعلي"

# 6) "نعم"

multi_turn_examples = [

# 1) أول رسالة: يبدأ تحويل جديد 100 دينار لمحمد → نروح مباشرة لحالة التأكيد

{

"input": "بدي احول 100 دينار لمحمد",

"output": json.dumps({

"conversation": {"state": "confirming", "intent": "alias_transfer"},

"entities": {"amount": 100.0, "currency": "JOD", "alias": "محمد", "mobile_number": None},

"session": {"action": "keep", "status": "active"},

"message": "هل تؤكد التحويل 100.0 JOD إلى محمد؟"

}, ensure_ascii=False),

},

# 2) تعديل المبلغ من 100 → 50 داخل نفس العملية (state=confirming)

{

"input": (

"Context: {\"entities\": {\"amount\": 100.0, \"currency\": \"JOD\", \"alias\": \"محمد\", \"mobile_number\": null}, "

"\"state\": \"confirming\", \"intent\": \"alias_transfer\"}\n\nخليهم 50"

),

"output": json.dumps({

"conversation": {"state": "confirming", "intent": "alias_transfer"},

"entities": {"amount": 50.0, "currency": "JOD", "alias": "محمد", "mobile_number": None},

"session": {"action": "keep", "status": "active"},

"message": "هل تؤكد التحويل 50.0 JOD إلى محمد؟"

}, ensure_ascii=False),

},

# 3) تعديل ثاني للمبلغ من 50 → 70 داخل نفس العملية

{

"input": (

"Context: {\"entities\": {\"amount\": 50.0, \"currency\": \"JOD\", \"alias\": \"محمد\", \"mobile_number\": null}, "

"\"state\": \"confirming\", \"intent\": \"alias_transfer\"}\n\nخليهم 70"

),

"output": json.dumps({

"conversation": {"state": "confirming", "intent": "alias_transfer"},

"entities": {"amount": 70.0, "currency": "JOD", "alias": "محمد", "mobile_number": None},

"session": {"action": "keep", "status": "active"},

"message": "هل تؤكد التحويل 70.0 JOD إلى محمد؟"

}, ensure_ascii=False),

},

# 4) "رجع من الأول" → نرجّع الحالة لبداية محادثة جديدة داخل نفس الجلسة

# نستخدمها لتعليم الموديل إنه يمسح الكيانات ويرجع state=greeting/collecting_info بدون تنفيذ

{

"input": (

"Context: {\"entities\": {\"amount\": 70.0, \"currency\": \"JOD\", \"alias\": \"محمد\", \"mobile_number\": null}, "

"\"state\": \"confirming\", \"intent\": \"alias_transfer\"}\n\nرجع من الأول"

),

"output": json.dumps({

"conversation": {

"state": "greeting",

"intent": None,

},

"entities": {

"amount": None,

"currency": "JOD",

"alias": None,

"mobile_number": None,

},

"session": {"action": "keep", "status": "active"},

"message": "تمام، رح نرجع من البداية. احكيلي من جديد شو حاب تعمل؟",

}, ensure_ascii=False),

},

# 5) بعد reset، يبدأ تحويل جديد 20 دينار لعلي → تأكيد جديد

{

"input": (

"Context: {\"entities\": {\"amount\": null, \"currency\": \"JOD\", \"alias\": null, \"mobile_number\": null}, "

"\"state\": \"greeting\", \"intent\": null}\n\nبدي احول 20 دينار لعلي"

),

"output": json.dumps({

"conversation": {"state": "confirming", "intent": "alias_transfer"},

"entities": {"amount": 20.0, "currency": "JOD", "alias": "علي", "mobile_number": None},

"session": {"action": "keep", "status": "active"},

"message": "هل تؤكد التحويل 20.0 JOD إلى علي؟",

}, ensure_ascii=False),

},

# 6) "نعم" بعد التأكيد الثاني → إتمام العملية وإغلاق الجلسة

{

"input": (

"Context: {\"entities\": {\"amount\": 20.0, \"currency\": \"JOD\", \"alias\": \"علي\", \"mobile_number\": null}, "

"\"state\": \"confirming\", \"intent\": \"alias_transfer\"}\n\nنعم"

),

"output": json.dumps({

"conversation": {"state": "completed", "intent": "alias_transfer"},

"entities": {

"amount": None,

"currency": "JOD",

"alias": None,

"mobile_number": None,

},

"session": {"action": "close", "status": "completed"},

"message": " تم التحويل 20.0 JOD إلى علي بنجاح.",

}, ensure_ascii=False),

},

]

# مثال: دمج الأمثلة الجديدة مع training_data الحالية

# training_data.extend(multi_turn_examples)

تقدم للمشروع

العروض المقدمة

السلام عليكم أستاذ ابراهيم أقترح بدل ما ندخل في مرحلة تدريب طويلة ومكلفة، إننا نستغني نهائيا عن التدريب ونبني شات بوت ذكي مبني على RAG. هذا الحل يعطينا أداء أعل...

السلام عليكم يا استاذ ابراهيم , انا كيرلس نبيل متخصص ذكاء اصطناعي و محلل بيانات بخبرة 3 سنين أنا اطلعت على طلب حضرتك كويس وفاهم كويس جدا إنت محتاج إيه بالظبط با...

ما الذي سأقوم بتنفيذه لكم ١) إعداد 100150 سيناريو Multi-turn حقيقي جميع السيناريوهات باللهجة العامية المناسبة للاستخدام البنكي (أردنية/عربية بسيطة). تتضمن الحال...

السلام عليكم ورحمة الله معك احمد مبرمج python وواجهة البرمجيات api اعمل وخبير ذكاء صناعي يمكنني العمل معك ودمج المطلوب الذي اردته بحيت يتوافق مع طلبك سأوفر لك ....

وعليكم السلام، معك المهندسة حنان من شركة Aqdveloper الأردنية. اشتغلت قبل هيك على مشروع نفس فكرتك تماما بخص داتاسيت محادثات بنكية بالعربي، وبناء سيناريوهات multi...

قبولك لهذا العرض يعتبر اتفاقاً بينك وبين المستقل وسيبقى موقع مستقل وسيطاً بينكما حتى تسليم المشروع. لن تتمكن من تغيير العرض أو إلغائه لاحقًا لذلك تأكد من اختيارك للعرض المناسب باتّباع النصائح التالية:

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

المستقل غير متاح لاستلام مشاريع، يمكنك ارسال تنبيه له لقبول العرض وإعادة المحاولة بعد بضعة ساعات، أو اختيار عرضاً من مستقل آخر.