paint-brush
স্বয়ংক্রিয় পাঠ্য নিষ্কাশন এবং বিশ্লেষণের জন্য MinIO এবং Apache Tika ব্যবহার করাদ্বারা@minio
8,089 পড়া
8,089 পড়া

স্বয়ংক্রিয় পাঠ্য নিষ্কাশন এবং বিশ্লেষণের জন্য MinIO এবং Apache Tika ব্যবহার করা

দ্বারা MinIO7m2024/04/11
Read on Terminal Reader

অতিদীর্ঘ; পড়তে

এই পোস্টে, আমরা ডকুমেন্ট টেক্সট এক্সট্রাকশনের জন্য MinIO বাকেট নোটিফিকেশন এবং অ্যাপাচি টিকা ব্যবহার করব, যা লার্জ ল্যাঙ্গুয়েজ মডেল (LLM) ট্রেনিং এবং রিট্রিভাল অগমেন্টেড জেনারেশন (RAG) এর মতো গুরুত্বপূর্ণ ডাউনস্ট্রিম কাজের কেন্দ্রবিন্দুতে রয়েছে।
featured image - স্বয়ংক্রিয় পাঠ্য নিষ্কাশন এবং বিশ্লেষণের জন্য MinIO এবং Apache Tika ব্যবহার করা
MinIO HackerNoon profile picture
0-item
1-item


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


প্রিমাইজ

ধরা যাক যে আমি পাঠ্যের একটি ডেটাসেট তৈরি করতে চাই যা আমি তখন ব্যবহার করতে পারি ফাইন-টিউন একটি এলএলএম। এটি করার জন্য, আমাদের প্রথমে বিভিন্ন নথি সংগ্রহ করতে হবে (যেগুলি তাদের উত্সের কারণে বিভিন্ন ফর্ম-ফ্যাক্টর হতে পারে) এবং সেগুলি থেকে পাঠ্যটি বের করতে হবে। ডেটাসেট নিরাপত্তা এবং নিরীক্ষাযোগ্যতা সর্বাপেক্ষা গুরুত্বপূর্ণ, তাই এই অসংগঠিত নথিগুলিকে মেলানোর জন্য একটি বস্তুর দোকানে সংরক্ষণ করতে হবে। MinIO হল অবজেক্ট স্টোর যার জন্য নির্মিত এই পরিস্থিতিতে এবং আরো . অন্যদিকে, Apache Tika হল একটি টুলকিট যা "এক হাজারেরও বেশি বিভিন্ন ধরনের ফাইল (যেমন PPT, XLS, এবং PDF) থেকে মেটাডেটা এবং পাঠ্য সনাক্ত করে এবং বের করে।" একসাথে, তারা একত্রিত হয়ে একটি সিস্টেম গঠন করে যা আমাদের উদ্দেশ্য অর্জন করতে পারে।


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




অ্যাপাচি টিকা সেট আপ করা হচ্ছে

অ্যাপাচি টিকা চালু করার সবচেয়ে সহজ উপায় হল এর সাথে অফিসিয়াল ডকার ইমেজ . আপনার পছন্দসই টিকা ইমেজ সংস্করণ/ট্যাগের জন্য ডকার হাব চেক করুন।



এই উদাহরণে, আমি এটিকে ডিফল্ট পোর্ট, 9998 ব্যবহার এবং প্রকাশ করার অনুমতি দিই।


 docker pull apache/tika:<version> docker run -d -p 127.0.0.1:9998:9998 apache/tika:<version>


টিকা কন্টেইনার চলছে এবং পোর্ট 9998 প্রকাশ করেছে তা যাচাই করতে docker ps বা ডকার ডেস্কটপ ব্যবহার করুন।


টেক্সট এক্সট্রাকশন সার্ভার তৈরি করা

এখন যেহেতু টিকা চলছে, আমাদের এমন একটি সার্ভার তৈরি করতে হবে যা প্রোগ্রামেটিকভাবে নতুন বস্তুর জন্য টিকা নিষ্কাশনের অনুরোধ করতে পারে। এর পরে, আমাদের একটি MinIO বালতিতে ওয়েবহুকগুলি কনফিগার করতে হবে যাতে এই সার্ভারটিকে নতুন বস্তুর আগমন সম্পর্কে সতর্ক করা যায় (অন্য কথায়, একটি বালতির জন্য ইভেন্টগুলি রাখুন)৷ এর মধ্যে দিয়ে ধাপে ধাপে হাঁটা যাক।


