- Saat membantu pengembangan aplikasi AI yang menangani data e-commerce, ditemukan masalah bahwa Retrieval-augmented generation (RAG) bekerja dengan baik untuk sebagian query tetapi tidak untuk query lainnya
- Saat menyelesaikan masalah seperti ini, penting untuk meninjau data masukan (teks sumber yang telah diindeks, query pengguna yang digunakan untuk pencarian)
- Khususnya, tampak perlu dilakukan optimasi dari sisi chunking dan tokenisasi
[Tokenization]
- Tokenisasi adalah proses memecah teks menjadi bagian-bagian kecil yang disebut token oleh tokenizer
- Token-token ini dipetakan ke token ID, yaitu nilai integer yang secara unik mengidentifikasi token dalam kosakata tokenizer
- Kosakata tokenizer adalah himpunan semua token yang mungkin digunakan saat melatih tokenizer
- Masalah dapat muncul jika token dalam teks tidak ada di kosakata tokenizer milik LLM
- Sebagian besar LLM memiliki kosakata besar berukuran 30k~300k
- Sebagian besar LLM yang banyak digunakan mengandalkan subword tokenizer (BPE, Wordpiece, dan sebagainya)
- Jenis-jenis tokenizer
- word: memisah berdasarkan spasi, tanda baca, dan sebagainya
- character: memisah menjadi karakter individual (kadang termasuk tanda baca)
- subword: memisah token menjadi subkata yang tampak tidak bermakna
- sebagian besar LLM menggunakan subword tokenizer
- BPE (Byte-Pair Encoder): library
tiktoken milik OpenAI
- Wordpiece: Cohere, MiniLM-L6-v2, dan sebagainya
Perbandingan MiniLM-L6-v2 dan tiktoken
- Ukuran kosakata tokenizer model MiniLM-L6-v2 adalah 30522, jauh lebih kecil daripada tiktoken (200019)
- Jika kalimat "tokenizer tokenizes text into tokens" ditokenisasi
- MiniLM-L6-v2: [CLS] token ##izer token ##izes text into token ##s [SEP]
- tiktoken: token, izer, token, izes, text, into, tokens
- Library
tiktoken milik OpenAI mengimplementasikan tokenizer BPE dan digunakan pada model LLM ChatGPT
- Kosakata MiniLM-L6-v2 juga mencakup huruf Jerman dan huruf Jepang
Tokenisasi emoji, typo, dan kata khusus domain
- MiniLM-L6-v2 mentokenisasi emoji sebagai token [UNK]
tiktoken dilatih dengan sebagian token karakter Unicode, tetapi ini tetap bisa menjadi masalah untuk RAG
- Nama produk khusus domain seperti "Gucci Savoy Leathertrimmed Printed Coatedcanvas Suitcase" juga tidak ditokenisasi dengan baik
- Untuk kalimat dengan typo ("I hve received wrong pckage")
- MiniLM-L6-v2: i, h, ##ve, received, wrong, pc, ##ka, ##ge
- tiktoken: I, h, ve, received, wrong, p, ck, age
[Embeddings]
- Tokenizer sendiri tidak terlalu berguna. Ia terutama dikembangkan untuk melakukan analisis numerik kompleks berdasarkan frekuensi token individual
- Untuk mempertahankan makna kontekstual teks, dibutuhkan cara yang dapat menangkap hubungan antar token
- Embedding adalah vektor yang merepresentasikan token dan mampu menangkap makna serta hubungan antarkata dalam teks dengan baik
- Embedding adalah produk sampingan dari pelatihan transformer dan benar-benar dipelajari dari kumpulan teks yang telah ditokenisasi
- Saat meminta pembuatan teks, yang diberikan ke LLM sebagai input justru adalah embedding
- LLM terdiri dari dua komponen utama, yaitu encoder dan decoder
- Baik encoder maupun decoder menerima embedding sebagai input
- Keluaran encoder juga berupa embedding, yang diteruskan ke cross-attention head pada decoder dan berperan penting dalam pembuatan (prediksi) token pada keluaran decoder
- Dalam pipeline RAG, teks terlebih dahulu ditokenisasi, lalu di-embedding, kemudian dimasukkan ke transformer
- Token ID berperan sebagai indeks dalam kosakata tokenizer dan juga digunakan untuk mengambil embedding dari matriks embedding
- Embedding yang diambil dirakit menjadi tensor lalu diberikan sebagai input ke transformer
- Alur encoder: tokenisasi teks -> ambil embedding tiap token -> rakit tensor embedding -> masukkan ke input transformer -> encoding -> teruskan keluaran encoder ke cross-attention decoder -> hasilkan keluaran decoder
Contoh embedding
- "You can break it 😞" dan "You can not break it 😊" memiliki sentimen yang berlawanan, tetapi pada MiniLM-L6-v2 jarak embedding-nya sangat dekat
- OpenAI menunjukkan performa yang lebih baik karena kosakata tokennya menangani emoji dengan baik
- Untuk typo juga, OpenAI menanganinya dengan lebih baik
- Namun bahkan di OpenAI, jika spasi ditambahkan di akhir kalimat, jarak antar embedding bisa melebar lebih jauh dari yang diperkirakan
- Pengembang juga mengalami kesulitan saat menangani format tanggal. Ekspresi waktu relatif ("dikirim kemarin") khususnya bisa menjadi masalah yang lebih besar
- Perbedaan cara penulisan mata uang (£40, $50, 40£, 50¢, dll.) juga dapat menimbulkan masalah yang aneh
- Untuk data khusus domain seperti kasus tas Gucci, biasanya diselesaikan dengan fine-tuning, tetapi data dan metrik evaluasi tetap harus selalu diperiksa
Kesimpulan
- Tulisan ini membantu memahami lebih baik bagaimana tokenizer dapat memengaruhi aplikasi RAG dan mengapa kita perlu memperhatikan tokenizer
- Dalam aplikasi agent, garbage-in garbage-out tidak akan selalu menghasilkan performa sesuai harapan
- Sedikit merapikan teks input pun bisa sangat membantu
- Menstandarkan format tanggal secara konsisten
- Menghapus spasi di akhir sebisa mungkin (karena sudah terlihat dampaknya terhadap embedding)
- Terapkan hal yang sama pada data numerik lain seperti harga dalam mata uang yang berbeda
- Semoga suatu hari kita tidak perlu lagi memikirkan tokenizer sama sekali. Semoga bisa benar-benar ditinggalkan
- Jika itu terjadi, kita tidak perlu lagi menangani typo, karakter spasi acak, serangan adversarial berbasis perplexity kata, dan sebagainya. Satu jenis kesedihan bisa lenyap dalam semalam
- Sampai saat itu, lakukan tokenisasi dengan bertanggung jawab
Opini GN⁺
- Tulisan ini dengan baik menunjukkan bagaimana tokenizer dan embedding dapat memengaruhi performa aplikasi AI berbasis RAG. Secara khusus, tulisan ini menjelaskan hal-hal yang perlu diperhatikan saat menangani emoji, typo, dan istilah khusus domain dengan contoh nyata, sehingga tampaknya akan sangat membantu para pengembang
- Namun, karena MiniLM-L6-v2 dan
tiktoken dari OpenAI yang diperkenalkan di sini sama-sama merupakan model yang dioptimalkan untuk bahasa Inggris, mungkin ada pertimbangan tambahan saat menangani bahasa lain seperti bahasa Korea. Untuk bahasa Korea, tokenisasi berbasis analisis morfem banyak digunakan, sehingga tampaknya perlu juga meninjau kelebihan, kekurangan, dan keterbatasannya
- Selain itu, meskipun tulisan ini berfokus pada peran tokenizer dan embedding dalam pipeline RAG, di lingkungan produksi nyata masih ada jauh lebih banyak hal yang perlu dipertimbangkan, seperti prapemrosesan data, tuning hyperparameter, dan peringanan model. Karena itu, isi tulisan ini sebaiknya dijadikan titik awal, sementara dalam proses pengembangan nyata penting untuk menemukan metode terbaik melalui berbagai eksperimen dan evaluasi
- Di sisi lain, ada juga pendapat bahwa pentingnya tokenizer semakin berkurang sejak kemunculan model bahasa besar seperti GPT-4. Alasannya, model-model ini bekerja pada tingkat kalimat atau paragraf, bukan pada tingkat token, sehingga pengaruh kualitas token individual terhadap performa bisa menjadi relatif lebih kecil. Namun, karena penelitian tentang hal ini masih belum memadai, tampaknya sulit untuk menyimpulkannya secara pasti
- Terakhir, seperti yang disebutkan dalam tulisan ini, sekadar membersihkan dan menstandarkan data input terlebih dahulu pun dapat sangat meningkatkan performa model. Saat mengembangkan layanan nyata, sangat penting untuk membangun pipeline prapemrosesan data yang tangguh dengan mempertimbangkan keragaman dan noise pada input pengguna. Selain itu, tampaknya juga perlu mengalokasikan sumber daya yang cukup untuk pelabelan dan anotasi data agar dapat memperoleh data pelatihan berkualitas tinggi
1 komentar
Komentar Hacker News
Tokenizer tidak dianggap sebagai bagian yang "seksi" dari LLM, tetapi ada juga yang melihatnya sebagai peluang. Makalah seperti xVal mengusulkan strategi spesialisasi tokenisasi. Pekerjaan terkait ejaan dan karakter adalah masalah lain yang bisa mendapat manfaat dari inovasi tokenisasi
Kita harus memahami data agar bisa melakukan pekerjaan yang bermakna. Alasan utama banyak orang menggunakan alat pemrosesan data otomatis adalah karena mereka tidak ingin melihat datanya secara langsung. Mereka berharap komputer bisa melihat data dan meminta pengumpulan informasi tambahan
Saya sangat menghargai bagian tentang salah ketik di postingan blog itu. Saya sedang membantu aplikasi mirip RAG dalam sebuah proyek, dan khawatir tentang dampak salah ketik kecil atau perbedaan format dalam kueri pengguna terhadap perhitungan jarak embedding
Saya pernah bekerja pada aplikasi yang menggunakan Elasticsearch untuk menangani kemiripan antara input 1-2 kalimat dan dokumen sepanjang paragraf atau lebih dengan kueri teks tingkat lanjut. Menarik melihat seberapa besar strategi tokenisasi bisa memengaruhi kueri tertentu
Saya merasa artikel itu kurang membahas solusi untuk tiap masalah. Saya mengusulkan agar pemeriksaan ejaan dijalankan sebelum tokenisasi, atau agar kata yang salah eja dan kata kandidat perbaikannya ditokenisasi berdampingan
Banyak pengembang terbiasa membangun di ruang tradisional (deterministik), tetapi gagal mengubah cara berpikir mereka tentang masalah di ruang statistik. Aplikasi LLM pada akhirnya berada di ruang statistik
Kebanyakan orang yang mengimplementasikan RAG memikirkan embedding, bukan tokenisasi
Saya tidak bisa mereproduksi beberapa angka dalam postingan blog itu. Misalnya, hasil perhitungan cosine similarity antara dua kalimat dari kode yang menggunakan SentenceTransformer berbeda dari yang diharapkan
Dalam beberapa implementasi RAG, saya melihat masalah asumsi bahwa dokumen target akan menjadi kunci pencarian yang baik untuk kueri yang masuk. Dalam proyek terbaru, relevansi pencarian meningkat drastis dengan memisahkan kunci pencarian dari nilai yang dikembalikan (dokumen yang di-chunk) dan menggunakan LM untuk menghasilkan lalu meng-embedding kunci yang sesuai
Banyak kosakata LLM besar memang cukup besar, tetapi bahasa Inggris saja memiliki lebih dari 1 juta kata. 30k-300k token terlihat kecil