DSL التوجيه: تأليف لوحة من النماذج التي تفكر مثل Fable 5

DSL التوجيه: تأليف لوحة من النماذج التي تفكر مثل Fable 5

تاريخ النشر

العودة إلى جميع المقالات

لمدة عامين، كانت خطة العمل لـ"المزيد من الذكاء" هي "انتظر النموذج التالي." نعتقد أن هذه وحدة التقدم الخاطئة. الحدود ليست نقطة تفتيش واحدة — إنها مجموعة خبراء. أعط ثلاثة نماذج جيدة نفس المشكلة الصعبة، ودعهم يختلفون، وتحكّم بين الإجابات، والمجموعة تتغلب على أي عضو من أعضائها. غالبًا ما تتفوق على النموذج التالي في جدول الأسعار.

الـ Routing DSL هي كيف تبني تلك اللوحة. إنها استراتيجية توجيه قابلة للبرمجة — YAML + CEL — التي تحول نقطة النهاية OrcaRouter الخاصة بك إلى رسم بياني للاستدلال: التوجيه حسب الصعوبة، التوجيه حسب المهمة، التفرع إلى عدة نماذج في وقت واحد، الحكم أو التصويت على مخرجاتها، التراجع عندما تكون الثقة منخفضة، وضبط كل شيء من أجل التكلفة أو زمن الاستجابة أو الجودة. أنت تكتب القواعد؛ تقوم البوابة بتجميعها وتشغيلها على كل طلب في حوالي 5 ملي ثانية.

هذا المنشور هو الجولة الهندسية: القواعد، المتغيرات التي يمكنك التفرع عليها، المحكمون الأربعة، التسلسل، ومجموعة قواعد إنتاج كاملة في النهاية.


النتيجة أولاً

معياران توضيحيان. (الأرقام توضيحية — وهي تهدف إلى إظهار الشكل من التأثير، وليس لاقتباسها كدرجات رسمية.)

مقارنة الحدود — نقطة نهاية DSL ذات توجيه صعوبة مقابل الحدود المنفردة:


لوحات الاندماج مقابل النماذج المنفردة — تم تسجيلها في 93 من 100 مهمة (من OpenRouter):


ثلاثة أشياء تستحق التحديق فيها:

كل فريق اندماج يهزم كل فرد من أعضائه. أوبوس 4.8 + جي بي تي-5.5 (~67.5%) يتفوق على كل من أوبوس بمفرده (~58.5%) وجي بي تي-5.5 بمفرده (~60%) بفارق 7–9 نقاط. الخلاف هو إشارة؛ التحكيم يحصدها.

يصل الاندماج إلى المستوى التالي. ثلاث لوحات مختلفة تعبر Fable 5 منفرد (~65.5%) باستخدام النماذج فقط أسفل منه.

لا تحتاج إلى اشتراكات باهظة. Opus + Opus الاندماج الذاتي (~65.5%) يضاهي Fable 5 باستخدام نموذج واحد وعينة. مجموعة من رخيصة نماذج — Gemini 3 Flash + Kimi K2.6 + DeepSeek V4 Pro (~64.5%) — تأتي أقل بقليل من Fable 5 بجزء صغير من التكلفة لكل رمز. هذه هي الفكرة الأساسية: اشترِ الذكاء باستخدام الطوبولوجيا، وليس باستخدام الطبقة السعرية التالية.

توجيه DSL هو سطح التحكم الذي يتيح لك إنفاق تلك الطوبولوجيا فقط حيث تكون مجدية — نماذج رخيصة على الـ 80% السهلة، ولوحة دمج على الذيل الصعب.


القواعد في 30 ثانية

مجموعة قواعد هي إصدار، وقائمة من القواعد، وقاعدة افتراضية مطلوبة. يتم تقييم القواعد من الأعلى إلى الأسفل؛ أول شرط متى: يكون صحيحًا يفوز. ولا وجود لمتى: يعني "تطابق دائمًا".

الإصدار: 1

rules:
  - id: only_rule
    use: { model: "claude-sonnet-4-6" }
default:
  delegate: balanced


