Memasang mata pada sistem AI: tracing per langkah agent, tracking biaya dan token per request, hingga monitoring kualitas jawaban. Kalian membangun observability dengan OpenTelemetry dan LangSmith agar sistem yang kompleks tetap bisa di-debug dan dioptimasitype: text

Sistem yang kalian bangun semakin kompleks: agent multi-langkah, RAG, memory, tool calls. Dan di episode 11, kita katakan debugging agent butuh tracing. Episode ini memenuhi janji itu — observability & monitoring AI, lapisan yang menentukan apakah tim bisa tidur nyenyak setelah deploy.
Mengapa penting? Karena produk AI punya masalah yang tidak dimiliki aplikasi biasa: perilaku nondeterministik. Error bukan hanya "500" — bisa berupa jawaban salah, biaya melonjak, atau agent berputar tanpa selesai. Tanpa observability yang tepat, kalian buta: tidak tahu mengapa biaya membengkak, request mana yang lambat, atau jawaban mana yang mulai menurun kualitasnya.
Observability produk AI terbagi tiga dimensi:
| Dimensi | Metrik | Alat |
|---|---|---|
| Performance | Latensi per request/langkah, error rate | OpenTelemetry, tracing |
| Cost | Token per request, biaya per user/fitur | LangSmith, custom metrics |
| Quality | Feedback, evaluasi otomatis (episode 9), drift | Evals + monitoring |
Tiga pertanyaan yang harus bisa kalian jawab kapan saja: kenapa lambat?, kenapa mahal?, dan kualitasnya turun di mana?
Trace adalah catatan perjalanan satu request: berapa langkah, tool apa yang dipanggil, berapa lama tiap langkah, berapa token. Standar industri adalah OpenTelemetry (OTel) dengan instrumentasi eksplisit:
from opentelemetry import trace
from opentelemetry.trace import Status, StatusCode
tracer = trace.get_tracer("ai-app")
def run_agent(task: str) -> str:
with tracer.start_as_current_span("agent.run") as span:
span.set_attribute("task", task)
try:
langkah1 = retrieve(task) # RAG
jawaban = generate(langkah1) # LLM
span.set_attribute("docs_used", len(langkah1))
return jawaban
except Exception as e:
span.set_status(Status(StatusCode.ERROR, str(e)))
raiseSetiap span menyimpan konteks: nama operasi, durasi, token, dan attribute khusus. Di dashboard (Jaeger/Tempo/Cloud), kalian bisa melihat request yang lambat dan langkah mana penyebabnya.
Tip
Tiga span yang selalu wajib: llm.call (model, prompt hash, token), retrieval (jumlah dokumen, top-k), dan tool.call (nama tool, argumen, hasil). Dengan ini, hampir semua masalah bisa didiagnosis dari trace saja.
Setiap panggilan LLM harus tercatat biayanya. Pola dasarnya: baca usage dari response (episode 3), hitung biaya dengan harga model, simpan ke time-series:
PRICES = {"gpt-4o-mini": (0.00015, 0.0006)} # input, output per 1K token
def log_cost(model: str, usage, user_id: str, feat: str) -> None:
pi, po = PRICES[model]
cost = (usage.prompt_tokens / 1000) * pi + \
(usage.completion_tokens / 1000) * po
emit_metric("llm.cost", cost,
{"model": model, "user": user_id, "feature": feat})
emit_metric("llm.tokens_in", usage.prompt_tokens, {"model": model})
emit_metric("llm.tokens_out", usage.completion_tokens, {"model": model})Data cost per feature memungkinkan pertanyaan penting: "fitur mana yang menyumbang 70% biaya?" — jawaban yang memandu optimasi di episode 22. Data cost per user memicu abuse detection: satu pengguna tiba-tiba memakai 100x rata-rata.
Framework AI (LangChain/LangGraph, yang kita pakai mulai episode 23) punya tool observability khusus: LangSmith. Ia otomatis mencatat setiap panggilan LLM, prompt, tool call, dan metadata — tanpa instrumentasi manual:
export LANGSMITH_TRACING=true
export LANGSMITH_API_KEY=lsv2_...
export LANGSMITH_PROJECT=ai-engineer-labfrom langsmith import traceable
@traceable
def jawab_dokumen(question: str) -> str:
docs = retrieve(question) # otomatis tercatat
return generate(docs, question) # otomatis tercatatLangSmith juga punya evaluator bawaan: feedback loop, banding jawaban antar versi, dan dataset management yang nyambung dengan eval suite episode 9. Untuk tim yang memakai LangGraph (episode 23), ini pilihan paling cepat.
Observability tidak berhenti di metrik teknis. Kualitas jawaban harus dipantau:
import random
def after_answer(question, konteks, jawaban):
if random.random() < 0.05: # sampel 5%
skor = llm_judge(question, konteks, jawaban) # episode 9
emit_metric("qa.faithfulness", skor["faithfulness"], {})"call failed" tanpa prompt/model/user tidak berguna untuk debug.Inti yang harus dibawa pulang:
Di episode 18 selanjutnya kita mengamankan semuanya: AI security & safety — prompt injection, jailbreaks, data leakage, dan OWASP LLM Top 10 untuk produk AI. Sampai jumpa di episode 18!