भारतीय भाषाओं के लिए AIमध्यमपाठ 2356 मिनट का पाठ

Tokens, लिपियां और भारतीय टेक्स्ट की लागत

ज्यादातर अंग्रेज़ी पर ट्रेन किए गए Tokenizers अक्सर भारतीय भाषाओं के टेक्स्ट को ज़्यादा टुकड़ों में तोड़ते हैं। इसका मतलब है ज़्यादा लागत और context window में कम जगह। इसे खुद नापकर देखें।

पाठ वीडियो में

60 सेकंड में

Tokens, लिपियां और भारतीय टेक्स्ट की लागत

ज्यादातर अंग्रेज़ी पर ट्रेन किए गए Tokenizers अक्सर भारतीय भाषाओं के टेक्स्ट को ज़्यादा टुकड़ों में तोड़ते हैं। इसका मतलब है ज़्यादा लागत और context window में कम जगह। इसे खुद…

1/5
आसान शब्दों में
कल्पना कीजिए एक ऐसी टैक्सी की जो वज़न के हिसाब से नहीं, बल्कि आपके सामान के डिब्बों की संख्या के हिसाब से किराया लेती है। अगर आपका सामान बड़े डिब्बों में पैक है, तो आप कम किराया देते हैं। अगर वही सामान कई छोटे डिब्बों में पैक है, तो आप ज़्यादा किराया देते हैं। एक tokenizer टेक्स्ट को डिब्बों में पैक करता है जिन्हें tokens कहते हैं, और कई भारतीय भाषाओं के लिए यह ज़्यादा और छोटे डिब्बे इस्तेमाल करता है।
चरण 1 · Tokenizer में आपने देखा कि मॉडल अक्षर या शब्द नहीं पढ़ता। वह tokens पढ़ता है: एक तय शब्दावली (vocabulary) से टेक्स्ट के टुकड़े। ज़्यादातर tokenizers अपनी शब्दावली अपने ट्रेनिंग टेक्स्ट से सीखते हैं। अगर वह टेक्स्ट ज़्यादातर अंग्रेज़ी है, तो आम अंग्रेज़ी शब्द अकेले tokens बन जाते हैं, जबकि दूसरी लिपियों के शब्द कई छोटे-छोटे टुकड़ों में बंट जाते हैं।

एक ही वाक्य को गिनने के तीन तरीके

इकाई (Unit)यह क्या गिनता हैयह क्यों मायने रखता है
अक्षर (code points)यूनिकोड कोड पॉइंट्स, यानी वे संख्याएं जो कंप्यूटर हर अक्षर या चिह्न के लिए स्टोर करता हैभारतीय लिपि में एक दिखने वाला अक्षर अक्सर एक से ज़्यादा कोड पॉइंट होता है
UTF-8 बाइट्सटेक्स्ट को स्टोर करने या भेजने के लिए इस्तेमाल किए जाने वाले बाइट्सबुनियादी लैटिन अक्षरों में 1 बाइट लगता है। देवनागरी, बंगाली, तमिल या तेलुगु जैसी लिपियों के अक्षरों में 3 बाइट्स लगते हैं। उर्दू के लिए इस्तेमाल होने वाली अरबी लिपि के अक्षरों में 2 बाइट्स लगते हैं।
Tokensवे टुकड़े जिन्हें मॉडल पढ़ता है, जो tokenizer पर निर्भर करते हैंआप प्रति token भुगतान करते हैं, और context window को tokens में नापा जाता है

इसे Python में देखें

यह डेमो सिर्फ स्टैंडर्ड लाइब्रेरी का इस्तेमाल करता है। यह संख्याएं प्रिंट करता है, ताकि आपको किसी के दावे पर भरोसा न करना पड़े। इसे चलाएं और आउटपुट देखें।
Characters and UTF-8 bytes, English and Hindipython
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)}")
आप देखेंगे कि हिंदी वाक्य में अंग्रेज़ी की तुलना में कम अक्षर होने के बावजूद ज़्यादा बाइट्स लगते हैं। आखिरी हिस्सा दिखाता है कि "स्टे" अक्षर चार कोड पॉइंट्स से बना है: एक व्यंजन, एक हलंत (विराम - व्यंजनों को जोड़ने वाला चिह्न), दूसरा व्यंजन, और एक स्वर का चिह्न (मात्रा)।
नोट
कई आधुनिक tokenizers UTF-8 बाइट्स पर काम करते हैं। अगर भारतीय टेक्स्ट का कोई हिस्सा tokenizer के ट्रेनिंग डेटा में बहुत कम है, तो वह छोटे बाइट-लेवल के टुकड़ों का सहारा ले सकता है। यही एक कारण है कि भारतीय टेक्स्ट अक्सर ज़्यादा tokens में बदल जाता है। सटीक संख्या tokenizer पर निर्भर करती है, इसलिए हमेशा उसी के साथ नापें जिसका आप इस्तेमाल करेंगे।

