SSD Nodes Learn Hosting plans →
Panduan Matt ConnorOleh Matt Connor

Bot AI Telegram yang menjawab dalam bahasa Melayu

Bahasa Melayu bot Telegram anda datang dari arahan sistem dan model, bukan dari perisian bot. Cara menahan jawapan daripada hanyut ke bahasa Indonesia atau Inggeris.

Bot AI Telegram bahasa Melayu: bahasanya datang dari arahan, bukan dari perisian

Bot AI Telegram yang menjawab dalam bahasa Melayu bukan perisian yang berlainan daripada bot bahasa Inggeris. Ia perisian yang sama dengan dua perkara ditukar: arahan sistem yang anda hantar pada setiap permintaan, dan model yang menjawab arahan itu. Kalau bot anda membalas dalam bahasa Inggeris, atau tergelincir ke bahasa Indonesia di tengah jawapan, menukar pustaka bot tidak membetulkan apa-apa.

Halaman ini bukan panduan pemasangan. Untuk mendirikan botnya dahulu, ikut cara memasang IVA sebagai pembantu AI Telegram pada VPS anda, atau Rakazo jika anda mahu bot yang lebih ringkas. Balik ke sini apabila bot itu sudah membalas sesuatu, walaupun dalam bahasa yang salah. Selebihnya di bawah ialah tempat bahasa Melayu itu benar-benar diputuskan, dan cara anda mengujinya sendiri.

Apa yang perisian bot sebenarnya buat

Aliran satu mesej adalah begini. Telegram menyimpan mesej pengguna. Proses anda memanggil getUpdates, atau menerima webhook, dan mendapat teks itu. Proses anda menghantar teks itu kepada model bersama arahan sistem. Model memulangkan teks. Proses anda memanggil sendMessage untuk menghantar teks itu balik kepada pengguna.

Perisian bot memegang langkah pertama, kedua dan terakhir. Tiada satu pun daripadanya menyentuh bahasa. Itulah sebabnya menukar python-telegram-bot kepada pustaka lain, atau menukar polling kepada webhook, tidak mengubah satu perkataan dalam balasan. Bahasa diputuskan pada arahan sistem dan pada model, dan tidak di tempat lain.

Kenapa model hanyut ke bahasa Indonesia atau balik ke Inggeris

Inilah bahagian yang pembaca Malaysia rasa serta-merta dan orang luar tidak nampak. Kebanyakan model melihat teks bahasa Indonesia jauh lebih banyak daripada teks bahasa Melayu Malaysia semasa dilatih, kerana itulah nisbah teks yang ada di internet. Anda tidak boleh melihat data latihan itu, tetapi anda boleh melihat akibatnya dalam satu balasan.

Cari perkataan ini dalam jawapan bot anda: bisa, kamu, nggak, banget, aja, silakan. Satu pun sudah bermakna model itu membalas dalam daftar Indonesia, bukan Melayu. Arahan seperti "jawab dalam bahasa Melayu" selalu tidak cukup, kerana bagi model itu bahasa Indonesia sudah cukup dekat untuk dianggap betul.

Masalah kedua ialah balik ke Inggeris di tengah jalan. Ayat pertama dan kedua sedap dibaca, kemudian perenggan ketiga tiba-tiba penuh Inggeris. Ini paling kerap berlaku pada jawapan panjang dan pada suhu sampel yang tinggi, kerana suhu tinggi membenarkan token yang kurang berkemungkinan dipilih, dan token itulah yang selalu datang dari bahasa lain. Turunkan temperature ke sekitar 0.3 dan jalankan ujian anda semula. Kesan penuh temperature dan parameter sampling lain diterangkan berasingan, tetapi untuk kerja bahasa, rendah lebih stabil.

Masalah ketiga lebih halus: model mencipta terjemahan istilah teknikal yang anda sendiri tidak pernah guna. Kalau balasan menyebut proksi songsang dan bukan reverse proxy, jawapan itu betul secara tatabahasa tetapi tidak berguna kepada pentadbir sistem Malaysia yang sedang membaca dokumentasi Inggeris.

Putuskan daftar bahasa anda sebelum menulis arahan

Jangan berharap. Putuskan dua perkara dahulu, kemudian tulis kedua-duanya ke dalam arahan sistem.

Keputusan pertama ialah daftar. Bahasa Melayu standard, jenis yang anda baca dalam surat rasmi, atau bahasa harian yang campur dan lebih dekat dengan cara orang bercakap dalam kumpulan WhatsApp. Kedua-duanya sah. Yang tidak sah ialah bot yang bertukar antara keduanya setiap tiga mesej, kerana pengguna akan rasa bot itu tidak tahu siapa dia.

