0Pricing
AI Agents · درس

إنشاء التقارير المنظَّمة

تقارير قائمة على قوالب: ملخص تنفيذي، ونتائج، وأدلة، وتوصيات.

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

من الحقائق إلى تقرير سهل القراءة

يصعب استخدام وكيل بحث لا يُخرج سوى قائمة من الحقائق. يحتاج صانعو القرار إلى تقارير منظمة تتضمن ملخصًا تنفيذيًا وقسمًا للخلفية وأهم النتائج والأدلة والتوصيات.

يتناول هذا الدرس إنشاء تقارير احترافية قسمًا بعد قسم انطلاقًا من الحقائق الموثّقة.

قالب التقرير

حدّد بنية التقرير مسبقًا. يركّب LLM قسمًا واحدًا في كل مرة، مع إبقاء كل قسم مركزًا وتجنب التكرار.

REPORT_SECTIONS = [
    'executive_summary',
    'background',
    'key_findings',
    'evidence',
    'recommendations',
    'sources'
]

SECTION_PROMPTS = {
    'executive_summary': 'Write a 2-3 sentence executive summary of the key findings. Business audience.',
    'background':        'Provide background context for the research topic (3-5 sentences).',
    'key_findings':      'List 3-5 key findings as bullet points, each with one supporting fact.',
    'evidence':          'Summarize the evidence for each finding with inline source citations.',
    'recommendations':   'Based on the findings, provide 2-4 actionable recommendations.',
    'sources':           'List all sources cited in the report, formatted as numbered URLs.'
}

if __name__ == '__main__':
    print('Report sections:', REPORT_SECTIONS)
    for section in REPORT_SECTIONS:
        print(f'{section}: {SECTION_PROMPTS[section]}')

إنشاء قسم واحد في كل مرة

إنشاء التقرير بأكمله في مطالبة واحدة غير موثوق — إذ يفقد LLM تتبع الحقائق والبنية. أنشئ التقرير قسمًا بعد قسم، مع تمرير الأقسام السابقة كسياق.

import openai

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

def generate_section(section_name: str, question: str,
                     facts: list[dict], prior_sections: dict) -> str:
    facts_text = '\n'.join(
        f'- {f["fact"]} (source: {f["source"]})' for f in facts[:25]
    )
    prior_text = '\n\n'.join(
        f'## {k.replace("_"," ").title()}\n{v}'
        for k, v in prior_sections.items()
    )
    prompt = (
        f'Research question: "{question}"\n\n'
        f'Verified facts:\n{facts_text}\n\n'
        f'Report so far:\n{prior_text}\n\n'
        f'Now write the "{section_name}" section.\n'
        f'Instructions: {SECTION_PROMPTS[section_name]}'
    )
    resp = client.chat.completions.create(
        model='gpt-4o',
        messages=[{'role': 'user', 'content': prompt}]
    )
    return resp.choices[0].message.content

بناء التقرير تكراريًا

كرّر العملية عبر جميع الأقسام، مع تمرير السياق المتراكم. يكون كل قسم على دراية بما سبقه، مما يضمن الاتساق ويتجنب التناقضات داخل التقرير.

def build_report(question: str, facts: list[dict]) -> dict:
    report = {}
    sections_to_generate = [s for s in REPORT_SECTIONS if s != 'sources']

    for section in sections_to_generate:
        print(f'Generating section: {section}...')
        report[section] = generate_section(
            section_name=section,
            question=question,
            facts=facts,
            prior_sections={k: v for k, v in report.items()}
        )

    # Sources section: generate citation list from fact URLs
    unique_sources = list(dict.fromkeys(f['source'] for f in facts))
    report['sources'] = '\n'.join(
        f'{i+1}. {url}' for i, url in enumerate(unique_sources[:20])
    )

    return report

إدراج الاستشهادات داخل النص

استبدل مراجع الحقائق في الأقسام المُنشأة باستشهادات مرقمة تربطها بقائمة المصادر. يجعل ذلك كل ادعاء قابلًا للتتبع.

import re

