Sahabat AI: Panduan Developer LLM Indonesia dan Biaya Token

Foto oleh Unknown author via Wikimedia Commons (Public domain)
Sahabat AI adalah kumpulan large language model yang di-pretrain dan di-instruct-tune untuk Indonesia, diinisiasi bersama oleh PT GoTo Gojek Tokopedia dan Indosat Ooredoo Hutchison serta dikembangkan bersama AI Singapore. Ada lima repository di Hugging Face yang mencakup tiga ukuran: model v1 berukuran 8 dan 9 miliar parameter, serta v2 berukuran 70 miliar parameter. Ada juga layanan chat publik di sahabat-ai.com dan di dalam aplikasi GoPay.
Tidak, dan model card-nya menyatakan itu secara langsung: setiap model mempertahankan tokenizer bawaan base model-nya, bukan vocabulary baru untuk bahasa Indonesia. Pada sampel 15.000 karakter yang sama, tokenizer Llama 3.1 yang diwarisi model 70B menghabiskan 2,34 token per kata bahasa Indonesia berbanding 1,41 untuk bahasa Inggris, sementara o200k_base milik OpenAI menghabiskan 1,90. Continued pre-training mengubah apa yang model tahu tentang Indonesia, bukan berapa biaya kalimat Anda.
Model ini memang dilatih dengan keduanya, tetapi cakupannya lebih tipis daripada kesan dari daftar bahasanya. Model card 8B mencatat bahasa Jawa 3 persen dari campuran continued pre-training 50 miliar token dan bahasa Sunda 1,5 persen, berasal dari 0,40 dan 0,20 miliar token unik yang diulang 3,8 kali. Model 70B menambahkan Batak Toba dan Bali. Uji dulu pada traffic bahasa daerah Anda sendiri sebelum menjanjikan apa pun.
Model card 70B menyebut sekitar 140 GB VRAM untuk inference FP16 atau BF16, dengan rekomendasi dua NVIDIA H100 atau empat L40s. Model 9B jauh lebih terjangkau, sekitar 18 GB dengan aritmetika dua byte per parameter yang sama, tetapi context length-nya 8.192 token. GPU self-hosted berbiaya sama entah melayani satu request atau satu juta.
Bangun eval yang spesifik untuk tugas Anda, jangan percaya pada leaderboard. Ambil sekitar 200 prompt nyata dari log Anda sendiri, jalankan kedua kandidat, nilai jawabannya secara blind bersama penutur asli, dan catat token serta latency di baris yang sama dengan skor kualitas. Model lokal menang ketika data residency menjadi kewajiban, ketika input-nya bahasa daerah, atau ketika volume stabil membuat GPU tetap sibuk.

