ছোট প্রসঙ্গ উইন্ডোতে ক্লায়েন্ট-সাইড সারমাইজেশন স্কেল করুন

প্রকাশিত: ১২ মার্চ, ২০২৫, সর্বশেষ হালনাগাদ: ২৮ মে, ২০২৫

ব্যাখ্যাকারী ওয়েব এক্সটেনশন ক্রোম স্ট্যাটাস উদ্দেশ্য
এমডিএন ক্রোম ১৩৮ ক্রোম ১৩৮ দেখুন জাহাজীকরণের অভিপ্রায়

সামারাইজার এপিআই আপনাকে বিভিন্ন দৈর্ঘ্য ও ফরম্যাটের তথ্যের সারাংশ তৈরি করতে সাহায্য করে। দীর্ঘ বা জটিল লেখা সংক্ষিপ্তভাবে ব্যাখ্যা করার জন্য, এটি ক্রোমের ফাউন্ডেশন মডেল বা ব্রাউজারে অন্তর্নির্মিত অন্যান্য ল্যাঙ্গুয়েজ মডেলের সাথে ব্যবহার করুন।

ক্লায়েন্ট-সাইডে সম্পাদন করা হলে, আপনি স্থানীয়ভাবে ডেটা নিয়ে কাজ করতে পারেন, যা আপনাকে সংবেদনশীল ডেটা সুরক্ষিত রাখতে এবং বৃহৎ পরিসরে প্রাপ্যতা নিশ্চিত করতে সাহায্য করে। তবে, সার্ভার-সাইড মডেলের তুলনায় এর কনটেক্সট উইন্ডো অনেক ছোট হয়, যার ফলে খুব বড় ডকুমেন্টের সারসংক্ষেপ করা কঠিন হতে পারে। এই সমস্যা সমাধানের জন্য, আপনি ‘সারাংশের সারাংশ’ (summaries) কৌশলটি ব্যবহার করতে পারেন।

সারাংশের সারাংশ বলতে কী বোঝায়?

সারাংশের সারাংশ কৌশলটি ব্যবহার করতে, ইনপুট কন্টেন্টকে গুরুত্বপূর্ণ পয়েন্টগুলোতে ভাগ করুন, তারপর প্রতিটি অংশকে আলাদাভাবে সারাংশ করুন। আপনি প্রতিটি অংশের আউটপুটগুলোকে একত্রিত করতে পারেন, এবং তারপর এই একত্রিত টেক্সটটিকে একটি চূড়ান্ত সারাংশে পরিণত করতে পারেন।

উদাহরণস্বরূপ, যদি একটি নথিকে তিনটি অংশে ভাগ করা হয়, তবে প্রতিটি অংশের সারসংক্ষেপ করা হয়। চূড়ান্ত ফলাফলের জন্য সেই তিনটি সারসংক্ষেপকে একত্রিত করে আবার সারসংক্ষেপ করা হয়।

ভেবেচিন্তে আপনার বিষয়বস্তু ভাগ করুন।

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

এটি করার অনেক উপায় আছে। নিচের উদাহরণে, আমরা LangChain.js- এর Recursive Text Splitter ব্যবহার করেছি, যা পারফরম্যান্স এবং আউটপুট কোয়ালিটির মধ্যে ভারসাম্য রক্ষা করে। এটি বেশিরভাগ ওয়ার্কলোডের জন্যই কাজ করবে।

নতুন ইনস্ট্যান্স তৈরি করার সময় দুটি গুরুত্বপূর্ণ প্যারামিটার থাকে:

  • chunkSize হলো প্রতিটি স্প্লিটে অনুমোদিত অক্ষরের সর্বোচ্চ সংখ্যা।
  • chunkOverlap হলো দুটি পরপর বিভাজনের মধ্যে ওভারল্যাপ করা অক্ষরের পরিমাণ। এটি নিশ্চিত করে যে প্রতিটি চাঙ্কে পূর্ববর্তী চাঙ্কের কিছু বিষয়বস্তু থাকে।

প্রতিটি খণ্ডসহ স্ট্রিং-এর একটি অ্যারে ফেরত পেতে splitText() ব্যবহার করে টেক্সটটি ভাগ করুন।

বেশিরভাগ LLM-এর কনটেক্সট উইন্ডো ক্যারেক্টারের সংখ্যার পরিবর্তে টোকেনের সংখ্যা হিসাবে প্রকাশ করা হয়। গড়ে, একটি টোকেনে ৪টি ক্যারেক্টার থাকে। আমাদের উদাহরণে, chunkSize হলো ৩০০০ ক্যারেক্টার এবং এর পরিমাণ প্রায় ৭৫০টি টোকেন।

টোকেনের প্রাপ্যতা নির্ধারণ করুন

একটি ইনপুটের জন্য কতগুলো টোকেন ব্যবহার করা যাবে তা নির্ধারণ করতে, measureInputUsage() মেথড এবং inputQuota প্রপার্টি ব্যবহার করুন। এক্ষেত্রে এর প্রয়োগ অসীম, কারণ সমস্ত টেক্সট প্রসেস করার জন্য সামারাইজারটি কতবার চলবে তা আপনি জানতে পারবেন না।

প্রতিটি বিভাজনের জন্য সারাংশ তৈরি করুন

একবার আপনি কন্টেন্ট কীভাবে ভাগ করা হবে তা সেট করে নিলে, Summarizer API ব্যবহার করে প্রতিটি অংশের জন্য সারাংশ তৈরি করতে পারবেন।

