Tokens, लिपियां और भारतीय टेक्स्ट की लागत
ज्यादातर अंग्रेज़ी पर ट्रेन किए गए Tokenizers अक्सर भारतीय भाषाओं के टेक्स्ट को ज़्यादा टुकड़ों में तोड़ते हैं। इसका मतलब है ज़्यादा लागत और context window में कम जगह। इसे खुद नापकर देखें।
60 सेकंड में
Tokens, लिपियां और भारतीय टेक्स्ट की लागत
ज्यादातर अंग्रेज़ी पर ट्रेन किए गए Tokenizers अक्सर भारतीय भाषाओं के टेक्स्ट को ज़्यादा टुकड़ों में तोड़ते हैं। इसका मतलब है ज़्यादा लागत और context window में कम जगह। इसे खुद…
एक ही वाक्य को गिनने के तीन तरीके
| इकाई (Unit) | यह क्या गिनता है | यह क्यों मायने रखता है |
|---|---|---|
| अक्षर (code points) | यूनिकोड कोड पॉइंट्स, यानी वे संख्याएं जो कंप्यूटर हर अक्षर या चिह्न के लिए स्टोर करता है | भारतीय लिपि में एक दिखने वाला अक्षर अक्सर एक से ज़्यादा कोड पॉइंट होता है |
| UTF-8 बाइट्स | टेक्स्ट को स्टोर करने या भेजने के लिए इस्तेमाल किए जाने वाले बाइट्स | बुनियादी लैटिन अक्षरों में 1 बाइट लगता है। देवनागरी, बंगाली, तमिल या तेलुगु जैसी लिपियों के अक्षरों में 3 बाइट्स लगते हैं। उर्दू के लिए इस्तेमाल होने वाली अरबी लिपि के अक्षरों में 2 बाइट्स लगते हैं। |
| Tokens | वे टुकड़े जिन्हें मॉडल पढ़ता है, जो tokenizer पर निर्भर करते हैं | आप प्रति token भुगतान करते हैं, और context window को tokens में नापा जाता है |
इसे Python में देखें
import unicodedata
samples = {
"English": "Where is the railway station?",
"Hindi": "रेलवे स्टेशन कहाँ है?",
}
for name, text in samples.items():
chars = len(text) # Unicode code points
utf8 = len(text.encode("utf-8")) # bytes on disk / on the wire
print(f"{name:8} chars={chars:3} utf8_bytes={utf8:3} bytes_per_char={utf8 / chars:.2f}")
# Look inside one Hindi syllable: one visible unit can be several code points
for ch in "स्टे":
print(f"U+{ord(ch):04X} {len(ch.encode('utf-8'))} bytes {unicodedata.name(ch)}")ज़्यादा tokens से क्या नुकसान होता है
- ज़्यादा लागत। होस्ट किए गए मॉडल आमतौर पर प्रति token चार्ज करते हैं। एक ही बात के लिए ज़्यादा tokens का मतलब है उस भाषा के उपयोगकर्ताओं के लिए ज़्यादा बिल।
- कम संदर्भ (Context)। Context window को tokens में गिना जाता है। अगर किसी दस्तावेज़ को ज़्यादा tokens की ज़रूरत है, तो उसका कम हिस्सा ही इसमें समा पाता है, इसलिए मॉडल कम "याद" रख पाता है।
- धीमे जवाब। मॉडल एक बार में एक token आउटपुट देते हैं, इसलिए ज़्यादा आउटपुट tokens में ज़्यादा समय लगता है।
- खराब सीख। जब शब्दों को बिना मतलब के टुकड़ों में काट दिया जाता है, तो मॉडल शायद उनका अर्थ उतनी अच्छी तरह न सीख पाए।
ऐप बनाने वाले क्या कर सकते हैं
- 1
पहले नापें
अपने असली tokenizer के साथ हर भाषा में असली यूज़र टेक्स्ट के tokens गिनें। - 2
मॉडलों की तुलना करें
Tokenizers अलग-अलग होते हैं। कुछ नए tokenizers को ज़्यादा बहुभाषी (multilingual) डेटा के साथ ट्रेन किया गया है। कई मॉडलों की जांच करें। - 3
भाषा के हिसाब से बजट बनाएं
Token की सीमाएं और कीमतें असली token गिनती के हिसाब से तय करें, अंग्रेज़ी के हिसाब से नहीं। - 4
Prompt को छोटा रखें
लंबे तय निर्देशों को छोटा रखें। कुछ टीमें सिस्टम निर्देश अंग्रेज़ी में लिखती हैं और जवाब यूज़र की भाषा में मांगती हैं; जांचें कि क्या इससे गुणवत्ता बनी रहती है। - 5
भारतीय डेटा पर ट्रेन किए गए मॉडलों पर विचार करें
भारतीय भाषाओं के ज़्यादा डेटा पर ट्रेन किए गए मॉडल और tokenizers ज़्यादा कुशल हो सकते हैं। उनके लाइसेंस और गुणवत्ता की जांच करें।
- हर भाषा के लिए "एक token लगभग चार अक्षर का होता है" मानना
- सभी भाषाओं के लिए एक जैसी लंबाई सीमा तय करना
- लागत की जांच सिर्फ अंग्रेज़ी टेक्स्ट से करना
- असली टेक्स्ट पर असली tokenizer के साथ tokens गिनना
- हर भाषा की token गिनती के आधार पर सीमाएं तय करना
- अपने डैशबोर्ड में हर भाषा की लागत पर नज़र रखना
और देखें और पढ़ें
लैब
कम से कम तीन भाषाओं में एक ही वाक्य के अक्षरों, बाइट्स और tokens की एक छोटी टेबल।
समस्या
शुरुआती कोड चलाएं। फिर:
- कम से कम दो और वाक्य जोड़ें जिनका अर्थ वही हो, उन भाषाओं में जिन्हें आप जानते हैं या किसी जानकार से जांच करवा सकते हैं। उन्हें खुद टाइप करें या उस भाषा को बोलने वाले किसी दोस्त से पूछें।
- अगर आप इसे इंस्टॉल कर सकते हैं, तो किसी एक पब्लिक tokenizer से token संख्या देखने के लिए
pip install tiktokenचलाएं। यदि नहीं, तो भी कोड अक्षर और बाइट्स दिखाता है। - एक टेबल बनाएं: भाषा, अक्षर, बाइट्स, tokens, और अंग्रेज़ी की तुलना में tokens।
- हर भाषा में चैटबॉट की लागत और संदर्भ (context) के लिए इसका क्या मतलब होगा, इस पर दो वाक्य लिखें।
वे नतीजे न बताएं जिन्हें आपने नापा नहीं है। अगर आपने सिर्फ बाइट्स नापे हैं, तो वैसा ही बताएं।
# Same meaning, different languages. Replace or add your own lines.
sentences = {
"English": "Please send the bill on WhatsApp.",
"Hindi": "कृपया बिल व्हाट्सऐप पर भेजिए।",
# "Tamil": "...", # add a language you know, typed by you
}
try:
import tiktoken # optional: pip install tiktoken
enc = tiktoken.get_encoding("cl100k_base")
except ImportError:
enc = None
base = None
for name, text in sentences.items():
chars = len(text)
utf8 = len(text.encode("utf-8"))
tokens = len(enc.encode(text)) if enc else None
if base is None and tokens:
base = tokens
ratio = f" x{tokens / base:.1f} vs first line" if tokens and base else ""
print(f"{name:8} chars={chars:3} bytes={utf8:3} tokens={tokens}{ratio}")आपका काम तब पूरा होगा जब
कठिन सवाल
उत्तर देखने से पहले ख़ुद जवाब देने की कोशिश करें। अगर आप इनके जवाब दे सकते हैं, तो आप पाठ समझ गए हैं।
Q1दो tokenizers आपके कन्नड़ टेक्स्ट के लिए बहुत अलग गिनती देते हैं। आपको किस पर भरोसा करना चाहिए?दिखाएं
दोनों अपने मॉडल के हिसाब से सही हैं। Token की गिनती किसी भाषा की नहीं, बल्कि tokenizer की होती है। मायने यह रखता है कि आप वास्तव में जिस मॉडल का इस्तेमाल करेंगे उसका tokenizer कौन सा है। यदि आप कोई मॉडल चुन रहे हैं, तो लागत और गुणवत्ता की एक साथ तुलना करें: कम tokens लेकिन खराब जवाब देने वाला मॉडल कोई जीत नहीं है।
Q2क्या आप भारतीय टेक्स्ट को भेजने से पहले रोमन अक्षरों में transliterate करके (लिपि बदलकर) लागत के इस अंतर को ठीक कर सकते हैं?दिखाएं
कुछ tokenizers के साथ इससे tokens कम हो सकते हैं, लेकिन यह जोखिम भरा है। Transliteration का कोई एक मानक नहीं होता, इसमें मतलब और उच्चारण खो सकते हैं, हो सकता है मॉडल इसे उतनी अच्छी तरह न समझ पाए, और यूज़र आमतौर पर अपनी खुद की लिपि में जवाब चाहता है। ऐसा करने से पहले क्वालिटी को ध्यान से टेस्ट करें, और उस टेक्स्ट के साथ चुपचाप ऐसा कभी न करें जिसे यूज़र देखेगा।
अक्सर पूछे जाने वाले सवाल
क्या UTF-8 भारतीय लिपियों के साथ पक्षपात करता है?
UTF-8 एक स्टोरेज फॉर्मेट है। यह बुनियादी लैटिन रेंज से बाहर के अक्षरों के लिए ज़्यादा बाइट्स इस्तेमाल करता है, और यह एक तय डिज़ाइन विकल्प है जो हर भाषा के लिए काम करता है। बड़ी समस्या tokenizer की है: उसने किन चीज़ों को आम टुकड़े मानना सीखा है, इसी से तय होता है कि एक वाक्य कितने tokens में बदलेगा।
भारतीय टेक्स्ट के लिए "अक्षरों" की गिनती भ्रामक क्यों होती है?
Python का len() यूनिकोड कोड पॉइंट्स को गिनता है। स्क्रीन पर दिखने वाला एक अक्षर, जैसे मात्रा के साथ कोई व्यंजन, दो या उससे ज़्यादा कोड पॉइंट्स हो सकता है। पाठक जिसे एक अक्षर समझता है उसे grapheme cluster कहा जाता है। थर्ड-पार्टी regex पैकेज \X के ज़रिए इन्हें गिन सकता है।
क्या मैं बिना पैसे चुकाए tokens गिन सकता हूँ?
हाँ, आमतौर पर। कई ओपन tokenizers को लोकल तौर पर चलाया जा सकता है, उदाहरण के लिए Hugging Face लाइब्रेरीज़ के ज़रिए, और कुछ प्रोवाइडर अपने tokenizers पब्लिश करते हैं या एक मुफ़्त token-काउंटिंग टूल देते हैं। आप जिस मॉडल का इस्तेमाल कर रहे हैं उसके मौजूदा डॉक्स देखें।
क्या मुझे tokens बचाने के लिए prompts अंग्रेज़ी में लिखने चाहिए?
कभी-कभी इससे मदद मिलती है, लेकिन इसकी जांच करें। निर्देश अंग्रेज़ी में सस्ते हो सकते हैं, लेकिन जवाब फिर भी यूज़र की भाषा में और स्वाभाविक होना चाहिए। हमेशा सिर्फ लागत ही नहीं, बल्कि लक्ष्य भाषा में गुणवत्ता भी जांचें।
पाठ का टेस्ट
5 सवाल। पास होने और इस पाठ को पूरा करने के लिए 3 सही होने चाहिए (60%)।