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

BAB 21

Studi Kasus AI Agent PHP: Customer Support & Database Memory

Implementasi nyata AI Agent PHP end-to-end: menjawab pertanyaan, query database MySQL, membaca file PDF, integrasi API eksternal, MCP tools, dan persistent memory.

Terakhir diperbarui:

TL;DR (Ringkasan Cepat)

  • Customer Support Agent Otonom: Membangun asisten AI Aria untuk platform e-commerce yang mampu merespons komplain pelanggan 24/7.
  • State Persistence MySQL: Menggunakan tabel chat_messages dengan kueri ber-parameter untuk menyimpan riwayat dialog lintas sesi.
  • Multi-Tools via MCP: Mengintegrasikan pencarian pesanan SQL, ekstraksi buku panduan product-guide.pdf, dan tracking kurir.
  • Efisiensi Token Memory Pruning: Memangkas 86.4% biaya token API LLM pada sesi percakapan panjang menggunakan teknik Sliding Window Context.

Studi Kasus: Membangun Customer Support Agent PHP & Database Memory AI Agent

Direct Answer:Membangun Customer Support Agent PHP dengan Database Memory AI Agent adalah perancangan arsitektur agen AI komprehensif di mana orkestrator backend (CustomerSupportAgent) menjalankan ReAct loop, mengelola state persistence MySQL lintas request, serta mendelegasikan tugas ke driver Model Context Protocol (MCP) untuk menyelesaikan tiket kendala pelanggan secara otonom dan presisi.

Dalam modul penutup seri belajar ai-agent-php ini, integrasi arsitektur agen AI dan state persistence MySQL menjamin riwayat dialog pengguna tersimpan aman tanpa memicu *runaway token costs* di lingkungan produksi.

Key Takeaways: Rangkuman Blueprint AI Agent Enterprise PHP
  • Orkestrator Backend Otonom: Memisahkan logika ReAct loop agen dari layer HTTP untuk modularitas dan kemudahan pengujian unit test.
  • State Persistence MySQL: Menyimpan state percakapan dan metadata tool call ke dalam database relasional dengan skema terindeks.
  • Integrasi Multi-Tools MCP: Memanggil fungsi pencarian pesanan SQL, ekstraksi PDF manual, dan tracking resi kurir pengiriman secara serentak.
  • Memory Pruning & Cost Optimization: Memangkas riwayat dialog usang untuk menghemat hingga 86.4% biaya token model inferensi LLM.
Live Debugger Sandbox: ReAct Loop & Tool Call Execution
Sandbox Ready
1. Incoming User Querysession_id: usr_982
"Tolong cek status pesanan saya #ORD-8821 dan apakah barangnya bisa diretur jika cacat?"
State: Menunggu Eksekusi
2. Backend Orchestrator & Tool Log Stream0 ms
Tekan "Jalankan Simulasi Task" untuk mengamati observasi ReAct loop...
Token Usage: 0 TokensLihat Source Driver
Diagram Arsitektur: Production-Ready Enterprise Customer Support AI Agent (PHP Architecture)
WebP Lossless • 82 KB • Schema Ready
Diagram arsitektur lengkap implementasi studi kasus Customer Support Agent PHP: Browser klien mengirim request ke orchestrator, berinteraksi dengan Persistent Database Memory AI Agent MySQL, McpClient multi-tools, OpenAI GPT-4o mini, dan Monolog logging system
Gambar 21.1: Arsitektur Solusi Lengkap — Integrasi orkestrasi Customer Support Agent PHP, Database Memory AI Agent, MCP tool dispatcher, dan API LLM eksternal.

Matriks Modul Alat (Tools) & Tanggung Jawab Operasional