الـ when: هو عبارة عن CEL تعبير منطقي — معزول، تعبيرات منتظمة RE2 فقط، بدون حلقات، بدون إدخال/إخراج، تقييم بالميكروثانية، مع مهلة واحدة قدرها 5 ميلي ثانية مشتركة عبر مجموعة القواعد بأكملها. الـ use: هو الأثر: حيث يذهب الطلب وكيف يتم ضبطه. الحدود صغيرة عن قصد (≤30 قاعدة، ≤16 كيلوبايت من المصدر، ≤200 حرف لكل when:) لذلك تظل مجموعة القواعد قابلة للتدقيق.


بدائي 1 — مسار حسب الصعوبة والمهمة

يقوم الموزع بتصنيف كل طلب قبل التوجيه ويعرض الميزات على CEL. تقوم بالتفرع عليها مباشرة:

الإصدار: 1

rules:
  - id: hard_reasoning
    when: difficulty > 0.8
    use:
      model: "claude-opus-4-8"
      reasoning_effort: "high"
      thinking_budget_tokens: 32000


  - id: code_path
    when: task_class == "code" && code_keyword_density > 0.5
    use: { model: "gpt-5.5" }


  - id: cheap_chat
    when: difficulty < 0.3
    use: { model: "gemini-3-flash" }


default:
  delegate: balanced


المتغيرات التي يمكنك قراءتها في when: (مختصرة — انظر المرجع الكامل في الوثائق):

مجموعة أمثلة

شكل الطلب

request.input_tokens, request.output_max_tokens, request.stream, request.vision, request.message_count, request.has_tools


تصنيف

task_class (chat/code/agent/vision/audio/rag/creative), difficulty (0.0–1.0), code_keyword_density, reasoning_cue_count, log_prompt_tokens, tool_count


جلسة 

agent_state.turn, agent_state.tools_used, agent_state.has_edited, agent_state.last_test_failed, agent_state.consecutive_errors, agent_state.models_tried


سياق

headers["x-…"], user.group, token.name, time.hour, workspace.id
…plus six macros for the things regex-over-payload is good at: system_prompt_matches(re), user_message_matches(re), tool_definitions_include(name), tool_calls_present_any([…]), tool_results_from_any([…]), header_matches(name, re).


يمكن لأي وجهة حمل مقابض لكل مكالمة، مترجمة إلى المعلمات الأصلية لكل مزود بواسطة محول الترحيل: reasoning_effort (منخفض/متوسط/مرتفع)، thinking_budget_tokens (1024–64000)، samples (1–16)، temperature (0.0–2.0)، بالإضافة إلى param_override / header_override المحمي بقائمة المنع. هذا كافٍ بالفعل لبناء نقطة النهاية الموجهة حسب الصعوبة من الجدول A: نموذج رخيص في الذيل السهل، و Opus بميزانية تفكير في الذيل الصعب.


أولي 2 — التفرع إلى لوحة (اندماج)

هذا هو مصدر رفع المعيار. بشكل متوازٍ: يُرسل التأثير الطلب إلى 2–5 أرجل في وقت واحد، ثم محكم يقرر ما يراه العميل بالفعل:

- id: hard_tail_panel
  when: difficulty > 0.7 && task_class == "agent"
  use:
    parallel:
      - { model: "anthropic/claude-opus-4-8", reasoning_effort: "high" }
      - { model: "openai/gpt-5.5", thinking_budget_tokens: 16000 }
      - { model: "google/gemini-3.1-pro", temperature: 0.3 }
    arbiter:
      strategy: best_of_n
      model: "anthropic/claude-sonnet-4-6"      # the judge
      template: judge_code
    max_latency_ms: 120000
    on_disagreement:                  # majority-only escape hatch
      model: "anthropic/claude-opus-4-8"
      reasoning_effort: "high"


أربع استراتيجيات للحكم، كل منها إجابة مختلفة على سؤال "من الناتج يفوز؟":

الأول — سباق الأرجل، قدم أول نجاح، ألغ الخاسرين. يحسّن زمن الاستجابة (تحصل على الأسرع من N).

أغلبية — تصويت منظم عبر مخرجات المسارات، بدون استدعاء نموذج إضافي. عندما تنقسم المسارات دون أغلبية صارمة، يقوم الفرع الاختياري on_disagreement: بإعادة توجيه محاولة جديدة وأقوى بدلاً من تقديم حسم التعادل. يحسّن المتانة على المهام التي لها إجابة معيارية.

