RAG और सर्च इंजीनियरिंगमध्यमपाठ 2098 मिनट का पाठ

दस्तावेज़ों की अच्छी चंकिंग (Chunking)

सर्च से चंक्स मिलते हैं, पूरे दस्तावेज़ नहीं। आप टेक्स्ट को कैसे काटते हैं, इसी से तय होता है कि क्या ढूंढा जा सकेगा। साइज़, ओवरलैप, हेडिंग्स के आधार पर बांटना और काम का मेटाडेटा समझें।

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

60 सेकंड में

दस्तावेज़ों की अच्छी चंकिंग (Chunking)

सर्च से चंक्स मिलते हैं, पूरे दस्तावेज़ नहीं। आप टेक्स्ट को कैसे काटते हैं, इसी से तय होता है कि क्या ढूंढा जा सकेगा। साइज़, ओवरलैप, हेडिंग्स के आधार पर बांटना और काम का मेटाडेटा…

1/5
आसान शब्दों में
अगर आप किसी अखबार को काटकर एक-एक शब्द अलग कर दें, तो किसी टुकड़े का कोई मतलब नहीं निकलेगा। अगर आप पूरे अखबार को एक ही टुकड़ा बनाए रखें, तो आप किसी को सिर्फ क्रिकेट का स्कोर काटकर नहीं दे सकते। अच्छी चंकिंग स्वाभाविक हिस्सों से कटाई करती है, जैसे एक बार में पूरी हेडलाइन के साथ एक पूरा लेख काटना।
एक चंक्स (chunk) दस्तावेज़ का एक ऐसा टुकड़ा होता है जिसे आप अलग से एम्बेड, इंडेक्स और रिट्रीव करते हैं। जब कोई सवाल आता है, तो मॉडल केवल आपके द्वारा रिट्रीव किए गए चंक्स को देखता है, पूरे दस्तावेज़ को नहीं। इसलिए हर चंक का अपने आप में एक मतलब निकलना चाहिए और उसमें एक पूरा विचार होना चाहिए।

साइज़: मुख्य समझौता (ट्रेड-ऑफ)

चंक्स जो…अच्छे हैंखराब हैं
बहुत छोटे हैं (एक या दो वाक्य)सटीक मैचसंदर्भ (कॉन्टेक्स्ट) की कमी: "इसकी अनुमति साल में सिर्फ एक बार है"। यहाँ "इसकी" क्या है?
बहुत बड़े हैं (कई पेज)भरपूर संदर्भएक ही वेक्टर को कई विषयों को कवर करना पड़ता है, इसलिए यह किसी से भी ठीक से मैच नहीं होता; टोकन भी ज़्यादा खर्च होते हैं
लगभग सही (अक्सर कुछ पैराग्राफ, एक विचार)अकेले भी समझ आता है और साफ तौर पर मैच होता हैअपने डेटा पर टेस्ट करने की ज़रूरत होती है
कोई एक सही साइज़ नहीं होता। यह आपके दस्तावेज़ों, आपके एम्बेडिंग मॉडल की इनपुट लिमिट और आपके सवालों पर निर्भर करता है। एक बीच के साइज़ से शुरुआत करें, जैसे कुछ सौ शब्द, और अपने टेस्ट सेट को तय करने दें।

ओवरलैप (Overlap)

ओवरलैप का मतलब है कि एक चंक का अंत अगले चंक की शुरुआत में दोहराया जाता है। अगर कोई ज़रूरी वाक्य चंक के कटने की सीमा (बाउंड्री) पर आ जाता है, तो भी वह कम से कम एक चंक में पूरा दिखाई देता है। थोड़ा सा ओवरलैप रखना आम बात है। बहुत ज़्यादा ओवरलैप होने से आपकी इंडेक्स और प्रॉम्प्ट्स में बार-बार वही टेक्स्ट भर जाता है।

सिर्फ लंबाई से नहीं, बनावट (स्ट्रक्चर) के हिसाब से बांटें

दस्तावेज़ों की अपनी बनावट होती है: हेडिंग्स, सेक्शन्स, नंबर वाले क्लॉज़, लिस्ट आइटम्स, टेबल की पंक्तियाँ, FAQ के जोड़े। उस बनावट के हिसाब से बांटने से विचार एक साथ बने रहते हैं। सिर्फ तभी लंबाई के हिसाब से काटें जब कोई सेक्शन बहुत लंबा हो।
  1. 1

    बनावट पहचानें

    हेडिंग्स, क्लॉज़ नंबर, FAQ के सवाल, स्लाइड के टाइटल।
  2. 2

    सेक्शन के हिसाब से बांटें

    हर सेक्शन एक संभावित चंक बन जाता है।
  3. 3

    लंबे सेक्शन्स को बांटें

    पैराग्राफ के हिसाब से काटें, फिर थोड़े से ओवरलैप के साथ लंबाई के आधार पर काटें।
  4. 4

    बहुत छोटे टुकड़ों को आपस में जोड़ें

    बहुत छोटे सेक्शन्स को उनके पास वाले हिस्से से जोड़ दें ताकि कोई भी चंक सिर्फ एक हेडिंग बनकर न रह जाए।
  5. 5

    संदर्भ और मेटाडेटा जोड़ें

    हर चंक में दस्तावेज़ का टाइटल और सेक्शन की हेडिंग ज़रूर डालें।
