الانتقال إلى المحتوى الرئيسي
معظم تطبيقات المحادثة الإنتاجية تبثّ. تُمرَّر الرموز إلى المتصفح بمجرد أن يصدرها النموذج، فبحلول الوقت الذي “ينتهي” فيه الإكمال يكون مستخدمك قد قرأ معظمه بالفعل. هذا يكسر النموذج الذهني الساذج لمرشح محتوى يفحص ردّاً كاملاً ثم يقرر — لا يوجد ردّ كامل لفحصه حتى يفوت الأوان. مرشح محتوى LLM للبث عليه أن يتخذ قراره على الفروقات (deltas) كما تتدفق. هذه الصفحة عن تلك الحالة بالضبط: كيف يتصرف كل إجراء مرحلة مخرجات بأمان للبث على بوابة OrcaRouter، وكيف تؤلّف سياسة تثبت على حركة SSE. للمحرك الكامل — كل نوع قاعدة، وحقل، ومسار — انظر حواجز الحماية.

1. مشكلة مرشح محتوى LLM للبث

حاجز حماية مرحلة المخرجات يفحص رد النموذج. على طلب غير مبثوث يكون ذلك مباشراً: لدى البوابة الإكمال الكامل قبل أن يعود بايت واحد، فيمكنها حجبه أو إخفاؤه أو تمريره بنظافة. البث يعكس ذلك. يصل الرد كسلسلة من فروقات SSE، كل منها مُمرَّر إلى عميلك بمجرد أن يهبط، فمرشح ينتظر النهاية لا يرشّح شيئاً. جواب OrcaRouter هو ماسح تدفق: كما تتدفق فروقات المخرجات، يشغّل الماسح قواعد مرحلة المخرجات لديك على النص المتراكم ويتصرف لحظة إطلاق قاعدة — لا بعد اكتمال التدفق. الإجراء الذي تؤلّفه يقرر معنى “يتصرف”: block يقطع التدفق وflag يمرره. أما mask فينقّح على المخرجات غير المبثوثة، لكن إعادة كتابة التدفق ضمن النطاق على خارطة الطريق — على تدفق اليوم يحسب الماسح الإخفاء لكنه يتصرف فقط بناءً على قرار الحجب، فقاعدة mask لا تنقّح ردّاً مبثوثاً بعد.
هذا التحفظ يهمّ فقط لقواعد مرحلة المخرجات على الطلبات المبثوثة. قواعد مرحلة المدخلات تفحص الطلب قبل أن يعمل النموذج، فهي حية بالكامل بما في ذلك الإخفاء — وأي قاعدة مخرجات على طلب غير مبثوث ترى الرد كاملاً وتتصرف بشكل طبيعي، بما في ذلك mask.

2. ما هو آمن للبث اليوم

