Pembuatan Laporan Terstruktur
Laporan berbasis templat: ringkasan eksekutif, temuan, bukti, dan rekomendasi.
Pembuatan Laporan Terstruktur adalah pelajaran AI Agents gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Agents, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Agents mencakup 4 pelajaran total.
Dari Fakta Menjadi Laporan yang Mudah Dibaca
Agen riset yang hanya menghasilkan daftar fakta sulit digunakan. Pengambil keputusan memerlukan laporan terstruktur: ringkasan eksekutif, bagian latar belakang, temuan utama, bukti, dan rekomendasi.
Pelajaran ini membahas cara menghasilkan laporan profesional bagian demi bagian dari fakta yang telah diverifikasi.
Templat Laporan
Tentukan struktur laporan sejak awal. LLM menyintesis satu bagian pada satu waktu, sehingga setiap bagian tetap terfokus dan pengulangan dapat dihindari.
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]}')
Menghasilkan Satu Bagian pada Satu Waktu
Menghasilkan seluruh laporan dalam satu prompt tidak dapat diandalkan — LLM kehilangan jejak fakta dan struktur. Hasilkan laporan bagian demi bagian dengan meneruskan bagian sebelumnya sebagai konteks.
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.contentMembangun Laporan Secara Iteratif
Lakukan iterasi melalui semua bagian sambil meneruskan konteks yang terus bertambah. Setiap bagian memahami bagian sebelumnya, sehingga koherensi terjaga dan kontradiksi dalam laporan dapat dihindari.
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 reportMenyisipkan Sitasi Dalam Teks
Ganti rujukan fakta dalam bagian yang dihasilkan dengan sitasi bernomor yang tertaut ke daftar sumber. Dengan demikian, setiap klaim dapat ditelusuri.
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))
Memformat sebagai Markdown
Render bagian laporan sebagai Markdown. Dengan begitu, keluaran dapat dikonversi menjadi HTML, PDF, atau ditampilkan langsung dalam alat seperti Notion atau 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)Menghasilkan Laporan dengan Tautan Sumber
Saat melakukan render untuk web, ubah URL sumber menjadi pranala. Tambahkan juga blok metadata yang berisi tanggal pembuatan laporan, jumlah sumber, dan tingkat verifikasi.
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)Pemeriksaan Kualitas Sebelum Menerbitkan
Lakukan pemeriksaan kualitas otomatis sebelum mengirimkan laporan: jumlah kata minimum per bagian, setidaknya N sitasi, semua rekomendasi berupa kata kerja tindakan, dan tidak ada teks pengganti seperti '[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)
Ringkasan Eksekutif: Batasan Ketat
Ringkasan eksekutif harus berdiri sendiri: seseorang yang hanya membaca bagian ini harus memahami temuan utama dan tindakan yang direkomendasikan. Gunakan prompt yang ketat dengan batas jumlah kata.
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.contentLaporan untuk Berbagai Audiens
Riset yang sama mungkin memerlukan gaya laporan yang berbeda untuk audiens yang berbeda: pembahasan teknis mendalam untuk para teknisi, ringkasan eksekutif untuk pimpinan, dan ringkasan dengan bahasa sederhana untuk nonspesialis. Hasilkan setiap varian dari kumpulan fakta yang sama.
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.contentMenyimpan dan Membuat Versi Laporan
Simpan laporan dengan stempel waktu dan hash pertanyaan riset. Dengan demikian, versi laporan dapat dibandingkan jika riset dijalankan kembali dengan sumber yang diperbarui.
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)
Bagian mana yang harus selalu berdiri sendiri dalam struktur laporan?
Struktur laporan dirancang agar pembaca yang memiliki keterbatasan waktu dapat memperoleh manfaat tanpa membaca seluruh dokumen. Memahami bagian mana yang harus berdiri sendiri penting untuk desain laporan.
Ringkasan Pembuatan Laporan Terstruktur
Hasilkan laporan bagian demi bagian menggunakan templat tetap (Ringkasan Eksekutif → Latar Belakang → Temuan Utama → Bukti → Rekomendasi → Sumber). Sisipkan sitasi dalam teks, lakukan pemeriksaan kualitas, dan dukung berbagai gaya audiens dari kumpulan fakta yang sama.
Selalu simpan laporan dengan stempel waktu dan hash pertanyaan untuk pembuatan versi.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pembuatan Laporan Terstruktur” gratis?
Ya — teks lengkap “Pembuatan Laporan Terstruktur” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Agents, upgrade ke CoddyKit PRO. Kursus AI Agents mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Pembuatan Laporan Terstruktur”?
Laporan berbasis templat: ringkasan eksekutif, temuan, bukti, dan rekomendasi. Kamu berlatih AI Agents dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai AI Agents?
Tidak diperlukan pengalaman sebelumnya. AI Agents di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Pembuatan Laporan Terstruktur” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Agents ini?
Ya. Setiap pelajaran AI Agents menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Desain Putaran Riset Multi-Langkah
- Verifikasi Sumber dan Sitasi
- Pembuatan Laporan Terstruktur
- Pemeriksaan Fakta dan Pencegahan Halusinasi