Python: split by headings, then by length with overlappython
def split_sections(text):
    """Split text into (heading, body) pairs at lines starting with '#'."""
    sections, heading, lines = [], "Untitled", []
    for line in text.splitlines():
        if line.startswith("#"):
            if lines:
                sections.append((heading, " ".join(lines)))
            heading, lines = line.lstrip("#").strip(), []
        elif line.strip():
            lines.append(line.strip())
    if lines:
        sections.append((heading, " ".join(lines)))
    return sections

def chunk(text, doc_id, title, max_words=80, overlap=15):
    chunks = []
    for heading, body in split_sections(text):
        words = body.split()
        start = 0
        while True:
            piece = " ".join(words[start:start + max_words])
            chunks.append({
                "id": f"{doc_id}#{len(chunks)}",
                "doc_id": doc_id,
                "section": heading,
                # Title and heading go into the text that gets embedded.
                "text": f"{title} > {heading}: {piece}",
            })
            if start + max_words >= len(words):
                break
            start += max_words - overlap
    return chunks

policy = """# Leave policy
Staff get 12 days of casual leave each year.
# Carry forward
Unused casual leave cannot be carried to the next year."""
for c in chunk(policy, "hr-leave-v3", "HR Leave Policy 2025"):
    print(c["id"], "|", c["text"])
इस चंक टेक्स्ट पर ध्यान दें: HR Leave Policy 2025 > Carry forward: Unused casual leave…। टाइटल और हेडिंग के बिना, यह चंक "Unused casual leave cannot be carried…" यह नहीं बता पाएगा कि यह किस पॉलिसी या किस संस्था से जुड़ा है।

मेटाडेटा: हर चंक पर लगे लेबल

फील्डयह क्यों मददगार है
दस्तावेज़ id और चंक idहवाले (citations), अपडेट्स और डिलीट करने के लिए
टाइटल, सेक्शन, पेज नंबरसोर्स दिखाने के लिए; चंक में संदर्भ जोड़ने के लिए
तारीख और वर्शननए वर्शन को प्राथमिकता दें; पुराने वर्शन को फिल्टर करके हटाएं
भाषासवालों को सही जगह भेजने के लिए; सही मॉडल या री-रैंकर चुनने के लिए
प्रकार (पॉलिसी, FAQ, मैन्युअल, ईमेल)सर्च को फिल्टर करने के लिए; अलग-अलग स्टाइल में जवाब दिखाने के लिए
एक्सेस ग्रुप्ससर्च के समय परमिशन के आधार पर फिल्टर करना (RAG को सुरक्षित करना देखें)
कमज़ोर चंकिंग
  • तय 500 कैरेक्टर, जिसमें शब्द और टेबल बीच से कट जाते हैं
  • चंक पर कोई टाइटल या हेडिंग नहीं
  • कोई पेज नंबर नहीं, इसलिए हवाले (citations) किसी भी चीज़ की तरफ इशारा नहीं कर सकते
  • FAQ और 200-पेज के मैन्युअल दोनों के लिए एक जैसा चंक साइज़
बेहतर चंकिंग
  • हेडिंग्स या क्लॉज़ के हिसाब से बांटें, फिर लंबाई के हिसाब से
  • हर चंक के टेक्स्ट में टाइटल और हेडिंग जोड़ी गई है
  • पेज, सेक्शन और वर्शन को मेटाडेटा के रूप में सेव किया गया है
  • असली सवालों पर टेस्टिंग करके चुनी गई सेटिंग्स
नोट
कुछ टीमें सटीकता के लिए छोटे चंक्स में सर्च करती हैं, और फिर संदर्भ के लिए मॉडल को उसके आस-पास का बड़ा टुकड़ा (पूरा सेक्शन) भेजती हैं। इसे कभी-कभी स्मॉल-टू-बिग या पेरेंट-चाइल्ड रिट्रीवल कहा जाता है। इसे तब आज़माना चाहिए जब जवाबों को एक छोटे चंक की तुलना में ज़्यादा संदर्भ की ज़रूरत हो।
इसे आज़माएं। अपने किसी जाने-पहचाने नियम वाले दस्तावेज़ का एक पेज लें, जैसे कि हॉस्टल या सोसाइटी की रूलबुक। आप इसे कहाँ से काटेंगे? कौन से चंक्स बिना हेडिंग के भ्रामक हो जाएंगे?

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

लैब

एक ऐसा चंकर जो हेडिंग्स के हिसाब से बांटता है, संदर्भ जोड़ता है, और उन चंक्स को प्रिंट करता है जिन्हें आपने खुद जांचा है।

