Deni.dev Logo
16-07-2026
10 mnt baca

Anatomi Perulangan Kognitif: Mengimplementasikan Pola Reflexion dan Memori Semantik pada Autonomous Agent

#AI Agents#Cognitive Architecture#Reflexion Pattern#Semantic Memory#LLM

Anatomi Perulangan Kognitif: Mengimplementasikan Pola Reflexion dan Memori Semantik pada Autonomous Agent

Sebagian besar implementasi AI Agent saat ini masih terjebak dalam paradigma ReAct (Reason + Act) yang linear. Agen menerima instruksi, merencanakan langkah (Reason), memanggil alat (Act), mengamati hasil (Observation), dan langsung memberikan jawaban akhir.

Namun, skenario dunia nyata jarang sekali berjalan mulus dalam satu kali percobaan. Ketika dihadapkan pada tugas-tugas kompleks dengan horizon panjang—seperti menulis basis kode yang rumit atau melakukan riset pasar yang mendalam—agen yang mengandalkan ReAct murni sering kali mengalami compounding errors. Sekali agen membuat asumsi yang salah di awal, kesalahan tersebut akan menumpuk hingga menghasilkan output akhir yang sepenuhnya meleset (halusinasi).

Untuk membangun agen yang benar-benar otonom dan tangguh (resilient), kita harus bergeser dari sekadar prompt engineering sederhana menuju Arsitektur Kognitif (Cognitive Architectures) yang memiliki kemampuan introspeksi diri. Artikel ini akan membedah bagaimana mengimplementasikan Pola Reflexion (evaluasi diri) dan Memori Semantik Berlapis untuk menciptakan agen yang mampu belajar dari kesalahannya sendiri secara real-time.


Mengapa ReAct Saja Tidak Cukup?

Pada pola ReAct konvensional, agen tidak memiliki mekanisme untuk berhenti sejenak dan mengevaluasi apakah tindakan yang baru saja dilakukannya sudah benar atau mendekati tujuan. Agen bertindak layaknya seorang programmer yang menulis ratusan baris kode langsung ke lingkungan produksi tanpa pernah menjalankan unit test atau membaca pesan error secara kritis.

Masalah utama dari pendekatan ini meliputi:

  1. Myopic Execution: Agen hanya fokus pada langkah berikutnya tanpa memahami konteks kegagalan secara makro.
  2. Infinite Loops: Agen sering kali terjebak memanggil alat yang sama berulang-ulang dengan parameter yang sama meskipun hasilnya selalu gagal.
  3. Context Drift: Seiring bertambahnya langkah, memori jangka pendek agen dipenuhi oleh log eksekusi yang tidak relevan, mendepak instruksi awal dari context window.

Membedah Pola Reflexion: Lingkaran Setan yang Konstruktif

Pola Reflexion (diperkenalkan oleh Shinn dkk.) memberikan agen kemampuan untuk melakukan reinforcement learning secara verbal tanpa perlu melatih ulang bobot (weights) model LLM. Pola ini membagi arsitektur kognitif agen menjadi tiga komponen utama:

  1. The Actor (Aktor): Bertugas menghasilkan tindakan dan trajektori pemecahan masalah berdasarkan instruksi dan memori saat ini.
  2. The Evaluator (Evaluator): Menilai kinerja Aktor secara objektif. Evaluator bisa berupa fungsi berbasis aturan (misalnya, unit test), API eksternal, atau LLM terpisah yang dikonfigurasi sebagai validator ketat.
  3. The Self-Reflector (Reflektor): Ketika Evaluator mendeteksi kegagalan, Reflektor bertugas menganalisis trajektori kesalahan tersebut, mengidentifikasi di mana letak kesalahan logika Aktor, dan menulis "saran perbaikan" ke dalam memori verbal agen.

Dengan pola ini, jika Aktor gagal menyelesaikan tugas, ia tidak langsung menyerah atau mengulangi kesalahan yang sama. Sebaliknya, ia akan membaca refleksi dirinya sendiri pada percobaan berikutnya dan menyesuaikan strateginya.


Arsitektur Memori Semantik Berlapis

