GPT-4 اور Claude جیسے آٹو ریگریسو (Autoregressive) بڑے ماڈلز ایک فائل میں بائیں سے دائیں حرکت کرتے ہوئے ٹوکن بائی ٹوکن کوڈ تیار کرتے ہیں۔ وہ چھوٹے کوڈ کے ٹکڑوں کو تو اچھی طرح سنبھال لیتے ہیں، لیکن جب ایک ڈویلپر کسی بڑے کوڈ بیس میں گہرائی میں دفن کسی لائن کو ایڈٹ کرنا چاہتا ہے، تو وہ لڑکھڑا جاتے ہیں۔ ماڈل کو ہر بعد کے ٹوکن کا دوبارہ جائزہ لینا پڑتا ہے، اور پوری فائل میں تسلسل برقرار رکھنا ایک انتہائی مشکل کام بن جاتا ہے۔

ڈیفیوژن (Diffusion) ماڈلز رینڈم ٹوکنز کے بادل سے شروع ہوتے ہیں اور اسے مرحلہ وار تب تک صاف (denoise) کرتے ہیں جب تک کہ ایک مربوط پروگرام ظاہر نہ ہو جائے۔ چونکہ یہ عمل ایک ہی وقت میں پوری ترتیب کو بہتر بناتا ہے، اس لیے ماڈل کوڈ کے کسی بھی حصے کو شامل کرنے، حذف کرنے یا دوبارہ لکھنے کے لیے آخری حصے کو دوبارہ کیلکولیٹ کرنے کی ضرورت نہیں پڑتی۔

موجودہ پیراڈائم سافٹ ویئر انجینئرنگ کے ساتھ کیوں جدوجہد کرتا ہے

آٹو ریگریشن ماڈل کو کوڈ کے ساتھ ایک لکیری اسٹریم (linear stream) کے طور پر پیش کرنے پر مجبور کرتی ہے، جس کا مطلب ہے کہ یہ:

  • صرف پیچھے دیکھتا ہے۔ یہ کبھی مستقبل کے ٹوکنز کو نہیں دیکھتا، اس لیے یہ اندازہ نہیں لگا سکتا کہ ایک تبدیلی بعد کی لائنوں پر کیسے اثر انداز ہوگی۔
  • بعد کے متن کو دوبارہ کیلکولیٹ کرتا ہے۔ ایک تبدیلی نئی پیش گوئیوں کا ایک سلسلہ شروع کر دیتی ہے، جس سے ریفیکٹورنگ (refactoring) یا بگ فکسنگ کے دوران لیٹنسی (latency) بڑھ جاتی ہے۔
  • طویل فاصلے کی غلطیاں جمع کرتا ہے۔ شروع میں ہونے والا معمولی سا تضاد بڑھتا چلا جاتا ہے، جس سے حتمی فائل یا تو سنٹیکس کے لحاظ سے خراب ہو جاتی ہے یا منطقی طور پر غیر مستقل ہوتی ہے۔

جب آپ کو 'ان فل' (infill) کرنے کی ضرورت ہو—یعنی فائل کے درمیان میں کسی فنکشن باڈی کو شامل کرنا یا کسی API سگنیچر کو اپ ڈیٹ کرنا—تو آٹو ریگریسو ماڈلز کی تسلسلی نوعیت غیر موزوں اور غلطیوں کا باعث بنتی محسوس ہوتی ہے۔

ڈیفیوژن کا متبادل: مرحلہ وار بہتری، نہ کہ قدم بہ قدم پیش گوئی

