Menyusun otak agent: system prompt, task instructions, dan response formatting yang konsisten; memakai prompt templates dan dynamic prompt generation; plus penanganan edge case dan failure mode agar prompt tetap andal dalam segala situasi.

Di episode 4 kalian memberi agent identitas: persona, goals, capability, dan toolset di dalam profile. Tapi identitas saja belum cukup — kualitas jawaban agent sebagian besar ditentukan oleh seberapa baik prompt disusun. Episode ini mengajarkan cara menulis prompt yang membuat agent konsisten, mudah dikendalikan, dan tidak mudah "kabur" saat input tidak biasa.
Roadmap episode ini: menyusun system prompt, task instructions, dan response formatting; memakai prompt templates dan dynamic prompt generation; lalu menangani edge case dan failure mode pada prompt design.
System prompt adalah instruksi tetap yang dimuat di awal setiap percakapan. Ia mendefinisikan peran, konteks, dan aturan main yang berlaku untuk seluruh turn. System prompt yang baik punya empat lapisan: peran, konteks, tugas, dan batasan.
[Peran] Kamu adalah research assistant di tim produk.
[Konteks] Perusahaan menjual software checkout SaaS.
[Tugas] Bantu user meriset kompetitor dan menyusun ringkasan.
[Batasan] Gunakan bahasa Indonesia. Jangan menyebutkan
nama user. Kutip sumber setiap klaim faktual.Empat lapisan ini memudahkan agent memisahkan "siapa aku" dari "apa yang harus kulakukan". Batasan diletakkan eksplisit di bagian akhir supaya mudah dilihat dan tidak tenggelam di tengah narasi panjang.
Hindari menulis system prompt yang terlalu panjang atau emosional. Kalimat seperti "kamu HARUS selalu patuh" justru membuat model melempar fokusnya. Tulis perintah positif dan spesifik: ganti "jangan bercerita" dengan "jawab maksimal 3 kalimat".
Kalau system prompt menjawab "kamu siapa dan aturannya apa", task instruction menjawab "pekerjaan spesifik apa yang harus dikerjakan sekarang". Bedakan keduanya dengan tegas — system prompt tetap, task instruction bisa berubah per pemanggilan.
Response formatting memaksa output dalam struktur tertentu sehingga mudah di-parse program. Paling umum: JSON.
{
"summary": "ringkasan dalam 2 kalimat",
"competitors": [
{ "name": "Pesaing A", "strengths": ["..."], "risks": ["..."] }
],
"confidence": 0.9
}Untuk menghasilkan JSON yang valid, minta model memakai JSON schema di task instruction dan set response_format ke mode JSON bila provider mendukungnya. Hermes lalu bisa mem-parse hasilnya dengan aman tanpa bergantung pada parsing teks yang rapuh — misalnya lewat helper parseJson.
Bila JSON tidak dibutuhkan, gunakan tag XML untuk menandai segmen jawaban — misalnya kutipan sumber dalam tag <sumber>. XML lebih toleran terhadap model yang menyelipkan teks di sekitar jawaban inti daripada JSON.
Info
Selalu tentukan response formatting sebelum menulis prompt. Format yang kaku mencegah agent menambahkan basa-basi yang memaksa kalian menulis parser untuk semua kemungkinan bentuk jawaban.
Prompt jarang ditulis mentah setiap kali. Template memisahkan struktur dari data: struktur tetap, data disuntikkan per pemanggilan.
Rangkum dokumen berikut dalam {max_sentences} kalimat.
Fokus pada keputusan dan tindakan yang perlu diambil.
Dokumen:
---
{document_content}
---Di sini ada dua slot: max_sentences dan document_content. Slot diganti saat render. Template ini disimpan di folder templates/ dan di-version control bersama profile agent — siapa pun bisa membaca isi template dan tahu persis apa yang dikirim ke model, tanpa perlu menjalankan agent dulu.
Hindari menulis logika di dalam template. Template hanya berisi teks dan slot; logika pilihan (slot mana yang diisi, kapan memakai template mana) berada di kode, bukan di string template.
Dynamic prompt generation adalah proses merakit prompt final saat runtime: baca template, ambil data dari tool atau memory, lalu render menjadi prompt lengkap sebelum dipanggil ke model.
import { render } from "@hermes/prompt";
export async function buildSummaryPrompt(session) {
const doc = await session.tool("kb.read").call({ id: session.documentId });
return render("templates/summarize.prompt", {
max_sentences: 3,
document_content: doc.content,
});
}Fungsi ini menggabungkan tiga sumber yang sudah kalian kenal dari episode 4 dan episode 8: template sebagai struktur, data tool sebagai isi, dan session sebagai konteks. Fungsi render mengisi slot template dengan nilai dari map. Nilai slot selalu berasal dari data terpercaya — bukan dari input user mentah, sehingga prompt injection dari isi dokumen tidak otomatis menjadi instruksi.
Danger
Dokumen yang dibaca tool adalah data, bukan perintah. Saat menyuntikkan konten eksternal ke prompt, bungkus dalam blok data yang jelas dan tetap pertahankan batasan bahwa hanya bagian instruksi yang boleh diikuti agent.
Prompt yang bagus harus berfungsi bukan hanya saat input ideal, tapi juga saat input rusak. Beberapa failure mode yang paling sering:
const parsed = parseJson(raw);
if (!parsed) {
const retry = await model.call(
"Output kamu tidak valid JSON. Ulangi dengan format yang diminta."
);
return parseJson(retry) ?? fallbackSummary;
}Pola validasi-lalu-retry di atas adalah pola dasar yang nanti berkembang menjadi retry dengan backoff di episode 10. Prinsipnya: jangan biarkan satu kegagalan format menghentikan seluruh workflow — selalu siapkan jawaban cadangan yang aman.
Prompt engineering adalah jembatan antara identitas agent (episode 4) dan cara ia bekerja sehari-hari. Dengan system prompt berlapis, task instruction yang spesifik, response formatting yang kaku, template yang terpisah dari data, dan dynamic prompt generation yang merakit semuanya saat runtime, agent kalian jadi jauh lebih konsisten dan bisa diprediksi.
Inti yang harus dibawa pulang:
Di episode 6 kita mengaktifkan tangan agent: Tooling & External Integrations — menghubungkan provider LLM, mengintegrasikan tool web search, database, API fetch, dan file system, plus safety pada setiap pemanggilan tool. Sampai jumpa!