0Pricing
AI Agents · درس

حلقات إصلاح المخرجات المشوهة

إذا تعذّر تحليل JSON، فأرسل الخطأ إلى النموذج واطلب منه إصلاح المخرج.

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

بعض أجزاء هذا الدرس لم تُترجم بعد وتظهر باللغة الإنجليزية.

حتى الأوضاع الصارمة تفشل أحيانًا

قد تُرجع النماذج الأقدم أو الحالات الطرفية أو مزودو الخدمات غير الصارمين JSON مشوهًا أحيانًا. تتعافى الوكلاء المتينة بطلب إصلاح الناتج من النموذج.

Basic Repair Loop

from pydantic import ValidationError
import json

def call_with_repair(messages, schema, max_attempts=3):
    for attempt in range(max_attempts):
        response = client.chat.completions.create(
            model='gpt-4o-mini',
            messages=messages,
            response_format={'type': 'json_object'}
        )
        raw = response.choices[0].message.content
        try:
            return schema.model_validate_json(raw)
        except (json.JSONDecodeError, ValidationError) as e:
            messages.append({'role': 'assistant', 'content': raw})
            messages.append({
                'role': 'user',
                'content': f'That output failed to validate: {e}.\nReturn ONLY valid JSON that matches the schema. No prose, no markdown fences.'
            })
    raise RuntimeError('Could not get valid output after repair attempts.')

لماذا ينجح ذلك؟

يرى النموذج رسالة الخطأ ويصححها عادةً في الدور التالي. أضيفوا تعليمات صريحة:

  • "من دون نص نثري"
  • "من دون أسوار Markdown"
  • "طابقوا هذه البنية حرفيًا: ..."

إزالة أسوار Markdown

غالبًا ما يحيط النموذج بـ JSON داخل ```json ... ```. أزيلوها قبل التحليل:

import re

def extract_json(text):
    m = re.search(r'```(?:json)?\s*(.*?)```', text, re.S)
    if m:
        return m.group(1).strip()
    return text.strip()

sample = '```json\n{"name": "Alice"}\n```'
print(extract_json(sample))

الاقتطاع من القوس الأول

إذا وُجد نص نثري زائد، فاقتطعوا النص بدءًا من أول { ووصولًا إلى آخر } مطابق:

def find_json_slice(text):
    start = text.find('{')
    if start == -1:
        return None
    depth = 0
    for i, c in enumerate(text[start:], start):
        if c == '{': depth += 1
        if c == '}':
            depth -= 1
            if depth == 0:
                return text[start:i+1]
    return None

sample = 'Here is your answer: {"name": "Alice", "age": 30} - hope that helps!'
print(find_json_slice(sample))

أدوات تنفذ ذلك نيابةً عنكم

  • Instructor — يغلّف Pydantic وحلقات الإصلاح وإعادة المحاولة
  • Outlines — مخرجات مهيكلة مضمونة عبر فك الترميز الموجّه
  • jsonformer — فرض JSON رمزًا تلو الآخر (لنماذج HF)

مطالبات إصلاح فعّالة

أدرجوا رسالة الخطأ المحددة وتذكيرًا موجزًا بالتنسيق:

repair_prompt = f'''
Your previous output had this error: {error}

Fix the output. Requirements:
- Valid JSON only
- Match this schema: {json.dumps(schema)}
- No prose, no markdown fences
'''

تكلفة حلقات الإصلاح

كل إصلاح هو استدعاء إضافي لـ LLM. حدّدوا عدد محاولات إعادة المحاولة (تكفي محاولتان أو ثلاث؛ فبعد ذلك تقل احتمالية تعافي النموذج) وسجّلوا معدلات الإصلاح بوصفها مقياسًا للجودة.

الإصلاح كمؤشر جودة

إذا تجاوز معدل الإصلاح لديكم 5%، فهناك مشكلة ما: المطالبة غير واضحة، أو المخطط معقد جدًا، أو النموذج صغير جدًا. تحققوا من السبب.

بديل: فك الترميز المقيّد

تدعم النماذج مفتوحة المصدر فك الترميز المقيّد بالقواعد النحوية، فلا يستطيع النموذج إنتاج ناتج غير صالح إطلاقًا. تنفذ Outlines وjsonformer وقواعد llama.cpp ذلك.

بديل: الدوال بدلًا من المخطط

يُعد فرض استدعاء أداة مع الوضع الصارم بديلًا أنظف من وضع JSON مع الإصلاح. استخدموه كلما دعمه مزود الخدمة.

تسجيل الناتج غير الصالح

سجّلوا كل ناتج جرى إصلاحه حتى تتمكنوا من تحليل الأنماط:

log.warning('Repaired output', extra={'raw': raw, 'error': str(e), 'attempt': attempt})

متى نتوقف؟

إذا ظل الناتج غير صالح بعد N من محاولات الإصلاح، فأرجعوا خطأً إلى المستخدم، ولا تختلقوا قيمة احتياطية. الفشل الصريح أفضل من تلف البيانات الصامت.

نمط حلقة الإصلاح

ما أبسط خطوة أولى في حلقة الإصلاح؟

مراجعة

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

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

هل درس «حلقات إصلاح المخرجات المشوهة» مجاني؟

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

ماذا ستتعلم في «حلقات إصلاح المخرجات المشوهة»؟

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

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

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

كم من الوقت يستغرق درس «حلقات إصلاح المخرجات المشوهة»؟

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

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

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

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

  1. وضع JSON ومخرجات استدعاء الأدوات
  2. التحقق من مخطط Pydantic
  3. حلقات إصلاح المخرجات المشوهة
  4. Instructor وOutlines لضمان البنية
← العودة إلى AI Agents