Matriks Modul Tools Customer Support AI Agent PHP
Nama Tool / MCP ToolClass Driver PHPSumber Data / ProtokolTanggung Jawab Fungsional
database_queryApp\Tools\DatabaseToolMySQL (Prepared Statement)Pencarian status pesanan, total belanja, dan verifikasi identitas user.
read_pdf_manualApp\Tools\PdfReaderToolSmalot\PdfParser / Local File (product-guide.pdf)Ekstraksi klausul garansi dan petunjuk penggunaan produk dari PDF internal.
track_shippingApp\Tools\ShippingApiToolREST API Eksternal (cURL)Pengecekan live tracking status kurir ekspedisi (JNE/J&T/SiCepat).
calculate_discountApp\Tools\CalculatorToolPHP Math Expression EngineKalkulasi simulasi diskon kupon, pajak PPN, dan ongkos kirim gabungan.

Perbandingan Token Cost Sebelum vs Sesudah Optimasi Database Memory Pruning

Tabel Komparasi Token Cost Memory Pruning AI Agent PHP
Panjang Sesi PercakapanTanpa Pruning (Full History)Dengan Memory Pruning (Sliding Window)Penghematan Biaya TokenDampak pada Akurasi Konteks
5 Turn Dialog Pendek1.250 Tokens (~$0.00019)1.100 Tokens (~$0.00016)12.0% HematKonteks 100% Utuh
15 Turn Dialog Menengah4.600 Tokens (~$0.00069)1.450 Tokens (~$0.00022)68.5% HematFokus pada 6 Turn Terkini
30 Turn Sesi Komplain Panjang11.800 Tokens (~$0.00177)1.600 Tokens (~$0.00024)86.4% HematMencegah Context Overflow Crash
100.000 Percakapan / Bulan$177.00 / Bulan$24.00 / Bulan$153.00 / Bulan (86.4%)ROI Signifikan di Lingkungan Produksi

Arsitektur Solusi Customer Support Agent PHP & Database Memory

Direct Answer:Strategi membangun AI Agent lengkap di PHP mengandalkan arsitektur agen AI berpusat pada orkestrator backend yang menerima query browser, memuat riwayat percakapan dari state persistence MySQL, lalu mengeksekusi siklus Reasoning & Acting (ReAct) berulang bersama McpClient hingga jawaban final terbentuk.

Dalam proses membangun AI Agent lengkap untuk skala produksi, arsitektur ini memisahkan layer presentasi web, logika agen otonom, dan antarmuka alat (tools) agar sistem mudah diuji dan dikembangkan:

+-------------------------------------------------------------------------+
|                           User Browser Client                           |
+-------------------------------------------------------------------------+
                                     │ (HTTPS POST /api/chat.php)
                                     ▼
+-------------------------------------------------------------------------+
|                  API Gateway & Rate Limiter Middleware                  |
+-------------------------------------------------------------------------+
                                     │
                                     ▼
+-------------------------------------------------------------------------+
|                 Customer Support Agent PHP (Orchestrator)               |
|  - System Prompt (Aria Persona)                                         |
|  - ReAct Engine Loop (maxIterations = 8)                                 |
+-------------------------------------------------------------------------+
        │                                    │                      │
        ▼                                    ▼                      ▼
+-------------------+              +-------------------+   +--------------------+
|  DatabaseMemory   |              |    McpClient      |   |   OpenAI Client    |
| (Database Memory) |              | (Tool Dispatcher) |   |  (GPT-4o mini API) |
+-------------------+              +-------------------+   +--------------------+
                                             │
             ┌───────────────────────────────┼──────────────────────────────┐
             ▼                               ▼                              ▼
    [DatabaseTool: MySQL]          [PdfReaderTool: PDF]          [ShippingApiTool]

Implementasi Kode: 4 Langkah Membangun CustomerSupportAgent PHP

Direct Answer:Tahap inti membangun AI Agent lengkap diwujudkan lewat class CustomerSupportAgent melalui 4 langkah sekuensial: Step 1 Inisialisasi dependensi & state, Step 2 Komposisi prompt & context history, Step 3 Eksekusi ReAct reasoning loop, dan Step 4 Evaluasi tool call dispatcher.

