Generative AI/LLM-এর ভিত্তি/Lesson 01
Token — LLM যেভাবে লেখা পড়ে
LLM অক্ষর বা শব্দ পড়ে না, পড়ে token। Character, word আর subword (BPE) tokenization নিজে হাতে বানাও। আর দেখো বাংলা কেন ইংরেজির চেয়ে বেশি token খরচ করে।
- সময়
- 24 মিনিট
- Exercise
- 1
- Challenge
- 1
- Quiz
- 3 প্রশ্ন
সহজ ভাষায়
তুমি পড়ো অক্ষর আর শব্দ। LLM পড়ে token — লেখার টুকরো, প্রতিটার একটা সংখ্যা (id)। Model-এর কাছে "আমি AI শিখি" আসলে কয়েকটা সংখ্যার list:
"I love learning AI" ──tokenizer──► ["I", " love", " learning", " AI"] ──► [40, 3021, 6975, 15592]
(id-গুলো উদাহরণ — প্রতিটা tokenizer-এর নিজস্ব।) Model এই সংখ্যা নেয়, পরের token-এর সংখ্যা দেয়, আর tokenizer সেটা আবার লেখায় ফেরায়।
কেন দরকার?
- খরচ: LLM API-র দাম token প্রতি
- সীমা: Context window (model একবারে কতটা পড়তে পারে) token-এ মাপা
- অদ্ভুত আচরণ: "strawberry-তে কয়টা r?" — model প্রায়ই ভুল করত, কারণ সে অক্ষর দেখেই না, দেখে token
তিন রকম tokenization
| ধরন | সুবিধা | সমস্যা |
|---|---|---|
| Character | Vocabulary ছোট, কোনো শব্দ অচেনা না | Sequence খুব লম্বা |
| Word | Sequence ছোট | Vocabulary বিশাল; নতুন শব্দ (typo, নাম) চেনে না |
| Subword | দুটোর মাঝামাঝি | — এটাই আধুনিক LLM-এর পছন্দ |
BPE: subword কীভাবে শেখা হয়
Byte Pair Encoding শুরু করে একক অক্ষর দিয়ে, তারপর বারবার: সবচেয়ে বেশিবার পাশাপাশি আসা জোড়াকে একটা নতুন token বানাও।
l o w l o w e r ("l","o") সবচেয়ে বেশি → merge
lo w lo w e r ("lo","w") → merge
low low e r ...
হাজার হাজার বার merge করলে সাধারণ শব্দ ("the", " learning") একটা token হয়ে যায়, আর বিরল শব্দ টুকরো থাকে। Challenge-এ এই merge নিজে বানাবে।
বাংলা আর token
"শেখা" দেখতে দুই অক্ষর, কিন্তু Python গোনে ৪টা code point (শ, ে, খ, া), আর UTF-8-এ ১২ byte। আধুনিক tokenizer (byte-level BPE) byte থেকে শুরু করে। তাই যে ভাষার text training data-য় কম ছিল, তার জন্য merge কম শেখা হয়, আর একই কথা লিখতে token বেশি লাগে। ফলাফল: বাংলায় একই প্রশ্ন সাধারণত বেশি দামি, আর context window দ্রুত ভরে। নতুন model-গুলোতে এই ব্যবধান কমছে, কিন্তু প্রোডাক্ট বানানোর সময় বাংলা text-এর token আসলে মেপে দেখো।
Exercise
Exercise
Encode আর decode
একটা ছোট word-level tokenizer:
build_vocab(text)— text-কে space দিয়ে ভাগ করো। প্রতিটা আলাদা শব্দকে একটা id দাও, প্রথম দেখার ক্রমে, 0 থেকে শুরু। Return: dict{শব্দ: id}।encode(text, vocab)— শব্দগুলোর id-এর listdecode(ids, vocab)— id থেকে আবার text, শব্দের মাঝে একটা space
Quiz
Challenge
Challenge
BPE-এর একটা merge
Byte Pair Encoding (BPE) একটা ধাপ বারবার চালায়: সবচেয়ে বেশিবার পাশাপাশি আসা token-জোড়া খুঁজে সেটাকে একটা নতুন token বানায়।
most_frequent_pair(tokens)— পাশাপাশি জোড়াগুলোর মধ্যে সবচেয়ে বেশিবার যেটা আসে, সেটা tuple হিসেবে। সমান হলে যেটা আগে প্রথমবার এসেছে।merge(tokens, pair)— list-এ যেখানেই ওই জোড়া পাশাপাশি, দুটোকে জুড়ে একটা string বানাও (বাঁ থেকে ডানে, overlap ছাড়া)। নতুন list return করো।
উদাহরণ: ["l","o","w","l","o","w","e","r"] → জোড়া ("l","o") → ["lo","w","lo","w","e","r"]
বাস্তবে কোথায় ব্যবহার হয়?
Anthropic API-তে message পাঠানোর আগেই token গোনা যায় — খরচ আর context-এর সীমা আগে থেকে দেখতে:
import anthropic
client = anthropic.Anthropic() # ANTHROPIC_API_KEY environment variable থেকে
count = client.messages.count_tokens(
model="claude-opus-5-5",
messages=[{"role": "user", "content": "বাংলায় machine learning ব্যাখ্যা করো"}],
)
print(count.input_tokens)
(এই code তোমার computer-এ চালাবে — pip install anthropic আর একটা API key লাগবে। Playground-এ internet বন্ধ।)
Interview প্রশ্ন
- Beginner: Token কী? LLM কেন শব্দের বদলে token ব্যবহার করে?
- Intermediate: BPE কীভাবে কাজ করে?
- Advanced: Tokenization কীভাবে বহুভাষিক model-এর খরচ আর মানে প্রভাব ফেলে? "strawberry-তে কয়টা r" ধরনের ভুল কেন হয়?
এরপর কী?
Token এখন একটা সংখ্যা (id)। কিন্তু 4021 আর 4022 পাশাপাশি সংখ্যা বলেই কি অর্থেও কাছাকাছি? না। Model-কে অর্থ বোঝাতে প্রতিটা token-কে একটা vector বানাতে হয়। পরের lesson: Embeddings।