Bab 4: Format Output¶
Output yang diinginkan menentukan format yang harus diminta. Kalau tidak diminta — AI tebak. Tebakannya sering meleset.
LLM by default menghasilkan paragraf prosa — text bebas yang manusia baca. Tapi sering kali kamu butuh output dalam bentuk lain: list, tabel, JSON, kode, markdown. Bab ini ngajarin cara minta format yang tepat.
Setelah Bab 4, kamu akan bisa:
- Minta output dalam format spesifik (list, tabel, JSON, dll)
- Memahami kapan structured output dibutuhkan vs prose
- Format output untuk pipeline programmatik
- Hindari kesalahan format yang sering pemula buat
4.1. Kenapa Format Penting?¶
Bayangkan kamu minta "10 ide nama brand kopi". Output prose:
"Ada banyak ide bagus untuk brand kopi! Beberapa di antaranya seperti 'Kopi Senja' yang mengingatkan kita pada keindahan sore hari. Atau 'Java Pearl' yang menggambarkan kopi premium dari Jawa..."
Untuk dipakai? Tidak praktis. Kamu harus extract manual.
Output dengan format yang diminta:
1. Kopi Senja
2. Java Pearl
3. Bumi Kopi
4. Sangrai Lokal
5. Aroma Pagi
6. Kopi Negeri
7. Biji Asli
8. Reroda
9. Kawan Kopi
10. Senyum Kopi
Sekarang gampang: copy-paste ke spreadsheet, vote dengan tim, dll.
Lesson: format yang tepat = output yang actionable.
4.2. Cara Minta Format¶
Ada 3 cara dari yang paling lemah ke paling kuat:
Level 1: Soft Request (sering gagal)¶
LLM kadang ikut, kadang tidak. Tergantung mood (suhu).
Level 2: Explicit Format Spec (lebih reliable)¶
Lebih spesifik = lebih reliable.
Level 3: Show, Don't Tell (paling reliable)¶
Output format seperti contoh ini:
1. Kopi Senja
2. Java Pearl
3. Aroma Pagi
(Lanjutkan sampai 10 item.)
Kamu kasih contoh persis seperti yang diinginkan. Ini few-shot prompting (Bab 5), tapi prinsipnya: contoh > deskripsi.
4.3. Format Output yang Sering Dipakai¶
Format 1: Bullet List¶
Format 2: Numbered List¶
Format 3: Markdown Table¶
Output:
| Nama | Harga | Catatan |
|------|-------|---------|
| Kopi Senja | Rp 25k | Spesialti |
| Java Pearl | Rp 30k | Premium |
Format 4: JSON¶
JSON sangat berguna untuk integrasi dengan code. LLM output JSON, code kamu langsung parse.
Format 5: Markdown dengan Heading¶
Format 6: Code Block¶
Format 7: Email Format¶
4.4. Structured Output untuk Programmatik¶
Saat kamu proses output dengan kode, format harus predictable. JSON adalah favorit.
flowchart LR
Prompt["Prompt:<br/>'Output JSON'"]
LLM["🧠 LLM"]
JSON["📦 JSON output"]
Parse["Code:<br/>json.loads()"]
Use["Pakai data<br/>(simpan DB, dll)"]
Prompt --> LLM
LLM --> JSON
JSON --> Parse
Parse --> Use
style Prompt fill:#1a1a1a,stroke:#6366f1,color:#fafafa
style LLM fill:#1a1a1a,stroke:#f59e0b,color:#fafafa
style JSON fill:#1a1a1a,stroke:#ec4899,color:#fafafa
style Parse fill:#1a1a1a,stroke:#10b981,color:#fafafa
style Use fill:#1a1a1a,stroke:#06b6d4,color:#fafafa
Cara baca diagram
Diagram ini menunjukkan alur LLM-to-application — pattern dasar saat kamu bangun aplikasi yang pakai AI.
Step demi step:
- Prompt (indigo) — kamu kasih instruksi yang explicit minta JSON
- LLM (amber) — proses prompt, generate output
- JSON output (pink) — hasil dalam format yang bisa di-parse mesin
- Code parse (hijau) —
json.loads()di Python (atauJSON.parse()di JavaScript) - Use (cyan) — sekarang kamu punya dictionary/object yang bisa diakses field-nya
Kenapa ini powerful?
LLM bagus untuk understanding bahasa natural, tapi sulit dipakai di code kalau output-nya prose. JSON bridge dua dunia: LLM ngerti natural language input → output structured data → code bisa pakai langsung.
Contoh aplikasi:
- User type "Tambahkan meeting jam 3 sore besok" → LLM convert ke JSON
{"date": "...", "time": "15:00", "title": "Meeting"}→ app kamu masukkan ke calendar - User screenshot resep → LLM extract jadi JSON
{"ingredients": [...], "steps": [...]}→ app simpan terstruktur
Pemula sering: minta JSON, tapi LLM kasih JSON dibungkus penjelasan:
Hope this helps!Kalau begini, code kamu error saat `json.loads()`. **Solusi**: tambahkan instruksi eksplisit "Output **hanya JSON**, tanpa penjelasan apapun di luar JSON".
</div>
### Pattern Wajib untuk JSON Output
[FORMAT] Output HANYA JSON valid, tanpa text apapun di luar JSON. Tidak ada markdown code fence, tidak ada penjelasan.
Struktur: { "nama": "string atau null", "umur": "integer atau null", "kota": "string atau null" }
Kalau **field tidak ditemukan**, instruksikan LLM pakai `null` — supaya code kamu predictable.
## 4.5. Mode JSON (untuk OpenAI/Claude API)
Kalau pakai API langsung, beberapa provider punya **JSON mode**:
```python
# OpenAI
response = client.chat.completions.create(
model="gpt-4",
messages=[...],
response_format={"type": "json_object"}, # WAJIB JSON
)
# Anthropic Claude
# Tidak ada JSON mode resmi, tapi bisa pakai prompt yang ketat
# atau pakai tool use untuk forced structured output
JSON mode memaksa LLM keluar valid JSON. Lebih reliable dari sekedar minta lewat prompt.
4.6. Format untuk Output Panjang¶
Kalau output panjang (artikel, laporan, dll), pakai struktur markdown:
[FORMAT]
Tulis artikel dengan struktur:
# [Judul yang catchy, max 60 char]
## Pembuka (1 paragraf)
- Hook yang menarik
- State the problem
## Isi (3-4 sub-section)
### [Sub-judul 1]
[2-3 paragraf]
### [Sub-judul 2]
[2-3 paragraf]
## Kesimpulan (1 paragraf)
- Rangkuman
- Call-to-action
Total length: ~800 kata.
Output: artikel yang well-structured, predictable, bisa langsung di-publish.
4.7. Format Kombinasi¶
Kadang kamu butuh kombinasi format dalam 1 output:
[FORMAT]
Output:
## Ringkasan
[1 paragraf prose]
## Detail
| Field | Value |
|-------|-------|
| ... | ... |
## Kode
```python
[code lengkap]
Next Steps¶
- ...
- ...
- ...
"Kasih dalam format yang rapi"
Output: dokumen kompleks dengan multiple sections berbeda format. Pemula sering ragu — boleh dilakukan, tapi **be very explicit** tentang struktur. ## 4.8. Common Mistakes ### ❌ Format Diminta tapi Tidak Spesifik"Kasih dalam JSON" Output HANYA JSON, tanpa markdown code fence, tanpa penjelasan apapun di luar. "Buat tabel untuk topik filosofis""Rapi" itu apa? Bullet? Tabel? Heading? ✓ **Fix**: spesifik. ### ❌ Format JSON tapi Tidak Anti-Wrapper"Kasih versi paragraf, tabel, dan JSON"Tabel tidak cocok untuk topik nuanced. Pakai prose dengan heading. ✓ **Fix**: pilih format sesuai sifat content. ### ❌ Mau Banyak Format dalam 1 Prompt[ROLE] Kamu adalah analyst yang extract informasi dari customer review.LLM bisa kasih, tapi quality menurun. Lebih baik **3 prompt terpisah**. ✓ **Fix**: 1 prompt = 1 format target. Iterate kalau butuh format lain. ## 4.9. Project: Extractor Data Buat tool yang extract informasi terstruktur dari teks bebas. **Use case**: kamu punya 100 review customer dalam bentuk paragraf. Extract jadi data terstruktur untuk analisis.
[TASK] Analisis review berikut. Extract: 1. Sentiment (positif/negatif/netral) 2. Issue yang dimention (kalau ada) 3. Produk yang disebut 4. Skor kepuasan dari 1-5
[INPUT]
[OUTPUT FORMAT] Output HANYA JSON valid: { "sentiment": "positif" | "negatif" | "netral", "issues": ["array of issue", "atau empty array"], "produk": "nama produk atau null", "skor": 1-5, "confidence": "tinggi" | "sedang" | "rendah" }
Tidak ada penjelasan, tidak ada markdown fence. Hanya JSON.
Pakai prompt ini di loop untuk 100 review → kamu dapat 100 baris data terstruktur untuk dianalisis di Excel/Pandas.
## 4.10. Latihan
### 4.1 — Format Comparison
Ambil 1 task (misal "5 tips marketing"). Coba 3 format berbeda: bullet, tabel, JSON. Bandingkan kemampuan dipakai.
### 4.2 — JSON Strict
Tulis prompt yang **selalu** menghasilkan JSON valid (anti-wrapper). Test 5 kali — pastikan parse-able tiap kali.
### 4.3 — Email Generator
Bikin prompt untuk generate email dengan format strict:
- Subject line max 50 char
- Body 100-150 kata
- Clear CTA di akhir
### 4.4 — Tantangan: Multi-Format
Bikin 1 prompt yang menghasilkan output dengan 3 section berbeda format (heading + tabel + bullet). Test kalau LLM patuhi struktur.
<div class="cheatsheet" markdown>
### Format yang Sering Dipakai
| Format | Kapan |
|--------|-------|
| Bullet list | Quick scan, tidak ada urutan |
| Numbered list | Ada urutan/prioritas |
| Markdown table | Compare data, multiple atribut |
| JSON | Programmatic processing |
| Code block | Output kode |
| Markdown heading | Artikel/dokumen panjang |
### Pattern JSON Strict
Struktur: { "field": "string atau null", ... } ```
3 Cara Minta Format¶
- Soft: "Tulis dengan format list" (lemah)
- Spec: "Format: numbered list, max 5 kata per item" (lebih kuat)
- Example: kasih contoh persis (paling kuat)
Anti-Wrapper untuk JSON¶
- "HANYA JSON"
- "Tanpa markdown code fence"
- "Tanpa text di luar JSON"
- "Tanpa penjelasan"
Common Mistakes¶
- ❌ "Format rapi" (vague)
- ❌ JSON tanpa anti-wrapper
- ❌ Tabel untuk topik nuanced
- ❌ Multiple format dalam 1 prompt