paint-brush
চ্যাটজিপিটি, গুগল ক্লাউড এবং পাইথনের সাথে একটি ডকুমেন্ট বিশ্লেষক তৈরি করুনদ্বারা@shanglun
9,140 পড়া
9,140 পড়া

চ্যাটজিপিটি, গুগল ক্লাউড এবং পাইথনের সাথে একটি ডকুমেন্ট বিশ্লেষক তৈরি করুন

দ্বারা Shanglun Wang31m2023/08/05
Read on Terminal Reader
Read this story w/o Javascript

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

আমরা একটি শক্তিশালী AI অ্যাপ্লিকেশন তৈরি করতে ChatGPT, Google Cloud এবং React JS ব্যবহার করি যা যেকোনো ভাষায় নথি বিশ্লেষণ করে এবং নথি সম্পর্কে যেকোনো প্রশ্নের উত্তর দিতে পারে। একইভাবে গবেষক এবং কোডারদের জন্য দুর্দান্ত সম্পদ।
featured image - চ্যাটজিপিটি, গুগল ক্লাউড এবং পাইথনের সাথে একটি ডকুমেন্ট বিশ্লেষক তৈরি করুন
Shanglun Wang HackerNoon profile picture
0-item
1-item

ওপেনএআই যখন সাধারণ জনগণের জন্য ChatGPT প্রকাশ করে, তখন ওপেনএআই-এর কার্যনির্বাহী সহ খুব কম লোকই সাধারণ জনগণের দ্বারা গ্রহণের গতি অনুমান করতে পারে। তারপর থেকে, ChatGPT 100 মিলিয়ন ব্যবহারকারী অর্জনের জন্য দ্রুততম অ্যাপ হিসাবে TikTok-কে সরিয়ে দিয়েছে। জীবনের সকল স্তরের লোকেরা তাদের কার্যকারিতা উন্নত করতে ChatGPT ব্যবহার করার উপায় খুঁজে পেয়েছে এবং কোম্পানিগুলি এর ব্যবহারের জন্য নির্দেশিকা তৈরি করতে ঝাঁকুনি দিয়েছে। অনেক একাডেমিক প্রতিষ্ঠান সহ কিছু সংস্থা, এটির ব্যবহার সম্পর্কে বেশিরভাগই সন্দিহান, যখন প্রযুক্তি কোম্পানিগুলির মতো অন্যান্য সংস্থাগুলি অনেক বেশি উদার নীতি গ্রহণ করেছে, এমনকি ChatGPT API-এর আশেপাশে অ্যাপ্লিকেশন তৈরি করেছে। আজ, আমরা এমন একটি অ্যাপ্লিকেশন তৈরির মাধ্যমে হাঁটব।

নির্ধারিত শ্রোতা

এই নিবন্ধটি তিনটি অংশে বিভক্ত: 1) অ্যাপ্লিকেশনের অন্তর্নিহিত প্রযুক্তির ব্যাখ্যা, 2) অ্যাপ্লিকেশনটির পিছনের অংশ এবং 3) অ্যাপ্লিকেশনটির সামনের প্রান্ত। আপনি যদি কিছু মৌলিক পাইথন কোড পড়তে পারেন, তাহলে আপনি প্রথম দুটি বিভাগ সহজে অনুসরণ করতে সক্ষম হবেন, এবং আপনার যদি React.js-এর সাথে কিছু মৌলিক অভিজ্ঞতা থাকে, আপনি সমস্যা ছাড়াই তৃতীয় বিভাগটি অনুসরণ করতে পারেন।

আবেদনপত্র

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


আমাদের অ্যাপ্লিকেশনটি আমাদের নিষ্পত্তিতে বেশ কয়েকটি AI এবং মেশিন লার্নিং টুল - OCR, মেশিন অনুবাদ এবং বড় ভাষা মডেলগুলিকে একত্রিত করে এই প্রক্রিয়াটিকে আরও সহজ করে তুলবে৷ আমরা OCR ব্যবহার করে একটি PDF থেকে কাঁচা পাঠ্য বিষয়বস্তু বের করব, মেশিন অনুবাদ ব্যবহার করে ইংরেজিতে অনুবাদ করব এবং একটি বড় ভাষা মডেল ব্যবহার করে অনুবাদিত নিষ্কাশন বিশ্লেষণ করব।


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


আপনি যদি এখনই অ্যাপটি তৈরি করতে চান, তাহলে নির্দ্বিধায় পরবর্তী বিভাগটি এড়িয়ে যান। যাইহোক, আপনি যদি এই নিবন্ধে আমরা যে বিভিন্ন প্রযুক্তি ব্যবহার করব সেগুলি সম্পর্কে আরও ভালভাবে বুঝতে চান, পরবর্তী বিভাগে আপনাকে কিছুটা পটভূমি দেওয়া হবে।

অন্তর্নিহিত প্রযুক্তি

আমরা প্রথম যে প্রযুক্তিটি ব্যবহার করব তা হল OCR, বা অপটিক্যাল ক্যারেক্টার রিকগনিশন, যা সাধারণ জনগণের কাছে উপলব্ধ হওয়ার প্রথম দিকের বাণিজ্যিক মেশিন লার্নিং অ্যাপ্লিকেশনগুলির মধ্যে একটি। ওসিআর মডেল এবং অ্যাপ্লিকেশনগুলির লক্ষ্য একটি ছবি বা চিত্র তোলা তারপর চিত্র থেকে পাঠ্য তথ্য সনাক্ত করা এবং বের করা। এটি প্রথমে একটি সহজ কাজ বলে মনে হতে পারে, কিন্তু সমস্যাটি আসলে বেশ জটিল। উদাহরণস্বরূপ, অক্ষরগুলি কিছুটা অস্পষ্ট হতে পারে, এটি একটি ইতিবাচক শনাক্ত করা কঠিন করে তোলে। চিঠিটি একটি অস্বাভাবিক অভিযোজনেও সাজানো হতে পারে, যার অর্থ মেশিন লার্নিং মডেলটিকে উল্লম্ব এবং উল্টোপাল্টা পাঠ সনাক্ত করতে হবে। এই চ্যালেঞ্জ সত্ত্বেও, গবেষকরা অনেক দ্রুত এবং শক্তিশালী ওসিআর মডেল তৈরি করেছেন এবং তাদের অনেকগুলি তুলনামূলকভাবে কম খরচে পাওয়া যায়। আজকের অ্যাপ্লিকেশনের জন্য, আমরা Google এর ক্লাউড ভিশন মডেল ব্যবহার করব, যা আমরা Google Cloud API ব্যবহার করে অ্যাক্সেস করতে পারি।