Foto oleh Unknown author via Wikimedia Commons (Public domain)
Ringkasan Utama
Sahabat AI adalah large language model Indonesia yang diinisiasi bersama oleh GoTo dan Indosat, dirilis di Hugging Face dalam ukuran 8, 9 dan 70 miliar parameter. Model card-nya menyatakan tokenizer diwarisi dari base model, jadi bahasa Indonesia tidak menjadi lebih murah. Pilih karena data residency dan bahasa daerah, dan putuskan lewat eval dari traffic Anda sendiri.
Chatbot di situs ini menjawab dalam bahasa Inggris dan bahasa Indonesia, dan jawaban berbahasa Indonesia menghabiskan lebih banyak token. Bukan karena lebih panjang, tetapi karena satu kata bahasa Indonesia bernilai lebih banyak token daripada kata bahasa Inggris pada tokenizer apa pun yang kebetulan dipakai model itu. Saya mengira model yang dilatih di Indonesia akan memperbaiki hal ini. Setelah membaca model card-nya, ternyata tidak.
Tulisan ini adalah hasil ketika saya benar-benar memeriksanya: apa itu Sahabat AI, apa yang tertulis dan justru tidak tertulis di model card-nya, berapa biaya per kata bahasa Indonesia pada empat tokenizer ketika dijalankan atas teks yang sama, dan bagaimana saya memilih antara model lokal dan frontier API untuk produk Indonesia. Setiap angka di bawah ini dikutip dari model card atau saya ukur sendiri, dan script pengukurannya disertakan supaya Anda bisa membantahnya.
Sahabat AI adalah kumpulan large language model yang di-pretrain dan di-instruct-tune untuk Indonesia, diinisiasi bersama oleh PT GoTo Gojek Tokopedia dan Indosat Ooredoo Hutchison serta dikembangkan bersama AI Singapore. Ini bukan satu model. Ada lima repository di Hugging Face yang mencakup tiga ukuran: v2 dengan 70 miliar parameter di atas Llama 3.1 70B Instruct, dan dua model v1 berukuran 8 dan 9 miliar parameter di atas Llama 3 8B serta Gemma 2 9B, masing-masing dalam varian base dan instruct. Ada juga layanan chat publik di sahabat-ai.com dan di dalam aplikasi GoPay.
| Model | Base model | Context length | Lisensi |
|---|---|---|---|
| Llama-Sahabat-AI-v2-70B-IT | Llama 3.1 70B Instruct | 128k token | Llama 3.1 Community License |
| gemma2-9b-cpt-sahabatai-v1-instruct | Gemma 2 9B | 8.192 token | Gemma Community License |
| llama3-8b-cpt-sahabatai-v1-instruct | Llama 3 8B | 8.192 token | Llama 3 Community License |
Ketiga ukuran itu berbeda dalam hal yang lebih penting daripada jumlah parameter. Model 70B mencantumkan enam bahasa yang didukung, menambahkan Batak Toba dan Bali di atas Inggris, Indonesia, Jawa dan Sunda; dua model kecilnya mencantumkan empat. Context length-nya 8.192 token pada kedua model v1 dan 128k pada yang 70B. Dan semuanya dirilis dengan community license milik base model masing-masing, yang bukan hal yang sama dengan lisensi open source, apa pun sebutan ekosistem di sekitarnya.
Satu kalimat di model card mengubah cara saya memandang hal ini, dan kalimat itu muncul di ketiganya dengan kata-kata yang hampir sama: model memakai tokenizer bawaan dari base model-nya. Model 70B mempertahankan tokenizer Llama 3.1. Model 9B mempertahankan milik Gemma 2. Model 8B mempertahankan milik Llama 3. Tidak ada vocabulary baru yang dilatih khusus untuk bahasa Indonesia.
Keputusan itu masuk akal secara teknis. Mengganti tokenizer berarti membangun ulang embedding layer dan membuang sebagian besar pengetahuan yang sudah dimiliki base model, sebuah proyek yang jauh lebih besar daripada continued pre-training. Tetapi konsekuensinya sering diabaikan orang. Continued pre-training mengubah apa yang model tahu tentang Indonesia; ia tidak mengubah berapa token yang dihabiskan kalimat bahasa Indonesia Anda. Kalau Anda berharap model lokal memangkas sisi token dari tagihan Anda, model card-nya sudah memberi tahu bahwa itu tidak akan terjadi.
Jadi saya mengukurnya. Script di bawah ini menarik artikel Wikipedia tentang Indonesia dalam bentuk plain text untuk bahasa Inggris, Indonesia, Jawa dan Sunda lewat MediaWiki API, memotong masing-masing pada 15.000 karakter pertama, lalu menghitung token dengan empat tokenizer: o200k_base dan cl100k_base milik OpenAI lewat tiktoken, ditambah file tokenizer.json milik Llama 3.1 dan Gemma 2 yang dimuat dengan library tokenizers dari Hugging Face. Karena Sahabat AI mempertahankan tokenizer base model tanpa perubahan, mengukur Llama 3.1 sama dengan mengukur model 70B.
# tokens_per_word.py -- what one Indonesian word actually costs.
# Corpus: first 15,000 characters of the plain-text Wikipedia article
# "Indonesia" in en / id / jv / su, fetched from the MediaWiki API:
# https://id.wikipedia.org/w/api.php?action=query&prop=extracts
# &explaintext=1&format=json&titles=Indonesia&redirects=1
import re
import tiktoken
from tokenizers import Tokenizer
# Sahabat-AI ships NO tokenizer of its own. Every model card says it keeps
# the base model's, so loading Llama 3.1 here IS loading the 70B's.
llama = Tokenizer.from_file("llama31-tokenizer.json") # unsloth/Meta-Llama-3.1-8B-Instruct
gemma = Tokenizer.from_file("gemma2-tokenizer.json") # unsloth/gemma-2-9b-it
encoders = {
"o200k_base": tiktoken.get_encoding("o200k_base").encode,
"cl100k_base": tiktoken.get_encoding("cl100k_base").encode,
"llama3.1": lambda s: llama.encode(s, add_special_tokens=False).ids,
"gemma2": lambda s: gemma.encode(s, add_special_tokens=False).ids,
}
for lang in ("en", "id", "jv", "su"):
text = open(f"full-{lang}.txt", encoding="utf-8").read()[:15000]
words = len(re.findall(r"[A-Za-z\u00c0-\u00ff'-]+", text))
for name, encode in encoders.items():
n = len(encode(text))
# chars/token is the sanity check: it needs no word count at all,
# so it survives the fact that these are not parallel translations.
print(f"{lang} {name} {n / words:.2f} tok/word {len(text) / n:.2f} chars/tok")Hasilnya bukan yang saya duga. Tokenizer Llama 3.1, yang diwarisi oleh model 70B unggulannya, justru paling mahal di antara keempatnya untuk bahasa Indonesia: 2,34 token per kata berbanding 1,41 untuk bahasa Inggris, penalti 66 persen. o200k_base milik OpenAI mengerjakan hal yang sama dengan 1,90, penalti 37 persen. Dan Gemma 2 paling murah di angka 1,79, yang berarti Sahabat AI 9 miliar parameter men-tokenisasi bahasa Indonesia lebih murah daripada yang 70 miliar.
| Tokenizer | Inggris | Indonesia | Jawa | Sunda |
|---|---|---|---|---|
| o200k_base (keluarga GPT-4o) | 1,38 | 1,90 | 2,24 | 2,23 |
| cl100k_base (GPT-4) | 1,41 | 2,36 | 2,72 | 2,82 |
| Llama 3.1 (Sahabat AI 70B) | 1,41 | 2,34 | 2,68 | 2,80 |
| Gemma 2 (Sahabat AI 9B) | 1,43 | 1,79 | 2,37 | 2,41 |
Ukuran vocabulary menjelaskan sebagian besar urutannya. Gemma 2 membawa 256.000 entri, o200k_base 200.019, Llama 3.1 128.256 dan cl100k_base 100.277, dan peringkat untuk bahasa Indonesia mengikuti urutan itu hampir persis. Ada dua catatan yang akan saya minta kalau saya jadi pembacanya. Artikel Wikipedia dalam empat bahasa bukan terjemahan satu sama lain, jadi token per kata membandingkan prosa ensiklopedis masing-masing bahasa, bukan corpus paralel yang ketat; karakter per token, yang sama sekali tidak bergantung pada jumlah kata, memberi peringkat yang sama untuk keempat tokenizer itu. Dan prosa ensiklopedis bukan traffic chat. Jalankan script-nya pada log Anda sendiri sebelum menyusun anggaran dari angka ini.
Tidak satu pun hal di atas menjadi alasan memilih model yang dilatih secara lokal. Kalau tagihan token satu-satunya kekhawatiran Anda, tabel tadi sudah menyuruh Anda memakai frontier API dan berhenti membaca. Alasan mempertimbangkan Sahabat AI adalah semua yang tidak bisa dilihat oleh hitungan token, dan ada empat yang layak disebut.
Sahabat AI juga tidak otomatis lebih baik pada keempatnya. Model card 9B menggambarkan instruction tuning-nya sebagai beragam instruksi sintetis ditambah instruksi publik yang dikurasi manual bersama penutur asli, sekitar 448.000 pasangan bahasa Indonesia, 96.000 bahasa Jawa dan 98.000 bahasa Sunda. Instruksi sintetis berbahasa Indonesia mewarisi register apa pun yang dipakai generator-nya, dan itu persis kegagalan pada poin pertama. Satu-satunya cara memastikan adalah menguji register yang benar-benar Anda terima.