~30 min

समस्या

पाठ में दिए गए कोड का इस्तेमाल करें (Python 3, सिर्फ स्टैंडर्ड लाइब्रेरी)।

  1. # हेडिंग्स के साथ 6–10 सेक्शन्स वाला एक काल्पनिक नियमों का दस्तावेज़ लिखें, उदाहरण के लिए किसी हाउसिंग सोसाइटी के नियम। एक सेक्शन लंबा (150+ शब्द) और एक सेक्शन सिर्फ एक लाइन का बनाएं।
  2. max_words=80, overlap=15 के साथ चंकर चलाएं। हर चंक को पढ़ें। क्या हर चंक अकेले भी समझ आ रहा है?
  3. एक ऐसा स्टेप जोड़ें जो 15 शब्दों से छोटे किसी भी सेक्शन को अगले सेक्शन में मिला दे।
  4. हर चंक के मेटाडेटा में एक page या version फील्ड जोड़ें।
  5. ऐसे तीन सवाल लिखें जो कोई निवासी पूछ सकता है, और हर सवाल के लिए तय करें कि कौन सा चंक id उसका जवाब देगा।

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

कठिन सवाल

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

Q1टाइटल और हेडिंग को उस टेक्स्ट में क्यों डालें जिसे एम्बेड किया जाता है, न कि केवल मेटाडेटा में?दिखाएं

Embedding model सिर्फ वही टेक्स्ट देखता है जो आप उसे देते हैं। अगर "Carry forward" और "HR Leave Policy" सिर्फ metadata में हैं, तो chunk के vector में वह मतलब शामिल नहीं होता, इसलिए "can I carry forward casual leave?" जैसा सवाल शायद उससे उतनी अच्छी तरह मैच न हो पाए। Metadata फ़िल्टर और citations के लिए अच्छा होता है; मैचिंग में मदद करने वाला context embedded text के अंदर होना चाहिए।

Q2एक FAQ पेज पर सवाल-जवाब के 40 छोटे जोड़े हैं। आप इसे कैसे chunk करेंगे, और क्यों?दिखाएं

हर सवाल को उसके जवाब के साथ मिलाकर एक chunk बनाएं। यह जोड़ा अपने आप में एक पूरा विचार है, और सवाल का टेक्स्ट अक्सर यूज़र्स के पूछने के तरीके से मेल खाता है। एक निश्चित लंबाई (fixed length) के हिसाब से बांटने पर सवाल अपने जवाब से अलग हो सकता है या दो असंबंधित जवाब आपस में जुड़ सकते हैं। Context के रूप में पेज का टाइटल और कैटेगरी जोड़ें, और बहुत छोटे जोड़े छोटे ही रह सकते हैं क्योंकि वे अपने आप में पूरे हैं।

जारी रखने के लिए कृपया साइन इन करें।

अक्सर पूछे जाने वाले सवाल

क्या मुझे चंक साइज़ शब्दों, कैरेक्टर्स या टोकन में गिनना चाहिए?

एम्बेडिंग मॉडल और लैंग्वेज मॉडल असल में टोकन्स की गिनती करते हैं, इसलिए वे सबसे सटीक होते हैं। शुरुआत करने के लिए शब्द एक आसान अंदाज़ा हैं। ध्यान दें कि कई भारतीय लिपियों में वही टेक्स्ट अक्सर अंग्रेज़ी की तुलना में ज़्यादा टोकन लेता है, इसलिए शब्दों की गिनती सभी भाषाओं में एक जैसी नहीं बैठ सकती।

उन चंक्स का क्या जो सिर्फ एक हेडिंग हैं?

उन्हें अगले सेक्शन के साथ मिला दें। एक ऐसा चंक जिसमें सिर्फ "परिशिष्ट B" लिखा हो, कई सवालों से हल्का-फुल्का मैच तो हो जाएगा लेकिन किसी का भी जवाब नहीं दे पाएगा।

क्या कोई मॉडल मेरे लिए चंकिंग कर सकता है?

हाँ, कुछ टीमें किसी मॉडल से विषय की सीमाएं ढूंढने या हर चंक के लिए एक लाइन का सारांश लिखने को कहती हैं। इससे उलझे हुए टेक्स्ट में मदद मिल सकती है, लेकिन इसमें लागत ज़्यादा आती है और गलतियाँ भी हो सकती हैं। अपने टेस्ट सेट पर इसकी तुलना साधारण स्ट्रक्चर-आधारित कटाई से करके देखें।

मुझे कैसे पता चलेगा कि मेरी चंकिंग अच्छी है?

ऐसे असली सवालों के सेट पर रिट्रीवल को मापें जिनके सही जवाब आपको पता हों, और फिर एक बार में एक ही सेटिंग बदलें। इस ट्रैक का आखिरी पाठ दिखाता है कि यह कैसे करना है।

पाठ का टेस्ट

5 सवाल। पास होने और इस पाठ को पूरा करने के लिए 3 सही होने चाहिए (60%)।

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