Untuk mendukung perulangan kognitif ini, kita tidak bisa hanya mengandalkan context window mentah. Kita memerlukan struktur memori yang terorganisasi dengan baik:

  • Working Memory (Memori Kerja): Konteks aktif saat ini, instruksi instan, dan hasil eksekusi alat terbaru.
  • Episodic Memory (Memori Episodik): Rekaman visual atau log dari percobaan (trials) sebelumnya dalam sesi yang sama. Memori ini menyimpan riwayat keberhasilan dan kegagalan spesifik dari tugas saat ini.
  • Semantic Memory (Memori Semantik): Pengetahuan konseptual jangka panjang yang terus diperbarui. Di sinilah hasil abstraksi dari proses self-reflection disimpan agar bisa digunakan untuk tugas-tugas serupa di masa depan.

Cetak Biru Implementasi: Membangun Agen Reflexion dengan Python

Mari kita implementasikan agen pembuat kode sederhana yang menggunakan pola Reflexion untuk memperbaiki kodenya sendiri berdasarkan hasil eksekusi unit test.

import sys
from typing import Dict, List, Tuple

# Representasi Memori Episodik sederhana
class EpisodicMemory:
    def __init__(self):
        self.past_trials: List[Dict[str, str]] = []

    def add_trial(self, code: str, feedback: str, reflection: str):
        self.past_trials.append({
            "code": code,
            "feedback": feedback,
            "reflection": reflection
        })

    def format_for_prompt(self) -> str:
        if not self.past_trials:
            return "Belum ada percobaan sebelumnya."
        
        formatted = ""
        for i, trial in enumerate(self.past_trials):
            formatted += f"\n--- Percobaan #{i+1} ---\n"
            formatted += f"Kode yang Dibuat:\n{trial['code']}\n"
            formatted += f"Hasil/Feedback: {trial['feedback']}\n"
            formatted += f"Refleksi Diri: {trial['reflection']}\n"
        return formatted

# Mock fungsi LLM untuk simulasi Aktor dan Reflektor
def call_llm(prompt: str) -> str:
    # Dalam produksi, ini akan memanggil API OpenAI, Anthropic, atau Ollama
    # Di sini kita simulasikan respons untuk mendemonstrasikan alur kognitif
    if "Refleksi Diri" in prompt and "pembagian dengan nol" in prompt:
        return "Saya perlu menambahkan validasi `if b == 0: return 0` sebelum melakukan pembagian."
    elif "Evaluasi kegagalan" in prompt:
        return "Kegagalan terjadi karena ZeroDivisionError saat input b bernilai 0."
    else:
        # Simulasi bug pertama kali (Aktor membuat bug pembagian dengan nol)
        if "Percobaan #1" not in prompt:
            return "def bagi_angka(a, b):\n    return a / b"
        else:
            return "def bagi_angka(a, b):\n    if b == 0:\n        return 0\n    return a / b"

# Evaluator: Menjalankan unit test nyata terhadap kode yang dihasilkan
def evaluate_code(code: str) -> Tuple[bool, str]:
    local_vars = {}
    try:
        # Eksekusi kode secara dinamis (Gunakan sandbox aman dalam produksi!)
        exec(code, {}, local_vars)
        bagi_angka = local_vars.get('bagi_angka')
        
        # Test Case 1: Normal
        assert bagi_angka(10, 2) == 5.0
        # Test Case 2: Edge Case (Pembagian dengan nol)
        assert bagi_angka(5, 0) == 0
        
        return True, "Semua unit test lolos!"
    except AssertionError:
        return False, "AssertionError: gagal menangani pembagian dengan nol (b=0)."
    except Exception as e:
        return False, f"Runtime Error: {str(e)}"

