0Pricing
AI Prompt Engineering · درس

أنماط تحويل المخرجات إلى مدخلات

استخرجوا بيانات منظمة من الخطوة 1 وأدخلوها في الخطوة 2

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

التحدي الأساسي: الاستخراج والحقن

في سلسلة المطالبات، تنتج الخطوة 1 نصًا. وتحتاج الخطوة 2 إلى جزء محدد من ذلك النص بوصفه مدخلًا. ويتمثل التحدي في استخراج الحقل الصحيح تمامًا من مخرجات الخطوة 1 وحقنه بشكل سليم في مطالبة الخطوة 2.

إذا أعادت الخطوة 1 نثرًا غير منظم، يصبح الاستخراج هشًا. والحل هو تصميم مطالبات الخطوة 1 بحيث تعيد مخرجات منظمة — عادةً بتنسيق JSON — يمكن تحليلها وحقنها برمجيًا.

تصميم الخطوة 1 لاستهلاك الآلة

يجب أن تُخرج المطالبة المعدّة لتغذية سلسلة بيانات مهيكلة دائمًا. حدّد مخطط JSON الدقيق داخل المطالبة:

import anthropic
import json

client = anthropic.Anthropic(api_key='YOUR_API_KEY')

step1_prompt = '''
<task>
Analyze the customer review below.
</task>

<review>
The onboarding was confusing and took 3 hours. The core feature works great though.
</review>

<output_format>
Return ONLY a JSON object. No other text.
{
  "sentiment": "positive|negative|mixed",
  "issues": ["string"],
  "positives": ["string"],
  "priority": "high|medium|low"
}
</output_format>
'''

response = client.messages.create(
    model='claude-opus-4-5',
    max_tokens=300,
    messages=[{'role': 'user', 'content': step1_prompt}]
)
print(response.content[0].text)

تحليل مخرجات الخطوة 1

بعد أن تُرجع الخطوة 1 بيانات JSON، حلّلها في Python واستخرج الحقول المطلوبة للخطوة 2:

import json

def parse_step1_output(raw_text):
    # Models sometimes wrap JSON in extra text -- strip it
    text = raw_text.strip()
    # Find the first { and last } to extract JSON object
    start = text.find("{")
    end = text.rfind("}")
    if start != -1 and end != -1 and end > start:
        text = text[start:end+1]
    try:
        return json.loads(text)
    except json.JSONDecodeError as e:
        raise ValueError("Step 1 output is not valid JSON: " + str(e))

# Example usage
raw = '{"sentiment": "mixed", "issues": ["confusing onboarding"], "positives": ["core feature"], "priority": "high"}'
parsed = parse_step1_output(raw)
print(parsed['issues'])
print(parsed['priority'])

إدراج الحقول المستخرجة في الخطوة 2

بعد التحليل، أدرج حقولًا محددة في قالب مطالبة الخطوة 2. استخدم سلاسل f في Python أو متغيرات القالب:

def build_step2_prompt(parsed_step1):
    issues = '\n'.join(f'- {issue}' for issue in parsed_step1['issues'])
    priority = parsed_step1['priority']
    sentiment = parsed_step1['sentiment']

    return f'''
<context>
A customer review was analyzed. Overall sentiment: {sentiment}. Priority: {priority}.
</context>

<task>
Write a customer support response addressing these specific issues:
{issues}
Acknowledge the positives before addressing the issues.
</task>

<output_format>
Plain text response, 3 sentences maximum, professional tone.
</output_format>
'''

parsed = {'sentiment': 'mixed', 'issues': ['confusing onboarding'], 'priority': 'high', 'positives': ['core feature']}
print(build_step2_prompt(parsed))

سلسلة كاملة من خطوتين

دمج التحليل والإدراج في مسار معالجة كامل من خطوتين:

import anthropic, json

client = anthropic.Anthropic(api_key='YOUR_API_KEY')

def call(prompt, max_tokens=500):
    r = client.messages.create(
        model='claude-opus-4-5', max_tokens=max_tokens,
        messages=[{'role': 'user', 'content': prompt}]
    )
    return r.content[0].text