পরবর্তী প্রযুক্তি আমরা ব্যবহার করব মেশিন অনুবাদ। এটি, OCR এর মত, একটি অত্যন্ত কঠিন মেশিন লার্নিং সমস্যা। মানুষের ভাষা বৈচিত্র্য এবং প্রাসঙ্গিক জটিলতায় পূর্ণ যা কম্পিউটারের জন্য প্রক্রিয়া করা এবং বোঝা বিশেষ করে কঠিন করে তোলে। চীনা এবং ইংরেজির মতো ভিন্ন ভিন্ন ভাষার জোড়ার মধ্যে অনুবাদ বিশেষ করে ভুল এবং হাস্যরসাত্মক ফলাফল দেয় কারণ এই ভাষাগুলির অন্তর্নিহিত ভিন্ন কাঠামোর জন্য ডিজিটাইজেশন এবং এম্বেডিংয়ের জন্য ব্যাপকভাবে ভিন্ন কৌশল প্রয়োজন। যাইহোক, এই চ্যালেঞ্জ সত্ত্বেও, গবেষকরা শক্তিশালী এবং পরিশীলিত মডেল তৈরি করেছেন এবং সেগুলিকে সাধারণভাবে উপলব্ধ করেছেন। আজ, আমরা Google এর অনুবাদ API ব্যবহার করব, যা উপলব্ধ সেরা এবং সর্বাধিক ব্যবহৃত মেশিন অনুবাদ টুলগুলির মধ্যে একটি।


আমরা যে শেষ মেশিন লার্নিং প্রযুক্তিটি ব্যবহার করব তা হল LLM, বা Large Language Model, যা ভোক্তাদের কৃত্রিম বুদ্ধিমত্তার জন্য বিপ্লবী হয়েছে। এলএলএম প্রাকৃতিক মানব ভাষার গঠন বুঝতে সক্ষম, এবং একটি বিশদ এবং তথ্যপূর্ণ প্রতিক্রিয়া তৈরি করতে ডেটার একটি বৃহৎ অংশ আঁকতে সক্ষম। প্রযুক্তির এখনও অনেক সীমাবদ্ধতা রয়েছে, তবে এর নমনীয়তা এবং ডেটা প্রক্রিয়াকরণ ক্ষমতা মডেলটির সাথে জড়িত থাকার জন্য অনেক অভিনব কৌশল তৈরি করতে অনুপ্রাণিত করেছে। এই ধরনের একটি কৌশলকে প্রম্পট ইঞ্জিনিয়ারিং বলা হয়, যেখানে ব্যবহারকারীরা দক্ষতার সাথে শব্দযুক্ত এবং কাঠামোগত ইনপুট বা প্রম্পট তৈরি করে এবং কাঙ্খিত ফলাফল পাওয়ার জন্য মডেলের প্রতি নির্দেশ দেয়। আজকের অ্যাপ্লিকেশনে, আমরা অনুবাদিত প্রতিবেদন বিশ্লেষণ করতে সাহায্য করার জন্য ChatGPT এর API এবং কিছু সহজ প্রম্পট ইঞ্জিনিয়ারিং ব্যবহার করব।

ব্যাকএন্ড

ক্লাউড পরিষেবা সেটআপ

আমরা অ্যাপ্লিকেশন কোডিং শুরু করার আগে, আমাদের প্রথমে পরিষেবাগুলির জন্য সাইন আপ করতে হবে।


যেহেতু ChatGPT-এর API ওয়েবসাইট সর্বদা পরিবর্তিত হয়, আমরা ChatGPT API-এর জন্য সাইন আপ করার জন্য সঠিক পদক্ষেপগুলি প্রদান করতে সক্ষম হব না। যাইহোক, আপনার API ডকুমেন্টেশন ওয়েবসাইটে সহজে অনুসরণযোগ্য নির্দেশাবলী পাওয়া উচিত। আপনি একটি API কী প্রাপ্ত না হওয়া পর্যন্ত কেবল অগ্রগতি করুন, যা আমাদের ChatGPT API কল করতে হবে।


Google ক্লাউড একটু বেশি জটিল, কিন্তু সাইন আপ করাও তুলনামূলকভাবে সহজ। শুধু Google ক্লাউড কনসোলে যান এবং একটি প্রকল্প সেট আপ করার জন্য নির্দেশাবলী অনুসরণ করুন৷ প্রকল্পে একবার, আপনি IAM এবং অ্যাডমিন কনসোলে নেভিগেট করতে এবং একটি পরিষেবা অ্যাকাউন্ট তৈরি করতে চাইবেন। যখন Google ক্লাউড কনসোল সব সময় পরিবর্তিত হয়, আপনি ওয়েবপেজে "IAM" এবং "পরিষেবা অ্যাকাউন্ট" অনুসন্ধান করে ইন্টারফেসটি নেভিগেট করতে সক্ষম হবেন৷ পরিষেবা অ্যাকাউন্ট তৈরি হয়ে গেলে, আপনি আপনার কম্পিউটারে ব্যক্তিগত কী ফাইলের অনুলিপি ডাউনলোড করতে চাইবেন। আপনি ব্যক্তিগত কী স্ট্রিংটিও অনুলিপি করতে চাইবেন, যেহেতু অনুবাদ REST API কী ফাইলের পরিবর্তে ব্যক্তিগত কী স্ট্রিং ব্যবহার করে।


আমরা Google ক্লাউড সেটআপ শেষ করার আগে, আপনি মেশিন ভিশন API সক্ষম করতে চাইবেন, যা আপনি প্রধান কনসোল পৃষ্ঠা থেকে করতে পারেন। শুধু Machine Vision API অনুসন্ধান করুন, Google থেকে পণ্যটিতে ক্লিক করুন এবং API সক্রিয় করুন। আমরা এই প্রকল্পের জন্য যে ডেটা ব্যবহার করতে যাচ্ছি তা ধরে রাখার জন্য আপনি একটি বালতিও তৈরি করতে চাইবেন।

পাইথন সেটআপ

এখন যেহেতু আমরা সঠিক পরিষেবার জন্য সাইন আপ করেছি, আমরা পাইথনে আমাদের অ্যাপ্লিকেশন কোডিং শুরু করতে প্রস্তুত। প্রথম জিনিসগুলি প্রথমে, আমরা আমাদের পাইথন পরিবেশে প্রয়োজনীয় প্যাকেজগুলি ইনস্টল করতে চাই।


Pip install google-cloud-storage google-cloud-vision openai requests


