0Pricing
AI Prompt Engineering · درس

مراقبة أداء المطالبات في بيئة الإنتاج

تتبّع زمن الاستجابة، والتكلفة، ودرجات الجودة، ومعدلات الفشل لكل إصدار من المطالبة

مراقبة أداء المطالبات في بيئة الإنتاج درس مجاني في AI Prompt Engineering على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Prompt Engineering، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Prompt Engineering 4 دروس في المجموع.

لماذا نراقب أداء المطالبات؟

المطالبة المنشورة في بيئة الإنتاج ليست «منتهية». فسلوك النموذج يتغير مع التحديثات، ومدخلات المستخدمين تتبدل بمرور الوقت، وقد ترتفع التكلفة بشكل غير متوقع. تكشف المراقبة المستمرة حالات التراجع قبل أن تضر بالمستخدمين وتحافظ على إمكانية التنبؤ بالإنفاق.

المقاييس الرئيسية لكل إصدار من المطالبة

تتبّع هذه المقاييس الخمسة لكل إصدار من المطالبة في بيئة الإنتاج:

  • متوسط زمن الاستجابة: الوقت من الطلب حتى اكتمال الاستجابة (P50 وP95 وP99)
  • التكلفة لكل استدعاء: رموز الإدخال × سعرها + رموز الإخراج × سعرها
  • درجة الجودة: تقييم آلي (باستخدام LLM كمقيّم أو مقياس للمهمة)
  • معدل الأخطاء: أخطاء API + حالات فشل تحليل المخرجات غير السليمة
  • رضا المستخدمين: تقييم الإعجاب، ومعدل إعادة المحاولة، والتخلي عن الجلسة

إضافة القياس: تسجيل المقاييس

أحِط كل استدعاء لـ LLM بأدوات قياس تسجل جميع المقاييس الرئيسية في مخزن سلاسل زمنية أو قاعدة بيانات لتحليلها وإطلاق التنبيهات لاحقًا.

import time
import openai

client = openai.OpenAI(api_key='YOUR_API_KEY')

def instrumented_call(prompt_id, version, messages, model):
    start = time.time()
    error = False
    response = None
    try:
        response = client.chat.completions.create(
            model=model,
            messages=messages
        )
    except Exception as e:
        error = True
        raise
    finally:
        latency_ms = (time.time() - start) * 1000
        usage = response.usage if response else None
        record_metric({
            'prompt_id': prompt_id,
            'version': version,
            'latency_ms': latency_ms,
            'input_tokens': usage.prompt_tokens if usage else 0,
            'output_tokens': usage.completion_tokens if usage else 0,
            'error': error,
            'timestamp': time.time()
        })
    return response

حساب التكلفة لكل استدعاء

التكلفة لكل استدعاء = رموز الإدخال × سعر الإدخال + رموز الإخراج × سعر الإخراج. يتيح تخزين أعداد الرموز الخام إعادة حساب التكلفة كلما تغيرت الأسعار.

# pricing.py — model pricing table (per 1M tokens)
PRICING = {
    'gpt-4o': {'input': 2.50, 'output': 10.00},
    'gpt-4o-mini': {'input': 0.15, 'output': 0.60},
    'claude-3-5-sonnet-20241022': {'input': 3.00, 'output': 15.00},
}

def cost_usd(model, input_tokens, output_tokens):
    p = PRICING.get(model)
    if not p:
        return None
    cost = (input_tokens / 1_000_000) * p['input'] \
         + (output_tokens / 1_000_000) * p['output']
    return round(cost, 6)

# Example
c = cost_usd('gpt-4o-mini', input_tokens=800, output_tokens=200)
print(f'Cost per call: ${c}')   # Cost per call: $0.000240

# Daily cost estimate
calls_per_day = 50_000
print(f'Daily cost: ${round(c * calls_per_day, 2)}')  # $12.00

التقييم الآلي للجودة

استخدم LLM كمقيّم لتسجيل جودة المخرجات تلقائيًا على نطاق الإنتاج. خذ عينة من 5-10% من الاستدعاءات لتقييم الجودة والحفاظ على التكاليف ضمن حدود معقولة.

import random

JUDGE_SAMPLE_RATE = 0.05  # score 5% of calls

JUDGE_PROMPT = '''Rate the quality of this AI response on a scale of 1-5.
1=Very poor, 3=Acceptable, 5=Excellent.
Return only the integer score.

User input: {input}
AI response: {output}'''

def maybe_score_quality(user_input, ai_output, model='gpt-4o-mini'):
    if random.random() > JUDGE_SAMPLE_RATE:
        return None  # not sampled

    judge_messages = [{'role': 'user', 'content':
        JUDGE_PROMPT.format(input=user_input, output=ai_output)}]
    response = client.chat.completions.create(
        model=model, messages=judge_messages, max_tokens=5
    )
    try:
        score = int(response.choices[0].message.content.strip())
        return max(1, min(5, score))  # clamp to 1-5
    except ValueError:
        return None

تخزين المقاييس في قاعدة بيانات للسلاسل الزمنية

