Ollama di Intel Celeron, Bagian III: Membangun AI Chatbot untuk Grav CMS

ollama llm grav-cms php rag self-hosting

Cepat, Lokal, dan Hemat Daya: Mengintegrasikan AI Chatbot ke Dalam Grav CMS

Antarmuka AI Chatbot Intel Celeron

Pada artikel sebelumnya, Self-Hosting AI Lokal di Laptop Celeron N4100, saya membuktikan bahwa laptop Celeron 6-Watt hemat daya dengan RAM 8 GB mampu menjalankan Ollama dan memproses model ringan seperti Qwen2.5 (0.5B).

Pertanyaan selanjutnya adalah: dapatkah mesin ini berfungsi sebagai chatbot dokumentasi interaktif untuk situs web — tanpa membebani CPU atau membuat pengunjung menunggu hingga 120 detik?

Jawabannya adalah ya — dan dalam prosesnya, skrip pencarian sederhana ini berkembang menjadi plugin utuh. Berikut adalah penjelasan teknis bagaimana grav-ai-chatbot bekerja.


Tantangan: RAM 8 GB dan Tanpa AVX2

Sebagian besar sistem pencarian AI (Retrieval-Augmented Generation / RAG) mengandalkan vector database seperti ChromaDB atau Qdrant yang membutuhkan pemrosesan model embedding terpisah di memori.

Pada Intel Celeron N4100, pendekatan tersebut menghadapi kendala:

  1. Keterbatasan RAM. Menjalankan LLM sekaligus model embedding secara bersamaan menyisakan sedikit memori untuk sistem.
  2. Ketiadaan AVX2. Operasi vektor tanpa instruksi AVX2 menyebabkan beban tinggi pada CPU — meningkatkan jeda prompt menjadi 30–45 detik per pertanyaan.

Oleh karena itu, prinsip utamanya adalah: hanya kirimkan pertanyaan ke model AI jika memang diperlukan, dan hindari kalkulasi berulang pada CPU.


Arsitektur Pipeline 5 Tingkat

Setiap pesan dari pengunjung diproses melalui pipeline 5 tingkat, di mana permintaan baru diteruskan ke model AI jika tidak dapat diselesaikan oleh tingkatan sebelumnya:

Arsitektur Pipeline Permintaan 5 Tingkat

Pengunjung mengajukan pertanyaan
        │
        â–¼
Tingkat -1 — Rate Limiter       → batas permintaan terlampaui? → blokir, HTTP 429
        │ (lolos)
        â–¼
Tingkat 0 — Safety Guardrail    → kata terlarang terdeteksi? → blokir lokal, 0 token
        │ (lolos)
        â–¼
Tingkat 1 — Match FAQ Lokal     → cocok dengan FAQ? → jawaban instan, 0 token
        │ (tidak cocok)
        â–¼
Tingkat 2 — Contact Resolver    → pertanyaan kontak/support? → info kontak lokal, 0 token
        │ (tidak cocok)
        â–¼
Tingkat 3 — RAG Retrieval       → cari vector store SQLite, ambil potongan relevan
        │
        â–¼
Tingkat 4 — AI Completion       → kirim pertanyaan + potongan ke Gemini / Groq / OpenAI / Ollama
        │
        â–¼
Telemetry Logger                → catat penggunaan token, biaya, dan tingkat yang merespons

Empat dari lima tingkatan di atas tidak menggunakan API AI sama sekali. Pada prosesor Celeron, hal ini sangat menghemat sumber daya sistem.


Mengapa Membangun Engine RAG Sendiri Dibandingkan Menggunakan TNTSearch Default Grav?

Pertanyaan yang sering muncul adalah: Mengapa membuat engine RAG sendiri padahal Grav sudah memiliki plugin pencarian TNTSearch?