def inject_citations(section_text: str, facts: list[dict]) -> str:
    source_index = {}  # url -> int
    for i, fact in enumerate(facts):
        url = fact['source']
        if url not in source_index:
            source_index[url] = len(source_index) + 1

    annotated = section_text
    for fact in facts:
        if fact['fact'] in annotated:
            num = source_index[fact['source']]
            annotated = annotated.replace(
                fact['fact'],
                f'{fact["fact"]} [{num}]',
                1  # replace first occurrence only
            )
    return annotated

if __name__ == '__main__':
    demo_text = 'Revenue grew 12% last quarter. The team also launched two new products.'
    demo_facts = [{'fact': 'Revenue grew 12% last quarter', 'source': 'https://example.com/report'}]
    print(inject_citations(demo_text, demo_facts))

التنسيق باستخدام Markdown

اعرض أقسام التقرير بتنسيق Markdown. يتيح ذلك تحويل المخرجات إلى HTML أو PDF أو عرضها مباشرةً في أدوات مثل Notion أو Confluence.

def render_markdown(report: dict, title: str) -> str:
    section_titles = {
        'executive_summary': 'Executive Summary',
        'background':        'Background',
        'key_findings':      'Key Findings',
        'evidence':          'Evidence',
        'recommendations':   'Recommendations',
        'sources':           'Sources'
    }
    lines = [f'# {title}', '']
    for key in REPORT_SECTIONS:
        if key in report:
            lines.append(f'## {section_titles[key]}')
            lines.append('')
            lines.append(report[key])
            lines.append('')
    return '\n'.join(lines)

# Usage:
# md = render_markdown(report, 'Causes of Inflation in 2024')
# with open('report.md', 'w') as f: f.write(md)

إنشاء تقرير مع روابط المصادر

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

from datetime import date

def render_html_report(report: dict, title: str,
                       facts: list[dict], question: str) -> str:
    meta = (
        f'<p><em>Generated: {date.today()} | '
        f'Sources: {len(set(f["source"] for f in facts))} | '
        f'Research question: {question}</em></p>'
    )
    html_parts = [f'<h1>{title}</h1>', meta]
    section_titles = {
        'executive_summary': 'Executive Summary',
        'background':        'Background',
        'key_findings':      'Key Findings',
        'evidence':          'Evidence',
        'recommendations':   'Recommendations',
        'sources':           'Sources'
    }
    for key in REPORT_SECTIONS:
        if key in report:
            content = report[key].replace('\n', '<br>')
            html_parts.append(f'<h2>{section_titles[key]}</h2><p>{content}</p>')
    return '\n'.join(html_parts)

فحوصات الجودة قبل النشر

نفّذ فحوصات جودة آلية قبل تسليم التقرير: حد أدنى لعدد الكلمات في كل قسم، ووجود N استشهادات على الأقل، وبدء جميع التوصيات بأفعال إجرائية، وعدم وجود نصوص نائبة مثل '[INSERT]'.

def quality_check(report: dict) -> list[str]:
    issues = []

    for section in ['executive_summary', 'background', 'key_findings']:
        word_count = len(report.get(section, '').split())
        if word_count < 30:
            issues.append(f'{section} too short: {word_count} words (min 30)')

    if report.get('sources', '').count('http') < 3:
        issues.append('Less than 3 cited sources')

    if '[INSERT]' in str(report) or 'TODO' in str(report):
        issues.append('Report contains placeholder text')

    recs = report.get('recommendations', '')
    if recs and not any(verb in recs.lower()
                        for verb in ['should', 'recommend', 'consider', 'implement']):
        issues.append('Recommendations may not be actionable')

    return issues

if __name__ == '__main__':
    demo_report = {
        'executive_summary': 'Too short.',
        'background': 'Also short.',
        'key_findings': 'Short too.',
        'sources': 'http://a.com',
        'recommendations': 'Looks fine as is.',
    }
    for issue in quality_check(demo_report):
        print('-', issue)

الملخص التنفيذي: قيود صارمة

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