تخزن قواعد بيانات السلاسل الزمنية (InfluxDB أو TimescaleDB أو حتى جدول PostgreSQL بسيطًا مع فهرس للطابع الزمني) مقاييس كل استدعاء بكفاءة، وتدعم استعلامات التجميع للوحات المعلومات.

-- TimescaleDB / PostgreSQL schema for prompt metrics
CREATE TABLE prompt_metrics (
  ts              TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  prompt_id       VARCHAR(100),
  version         VARCHAR(20),
  model           VARCHAR(50),
  latency_ms      FLOAT,
  input_tokens    INT,
  output_tokens   INT,
  cost_usd        FLOAT,
  quality_score   FLOAT,   -- NULL if not sampled
  error           BOOLEAN DEFAULT FALSE
);

-- Convert to hypertable (TimescaleDB)
SELECT create_hypertable('prompt_metrics', 'ts');

-- Query: hourly P95 latency by version
SELECT
  date_trunc('hour', ts) AS hour,
  version,
  PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY latency_ms) AS p95_latency
FROM prompt_metrics
WHERE prompt_id = 'summarize-article'
  AND ts > NOW() - INTERVAL '24 hours'
GROUP BY 1, 2
ORDER BY 1;

إنشاء لوحة معلومات للمقاييس

تعرض لوحات المعلومات المقاييس الرئيسية الخمسة في الوقت الفعلي. استخدم Grafana (مع مصدر بيانات TimescaleDB) أو لوحة معلومات ويب مخصصة. وتشمل اللوحات الرئيسية:

  • زمن الاستجابة P50/P95/P99 بمرور الوقت، حسب الإصدار
  • اتجاه التكلفة لكل استدعاء (يوميًا/أسبوعيًا)
  • النسبة المئوية لمعدل الأخطاء
  • المتوسط المتحرك لدرجة الجودة
  • درجة رضا المستخدمين
# Simple dashboard query aggregation in Python
def get_dashboard_stats(conn, prompt_id, hours=24):
    with conn.cursor() as cur:
        cur.execute('''
            SELECT
              version,
              COUNT(*) AS calls,
              AVG(latency_ms) AS avg_latency,
              PERCENTILE_CONT(0.95)
                WITHIN GROUP (ORDER BY latency_ms) AS p95_latency,
              AVG(cost_usd) AS avg_cost,
              AVG(quality_score) FILTER (WHERE quality_score IS NOT NULL) AS avg_quality,
              SUM(error::int)::float / COUNT(*) AS error_rate
            FROM prompt_metrics
            WHERE prompt_id = %s
              AND ts > NOW() - INTERVAL %s
            GROUP BY version
            ORDER BY MAX(ts) DESC
        ''', (prompt_id, f'{hours} hours'))
        return cur.fetchall()

اكتشاف الحالات الشاذة لتراجعات المطالبات

تفويت المراجعة اليدوية للوحة المعلومات التراجعات البطيئة. يقارن اكتشاف الحالات الشاذة الآلي نافذة متحركة بخط أساس تاريخي، ويطلق تنبيهًا عندما يتجاوز الانحراف عتبة معينة.

import statistics

def detect_anomaly(recent_values, baseline_values, threshold_std=2.0):
    if len(baseline_values) < 10:
        return False  # not enough data
    baseline_mean = statistics.mean(baseline_values)
    baseline_std = statistics.stdev(baseline_values)
    recent_mean = statistics.mean(recent_values)

    if baseline_std == 0:
        return False
    z_score = abs(recent_mean - baseline_mean) / baseline_std
    return z_score > threshold_std

# Example: detect quality regression
baseline_quality = [4.1, 4.0, 4.2, 4.1, 4.0, 3.9, 4.1, 4.2, 4.0, 4.1]
recent_quality   = [3.2, 3.1, 3.4, 3.0]

if detect_anomaly(recent_quality, baseline_quality):
    print('ALERT: Quality score anomaly detected!')
    # fire_pagerduty_alert(...)
else:
    print('Quality within normal range')

قواعد التنبيه والعتبات

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

  • معدل الأخطاء > 5% لمدة 5 دقائق متتالية
  • زمن الاستجابة P95 > 10s لمدة 3 دقائق
  • التكلفة اليومية > ضعفي المتوسط الأسبوعي (ارتفاع مفاجئ في التكلفة)
  • انخفاض درجة الجودة > 20% عن خط الأساس
# alerts.yaml (Grafana alerting or custom)
alerts:
  - name: HighErrorRate
    condition: error_rate > 0.05
    for: 5m
    severity: critical
    message: 'Prompt {prompt_id} error rate {error_rate:.1%} exceeds 5%'

  - name: HighLatencyP95
    condition: p95_latency_ms > 10000
    for: 3m
    severity: warning
    message: 'P95 latency {p95_latency_ms}ms exceeds 10s for {prompt_id}'

  - name: CostSpike
    condition: daily_cost_usd > weekly_avg_daily_cost * 2
    for: 1h
    severity: warning
    message: 'Daily cost ${daily_cost_usd:.2f} is 2x the weekly average'

  - name: QualityRegression
    condition: rolling_quality_avg < baseline_quality_avg * 0.80
    for: 15m
    severity: critical
    message: 'Quality dropped {pct_drop:.0%} for prompt {prompt_id}'