def review_response_chain(review_text):
    # Step 1: Analyze
    step1 = call(f'Analyze this review. Return JSON: {{"sentiment": str, "issues": [str], "priority": str}}\n\nReview: {review_text}')
    parsed = json.loads(step1.strip())

    # Inject into Step 2
    issues_str = ', '.join(parsed['issues'])
    step2_prompt = f'Write a 2-sentence support reply. Issues to address: {issues_str}. Priority: {parsed["priority"]}.'

    # Step 2: Draft response
    reply = call(step2_prompt)
    return reply

print(review_response_chain('Login is broken. App crashes on startup.'))

التعامل مع إدراج JSON المتداخل

عندما تُرجع الخطوة 1 كائنات متداخلة، استخرج فقط ما تحتاج إليه الخطوة 2 للحفاظ على إيجاز المطالبة المُدرجة:

step1_output = {
    'document': {
        'title': 'Q3 Report',
        'sections': [
            {'name': 'Revenue', 'value': '$4.2M', 'change': '+12%'},
            {'name': 'Users', 'value': '85,000', 'change': '+5%'},
            {'name': 'Churn', 'value': '3.2%', 'change': '-0.8%'}
        ]
    },
    'summary': 'Strong revenue quarter with moderate user growth.'
}

# Extract only what Step 2 needs — not the full nested object
def extract_for_step2(data):
    sections = data['document']['sections']
    metrics = '\n'.join(f"{s['name']}: {s['value']} ({s['change']})" for s in sections)
    return {
        'metrics': metrics,
        'summary': data['summary']
    }

step2_input = extract_for_step2(step1_output)
print(step2_input)

تجنّب الإدراج المفرط

من الأخطاء الشائعة إدراج مخرجات الخطوة 1 بالكامل في الخطوة 2. يؤدي ذلك إلى تضخيم مطالبة الخطوة 2، وقد يربك النموذج بحقول غير ذات صلة.

  • سيئ: f'Here is the analysis: {str(all_of_step1_output)}'
  • جيد: استخرج الحقول المحددة التي تحتاج إليها الخطوة 2 فقط، وأدرجها باستخدام تسميات واضحة

يجب أن تتلقى الخطوة 2 المعلومات التي تحتاج إليها بالضبط — لا أكثر ولا أقل.

التفرّع الشرطي بناءً على المخرجات

يمكن لمخرجات الخطوة 1 التي جرى تحليلها أن تتحكم في المطالبة التي ستُشغّلها الخطوة 2، فتحوّل السلسلة الخطية إلى مسار معالجة متفرّع:

def route_chain(user_message):
    # Step 1: Classify intent
    classification = json.loads(call(
        f'Classify this message as billing, technical, or general. Return JSON: {{"intent": str}}\n\nMessage: {user_message}'
    ))

    intent = classification['intent']

    # Route to specialized Step 2 prompt
    if intent == 'billing':
        prompt = f'You are a billing specialist. Address: {user_message}'
    elif intent == 'technical':
        prompt = f'You are a senior engineer. Provide technical guidance for: {user_message}'
    else:
        prompt = f'You are a general support agent. Respond to: {user_message}'

    return call(prompt)

print(route_chain('My invoice shows a wrong amount.'))

تجميع الحالة عبر الخطوات

بالنسبة إلى السلاسل الأطول، حافظ على قاموس حالة يجمع المخرجات من كل خطوة:

def run_pipeline(initial_input):
    state = {'input': initial_input}

    # Step 1
    state['entities'] = json.loads(call(
        f'Extract entities as JSON: {{"people": [], "companies": []}}\n\n{state["input"]}'
    ))

    # Step 2 uses entities from Step 1
    companies_str = ', '.join(state['entities'].get('companies', []))
    state['company_types'] = call(
        f'Classify these companies as startup/enterprise: {companies_str}'
    )

    # Step 3 uses output from Steps 1 and 2
    state['summary'] = call(
        f'Write a 2-sentence summary.\nEntities: {state["entities"]}\nClassifications: {state["company_types"]}'
    )

    return state