Model card memublikasikan hasil benchmark, dan benchmark-nya pekerjaan serius. IndoMMLU berisi soal ujian sekolah Indonesia untuk humaniora, bahasa Indonesia, bahasa dan budaya daerah, ilmu sosial serta STEM pada jenjang SD, SMP dan SMA. SEA-HELM mencakup question answering, sentiment, toxicity, terjemahan dua arah, summarization, causal reasoning dan natural language inference. Keduanya bukan produk Anda. Salah satu benchmark instruction-following pada model card 70B, SEA-MTBench, dinilai oleh gpt-4-1106-preview terhadap baseline gpt-3.5-turbo-0125, dan itu pengingat berguna bahwa posisi di leaderboard adalah pernyataan tentang satu juri pada satu kumpulan tugas di satu titik waktu.
// eval/run.ts -- 200 prompts lifted from real traffic, deduplicated.
// This is the only benchmark that ever settled the argument for me.
import cases from "./cases.id.json"; // id, prompt, expectedIntent, lang
const CANDIDATES = [
{ id: "frontier", ask: askFrontierApi },
{ id: "sahabat-70b", ask: askSelfHosted }, // vLLM on our own GPUs
];
for (const model of CANDIDATES) {
for (const c of cases) {
const started = Date.now();
const out = await model.ask(c.prompt);
rows.push({
caseId: c.id,
lang: c.lang, // "id", "jv", or "id-en" for code-switched
latencyMs: Date.now() - started,
// Tokens, not requests. An Indonesian prompt costs ~1.7x an English
// one per word, so a per-request average hides where the money went.
promptTokens: out.usage.prompt_tokens,
completionTokens: out.usage.completion_tokens,
answer: out.text,
// NOT model.id -- the grading sheet must not know who answered.
candidate: hash(model.id),
});
}
}Dua ratus kasus sudah cukup untuk melihat perbedaan nyata dan cukup kecil untuk digrading dua orang dalam satu sore. Lakukan grading secara blind, dengan nama model dihapus sebelum lembarnya sampai ke penilai, dan catat token serta latency di baris yang sama dengan skor kualitas. Model yang menang di kualitas tetapi kalah di biaya adalah keputusan yang harus Anda ambil, bukan hasil yang tinggal dibaca.
Catat prompt token, bukan hanya jumlah request. Bahasa Indonesia memakan sekitar 1,7 kali bahasa Inggris per kata pada tokenizer Llama 3.1 dalam pengukuran saya, jadi rata-rata biaya per request akan terlihat sehat sampai tagihannya datang. Memecah pengeluaran berdasarkan bahasa input yang terdeteksi hanya perlu satu sore, dan itu instrumentasi pertama yang akan saya tambahkan pada produk dwibahasa mana pun.
Model card 70B sangat terus terang soal kebutuhan menjalankannya: sekitar 140 GB VRAM pada FP16 atau BF16, dengan rekomendasi dua NVIDIA H100 atau empat L40s. Itu lantai biaya yang Anda bayar entah ada yang chat atau tidak. Model 9B adalah yang paling layak dicoba lebih dulu oleh sebagian besar produk Indonesia, sekitar 18 GB dengan aritmetika dua byte per parameter yang sama, tetapi context 8.192 token-nya menutup pintu untuk apa pun yang menjejalkan dokumen panjang ke dalam prompt.
# The 70B card puts FP16/BF16 at ~140 GB of VRAM and recommends
# 2x NVIDIA H100 or 4x NVIDIA L40s. That is the floor, before any traffic.
vllm serve Sahabat-AI/Llama-Sahabat-AI-v2-70B-IT \
--tensor-parallel-size 2 \
--dtype bfloat16 \
--max-model-len 32768
# Start here instead. Nine billion parameters at two bytes each is ~18 GB,
# and its Gemma 2 tokenizer was the cheapest of the four on Indonesian.
# The catch is the context: 8192 tokens, covering prompt AND completion.
vllm serve GoToCompany/gemma2-9b-cpt-sahabatai-v1-instruct \
--dtype bfloat16 \
--max-model-len 8192Itulah bentuk trade-off yang jujur. API menagih per token dan tidak menagih saat idle; model self-hosted menagih GPU dan tidak menagih per token. Mana yang lebih murah sepenuhnya bergantung pada seberapa sibuk Anda membuatnya, dan itu pertanyaan tentang traffic Anda, bukan tentang modelnya. Yang pasti dibeli oleh self-hosting adalah lokasi. GoTo dan Indosat menyatakan layanan chat Sahabat AI berjalan di GPU Merdeka, sovereign AI cloud milik Indosat, dan bahwa data serta infrastruktur GPU yang melayani model tetap berada di wilayah Indonesia atau di server milik pengguna sendiri. Untuk beban kerja Indonesia yang teregulasi, kalimat itu bisa mengalahkan semua angka di tulisan ini.
Baca lisensinya sebelum menyusun rencana produk di atas weights-nya. Ketiga model dirilis dengan community license milik base model masing-masing, yaitu Llama 3.1, Llama 3 dan Gemma, dan community license bukan lisensi open source yang disetujui OSI, apa pun sebutan ekosistem di sekitarnya. Periksa sendiri ketentuan acceptable use dan penamaannya, jangan berasumsi bebas seperti Apache.

