ডকুমেন্ট কনভার্টার

LangChain এর ডকুমেন্ট কনভার্টার প্রধানত টেক্সটের সামগ্রীকে বিভজন করে, একটি বৃহৎ নিবন্ধকে একাধিক ছোট সামগ্রী ফ্র্যাগমেন্টে ভাগ করে। এটি করা হয় কারণ বড় মডেলগুলোর সামগ্রীর দৈর্ঘ্যের সীমা থাকে এবং সব সামগ্রী বইতে অভিলাষিতভাবে গুণত্তরটি না করে। যদিও কিছু বড় মডেল প্রায় খুব বড় প্রম্প্ট দৈর্ঘ্যের প্রদান করে তবে মূল্যের দৃষ্টিকোণ থেকে সেই বৃহৎ সামগ্রী প্রায় অত্যন্ত কল্পনা পূরুণ করা সম্ভব নয়। পরিবেশান বৃধির জন্য বৃহৎ সামগ্রীর জন্য যত বেশি API কল প্রয়োজন পড়ে (নিজেরা জন্য বৃধির কারণ, এমনকি লোকালি বিচার করা বিদেশি মডেল জন্য বৃহৎ পরিমাণের মেমরি চাইতে হয় এবং আগ্রহবোধ অনুমান করা সাধন ব্যতিরেক হতে পারে)। যেকোনোভাবেই, তথ্যের লম্বা হওয়ার সহিত উপায় হল প্রশ্নসবুজে ব্যাকগ্রাউন্ড তথ্য এবং প্রম্প্ট হিসেবে সাংলাপ করা।

LangChain এর অনেক স্বতন্ত্র ডকুমেন্ট কনভার্টার আছে যেগুলি সহজে ডকুমেন্টের সামগ্রী ভাগ, যোগ এবং ফিল্টার করতে পারে।

টেক্সট স্প্লিটার

বৃহৎ টেক্সটের সাথে যখন কাজ করতে হয়, তখন আপনাকে টেক্সটটি চাঙ্গা করতে হবে। যদিও এটি শোনা মনে হয় সহজ, তবে এখানে অনেক সমস্যা থাকতে পারে। আপনি ইচ্ছামতো রেখানুযায়ী টেক্সট সেগমেন্টগুলি একসুটিরে রেখে রাখতে চান। "সেমান্টিকালি সম্পর্কিত" পরিপাটিতে এখানে "সেমান্টিকালি সম্পর্কিত" শব্দটি টেক্সটের প্রকারের উপর নির্ভর করতে পারে।

উচ্চ স্তরে, টেক্সট স্প্লিটার নিম্নরূপে কাজ করে:

  1. টেক্সটটি ছোট, সেম্যান্টিকালি অর্থপূর্ণ ব্লকগুলির মধ্যে ভাগ করুন (সাধারণভাবে বাক্যের মধ্যে)।
  2. এই ছোট ব্লকগুলি বড় বোনে যোগ করা শুরু করুন যত পর্যন্ত নির্ধারিত আকারের পৌঁছা যায় (কিছু ফাংশন দ্বারা পরিমাপ করা)।
  3. এই আকারের পৌঁছা প্রাপ্তি হলে, ব্লকটি নিজস্ব টেক্সট সেগমেন্ট হিসেবে বিবেচনা করুন এবং কিছু অভাগের মাধ্যমে নতুন টেক্সট ব্লক তৈরি করুন (ব্লকগুলির মধ্যবর্তী যোগফল বজায় রাখতে এবং একটি স্লাইডিং উইন্ডো প্রয়োগ করতে কিছু অভাংগ দ্বারা।

এটা মানে করে যে, আপনি টেক্সট স্প্লিটারকে দুইটি বিভিন্ন অক্ষে কাস্টমাইজ করতে পারেন:

  1. কিভাবে টেক্সট ভাগ করবেন
  2. ব্লকগুলির আকারটি কিভাবে পরিমাপ করবেন

উদাহরণ

ডিফল্ট প্রস্তাবিত টেক্সট স্প্লিটার 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='..এই অংশ ছিল সরাসরি অনবদ্য..', metadata={'start_index': 0}
    page_content='..এই অংশ ছিল সরাসরি অনবদ্য..', metadata={'start_index': 82}

অন্যান্য রূপান্তরণা

ঝুঁকাবদ্ধ ডকুমেন্ট, ডকুমেন্ট অনুবাদ, মেটাডেটা এক্সট্র্যাক্ট করা, এবং অন্যান্য

ডকুমেন্ট ভাগার পাশাপাশি, আমরা ডকুমেন্টের অন্যান্য রূপান্তরণা পারণ। 'ভেক্টরের অবাঞ্জলিত ফিল্টার' ব্যবহার করে, আমরা একই ধরনের ডকুমেন্ট চিহ্নিত করতে পারি এবং অবাঞ্জলিত সামগ্রী ফিল্টার করতে পারি। 'doctran' এর মতো সংযোজন দিয়ে, আমরা ডকুমেন্টকে একে অন্যের ভাষায় অনুবাদ করতে পারি, প্রয়োজনীয় বৈশিষ্ট্যগুলি বের করে মেটাডেটা এবং তাদের মেটাডেটা যুক্ত করে এবং সংযোগমুখী কথাবার্তা কে একটি প্রশ্ন / উত্তর বিন্যাসিত ডকুমেন্ট দিয়ে রূপান্তর করতে পারি।