Berikut adalah daftar langkah terstruktur dan kode lengkap implementasi orkestrator backend agen:

  1. Step 1: Registrasi Dependensi & Client: Menghubungkan client LLM OpenAI, dispatcher MCP, dan Monolog logger ke dalam constructor agen.
  2. Step 2: Penyusunan Payload Konteks Dialog: Menggabungkan System Prompt (persona Aria), riwayat sesi dari state persistence MySQL, dan input pengguna terbaru.
  3. Step 3: Eksekusi ReAct Reasoning Loop: Menjalankan inferensi model dengan batas maxIterations = 8 untuk mencegah *infinite tool call loop*.
  4. Step 4: Dispatching & Handling Hasil Tool: Mengeksekusi driver tool secara otomatis jika LLM meminta data tambahan (SQL/PDF/Shipping API) lalu mengembalikan observasi ke model.
<?php

namespace App\Agent;

use App\OpenAIClient;
use App\MCP\McpClient;
use App\Logger\Logger;
use Throwable;

/**
 * Class CustomerSupportAgent
 * Orkestrator backend Customer Support Agent PHP berbasis ReAct Loop & Model Context Protocol.
 */
class CustomerSupportAgent
{
    private OpenAIClient $client;
    private McpClient $mcpClient;
    private Logger $logger;
    private array $messages = [];
    private int $maxIterations;

    // =========================================================================
    // Step 1: Inisialisasi Dependensi Orkestrator Agen
    // =========================================================================
    public function __construct(
        OpenAIClient $client,
        McpClient $mcpClient,
        Logger $logger,
        int $maxIterations = 8
    ) {
        $this->client        = $client;
        $this->mcpClient     = $mcpClient;
        $this->logger        = $logger;
        $this->maxIterations = $maxIterations;
    }

    /**
     * Memproses pesan masuk dari pengguna dan mengeksekusi rantai penalaran agen.
     */
    public function handle(string $userId, string $userMessage, array $history = []): array
    {
        $startTime = microtime(true);
        $toolsUsed = [];

        // =========================================================================
        // Step 2: Komposisi Payload Pesan & State Persistence Context History
        // =========================================================================
        $this->messages = array_merge(
            [['role' => 'system', 'content' => $this->getSystemPrompt()]],
            $history,
            [['role' => 'user', 'content' => $userMessage]]
        );

        $toolDefs    = $this->mcpClient->getToolDefinitions();
        $finalAnswer = '';
        $tokenUsage  = [];

        // =========================================================================
        // Step 3: Memulai Siklus Reasoning & Acting (ReAct Loop)
        // =========================================================================
        for ($i = 0; $i < $this->maxIterations; $i++) {
            $response = $this->client->chat($this->messages, $toolDefs);
            $message  = $response['choices'][0]['message'] ?? [];
            $tokenUsage = $response['usage'] ?? $tokenUsage;

            $this->messages[] = $message;

            // =========================================================================
            // Step 4: Dispatching & Eksekusi Tool Call (DatabaseTool / PdfTool / Shipping)
            // =========================================================================
            if (!empty($message['tool_calls'])) {
                foreach ($message['tool_calls'] as $toolCall) {
                    $toolName    = $toolCall['function']['name'];
                    $toolsUsed[] = $toolName;

                    $this->logger->info("Eksekusi Tool Dimulai", [
                        'tool'    => $toolName,
                        'user_id' => $userId,
                        'args'    => $toolCall['function']['arguments'] ?? '',
                    ]);

                    try {
                        // Eksekusi tool melalui dispatcher MCP Client
                        $toolResult       = $this->mcpClient->executeToolCall($toolCall);
                        $this->messages[] = $toolResult;
                    } catch (Throwable $e) {
                        $this->logger->error("Gagal Eksekusi Tool", ['error' => $e->getMessage()]);
                        $this->messages[] = [
                            'role'         => 'tool',
                            'tool_call_id' => $toolCall['id'],
                            'content'      => json_encode(['error' => 'Gagal memproses alat: ' . $e->getMessage()]),
                        ];
                    }
                }
                // Lanjutkan loop ke iterasi berikutnya untuk observasi hasil tool
                continue;
            }

            // Jawaban final tercapai jika model tidak meminta pemanggilan tool lagi
            $finalAnswer = $message['content'] ?? '';
            break;
        }

        $durationMs = (int) round((microtime(true) - $startTime) * 1000);

        return [
            'answer'       => $finalAnswer,
            'tools_used'   => array_values(array_unique($toolsUsed)),
            'duration_ms'  => $durationMs,
            'token_usage'  => $tokenUsage,
        ];
    }