Keputusan kedua ialah istilah teknikal. Bagi bot sokongan pelayan, biarkan server, firewall, port, reverse proxy, container dan token kekal dalam bahasa Inggeris, sebab itulah nama yang pengguna akan taip ke dalam carian dan lihat dalam log. Bagi bot untuk orang awam, terjemahan mungkin lebih baik. Pilih satu, dan senaraikan istilah itu satu-satu.

Arahan sistem yang menahan bahasa

Ini arahan untuk bahasa Melayu standard dengan istilah teknikal dikekalkan. Simpan sebagai fail teks, bukan di dalam kod, supaya anda boleh menukarnya tanpa menyentuh bot.

Anda pembantu teknikal yang menjawab HANYA dalam Bahasa Melayu standard Malaysia.
Gunakan boleh, anda, tidak, sila. Jangan guna kata Indonesia: bisa, kamu, nggak, banget, aja, silakan.
Kekalkan istilah teknikal dalam bahasa Inggeris dan jangan terjemah: server, firewall, port, reverse proxy, container, token, backup.
Jika pengguna menulis dalam bahasa Inggeris, jawab dalam Bahasa Melayu juga.
Jawapan pendek: maksimum 5 ayat, kecuali pengguna minta langkah demi langkah.
Jika anda tidak pasti, kata tidak pasti. Jangan cipta nama fail atau arahan yang anda tidak tahu.

Ini versi harian untuk bot yang lebih santai. Perhatikan bahawa larangan kata Indonesia kekal, kerana bahasa harian Malaysia dan bahasa Indonesia bukan perkara yang sama.

Anda kawan yang tolong hal teknikal dalam Bahasa Melayu harian Malaysia.
Boleh campur istilah Inggeris macam server, restart, port, sebab itu cara orang cakap.
Jangan guna kata Indonesia: bisa, kamu, nggak, banget, aja.
Jangan formal sangat, jangan guna ayat surat rasmi.
Satu balasan, jangan lebih 4 ayat.

Sebab menyenaraikan perkataan yang dilarang berkesan ialah kerana ia memberi model sesuatu yang konkrit untuk dielak, bukan satu label bahasa yang kabur. Sama ada ia cukup berkesan untuk model pilihan anda, itu soalan ujian, bukan soalan pendapat.

Set ujian: enam prompt yang sama untuk setiap calon

Simpan enam fail teks dalam satu folder bernama ujian/. Setiap calon model mendapat enam prompt yang sama, dalam susunan yang sama. Tanpa set tetap begini, anda akan menukar model dan prompt serentak, kemudian tidak tahu yang mana membantu.

  1. Salam dan soalan mudah: Assalamualaikum, boleh terangkan apa itu VPS dalam tiga ayat?
  2. Soalan teknikal dengan istilah Inggeris: Macam mana nak buka port 443 pada firewall VPS Ubuntu?
  3. Manglish dan rojak: eh bro, server i slow gila since semalam, apa patut i check dulu?
  4. Istilah yang tidak patut diterjemah: Apa beza reverse proxy dengan load balancer?
  5. Jawapan panjang: Senaraikan 6 langkah untuk backup pangkalan data MySQL pada VPS, satu langkah satu ayat.
  6. Nombor dan mata wang: Kalau pelan VPS RM49 sebulan, berapa jumlahnya setahun dan berapa sebulan dalam USD?

Prompt keempat menangkap terjemahan yang dicipta. Prompt kelima menangkap hanyut, kerana bahasa biasanya runtuh pada langkah keempat atau kelima, bukan pada ayat pertama. Prompt ketiga menangkap model yang tidak faham rojak dan menjawab dengan Inggeris penuh sebagai jalan selamat.

Untuk menjalankan set itu terhadap model tempatan, satu gelung sudah cukup. Arahan disatukan di hadapan prompt, jadi ini bukan sama dengan mesej sistem yang betul, tetapi cukup untuk membuang calon yang jelas lemah sebelum anda memasangnya ke dalam bot.