ज़्यादा tokens से क्या नुकसान होता है

  • ज़्यादा लागत। होस्ट किए गए मॉडल आमतौर पर प्रति token चार्ज करते हैं। एक ही बात के लिए ज़्यादा tokens का मतलब है उस भाषा के उपयोगकर्ताओं के लिए ज़्यादा बिल।
  • कम संदर्भ (Context)। Context window को tokens में गिना जाता है। अगर किसी दस्तावेज़ को ज़्यादा tokens की ज़रूरत है, तो उसका कम हिस्सा ही इसमें समा पाता है, इसलिए मॉडल कम "याद" रख पाता है।
  • धीमे जवाब। मॉडल एक बार में एक token आउटपुट देते हैं, इसलिए ज़्यादा आउटपुट tokens में ज़्यादा समय लगता है।
  • खराब सीख। जब शब्दों को बिना मतलब के टुकड़ों में काट दिया जाता है, तो मॉडल शायद उनका अर्थ उतनी अच्छी तरह न सीख पाए।
सावधान रहें
यह सिर्फ एक तकनीकी समस्या नहीं है, बल्कि निष्पक्षता का भी सवाल है। अगर कोई ऐप भारतीय भाषाओं का इस्तेमाल करने वाले लोगों के लिए ज़्यादा महंगा पड़ता है, या कम अच्छे जवाब देता है, तो उन उपयोगकर्ताओं को उसी ज़रूरत के लिए खराब अनुभव मिलता है। इसे नापें और उसी के हिसाब से डिज़ाइन करें।

ऐप बनाने वाले क्या कर सकते हैं

  1. 1

    पहले नापें

    अपने असली tokenizer के साथ हर भाषा में असली यूज़र टेक्स्ट के tokens गिनें।
  2. 2

    मॉडलों की तुलना करें

    Tokenizers अलग-अलग होते हैं। कुछ नए tokenizers को ज़्यादा बहुभाषी (multilingual) डेटा के साथ ट्रेन किया गया है। कई मॉडलों की जांच करें।
  3. 3

    भाषा के हिसाब से बजट बनाएं

    Token की सीमाएं और कीमतें असली token गिनती के हिसाब से तय करें, अंग्रेज़ी के हिसाब से नहीं।
  4. 4

    Prompt को छोटा रखें

    लंबे तय निर्देशों को छोटा रखें। कुछ टीमें सिस्टम निर्देश अंग्रेज़ी में लिखती हैं और जवाब यूज़र की भाषा में मांगती हैं; जांचें कि क्या इससे गुणवत्ता बनी रहती है।
  5. 5

    भारतीय डेटा पर ट्रेन किए गए मॉडलों पर विचार करें

    भारतीय भाषाओं के ज़्यादा डेटा पर ट्रेन किए गए मॉडल और tokenizers ज़्यादा कुशल हो सकते हैं। उनके लाइसेंस और गुणवत्ता की जांच करें।
अंदाज़ा लगाना
  • हर भाषा के लिए "एक token लगभग चार अक्षर का होता है" मानना
  • सभी भाषाओं के लिए एक जैसी लंबाई सीमा तय करना
  • लागत की जांच सिर्फ अंग्रेज़ी टेक्स्ट से करना
नापना
  • असली टेक्स्ट पर असली tokenizer के साथ tokens गिनना
  • हर भाषा की token गिनती के आधार पर सीमाएं तय करना
  • अपने डैशबोर्ड में हर भाषा की लागत पर नज़र रखना
इसे आज़माएं। डेमो में अपनी जानकारी वाली किसी अन्य भाषा में, उसी अर्थ का एक और वाक्य जोड़ें। इसे चलाने से पहले, बाइट्स की संख्या का अंदाज़ा लगाएं। फिर इसे चलाएं और जांचें।

और देखें और पढ़ें

लैब

कम से कम तीन भाषाओं में एक ही वाक्य के अक्षरों, बाइट्स और tokens की एक छोटी टेबल।

~30 min

समस्या

शुरुआती कोड चलाएं। फिर:

  1. कम से कम दो और वाक्य जोड़ें जिनका अर्थ वही हो, उन भाषाओं में जिन्हें आप जानते हैं या किसी जानकार से जांच करवा सकते हैं। उन्हें खुद टाइप करें या उस भाषा को बोलने वाले किसी दोस्त से पूछें।
  2. अगर आप इसे इंस्टॉल कर सकते हैं, तो किसी एक पब्लिक tokenizer से token संख्या देखने के लिए pip install tiktoken चलाएं। यदि नहीं, तो भी कोड अक्षर और बाइट्स दिखाता है।
  3. एक टेबल बनाएं: भाषा, अक्षर, बाइट्स, tokens, और अंग्रेज़ी की तुलना में tokens।
  4. हर भाषा में चैटबॉट की लागत और संदर्भ (context) के लिए इसका क्या मतलब होगा, इस पर दो वाक्य लिखें।

वे नतीजे न बताएं जिन्हें आपने नापा नहीं है। अगर आपने सिर्फ बाइट्स नापे हैं, तो वैसा ही बताएं।

शुरुआती कोडpython
# 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}")
Google Colab खोलें ↗इस कोड के लिए आपके अपने सेटअप की ज़रूरत है (एक मॉडल, एक GPU या अतिरिक्त पैकेज)। इसे Google Colab में चलाएं: File → Upload notebook।

आपका काम तब पूरा होगा जब

कठिन सवाल

उत्तर देखने से पहले ख़ुद जवाब देने की कोशिश करें। अगर आप इनके जवाब दे सकते हैं, तो आप पाठ समझ गए हैं।

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%)।

टेस्ट देने और अपनी प्रोग्रेस सेव करने के लिए साइन इन करें