بوابات LLM والتوجيه

استراتيجيات توجيه النماذج

3 دقيقة للقراءة

التوجيه الفعال للنماذج يحسّن التكلفة وزمن الاستجابة والجودة من خلال اختيار أفضل نموذج لكل طلب ديناميكياً. يغطي هذا الدرس أنماط التوجيه لنشر LLM الإنتاجي.

عوامل قرار التوجيه

┌─────────────────────────────────────────────────────────────┐
│                   مصفوفة قرار التوجيه                       │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  خصائص الطلب               معايير اختيار النموذج           │
│  ─────────────────          ─────────────────────────       │
│  • تعقيد المهمة            • التكلفة لكل رمز               │
│  • الجودة المطلوبة         • زمن الاستجابة (TTFT، التوليد) │
│  • طول السياق              • حجم نافذة السياق              │
│  • فئة المستخدم            • حدود المعدل المتاحة           │
│  • الميزانية المتبقية       • التوفر الحالي                 │
│                                                             │
│              ┌─────────────────────┐                        │
│              │   محرك قرار        │                        │
│              │    التوجيه         │                        │
│              └──────────┬──────────┘                        │
│                         │                                   │
│         ┌───────────────┼───────────────┐                   │
│         ▼               ▼               ▼                   │
│     GPT-4o         Claude Sonnet    Llama 70B               │
│   (متميز)          (متوازن)        (محسن التكلفة)           │
│                                                             │
└─────────────────────────────────────────────────────────────┘

الاستراتيجية 1: التوجيه القائم على التعقيد

التوجيه بناءً على تحليل تعقيد المهمة:

from litellm import completion
import re

def analyze_complexity(prompt: str) -> str:
    """تقدير تعقيد المهمة من المطالبة."""
    indicators = {
        "high": ["analyze", "compare", "evaluate", "synthesize", "create"],
        "medium": ["explain", "describe", "summarize", "list"],
        "low": ["what is", "define", "translate", "format"]
    }

    prompt_lower = prompt.lower()

    for level, keywords in indicators.items():
        if any(kw in prompt_lower for kw in keywords):
            return level

    # الافتراضي بناءً على الطول
    if len(prompt) > 2000:
        return "high"
    elif len(prompt) > 500:
        return "medium"
    return "low"

def route_by_complexity(prompt: str, messages: list) -> str:
    """اختيار النموذج بناءً على التعقيد."""
    complexity = analyze_complexity(prompt)

    model_map = {
        "high": "gpt-4o",           # $5/1M رمز
        "medium": "claude-sonnet",   # $3/1M رمز
        "low": "gpt-4o-mini"         # $0.15/1M رمز
    }

    return model_map[complexity]

# الاستخدام
prompt = "قارن السياسات الاقتصادية لثلاث دول"
model = route_by_complexity(prompt, [])
response = completion(model=model, messages=[{"role": "user", "content": prompt}])

الاستراتيجية 2: التوجيه الدلالي

استخدام التضمينات لتصنيف الطلبات:

from litellm import embedding, completion
import numpy as np

# تضمينات المسار المحسوبة مسبقاً
ROUTES = {
    "code_generation": {
        "examples": ["اكتب وظيفة Python", "أنشئ REST API"],
        "model": "gpt-4o",  # الأفضل للكود
    },
    "creative_writing": {
        "examples": ["اكتب قصة", "ألّف قصيدة"],
        "model": "claude-sonnet",  # الأفضل للإبداع
    },
    "factual_qa": {
        "examples": ["ما عاصمة فرنسا؟", "متى ولد أينشتاين؟"],
        "model": "gpt-4o-mini",  # فعال التكلفة للأسئلة البسيطة
    }
}

def semantic_route(query: str, route_embeddings: dict) -> str:
    """التوجيه بناءً على التشابه الدلالي."""
    query_embedding = embedding(
        model="text-embedding-3-small",
        input=query
    ).data[0].embedding

    best_route = None
    best_similarity = -1

    for route, route_emb in route_embeddings.items():
        similarity = np.dot(query_embedding, route_emb)
        if similarity > best_similarity:
            best_similarity = similarity
            best_route = route

    return ROUTES[best_route]["model"]

الاستراتيجية 3: سلاسل الاحتياطي

التعامل مع الفشل بسلاسة مع الاحتياطيات:

from litellm import completion
from litellm.exceptions import RateLimitError, ServiceUnavailableError

FALLBACK_CHAIN = [
    {"model": "gpt-4o", "timeout": 30},
    {"model": "azure/gpt-4o", "timeout": 30},
    {"model": "claude-sonnet-4-20250514", "timeout": 30},
    {"model": "gpt-4o-mini", "timeout": 60},  # الملاذ الأخير
]