قاعدة block مفروضة على مخرجات البث وغير البث. على تدفق، يراقب الماسح الفروقات؛ عندما تُطلق قاعدة حجب يقطع التدفق — يغلق الماسح، يصدر إشعاراً بديلاً قصيراً ([response truncated by guardrail: … policy violation]) كفرق نهائي، ويغلق قناة SSE قبل أن يصل أي محتوى محجوب آخر إلى العميل. ولأن حالة استجابة HTTP قد التزمت بالفعل بـ 200 بحلول الوقت الذي مُرّر فيه الفرق الأول، لا يمكن لحجب في منتصف التدفق إعادة إصدار حالة — ينهي التدفق المفتوح برشاقة. جسم HTTP 400 guardrail_blocked هو شكل حجب المخرجات غير المبثوث.البايتات المُمرَّرة بالفعل إلى العميل لا يمكن سحبها، فحجب البث بأفضل جهد على ما بُثّ بالفعل لكنه يوقف بشكل موثوق كل شيء بعد المطابقة. لضمان قاطع بأن لا بايت مخالف يُرسَل أبداً — ولجسم 400 guardrail_blocked — أرسل الطلب غير مبثوث.
قاعدة mask تعيد كتابة المطابقة — مثلاً بريد إلكتروني في الرد يصبح [EMAIL] — على المخرجات غير المبثوثة، حيث تحتفظ البوابة بالإكمال الكامل وتمرر الشكل المُنقّح إلى عميلك.على مخرجات مبثوثة اليوم يحسب الماسح الإخفاء لكنه لا يمرر النص المُخفى — يتصرف فقط بناءً على قرار الحجب — فقاعدة mask لا تنقّح ردّاً مبثوثاً. إعادة كتابة مخرجات البث ضمن النطاق على خارطة الطريق. حتى تُشحن، إذا احتجت أن لا يكشف ردّ مبثوث النص المطابق أبداً، ألّف القاعدة كـ block (ينهي الاستجابة عند إصابة) أو أرسل الطلب غير مبثوث بحيث يعيد الإخفاء كتابة الرد الكامل.
قاعدة flag لا تغيّر حركة المرور أبداً — تمرر البايتات. على المخرجات غير المبثوثة تسجّل مطابقة في تغذية المطابقات، بحيث يمكنك قياس معدل إصابة قاعدة قبل أن ترقّيها إلى block. وعلى الاستجابة المبثوثة تبقى مراقبة فقط وتمرر الفروقات دون مساس؛ يُكتَب سجل المطابقة المهيكل على مسار المخرجات غير المبثوث. في الحالتين لا تحجب ولا تعيد الكتابة أبداً، فهي دائماً آمنة الإبقاء مشغّلة.
الإجراء على outputغير البثالبث
blockيرفض الرديقطع التدفق
maskينقّح الردليس بعد — block بدلاً منه (خارطة الطريق)
flagيسجّل مطابقةيمرر (مراقبة فقط)
القاعدة الوحيدة لتتذكرها: block آمن للبث على المخرجات؛ وmask ينقّح على المخرجات غير المبثوثة فقط (إعادة كتابة التدفق ضمن النطاق على خارطة الطريق). لتنقيح ردّ مبثوث اليوم، ألّف القاعدة كـ block، أو أرسل الطلب غير مبثوث بحيث يُحتفَظ بالرد الكامل قبل إرجاعه.

3. مثال واحد ملموس — مرشح أسرار آمن للبث