ہم کوڈ فائل کو ایک شور زدہ سگنل (noisy signal) کے طور پر لیتے ہیں۔ اس کی تخلیق کئی چکروں میں ہوتی ہے:

  1. خالص شور (noise) سے آغاز۔ ہم ماڈل کو رینڈم ٹوکنز کا ایک سلسلہ فراہم کرتے ہیں، جسے اکثر ایک خاص پلیس ہولڈر کے ذریعے ظاہر کیا جاتا ہے۔
  2. تدریجی طور پر شور ختم کرنا۔ ہر مرحلے پر ماڈل ایک تھوڑا بہتر ورژن پیش کرتا ہے، جو ٹوکنز کو ممکنہ کوڈ کی طرف لے جاتا ہے۔
  3. مکمل پروگرام کی طرف مائل ہونا۔ مقررہ مراحل کے بعد شور ختم ہو جاتا ہے، اور ایک مکمل طور پر تیار شدہ کوڈ کا ٹکڑا باقی رہ جاتا ہے۔

چونکہ ہر مرحلہ پوری ترتیب کا دوبارہ جائزہ لیتا ہے، اس لیے ماڈل کسی بھی مرحلے پر کسی بھی ٹوکن میں تبدیلی کر سکتا ہے۔ یہ عالمی نظریہ (global view) اسے ایک گمشدہ امپورٹ (import) شامل کرنے، ویری ایبل کا نام بدلنے، یا کسی بلاک کی انڈینٹیشن درست کرنے کی اجازت دیتا ہے، بغیر اس کے کہ اس کے بعد آنے والی ہر چیز کو دوبارہ تیار کیا جائے۔

کوڈ پر مرکوز ڈیفیوژن ماڈل کی انجینئرنگ

ڈیفیوژن کو امیجز سے ٹیکسٹ پر منتقل کرنا کوئی آسان کام نہیں ہے۔ اس میں تین تکنیکی تبدیلیاں اہم ہیں۔

1. ڈسکریٹ ڈیفیوژن (Discrete diffusion)

امیج پکسلز فریکشنل شور کو قبول کر لیتے ہیں، لیکن کوڈ ٹوکن کیٹیگرییکل (categorical) ہوتا ہے—یہ یا تو ایک مخصوص کی ورڈ، آئیڈینٹیفائر، یا علامت ہوتی ہے۔ اس لیے ہم ایک مارکوف چین (Markov chain) کا استعمال کرتے ہیں جو بار بار ٹوکنز کو ایک نیوٹرل پلیس ہولڈر (اکثر [MASK]) سے بدلتا رہتا ہے جب تک کہ ترتیب مؤثر طور پر رینڈم نہ ہو جائے۔ اس کے برعکس عمل یہ سیکھتا ہے کہ مرحلہ وار اصل ٹوکنز کو کیسے بحال کیا جائے۔

2. ساختی آگاہی (Structural awareness)

پروگرامنگ زبانیں سخت سنٹیکس کے قواعد نافذ کرتی ہیں: Python میں انڈینٹیشن اسکوپ (scope) کا تعین کرتی ہے، C-style زبانوں میں بریکٹس بلاکس کی حد مقرر کرتے ہیں، اور ویری ایبلز کو استعمال سے پہلے ڈکلیئر کرنا ضروری ہوتا ہے۔ ایک ڈیفیوژن ماڈل جو کوڈ کو محض سادہ متن کے طور پر لیتا ہے، وہ سنٹیکس کے لحاظ سے غلط آؤٹ پٹ دے گا۔ اس سے بچنے کے لیے، محققین 'سنٹیکس کے بارے میں آگاہ کرنے والے اٹینشن ماسکس' (syntax-aware attention masks) شامل کرتے ہیں جو ٹوکنز کے آپسی تعلق کو محدود کرتے ہیں، اور ماڈل کو ہائیرارکی، نیمٹنگ (nesting) اور زبان کے مخصوص قواعد کا احترام کرنے پر مجبور کرتے ہیں۔

3. درجہ بندی کے لحاظ سے بہتری (Hierarchical refinement)