Untuk produk Indonesia yang saya kerjakan sekarang, saya memakai frontier API sebagai default dan menyiapkan jalur open weights sebagai cadangan, bukan sebaliknya. Alasannya spesifik dan tidak satu pun berbunyi bahwa model frontier lebih pintar. Traffic saya cukup naik-turun sehingga GPU khusus akan menganggur sepanjang hari, o200k_base men-tokenisasi bahasa Indonesia lebih murah daripada tokenizer Llama 3.1 yang diwarisi model 70B, dan tidak ada orang di tim kecil yang mau dibangunkan jam dua pagi demi satu inference node.
Saya akan membalik pilihan itu pada empat kondisi, dan satu saja sudah cukup. Data residency menjadi kewajiban, bukan preferensi. Input-nya bahasa Jawa, Sunda, Batak Toba atau Bali, di mana model frontier tidak punya alasan komersial untuk mahir dan Sahabat AI setidaknya pernah dilatih dengan sebagian datanya. Volume cukup stabil untuk membuat GPU benar-benar sibuk. Atau eval-nya berkata demikian, dan hanya kondisi terakhir ini yang sungguh menyelesaikan pertanyaannya, karena tiga yang lain hanyalah input untuknya.
Pertanyaan yang berguna tidak pernah soal apakah model lokal mengalahkan model frontier. Pertanyaannya adalah mana yang lebih baik pada tugas persis yang Anda kirim ke produksi, dalam register yang benar-benar ditulis pengguna Anda, dengan biaya yang sudah Anda ukur alih-alih Anda kira-kira. Model card Sahabat AI luar biasa jujur soal apa dirinya dan apa yang dibutuhkannya: tokenizer-nya diwarisi, data bahasa daerahnya tipis, dan yang 70B butuh 140 GB VRAM. Bacalah, lalu bangun eval dua ratus kasus itu. Kerjanya satu hari, dan itu mengakhiri perdebatan yang kalau tidak begitu akan berjalan selamanya.
Sumber