MODEL=hf.co/aisingapore/Apertus-SEA-LION-v4-8B-IT-GGUF:Q4_K_M
ollama pull "$MODEL"
for f in ujian/*.txt; do
  printf '\n=== %s\n' "$f"
  ollama run "$MODEL" "$(cat arahan-bm.txt "$f")"
done

Keputusan akhir mesti dibuat melalui bot itu sendiri, kerana di situ arahan dihantar sebagai mesej system yang betul. Gunakan gelung ini untuk menapis, bukan untuk memilih.

Cara menilai balasan tanpa skor

Anda yang menilai. Baca setiap balasan dan tanya perkara ini.

  • Adakah daftar yang anda pilih kekal sampai ayat terakhir, bukan hanya ayat pertama?
  • Ada perkataan Indonesia di dalamnya: bisa, kamu, nggak, banget, aja, silakan?
  • Adakah ia bertukar ke Inggeris selepas perenggan pertama?
  • Adakah ia menterjemah istilah teknikal yang anda sendiri tidak pernah sebut dalam bahasa Melayu?
  • Adakah nombor, tarikh dan mata wang ditulis cara Malaysia, contohnya RM49 dan 30 September 2026?
  • Adakah jawapannya betul, dan bukan sekadar bahasa Melayu cantik yang salah fakta?

Halaman ini tidak memberi anda senarai model terbaik untuk bahasa Melayu, dan tidak memberi skor. Tiada sesiapa di sini yang mengukurnya untuk kes penggunaan anda, dan papan pendahulu awam mengukur tugasan lain dengan prompt lain. Enam prompt anda sendiri, dibaca oleh mata anda sendiri, lebih bernilai daripada mana-mana angka yang anda petik dari internet.

Backend mana: API terhosting atau model terbuka pada VPS anda

Dua pilihan, dan pertukarannya jujur. API terhosting seperti Claude tidak memakan RAM VPS anda, dan kualiti bahasa Melayunya lebih baik daripada model kecil kerana modelnya jauh lebih besar. Harganya dibayar per token, dan setiap mesej pengguna keluar dari pelayan anda ke pihak ketiga. Untuk bot kumpulan keluarga itu mungkin tidak penting. Untuk bot yang mengendalikan aduan pelanggan, itu keputusan privasi yang perlu anda sedari. Sebagai rujukan, Claude Haiku 4.5 berharga USD 1 bagi sejuta token input dan USD 5 bagi sejuta token output pada September 2026, jadi bot peribadi biasanya beberapa sen sehari. Untuk kunci API dan struktur projek, lihat cara membina aplikasi pertama dengan Claude API pada VPS.

Pilihan kedua ialah model terbuka pada VPS anda sendiri melalui Ollama. Mesej tidak keluar dari kotak, kosnya tetap setiap bulan, dan anda boleh menghadkan bot itu sepenuhnya. Bayarannya ialah RAM dan bahasa. Model 8B memegang lebih sedikit bahasa Melayu daripada model 27B, dan jauh lebih sedikit daripada model terhosting, jadi jangkakan lebih banyak hanyut dan jawapan lebih pendek. Pemasangan Ollama dan tetapan asasnya ada dalam panduan menjalankan Ollama pada VPS anda sendiri, dan jika anda masih menimbang dua-dua, perbandingan Ollama Cloud dengan pelayan sendiri membelah kos itu.

Berapa besar model itu pada cakera dan dalam RAM

Saiz menentukan pelan VPS mana yang boleh menjalankannya, jadi periksa ini sebelum jatuh cinta dengan satu model. Angka di bawah ialah saiz muat turun terbitan rasmi bagi kuantisasi 4-bit, seperti tertulis pada kad model dan pustaka Ollama pada September 2026, bukan ukuran kami sendiri.

ChartSaiz muat turun kuantisasi 4-bit, angka terbitan rasmi (September 2026)
The data behind this chart
[
  {
    "label": "qwen3:8b (pustaka Ollama)",
    "params_b": 8,
    "saiz_gb": 5.2
  },
  {
    "label": "Apertus-SEA-LION-v4-8B-IT",
    "params_b": 8,
    "saiz_gb": 5.06
  },
  {
    "label": "Gemma-SEA-LION-v4-27B-IT",
    "params_b": 27,
    "saiz_gb": 16.5
  }
]

Tiga calon itu, dan fail 4-bit bagi Apertus-SEA-LION 8B ialah 5.06 GB. Itu bermakna anda perlukan lebih daripada 5.06 GB RAM yang benar-benar lapang, kerana berat model dimuatkan ke dalam memori dan konteks memakan lagi di atasnya. Model 27B pada 16.5 GB memerlukan pelan yang jauh lebih besar, dan itulah sebab paling biasa orang berhenti pada 8B. Kad model bagi dua SEA-LION itu menyenaraikan bahasa Melayu antara bahasa yang disokong, dan itu satu titik permulaan yang lebih baik daripada model umum, tetapi tetap jalankan enam prompt anda terhadapnya.

Jalankan ollama ps selepas mesej pertama untuk melihat berapa banyak memori yang model itu benar-benar pegang. Jika VPS mula menggunakan swap, balasan akan mengambil masa berpuluh saat dan bot akan nampak rosak walaupun tiada ralat dicatat.

Kod bot: satu handler, dua backend

Pasang dalam persekitaran maya supaya kemas kini sistem tidak memecahkan bot.

sudo apt update && sudo apt install -y python3-venv
sudo install -d -o $USER /opt/bot-bm
python3 -m venv /opt/bot-bm/venv
/opt/bot-bm/venv/bin/pip install python-telegram-bot==22.8 anthropic ollama

Versi API terhosting. Arahan dibaca dari fail, dan dihantar semula pada setiap permintaan.

import os
from anthropic import AsyncAnthropic
from telegram import Update
from telegram.ext import ApplicationBuilder, MessageHandler, filters, ContextTypes

ARAHAN = open('/etc/telegram-bm-bot/arahan-bm.txt', encoding='utf-8').read()
claude = AsyncAnthropic()

async def jawab(update: Update, context: ContextTypes.DEFAULT_TYPE):
    resp = await claude.messages.create(
        model='claude-haiku-4-5',
        max_tokens=800,
        system=ARAHAN,
        messages=[{'role': 'user', 'content': update.message.text}],
    )
    await update.message.reply_text(resp.content[0].text)

app = ApplicationBuilder().token(os.environ['TELEGRAM_TOKEN']).build()
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, jawab))
app.run_polling()

Versi Ollama menukar satu fungsi sahaja. Arahan menjadi mesej system yang betul, bukan teks yang disatukan di hadapan soalan.

from ollama import AsyncClient

MODEL = 'hf.co/aisingapore/Apertus-SEA-LION-v4-8B-IT-GGUF:Q4_K_M'
ollama = AsyncClient(host='http://127.0.0.1:11434')

async def jawab(update, context):
    resp = await ollama.chat(
        model=MODEL,
        messages=[{'role': 'system', 'content': ARAHAN},
                  {'role': 'user', 'content': update.message.text}],
        options={'temperature': 0.3, 'num_predict': 400},
    )
    await update.message.reply_text(resp['message']['content'])

Gunakan klien async pada kedua-dua backend. Panggilan menyekat di dalam handler async akan membeku seluruh bot sementara satu pengguna menunggu, jadi pengguna kedua tidak dapat balasan sampai yang pertama selesai. num_predict menghadkan panjang balasan, yang juga mengurangkan hanyut bahasa kerana teks panjang lebih banyak peluang untuk tergelincir. Apa yang num_predict sebenarnya hadkan diterangkan penuh di tempat lain.

Satu pepijat yang sangat biasa: menghantar arahan sistem sekali sahaja pada mesej pertama. Panggilan model tiada memori antara permintaan, jadi mesej kedua tiba tanpa arahan dan model kembali kepada tabiat asalnya. Gejalanya khas, iaitu mesej pertama sempurna dalam bahasa Melayu dan mesej kedua separuh Inggeris. Hantar system pada setiap permintaan.

Token BotFather dan proses yang perlu hidup selepas reboot

Di sinilah VPS masuk ke dalam cerita ini. Bot Telegram memerlukan satu proses yang sentiasa hidup untuk polling, dan laptop yang ditutup bermakna bot yang mati.

Dalam Telegram, buka BotFather, hantar /newbot, beri nama paparan, kemudian nama pengguna yang mesti berakhir dengan bot. BotFather memulangkan token. Token itu ialah bot anda: sesiapa yang memegangnya boleh membalas sebagai bot anda, jadi jangan sekali-kali memasukkannya ke dalam git. Jika ia terlepas, hantar /revoke kepada BotFather dan token lama mati serta-merta. Untuk bot dalam kumpulan, /setprivacy menentukan sama ada bot melihat semua mesej kumpulan atau hanya mesej yang menyebutnya.

sudo install -d -m 700 /etc/telegram-bm-bot
sudoedit /etc/telegram-bm-bot/env
sudo chmod 600 /etc/telegram-bm-bot/env
TELEGRAM_TOKEN=123456789:AAEx_contoh_token_anda
ANTHROPIC_API_KEY=sk-ant-contoh

Fail itu dimiliki root dengan mod 600, dan systemd membacanya sebagai root sebelum menurunkan keistimewaan kepada pengguna perkhidmatan, jadi bot tetap boleh berjalan tanpa token itu dibaca oleh sesiapa yang lain pada kotak itu.

[Unit]
Description=Bot Telegram Bahasa Melayu
After=network-online.target
Wants=network-online.target

[Service]
User=botbm
WorkingDirectory=/opt/bot-bm
EnvironmentFile=/etc/telegram-bm-bot/env
ExecStart=/opt/bot-bm/venv/bin/python /opt/bot-bm/bot.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now bot-bm
sudo systemctl status bot-bm --no-pager

status sepatutnya membaca active (running). enable ialah separuh yang penting: tanpanya, bot tidak kembali selepas reboot kernel, dan anda hanya akan tahu apabila seseorang mengadu bot itu senyap seminggu. Restart=always dengan RestartSec=5 menghidupkannya semula selepas ralat rangkaian sementara. Hantar satu mesej kepada bot anda sekarang, dan baca journalctl -u bot-bm -n 50 jika tiada balasan.

Masalah biasa dan mesej yang anda akan lihat

Proses mati sebaik dimulakan dengan telegram.error.InvalidToken. Token salah, atau EnvironmentFile tidak dibaca. Periksa nama pemboleh ubah dalam fail itu sama dengan nama dalam kod.

Bot membalas dua kali, atau log penuh ralat konflik. Telegram membenarkan satu pembaca getUpdates untuk satu token sahaja, dan yang kedua mendapat Conflict: terminated by other getUpdates request; make sure that only one bot instance is running. Biasanya ini bot yang anda jalankan dengan tangan untuk menguji dan lupa hentikan, sementara unit systemd masih berjalan.

Balasan mengambil masa lebih 30 saat, kemudian gagal. Pada model tempatan, ini VPS yang tidak cukup RAM dan mula bertukar ke swap, atau tamat masa klien. Cara membetulkan ralat context deadline exceeded pada Ollama menerangkan tetapan yang perlu dilonggarkan dan bila masalahnya sebenarnya saiz model.

Bahasa betul, jawapan salah. Model kecil boleh menulis bahasa Melayu yang lancar sambil mencipta nama fail dan flag yang tidak wujud. Inilah sebabnya arahan sistem di atas menyuruhnya mengaku tidak pasti, dan sebabnya bot sokongan teknikal perlu diuji pada soalan yang anda sudah tahu jawapannya.

Pengguna menulis Inggeris, bot ikut Inggeris. Itu tingkah laku lalai model. Kalau anda mahu bot sentiasa menjawab dalam bahasa Melayu, satu baris dalam arahan menetapkannya, dan itu perlu diuji dengan prompt ketiga dalam set ujian anda.

FAQ

Kenapa bot Telegram saya menjawab dengan perkataan seperti bisa dan kamu?

Itu bahasa Indonesia, bukan bahasa Melayu Malaysia, dan ia muncul kerana model melihat teks bahasa Indonesia jauh lebih banyak daripada teks bahasa Melayu semasa dilatih. Arahan umum seperti jawab dalam bahasa Melayu selalu tidak cukup untuk menahannya. Senaraikan perkataan yang dilarang secara terang dalam arahan sistem, iaitu bisa, kamu, nggak, banget, aja dan silakan, kemudian turunkan temperature ke sekitar 0.3 dan jalankan semula set ujian anda untuk melihat sama ada ia hilang.

Model mana yang terbaik untuk bahasa Melayu?

Tiada jawapan yang boleh dipetik dengan jujur, kerana ia bergantung pada daftar yang anda mahu dan soalan yang pengguna anda tanya. Buat enam fail prompt, termasuk satu Manglish dan satu dengan istilah teknikal, jalankan yang sama terhadap setiap calon, dan baca balasan sendiri. Kad model yang menyenaraikan bahasa Melayu antara bahasa yang disokong ialah titik permulaan yang lebih baik daripada model umum, tetapi ia bukan bukti.

Bolehkah model 8B pada VPS menjawab dalam bahasa Melayu dengan baik?

Boleh, untuk soalan pendek dan topik yang sempit, dengan arahan sistem yang tegas dan num_predict yang rendah. Fail 4-bit bagi model 8B adalah sekitar 5 GB, jadi VPS anda perlu lebih daripada itu dalam RAM lapang. Jangkakan lebih banyak hanyut bahasa pada jawapan panjang berbanding API terhosting, kerana model yang lebih kecil memegang lebih sedikit bahasa Melayu.

Perlukah VPS, atau boleh saya jalankan bot ini pada laptop?

Bot Telegram yang guna polling memerlukan satu proses yang hidup berterusan, dan hanya satu proses untuk satu token. Laptop yang ditutup atau tidur bermakna bot yang tidak membalas, dan menghidupkannya semula sementara yang lama masih berjalan memberi ralat Conflict: terminated by other getUpdates request. VPS memberi anda proses yang hidup selepas reboot melalui systemctl enable, alamat IP yang tetap, dan log dalam journalctl apabila bot itu senyap.