best_of_nحكم LLMيقرأ جميع المرشحين ويصنفهم. هذا هو تكوين Opus + GPT-5.5 → حكم من الجدول B. يحسن الجودةفي العمل المفتوح؛ ويعود إلى أول نجاح إذا أخطأ الحكم.

tests_pass — execution-grounded: قم بتقديم المرشح الذي يجعل مجموعة الاختبارات تمر بالفعل عن طريق تصحيحه. لا تخمين من الحكم — المختبر يقرر. هذا هو الحكم الأقوى لأعمال الكود/الوكيل. يقع المحقق خارج البوابة (موصل عبر VerifierProvider)؛ إذا لم يتم توصيل أي، فإنه يتدهور إلى first-successful.

max_latency_ms (1000–600000، الافتراضي 120000) يحد من التوزيع المتفرع بحيث لا يمكن لمسار بطيء واحد أن يعطل الاستجابة — يتم إسقاط المتخلفين. يُرفض تداخل parallel داخل parallel في lint؛ اللوحة مُتعمَّدة أن تكون بعمق مستوى واحد.

ملاحظة التوفر: يتم تعطيل وقت تشغيل التوزيع المتعدد (N-way fan-out) خلف علامة الخادم ROUTING_DSL_ENSEMBLE_RUNTIME بينما يتم تعزيز الفوترة لكل فرع (per-leg billing) على بيئة التجهيز (staging) — ولهذا السبب فإن الاندماج (fusion) هو preview، وليس GA. عند إيقاف تشغيل العلامة، تخدم قاعدة parallel: بشكل نظيف الفرع الأول، لذا يمكنك تأليف وتجربة لوحاتك اليوم وتشغيلها عندما يصل الاندماج إلى منطقتك.


البدائي 3 — حلول بديلة وتسلسلات الثقة

ينفق Fan-out مبلغ N× مقدمًا. تتالي ينفق المبلغ الإضافي إلا عندما تبدو الإجابة الأولى خاطئة. بعد الرد، يقوم on_low_confidence بتقييم الإشارات، وإذا تم تفعيل واحدة، يعيد التوجيه إلى وجهة أقوى:

- id: agent_with_safety_net
  when: task_class == "agent"
  use:
    pool: "@pool:fast"
  on_low_confidence:
    signals: [patch_invalid, self_doubt, next_turn_test_failed]
    threshold: { low_logprob: -1.5 }
    use:
      model: "claude-opus-4-8"
      reasoning_effort: "high"


الإشارات: تصحيح_غير_صالح (فشل الـdiff في git apply --check)، شك_ذاتي (مجموعة تعبيرات نمطية لعبارات التردد)، انخفاض_الاحتمال (متوسط الاحتمال اللوغاريتمي للرمز تحت العتبة، حيث يوفره المزود)، و فشل_اختبار_الدورة_التالية (مزلاج عبر الأدوار — يحمل موجه هذه الدورة شكل اختبارات الدورة السابقة الفاشلة). المتتاليات بعمق-1 حسب التصميم. اقرنها مع agent_state.models_tried للحصول على تنوع عند إعادة المحاولة — لا ترسل الإصلاح أبدًا إلى النموذج الذي فشل للتو.


ضبط المقاييس: التكلفة، زمن الاستجابة، الجودة

نفس DSL يعبر عن الأهداف الثلاثة جميعها؛ يمكنك الاختيار لكل قاعدة:

التكلفة — التفويض: الأرخص، احتفظ بالنموذج الرخيص على الذيل السهل، واحتفظ بالتوسع للمهام التي تتجاوز صعوبتها 0.7. لوحة B الرخيصة (~64.5% ≈ Fable 5 solo) هي دليل الوجود: اندماج نماذج صغيرة يمكن أن يحل محل نموذج حدودي بجزء بسيط من تكلفة كل رمز. كن واضح الرؤية، رغم ذلك — يستخدم الاندماج "محاسبة كل مسار" نموذج: لوحة best_of_n ذات 3 مسارات تقوم بفوترة ثلاثة مرشحين بالإضافة إلى الحكم. يعمل الاقتصاد لأنك (أ) تقوم بالتوسع فقط على الجزء الصعب من الطلبات و(ب) تدمج أرخص أعضاء من النموذج الحدودي الذي تستبدله.

