Sebelum memulai praktik, pastikan Anda telah memahami konsep dasar pada materi kelas AI Agent & PHP di infokoding.

BAB 7

Membuat Memory Percakapan AI Agent PHP

Implementasi memory percakapan pada AI Agent: menyimpan riwayat chat menggunakan Session PHP dan MySQL, memahami batas Context Window, dan cara mengirim history ke OpenAI API.

Terakhir diperbarui:

TL;DR (Ringkasan Cepat)
  • Session PHP: Pilihan tercepat untuk menyimpan riwayat chat jangka pendek per user session.
  • Database MySQL: Diperlukan untuk menyimpan histori pesan persisten antar-perangkat dan analitik jangka panjang.
  • Redis Cache & OPcache: Gunakan Redis in-memory dan OPcache PHP 8.3 untuk menekan latency & TTFB di bawah 500ms.
  • Vector Store: Solusi Long-term Memory untuk mencari konteks masa lalu berdasarkan kemiripan arti (semantic search).

Diagram Arsitektur Alur Data Memory AI Agent PHP

Visualisasi bagaimana riwayat pesan pengguna diproses dari Session/Redis, dipangkas oleh Sliding Window, hingga disimpan secara persisten di MySQL.

User Input Pesan Pengguna Baru Session / Redis Load Memory (<5ms) MySQL Database Persisten Permanen Sliding Window Pangkas N Pesan Terakhir OpenAI API Chat Completion
Tipe Memory Latency Persistence Rekomendasi Use Case
PHP Session < 1ms Temporer (per Session) Prototype, Single-page AI Chat Widget
Redis In-Memory < 5ms Semi-Persisten (dengan TTL) High-traffic CS Chatbot, Fast Caching Layer
Database MySQL 10ms - 50ms Persisten Permanen Audit Trail, Riwayat Chat Pengguna Terdaftar
Vector Store (Semantic) 20ms - 100ms Persisten & Indexing Vector Long-term Memory, Search Pencarian Semantik RAG

Menyimpan Riwayat Chat AI Agent PHP dengan Session

Untuk prototype cepat atau aplikasi web berbasis tunggal, PHP Session adalah opsi paling cepat untuk menyimpan riwayat percakapan AI Agent PHP:

<?php

class SessionMemory
{
    private string $sessionKey;

    public function __construct(string $sessionKey = 'chat_history')
    {
        $this->sessionKey = $sessionKey;
        if (session_status() === PHP_SESSION_NONE) {
            session_start();
        }
    }

    public function add(string $role, string $content): void
    {
        if (!isset($_SESSION[$this->sessionKey])) {
            $_SESSION[$this->sessionKey] = [];
        }
        $_SESSION[$this->sessionKey][] = [
            'role'    => $role,
            'content' => $content,
        ];
    }

    public function getAll(): array
    {
        return $_SESSION[$this->sessionKey] ?? [];
    }

    public function clear(): void
    {
        $_SESSION[$this->sessionKey] = [];
    }

    public function getLastN(int $n): array
    {
        $history = $this->getAll();
        return array_slice($history, -$n);
    }
}

Menyimpan Riwayat Chat AI Agent PHP ke Database MySQL

Untuk aplikasi bertingkat enterprise, gunakan database relasional agar riwayat chat tersimpan secara persisten:

