दस्तावेज़ों की अच्छी चंकिंग (Chunking)
सर्च से चंक्स मिलते हैं, पूरे दस्तावेज़ नहीं। आप टेक्स्ट को कैसे काटते हैं, इसी से तय होता है कि क्या ढूंढा जा सकेगा। साइज़, ओवरलैप, हेडिंग्स के आधार पर बांटना और काम का मेटाडेटा समझें।
60 सेकंड में
दस्तावेज़ों की अच्छी चंकिंग (Chunking)
सर्च से चंक्स मिलते हैं, पूरे दस्तावेज़ नहीं। आप टेक्स्ट को कैसे काटते हैं, इसी से तय होता है कि क्या ढूंढा जा सकेगा। साइज़, ओवरलैप, हेडिंग्स के आधार पर बांटना और काम का मेटाडेटा…
साइज़: मुख्य समझौता (ट्रेड-ऑफ)
| चंक्स जो… | अच्छे हैं | खराब हैं |
|---|---|---|
| बहुत छोटे हैं (एक या दो वाक्य) | सटीक मैच | संदर्भ (कॉन्टेक्स्ट) की कमी: "इसकी अनुमति साल में सिर्फ एक बार है"। यहाँ "इसकी" क्या है? |
| बहुत बड़े हैं (कई पेज) | भरपूर संदर्भ | एक ही वेक्टर को कई विषयों को कवर करना पड़ता है, इसलिए यह किसी से भी ठीक से मैच नहीं होता; टोकन भी ज़्यादा खर्च होते हैं |
| लगभग सही (अक्सर कुछ पैराग्राफ, एक विचार) | अकेले भी समझ आता है और साफ तौर पर मैच होता है | अपने डेटा पर टेस्ट करने की ज़रूरत होती है |
ओवरलैप (Overlap)
सिर्फ लंबाई से नहीं, बनावट (स्ट्रक्चर) के हिसाब से बांटें
- 1
बनावट पहचानें
हेडिंग्स, क्लॉज़ नंबर, FAQ के सवाल, स्लाइड के टाइटल। - 2
सेक्शन के हिसाब से बांटें
हर सेक्शन एक संभावित चंक बन जाता है। - 3
लंबे सेक्शन्स को बांटें
पैराग्राफ के हिसाब से काटें, फिर थोड़े से ओवरलैप के साथ लंबाई के आधार पर काटें। - 4
बहुत छोटे टुकड़ों को आपस में जोड़ें
बहुत छोटे सेक्शन्स को उनके पास वाले हिस्से से जोड़ दें ताकि कोई भी चंक सिर्फ एक हेडिंग बनकर न रह जाए। - 5
संदर्भ और मेटाडेटा जोड़ें
हर चंक में दस्तावेज़ का टाइटल और सेक्शन की हेडिंग ज़रूर डालें।
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-पेज के मैन्युअल दोनों के लिए एक जैसा चंक साइज़
- हेडिंग्स या क्लॉज़ के हिसाब से बांटें, फिर लंबाई के हिसाब से
- हर चंक के टेक्स्ट में टाइटल और हेडिंग जोड़ी गई है
- पेज, सेक्शन और वर्शन को मेटाडेटा के रूप में सेव किया गया है
- असली सवालों पर टेस्टिंग करके चुनी गई सेटिंग्स
और देखें और पढ़ें
लैब
एक ऐसा चंकर जो हेडिंग्स के हिसाब से बांटता है, संदर्भ जोड़ता है, और उन चंक्स को प्रिंट करता है जिन्हें आपने खुद जांचा है।
समस्या
पाठ में दिए गए कोड का इस्तेमाल करें (Python 3, सिर्फ स्टैंडर्ड लाइब्रेरी)।
#हेडिंग्स के साथ 6–10 सेक्शन्स वाला एक काल्पनिक नियमों का दस्तावेज़ लिखें, उदाहरण के लिए किसी हाउसिंग सोसाइटी के नियम। एक सेक्शन लंबा (150+ शब्द) और एक सेक्शन सिर्फ एक लाइन का बनाएं।max_words=80, overlap=15के साथ चंकर चलाएं। हर चंक को पढ़ें। क्या हर चंक अकेले भी समझ आ रहा है?- एक ऐसा स्टेप जोड़ें जो 15 शब्दों से छोटे किसी भी सेक्शन को अगले सेक्शन में मिला दे।
- हर चंक के मेटाडेटा में एक
pageयाversionफील्ड जोड़ें। - ऐसे तीन सवाल लिखें जो कोई निवासी पूछ सकता है, और हर सवाल के लिए तय करें कि कौन सा चंक 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%)।