# Orkesrasi Cognitive Loop
def run_reflexion_agent(target_task: str):
    memory = EpisodicMemory()
    max_iterations = 3
    
    print(f"Memulai tugas: {target_task}\n")
    
    for iteration in range(max_iterations):
        print(f"=== Iterasi {iteration + 1} ===")
        
        # 1. Aktor bertindak berdasarkan memori episodik yang berisi kegagalan masa lalu
        history = memory.format_for_prompt()
        actor_prompt = f"""
        Tugas: {target_task}
        Berikut adalah riwayat percobaan Anda sebelumnya:
        {history}
        
        Tuliskan fungsi Python yang tepat untuk menyelesaikan tugas di atas.
        """
        
        code_generated = call_llm(actor_prompt)
        print(f"[Actor] Menghasilkan Kode:\n{code_generated}\n")
        
        # 2. Evaluator menguji output
        success, feedback = evaluate_code(code_generated)
        print(f"[Evaluator] Hasil Pengujian: {feedback}")
        
        if success:
            print("\n🎉 Sukses! Agen berhasil menyelesaikan tugas secara mandiri.")
            return code_generated
        
        # 3. Jika gagal, Reflektor menganalisis letak kesalahan
        reflector_prompt = f"""
        Evaluasi kegagalan berikut:
        Kode: {code_generated}
        Feedback/Error: {feedback}
        
        Jelaskan mengapa kode ini gagal dan strategi apa yang harus diambil untuk memperbaikinya pada langkah berikutnya.
        """
        reflection = call_llm(reflector_prompt)
        print(f"[Reflektor] Analisis Kesalahan: {reflection}\n")
        
        # Simpan ke memori episodik untuk iterasi berikutnya
        memory.add_trial(code_generated, feedback, reflection)
        
    print("❌ Agen gagal menyelesaikan tugas dalam batas iterasi maksimum.")
    return None

# Eksekusi Agen
run_reflexion_agent("Buat fungsi Python 'bagi_angka(a, b)' yang aman dari error pembagian dengan nol.")

Analisis Trade-off: Biaya vs. Kognisi

Meskipun arsitektur perulangan kognitif seperti Reflexion menawarkan ketahanan yang luar biasa, ia datang dengan harga yang harus dibayar:

Dimensi Pola ReAct Klasik Pola Reflexion
Konsumsi Token Rendah-Sedang (Satu arah, linier) Sangat Tinggi (Akibat perulangan evaluasi diri)
Latensi (Waktu Tunggu) Cepat (Sub-detik hingga detik) Lambat (Harus menunggu beberapa putaran LLM)
Tingkat Keberhasilan Rendah pada tugas kompleks Tinggi pada tugas yang membutuhkan logika presisi
Sifat Eksekusi Spekulatif Defensif & Korektif

Strategi Mitigasi Biaya dan Latensi

Untuk menjaga agar agen Anda tidak menguras kuota API Anda dalam hitungan menit, terapkan strategi optimasi berikut:

  • Hybrid Model Routing: Gunakan model LLM yang besar dan mahal (seperti GPT-4o atau Claude 3.5 Sonnet) hanya untuk komponen Reflektor yang membutuhkan penalaran analitis tinggi. Gunakan model yang lebih kecil, cepat, dan murah (seperti GPT-4o-mini atau Llama 3 8B) untuk komponen Actor dan Evaluator.
  • Semantic Checkpointing: Simpan hasil refleksi yang berhasil ke dalam Vector Database sebagai Memori Semantik jangka panjang. Jika agen di masa depan menghadapi tugas yang serupa, ia dapat langsung mengambil "tips sukses" tersebut tanpa harus mengulangi proses trial-and-error dari nol.

Kesimpulan

Membangun AI Agent yang andal untuk tingkat produksi (enterprise-ready) menuntut kita untuk berhenti memperlakukan LLM sebagai mesin penjawab satu arah. Dengan menerapkan pola Reflexion dan Memori Semantik, kita memberikan agen kemampuan paling manusiawi yang pernah ada: kemampuan untuk belajar dari kegagalan.

Melalui pemisahan peran yang tegas antara Aktor yang bertindak, Evaluator yang menguji secara objektif, dan Reflektor yang menganalisis secara mendalam, sistem otonom dapat menavigasi kompleksitas tugas dengan tingkat keberhasilan yang jauh lebih tinggi dan deterministik.

Menikmati artikel ini? Berikan apresiasi Anda!