[مراجعة تحسين] ماذا فعلَت وحدة ترجمة YouDub طوال هذا اليوم، أيّ الاتجاهات كانت فعّالة، وأيّها تم دحضه
ساحة المعركة الأساسية في هذا اليوم لم تكن TTS، بل وحدة الترجمة.
والسبب مباشر جدًا: وحدة الدبلجة لاحقًا يمكن استبدالها بحل أقرب إلى خامة الصوت المستهدفة، لكن أظهر نقطة ضعف في الناتج النهائي ما زالت أن ترجمة الترجمة النصية نفسها ليست شبيهة بما اعتادت عليه منتجات B站 الناضجة، خصوصًا:
- في سيناريو rolling caption، الجملة السابقة “تسرق” معلومات الجملة التالية.
- الترجمة الإنجليزية الأصلية مُجزّأة، وإذا تُرجمت الصينية سطرًا بسطر بشكل حرفي فستصبح طويلة ومُلتوية.
- إذا بالغنا في追求 “إكمال الجملة”، سنُسرّب الـ punchline والأسماء والأفعال القادمة مسبقًا.
- وإذا بالغنا في追求 “الإبقاء على حدود الشذرات”، ستصبح الصينية مُجزّأة أكثر من اللازم، ولا تبدو كترجمة نهائية حقيقية.
لذلك في هذه الجولة من التحسين، نقلتُ التركيز من “إصلاح فيديو واحد” إلى “بناء إطار قابل للتعميم لتقييم الترجمة وتكرار تحسينها”.
ماذا فعلتُ تحديدًا في هذا اليوم
1. بناء نظام خط أساس أولًا، بدل الضبط بالحدس
لم أواصل التحديق في فيديو واحد وتصحيح السطور واحدًا واحدًا، بل أخذتُ مباشرةً أكثر من 90 عيّنة مقابلة بين B站/YouTube من C:\\Users\\1\\bili_yt_export\\bili_youtube_first100.csv لبناء خط أساس.
ونفّذتُ شيئَين:
- توسيع
scripts/benchmark_translation.py - إضافة
scripts/analyze_translation_artifact.py
الأول مسؤول عن تشغيل السلسلة الكاملة بالجملة: الترجمة + تقطيع الجمل + إعادة كتابة نص الدبلجة، وإخراج مؤشرات كل حالة والمنتجات الوسيطة.
والثاني مسؤول عن تفكيك كل حالة للنظر فيها بالتفصيل، خصوصًا هذه الطبقات:
source_rowsprepared_source_rowstranslated_rows_pre_splitpredicted_rowsreference_rows
هذه الخطوة حاسمة جدًا، لأن كثيرًا من المشاكل لاحقًا ليست بسبب ما بعد المعالجة، بل لأن LLM في خطوة translated_rows_pre_split يكون قد “استعار” بالفعل محتوى لاحقًا.
2. تحديد المشكلة الجوهرية بوضوح: rolling-caption يستعير ما بعده
أكبر مكسب في هذا اليوم لم يكن قفزة مفاجئة في مؤشر ما، بل تحديد المشكلة الرئيسية بدقة:
في الترجمة التلقائية/الترجمة الرسمية على YouTube توجد بكثرة بنية rolling-caption، حيث تكون كثير من الأسطر أصلًا نصف جملة أو بقايا جملة أو جملة ممتدة عبر عدة أسطر.
إذا طُلب من النموذج “ترجمة طبيعية سطرًا بسطر”، فسيميل جدًا إلى سحب معلومات من سطر أو سطرين لاحقين إلى السطر الحالي، فتبدو الصينية أكثر سلاسة، لكن على خط الزمن يحدث حرق مسبق (spoiler).
هذه المشكلة تظهر بوضوح في حالتي hard: zwIqbrD6JX4 و o2V-JJpJH_I.
3. ترقية fragment_guard ليصبح المسار الافتراضي الرئيسي
استنادًا إلى الاكتشاف أعلاه، جعلتُ fragment_guard مُفعّلًا افتراضيًا.
فكرته الأساسية ليست “إجبار الصينية على أن تكون ناقصة”، بل وضع قيود واضحة على النموذج:
- المعرّف (id) الحالي لا يمكنه التعبير إلا عن المعنى الذي ظهر بالفعل في سطر المصدر الحالي.
- إذا كان سطر المصدر واضحًا أنه شذرة غير مكتملة من rolling-caption، فالأفضل أن تكون الصينية “مفتوحة قليلًا” بدل أن تُكمِل المحتوى القادم مسبقًا.
هذا هو التعديل الوحيد حتى الآن الذي ثبتت فعاليته بشكل مستقر، والذي أنا مستعد لإدخاله كقيمة افتراضية في المسار الرئيسي.
النتائج التي تأكدتُ من فعاليتها حاليًا
إعداد المسار الرئيسي
المسار الرئيسي المستقر حاليًا تقريبًا هو:
- provider:
openai_context - api base:
http://192.168.10.88:8317/v1 - model:
gpt-5.4-mini - prompt profile:
auto_hybrid - temperature:
0 - fewshot:
8 fragment_guard=on- بقية مفاتيح التجارب مُعطّلة افتراضيًا
بيانات التحسن المؤكدة
fragment_guard من التجربة الصغيرة إلى عينة متوسطة كلها مكاسب إيجابية:
- مقارنة 4 حالات:
52.432 -> 53.322 - مقارنة 8 حالات:
55.958 -> 56.058
تقرير المسار الرئيسي الحالي (8 حالات):
- composite:
56.058 - chrF:
0.3707 - char F1:
0.7729 - density MAE ratio:
0.4272
هذا يعني أن المسار الرئيسي الحالي على الأقل أقل ميلًا من النسخ الأقدم إلى استعارة ما بعده مسبقًا، وإيقاعه العام أصبح أقرب لتوزيع ترجمة B站 النهائية.
أيّ اتجاهات تم دحضها تقريبًا في هذا اليوم
1. تفعيل fragment_hints عالميًا
ليس عديم الفائدة تمامًا، بل قوي جدًا في بعض الحالات.
مثلًا:
zwIqbrD6JX4في hard2 ارتفع من54.439إلى57.980VT6rLcVKhzgأيضًا لديه تحسن واضح
لكن المشكلة أنه غير مستقر.
عند تطبيقه على 8 حالات، انخفض الإجمالي من 56.058 إلى 55.296.
أي أنه أقرب إلى “دواء قوي لبنى محددة”، وليس استراتيجية مسار رئيسي يمكن تفعيلها افتراضيًا الآن.
2. auto_hybrid_v2
صنعتُ نسخة أكثر هجومية من منطق اختيار الـ profile تلقائيًا، أردتُ أن يتنقّل كل فيديو تلقائيًا بين literal_context / bilibili_dub / bilibili_pacing.
النتيجة: في 8 حالات هبط مباشرةً إلى 54.375، أسوأ من المسار الرئيسي الحالي 56.058.
الخلاصة بسيطة: منطق البوابة (gating) ليس دقيقًا بما يكفي، ولا يمكن إدخاله للمسار الرئيسي الآن.
3. توسيع نطاق الترجمة الكاملة بالقوة
جرّبتُ اتجاهين:
- رفع عتبة full-context ليُترجم المزيد من الفيديوهات دفعة واحدة كاملة
- تكبير chunk من نافذة صغيرة جدًا إلى كبيرة مباشرة
ظاهريًا يبدو أقرب إلى “فهم كامل ثم ترجمة”، لكنه لم يُعطِ مكاسب مستقرة.
السبب: عندما يزيد السياق، يسهل على النموذج أيضًا الاستعارة عبر المعرّفات (id)، وقد يختل خط الزمن أكثر.
4. جعل حبيبات chunk دقيقة جدًا
مثل فكرة chunk_max_items=2، حدسيًا تبدو كأنها تقلل تداخل الجمل، لكن فعليًا كانت المكاسب ضعيفة جدًا، والسرعة أصبحت أبطأ بشكل ملحوظ.
نتائج hard2 لم تجلب تحسنًا في الجودة، لكن زمن الاستجابة ارتفع كثيرًا، خصوصًا o2V-JJpJH_I كان بطيئًا جدًا.
5. رفع “تلميحات أسلوب B站” إلى الحد الأقصى
اختبرتُ:
literal_contextbilibili_dubbilibili_pacingauto_hybrid
على mixed4، كان auto_hybrid الأفضل، وliteral_context ثانيًا، أما الـ profile ذات “الأسلوب القوي” فكانت أسوأ.
هذا يعني أن المشكلة الآن ليست “كلما تشابهت صياغة الـ prompt مع B站 كان أفضل”، بل يجب أولًا حل حدود السياق، وجمل الشذرات، ومحاذاة التوقيت، ثم نتحدث عن الأسلوب.
أهم تغير في الإدراك خلال هذا اليوم
كنتُ أظن أن المشكلة الأكبر هي “الترجمة ليست طبيعية بما يكفي”، ثم اكتشفتُ أن الأمر ليس كذلك.
المشكلة الأعمق هي:
- الإدخال القبلي نفسه مُجزّأ
- الشذرات فيما بينها متداخلة جدًا
- لكي تبدو الصينية طبيعية لا بد من تعويض بعض النبرة والبنية
- لكن إذا زاد التعويض، سيحدث تسريب مبكر لمحتوى قادم
لذلك أصعب جزء في وحدة الترجمة ليس “من الصينية إلى الإنجليزية” أو “من الإنجليزية إلى الصينية” بحد ذاته، بل:
تحت شرط عدم تجاوز حدود الزمن، تنظيم الإنجليزية المُجزّأة إلى إيقاع صيني يشبه ترجمة نهائية حقيقية.
وهذا ليس نفس مشكلة الترجمة الآلية العادية (MT).
نقاط لم تُحل بعد
رغم أن المسار الرئيسي أصبح أثبت من قبل، إلا أنه ما زال بعيدًا جدًا عن الهدف الذي أريده، خصوصًا لم يصل بعد إلى مستوى الاكتمال في أمثلة B站 التي أعطيتني إياها.
النقاط التي ما زالت واضحة أنها لم تُحل جيدًا:
- بعض حالات hard ما زالت تستعير ما بعده
- في بعض الحالات ما زالت الصينية تحمل “رائحة الترجمة”
- مطابقة الطول بعد تقطيع الجمل ليست مستقرة بما يكفي
fragment_hintsلم يجد بعد شروط بوابة مستقرة- عدد few-shot واختيار العينات لم يُضبطا بعد إلى الأمثل
الخطوات التالية التي أراها الأكثر جدوى
حاليًا، الأكثر جدوى للمتابعة ليس إضافة المزيد من prompt الغامض، بل هذه الثلاثة:
1. بناء بوابة خصائص لـ fragment_hints بدل مفتاح عالمي
نعرف الآن أنه فعّال جدًا في بعض الحالات.
الخطوة التالية هي عمل بوابة بناءً على هذه الخصائص:
- fragmentary source ratio
- overlap ratio
- punctuated source ratio
- short/tiny line ratio
أي تفعيله فقط على الفيديوهات “عالية التجزئة وعالية rolling-caption”، بدل تطبيقه على الجميع.
2. مواصلة التحقق من عدد few-shot
إشارة صغيرة ظهرت في نهاية اليوم: fewshot=4 في hard2 أظهر لأول مرة زيادة صافية طفيفة:
- baseline hard2:
50.454 - fewshot=4 hard2:
50.600
الزيادة ليست كبيرة، لكنها إيجابية.
إذا حافظت mixed4 و mid8 على الاتجاه نفسه، فهذا يعني أن 8 few-shot ربما تحتوي ضوضاء أكثر من اللازم.
3. مواصلة العمل على chunk context “أعطِ سياقًا فقط دون صلاحية ترجمة”
لقد أضفتُ نسخة من نافذة سياق قبل/بعد chunk، لكنها ما تزال تجريبية.
قيمة هذا الاتجاه أنه:
- يمنح النموذج قدرة فهم مقطع كامل
- وفي الوقت نفسه يفرض عليه أن يخرج فقط معرفات (id) الـ chunk المستهدف
وهذا نظريًا أنسب من مجرد تكبير chunk من أجل “فهم كامل دون تجاوز”.
خلاصة هذا اليوم
إذا لخصته بجملة واحدة:
أكبر إنجاز في هذا اليوم لم يكن إنهاء وحدة الترجمة، بل توضيح “لماذا هذه المشكلة صعبة، أين عنق الزجاجة الآن، ما الذي ينفع، وما الذي لا يستحق إحراق الوقت بعد الآن” كمنظومة إدراك واضحة.
الآن أصبح واضحًا على الأقل:
- مشكلة الترجمة في هذا المشروع ليست MT عادية
- حدود rolling-caption هي التناقض الرئيسي
fragment_guardهو المكسب الإيجابي المستقر الوحيد حاليًاfragment_hintsلديه إمكانات، لكنه يحتاج بوابة- few-shot واستراتيجية السياق ما زالا يستحقان الحفر
إذا أردنا لاحقًا صقل هذه الأداة فعلًا باتجاه “أفضل ترجمة ودبلجة لفيديوهات اللغات الأجنبية في العالم”، فلا يمكن لوحدة الترجمة أن تعتمد بعد الآن على ضبط الـ prompt بالحدس؛ يجب مواصلة السير على طريق مدفوع بالـ benchmark، وإسناد الأسباب لكل حالة، ثم A/B صغير خطوة بخطوة.
اليوم على الأقل تم تمهيد هذا الطريق.