ইনস্টলেশন সম্পূর্ণ হলে, আসুন একটি নতুন ফোল্ডার তৈরি করি, পিডিএফ ফাইল ডাউনলোড করি এবং একই ফোল্ডারে একটি নতুন পাইথন ফাইল তৈরি করি। আমরা একে বলব document_analyze.py. আমরা প্রয়োজনীয় প্যাকেজ আমদানি করে শুরু করি:


 import requests Import openai from google.cloud import vision from google.cloud import storage Import os Import json Import time Import shutil

তারপরে আমরা কিছু মৌলিক সেটআপ করতে পারি যাতে আমাদের অ্যাপ্লিকেশন ক্লাউড পরিষেবাগুলি ব্যবহার করতে পারে যার জন্য আমরা এইমাত্র সাইন আপ করেছি:

 os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = [Path to your Google Cloud key file] openai.api_key = [your openAI API key]

এই শংসাপত্রগুলি জায়গায় রেখে, আপনি এখন আপনার পাইথন স্ক্রিপ্ট থেকে Google ক্লাউড এবং ChatGPT API অ্যাক্সেস করতে সক্ষম হবেন। আমরা এখন ফাংশন লিখতে পারি যা আমাদের অ্যাপের জন্য পছন্দসই কার্যকারিতা প্রদান করবে।

ওসিআর কোড

এখন আমরা কিছু ফাংশন তৈরি করা শুরু করতে পারি যা অ্যাপ্লিকেশনটির বিল্ডিং ব্লক হয়ে উঠবে। OCR ফাংশন দিয়ে শুরু করা যাক:


 # upload the file to google cloud storage bucket for further processing def upload_file(file_name, bucket_name, bucket_path): client = storage.Client() bucket = client.get_bucket(bucket_name) blob = bucket.blob(bucket_path) blob.upload_from_filename(file_name) # kick off the OCR process on the document. This is asynchronous because OCR can take a while def async_detect_document(gcs_source_uri, gcs_destination_uri): client = vision.ImageAnnotatorClient() input_config = vision.InputConfig(gcs_source=vision.GcsSource(uri=gcs_source_uri), mime_type= 'application/pdf') output_config = vision.OutputConfig( gcs_destination=vision.GcsDestination(uri=gcs_destination_uri), batch_size=100 ) async_request = vision.AsyncAnnotateFileRequest( features=[vision.Feature(type_=vision.Feature.Type.DOCUMENT_TEXT_DETECTION)], input_config=input_config, output_config=output_config ) operation = client.async_batch_annotate_files(requests=[async_request]) def check_results(bucket_path, prefix): storage_client = storage.Client() bucket = storage_client.get_bucket(bucket_path) blob_list = list(bucket.list_blobs(prefix=prefix)) blb = [b for b in blob_list if 'output-' in b.name and '.json' in b.name] return len(blb) != 0 # download the OCR result file def write_to_text(bucket_name, prefix): bucket = storage.Client().get_bucket(bucket_name) blob_list = list(bucket.list_blobs(prefix=prefix)) if not os.path.exists('ocr_results'): os.mkdir('ocr_results') for blob in blob_list: if blob.name.endswith('.json'): with open(os.path.join('ocr_results', blob.name), 'w') as fp_data: fp_data.write(blob.download_as_string().decode('utf-8')) def delete_objects(bucket, prefix): bucket = storage.Client().get_bucket(bucket) blob_list = list(bucket.list_blobs(prefix=prefix)) for blob in blob_list: blob.delete() print('Blob', blob.name, 'Deleted')


আসুন প্রতিটি ফাংশন বিস্তারিতভাবে কি করে তা পরীক্ষা করে দেখি।


upload_file ফাংশন হল একটি ফাংশন যা Google ক্লাউড স্টোরেজ কন্টেইনার থেকে একটি বালতি ধরে এবং এতে আপনার ফাইল আপলোড করে। Google ক্লাউডের চমৎকার বিমূর্ততা এই ফাংশনটি লিখতে খুব সহজ করে তোলে।


async_detect_document ফাংশন অ্যাসিঙ্ক্রোনাসভাবে Google ক্লাউডের OCR ফাংশনকে আহ্বান করে। Google ক্লাউডে উপলব্ধ বিকল্পগুলির সংখ্যার কারণে, আমাদের কয়েকটি কনফিগারেশন অবজেক্টকে ইনস্ট্যান্টিয়েট করতে হবে, তবে এটি সত্যিই Google ক্লাউডকে সোর্স ফাইলটি কোথায় এবং আউটপুটটি কোথায় লিখতে হবে তা জানাতে দেয়৷ batch_size ভেরিয়েবলটি 100 এ সেট করা হয়েছে, তাই গুগল ক্লাউড ডকুমেন্টটি একবারে 100 পৃষ্ঠার প্রক্রিয়া করবে। এটি লিখিত আউটপুট ফাইলের সংখ্যা হ্রাস করে, যা প্রক্রিয়াকরণকে সহজ করে তোলে। উল্লেখ্য আরেকটি গুরুত্বপূর্ণ বিষয় হল যে আমন্ত্রণটি অ্যাসিঙ্ক্রোনাস, যার অর্থ প্রক্রিয়াকরণ শেষ হওয়ার জন্য অপেক্ষা করার পরিবর্তে পাইথন স্ক্রিপ্টের সম্পাদন অব্যাহত থাকবে। যদিও এটি এই নির্দিষ্ট পর্যায়ে একটি বড় পার্থক্য করে না, এটি পরে আরও কার্যকর হবে যখন আমরা পাইথন কোডটিকে একটি ওয়েব API এ পরিণত করব।


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


write_to_text ফাংশন পরবর্তী প্রক্রিয়াকরণের জন্য ফলাফল ফাইল(গুলি) ডিস্কে ডাউনলোড করে। ফাংশনটি একটি নির্দিষ্ট উপসর্গ সহ আপনার বালতির সমস্ত ফাইলের উপর পুনরাবৃত্তি করবে, আউটপুট স্ট্রিং পুনরুদ্ধার করবে এবং স্থানীয় ফাইল সিস্টেমে ফলাফল লিখবে।


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


এখন যেহেতু আমরা OCR আমন্ত্রণগুলি সম্পন্ন করেছি, আসুন মেশিন অনুবাদ কোডটি দেখি!

মেশিন অনুবাদ কোড