result = run_pipeline('Apple and OpenAI announced a partnership with Elon Musk.')
print(result['summary'])

أدوات مساعدة لاستخراج JSON

أنشئ أداة مساعدة قابلة لإعادة الاستخدام للاستخراج ضمن البنية التحتية للسلسلة:

import re, json

def extract_json(text):
    "Extract JSON from model output, handling extra text around the object."
    # Try direct parse first
    try:
        return json.loads(text.strip())
    except json.JSONDecodeError:
        pass
    # Try finding JSON object by bracket matching
    start = text.find("{")
    end = text.rfind("}")
    if start != -1 and end != -1 and end > start:
        try:
            return json.loads(text[start:end+1])
        except json.JSONDecodeError:
            pass
    # Try finding JSON array
    start = text.find("[")
    end = text.rfind("]")
    if start != -1 and end != -1 and end > start:
        try:
            return json.loads(text[start:end+1])
        except json.JSONDecodeError:
            pass
    raise ValueError("Could not extract JSON from: " + text[:200])

print(extract_json('{"key": "value"}'))

اختبار أنماط تحويل المخرجات إلى مدخلات

تحتاج مسارات تحويل المخرجات إلى مدخلات إلى مستويين من الاختبار:

  • اختبر كل خطوة باختبار وحدات: هل تُرجع الخطوة 1 بيانات JSON قابلة للتحليل بصورة موثوقة؟ وهل تنتج الخطوة 2 المخرجات الصحيحة لمدخل مستخرج معيّن؟
  • اختبر السلسلة باختبار تكاملي: هل ينتج مسار المعالجة الشامل نتائج صحيحة للمدخلات التمثيلية؟

حافظ على حتمية مطالبات الخطوات باستخدام temperature=0 في خطوات التصنيف والاستخراج التي تكون فيها الاتساقية مهمة.

def test_step1(review_text, expected_sentiment):
    raw = call(f'Analyze review. Return JSON: {{"sentiment": str}}\n\n{review_text}')
    parsed = extract_json(raw)
    assert parsed['sentiment'] == expected_sentiment, f'Expected {expected_sentiment}, got {parsed["sentiment"]}'
    print(f'PASS: sentiment={parsed["sentiment"]}')

# Run unit test for Step 1
test_step1('The product is excellent!', 'positive')
test_step1('This is terrible.', 'negative')

تحقّق سريع

ما تنسيق المخرجات الموصى به للخطوة 1 من سلسلة مطالبات عندما ستُستخرج النتيجة برمجيًا وتُدرج في الخطوة 2؟

تحويل المخرجات إلى مدخلات — أهم النقاط

تُعد أنماط تحويل المخرجات إلى مدخلات الموثوقة أساسًا لجعل سلاسل المطالبات جاهزة للاستخدام في بيئة الإنتاج:

  • صمّم مطالبات الخطوة 1 بحيث تُرجع JSON بمخطط صريح، لا نصًا نثريًا
  • حلّل مخرجات الخطوة 1 قبل إدراجها: أزل علامات Markdown، وتعامل مع JSONDecodeError
  • أدرج الحقول المحددة التي تحتاج إليها الخطوة 2 فقط — وتجنّب الإدراج المفرط
  • استخدم قواميس الحالة لتجميع البيانات وتمريرها عبر السلاسل الأطول
  • يمكن للمخرجات التي جرى تحليلها أن تقود التفرّع الشرطي لتوجيه التنفيذ إلى مطالبات متخصصة للخطوة 2
  • أنشئ أدوات مساعدة قابلة لإعادة الاستخدام لاستخراج JSON، وتتولى معالجة حالات عدم اتساق مخرجات النموذج
  • اختبر كل خطوة بوحدها باختبار وحدات، ثم اختبر مسار المعالجة الكامل باختبار تكاملي

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

هل درس «أنماط تحويل المخرجات إلى مدخلات» مجاني؟

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

ماذا ستتعلم في «أنماط تحويل المخرجات إلى مدخلات»؟

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

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

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

كم من الوقت يستغرق درس «أنماط تحويل المخرجات إلى مدخلات»؟

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

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

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

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

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