-- Migration: Tabel chat_sessions
CREATE TABLE IF NOT EXISTS chat_sessions (
    id          BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    session_id  VARCHAR(128) NOT NULL,
    user_id     BIGINT UNSIGNED NULL,
    created_at  DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at  DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_session_id (session_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Migration: Tabel chat_messages
CREATE TABLE IF NOT EXISTS chat_messages (
    id          BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    session_id  VARCHAR(128) NOT NULL,
    role        ENUM('system','user','assistant','tool') NOT NULL,
    content     LONGTEXT NOT NULL,
    tool_name   VARCHAR(100) NULL,
    token_count INT NULL,
    created_at  DATETIME DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_session_id (session_id),
    INDEX idx_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
<?php

class DatabaseMemory
{
    private PDO $pdo;
    private string $sessionId;

    public function __construct(PDO $pdo, string $sessionId)
    {
        $this->pdo       = $pdo;
        $this->sessionId = $sessionId;
    }

    public function add(string $role, string $content, ?string $toolName = null): void
    {
        $stmt = $this->pdo->prepare(
            'INSERT INTO chat_messages (session_id, role, content, tool_name) VALUES (?, ?, ?, ?)'
        );
        $stmt->execute([$this->sessionId, $role, $content, $toolName]);
    }

    public function getAll(int $limit = 50): array
    {
        $stmt = $this->pdo->prepare(
            'SELECT role, content FROM chat_messages
             WHERE session_id = ?
             ORDER BY created_at ASC
             LIMIT ?'
        );
        $stmt->execute([$this->sessionId, $limit]);
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
}

Keamanan & Kepatuhan Privasi Data Memory (GDPR / UU Pelindungan Data Pribadi PDP)

Dalam aplikasi produksi, memori percakapan berpotensi menyimpan data sensitif seperti informasi pribadi (PII), email, atau nomor telepon pengguna. Untuk mematuhi standar privasi GDPR & UU PDP (Pelindungan Data Pribadi):

Enkripsi Payload at-Rest (AES-256-GCM)

Enkripsi isi kolom content di MySQL menggunakan enkripsi AES-256 via openssl_encrypt() pada level PHP atau fungsi AES_ENCRYPT() pada MySQL sebelum disimpan ke disk storage.

Redaksi PII (Personally Identifiable Information)

Filter teks input user menggunakan ekspresi reguler (Regex) PHP untuk menyamarkan NIK, nomor kartu kredit, atau nomor telepon menjadi tag [REDACTED] sebelum dikirim ke OpenAI API.

Kebijakan Retensi Data & Right to be Forgotten

Jalankan CRON Job pembersihan berkala (DELETE FROM chat_messages WHERE created_at < NOW() - INTERVAL 30 DAY) dan sediakan API endpoint untuk menghapus memori atas permintaan user.

Memahami Context Window & Strategi Belajar ai-agent-php

Context Window adalah batas maksimum jumlah token yang dapat diproses oleh AI dalam satu request:

  • gpt-4o-mini: ~128.000 token context window
  • gpt-4o: ~128.000 token context window
  • gpt-3.5-turbo: ~16.000 token context window

Jika riwayat percakapan melebihi batas ini, terapkan strategi pangkas histori N pesan terakhir dalam alur belajar ai-agent-php:

// Strategi: Selalu sertakan system prompt + N pesan terakhir
public function buildContextMessages(array $history, string $systemPrompt, int $maxMessages = 20): array
{
    $messages = [['role' => 'system', 'content' => $systemPrompt]];
    $recentHistory = array_slice($history, -$maxMessages);
    return array_merge($messages, $recentHistory);
}

Rumus & Tabel Estimasi Konsumsi Token & Biaya API

Setiap kali Anda mengirimkan riwayat percakapan ke OpenAI API, seluruh pesan dalam array messages dihitung sebagai Input Token. Gunakan rumus estimasi berikut:

Total Input Token = System Prompt Token + (Pesan User & Assistant × N)
Jumlah Histori (N) Estimasi Total Token/Req Estimasi Biaya (gpt-4o-mini) Rekomendasi
5 Pesan Terakhir ≈ 750 Token $0.00011 / req Sangat Hemat (Saran Chat Widget)
10 Pesan Terakhir ≈ 1.500 Token $0.00022 / req Ideal & Seimbang untuk CS Chatbot
20 Pesan Terakhir ≈ 3.000 Token $0.00045 / req Konstruksi Konteks Kompleks
50 Pesan Terakhir ≈ 7.500 Token $0.00112 / req Potensi Boros (Saran: Pakai RAG/Vector)

Perbandingan Pendekatan: Native PHP vs Framework AI PHP (LLPhant & SDK)

Dalam mengembangkan memori AI Agent, Anda dapat memilih antara arsitektur Native PHP (cURL + PDO) atau Library/Framework AI PHP:

Fitur / Kriteria Native PHP (Tutorial Ini) Framework AI PHP (LLPhant / SDK)
Dependensi External Nol (0 external vendor package) Membutuhkan Composer package vendor
Kontrol Arsitektur Code 100% Fleksibel, Bebas Kustomisasi Query Terikat dengan abstraksi class framework
Kecepatan Development Memerlukan penulisan helper & retry manual Sangat Cepat (Tersedia Out-of-the-box)
Cocok Untuk Sistem Enterprise High-Performance, Microservices Rapid Application Development (RAD), MVP

Penyimpanan Memori Percakapan Semantik dengan Vector Store (PHP & Embeddings)

Selain memori urutan percakapan (Short-term Conversation History), AI Agent PHP tingkat lanjut membutuhkan Semantic Memory (Long-term Memory). Dengan Vector Store (seperti Qdrant, Pinecone, atau PostgreSQL pgvector), AI Agent dapat mencari pesan masa lalu berdasarkan kemiripan arti (similarity) meskipun tidak menggunakan kata kunci yang persis sama.

Cara Kerja Vector Memory pada AI Agent PHP

  1. Vektorization: Konversi teks percakapan pengguna menjadi larik angka (vector embedding) menggunakan endpoint /v1/embeddings OpenAI (model text-embedding-3-small).
  2. Penyimpanan: Simpan nilai vector bersama metadata pesan ke dalam Vector Database.
  3. Cosine Similarity Search: Saat ada pertanyaan baru, cari N pesan relevan terdekat yang memiliki skor kemiripan tertinggi untuk dimasukkan ke dalam System Context.

Contoh skrip PHP untuk menghasilkan Vector Embedding dari pesan percakapan:

<?php

// Generate Vector Embedding untuk Semantic Memory
function createEmbedding(string $text, string $apiKey): array
{
    $ch = curl_init('https://api.openai.com/v1/embeddings');
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST           => true,
        CURLOPT_POSTFIELDS     => json_encode([
            'model' => 'text-embedding-3-small',
            'input' => $text,
        ]),
        CURLOPT_HTTPHEADER     => [
            'Content-Type: application/json',
            'Authorization: Bearer ' . $apiKey,
        ],
    ]);

    $response = curl_exec($ch);
    curl_close($ch);

    $data = json_decode($response, true);
    return $data['data'][0]['embedding'] ?? []; // Larik float vector (1536 dimensi)
}

Optimasi Performa Memory AI Agent PHP: Redis, OPcache & Cloudflare CDN

Untuk memastikan Time to First Byte (TTFB) aplikasi AI Agent PHP Anda berada di bawah 500ms, terapkan tiga tingkatan caching dan optimasi infrastruktur berikut:

1. Caching Memory In-Memory via Redis

Gunakan Redis sebagai buffer penyimpanan histori pesan aktif dengan TTL 1 jam. Pembacaan dari Redis jauh lebih cepat (< 5ms) dibanding query SQL berulang ke disk MySQL.

2. PHP 8.3 OPcache & JIT Compiler

Aktifkan extension OPcache (opcache.enable=1, opcache.jit=tracing) pada server Linux Anda untuk menyimpan bytecode skrip PHP di RAM sehingga menghilangkan overhead parsing skrip pada setiap request.

3. CDN Cloudflare & Index Database MySQL

Gunakan Cloudflare CDN untuk pengiriman aset statis (CSS/JS/Gambar) dan pastikan indeks idx_session_id & idx_created_at terpasang pada tabel MySQL untuk menjamin query SELECT histori berjalan instan.

FAQ: Pertanyaan Umum Memory AI Agent PHP

Berikut adalah jawaban atas pertanyaan populer seputar pengelolaan memory, penyimpanan histori, dan optimasi context window di PHP:

Kapan harus menggunakan Session PHP vs Database MySQL untuk memory AI Agent?
Gunakan Session PHP untuk pengujian cepat atau aplikasi web berbasis single-session. Gunakan Database MySQL (dengan indexing session_id) untuk aplikasi produksi yang membutuhkan histori persisten antar-perangkat dan analitik percakapan.
Bagaimana cara mencegah error Context Window Exceeded saat menyimpan riwayat percakapan AI?
Terapkan teknik Sliding Window Context Memory dengan mengambil N pesan terbaru via array_slice(), sambil selalu mempertahankan System Prompt pada index 0.
Mengapa Redis sangat direkomendasikan untuk caching memory AI Agent PHP?
Redis menyimpan data di RAM (in-memory key-value store) dengan waktu respons kurang dari 5ms. Ini menghilangkan bottleneck I/O disk MySQL saat AI Agent membaca histori pesan secara intensif.

Source Code Memory Percakapan AI Agent PHP

Unduh class SessionMemory, DatabaseMemory PDO, & handler Sliding Window di GitHub.

Repository GitHub

Poin Kunci Bab 7

Memory yang baik adalah perbedaan antara AI yang "pelupa" dan AI yang benar-benar terasa cerdas. Selalu desain sistem memory dari awal — jauh lebih mudah daripada menambahkannya belakangan.

Rusmawan Abdullah Sani

Penulis & Instruktur: Rusmawan Abdullah Sani

DevOps Engineer & Sysadmin dengan spesialisasi arsitektur PHP 8.3+, CI/CD Pipeline, & Integrasi AI Agent Enterprise.

Profil LinkedIn