Lewati ke isi

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)

Tulis dengan format list.

LLM kadang ikut, kadang tidak. Tergantung mood (suhu).

Level 2: Explicit Format Spec (lebih reliable)

Output format:
- Numbered list
- Tiap item maksimal 5 kata
- Tidak ada penjelasan, hanya nama

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: bullet list, 5 items, tiap item max 1 kalimat.

Format 2: Numbered List

Format: numbered list 1-10.

Format 3: Markdown Table

Format: markdown table dengan kolom:
| Kolom A | Kolom B | Kolom C |

Output:

| Nama | Harga | Catatan |
|------|-------|---------|
| Kopi Senja | Rp 25k | Spesialti |
| Java Pearl | Rp 30k | Premium |

Format 4: JSON

Output dalam JSON dengan struktur:
{
  "items": [
    {"nama": "...", "harga": ..., "catatan": "..."}
  ]
}

JSON sangat berguna untuk integrasi dengan code. LLM output JSON, code kamu langsung parse.

Format 5: Markdown dengan Heading

Format:
## [Topik 1]
[Penjelasan 1-2 paragraf]

## [Topik 2]
[Penjelasan 1-2 paragraf]

Format 6: Code Block

Output: code block Python lengkap, dengan komentar

Format 7: Email Format

Format:
Subject: [subject line]

Body email lengkap

Sign-off

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:

  1. Prompt (indigo) — kamu kasih instruksi yang explicit minta JSON
  2. LLM (amber) — proses prompt, generate output
  3. JSON output (pink) — hasil dalam format yang bisa di-parse mesin
  4. Code parse (hijau) — json.loads() di Python (atau JSON.parse() di JavaScript)
  5. 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:

Sure! Here's the JSON you requested:
```json
{...}
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
[TASK] Extract informasi dari teks berikut: "{{ user_input }}"

[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

  1. ...
  2. ...
  3. ...
    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 format yang rapi"
    "Rapi" itu apa? Bullet? Tabel? Heading?
    
    ✓ **Fix**: spesifik.
    
    ### ❌ Format JSON tapi Tidak Anti-Wrapper
    
    "Kasih dalam JSON"
    Output sering: ` ```json\n{...}\n```\n Hope this helps!`
    
    ✓ **Fix**:
    
    Output HANYA JSON, tanpa markdown code fence, tanpa penjelasan apapun di luar.
    ### ❌ Format yang Tidak Sesuai dengan Task
    
    "Buat tabel untuk topik filosofis"
    Tabel tidak cocok untuk topik nuanced. Pakai prose dengan heading.
    
    ✓ **Fix**: pilih format sesuai sifat content.
    
    ### ❌ Mau Banyak Format dalam 1 Prompt
    
    "Kasih versi paragraf, tabel, dan JSON"
    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.
    
    [ROLE] Kamu adalah analyst yang extract informasi dari customer review.

[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] {{ paste_review_di_sini }}

[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
Output HANYA JSON valid, tanpa markdown fence, tanpa penjelasan apapun di luar JSON.

Struktur: { "field": "string atau null", ... } ```

3 Cara Minta Format

  1. Soft: "Tulis dengan format list" (lemah)
  2. Spec: "Format: numbered list, max 5 kata per item" (lebih kuat)
  3. 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

← Bab 3 Lanjut Bab 5 →

Diadaptasi dari modul "Output Formatting" dari Learn Prompting. Dilisensikan Apache 2.0.