জিনিসগুলি তুলনামূলকভাবে সহজ রাখতে এবং এই পদ্ধতির বহনযোগ্যতা হাইলাইট করার জন্য, জনপ্রিয় ফ্লাস্ক ফ্রেমওয়ার্ক ব্যবহার করে পাইথনে পাঠ্য নিষ্কাশন সার্ভার তৈরি করা হবে। এখানে সার্ভারের জন্য কোড রয়েছে (এর অধীনে MinIO ব্লগ রিসোর্সেস রিপোজিটরিতেও উপলব্ধ extraction_server.py ) যা টিকা ব্যবহার করে একটি বালতিতে যোগ করা নতুন নথিতে পাঠ্য নিষ্কাশন সম্পাদন করে (এর মাধ্যমে টিকা-পাইথন )


 """ This is a simple Flask text extraction server that functions as a webhook service endpoint for PUT events in a MinIO bucket. Apache Tika is used to extract the text from the new objects. """ from flask import Flask, request, abort, make_response import io import logging from tika import parser from minio import Minio # Make sure the following are populated with your MinIO details # (Best practice is to use environment variables!) MINIO_ENDPOINT = '' MINIO_ACCESS_KEY = '' MINIO_SECRET_KEY = '' # This depends on how you are deploying Tika (and this server): TIKA_SERVER_URL = 'http://localhost:9998/tika' client = Minio( MINIO_ENDPOINT, access_key=MINIO_ACCESS_KEY, secret_key=MINIO_SECRET_KEY, ) logger = logging.getLogger(__name__) app = Flask(__name__) @app.route('/', methods=['POST']) async def text_extraction_webhook(): """ This endpoint will be called when a new object is placed in the bucket """ if request.method == 'POST': # Get the request event from the 'POST' call event = request.json bucket = event['Records'][0]['s3']['bucket']['name'] obj_name = event['Records'][0]['s3']['object']['key'] obj_response = client.get_object(bucket, obj_name) obj_bytes = obj_response.read() file_like = io.BytesIO(obj_bytes) parsed_file = parser.from_buffer(file_like.read(), serverEndpoint=TIKA_SERVER_URL) text = parsed_file["content"] metadata = parsed_file["metadata"] logger.info(text) result = { "text": text, "metadata": metadata } resp = make_response(result, 200) return resp else: abort(400) if __name__ == '__main__': app.run()


এক্সট্রাকশন সার্ভার শুরু করা যাক:



ফ্লাস্ক অ্যাপ্লিকেশনটি যে হোস্টনেম এবং পোর্টে চলছে তা নোট করুন।


বালতি বিজ্ঞপ্তি সেট আপ করা হচ্ছে

এখন, যা বাকি আছে তা হল MinIO সার্ভারে বালতির জন্য ওয়েবহুক কনফিগার করা যাতে বালতিতে থাকা যেকোনো PUT ইভেন্ট (ওরফে, নতুন বস্তু যোগ করা) নিষ্কাশনের শেষ পয়েন্টে একটি কল ট্রিগার করে। mc টুলের সাহায্যে, আমরা মাত্র কয়েকটি কমান্ডে এটি করতে পারি।


প্রথমে, আপনার MinIO সার্ভারে সংকেত দেওয়ার জন্য আমাদের কয়েকটি পরিবেশের ভেরিয়েবল সেট করতে হবে যে আপনি একটি ওয়েবহুক সক্ষম করছেন এবং সংশ্লিষ্ট এন্ডপয়েন্ট কল করা হবে। আপনার পছন্দের একটি ফাংশন নাম দিয়ে <YOURFUNCTIONNAME> প্রতিস্থাপন করুন। সরলতার জন্য, আমি 'নিষ্কাশন' দিয়ে গিয়েছিলাম। এছাড়াও, নিশ্চিত করুন যে এন্ডপয়েন্ট এনভায়রনমেন্ট ভেরিয়েবল আপনার ইনফারেন্স সার্ভারের জন্য সঠিক হোস্ট এবং পোর্টে সেট করা আছে। এই ক্ষেত্রে, http://localhost:5000 যেখানে আমাদের ফ্লাস্ক অ্যাপ্লিকেশন চলছে।


 export MINIO_NOTIFY_WEBHOOK_ENABLE_<YOURFUNCTIONNAME>=on export MINIO_NOTIFY_WEBHOOK_ENDPOINT_<YOURFUNCTIONNAME>=http://localhost:5000