إشارات رضا المستخدمين

لا تلتقط المقاييس الآلية كل شيء. اجمع إشارات المستخدمين الصريحة والضمنية لاستكمال درجات الجودة:

  • تقييم الإعجاب: 👍/👎 صريحان على استجابات الذكاء الاصطناعي
  • معدل إعادة المحاولة: يعيد المستخدم إرسال الاستعلام نفسه فورًا (دلالة ضمنية على عدم الرضا)
  • معدل النسخ/الاستخدام: ينسخ المستخدم مخرجات الذكاء الاصطناعي (دلالة ضمنية على الرضا)
  • معدل التصحيح: يعدّل المستخدم مخرجات الذكاء الاصطناعي قبل استخدامها
# feedback_collector.py
def record_feedback(prompt_id, version, call_id, signal_type, value):
    '''
    signal_type: 'thumbs' | 'retry' | 'copy' | 'edit'
    value: for thumbs: 1 (up) or -1 (down); others: 1 (occurred)
    '''
    db.execute(
        'INSERT INTO prompt_feedback '
        '(prompt_id, version, call_id, signal_type, value, ts) '
        'VALUES (%s, %s, %s, %s, %s, NOW())',
        (prompt_id, version, call_id, signal_type, value)
    )

# Aggregate satisfaction score
def satisfaction_score(prompt_id, version):
    rows = db.fetch(
        'SELECT signal_type, AVG(value) as avg_val FROM prompt_feedback '
        'WHERE prompt_id=%s AND version=%s GROUP BY signal_type',
        (prompt_id, version)
    )
    return {r['signal_type']: round(r['avg_val'], 3) for r in rows}

تقارير مقارنة الإصدارات

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

def version_comparison_report(prompt_id, version_a, version_b, hours=48):
    stats_a = get_dashboard_stats_for_version(prompt_id, version_a, hours)
    stats_b = get_dashboard_stats_for_version(prompt_id, version_b, hours)

    print(f'=== Comparison: {version_a} vs {version_b} ===')
    metrics = ['avg_latency', 'p95_latency', 'avg_cost', 'avg_quality', 'error_rate']
    for m in metrics:
        va = stats_a.get(m, 0)
        vb = stats_b.get(m, 0)
        delta = vb - va
        pct = (delta / va * 100) if va else 0
        direction = '+' if delta > 0 else ''
        print(f'{m:20s}: {va:.4f} -> {vb:.4f}  ({direction}{pct:.1f}%)')

# Example output:
# avg_latency         : 1234.5000 -> 1189.2000  (-3.7%)
# p95_latency         : 3210.0000 -> 3050.0000  (-5.0%)
# avg_cost            : 0.000240 -> 0.000255  (+6.2%)
# avg_quality         : 4.1000 -> 4.3000  (+4.9%)
# error_rate          : 0.0120 -> 0.0080  (-33.3%)

تحقق سريع

تريد اكتشاف تراجعات الجودة تلقائيًا من دون فحص لوحات المعلومات يدويًا. ما النهج الأفضل لتحقيق ذلك؟

ملخص المراقبة

تتطلب مراقبة المطالبات في بيئة الإنتاج تتبّع خمسة أبعاد لكل إصدار:

  • زمن الاستجابة (P50/P95/P99) — تجربة المستخدم
  • التكلفة لكل استدعاء — السلامة المالية
  • درجة الجودة — أخذ عينات آلي للتقييم باستخدام LLM كمقيّم
  • معدل الأخطاء — الموثوقية
  • رضا المستخدمين — إشارات التقييم وإعادة المحاولة والنسخ

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

الأسئلة الشائعة

هل درس «مراقبة أداء المطالبات في بيئة الإنتاج» مجاني؟

نعم — نص درس «مراقبة أداء المطالبات في بيئة الإنتاج» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Prompt Engineering، انتقل إلى CoddyKit PRO. تتضمن دورة AI Prompt Engineering 4 دروس في المجموع.

ماذا ستتعلم في «مراقبة أداء المطالبات في بيئة الإنتاج»؟

تتبّع زمن الاستجابة، والتكلفة، ودرجات الجودة، ومعدلات الفشل لكل إصدار من المطالبة تتمرن على AI Prompt Engineering مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ AI Prompt Engineering؟

لا تُشترط خبرة سابقة. AI Prompt Engineering على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «مراقبة أداء المطالبات في بيئة الإنتاج»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس AI Prompt Engineering هذا؟

نعم. كل درس في AI Prompt Engineering يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. بنية سجل المطالبات
  2. التحكم في إصدارات المطالبات
  3. استراتيجيات النشر والتراجع
  4. مراقبة أداء المطالبات في بيئة الإنتاج
← العودة إلى AI Prompt Engineering