এখন আমরা অনুবাদ ফাংশন সংজ্ঞায়িত করতে পারি:


 # detect the language we're translating from def detect_language(text): url = 'https://translation.googleapis.com/language/translate/v2/detect' data = { "q": text, "key": [your google cloud API key] } res = requests.post(url, data=data) return res.json()['data']['detections'][0][0]['language'] # translate the text def translate_text(text): url = 'https://translation.googleapis.com/language/translate/v2' language = detect_language(text) if language == 'en': return text data = { "q": text, "source": language, "target": "en", "format": "text", "key": [your google cloud API key] } res = requests.post(url, data=data) return res.json()['data']['translations'][0]['translatedText']


এই ফাংশন বরং সহজবোধ্য. detect_language ফাংশন পরবর্তী translate_text কলের উৎস ভাষা নির্ধারণ করতে ভাষা সনাক্তকরণ API-কে কল করে। যদিও আমরা জানি যে পিডিএফ জাপানি ভাষায় লেখা, তবুও ভাষা সনাক্তকরণ চালানোর জন্য এটি সর্বোত্তম অনুশীলন যাতে অ্যাপ্লিকেশনটি অন্যান্য ভাষা পরিচালনা করতে পারে। translate_text ফাংশনটি শুধুমাত্র Google Translation API ব্যবহার করে শনাক্ত করা উৎস ভাষা থেকে ইংরেজিতে টেক্সট অনুবাদ করে, যদিও, যদি এটি নির্ধারণ করে যে উৎস ভাষাটি ইতিমধ্যেই ইংরেজি, তাহলে এটি অনুবাদটি এড়িয়ে যাবে।

চ্যাটজিপিটি কোড এবং প্রম্পট ইঞ্জিনিয়ারিং

সবশেষে, আমাদের কাছে ChatGPT-এর আহ্বান রয়েছে:

 def run_chatgpt_api(report_text): completion = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "user", "content": ''' Consider the following report: --- %s --- 1. Summarize the purpose of the report. 2. Summarize the primary conclusion of the report. 3. Summarize the secondary conclusion of the report 4. Who is the intended audience for this report? 5. What other additional context would a reader be interested in knowing? Please reply in json format with the keys purpose, primaryConclusion, secondaryConclusion, intendedAudience, and additionalContextString. ''' % report_text}, ] ) return completion.choices[0]['message']['content']


লক্ষ্য করুন যে পাইথন কলটি একটি আপেক্ষিক সাধারণ API কল, তবে প্রম্পটটি নির্দিষ্ট ফলাফল তৈরি করার উপায়ে লেখা হয়েছে:


  1. প্রম্পটটি প্রসঙ্গ হিসাবে প্রতিবেদনের পাঠ্য সরবরাহ করে, তাই ChatGPT সহজেই প্রতিবেদনটি বিশ্লেষণ করতে পারে। পাঠ্যটি ড্যাশ লাইন ব্যবহার করে সীমাবদ্ধ করা হয়েছে, যাতে প্রতিবেদনটি কোথায় শেষ হয় এবং প্রশ্নগুলি কোথায় শুরু হয় তা সনাক্ত করা সহজ করে তোলে।

  2. প্রশ্নগুলি অনুচ্ছেদ বিন্যাসে উল্লেখ না করে গণনা করা হয়। প্রতিক্রিয়া তাই অনুরূপ কাঠামো অনুসরণ করতে পারে. ChatGPT অনুচ্ছেদ বিন্যাসে উত্তর দেওয়ার চেয়ে গণনা করা কাঠামো কোডের সাথে পার্স করা ফলাফলটিকে অনেক সহজ করে তোলে।

  3. প্রম্পট উত্তরের বিন্যাস নির্দিষ্ট করে, এই ক্ষেত্রে JSON বিন্যাস। JSON ফর্ম্যাট কোডের সাথে প্রক্রিয়া করা খুব সহজ।

  4. প্রম্পট JSON অবজেক্টের কীগুলি নির্দিষ্ট করে এবং এমন কীগুলি বেছে নেয় যা প্রশ্নগুলির সাথে যুক্ত করা খুব সহজ।

  5. কীগুলি একটি সাধারণভাবে ব্যবহৃত কনভেনশন (camelCase) ব্যবহার করে যা ChatGPT-কে চিনতে হবে। JSON কীগুলি সংকোচনের পরিবর্তে সম্পূর্ণ শব্দ। এটি আরও সম্ভাবনা তৈরি করে যে ChatGPT প্রতিক্রিয়াতে আসল কী ব্যবহার করবে, কারণ ChatGPT এর প্রক্রিয়াকরণের অংশ হিসাবে "বানান সংশোধন" করার অভ্যাস রয়েছে।

  6. অতিরিক্ত কনটেক্সটস্ট্রিং অতিরিক্ত তথ্য পাস করার জন্য ChatGPT-এর জন্য একটি আউটলেট প্রদান করে। এটি বড় ভাষা মডেলের ফ্রিফর্ম বিশ্লেষণ ক্ষমতার সুবিধা নেয়।

  7. প্রম্পটটি প্রায়শই হাতে থাকা বিষয়ের প্রযুক্তিগত আলোচনায় পাওয়া বাক্যাংশ ব্যবহার করে। আপনি API কলের কাঠামো থেকে অনুমান করতে পারেন, ChatGPT-এর "সত্য" লক্ষ্য হল প্রম্পটের উত্তর দেওয়া নয়, বরং একটি সংলাপের পরবর্তী লাইনের পূর্বাভাস দেওয়া।

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


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

সবগুলোকে একত্রে রাখ

এখন সব একসাথে করা যাক. আপনি যদি পূর্ববর্তী বিভাগটি অনুসরণ করেন তবে নীচের কোড ব্লকটি বোঝার জন্য মোটামুটি সহজবোধ্য হওয়া উচিত।


 bucket = [Your bucket name] upload_file_name = [the name of the PDF in the Google Cloud bucket] upload_prefix = [the prefix to use for the analysis results] pdf_to_analyze = [path to the PDF to analyze] upload_file(pdf_to_analyze, bucket, upload_file_name) async_detect_document(f'gs://{bucket}/{upload_file_name}', f'gs://{bucket}/{upload_prefix}') while not check_results(bucket, upload_prefix): print('Not done yet... checking again') time.sleep(5) If __name__ == '__main__': write_to_text(bucket, upload_prefix) all_responses = [] for result_json in os.listdir('ocr_results'): with open(os.path.join('ocr_results', result_json)) as fp_res: response = json.load(fp_res) all_responses.extend(response['responses']) texts = [a['fullTextAnnotation']['text'] for a in all_responses] translated_text = [translate_text(t) for t in texts] print('Running cleanup...') delete_objects(bucket, upload_file_name) delete_objects(bucket, upload_prefix) shutil.rmtree('ocr_results') print('Running Analysis...') analysis = run_chatgpt_api('\n'.join(translated_text)) print('=== purpose ====') print(analysis_res['purpose']) print() print('==== primary conclusion =====') print(analysis_res['primaryConclusion']) print() print('==== secondary conclusion =====') print(analysis_res['secondaryConclusion']) print() print('==== intended audience ====') print(analysis_res['intendedAudience']) print() print('===== additional context =====') print(analysis_res['additionalContextString'])


আমরা রিপোর্টটি বালতিতে আপলোড করি, OCR চালু করি এবং OCR শেষ হওয়ার জন্য অপেক্ষা করি। তারপরে আমরা ওসিআর ফলাফল ডাউনলোড করি এবং একটি তালিকায় রাখি। আমরা ফলাফলের তালিকা অনুবাদ করি এবং বিশ্লেষণের জন্য ChatGPT-এ পাঠাই এবং বিশ্লেষণের ফলাফল প্রিন্ট আউট করি।


কারণ AI সরঞ্জামগুলি নির্ধারক নয়, আপনি যদি এই কোডটি চালান তবে সম্ভবত আপনি একই রকম তবে অভিন্ন ফলাফল পাবেন না। যাইহোক, উপরে লিঙ্ক করা পিডিএফ ব্যবহার করে আমি আউটপুট হিসাবে যা পেয়েছি তা এখানে:


 Not done yet... checking again Not done yet... checking again Running cleanup... Blob [pdf name] Deleted Blob [OCR Output Json] Deleted Running Analysis... === purpose ==== The purpose of the report is to analyze the current status and issues of Japan's research capabilities, discuss the government's growth strategy and investment in science and technology, and introduce the initiatives towards realizing a science and technology nation. ==== primary conclusion ===== The primary conclusion of the report is that Japan's research capabilities, as measured by publication index, have been declining internationally, raising concerns about a decline in research capabilities. ==== secondary conclusion ===== The secondary conclusion of the report is that the Kishida Cabinet's growth strategy emphasizes becoming a science and technology nation and strengthening investment in people to achieve growth and distribution. ==== intended audience ==== The intended audience for this report is government officials, policymakers, researchers, and anyone interested in Japan's research capabilities and science and technology policies. ===== additional context ===== The report focuses on the importance of science, technology, and innovation for Japan's future development and highlights the government's efforts to promote a 'new capitalism' based on a virtuous cycle of growth and distribution. It also mentions the revision to the Basic Law on Science, Technology, and Innovation, the 6th Science, Technology, and Innovation Basic Plan, and the concept of Society 5.0 as the future society Japan aims for. The report suggests that comprehensive knowledge is necessary to promote science, technology, and innovation and emphasizes the importance of transcending disciplinary boundaries and utilizing diverse knowledge.


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


সম্পূর্ণ ব্যাকএন্ড কোড আমার GitHub এ পাওয়া যাবে

ফ্রন্টএন্ড

আমরা ইতিমধ্যে একটি শক্তিশালী অ্যাপ তৈরি করেছি, কিন্তু বর্তমান আকারে ব্যবহারকারীকে অ্যাপ্লিকেশনটিকে সম্পূর্ণরূপে ব্যবহার করার জন্য পাইথনের কিছুটা জানতে হবে। আপনার যদি এমন একজন ব্যবহারকারী থাকে যিনি কোনো কোড পড়তে বা লিখতে চান না? সেই ক্ষেত্রে, আমরা এই টুলটিকে ঘিরে একটি ওয়েব অ্যাপ্লিকেশন তৈরি করতে চাই, যাতে লোকেরা ব্রাউজারের আরাম থেকে AI এর সম্পূর্ণ শক্তি অ্যাক্সেস করতে পারে।

প্রতিক্রিয়া অ্যাপ্লিকেশন ভারা

একটি প্রতিক্রিয়া অ্যাপ্লিকেশন তৈরি করে শুরু করা যাক। নিশ্চিত করুন যে নোড ইনস্টল করা আছে, ফোল্ডারে নেভিগেট করুন যেখানে আপনি অ্যাপ্লিকেশন কোডটি লাইভ করতে চান এবং ক্রিয়েট-রিঅ্যাক্ট-অ্যাপ স্ক্রিপ্ট চালান এবং কিছু মৌলিক প্যাকেজ ইনস্টল করুন:


npx create-react-app llm-frontend


এবং তারপর:


 cd llm-frontend npm install bootstrap react-bootstrap axios


আমরা যদি একটি পূর্ণাঙ্গ অ্যাপ্লিকেশন তৈরি করি তবে আমরা রাষ্ট্র পরিচালনা এবং রাউটিং পরিচালনা করার জন্য প্যাকেজগুলিও ইনস্টল করতে চাই, তবে এটি এই নিবন্ধের সুযোগের বাইরে। আমরা সহজভাবে App.jsx ফাইলে সম্পাদনা করব।


ডেভেলপমেন্ট সার্ভার শুরু করতে npm run start করুন এবং আপনার ব্রাউজারে http://localhost:3000 এ একটি পেজ খুলতে হবে। সেই পৃষ্ঠাটি রাখুন এবং আপনার প্রিয় পাঠ্য সম্পাদকে App.jsx ফাইলটি খুলুন। আপনি এই মত কিছু দেখতে হবে:


 import logo from './logo.svg'; import './App.css'; function App() { return ( <div className="App"> <header className="App-header"> <img src={logo} className="App-logo" alt="logo" /> <p> Edit <code>src/App.js</code> and save to reload. </p> <a className="App-link" href="https://reactjs.org" target="_blank" rel="noopener noreferrer" > Learn React </a> </header> </div> ); } export default App;


এগিয়ে যান এবং বয়লারপ্লেট কোড মুছে দিন এবং কিছু মৌলিক বুটস্ট্র্যাপ উপাদান দিয়ে প্রতিস্থাপন করুন।


 import React, {useState, useEffect} from 'react'; Import axios from 'axios'; import Container from 'react-bootstrap/Container'; import Row from 'react-bootstrap/Row'; import Col from 'react-bootstrap/Col'; import 'bootstrap/dist/css/bootstrap.min.css'; function App() { return ( <Container> <Row> <Col md={{ span: 10, offset: 1 }}> Main Application Here </Col> </Row> </Container> ); } export default App;


অ্যাপটি সংরক্ষণ করুন, এবং আপনি এটি ব্রাউজারে আপডেট দেখতে পাবেন। এটি এখন বেশ বিরল দেখাবে, তবে চিন্তার কিছু নেই, আমরা শীঘ্রই এটি ঠিক করব।

অ্যাপ্লিকেশন উপাদান

এই অ্যাপ্লিকেশনটি কাজ করার জন্য, আমাদের চারটি প্রধান উপাদানের প্রয়োজন হবে: ফাইল আপলোড করার জন্য একটি ফাইল নির্বাচক, অনুবাদ এবং সারাংশ প্রদর্শনের জন্য একটি ফলাফল প্রদর্শন, একটি পাঠ্য ইনপুট যাতে ব্যবহারকারী তাদের নিজস্ব প্রশ্ন জিজ্ঞাসা করতে পারে, এবং একটি ফলাফল প্রদর্শনের জন্য ব্যবহারকারীর প্রশ্নের উত্তর।


আমরা সহজ উপাদানগুলি তৈরি করতে পারি এবং আপাতত আরও জটিল ইন্টারফেসের জন্য স্থানধারক রাখতে পারি। আমরা এটিতে থাকাকালীন, আসুন আমরা ইন্টারফেসটিকে পাওয়ার জন্য ব্যবহার করব এমন ডেটা কন্টেইনারগুলি তৈরি করি:


 import React, {useState, useEffect} from 'react'; import axios from 'axios'; import Container from 'react-bootstrap/Container'; import Row from 'react-bootstrap/Row'; import Col from 'react-bootstrap/Col'; import Button from 'react-bootstrap/Button'; import Accordion from 'react-bootstrap/Accordion'; import Form from 'react-bootstrap/Form'; import ListGroup from 'react-bootstrap/ListGroup'; import 'bootstrap/dist/css/bootstrap.min.css'; const ResultDisplay = ({ initialAnalysis, userQuestion, setUserQuestion, userQuestionResult, userQuestionMessage, userQuestionAsked }) => { return <Row> <Col> <Row style={{marginTop: '10px'}}> <Col md={{ span: 10, offset: 1 }}> <Accordion defaultActiveKey="0"> <Accordion.Item eventKey="0"> <Accordion.Header>Analysis Result</Accordion.Header> <Accordion.Body> {initialAnalysis.analysis} </Accordion.Body> </Accordion.Item> <Accordion.Item eventKey="1"> <Accordion.Header>Raw Translated Text</Accordion.Header> <Accordion.Body> {initialAnalysis.translatedText} </Accordion.Body> </Accordion.Item> <Accordion.Item eventKey="2"> <Accordion.Header>Raw Source Text</Accordion.Header> <Accordion.Body> {initialAnalysis.rawText} </Accordion.Body> </Accordion.Item> </Accordion> </Col> </Row> <Row style={{marginTop: '10px'}}> <Col md={{ span: 8, offset: 1 }}> <Form.Control type="text" placeholder="Additional Questions" value={userQuestion} onChange={e => setUserQuestion(e.target.value)} /> </Col> <Col md={{ span: 2 }}> <Button variant="primary">Ask</Button> </Col> </Row> <Row><Col>{userQuestionMessage}</Col></Row> <Row style={{marginTop: '10px'}}> <Col md={{span: 10, offset: 1}}> {userQuestionResult && userQuestionAsked ? <ListGroup> <ListGroup.Item> <div><b>Q:</b> {userQuestionAsked}</div> <div><b>A:</b> {userQuestionResult}</div></ListGroup.Item> </ListGroup>: ''} </Col> </Row> </Col> </Row> } function App() { const [file, setFile] = useState(null); const [haveFileAnalysisResults, setHaveFileAnalysisResults] = useState(false); const [message, setMessage] = useState(''); const [userQuestionMessage, setUserMessage] = useState(''); const [initialAnalysis, setInitialAnalysis] = useState({analysis: '', translatedText: '', rawText: ''}); const [userQuestion, setUserQuestion] = useState(''); const [userQuestionResult, setUserQuestionResult] = useState(''); const [userQuestionAsked, setUserQuestionAsked] = useState(''); return ( <Container> <Row> <Col md={{ span: 8, offset: 1 }}> <Form.Group controlId="formFile"> <Form.Label>Select a File to Analyze</Form.Label> <Form.Control type="file" onChange={e => setFile(e.target.files[0])} /> </Form.Group> </Col> <Col md={{span: 2}}> <div style={{marginTop: '30px'}}><Button variant="primary" >Analyze</Button></div> </Col> <Col md={12}>{message}</Col> </Row> {haveFileAnalysisResults? <ResultDisplay initialAnalysis={initialAnalysis} userQuestion={userQuestion} setUserQuestion={setUserQuestion} userQuestionResult={userQuestionResult} userQuestionMessage={userQuestionMessage} userQuestionAsked={userQuestionAsked} />: ''} </Container>); }


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


ফাইলটি সংরক্ষণ করুন, এবং ফাইল আপলোড ইন্টারফেস দেখানোর জন্য আপনার ব্রাউজার আপডেট দেখতে হবে।

ভেরিয়েবলের সাথে খেলুন এবং আপনার এই মত একটি ইন্টারফেস দেখতে হবে। এটি আমাদের অ্যাপ্লিকেশনের ফ্রন্টএন্ড ইন্টারফেস হবে।


এখন যেহেতু আমরা বেসিক ফ্রন্টএন্ড ইন্টারফেস লিখেছি, চলুন এমন ফাংশনগুলি লিখি যা অ্যাপ্লিকেশনটিকে আমাদের (এখনও লিখিত নয়) API এর সাথে সংযুক্ত করবে। এই ফাংশনগুলি সমস্ত অ্যাপ অবজেক্টে সংজ্ঞায়িত করা হবে যাতে এটি সমস্ত প্রতিক্রিয়া হুকগুলিতে অ্যাক্সেস পাবে। আপনি যদি সম্পূর্ণরূপে নিশ্চিত না হন যে এই ফাংশনগুলি কোথায় যাবে, আপনি GitHub- এ হোস্ট করা সম্পূর্ণ কোডটি উল্লেখ করতে পারেন।


প্রথমে, ব্যবহারকারীর কাছে বার্তা পাঠানোর জন্য কয়েকটি ইউটিলিটি ফাংশন লিখি।


 const flashMessageBuilder = (setMessage) => (message) => { setMessage(message); setTimeout(() => { setMessage(''); }, (5000)); } const flashMessage = flashMessageBuilder(setMessage); const flashUserQuestionMessage = flashMessageBuilder(setUserQuestionMessage);


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