একবার আপনি এই এনভায়রনমেন্ট ভেরিয়েবল সেট করার পরে, শুরু করুন MinIO সার্ভার (বা যদি এটি ইতিমধ্যেই চলমান ছিল, এটি পুনরায় চালু করুন ) নিম্নলিখিত ধাপে, আপনার MinIO সার্ভার স্থাপনের জন্য আমাদের একটি 'অ্যালিয়াস' প্রয়োজন হবে। উপনাম সম্পর্কে আরও জানতে এবং কীভাবে একটি সেট করবেন, দেখুন ডকুমেন্টেশন . এছাড়াও আমরা mc , MinIO ক্লায়েন্ট কমান্ড লাইন টুল ব্যবহার করব, তাই আপনার কাছে এটি আছে তা নিশ্চিত করুন ইনস্টল করা .


এর পরে, আসুন আমাদের বালতির জন্য ইভেন্ট বিজ্ঞপ্তি কনফিগার করি এবং আমরা যে ধরনের ইভেন্ট সম্পর্কে অবহিত হতে চাই। এই প্রকল্পের উদ্দেশ্যে, আমি একটি নতুন বালতি তৈরি করেছি যার নাম ' নিষ্কাশন '। আপনি এটিও করতে পারেন MinIO কনসোলের মাধ্যমে বা mc আদেশ যেহেতু আমরা ' নিষ্কাশন' বালতিতে নতুন বস্তু যোগ করার জন্য ওয়েবহুক ট্রিগার করতে চাই, তাই PUT ইভেন্টগুলি আমাদের ফোকাস। আপনার MinIO সার্ভার স্থাপনার উপনামের সাথে ALIAS এবং সেই সার্ভারে পছন্দসই বালতি দিয়ে BUCKET প্রতিস্থাপন করুন। ঠিক আগের মতই, আপনি আগের ধাপে যে মান ব্যবহার করেছিলেন সেই মান দিয়ে <YOURFUNCTIONNAME> প্রতিস্থাপন করা নিশ্চিত করুন।


 mc event add ALIAS/BUCKET arn:minio:sqs::<YOURFUNCTIONNAME>:webhook --event put


অবশেষে, আপনি এই কমান্ডটি চালানোর সময় s3:ObjectCreated:* আউটপুট হয়েছে কিনা তা যাচাই করে আপনি বালতি বিজ্ঞপ্তিগুলির জন্য সঠিক ইভেন্টের ধরনটি কনফিগার করেছেন কিনা তা পরীক্ষা করতে পারেন:


 mc event ls ALIAS/BUCKET arn:minio:sqs::<YOURFUNCTIONNAME>:webhook


আপনি যদি ওয়েবহুকে বালতি ইভেন্ট প্রকাশ করার বিষয়ে আরও জানতে চান, তাহলে দেখুন ডক umentation পাশাপাশি এই ইভেন্ট বিজ্ঞপ্তির মধ্যে গভীর ডুব . এখন, আমরা আমাদের পাঠ্য নিষ্কাশন সার্ভার চেষ্টা করার জন্য প্রস্তুত।


চেষ্টা কর

এখানে একটি নথি যা থেকে আমি পাঠ্য বের করতে চাই। এটা একটা 2000 সালের কমোডিটিস ফিউচার মডার্নাইজেশন অ্যাক্টের PDF , মার্কিন যুক্তরাষ্ট্রে আর্থিক আইনের একটি প্রভাবশালী অংশ।



আমি MinIO কনসোল ব্যবহার করে এই পিডিএফটি আমার ' এক্সট্রাকশন ' বালতিতে রেখেছি।



