Membangun Sistem Chatbot RAG dengan PHP dan Ollama Local LLM

Awalnya, saya ingin mengetahui bagaimana membuat aplikasi chatbot yang dapat menjawab pertanyaan seputar layanan internal perusahaan. Dari situ saya mulai mencari berbagai referensi dan menemukan bahwa chatbot semacam ini dapat dibangun menggunakan Large Language Model (LLM) seperti GPT, Gemini, atau bahkan menggunakan LLM yang dijalankan secara lokal dan bersifat gratis.

Selain itu, ada konsep penting lain yang perlu dipahami, yaitu RAG (Retrieval Augmented Generation). Secara sederhana, RAG adalah pendekatan untuk menambahkan (augment) informasi yang kita miliki ke dalam model LLM yang sudah ada, sehingga model dapat memberikan jawaban yang lebih relevan berdasarkan data atau pengetahuan yang kita sediakan. Atau istilahnya, tidak memberikan jawaban yang bersifat halusinasi.

Dengan RAG, LLM akan mengambil (retrieval) informasi internal kita terlebih dahulu, lalu menggunakannya untuk menghasilkan jawaban (generation). Informasi internal tersebut berfungsi sebagai “tambahan konteks” (augmented) bagi model.

Untuk contoh impelementasinya, kita akan gunakan beberapa bahasa, platform, dan network, yaitu:

  • PHP, bahasa backend/server, nantinya untuk membuat RESTFUL API
  • Ollama. Merupakan software yang digunakan untuk menjalankan model AI (LLM) secara lokal di komputer tanpa perlu menggunakan API dari layanan cloud.
  • NeuronAI, framework lengkap berbasis PHP, untuk membangun aplikasi dan agen AI.

Sedangkan untuk file model / LLM lokalnya, saya menggunakan meta-llama-3.1-8b-instruct-q4_k_m.gguf. Model ini cukup baik untuk chatbot, karena sudah di-finetune untuk mengikuti instruksi manusia. Ukurannya yang sebesar 8 miliar parameter, butuh RAM kira-kira 8-16 GB, dengan ukuran file 4,9 GB.

Struktur

demo/
├── store/
│ ├── docs/
│ │ ├── company-culture.md
│ │ ├── company-overview.md
│ │ ├── services-portfolio.md
│ │ ├── technical-expertise.md
│ │ ├── …
│ ├── demo.meta.json
│ ├── demo.store
├── src/
│ ├── Commands/
│ │ ├── ChatBot.php
│ ├── Classes/
│ │ ├── PopulateVectorStore.php
└── index.php

Langkah-langkah:

Instal aplikasi Ollama di komputer. Kalau sudah selesai install, coba buka di web browser alamat http://localhost:11434. Jika muncul seperti gambar berikut, berarti Ollama sudah berjalan.

Siapkan satu folder/direktori proyek. Buka terminal cmd di lokasi proyek. ketik perintah berikut

ollama run hf.co/bartowski/Meta-Llama-3.1-8B-Instruct-GGUF:Q4_K_M

Perintah tersebut untuk mengunduh file meta-llama-3.1-8b-instruct-q4_k_m.gguf dari tautan https://huggingface.co/bartowski/Meta-Llama-3.1-8B-Instruct-GGUF. Letakkan di folder proyek kita.

Buat file bernama DokumenToVektor.php

<?php

require __DIR__ . '/vendor/autoload.php';
require __DIR__ . '/MyChatBot.php';

// use MyChatBot;
use NeuronAI\RAG\DataLoader\FileDataLoader;

MyChatBot::make()->addDocuments(
    // Use the file data loader component to load a text file into the vector store
    FileDataLoader::for(__DIR__ . '/dokumensumber.md')->getDocuments()
);

Buat file dokumensumber.md

##
Apabila seorang pegawai terlambat di atas 80 menit, maka yang bersangkutan diberikan potongan gaji 10 persen
##
Pegawai yang mengajukan cuti harus menyampaikan kepada atasannya dua hari sebelum cuti

Kemudian jalankan file DokumenToVektor.php tadi dengan skrip

php DokumenToVektor.php

Tunggu sampai proses selesai, dan file vektor terisi, dengan hasil baru seperti berikut:

Buat file bernama MyChatBot.php

<?php
require __DIR__ . '/vendor/autoload.php';

use NeuronAI\Providers\AIProviderInterface;
use NeuronAI\RAG\Embeddings\EmbeddingsProviderInterface;
use NeuronAI\RAG\RAG;
use NeuronAI\RAG\VectorStore\FileVectorStore;
use NeuronAI\RAG\VectorStore\VectorStoreInterface;
use NeuronAI\Providers\Ollama\Ollama;
use NeuronAI\RAG\Embeddings\OllamaEmbeddingsProvider;
use NeuronAI\Chat\Messages\UserMessage;

class MyChatBot extends RAG
{
    protected function provider(): AIProviderInterface
    {
        return new Ollama(
            url: 'http://localhost:11434/api',
            model: 'llama-local',
        );
    }

    protected function embeddings(): EmbeddingsProviderInterface
    {
        return new OllamaEmbeddingsProvider(
            url: 'http://localhost:11434/api',
            model: 'llama-local',
        );
    }

    protected function vectorStore(): VectorStoreInterface
    {
        return new FileVectorStore(
            directory: __DIR__,
            name: 'vektor'
        );
    }
}

// ===== INPUT DARI TERMINAL =====
echo "Masukkan pertanyaan: ";
$pertanyaan = trim(fgets(STDIN));

// ===== KIRIM KE CHATBOT =====
$response = MyChatBot::make()->chat(
    new UserMessage($pertanyaan)
)->getMessage();

echo "\nJawaban:\n";
echo $response->getContent() . "\n";

Leave a Reply

Your email address will not be published. Required fields are marked *