Asisten
Ikhtisar
Layanan Asisten menggerakkan chatbot cerdas yang menangani pertanyaan pengunjung di seluruh platform Sutomo. Layanan ini memproses pertanyaan bahasa alami dalam berbagai bahasa, mencocokkannya dengan intensi yang diketahui, dan mengembalikan jawaban yang relevan.
Sistem menggunakan pipeline pencocokan hybrid: klasifikasi ML (Rubix ML) → pencocokan database eksak → skoring kemiripan fuzzy. Ini memastikan kecepatan dan akurasi sambil terus belajar dari interaksi pengguna nyata.
Mengapa Ini Ada
- Menyediakan layanan swadaya instan untuk pertanyaan umum pengunjung (jam sekolah, pendaftaran, biaya, dll.)
- Mendukung pertanyaan multi-bahasa (Indonesia, Inggris, dan lainnya melalui Google Translate)
- Terus meningkat melalui pengumpulan data pelatihan otomatis
- Mengurangi beban kerja admin dengan menangani pertanyaan berulang
Arsitektur
Method
Chatbot (Orkestrator)
| Method | Deskripsi |
|---|---|
| handleUserMessage(dialog, message) | Titik masuk utama — menerjemahkan, menormalisasi, mencocokkan intensi, mengembalikan balasan |
| getOrCreateDialog(fingerprint, user) | Mendapatkan atau membuat sesi dialog |
| ensureGreeting(dialog, greeting) | Menyisipkan pesan sapaan jika dialog kosong |
| resetDialog(dialog) | Menghapus semua pesan dalam dialog |
| getDefaultLanguage() | Membaca bahasa bawaan asisten dari pengaturan |
| isLlmEnabled() | Memeriksa apakah fitur LLM diaktifkan |
DialogManager
| Method | Deskripsi |
|---|---|
| getOrCreateFingerprint() | Mendapatkan atau menghasilkan sidik jari pengunjung persisten |
| getOrCreateDialog(fingerprint, user) | Menemukan dialog yang ada atau membuat yang baru |
| getMessages(dialog) | Mendapatkan semua pesan dalam format chat |
| ensureGreeting(dialog, greeting) | Menambahkan sapaan jika interaksi pertama |
| resetDialog(dialog) | Menghapus semua pesan dan mengatur ulang status |
Normalizer
| Method | Deskripsi |
|---|---|
| normalizeQuestion(question) | Statis — huruf kecil, hapus tanda baca, gabung spasi |
| tokenize(text, language) | Memisahkan, stemming, menghapus stopword, menormalisasi sinonim |
| stemToken(token, language) | Penghapusan imbuhan Bahasa Indonesia |
| isStopword(token, language) | Memeriksa terhadap daftar stopword ID/EN |
| normalizeSynonym(token, language) | Memetakan sinonim ke bentuk kanonikal |
MlClassifier (Rubix ML)
| Method | Deskripsi |
|---|---|
| train() | Melatih Softmax Classifier pada pertanyaan + log pelatihan terkonfirmasi |
| predict(normalizedQuestion) | Memprediksi intensi dengan skor keyakinan |
| isTrained() | Memeriksa apakah file model ada |
| getTrainingSampleCount() | Menghitung jumlah sampel pelatihan yang tersedia |
SimilarityScorer
| Method | Deskripsi |
|---|---|
| scoreSimilarity(a, b, language) | Skor komposit menggabungkan Jaccard, Overlap, Levenshtein, dan Trigram Cosine |
| jaccardSimilarity(a, b) | Irisan himpunan token dibagi gabungan |
| overlapSimilarity(a, b) | Dua kali irisan dibagi ukuran total himpunan |
| levenshteinSimilarity(a, b) | Jarak edit tingkat karakter |
| trigramCosineSimilarity(a, b) | Kemiripan cosine N-gram (3 karakter) |
Translator
| Method | Deskripsi |
|---|---|
| translateIntoDefaultLanguage(message, defaultLang) | Mendeteksi bahasa sumber dan menerjemahkan ke bahasa bawaan |
| translateFromDefaultLanguage(text, defaultLang, targetLang) | Menerjemahkan balasan kembali ke bahasa pengguna |
| looksEnglish(text) | Pemeriksaan heuristik apakah teks berbahasa Inggris |
| guessSourceLanguageFromScript(text) | Mendeteksi aksara CJK, Arab, Sirilik |
| simpleDictionaryTranslateEnToId(text) | Terjemahan EN→ID berbasis kamus cadangan |
Pipeline Pencocokan
Cara Menggunakan
php
use App\Services\Assistant\Chatbot;
$fingerprint = $chatbot->getOrCreateFingerprint();
$dialog = $chatbot->getOrCreateDialog($fingerprint, $request->user());
$chatbot->ensureGreeting($dialog, 'Hello!');
[$reply, $intentCode, $matchInfo] = $chatbot->handleUserMessage($dialog, $request->input('message'));Pelatihan
php
$classifier = app(MlClassifier::class);
$classifier->train();Berkas Penting
app/Services/Assistant/Chatbot.php
app/Services/Assistant/DialogManager.php
app/Services/Assistant/Normalizer.php
app/Services/Assistant/MlClassifier.php
app/Services/Assistant/SimilarityScorer.php
app/Services/Assistant/Translator.php
app/Models/Assistant/BotDialog/BotDialog.php
app/Models/Assistant/BotDialogMessage/BotDialogMessage.php
app/Models/Assistant/ChatbotIntent/ChatbotIntent.php
app/Models/Assistant/ChatbotQuestion/ChatbotQuestion.php
app/Models/Assistant/ChatbotAnswer/ChatbotAnswer.php
app/Models/Assistant/TrainingLog/TrainingLog.php