async def completion_with_fallback(messages: list) -> dict:
    """جرب النماذج بالتسلسل حتى النجاح."""
    last_error = None

    for config in FALLBACK_CHAIN:
        try:
            response = await acompletion(
                model=config["model"],
                messages=messages,
                timeout=config["timeout"]
            )
            return {
                "response": response,
                "model_used": config["model"],
                "fallback_count": FALLBACK_CHAIN.index(config)
            }
        except (RateLimitError, ServiceUnavailableError) as e:
            last_error = e
            continue

    raise last_error

الاستراتيجية 4: موجّه اختبار A/B

مقارنة أداء النموذج في الإنتاج:

import random
from dataclasses import dataclass
from typing import Optional

@dataclass
class ABConfig:
    control_model: str
    treatment_model: str
    treatment_percentage: float

class ABRouter:
    def __init__(self, config: ABConfig):
        self.config = config
        self.results = {"control": [], "treatment": []}

    def route(self, user_id: str) -> tuple[str, str]:
        """توجيه حتمي بناءً على user_id."""
        # تعيين ثابت لكل مستخدم
        bucket = hash(user_id) % 100

        if bucket < self.config.treatment_percentage * 100:
            return self.config.treatment_model, "treatment"
        return self.config.control_model, "control"

# الاستخدام
ab_router = ABRouter(ABConfig(
    control_model="gpt-4o",
    treatment_model="claude-sonnet-4-20250514",
    treatment_percentage=0.2  # 20% للعلاج
))

model, variant = ab_router.route(user_id="user-123")

الاستراتيجية 5: التوجيه المحسن للتكلفة

البقاء ضمن الميزانية مع الحفاظ على الجودة:

from dataclasses import dataclass

@dataclass
class ModelCost:
    model: str
    input_cost_per_1m: float
    output_cost_per_1m: float
    quality_score: float  # 0-1

MODELS = [
    ModelCost("gpt-4o", 5.0, 15.0, 0.95),
    ModelCost("claude-sonnet", 3.0, 15.0, 0.92),
    ModelCost("gpt-4o-mini", 0.15, 0.6, 0.80),
    ModelCost("llama-3.1-70b", 0.9, 0.9, 0.85),
]

class BudgetRouter:
    def __init__(self, daily_budget: float, min_quality: float = 0.8):
        self.daily_budget = daily_budget
        self.min_quality = min_quality
        self.spent_today = 0.0

    def route(self, estimated_tokens: int) -> str:
        """اختيار أرخص نموذج يلبي عتبة الجودة."""
        remaining = self.daily_budget - self.spent_today

        # التصفية بالجودة والفرز بالتكلفة
        candidates = [
            m for m in MODELS
            if m.quality_score >= self.min_quality
        ]
        candidates.sort(key=lambda m: m.input_cost_per_1m + m.output_cost_per_1m)

        for model in candidates:
            estimated_cost = (
                (estimated_tokens * model.input_cost_per_1m / 1_000_000) +
                (estimated_tokens * 0.5 * model.output_cost_per_1m / 1_000_000)
            )
            if estimated_cost <= remaining:
                return model.model

        # تجاوزت الميزانية، استخدم الأرخص
        return candidates[0].model

أفضل ممارسات التوجيه

┌─────────────────────────────────────────────────────────────┐
│              قائمة تحقق التوجيه الإنتاجي                    │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  1. دائماً لديك احتياطيات                                  │
│     └── لا تعتمد أبداً على مزود واحد                       │
│                                                             │
│  2. راقب قرارات التوجيه                                    │
│     └── سجّل اختيار النموذج مع بيانات الطلب الوصفية        │
│                                                             │
│  3. اختبر تغييرات النموذج A/B                              │
│     └── لا تفترض أن الأحدث = الأفضل لحالتك                 │
│                                                             │
│  4. فكر في زمن الاستجابة، ليس فقط التكلفة                  │
│     └── النماذج الأرخص قد يكون لها زمن استجابة أعلى        │
│                                                             │
│  5. نفّذ قواطع الدائرة                                     │
│     └── أوقف التوجيه للمزودين الفاشلين بسرعة               │
│                                                             │
│  6. خزّن قرارات التوجيه مؤقتاً                              │
│     └── تضمينات التوجيه الدلالي مكلفة                      │
│                                                             │
└─────────────────────────────────────────────────────────────┘

:::

اختبار

الوحدة 5: بوابات LLM والتوجيه

خذ الاختبار