LLM Orchestration Essentials
> Satu LLM call saja jarang cukup untuk menjalankan sebuah feature production. Orchestration adalah layer engineering yang mengoordinasikan banyak call, tool, model, dan control logic menjadi satu workflow yang reliable. Notebook ini membahas pattern orchestration yang umum dipakai dan kapan masing-masing cocok digunakan.
Apa itu LLM Orchestration?
LLM orchestration adalah praktik mengoordinasikan banyak LLM call — beserta tool, retry, routing, dan state di sekitarnya — menjadi satu workflow yang reliable. Posisinya di atas "panggil API, parse response" dan di bawah "bangun framework custom dari nol."
Begitu sebuah aplikasi butuh lebih dari satu LLM call untuk menyelesaikan satu task — memvalidasi output, memanggil tool, routing ke prompt khusus, retry saat gagal — kita sudah melakukan orchestration, entah pakai framework bernama atau tidak.
Yang biasanya harus ditangani orchestration:
Pattern Orchestration Umum
1. Prompt Chaining Memecah task kompleks menjadi step berurutan, masing-masing dengan prompt yang fokus.Draft → Kritik → Revisi → Output Final
Cocok kalau task memang secara natural terdiri dari beberapa tahap, dan tiap tahap diuntungkan oleh prompt yang lebih sempit dan sederhana dibanding satu instruksi raksasa.
2. Routing
Klasifikasikan input dulu, baru dispatch ke prompt, tool, atau model khusus.
Input → Classifier → { prompt billing | prompt teknis | prompt general }
Berguna kalau sistem menangani beberapa jenis request berbeda yang butuh penanganan berbeda pula.
3. Parallelization
Jalankan sub-task independen secara concurrent, lalu agregasi hasilnya.
Dokumen → [Ekstrak entity, Summarize, Klasifikasi sentiment] → Merge
Mengurangi latency ketika sub-task tidak saling bergantung, dan memungkinkan pakai model berbeda per sub-task kalau perlu.
4. Orchestrator-Worker
Satu LLM call sentral merencanakan task dan mendelegasikan bagian-bagiannya ke worker khusus (yang bisa berupa LLM call lain atau tool), lalu mensintesis hasilnya.
Task → Orchestrator (merencanakan) → [Worker A, Worker B, Worker C] → Synthesizer
Cocok untuk task open-ended di mana jumlah dan bentuk subtask belum diketahui sejak awal.
5. Evaluator-Optimizer
Satu call men-generate, call lain mengevaluasi terhadap kriteria tertentu, dan loop berulang sampai output lolos atau mencapai batas retry.
Generate → Evaluate → (lolos? selesai : generate ulang dengan feedback)
Berguna kalau standar kualitas lebih penting daripada latency — misalnya generated code, terjemahan, atau teks legal.
Contoh Praktis: Routing + Fallback
Contoh singkat yang menunjukkan model routing berdasarkan kompleksitas task, dengan fallback saat gagal:
def classify_complexity(query: str) -> str:
result = cheap_model.invoke(
f"Classify this query as 'simple' or 'complex': {query}"
)
return result.content.strip().lower()
def handle_query(query: str) -> str:
complexity = classify_complexity(query)
model = cheap_model if complexity == "simple" else strong_model
try:
return model.invoke(query).content
except RateLimitError:
# fallback ke provider/model lain saat gagal
return fallback_model.invoke(query).content
response = handle_query("Summarize this paragraph in one sentence.")
Di skala yang lebih besar, logic yang sama ini akan berpindah ke framework (LangGraph, state machine custom, sistem worker berbasis queue) — tapi pattern dasarnya, routing sesuai kebutuhan dan fallback saat gagal, tetap sama.