การสร้างรายงานแบบมีโครงสร้าง
รายงานตามแม่แบบ: บทสรุปผู้บริหาร ผลการค้นพบ หลักฐาน และข้อเสนอแนะ
การสร้างรายงานแบบมีโครงสร้าง เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การออกแบบวงจรการวิจัยหลายขั้นตอน
- การตรวจสอบแหล่งที่มาและการอ้างอิง
- การสร้างรายงานแบบมีโครงสร้าง
- การตรวจสอบข้อเท็จจริงและการป้องกันการหลอน