def generate_executive_summary(question: str, facts: list[dict],
                               max_words: int = 80) -> str:
    top_facts = '\n'.join(f'- {f["fact"]}' for f in facts[:10])
    prompt = (
        f'Research question: "{question}"\n\n'
        f'Key facts:\n{top_facts}\n\n'
        f'Write an executive summary in EXACTLY {max_words} words or fewer.\n'
        f'Format: [Main finding]. [Why it matters]. [Recommended action].'
    )
    resp = client.chat.completions.create(
        model='gpt-4o',
        messages=[{'role': 'user', 'content': prompt}]
    )
    return resp.choices[0].message.content

تقارير متعددة الجماهير

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

AUDIENCE_STYLES = {
    'executive':   'Brief, strategic. Avoid jargon. Focus on business impact and decisions.',
    'technical':   'Detailed, precise. Include methodology, caveats, and data sources.',
    'general':     'Plain language. Avoid technical terms. Use analogies where helpful.'
}

def generate_for_audience(facts: list[dict], question: str, audience: str) -> str:
    style = AUDIENCE_STYLES.get(audience, AUDIENCE_STYLES['general'])
    facts_text = '\n'.join(f'- {f["fact"]}' for f in facts[:20])
    prompt = (
        f'Synthesize these facts into a report for a {audience} audience.\n'
        f'Style guide: {style}\n'
        f'Question: "{question}"\n\n'
        f'Facts:\n{facts_text}'
    )
    resp = client.chat.completions.create(
        model='gpt-4o',
        messages=[{'role': 'user', 'content': prompt}]
    )
    return resp.choices[0].message.content

حفظ التقارير وإدارة إصداراتها

احفظ التقارير مع طابع زمني وتجزئة لسؤال البحث. يتيح ذلك مقارنة إصدارات التقارير إذا أُعيد تشغيل البحث باستخدام مصادر محدثة.

import hashlib, json, os
from datetime import datetime, timezone

def save_report(report: dict, question: str, output_dir: str = '/tmp/reports'):
    os.makedirs(output_dir, exist_ok=True)
    q_hash = hashlib.md5(question.encode()).hexdigest()[:8]
    timestamp = datetime.now(timezone.utc).strftime('%Y%m%d_%H%M')
    filename = f'{output_dir}/report_{q_hash}_{timestamp}.json'

    with open(filename, 'w') as f:
        json.dump({
            'question':   question,
            'generated':  timestamp,
            'sections':   report
        }, f, indent=2)
    print(f'Report saved: {filename}')
    return filename

if __name__ == '__main__':
    import tempfile
    demo_dir = tempfile.mkdtemp()
    save_report({'executive_summary': 'AI agent adoption grew significantly in 2026.'},
                'What are the key AI agent trends in 2026?', output_dir=demo_dir)

أي قسم يجب أن يكون مكتفيًا بذاته دائمًا في بنية التقرير؟

تُصمَّم بنية التقرير بحيث يتمكن القراء الذين يواجهون ضيقًا في الوقت من استخلاص الفائدة دون قراءة المستند كاملًا. ويُعد فهم القسم الذي يجب أن يقف مستقلًا أمرًا مهمًا لتصميم التقرير.

مراجعة إنشاء التقارير المنظمة

أنشئ التقارير قسمًا بعد قسم باستخدام قالب ثابت (الملخص التنفيذي ← الخلفية ← أهم النتائج ← الأدلة ← التوصيات ← المصادر). أدرج الاستشهادات داخل النص، ونفّذ فحوصات الجودة، وادعم أنماطًا متعددة للجمهور انطلاقًا من مجموعة الحقائق نفسها.

احفظ التقارير دائمًا مع طوابع زمنية وتجزئات الأسئلة لإدارة الإصدارات.

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

هل درس «إنشاء التقارير المنظَّمة» مجاني؟

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

ماذا ستتعلم في «إنشاء التقارير المنظَّمة»؟

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

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

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

كم من الوقت يستغرق درس «إنشاء التقارير المنظَّمة»؟

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

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

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

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

  1. تصميم حلقة البحث متعددة الخطوات
  2. التحقق من المصادر وإضافة الاستشهادات
  3. إنشاء التقارير المنظَّمة
  4. تدقيق الحقائق ومنع الهلوسة
← العودة إلى AI Agents