الكمون — المُحكّم: { strategy: first } مع max_latency_ms ضيق يمنحك أسرع N مع سقف صارم.

الجودة — best_of_n للمهام المفتوحة، tests_pass عندما يكون هناك مجموعة للاستناد إليها. samples و thinking_budget_tokens تشتري المزيد ضمن خطوة واحدة.


تشغيله دون تعطيل الإنتاج

تغييرات التوجيه مخيفة، لذا فإن DSL تأتي مع قضبان الأمان التي يتوقعها SRE:

Lint عند كل حفظ — schema، CEL type-check (every when: يجب أن يُقيَّم إلى bool)، حل المراجع، نطاقات المقابض، قوائم حظر الرؤوس/المعلمات. يتم إرجاع الأخطاء على الشكل {line, column, message, rule} وتظهر كـ gutter chips في المحرر.

تشغيل تجريبي — أرسل طلبًا اصطناعيًا (task_class، difficulty، agent_state، ...) واحصل على القاعدة المطابقة، والتأثير المُحلَّل، ووقت التقييم قبل أن يُشحن أي شيء.

وضع الظل — لمدة 24 ساعة بعد الحفظ الأول، يتم تقييم DSL ولكن لا يُستخدم؛ يسجل سجل الظل التحديدات المحتملة وتظهر وحدة التحكم فرقًا (نسبة المسارات التي تغيرت، فرق التكلفة اليومي المتوقع، عدد مرات إطلاق القواعد لكل قاعدة).

Canary — منزلق حركة مرور من 0 إلى 100. تصعيد 5 → 25 → 50 → 100 مع مراقبة المقاييس لكل شريحة؛ التراجع بالتمرير إلى 0.

التدقيق + التراجع — كل حفظ/تراجع يكتب صف تدقيق في نفس المعاملة؛ التعديلات المتزامنة تحصل على 409 مع الإصدار الحالي بحيث تعيد المحاولة على حالة جديدة.

حالات الاختبار، وإعادة تشغيل التتبع، وعرض الذكاء الاصطناعي "اشرح مجموعة القواعد هذه" يكمل ذلك. ستجده في لوحة التحكم تحت التوجيه → الاستراتيجية → DSL.


مجموعة قواعد كاملة

رخيص على السهل، وسط على المتوسط، لوحة دمج محكومة على الذيل الوكيل الصعب، مع تتابع ثقة تحتها:

الإصدار: 1

rules:
  - id: trivial
    when: difficulty < 0.3 && !has_tools
    use: { model: "gemini-3-flash" }


  - id: standard
    when: difficulty < 0.7
    use:
      model: "gpt-5.5"
    on_low_confidence:
      signals: [self_doubt, low_logprob]
      use: { model: "claude-opus-4-8", reasoning_effort: "high" }


  - id: hard_agent_panel
    when: difficulty >= 0.7 && task_class == "agent"
    use:
      parallel:
        - { model: "anthropic/claude-opus-4-8", reasoning_effort: "high" }
        - { model: "openai/gpt-5.5", thinking_budget_tokens: 16000 }
        - { model: "google/gemini-3.1-pro" }
      arbiter:
        strategy: tests_pass        # execution-grounded; judged fallback if no harness
      max_latency_ms: 180000
      on_disagreement:
        model: "claude-opus-4-8"
        reasoning_effort: "high"


default:
  delegate: balanced


نقطة النهاية هذه هي تلك التي تقع في أعلى الجدول A — ليس لأنها وجدت نموذجاً أفضل، بل لأنها تستخدم النموذج المناسب للطلب المناسب وتدمج لوحة بالضبط حيث تتفوق اللوحة.


ابدأ الإنشاء

القفزة التالية في القدرة لا تحتاج إلى انتظار نقطة التفتيش التالية. إنها رسم بياني يمكنك كتابته بعد ظهر اليوم: مسار حسب الصعوبة، تفرّع على الذيل الصعب، تقييم أو اختبار المخرجات، تتالي عندما ينحدر مستوى الثقة.

الوثائق: https://docs.orcarouter.ai/routing/routing-dsl

واجهة المستخدم:التوجيه → إنشاء الموجه -> استراتيجية التوجيه → DSL (خبير)

الحدود هي لوحة. اذهب وابْنِ لوحتك.