create() ফাংশন ব্যবহার করে সামারাইজারটির একটি ইনস্ট্যান্স তৈরি করুন। যথাসম্ভব প্রাসঙ্গিক তথ্য ধরে রাখার জন্য, আমরা format প্যারামিটারটি ` plain-text , type ` tldr এবং length ` long সেট করেছি।

এরপর, RecursiveCharacterTextSplitter দ্বারা তৈরি প্রতিটি স্প্লিটের জন্য সামারি তৈরি করুন এবং ফলাফলগুলোকে একটি নতুন স্ট্রিং-এ সংযুক্ত করুন। প্রতিটি অংশের সামারি স্পষ্টভাবে চিহ্নিত করার জন্য আমরা সেগুলোকে একটি নতুন লাইনে আলাদা করেছি।

এই লুপটি শুধু একবার চালানোর ক্ষেত্রে নতুন লাইনটির কোনো গুরুত্ব না থাকলেও, চূড়ান্ত সারসংক্ষেপের জন্য টোকেন ভ্যালুতে প্রতিটি সারসংক্ষেপ কীভাবে যুক্ত হচ্ছে তা নির্ধারণ করতে এটি কার্যকর। বেশিরভাগ ক্ষেত্রে, এই সমাধানটি মাঝারি এবং দীর্ঘ কন্টেন্টের জন্য কাজ করবে।

সারাংশের পুনরাবৃত্তিমূলক সারাংশ

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

যদি আপনার সারাংশের সারাংশও খুব দীর্ঘ হয়ে যায়, তবে আপনি প্রক্রিয়াটি পুনরাবৃত্তি করতে পারেন। তাত্ত্বিকভাবে, আপনি একটি উপযুক্ত দৈর্ঘ্য না পাওয়া পর্যন্ত অনির্দিষ্টকালের জন্য এই প্রক্রিয়াটি পুনরাবৃত্তি করতে পারেন।

আমরা RecursiveCharacterTextSplitter দ্বারা তৈরি প্রাথমিক বিভাজনগুলো সংগ্রহ করি। তারপর, recursiveSummarizer() ফাংশনে, আমরা সংযুক্ত বিভাজনগুলোর অক্ষর সংখ্যার উপর ভিত্তি করে সারসংক্ষেপ তৈরির প্রক্রিয়াটি পুনরাবৃত্তি করি। যদি সারসংক্ষেপগুলোর অক্ষর সংখ্যা 3000 ছাড়িয়ে যায়, তাহলে আমরা সেগুলোকে সংযুক্ত করে fullSummaries তৈরি করি। যদি এই সীমা পূরণ না হয়, তবে সারসংক্ষেপটি partialSummaries হিসেবে সংরক্ষণ করা হয়।

একবার সমস্ত সারাংশ তৈরি হয়ে গেলে, চূড়ান্ত আংশিক সারাংশগুলো সম্পূর্ণ সারাংশের সাথে যুক্ত করা হয়। যদি fullSummaries এ কেবল ১টি সারাংশ থাকে, তবে অতিরিক্ত পুনরাবৃত্তির প্রয়োজন হয় না। ফাংশনটি একটি চূড়ান্ত সারাংশ ফেরত দেয়। যদি একাধিক সারাংশ উপস্থিত থাকে, তবে ফাংশনটি পুনরাবৃত্তি করে এবং আংশিক সারাংশগুলোর সারসংক্ষেপ তৈরি করা চালিয়ে যায়।

আমরা এই সমাধানটি ইন্টারনেট রিলে চ্যাট (IRC) RFC দিয়ে পরীক্ষা করেছি, যেটিতে ১৭,৫৬০টি শব্দসহ মোট ১১০,০৩০টি ক্যারেক্টার রয়েছে। সামারাইজার এপিআই নিম্নলিখিত সারাংশটি প্রদান করেছে:

ইন্টারনেট রিলে চ্যাট (IRC) হলো টেক্সট মেসেজ ব্যবহার করে রিয়েল-টাইমে অনলাইনে যোগাযোগ করার একটি উপায়। আপনি চ্যানেলে চ্যাট করতে বা ব্যক্তিগত বার্তা পাঠাতে পারেন এবং চ্যাট নিয়ন্ত্রণ করতে ও সার্ভারের সাথে যোগাযোগ করতে কমান্ড ব্যবহার করতে পারেন। এটি ইন্টারনেটের একটি চ্যাট রুমের মতো, যেখানে আপনি তাৎক্ষণিকভাবে অন্যদের বার্তা টাইপ করতে ও দেখতে পারেন।

এটা বেশ কার্যকর! আর, এতে মাত্র ৩০৯টি অক্ষর আছে।

সীমাবদ্ধতা

সারাংশের সারাংশ কৌশলটি আপনাকে একটি ক্লায়েন্ট-আকারের মডেলের কনটেক্সট উইন্ডোর মধ্যে কাজ করতে সাহায্য করে। যদিও ক্লায়েন্ট-সাইড এআই-এর অনেক সুবিধা রয়েছে, আপনি নিম্নলিখিত বিষয়গুলির সম্মুখীন হতে পারেন:

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

আমাদের একটি সামারাইজার ডেমো রয়েছে এবং আপনি সম্পূর্ণ সোর্স কোড দেখতে পারেন।

আপনার মতামত জানান

Summarizer API ব্যবহার করে বিভিন্ন দৈর্ঘ্যের ইনপুট টেক্সট, বিভিন্ন স্প্লিট সাইজ এবং বিভিন্ন ওভারল্যাপ দৈর্ঘ্য সহ 'সারাংশের সারাংশ' কৌশলটি ব্যবহার করার চেষ্টা করুন।