    /**
     * Persona & Instruksi Pengarah Agen Aria.
     */
    private function getSystemPrompt(): string
    {
        return <<<PROMPT
Kamu adalah Aria, asisten AI Customer Support resmi untuk toko online ShopKita.

KEPRIBADIAN: Ramah, profesional, sabar, dan berorientasi solusi praktis.

KEMAMPUAN TOOLS:
1. database_query: Mencari data pesanan (order_id), status transaksi, dan profil user di database MySQL.
2. read_pdf_manual: Membaca syarat & ketentuan garansi, retur barang, dan buku panduan produk dari file PDF.
3. track_shipping: Mengecek status pelacakan resi ekspedisi kurir pengiriman terkini.
4. calculate_discount: Menghitung simulasi diskon kupon promo, pajak, dan ongkos kirim.

ATURAN PERILAKU:
- Jika user menanyakan status pesanan tanpa menyebutkan Order ID, mintalah nomor pesanan secara sopan.
- Gunakan data faktual yang didapat dari tool output, jangan pernah mengarang informasi (anti-halusinasi).
- Jika komplain tidak terselesaikan dalam batas wewenang, tawarkan eskalasi tiket ke tim Human Support.
- Berikan respons dalam Bahasa Indonesia yang santun dan mudah dipahami.
PROMPT;
    }
}

Setup Tools, State Persistence MySQL & Entry Point API

Direct Answer:Entry point api/chat.php menghubungkan incoming HTTP request dari browser ke CustomerSupportAgent setelah melewati validasi payload, rate limiter, serta manajemen state persistence MySQLDatabaseMemory.

Berikut adalah file entry point lengkap yang menyatukan seluruh dependensi modul:

<?php
// =========================================================================
// api/chat.php - Production-Ready API Endpoint for AI Customer Support
// =========================================================================

require_once __DIR__ . '/../vendor/autoload.php';

header('Content-Type: application/json; charset=UTF-8');
header('X-Content-Type-Options: nosniff');

$config = require __DIR__ . '/../config/config.php';
$rawInput = file_get_contents('php://input');
$input    = json_decode($rawInput, true);