ڈیفیوژن کے ابتدائی مراحل بنیادی ڈھانچہ تیار کرتے ہیں—جیسے فنکشن سگنیچرز، کلاس کی تعریفیں، اور ماڈیول کی تنظیم۔ بعد کے مراحل باریک تفصیلات کو نکھارتے ہیں جیسے کہ پنکچویشن، وائٹ سپیس، اور نام رکھنے کے طریقے (naming conventions)۔ یہ 'بنیادی سے باریک' (coarse-to-fine) کی حکمت عملی بالکل ویسے ہی ہے جیسے انسان کسی پروگرام کی اندرونی تفصیلات کو نکھارنے سے پہلے اس کا خاکہ تیار کرتا ہے، اور یہ ہر مرحلے پر کمپیوٹ کو وہاں استعمال کرتی ہے جہاں اس کی سب سے زیادہ ضرورت ہوتی ہے۔

آٹو ریگریسو بمقابلہ ڈیفیوژن: ایک ساتھ موازنہ

پہلو آٹو ریگریسو ڈیفیوژن
تخلیقی بہاؤ تسلسلی، بائیں سے دائیں متوازی، مرحلہ وار شور کا خاتمہ
عالمی تسلسل طویل دورانیے میں غلطیوں کا خدشہ تمام ٹوکنز پر جامع نظریہ
عام استعمال کے مواقع چیٹ، وضاحت، چھوٹے کوڈ کے ٹکڑے ریفیکٹورنگ، بگ فکسنگ، بڑے پیمانے پر کوڈ کی تخلیق

یہ ٹیبل ظاہر کرتا ہے کہ ہر پیراڈائم مختلف سیاق و سباق میں کیوں بہترین ہے۔ آٹو ریگریسو ماڈلز وہاں جیتتے ہیں جہاں رفتار اور بات چیت کا انداز اہم ہو۔ ڈیفیوژن ماڈلز وہاں جیتتے ہیں جہاں حتمی پروڈکٹ کا سنٹیکس کے لحاظ سے درست اور ساختی طور پر مربوط ہونا ضروری ہے، چاہے اس کے لیے اضافی کمپیوٹ سائیکلز ہی کیوں نہ درکار ہوں۔

آگے کیا دیکھنا ہے

  • ہائبرڈ پائپ لائنز۔ مستقبل کے سسٹمز ایک autoregressive ماڈل کو تیز رفتار ابتدائی مسودہ تیار کرنے دے سکتے ہیں، اور پھر اسے نکھارنے کے لیے ایک diffusion ماڈل کے حوالے کر سکتے ہیں۔
  • ساختی ماسکس کے لیے ٹولنگ۔ محققین syntax-aware attention masks کو مسلسل بہتر بنا رہے ہیں تاکہ diffusion ماڈلز کو زبان سے متعلقہ حدود کی پاسداری کرنے میں مدد مل سکے۔

اہم نکات

Diffusion ماڈلز کوڈ جنریشن کا طریقہ کار بدل دیتے ہیں: ایک ایک ٹوکن کے ذریعے آگے بڑھنے کے بجائے، وہ iterative denoising کے ذریعے ایک مکمل پروگرام کو تراشتے ہیں۔ یہ طریقہ کار autoregressive سسٹمز کی بنیادی کمزوری—یعنی بڑے اور تبدیل ہونے والے کوڈ بیسز میں عالمی تسلسل برقرار رکھنا—پر قابو پاتا ہے۔ اگرچہ یہ طریقہ سست ہے اور اس میں کمپیوٹیشن زیادہ درکار ہوتی ہے، لیکن diffusion ریفیکٹورنگ، بگ فکسنگ، اور ایسے کسی بھی منظرنامے کے لیے ایک بہترین ٹول فراہم کرتا ہے جہاں ایک صاف ستھرا اور سنٹیکس کے لحاظ سے درست آؤٹ پٹ خام رفتار سے زیادہ اہم ہو۔ مستقبل کا سب سے امید افزا راستہ ایک ہائبرڈ ورک فلو معلوم ہوتا ہے جو autoregression کی تیز رفتار مسودہ سازی کی طاقت کو diffusion کی جامع نکھارنے کی صلاحیت کے ساتھ جوڑتا ہے۔