এর পরে, ফাইলটি বিশ্লেষণ করার জন্য ফাংশনগুলি লিখি এবং ফলাফলগুলি পরীক্ষা করি৷


 const pollForResults = (batchId) => { flashMessage('Checking for results...'); return new Promise((resolve, reject) => { setTimeout(() => { axios.post('http://localhost:5000/check_if_finished', {batchId}) .then(r => r.data) .then(d => { // the result should have a "status" key and a "result" key. if (d.status === 'complete') { resolve(d); // we're done! } else { resolve(pollForResults(batchId)); // wait 5 seconds and try again. } }).catch(e => reject(e)); }, 5000); }) } const analyzeFile = () => { if (file === null) { flashMessage('No file selected!'); return; } flashMessage('Uploading file...'); const formData = new FormData(); formData.append("file", file); axios.post("http://localhost:5000/analyze_file", formData, { headers: { 'Content-Type': 'multipart/form-data' } }).then(r => r.data) .then(d => { // the result should contain a batchId that we use to poll for results. flashMessage('File upload success, waiting for analysis results...'); return pollForResults(d.batchId); }) .then(({analysis, translatedText, rawText}) => { // the result should contain the initial analysis results with the proper format. setInitialAnalysis({analysis, translatedText, rawText}); setHaveFileAnalysisResults(true); // show the results display now that we have results }) .catch(e => { console.log(e); flashMessage('There was an error with the upload. Please check the console for details.'); }) }


আবার ফাংশন একটি চমত্কার সহজ সেট. analyzeFile ফাংশন বিশ্লেষণের জন্য ফাইলটিকে analyze_file এন্ডপয়েন্টে পাঠায়। API এটিকে একটি ব্যাচ আইডি দেবে যা এটি pollForResults ফাংশনের সাথে ফলাফল পরীক্ষা করতে ব্যবহার করে। pollForResults ফাংশন check_if_finished এন্ডপয়েন্টে আঘাত করবে এবং বিশ্লেষণ শেষ হলে ফলাফল ফেরত দেবে এবং বিশ্লেষণটি এখনও প্রক্রিয়াধীন থাকলে 5 সেকেন্ড অপেক্ষা করুন। বিশ্লেষণ ফাইল "থ্রেড" তারপরে কার্যকর করা চালিয়ে যাবে, ডেটাগুলিকে উপযুক্ত জায়গায় রেখে।


সবশেষে, আসুন ফাংশনটি লিখি যা ব্যবহারকারীকে ফ্রিফর্ম প্রশ্ন জিজ্ঞাসা করতে দেয়:


 const askUserQuestion = () => { flashUserQuestionMessage('Asking user question...') axios.post('http://localhost:5000/ask_user_question', { text: initialAnalysis.translatedText, userQuestion }).then(r => r.data) .then(d => { setUserQuestionResult(d.result); setUserQuestionAsked(userQuestion); }).catch(e => { console.log(e); flashUserQuestionMessage('There was an issue asking the question. Please check the console for details'); }); }


আবার, একটি মোটামুটি সহজ ফাংশন. আমরা ব্যবহারকারীর প্রশ্নের সাথে অনুবাদিত পাঠ্য সরবরাহ করি যাতে আমাদের API ChatGPT প্রম্পট তৈরি করতে পারে। ফলাফল তারপর প্রদর্শনের জন্য উপযুক্ত ডেটা পাত্রে ধাক্কা দেওয়া হয়।


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


 <Accordion.Item eventKey="0"> <Accordion.Header>Analysis Result</Accordion.Header> <Accordion.Body> <h6>Purpose</h6> <p>{analysis.purpose}</p> <h6>Primary Conclusion</h6> <p>{analysis.primaryConclusion}</p> <h6>Secondary Conclusion</h6> <p>{analysis.secondaryConclusion}</p> <h6>Intended Audience</h6> <p>{analysis.intendedAudience}</p> <h6>Additional Context</h6> <p>{analysis.additionalContextString}</p> </Accordion.Body> </Accordion.Item>


এখন ফ্রন্টএন্ড হয়ে গেছে, আসুন আমাদের পাইথন কোডে যাই এবং ব্যাকএন্ড তৈরি করি।

ফ্লাস্ক API

প্রথমে, চলুন ফ্লাস্ক ইনস্টল করি, যা আমরা আমাদের ব্যাকএন্ড লিখতে ব্যবহার করব।


Pip install flask flask-cors


ফ্লাস্ক ওয়েব অ্যাপ্লিকেশন এবং ওয়েব API তৈরির জন্য একটি সহজ কাঠামো। ইন্টারফেস অবিশ্বাস্যভাবে সহজ, এবং একটি সার্ভার চালানোর মতো সহজ:


 from flask import Flask, request, jsonify from flask_cors import CORS app = Flask(__name__) CORS(app) @app.route('/') def hello_world(): return "Hello from flask!" if __name__ == '__main__': app.run(debug=True)


এই ফাইলটি চালান এবং আপনার ব্রাউজারে http://localhost:5000-এ নেভিগেট করুন এবং আপনার দেখতে হবে “Hello from Flask!” বার্তা


এখন আমরা API কার্যকারিতা তৈরি করা শুরু করতে পারি। আসুন প্রয়োজনীয় ফাংশন আমদানি করে এবং কিছু ধ্রুবক সংজ্ঞায়িত করে শুরু করি:


 from flask import Flask, request, jsonify from flask_cors import CORS import uuid import os import json from document_analyze import upload_file, async_detect_document, check_results, \ write_to_text, translate_text, delete_objects, run_chatgpt_api,\ ask_chatgpt_question app = Flask(__name__) CORS(app) BUCKET = '[YOUR BUCKET NAME]'


এই কোডটি অনুমান করে যে আপনার সার্ভার কোডটি document_analyze.py ফাইলের মতো একই ফোল্ডারে রয়েছে যা আমরা আগে লিখেছিলাম, তবে আপনি আপনার পছন্দের যেকোন ডিরেক্টরি কাঠামো বেছে নিতে পারেন, যতক্ষণ না সার্ভার কোডটি document_analyze.py থেকে খুঁজে পেতে এবং আমদানি করতে পারে৷ ফাইল আপলোড এন্ডপয়েন্টের জন্য হ্যান্ডলার লিখি:


 @app.route('/analyze_file', methods=['POST']) def analyze_file(): file_to_analyze = request.files['file'] batch_name = str(uuid.uuid4()) local_file_path = 'uploads/%s.pdf' % batch_name cloud_file_path = '%s.pdf' % batch_name file_to_analyze.save(local_file_path) upload_file(local_file_path, BUCKET, cloud_file_path) async_detect_document( f'gs://{BUCKET}/{cloud_file_path}', f'gs://{BUCKET}/{batch_name}') return jsonify({ 'batchId': batch_name })


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


এখন হ্যান্ডলার লিখি যা অ্যাপটিকে বিশ্লেষণ শেষ হয়েছে কিনা তা পরীক্ষা করতে দেয়।


 @app.route('/check_if_finished', methods=['POST']) def check_if_finished(): batch_name = request.json['batchId'] if not check_results(BUCKET, batch_name): return jsonify({ 'status': 'processing' }) write_to_text(BUCKET, batch_name) all_responses = [] for result_json in os.listdir('ocr_results'): if result_json.endswith('json') and result_json.startswith(batch_name): result_file = os.path.join('ocr_results', result_json) with open(os.path.join('ocr_results', result_json)) as fp_res: response = json.load(fp_res) all_responses.extend(response['responses']) os.remove(result_file) txts = [a['fullTextAnnotation']['text'] for a in all_responses] translated_text = [translate_text(t) for t in txts] print('Running cleanup...') delete_objects(BUCKET, batch_name) os.remove('uploads/%s.pdf' % batch_name) analysis = run_chatgpt_api('\n'.join(translated_text)) analysis_res = json.loads(analysis) return jsonify({ 'status': 'complete', 'analysis': analysis, 'translatedText': translated_text, 'rawText': '\n'.join(txts) })


আবার এই বেশ পরিচিত দেখতে হবে. আমরা প্রথমে OCR সম্পন্ন হয়েছে কিনা তা পরীক্ষা করি, এবং যদি OCR সম্পন্ন না হয়, আমরা কেবল একটি বার্তা ফেরত দিই যে ব্যাচটি এখনও প্রক্রিয়া করা হচ্ছে। OCR সম্পন্ন হলে, আমরা বিশ্লেষণ চালিয়ে যাই, OCR ফলাফল ডাউনলোড করে অনুবাদ এবং ChatGPT পাইপলাইন চালাই। অপ্রয়োজনীয় স্টোরেজ খরচ এড়াতে আমরা বিশ্লেষণ করার পরে সোর্স ফাইলগুলি পরিষ্কার করার বিষয়টিও নিশ্চিত করি। আমরা ফলাফলটিকে চূড়ান্ত ফলাফল অবজেক্টে প্যাকেজ করি, যেটিতে ChatGPT বিশ্লেষণ JSON, অনুবাদিত পাঠ্য এবং OCR দ্বারা নিষ্কাশিত কাঁচা পাঠ রয়েছে।


যদিও কাস্টম প্রশ্ন ব্যাকএন্ড একটি নতুন বৈশিষ্ট্য, এটি মোটামুটি সোজা। প্রথমে আমরা একটি কাস্টম প্রশ্ন জিজ্ঞাসা করার জন্য ফাংশনটি সংজ্ঞায়িত করতে চাই:


 def ask_chatgpt_question(report_text, question_text): completion = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "user", "content": ''' Consider the following report: --- %s --- Answer the following question: %s ''' % (report_text, question_text)}, ] ) return completion.choices[0]['message']['content']


এখন আমরা ফাংশন আমদানি করতে পারি এবং API শেষ বিন্দু সংজ্ঞায়িত করতে পারি:


 @app.route('/ask_user_question') def ask_user_question(): report_text = request.json['text'] user_question = request.json['userQuestion'] response = ask_chatgpt_question(report_text, user_question) return jsonify({ 'result': response })


এখন যেহেতু আমরা আমাদের API লিখেছি, আসুন ফ্রন্টএন্ড থেকে এটি পরীক্ষা করি। এগিয়ে যান এবং ফ্রন্টএন্ডের মাধ্যমে ফাইলটি আপলোড করুন। আপনি এই মত কিছু দেখতে হবে:

ফাইল আপলোড করার পরে এবং বিশ্লেষণ বোতাম টিপুন


কিছুক্ষণ অপেক্ষা করুন, এবং আপনি WebApp-এ ফলাফল দেখতে পাবেন।

ভিত্তি ফলাফল

চারপাশে তাকান এবং আপনি অনুবাদিত পাঠ্যটিও দেখতে পাবেন:

অনুবাদিত পাঠ্য

এবং কাঁচা উত্স পাঠ্য:

কাঁচা লেখা

এখন কাস্টম প্রশ্ন ইন্টারফেস পরীক্ষা করা যাক:

নথি সম্পর্কে একটি প্রশ্ন জিজ্ঞাসা

খুব সুন্দর! এর সাথে, আমরা সফলভাবে আমাদের AI সরঞ্জামগুলির চারপাশে একটি React.js অ্যাপ্লিকেশন তৈরি করেছি!

উপসংহার

আজকের নিবন্ধে, আমরা একটি অ্যাপ্লিকেশন তৈরি করেছি যা বর্তমানে বাজারে থাকা সবচেয়ে শক্তিশালী AI সরঞ্জামগুলির সুবিধা দেয়৷ যদিও এই নির্দিষ্ট অ্যাপ্লিকেশনটি বিদেশী ভাষার PDF গুলিকে পার্সিং এবং সংক্ষিপ্ত করার জন্য প্রস্তুত, একই ধরনের কৌশলগুলি অনেক ক্ষেত্রে শক্তিশালী বিপ্লবী অ্যাপ্লিকেশন বিকাশের জন্য অভিযোজিত হতে পারে।


আমি আশা করি এই নিবন্ধটি আপনাকে আপনার নিজস্ব AI-চালিত অ্যাপ্লিকেশন লিখতে অনুপ্রাণিত করেছে। আপনি যদি এআই অ্যাপ্লিকেশানগুলিতে আপনার দৃষ্টিভঙ্গি সম্পর্কে আমার সাথে যোগাযোগ করতে এবং আমার সাথে কথা বলতে চান তবে আমি আপনার কাছ থেকে শুনতে চাই। আপনি যদি একটি অনুরূপ অ্যাপ তৈরি করতে চান, তাহলে নির্দ্বিধায় আমার গিথুব পৃষ্ঠায় হোস্ট করা কোডটি পড়ুন যেখানে আপনি ফ্রন্টএন্ড এবং ব্যাকএন্ডের জন্য সংগ্রহস্থলগুলি খুঁজে পেতে পারেন


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


অনুগ্রহ করে একটি ফলো-আপ নিবন্ধের সন্ধানে থাকুন, যেখানে আমরা আমাদের নিজস্ব একটি এলএলএম উদাহরণ তৈরি এবং চালাই। নিবন্ধটি প্রকাশিত হলে, আমরা এখানে নিবন্ধটির একটি লিঙ্ক প্রকাশ করব। সাথে থাকুন!