پچھلے 10 سالوں میں، ہم نے ترجمہ ٹیکنالوجی میں زبردست ترقی دیکھی ہے۔ ہم روبوٹک ترجمے سے ایک ایسے نظام میں چلے گئے ہیں جو نہ صرف ایک جملے کے ہر لفظ کے معنی کو سمجھتا ہے بلکہ یہ بھی سمجھتا ہے کہ وہ لفظ پورے جملے کے سیاق و سباق میں کیسے فٹ بیٹھتا ہے۔
مثال کے طور پر، موجودہ ترجمے کے نظام جانتے ہیں کہ اس طرح کے جملے میں "بینک” کے معنی کو کس طرح الگ کرنا ہے:
جوابات میں شامل ہیں، "میں آج بینک ڈپازٹ نہیں کر سکتا،” اور "آئیے دریا کے کنارے ملتے ہیں۔”
دونوں جملے "بینک” پر مشتمل ہیں لیکن ان کے مختلف معنی ہیں۔
تو ہم یہاں کیسے پہنچے؟ یہ بڑے پیمانے پر انقلاب جون 2017 میں شروع ہوا، جب گوگل کے آٹھ محققین کی ایک ٹیم، جسے "ایٹ سامورائی” کے نام سے جانا جاتا ہے، ایک تحقیقی مقالہ شائع کیا جس کا عنوان تھا "توجہ صرف آپ کی ضرورت ہے۔” یہ تاریخ جدید AI سسٹمز اور فن تعمیر کے لیے ایک اہم موڑ کی نشاندہی کرتی ہے۔
سیاق و سباق کے لیے، یہ فریم ورک موجودہ LLMs جیسے ChatGPT اور تمام بڑے پیمانے پر زبان کے ماڈلز کی بنیاد ہے۔
گوگل کے آٹھ محققین نے ٹرانسفارمر فن تعمیر تخلیق کیا۔
تو NMT کیا ہے، اور گوگل کے انجینئرز کس طرح ایک ایسا فریم ورک تیار کرنے میں کامیاب ہوئے جو مشینوں کو ایک جملے میں ہر لفظ کے معنوی معنی کو سمجھنے کی اجازت دیتا ہے؟
انڈیکس
NMT کو سمجھنا: اسکرین کے پیچھے دماغ
اس اہم پیش رفت کو سمجھنے کے لیے، ہمیں پہلے پردے کو پیچھے ہٹانا ہوگا۔ این ایم ٹی (نیورل مشین ٹرانسلیشن) کا اصل مطلب ہے:
کئی دہائیوں سے، کمپیوٹر ترجمہ "قواعد پر مبنی” رہا ہے۔ کمپیوٹر کو بنیادی طور پر ایک بڑی دو لسانی لغت اور گرامر کے قواعد کا ایک سیٹ دیا گیا تھا۔ میں جملے کے لفظ کا لفظ کے بدلے ترجمہ کروں گا، کچھ پوزیشنیں بدلوں گا، اور اپنی پوری کوشش کروں گا۔
یہی وجہ ہے کہ ابتدائی ترجمے ناقابل یقین حد تک سخت اور روبوٹک محسوس ہوئے۔ کمپیوٹر نے ریاضی کے مسائل جیسے زبان کو حل کرنے کی کوشش کی۔
NMT نے اپنے تعارف کے ساتھ گیم کو بدل دیا۔ اعصابی نیٹ ورکانسانی دماغ سے متاثر ایک کمپیوٹر سسٹم۔ NMT سسٹمز سخت قوانین کو حفظ کرنے کے بجائے لاکھوں موجودہ انسانی تراجم کو دیکھ کر سیکھتے ہیں۔ ہم دیکھتے ہیں کہ انسان کس طرح فقروں کا ترجمہ کرتے ہیں، اسپاٹ پیٹرن، اور سیکھتے ہیں کہ الفاظ حقیقی دنیا میں کس طرح تعامل کرتے ہیں۔
تاہم، ابتدائی NMT سسٹم میں بھی سنگین خامیاں تھیں۔ یعنی جملے بائیں سے دائیں ترتیب وار پڑھے جاتے ہیں۔ اگر کوئی جملہ بہت لمبا ہے، تو نظام "بھول جائے گا” کہ جملہ اس کے آخر تک کیسے شروع ہوا۔
یہیں سے گوگل کے محققین نے ایک تاریخی چھلانگ لگائی۔
ٹرانسفارمرز دنیا کو کیسے دیکھتے ہیں۔
"توجہ صرف آپ کی ضرورت ہے” پیپر نے ایک نیا فن تعمیر متعارف کروا کر یادداشت کے مسئلے کو حل کیا جس کا نام ‘توجہ آپ سب کی ضرورت ہے’۔ ٹرانسفارمر. لفظ بہ لفظ جملے پڑھنے کے بجائے، ٹرانسفارمر ایک ساتھ پورے جملے پڑھتا ہے۔
اس کو حاصل کرنے کے لیے، ہم کام کو دو اہم حصوں میں تقسیم کرتے ہیں: انکوڈر اور ڈیکوڈر۔
انکوڈر (ریڈر)
انکوڈرز کو انتہائی تجزیاتی رہنما سمجھیں۔ جب آپ سسٹم میں کوئی جملہ داخل کرتے ہیں، تو انکوڈر کا کام جملے کو پڑھنا اور جملے کے اصل معنی کا "ذہنی نقشہ” بنانا ہوتا ہے۔
یہ مندرجہ ذیل میکانزم کا استعمال کرتے ہوئے مکمل کیا جاتا ہے: ذاتی مفاد. آپ اسپاٹ لائٹس کی ایک سیریز کے طور پر خود توجہ کے بارے میں سوچ سکتے ہیں۔ جب کمپیوٹر کسی خاص لفظ کو دیکھتا ہے، تو یہ جملے کے دیگر تمام الفاظ پر روشنی ڈالتا ہے تاکہ یہ معلوم ہو سکے کہ ان کا کیا تعلق ہے۔
ہماری پچھلی مثال پر واپس جانا:
"ہم دریا کے کنارے ملیں گے۔”
جب انکوڈر کسی لفظ پر کارروائی کرتا ہے۔ "بینک” خود توجہ دینے والی اسپاٹ لائٹ فوری طور پر الفاظ کو جھنڈا دیتی ہے۔ "دریا.” یہ دونوں الفاظ AI کے ذہنی نقشے میں اتنے قریب سے جڑے ہوئے ہیں کہ نظام فوراً پہچان لیتا ہے کہ ہم پانی کے ساتھ والی زمین کی بات کر رہے ہیں، مالیاتی ادارے کی نہیں۔ اگلے مرحلے پر جانے سے پہلے ہم اس "معنی معنی” کو بند کرتے ہیں۔
ڈیکوڈر (مصنف)
ایک بار جب انکوڈر جملے کے حقیقی معنی کا تعین کر لیتا ہے، تو یہ اس بلیو پرنٹ کو صارف تک پہنچاتا ہے۔ ڈیکوڈر.
ڈیکوڈر مصنف ہے۔ آپ کا واحد کام اس بلیو پرنٹ کو ہدف کی زبان میں ترجمہ کرنا ہے۔ لیکن یہ صرف پری بلٹ ٹیمپلیٹس کو پرنٹ کرنے کے بارے میں نہیں ہے۔ یہ انکوڈر کے بلیو پرنٹ کو دیکھنا جاری رکھتا ہے، لفظ بہ لفظ نئے جملے تخلیق کرتا ہے۔ intersectionalism) یقینی بنائیں کہ آپ صحیح سیاق و سباق، لہجے اور گرامر کو برقرار رکھتے ہیں۔
اگر آپ دریا کے کنارے کے جملے کا فرانسیسی میں ترجمہ کرنا چاہتے ہیں، تو آپ اسے اس طرح لکھ سکتے ہیں: "سمندر کا ساحل” (دریا کے کنارے) بجائے "بینک” (فنانشل بینک)، کیونکہ انکوڈر کے بلیو پرنٹ نے پہلے سے خبردار کیا تھا۔
یہ کیوں اہمیت رکھتا ہے۔
گوگل انجینئرز نے مشین کو انفرادی الفاظ کے بجائے پوری تصویر کو دیکھنا سکھا کر صرف ایک بہتر مترجم نہیں بنایا۔ انہوں نے آخر کار ایک ایسا نظام بنایا جو انسانی زبان کی باریکیوں، محاوروں اور سیاق و سباق کو سمجھتا ہے۔
اور اگر AI کسی جملے کے سیاق و سباق کو اس کا ترجمہ کرنے کے لیے اچھی طرح سمجھ سکتا ہے، تو وہ اسی سیاق و سباق کو مضامین لکھنے، پیچیدہ سوالات کے جوابات اور کوڈ لکھنے کے لیے بھی استعمال کر سکتا ہے۔ 2017 میں، ترجمہ کے انجن پورے AI دور کی بنیاد بنے۔
اے آئی کی ڈیموکریٹائزیشن
ٹرانسفارمرز کی ایجاد کے چند سال بعد ٹرانسفارمرز استعمال کرنے والی عمارتیں صرف امیروں کا کھلونا بن گئیں۔ یہاں تک کہ ایک سادہ ترجمے کی خصوصیت کو لاگو کرنے کے لیے ایک چھوٹے مفت درجے سے آگے گوگل جیسے ٹیک دیو کو بہت زیادہ رقم ادا کرنے کی ضرورت ہوگی۔
آزاد ڈویلپرز کے لیے عملی طور پر کوئی وسائل نہ ہونے کے باعث، ان کے غلبہ کو روکنے کی کوششیں تقریباً ناممکن تھیں۔ اس وقت، آپ کو ٹرانسفارمر کی بنیادی ریاضی کو سمجھنے کے لیے ایک تعلیمی پی ایچ ڈی کی ضرورت تھی۔ ایک بڑے ریسرچ ڈیپارٹمنٹ کے بغیر شروع سے اپنا حل بنانا ایک ناقابل یقین حد تک مہنگا خواب تھا۔
خوش قسمتی سے، اوپن سورس ڈویلپر کمیونٹی AI تک رسائی کو جمہوری بنانے کے لیے انتھک محنت کر رہی ہے۔ آج ہمارے پاس ایک ناقابل یقین حد تک طاقتور ماڈل ہے جسے کوئی بھی مفت میں ڈاؤن لوڈ اور استعمال کر سکتا ہے۔
مزید برآں، پرسنل ڈیوائسز میں پروسیسرز نے بھی غیر معمولی کارکردگی میں بہتری دیکھی ہے۔ ان ہارڈ ویئر کی ترقی کا مطلب ہے کہ جدید ترین AI ماڈلز اب مقامی طور پر، براہ راست اسمارٹ فونز پر چل سکتے ہیں، ڈیٹا کی رازداری کو زیادہ سے زیادہ اور بیرونی سرورز پر انحصار کو ختم کر سکتے ہیں۔
جیسا کہ کہاوت ہے، "آج آپ کو ٹھیک سے کام کرنے کے لیے ایک مکمل عمارت کی ضرورت ہے، لیکن کل یہ آپ کی جیب میں فٹ ہو جائے گی۔” بلاشبہ، میں نے وہ اقتباس مکمل طور پر بنا دیا ہے لیکن آپ میری بات سمجھ گئے!
اس کو عملی جامہ پہنانے کے لیے، ہم انگریزی سے فرانسیسی ترجمہ کرنے کے لیے Expo اور QVAC کا استعمال کرتے ہوئے ایک موبائل ایپلیکیشن بنائیں گے۔
QVAC کیا ہے؟
QuantumVerse Automatic Computer (QVAC) ایک विकेंद्रीकृत، مقامی-پہلا AI ڈیولپمنٹ پلیٹ فارم اور SDK ہے جسے Tether نے بنایا ہے۔
روایتی AI ٹولز کے برعکس جن کے لیے کلاؤڈ کنیکٹیویٹی کی ضرورت ہوتی ہے، QVAC صارفین کو AI ماڈلز کو مکمل طور پر اپنے آلات پر چلانے کی اجازت دیتا ہے۔ اپنے حسابات کو مقامی اور آف لائن رکھ کر، آپ اپنے ڈیٹا کو نجی، محفوظ اور مکمل کنٹرول میں رکھ سکتے ہیں۔
آن ڈیوائس ترجمہ کے کلیدی تصورات
یہ سمجھنے کے لیے کہ QVAC موبائل آلات پر کیسے چلتا ہے، آپ کو چند اہم تصورات کو ذہن میں رکھنے کی ضرورت ہے۔
1. آن ڈیوائس کا اندازہ:
مقامی طور پر ماڈل کیلکولیشن چلائیں۔ ایک انجن یا کلاؤڈ API پر بھروسہ کرنے کے بجائے، QVAC مقامی، ٹاسک کے لیے مخصوص انفرنس بیک اینڈس کو سپورٹ کرتا ہے۔
یہ ترجمے کے لیے اندرونی طور پر برگاموٹ انجن کا استعمال کرتا ہے۔ یہ انجن میموری کے نقشے والے کوانٹائزیشن ماڈل کے وزن کو براہ راست ڈیوائس کی RAM میں فیڈ کرتے ہیں اور مقامی ہارڈویئر ایکسلریشن کا استعمال کرتے ہوئے کیلکولیشن کو انجام دیتے ہیں۔
2. کوانٹائزیشن
یہ ایک ریاضیاتی اصلاح کی تکنیک ہے جو ماڈل کے وزن کو دباتی ہے۔ یہ ماڈل کو صارفین کے موبائل ہارڈ ویئر کی میموری کی رکاوٹوں کو اپناتے ہوئے اعلی آؤٹ پٹ کوالٹی برقرار رکھنے کی اجازت دیتا ہے۔
QVAC کے ذریعہ تعاون یافتہ فن تعمیرات
کسی بھی کوڈ کو لکھنے سے پہلے، یہ سمجھنا ضروری ہے کہ اصل میں ہڈ کے نیچے کیا ہو رہا ہے۔ آپ کے آلے کو پگھلائے بغیر مقامی عمل کو ہینڈل کرنے کے لیے، QVAC SDK ہارڈ ویئر بائنڈنگ اور ماڈل لائف سائیکل کا انتظام کرتے ہوئے ایک آپٹمائزڈ انفرنس بیک اینڈ سے منسلک ہوتا ہے۔
ترجمے کے لیے، QVAC Bergamot انجن کا استعمال کرتا ہے۔ اصل میں برگاموٹ پروجیکٹ کے حصے کے طور پر تیار کیا گیا ہے (جو فائر فاکس میں آف لائن ترجمہ کو طاقت دیتا ہے)، یہ انجن صارفین کے ہارڈ ویئر پر تیز اور درست نیورل مشین ٹرانسلیشن (NMT) کے لیے موزوں ہے۔
اپنے مرکز میں، برگاموٹ انجن سورس جملے لیتا ہے، ان کو ایک انکوڈر-ڈیکوڈر مترجم فن تعمیر کے ذریعے پروسیس کرتا ہے، اور انتہائی موثر طریقے سے ہدف کی زبان کے ٹوکنز کی پیش گوئی کرتا ہے۔
زبان کے جوڑوں کو سمجھنا
میکانکس کو سمجھنا ضروری ہے کہ ان ماڈلز کو کس طرح تربیت دی جاتی ہے۔ ترجمے کے ماڈل جیسے کہ برگاموٹ کے ذریعہ استعمال کیے گئے زبان کے جوڑے سختی سے یک طرفہ ہیں۔ اس کا مطلب ہے: BERGAMOT_EN_FR ماڈل کو خصوصی طور پر انگریزی سے فرانسیسی میں ترجمہ کے لیے ڈیزائن کیا گیا ہے۔ عمل کو تبدیل نہیں کیا جا سکتا۔
فرانسیسی کا انگریزی میں ترجمہ کرنے کے لیے، آپ کو اس سمت کے لیے خاص طور پر تربیت یافتہ مکمل طور پر الگ ماڈل ڈاؤن لوڈ اور لوڈ کرنے کی ضرورت ہے۔
اگر آپ کا ماڈل دو طرفہ طور پر تربیت یافتہ ہے (انگریزی ← فرانسیسی) یا کثیر لسانی (ایک بڑی زبان کے ماڈل کی طرح درجنوں زبانوں کا ترجمہ)، آپ کو ایک ہی اعصابی نیٹ ورک کے اندر متعدد زبانوں کی سمتوں کے لیے ریاضیاتی نمائندگی، الفاظ، اور گرامر کے قواعد کو ذخیرہ کرنے کی ضرورت ہے۔ اس سے پیرامیٹرز کی تعداد میں اضافہ ہوتا ہے، جس کے نتیجے میں فائلیں بڑی ہوتی ہیں اور اسے پروسیس کرنے کے لیے زیادہ RAM اور کمپیوٹنگ پاور کی ضرورت ہوتی ہے۔
کاموں کو ایک سمت میں الگ کریں، جیسے BERGAMOT_EN_FR)، ماڈل کو انگریزی ان پٹ کو "سمجھنے” اور فرانسیسی آؤٹ پٹ کو "جنریٹ” کرنے کے لیے صرف نیورل نیٹ ورک کی ضرورت ہے۔ انگریزی متن بنانے کے لیے کسی صلاحیت کی ضرورت نہیں ہے۔
یہ انتہائی مہارت یہ ہے کہ کس طرح برگاموٹ اپنے ماڈلز کو ناقابل یقین حد تک چھوٹی 15-35MB فائلوں تک کم کرتا ہے جو آپ کے براؤزر کو منجمد کیے بغیر آپ کے مقامی CPU پر فوری طور پر چلائی جا سکتی ہیں۔
انفرنس پائپ لائن
یہ دیکھنے کے لیے کہ آپ کا کوڈ بیس ٹرانسلیشن انجن کے ساتھ کیسے تعامل کرتا ہے، مقامی ترجمے کو اپنے فون کی میموری میں ہی ایک وقف مترجم چلانے کے طور پر سوچیں۔
-
ایک مترجم کی خدمات حاصل کریں (ماڈل روڈ): کمپریسڈ ماڈل فائل کا نقشہ بنائیں (اس معاملے میں
BERGAMOT_EN_FRانگریزی-فرانسیسی ماڈل) براہ راست آپ کے آلے کی RAM میں۔ -
پاس اسکرپٹ (ٹیکسٹ ان پٹ): ماخذ متن کو بھری ہوئی انجن میں منتقل کرتا ہے۔
-
کارکردگی (تخمینہ): انجن متن کو پڑھتا ہے، ترجمہ شدہ ٹوکنز کی ریاضی کی پیش گوئی کرتا ہے، اور عمل مکمل ہونے پر ترجمہ شدہ نتائج فراہم کرتا ہے۔
-
اینڈ شو (اَن لوڈ): عصبی نیٹ ورک کے ماڈلز میموری پر مبنی ہوتے ہیں، لہذا جب ترجمہ مکمل ہو جائے یا صارف اسکرین چھوڑ دے تو آپ RAM سے ماڈلز کو صاف کر کے وسائل کو خالی کر سکتے ہیں۔
پروجیکٹ کی ترتیبات
اس بات کو یقینی بنانے کے لیے کہ یہ گائیڈ مکمل طور پر خود ساختہ ہے، آئیے جلدی سے ایک نئی ایکسپو ایپلیکیشن بنا کر اور QVAC SDK انسٹال کر کے شروع کریں۔ ٹرمینل کھولیں اور درج ذیل کمانڈ کو چلائیں:
npx create-expo-app translator-app --template blank-typescript
cd translator-app
npm install @qvac/sdk jiti
اگلا ہمیں مندرجہ ذیل ہم مرتبہ انحصار شامل کرنے کی ضرورت ہے: package.json QVAC کے صحیح طریقے سے کام کرنے کے لیے، اس سیکشن میں درج ذیل لائن شامل کریں:
"dependencies": {
"bare-rpc": "^1.0.0",
"react-native-bare-kit": "^0.11.5"
},
"devDependencies": {
"bare-pack": "^1.5.1"
}
اسے شامل کرنے کے بعد، چل کر انحصار انسٹال کریں:
npm install
npx expo install expo-file-system expo-build-properties expo-device
JITI کا استعمال کرتے ہوئے ایکسپو پلگ ان کو ترتیب دینا
اگلا، ہمیں اپنے ایکسپو پروجیکٹ میں QVAC SDK پلگ ان شامل کرنے کی ضرورت ہے۔ QVAC SDK کے ایکسپو پلگ ان کو ایک جدید ECMAScript ماڈیول (ESM) کے طور پر تقسیم کیا گیا ہے، لیکن ایکسپو کی کنفیگریشن فائل (app.config.js) معیاری Node.js CommonJS ماحول میں چلتا ہے، لہذا آپ معیاری استعمال نہیں کر سکتے۔ require().
یہی وجہ ہے کہ ہم نے اسے انسٹال کیا۔ jiti. یہ ایک پل کے طور پر کام کرتا ہے، جس سے ESM ماڈیولز کو کامن جے ایس فائلوں میں تعمیراتی عمل میں خلل ڈالے بغیر مطابقت پذیری سے لوڈ کیا جا سکتا ہے۔
بنائیں یا اپ ڈیٹ کریں۔ app.config.js پروجیکٹ روٹ میں ایک فائل بنائیں اور اسے اس طرح ترتیب دیں:
const createJiti = require("jiti");
const jiti = createJiti(__filename);
// Synchronously require the ESM module using jiti
const qvacModule = jiti("@qvac/sdk/expo-plugin");
const withQvacSDK = qvacModule.withQvacSDK || qvacModule.default;
// (Include your withEscapeBundleShellScript helper if needed)
module.exports = ({ config }) => {
config.plugins = [
[
"expo-build-properties",
{
android: { minSdkVersion: 29 },
},
],
withQvacSDK,
"expo-router",
[
"expo-splash-screen",
{
backgroundColor: "#208AEF",
},
],
withEscapeBundleShellScript, // Custom helper if applicable
];
return config;
};
یہ ترتیب QVAC ترجیحی اسکرپٹ کا اطلاق کرتی ہے اور اس بات کو یقینی بناتی ہے کہ Android کو کم از کم SDK ورژن 29 (مقامی لائبریریوں کے لیے درکار) کی ضرورت ہے۔
اب جب کہ ہمارے پاس بنیادی کنفیگریشن تیار ہے، آئیے سیدھا ترجمہ کوڈ میں جائیں۔
مکمل نفاذ
آئیے سب کو ساتھ لے کر آئیں۔ ہم ایک ایسا انٹرفیس نافذ کریں گے جو انگریزی متن لے، برگاموٹ انجن کے ڈاؤن لوڈ اور لوڈنگ کی صورتحال کا انتظام کرے، متن کا فرانسیسی میں ترجمہ کرے، اور آؤٹ پٹ کو اسکرین پر پیش کرے۔
حصہ لینے والی ایپ فائلوں کو تبدیل کرنا src/app/index.tsx مندرجہ ذیل نفاذ کے ساتھ:
import { View, ScrollView, TextInput, Text, TouchableOpacity, StyleSheet } from "react-native";
import { useState, useEffect } from "react";
import {
loadModel,
translate,
unloadModel,
BERGAMOT_EN_FR,
getModelInfo,
} from "@qvac/sdk";
import { Stack } from "expo-router";
type TranslationStatus =
| "Idle"
| "Checking model..."
| "Downloading model..."
| "Model downloaded successfully."
| "Loading model..."
| "Translating..."
| "Streaming translation..."
| "Translation finished."
| `Error: ${string}`;
export default function HomeScreen() {
const [status, setStatus] = useState("Checking model...");
const [translatedText, setTranslatedText] = useState("");
const [inputText, setInputText] = useState("");
const [isTranslating, setIsTranslating] = useState(false);
const [isDownloaded, setIsDownloaded] = useState(null);
const [downloadProgressStr, setDownloadProgressStr] = useState("");
useEffect(() => {
const checkModelStatus = async () => {
try {
const model = await getModelInfo({ name: BERGAMOT_EN_FR.name });
setIsDownloaded(model.isCached);
console.log("Model", model);
setStatus("Idle");
} catch (error) {
console.error("Error checking model:", error);
setStatus("Error: Failed to check model status");
}
};
checkModelStatus();
}, []);
const handleDownload = async () => {
try {
setIsTranslating(true);
setStatus("Downloading model...");
setDownloadProgressStr("");
const modelId = await loadModel({
modelSrc: BERGAMOT_EN_FR,
modelType: "nmt",
onProgress: (progress: any) => {
let pct = progress.percentage;
let dl = progress.downloaded;
let tot = progress.total;
if (progress.shardInfo) {
pct = progress.shardInfo.overallPercentage;
dl = progress.shardInfo.overallDownloaded;
tot = progress.shardInfo.overallTotal;
}
const formatBytes = (bytes: number) => {
if (bytes === 0) return "0 B";
const k = 1024;
const sizes = ["B", "KB", "MB", "GB"];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return (
parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i]
);
};
setDownloadProgressStr(
`${pct.toFixed(2)}% (${formatBytes(dl)} / ${formatBytes(tot)})`,
);
},
modelConfig: {
engine: "Bergamot",
from: "en",
to: "fr",
beamsize: 1,
normalize: 1,
temperature: 0.2,
norepeatngramsize: 3,
lengthpenalty: 1.2,
},
});
await unloadModel({ modelId, clearStorage: false });
setIsDownloaded(true);
setStatus("Model downloaded successfully.");
} catch (error: any) {
console.error(error);
setStatus(`Error: ${error.message}`);
} finally {
setIsTranslating(false);
setDownloadProgressStr("");
}
};
const handleTranslate = async () => {
if (!inputText.trim()) {
setStatus("Error: Please enter text to translate");
return;
}
try {
setIsTranslating(true);
setTranslatedText("");
setStatus("Loading model...");
const modelId = await loadModel({
modelSrc: BERGAMOT_EN_FR,
modelType: "nmt",
modelConfig: {
engine: "Bergamot",
from: "en",
to: "fr",
beamsize: 1,
normalize: 1,
temperature: 0.2,
norepeatngramsize: 3,
lengthpenalty: 1.2,
},
});
setStatus(`Translating...`);
const result = translate({
modelId,
text: inputText,
modelType: "nmt",
stream: false,
});
const text = await result.text;
setTranslatedText(text);
const stats = await result.stats;
if (stats) {
console.log(`▸ Processing stats:`, stats);
}
setStatus("Translation finished.");
await unloadModel({ modelId, clearStorage: false });
} catch (error: any) {
console.error(error);
setStatus(`Error: ${error.message}`);
} finally {
setIsTranslating(false);
}
};
return (
<>
English to French Translator
Enter text to translate:
Status: {status}
{downloadProgressStr ? `n${downloadProgressStr}` : ""}
{isDownloaded === null ? (
Loading...
) : isDownloaded ? (
{isTranslating ? "Translating..." : "Translate"}
) : (
{isTranslating ? "Downloading..." : "Download Model"}
)}
{translatedText || "Translation will appear here..."}
>
);
}
const styles = StyleSheet.create({
scrollContainer: {
flexGrow: 1,
paddingHorizontal: 16,
paddingTop: 16,
paddingBottom: 24,
backgroundColor: "#f9fafb",
},
card: {
backgroundColor: "#ffffff",
maxWidth: 450,
width: "100%",
alignSelf: "center",
borderRadius: 12,
padding: 16,
},
header: {
marginBottom: 16,
},
title: {
textAlign: "center",
fontSize: 24,
fontWeight: "bold",
color: "#111827",
},
subtitle: {
textAlign: "center",
marginTop: 4,
fontSize: 16,
color: "#6b7280",
},
content: {
gap: 24,
},
input: {
borderWidth: 1,
borderColor: "#e5e7eb",
backgroundColor: "#ffffff",
color: "#111827",
padding: 12,
borderRadius: 8,
minHeight: 100,
textAlignVertical: "top",
},
disabledText: {
opacity: 0.5,
},
statusText: {
fontSize: 14,
color: "#3b82f6",
fontWeight: "bold",
textAlign: "center",
marginTop: 12,
marginBottom: 12,
},
button: {
width: "100%",
height: 48,
borderRadius: 12,
backgroundColor: "#3b82f6",
alignItems: "center",
justifyContent: "center",
},
buttonDisabled: {
opacity: 0.5,
},
buttonText: {
fontWeight: "600",
fontSize: 18,
color: "#ffffff",
},
outputContainer: {
marginTop: 16,
padding: 16,
backgroundColor: "#f3f4f6",
borderRadius: 8,
minHeight: 100,
},
outputText: {
fontSize: 16,
color: "#111827",
},
});
ذیل میں ایک ایپلیکیشن کا ایک مثال ترجمہ ہے:
ان پٹ (انگریزی)
میں نے جس مقام کا ذکر کیا وہ دریا کے کنارے کے قریب تھا۔
حساب (فرانسیسی)
میں نے جس جگہ کا ذکر کیا وہ دریا کے کنارے کے قریب تھا۔
کوڈ بیس تجزیہ
آئیے اس پر قریبی نظر ڈالتے ہیں کہ یہ مقامی ترجمے کا نفاذ کس طرح بنیادی ماڈل لائف سائیکل کا انتظام کرتا ہے اور اسٹریم شدہ ٹوکنز کو ہینڈل کرتا ہے۔
1. مقامی لائف سائیکل مینجمنٹ
تبدیلی کے لیے نیورل نیٹ ورک کے وزن کو لوڈ کرنا کمپیوٹیشنل طور پر مہنگا ہے۔ ماڈل کو شروع کرتے وقت، QVAC رن ٹائم کو مقامی ڈسک سے پیرامیٹرز کو پڑھنا چاہیے اور فعال وزن کو ڈیوائس RAM میں کاپی کرنا چاہیے۔
اس کو مؤثر طریقے سے ہینڈل کرنے کے لیے، ہم چیک کرتے ہیں کہ آیا ماڈل کو لوڈ کرنے سے پہلے کیش کیا گیا ہے۔ یہ چیک کرنے کے لیے استعمال کیا جاتا ہے کہ آیا ماڈل ڈاؤن لوڈ ہو گیا ہے۔ کیشڈ کا مطلب یہی ہے۔ اس کا مطلب ہے کہ ماڈل آپ کی ڈسک پر ڈاؤن لوڈ ہو گیا ہے۔
const model = await getModelInfo({ name: BERGAMOT_EN_FR.name });
setIsDownloaded(model.isCached);
کہ loadModel یہ خصوصیت ہیگنگ فیس ہب سے ڈاؤن لوڈ کرنے والے ماڈلز کو خود بخود ہینڈل کرتی ہے اگر وہ پہلے سے مقامی طور پر کیش شدہ نہیں ہیں۔ ایک بار فائل مقامی طور پر دستیاب ہونے کے بعد، ہم میموری کو براہ راست وزن کا نقشہ بناتے ہیں۔
2. متن کا ترجمہ
ماڈل لوڈ ہونے کے بعد، متن کو ترجمہ انجن میں منتقل کیا جا سکتا ہے۔
const result = translate({
modelId,
text: inputText,
modelType: "nmt",
stream: false,
});
const text = await result.text;
setTranslatedText(text);
صارف کو حتمی نتائج دکھانے سے پہلے پورا ترجمہ مکمل ہونے تک انتظار کریں۔
3. ماڈل کو اتاریں۔
ترجمہ مکمل ہونے کے بعد، اس کے ساتھ ماڈل کو واضح طور پر حذف کریں: unloadModel:
await unloadModel({ modelId, clearStorage: false });
ماڈل کو اتارنے سے آلہ کی RAM دوسرے عمل کے لیے آزاد ہو جاتی ہے۔ کیونکہ ماڈل پہلے ہی ڈسک پر ڈاؤن لوڈ اور کیش شدہ ہے (اور ہم اسے واضح طور پر سیٹ کرتے ہیں)۔ clearStorage: false)، اگلی بار جب صارف کسی چیز کا ترجمہ کرنے کی کوشش کرتا ہے، تو ماڈل کو دوبارہ لوڈ کرنا تقریباً فوری ہوتا ہے۔
نتیجہ
کلاؤڈ سے آن ڈیوائس ہارڈویئر میں ترجمہ منتقل کرنا موبائل ایپلیکیشن ڈویلپرز کے لیے ایک عملی نقطہ نظر پیش کرتا ہے۔ ماڈل کا اندازہ مقامی طور پر چلانے سے ریموٹ انٹرنیٹ کنیکشنز پر انحصار ختم ہوجاتا ہے، بار بار چلنے والے API کے استعمال کی لاگت ختم ہوجاتی ہے، اور اس بات کو یقینی بناتا ہے کہ صارف کا ٹیکسٹ ان پٹ کبھی بھی فزیکل ڈیوائس کو نہیں چھوڑتا ہے۔
مقامی ترجمہ کو مربوط کرنا ٹریول ایپس، محفوظ مواصلاتی ٹولز، یا تعلیمی پلیٹ فارمز کے لیے انتہائی مفید ہو سکتا ہے۔ جیسا کہ ایج پروسیسرز ہارڈویئر ایکسلریشن کور حاصل کرتے ہیں اور اوپن سورس ماڈل کوانٹائزیشن ریسرچ کے ذریعے زیادہ کارآمد ہوتے ہیں، مقامی-پہلے فن تعمیر ایسے ڈویلپرز کے لیے ایک طاقتور متبادل پیش کرتے ہیں جو پرائیویسی، آف لائن لچک، اور متوقع لاگت کے ڈھانچے کو ترجیح دیتے ہیں۔
وسائل اور اضافی وسائل
مقامی نیورل مشین ٹرانسلیشن کے بارے میں مزید جاننے کے لیے، سورس کوڈ کا معائنہ کریں، یا موبائل ایپلیکیشنز کی ایڈوانس کنفیگریشن دریافت کریں، درج ذیل وسائل کو دیکھیں: