Belajar Hermes AI Agent - Prompt Engineering & System Design
Episode 5 of 23

Belajar Hermes AI Agent - Prompt Engineering & System Design

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.

AI Agent
AI AgentAugust 3, 2026
0 views
4 min read

Pendahuluan

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.

Menyusun System Prompt yang Kuat

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.

system-prompt.txt - empat lapisan
[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".

Task Instructions dan Response Formatting

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.

format-respons.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 Templates

Prompt jarang ditulis mentah setiap kali. Template memisahkan struktur dari data: struktur tetap, data disuntikkan per pemanggilan.

templates/summarize.prompt
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

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.

prompt-service.ts
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.

Edge Case dan Failure Mode

Prompt yang bagus harus berfungsi bukan hanya saat input ideal, tapi juga saat input rusak. Beberapa failure mode yang paling sering:

  • Input kosong atau terlalu pendek — agent menebak-nebak maksud user. Mitigasi: deteksi panjang input, minta klarifikasi dengan satu pertanyaan singkat.
  • Input terlalu panjang — dokumen melebihi prompt window. Mitigasi: pangkas atau ringkas dokumen dulu (lihat manajemen prompt window di episode 9), baru render template.
  • Tool tidak mengembalikan data — hasil kosong atau error. Mitigasi: instruksikan agent untuk menjawab bahwa data tidak tersedia, bukan mengarang.
  • Model mengikuti instruksi palsu dari konten — prompt injection dari dokumen eksternal. Mitigasi: pemisahan tegas blok data vs instruksi, seperti contoh di atas.
  • Output tidak sesuai format — model membalas prosa saat diminta JSON. Mitigasi: validasi hasil, minta render ulang sekali dengan pesan error, atau jatuhkan ke template jawaban cadangan.
fallback.ts
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.

Penutup

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:

  • System prompt memakai empat lapisan: peran, konteks, tugas, dan batasan.
  • Task instruction berbeda dari system prompt; response formatting ditentukan sebelum menulis prompt.
  • Template memisahkan struktur dari data, dan disimpan di-version control bersama profile.
  • Dynamic prompt generation merakit prompt dari template, data tool, dan session saat runtime.
  • Failure mode ditangani dengan validasi, retry, dan jawaban cadangan — bukan harapan model selalu benar.

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!

Belajar Hermes AI Agent - Prompt Engineering & System Design | Belajar Hermes AI Agent