Meskipun TNTSearch sangat baik untuk pencarian kata kunci situs, ada tiga alasan teknis mengapa RAG kustom diperlukan untuk LLM:

  1. Potongan Berbasis Header vs Halaman Utuh (Chunker.php):
    TNTSearch mengindeks seluruh halaman sebagai satu dokumen utuh. Mengirimkan halaman 2.000 kata untuk menjawab pertanyaan singkat akan membuang banyak token prompt. Engine RAG kustom membagi halaman menjadi potongan 150–300 kata berdasarkan header # H1, ## H2, dan ### H3.
  2. Pencarian Vektor Semantik vs Kata Kunci (VectorStore.php):
    TNTSearch menggunakan pencarian kata kunci BM25. Jika pengunjung bertanya "Kapan kantor buka?" tetapi halaman menggunakan judul "Jam Operasional", pencarian kata kunci biasa bisa luput. Engine RAG kustom mendukung embedding vektor (Ollama nomic-embed-text, Gemini text-embedding-004, OpenAI, dan TF-IDF lokal) dengan cosine similarity.
  3. Anchor Link Langsung ke Bagian Halaman:
    TNTSearch hanya memberikan URL halaman utama. Engine RAG kustom melampirkan anchor header (contoh: /docs/install#prerequisites) sehingga AI dapat memberikan tautan referensi yang presisi.

Manajemen Indeks Konten Auto-Sync

Engine RAG menjaga kebaruan indeks melalui alur berikut:

Halaman Grav (dipublikasi) → bersihkan HTML/CSS → bagi per header → cek hash SHA-256 → simpan ke SQLite
  1. Chunking Berbasis Header (Chunker.php): Membagi halaman berdasarkan header Markdown dan memberikan tag rute serta anchor link.
  2. Hash Caching Incremental (Indexer.php): Memeriksa hash SHA-256 tiap bagian sebelum melakukan re-embedding. Bagian yang tidak berubah akan dilewati.
  3. Penyimpanan Vektor SQLite (VectorStore.php): Potongan teks, metadata, dan vektor disimpan dalam satu file rag_index.sqlite dengan waktu pencarian di bawah 1 milidetik.

Plugin ini secara otomatis memperbarui indeks saat ada perubahan halaman melalui event onPageSaved dan onPageDeleted, serta mendukung scheduled job (ai-chatbot-rag-reindex) via scheduler bawaan Grav.


Telemetry dan Analisis

Setiap interaksi dicatat ke user/data/ai-chatbot/interactions.json untuk merekam penggunaan token, biaya, serta tingkatan yang memberikan jawaban. Dashboard admin menampilkan grafik distribusi pertanyaan serta merekomendasikan calon entri FAQ baru berdasarkan pertanyaan yang sering mencapai tingkat AI.


Cara Instalasi di Grav CMS

Plugin ini bersifat open source dan tersedia di GitHub:

👉 github.com/milkboyinchina/grav-ai-chatbot

Persyaratan

  • Situs Grav CMS yang berjalan.
  • Ollama lokal (jika menggunakan model lokal) atau API Key (Gemini, Groq, OpenAI, OpenRouter).

Langkah Instalasi

cd /var/www/html/grav/user/plugins
git clone https://github.com/milkboyinchina/grav-ai-chatbot.git ai-chatbot

Membuat Indeks Awal

cd /var/www/html/grav
php bin/plugin ai-chatbot index-rag --rebuild

Analisis Efisiensi Prompt: RAG vs Tanpa RAG

Metrik Tanpa RAG (Kirim Seluruh Situs) Dengan RAG (Potongan Relevan) Efisiensi
Strategi Konteks Menggabungkan seluruh halaman 2–3 potongan relevan via SQLite 82% lebih kecil
Ukuran Prompt per Query 204+ token (terus bertambah) 36 token (stabil) Hemat 168 token per query
Waktu Pencarian Lokal 0.006 ms 0.312 ms Di bawah 1 milidetik
Kualitas Jawaban Berpotensi mengalami halusinasi Terangkar pada sumber data Lebih akurat
Biaya API Estimasi (10.000 Query) $0.31 $0.05 82% lebih hemat

Kesimpulan

Penggunaan struktur flat-file Grav, SQLite vector store, dan pipeline filter berlapis memungkinkan hardware terbatas seperti Celeron N4100 menyajikan layanan AI Chatbot secara responsif, efisien, dan hemat daya.

Silakan unduh dan coba pada situs Grav Anda:

🔗 GitHub: github.com/milkboyinchina/grav-ai-chatbot


Previous Post Next Post