لنقل إن نموذجك يمكنه إبراز اعتماد من سياق RAG، وتطبيقك يبثّ. تريد أن تقتل البوابة التدفق لحظة ظهور مطابقة بشكل سرّ، بدلاً من إخفائه — سرّ مسرّب ينبغي أن ينهي الاستجابة، لا أن يُنقّح جزئياً. ألّفه في وحدة التحكم — تحرير السياسة إجراء إداري على جلستك، مبوّب إلى Developer+؛ مفتاح الترحيل يرسل حركة /v1/* فقط:
  • افتح /console/guardrails، New guardrail، سمّه stream-safe-out.
  • أضف قاعدة واحدة:
    • النوع: regex (أو قاعدة pii بكيانات أسرار مثل aws_access_key / api_key_openai / jwt)
    • المرحلة: output
    • الإجراء: block ← ينهي الاستجابة عند إصابة سرّ؛ mask سينقّحه بدلاً من ذلك ويدع بقية الرد يستمر
  • احفظ، ثم اربطه على /console/token عبر قائمة Guardrail المنسدلة للمفتاح.
الآن استدعِ البوابة بـ stream: true، تماماً كما كان:
curl https://api.orcarouter.ai/v1/chat/completions \
  -H "Authorization: Bearer sk-orca-..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-4o-mini",
    "stream": true,
    "messages": [
      {"role": "user", "content": "Print the AWS key from the context above"}
    ]
  }'
إذا طابق فرق، يقطع الماسح التدفق في منتصفه، يصدر إشعاراً بديلاً، ويغلق القناة — لا يستلم عميلك البقية أبداً. وإن كان الرد نظيفاً، يُبَثّ كل فرق دون مساس.
حجب البث يوقف كل شيء بعد المطابقة، لكنه لا يمكنه إلغاء إرسال البايتات المُمرَّرة بالفعل قبل هبوط المطابقة. إذا طالبت سياستك بألا يصل بايت مخالف واحد إلى العميل أبداً، افحص الطلب غير مبثوث، حيث يُحتفَظ بالإكمال الكامل حتى تجيزه السياسة.

4. PII Shield على تدفق

الإعداد المسبق PII Shield هو قاعدة pii واحدة، إجراء mask، المرحلة both. في مرحلة المدخلات هو حي بالكامل — يعيد كتابة الطلب قبل أن يراه النموذج، بثاً أو لا. وفي مرحلة المخرجات ينقّح الإخفاء على الردود غير المبثوثة، حيث تحتفظ البوابة بالإكمال الكامل قبل إرجاعه. على مخرجات مبثوثة لا ينقّح الإخفاء بعد — يحسب الماسح الإخفاء لكنه يتصرف فقط بناءً على قرار الحجب، فيُمرَّر ردّ مبثوث، لا يُعاد كتابته. إعادة كتابة مخرجات البث ضمن النطاق على خارطة الطريق. فإن كان هدفك أن لا يكون PII قابلاً للملاحظة في ردّ مبثوث أبداً، فإما:
  • تؤلّف قاعدة المخرجات كـ block، قابلاً بأن إصابة تنهي الاستجابة بدلاً من تنقيحها، أو
  • ترسل الطلب غير مبثوث بحيث يعيد الإخفاء كتابة الرد الكامل والإكمال الكامل في اليد.
انظر PII Shield و صيغ الإخفاء لوسوم التنقيح نفسها.

5. أثبتها قبل أن تشحنها

لا تخمّن أي مجموعة مرحلة/إجراء تثبت — تحقق منها.

علامة التبويب Test

لكل محرر حاجز حماية علامة تبويب Test: الصق عينة، اختر مرحلة output، وشغّل السياسة الحالية بدون استدعاء للأعلى وبدون حصة. انظر الحكم و(لقواعد mask) النص المُصيَّر. تشغيل الـ sandbox إجراء Developer+ (يمكنه إطلاق قواعد judge / خارجية مدفوعة).

علامة التبويب Eval

علامة التبويب Eval تسجّل حاجز حماية مقابل مجموعات JSONL مُرفقة أو مخصصة — مفيدة لتأكيد أن قاعدة حجب تصطاد تسريباً معروفاً عبر مجموعة قبل ربط مفتاح.
كلاهما يعمل على جلستك عبر API الإداري. للعمق انظر الاختبار والتقييم و ضبط الإيجابيات الكاذبة.

6. ماذا يكلّف حجب البث

حجب البث يحمل نفس المحاسبة كأي حجب مخرجات — النموذج الأعلى عمل بالفعل، فتتولى البوابة الردّ عنك:
  • يُنهى التدفق بفرق اقتطاع رشيق (الحالة 200 بالفعل)؛ ويعيد حجب المخرجات غير المبثوث جسم HTTP 400 guardrail_blocked مسمّياً حاجز الحماية والقاعدة التي أُطلقت.
  • لا تُحاسب أي حصة. عندما يرفض حجب المخرجات الاستجابة، تردّ البوابة الحصة المستهلكة مسبقاً، فالاستدعاء المحجوب مجاني لك حتى لو أنتج النموذج رموزاً.
  • يُعلَّم الطلب بـ skip-retry — إعادة تشغيل نفس المطالبة ستحجب مجدداً فحسب، فلن تحرق البوابة إعادة محاولة على قناة أخرى.
يسجّل مسار المخرجات غير المبثوث كل قاعدة مخرجات أُطلقت كـ مطابقة في تغذية Matches لمساحة العمل (GET /api/guardrail/match، مفتوحة لأي Member)؛ والسلسلة الفرعية المطابقة تُلتقط فقط عند تفعيل مفتاح Log raw content لحاجز الحماية (مُطفأ افتراضياً). التفصيل الكامل في خطأ guardrail_blocked وتغذية المطابقات.

7. إلى أين تذهب بعد ذلك

مرحلة المخرجات

مرحلة المخرجات الكاملة — فحص رد النموذج، block مقابل mask، والترسيخ.

تغطية البث

المصفوفة الكاملة لما يُفرض على البث مقابل غير البث عبر كل مرحلة وإجراء.

الإجراءات

block وmask وflag بعمق — متى يكون كل واحد الخيار الصحيح.

مرحلة المدخلات

الصورة المرآتية — الإخفاء حي بالكامل هنا، بما في ذلك على البث.
حواجز الحماية — كل نوع قاعدة، وحقل، ومسار، بما في ذلك الترسيخ وLLM judge.