दस्तावेज़ कनवर्टर
LangChain का दस्तावेज़ कनवर्टर मुख्य रूप से पाठ की सामग्री को सेगमेंट करने का कार्य करता है, बड़े आलेख को कई छोटे सामग्री टुकड़ों में विभाजित करता है। यह इसलिए किया जाता है क्योंकि बड़े मॉडलों की अक्षमता होती है कि प्रॉम्प्ट्स की लंबाई पर सीमा होती है और वे सभी सामग्री को एआई को नहीं भेज सकते। यद्यपि कुछ बड़े मॉडल बहुत बड़ी प्रॉम्प्ट लंबाई की अनुमति देते हैं, तो लागत के दृष्टिकोण से ऐसी लंबी सामग्री को एआई को भेजना व्यावसायिक नहीं है। आखिरकार, सामग्री जितनी लंबी होगी, API कॉल की लागत भी उतनी ही ज्यादा होगी (यहां तक कि स्थानिक रूप से डिप्लॉय किए गए ओपन सोर्स मॉडल्स के लिए भी, लंबी सामग्री और अधिक GPU मेमोरी और धीमी इनफरेंस की आवश्यकता होती है)। यह समझौता करना संगीन होता है कि पृष्ठभूमि सूचना और प्रॉम्प्ट्स के रूप में संबंधित सामग्री टुकड़ा करें।
LangChain में कई स्व-बनाए गए दस्तावेज़ कनवर्टर हैं जो दस्तावेज़ सामग्री को आसानी से विभाजित, जोड़ा और फ़िल्टर कर सकते हैं।
पाठ स्प्लिटर
बड़े पाठ ब्लॉक का सामना करने के समय, आपको पाठ को टुकड़ों में विभाजित करना होगा। हालांकि, यह सरल लगता है, यहाँ बहुत सारी संभावनाएँ हो सकती हैं। आप आशा करते हैं कि आप सातत्यपूर्ण संबंधित पाठ खंडों को साथ में रखे। "सातत्यपूर्ण संबंधित" शब्द यहाँ टेक्स्ट के प्रकार पर निर्भर कर सकता है।
एक उच्च स्तर पर, पाठ स्प्लिटर का कार्य निम्नलिखित होता है:
- पाठ को छोटे, अर्थमूलक ब्लॉक में विभाजित करें (सामान्यत: वाक्यों में)।
- इन छोटे ब्लॉक्स को बड़े बनाने की कोशिश करें जब तक किसी फ़ंक्शन द्वारा मापे गए एक निश्चित साइज़ तक न पहुँच जाएं।
- एक बार जब इस साइज़ को पहुँच जाता है, ब्लॉक को उसके अपने पाठ सेगमेंट के रूप में समझें और किसी ओवरलैप के साथ एक नये पाठ ब्लॉक को बनाना शुरू करें (ब्लॉक के बीच संदर्भ को बनाए रखने के लिए)।
इसका अर्थ है कि आप पाठ स्प्लिटर को दो विभिन्न प्रकारों पर अनुकूलित कर सकते हैं:
- पाठ को कैसे विभाजित करें
- ब्लॉकों का साइज़ कैसे मापें
उदाहरण
डिफ़ॉल्ट सिफारिश किये गए पाठ स्प्लिटर RecursiveCharacterTextSplitter है। यह पाठ स्प्लिटर एक अक्षरों की सूची स्वीकार करता है। यह कोशिश करता है कि पहले अक्षर के आधार पर ब्लॉक बनाए, लेकिन अगर कोई ब्लॉक बहुत बड़ा है, तो यह अगले अक्षर पर चलता रहेगा, और ऐसा होता जाएगा। डिफ़ॉल्ट रूप से, इस पाठ स्प्लिटर द्वारा विभाजित करने की कोशिश की जाने वाली अक्षर हैं ["\\\\n\\\\n", "\\\\n", " ", ""]
।
जोड़े जाने वाले अक्षरों को नियंत्रित करने के अलावा, आप कई अन्य मामलों को भी नियंत्रित कर सकते हैं:
-
length_function
: ब्लॉक की लंबाई का आकलन कैसे करें। डिफ़ॉल्ट रूप से केवल वर्णों की संख्या का हिसाब किया जाता है, लेकिन यहां आमतौर पर टोकन काउंटर्स पास किए जाते हैं। -
chunk_size
: आपके ब्लॉकों की अधिकतम आकार (लंबाई कार्य के आधार पर मापी जाती है)। -
chunk_overlap
: ब्लॉकों के बीच अधिकतम ओवरलैप। कुछ ओवरलैप रखने से ब्लॉकों के बीच संज्ञानात्मकता बनी रह सकती है (उदाहरण के लिए, स्लाइडिंग विंडो का उपयोग करते समय)। -
add_start_index
: क्या मेटाडेटा में प्रत्येक ब्लॉक की शुरुआती स्थान को शामिल करना है, यह नहीं।
with open('../../state_of_the_union.txt') as f:
state_of_the_union = f.read()
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size = 100,
chunk_overlap = 20,
length_function = len,
add_start_index = True,
)
texts = text_splitter.create_documents([state_of_the_union])
print(texts[0])
print(texts[1])
page_content='..ignored text..' metadata={'start_index': 0}
page_content='..ignored text..' metadata={'start_index': 82}
अन्य परिवर्तन:
अनावश्यक दस्तावेज़ों को छानना, दस्तावेज़ों का अनुवाद करना, मेटाडेटा निकालना, और अधिक
दस्तावेज़ों को विभाजित करने के साथ-साथ, हम दस्तावेज़ की सामग्री पर अन्य परिवर्तन भी कर सकते हैं। EmbeddingsRedundantFilter
का उपयोग करके, हम समान दस्तावेज़ों की पहचान करके अनावश्यक सामग्री को निकाल सकते हैं। doctran जैसी एकीकरणों के माध्यम से, हम दस्तावेज़ों का एक भाषा से दूसरी भाषा में अनुवाद करने, आवश्यक गुणों को निकालने और उन्हें मेटाडेटा में जोड़ने, और वार्ताओं को प्रश्न/उत्तर स्वरूपित दस्तावेज़ों में रूपांतरित करने जैसे ऑपरेशन कर सकते हैं।