এই PUT ইভেন্টটি একটি বালতি বিজ্ঞপ্তি ট্রিগার করে যা তারপর এক্সট্রাকশন সার্ভার এন্ডপয়েন্টে প্রকাশিত হয়। তদনুসারে, পাঠ্যটি টিকা দ্বারা নিষ্কাশন করা হয় এবং কনসোলে প্রিন্ট করা হয়।



পরবর্তী পদক্ষেপ


যদিও আমরা আপাতত এক্সট্রাক্ট করা টেক্সট মুদ্রণ করছি, এই টেক্সটটি অনেক ডাউনস্ট্রিম কাজের জন্য ব্যবহার করা যেত, যেমন The Premise-এ ইঙ্গিত দেওয়া হয়েছে। উদাহরণ স্বরূপ:


  1. এলএলএম ফাইন-টিউনিংয়ের জন্য ডেটাসেট তৈরি : কল্পনা করুন যে আপনি বিভিন্ন ধরনের ফাইল ফরম্যাটে (যেমন, পিডিএফ, ডিওসিএক্স, পিপিটিএক্স, মার্কডাউন, ইত্যাদি) বিদ্যমান কর্পোরেট নথির সংগ্রহে একটি বৃহৎ ভাষার মডেল ফাইন-টিউন করতে চান। এই কাজের জন্য LLM-বান্ধব, পাঠ্য ডেটাসেট তৈরি করতে, আপনি এই সমস্ত নথিগুলিকে একটি অনুরূপ ওয়েবহুকের সাথে কনফিগার করা একটি MinIO বালতিতে সংগ্রহ করতে পারেন এবং প্রতিটি নথির জন্য নিষ্কাশিত পাঠ্যকে ফাইন-টিউনিং/প্রশিক্ষণ সেটের একটি ডেটাফ্রেমে পাস করতে পারেন৷ উপরন্তু, MinIO-তে আপনার ডেটাসেটের সোর্স ফাইলগুলি থাকার মাধ্যমে, আপনার ডেটাসেটগুলির গঠন পরিচালনা, নিরীক্ষণ এবং ট্র্যাক করা আরও সহজ হয়ে যায়।


  2. পুনরুদ্ধার অগমেন্টেড জেনারেশন : আরএজি হল এমন একটি উপায় যা এলএলএম অ্যাপ্লিকেশনগুলি সুনির্দিষ্ট প্রসঙ্গ ব্যবহার করতে পারে এবং হ্যালুসিনেশন এড়াতে পারে। এই পদ্ধতির একটি কেন্দ্রীয় দিক নিশ্চিত করা হচ্ছে আপনার নথির পাঠ্য বের করা যাবে এবং তারপরে ভেক্টরগুলিতে এম্বেড করা যাবে, যার ফলে শব্দার্থিক অনুসন্ধান সক্ষম হবে। উপরন্তু, এই ভেক্টরগুলির প্রকৃত উৎস নথিগুলিকে একটি বস্তুর দোকানে (যেমন MinIO!) সংরক্ষণ করা সাধারণত একটি সর্বোত্তম অনুশীলন। এই পোস্টে বর্ণিত পদ্ধতির সাথে, আপনি সহজেই উভয়ই অর্জন করতে পারেন। আপনি যদি RAG এবং এর সুবিধাগুলি সম্পর্কে আরও জানতে চান তবে এটি দেখুন আগের পোস্ট .


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


এই কাজের জন্য বাকেট নোটিফিকেশনের ইউটিলিটির বাইরেও, MinIO যেকোন ধরনের এবং বস্তুর সংখ্যার জন্য বিশ্ব-মানের ত্রুটি সহনশীলতা এবং কর্মক্ষমতা বহন করার জন্য তৈরি করা হয়েছে- তা পাওয়ারপয়েন্ট, ছবি বা কোড স্নিপেট হোক না কেন।


যদি আপনার কোন প্রশ্ন থাকে আমাদের যোগদান স্ল্যাক চ্যানেল অথবা আমাদের একটি নোট ড্রপ [email protected] . আপনাকে সাহায্য করার জন্য আমরা এইখানে।