Agent loop & tool calling
M8 — AI Agents & Tool Use
Membangun AI Agent dari Nol (Tanpa Framework)
Agent bukan konsep yang rumit: arsitekturnya hanya terdiri dari pemisahan yang jelas antara Model Layer dan Application Layer.
1. Model Layer vs Application Layer
- Model Layer (LLM): Bertugas memahami bahasa alami, mengevaluasi konteks, memilih alat (Tool Selection), dan menyusun argumen JSON.
- Application Layer (Kode Host / Python / TypeScript): Bertugas mengeksekusi fungsi alat nyata, memvalidasi parameter, menangani error, dan mengatur alur loop.
2. Implementasi Minimal Tool Calling Loop (Python)
import json
import re
# 1. Tool implementations
def calculate(expr):
# Gunakan parser/evaluator matematika yang aman.
# Jangan mengeksekusi input user dengan eval().
return safe_math_evaluate(expr)
def search_kb(query):
kb = {"python": "Bahasa readable untuk AI", "agent": "Sistem otonom bertool"}
return next((v for k, v in kb.items() if k in query.lower()), "Tidak ada di KB")
tools = {"calculator": calculate, "knowledge_search": search_kb}
# 2. Loop orchestrator dengan batas MAX_STEPS
def run_agent_loop(user_query, max_steps=6):
messages = [{"role": "user", "content": user_query}]
steps = 0
while steps < max_steps:
# Model memutuskan tool mana yang dipanggil
decision = query_tool_router(messages) # mengembalikan {"tool": "...", "input": "..."}
if decision["tool"] == "none":
return decision["input"] # Jawaban final
tool_fn = tools.get(decision["tool"])
if not tool_fn:
tool_result = f"Error: Tool {decision['tool']} tidak terdaftar"
else:
tool_result = tool_fn(decision["input"])
messages.append({"role": "assistant", "content": f"Memanggil {decision['tool']}"})
messages.append({"role": "tool", "content": str(tool_result)})
steps += 1
return "Loop mencapai batas langkah (MAX_STEPS)."
3. Batas & Guardrail Loop
Jangan pernah membuat loop tanpa batas: selalu pasang MAX_STEPS (mis. 6–10) dan penanganan timeout agar model tidak terjebak dalam panggilan alat berulang tak terbatas (infinite reasoning loop).
M8