// 1. Validasi Ketat Payload Masukan Pengguna
$userMessage = htmlspecialchars(trim($input['message'] ?? ''), ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
$sessionId   = preg_replace('/[^a-zA-Z0-9_-]/', '', $input['session_id'] ?? session_id());

if (empty($userMessage) || mb_strlen($userMessage) > 3000) {
    http_response_code(400);
    echo json_encode(['error' => 'Pesan masukan tidak valid atau melebihi batas 3.000 karakter.']);
    exit;
}

// 2. Inisialisasi Database Connection Pool & State Persistence Manager
$pdo = new PDO(
    "mysql:host={$config['db']['host']};dbname={$config['db']['name']};charset=utf8mb4",
    $config['db']['user'],
    $config['db']['pass'],
    [
        PDO::ATTR_PERSISTENT         => true,
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    ]
);

$memory   = new App\Memory\DatabaseMemory($pdo, $sessionId);
$history  = $memory->getAll(limit: 10);

// 3. Registrasi Tools ke Server MCP
$mcpServer = new App\MCP\McpServer();
$mcpServer
    ->register('database_query', new App\Tools\DatabaseTool($pdo))
    ->register('read_pdf_manual', new App\Tools\PdfReaderTool(__DIR__ . '/../storage/documents'))
    ->register('track_shipping', new App\Tools\ShippingApiTool($config['shipping_api_key']))
    ->register('calculate_discount', new App\Tools\CalculatorTool());

$mcpClient = new App\MCP\McpClient($mcpServer);
$client    = new App\OpenAIClient($config['openai_api_key']);
$logger    = new App\Logger\Logger(__DIR__ . '/../logs/customer_support.log', 'info');

// 4. Inisialisasi dan Eksekusi Agen
$agent  = new App\Agent\CustomerSupportAgent($client, $mcpClient, $logger);
$result = $agent->handle($sessionId, $userMessage, $history);

// 5. Simpan Hasil Dialog ke State Persistence MySQL
$memory->add('user', $userMessage);
$memory->add('assistant', $result['answer']);

// 6. Kembalikan Respon JSON ke Klien
echo json_encode([
    'status'      => 'success',
    'session_id'  => $sessionId,
    'answer'      => $result['answer'],
    'tools_used'  => $result['tools_used'],
    'duration_ms' => $result['duration_ms'],
    'token_usage' => $result['token_usage'],
]);

Repositori Kode Sumber GitHub CustomerSupportAgent

Source Code Lengkap: CustomerSupportAgent PHP

Blueprint repositori open-source mencakup driver MCP Tools, skema migrasi MySQL, dan test suite PHPUnit.

Kunjungi Repositori GitHub

FAQ: Tanya Jawab Teknis Studi Kasus AI Agent PHP

1. Bagaimana cara mencegah AI Agent terjebak dalam infinite tool loop?

Ringkasan Jawaban:Terapkan pembatasan perulangan eksplisit (misal: $maxIterations = 8) dan berikan umpan balik pesan peringatan sistem jika batas tercapai agar agen segera menghentikan pemanggilan tool dan memberikan rangkuman terbaik atau eskalasi ke manusia.

Selain itu, simpan riwayat nama tool yang sudah dipanggil; jika tool yang sama dipanggil lebih dari 3 kali berturut-turut dengan parameter identik, paksa agen untuk berhenti.

2. Mengapa Model Context Protocol (MCP) sangat direkomendasikan untuk arsitektur multi-tools di PHP?

Ringkasan Jawaban:MCP memisahkan logika tools dari kode inti LLM (decoupling). Setiap tool berdiri sebagai driver modular independen dengan skema JSON standar, sehingga penambahan tool baru tidak merusak stabilitas orkestrator backend utama.

Ini memungkinkan developer menambah lusinan integrasi API pihak ketiga secara plug-and-play tanpa mengubah struktur prompt utama.

3. Bagaimana cara mengamankan database dari query injeksi lewat DatabaseTool?

Ringkasan Jawaban:Jangan pernah mengizinkan LLM menulis raw string SQL sembarangan di lingkungan produksi. Batasi DatabaseTool hanya pada fungsi-fungsi parameterized kaku seperti searchOrderByUser(userId, orderId) dengan PDO binding.

Gunakan user database MySQL terisolasi dengan hak akses hanya-baca (SELECT-only) pada tabel transaksi spesifik untuk memitigasi risiko modifikasi data.

Key Takeaways: Penutup Studi Kasus Nyata AI Agent PHP
  • Blueprint Nyata Enterprise: Menggabungkan ReAct, MCP Tools, Memory, dan Logging dalam satu arsitektur production-ready.
  • Resiliensi Operasional: Proteksi error komprehensif, batas iterasi loop, dan failover human support menjamin keandalan sistem 24/7.
  • Optimasi Skalabilitas: Kombinasi response caching, connection pooling, dan memory pruning menekan biaya operasional API ke tingkat minimal.
RA

Rusmawan Abdullah Sani

Lead Software Engineer & System Architect

Praktisi pengembangan backend PHP modern, arsitektur AI Agent, microservices, dan otomasi server Linux. Terhubung melalui profil LinkedIn.