0Pricing
AI Agents · บทเรียน

การสร้างรายงานแบบมีโครงสร้าง

รายงานตามแม่แบบ: บทสรุปผู้บริหาร ผลการค้นพบ หลักฐาน และข้อเสนอแนะ

การสร้างรายงานแบบมีโครงสร้าง เป็นบทเรียน AI Agents ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 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))

การจัดรูปแบบเป็นมาร์กดาวน์

แสดงผลส่วนต่าง ๆ ของรายงานเป็นมาร์กดาวน์ ทำให้สามารถแปลงผลลัพธ์เป็น HTML, PDF หรือแสดงโดยตรงในเครื่องมืออย่างโนชันหรือคอนฟลูเอนซ์ได้

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)

การสร้างรายงานพร้อมลิงก์แหล่งข้อมูล

เมื่อต้องแสดงผลสำหรับเว็บ ให้แปลงที่อยู่เว็บของแหล่งข้อมูลเป็นไฮเปอร์ลิงก์ และเพิ่มบล็อกข้อมูลเมตาที่ระบุวันที่สร้างรายงาน จำนวนแหล่งข้อมูล และอัตราการตรวจสอบยืนยัน

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)

ส่วนใดควรมีเนื้อหาครบถ้วนในตัวเองเสมอตามโครงสร้างรายงาน

โครงสร้างรายงานได้รับการออกแบบเพื่อให้ผู้อ่านที่มีเวลาจำกัดดึงข้อมูลที่เป็นประโยชน์ได้โดยไม่ต้องอ่านเอกสารทั้งหมด การทำความเข้าใจว่าส่วนใดต้องอ่านแยกได้ด้วยตัวเองจึงสำคัญต่อการออกแบบรายงาน

สรุปการสร้างรายงานแบบมีโครงสร้าง

สร้างรายงาน ทีละส่วน โดยใช้แม่แบบตายตัว (บทสรุปผู้บริหาร → ภูมิหลัง → ข้อค้นพบสำคัญ → หลักฐาน → ข้อเสนอแนะ → แหล่งข้อมูล) แทรกการอ้างอิงในเนื้อหา ดำเนินการตรวจสอบคุณภาพ และรองรับรูปแบบสำหรับผู้รับสารหลายกลุ่มจากชุดข้อเท็จจริงเดียวกัน

บันทึกรายงานพร้อมเวลาประทับและแฮชของคำถามเสมอ เพื่อจัดการเวอร์ชัน

คำถามที่พบบ่อย

บทเรียน “การสร้างรายงานแบบมีโครงสร้าง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การสร้างรายงานแบบมีโครงสร้าง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Agents ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การสร้างรายงานแบบมีโครงสร้าง”

รายงานตามแม่แบบ: บทสรุปผู้บริหาร ผลการค้นพบ หลักฐาน และข้อเสนอแนะ คุณปฏิบัติ AI Agents ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Agents หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Agents บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “การสร้างรายงานแบบมีโครงสร้าง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน AI Agents นี้ได้ไหม

ได้ บทเรียน AI Agents ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การออกแบบวงจรการวิจัยหลายขั้นตอน
  2. การตรวจสอบแหล่งที่มาและการอ้างอิง
  3. การสร้างรายงานแบบมีโครงสร้าง
  4. การตรวจสอบข้อเท็จจริงและการป้องกันการหลอน
← กลับไปที่ AI Agents