GPT-4 এবং Claude-এর মতো অটোরিগ্রেসিভ জায়ান্টরা একটি ফাইলের মধ্য দিয়ে বাম থেকে ডানে অগ্রসর হয়ে টোকেন-বাই-টোকেন কোড তৈরি করে। তারা ছোট ছোট কোড স্নিপেট ভালোভাবে সামলাতে পারে, কিন্তু যখন একজন ডেভেলপার একটি বিশাল কোডবেসের গভীরে থাকা কোনো লাইন এডিট করতে চান, তখন তারা হোঁচট খায়। মডেলটিকে প্রতিটি ডাউনস্ট্রিম টোকেন পুনরায় মূল্যায়ন করতে হয়, ফলে পুরো ফাইলটিকে সামঞ্জস্যপূর্ণ রাখা একটি দুঃস্বপ্নে পরিণত হয়।
ডিফিউশন মডেলগুলো এলোমেলো টোকেনের একটি ক্লাউড থেকে শুরু হয় এবং একটি সুসংগত প্রোগ্রাম না আসা পর্যন্ত ধাপে ধাপে ডিনয়েজ (denoise) করতে থাকে। যেহেতু এই পরিমার্জন প্রক্রিয়াটি একবারে পুরো সিকোয়েন্সকে স্পর্শ করে, তাই মডেলটি পরবর্তী অংশ পুনরায় গণনা না করেই কোডের যেকোনো অংশ ইনসার্ট, ডিলিট বা রিরাইট করতে পারে।
কেন বর্তমান প্যারাডাইম সফটওয়্যার ইঞ্জিনিয়ারিংয়ে হিমশিম খাচ্ছে
অটোরিগ্রেশন মডেলটিকে কোডকে একটি রৈখিক স্ট্রিম হিসেবে বিবেচনা করতে বাধ্য করে, যার অর্থ হলো এটি:
- শুধুমাত্র পিছনের দিকে তাকায়। এটি কখনোই ভবিষ্যতের টোকেনগুলো দেখতে পায় না, তাই একটি পরিবর্তন পরবর্তী লাইনগুলোকে কীভাবে প্রভাবিত করবে তা এটি আগে থেকে অনুমান করতে পারে না।
- ডাউনস্ট্রিম টেক্সট পুনরায় গণনা করে। একটি এডিট নতুন প্রেডিকশনের একটি ক্যাসকেড বা ঢেউ তৈরি করে, যা রিফ্যাক্টরিং বা বাগ ফিক্সিংয়ের ক্ষেত্রে ল্যাটেন্সি বাড়িয়ে দেয়।
- দীর্ঘমেয়াদী ত্রুটি জমা করে। শুরুর দিকের অমিলগুলো তুষারপাতের মতো বাড়তে থাকে (snowball effect), যার ফলে চূড়ান্ত ফাইলটি সিনট্যাক্টিক্যালি ত্রুটিপূর্ণ বা লজিক্যালি অসামঞ্জস্যপূর্ণ হয়ে পড়ে।
যখন আপনার ইনফিল (infill) করার প্রয়োজন হয়—যেমন একটি ফাইলের মাঝখানে একটি ফাংশন বডি ইনসার্ট করা বা একটি API সিগনেচার আপডেট করা—তখন অটোরিগ্রেসিভ মডেলগুলোর সিকোয়েন্সিয়াল প্রকৃতিটি অদক্ষ এবং ত্রুটিপূর্ণ মনে হয়।
ডিফিউশন বিকল্প: ধাপে ধাপে প্রেডিকশন নয়, বরং ইটারেটিভ রিফাইনমেন্ট
আমরা একটি কোড ফাইলকে একটি নয়েসি সিগন্যাল হিসেবে বিবেচনা করি। জেনারেশন প্রক্রিয়াটি কয়েকটি রাউন্ডে সম্পন্ন হয়:
- বিশুদ্ধ নয়েজ দিয়ে শুরু করা। আমরা মডেলটিকে এলোমেলো টোকেনের একটি সিকোয়েন্স প্রদান করি, যা প্রায়শই একটি বিশেষ প্লেসহোল্ডার দ্বারা উপস্থাপিত হয়।
- ধীরে ধীরে ডিনয়েজিং। প্রতিটি ধাপে মডেলটি কিছুটা পরিষ্কার সংস্করণ প্রেডিক্ট করে, যা টোকেনগুলোকে সম্ভাব্য কোডের দিকে নিয়ে যায়।
- একটি সমাপ্ত প্রোগ্রামে পৌঁছানো। নির্দিষ্ট সংখ্যক ধাপের পরে নয়েজ অদৃশ্য হয়ে যায় এবং একটি সম্পূর্ণভাবে গঠিত স্নিপেট অবশিষ্ট থাকে।
যেহেতু প্রতিটি ধাপ পুরো সিকোয়েন্সটিকে পুনরায় দেখে, তাই মডেলটি যেকোনো পর্যায়ে যেকোনো টোকেন পরিবর্তন করতে পারে। এই গ্লোবাল ভিউ বা সামগ্রিক দৃষ্টিভঙ্গি এটিকে পরবর্তী সবকিছু পুনরায় জেনারেট না করেই একটি মিসিং ইম্পোর্ট যোগ করতে, একটি ভেরিয়েবল রিনেম করতে বা একটি ব্লককে পুনরায় ইনডেন্ট করতে সাহায্য করে।
কোড-কেন্দ্রিক একটি ডিফিউশন মডেল তৈরি করা
ইমেজ থেকে টেক্সটে ডিফিউশন পোর্ট করা কোনো সহজ কাজ নয়। তিনটি প্রযুক্তিগত পরিবর্তন এখানে গুরুত্বপূর্ণ।
১. ডিসক্রিট ডিফিউশন (Discrete diffusion)
ইমেজ পিক্সেল ভগ্নাংশ বা ফ্র্যাকশনাল নয়েজ গ্রহণ করতে পারে, কিন্তু একটি কোড টোকেন হলো ক্যাটাগরিক্যাল—এটি হয় একটি নির্দিষ্ট কিওয়ার্ড, আইডেন্টিফায়ার বা সিম্বল। তাই আমরা একটি মার্কভ চেইন ব্যবহার করি যা টোকেনগুলোকে বারবার একটি নিউট্রাল প্লেসহোল্ডার (প্রায়শই [MASK]) দিয়ে প্রতিস্থাপন করে যতক্ষণ না সিকোয়েন্সটি কার্যকরভাবে এলোমেলো হয়ে যায়। বিপরীত প্রক্রিয়াটি ধাপে ধাপে কীভাবে মূল টোকেনগুলো পুনরুদ্ধার করতে হয় তা শেখে।
২. স্ট্রাকচারাল অ্যাওয়ারনেস (Structural awareness)
প্রোগ্রামিং ল্যাঙ্গুয়েজ কঠোর সিনট্যাক্টিক নিয়ম আরোপ করে: পাইথনে ইনডেন্টেশন স্কোপ নির্ধারণ করে, C-স্টাইল ল্যাঙ্গুয়েজে ব্র্যাকেট ব্লক নির্ধারণ করে এবং ভেরিয়েবল ব্যবহারের আগে ঘোষণা করতে হয়। একটি ডিফিউশন মডেল যা কোডকে সাধারণ টেক্সট হিসেবে বিবেচনা করে, তা সিনট্যাক্টিক্যালি ভুল আউটপুট তৈরি করবে। এটি প্রতিরোধ করতে, গবেষকরা সিনট্যাক্স-অ্যাওয়ার অ্যাটেনশন মাস্ক যোগ করেন যা টোকেনগুলো একে অপরের সাথে কীভাবে যুক্ত হবে তা সীমিত করে, ফলে মডেলটি হায়ারার্কি, নেস্টিং এবং ল্যাঙ্গুয়েজ-নির্দিষ্ট সীমাবদ্ধতা মেনে চলতে বাধ্য হয়।
৩. হায়ারার্কিকাল রিফাইনমেন্ট (Hierarchical refinement)
ডিফিউশনের প্রাথমিক ধাপগুলো একটি প্রাথমিক কাঠামো তৈরি করে—ফাংশন সিগনেচার, ক্লাস ডেফিনিশন, মডিউল অর্গানাইজেশন। পরবর্তী ধাপগুলো পাংচুয়েশন, হোয়াইটস্পেস এবং নেমিং কনভেনশনের মতো সূক্ষ্ম বিবরণগুলো পলিশ করে। এই coarse-to-fine কৌশলটি মানুষের একটি প্রোগ্রাম পলিশ করার আগে আউটলাইন করার পদ্ধতির প্রতিফলন ঘটায় এবং প্রতিটি পর্যায়ে যেখানে সবচেয়ে বেশি প্রয়োজন সেখানে কম্পিউটেশনাল শক্তিকে পরিচালিত করে।
অটোরিগ্রেসিভ বনাম ডিফিউশন: একটি তুলনামূলক চিত্র
| দিক | অটোরিগ্রেসিভ | ডিফিউশন |
|---|---|---|
| জেনারেশন ফ্লো | সিকোয়েন্সিয়াল, বাম থেকে ডানে | প্যারালাল, ইটারেটিভ ডিনয়েজিং |
| গ্লোবাল কনসিস্টেন্সি | দীর্ঘ সময় ধরে বিচ্যুত হওয়ার প্রবণতা থাকে | সমস্ত টোকেনের ওপর সামগ্রিক দৃষ্টিভঙ্গি |
| সাধারণ ব্যবহার ক্ষেত্র | চ্যাট, ব্যাখ্যা, দ্রুত স্নিপেট | রিফ্যাক্টরিং, বাগ ফিক্সিং, বৃহৎ পরিসরে কোড সিন্থেসিস |
টেবিলটি দেখায় কেন প্রতিটি প্যারাডাইম ভিন্ন ভিন্ন প্রেক্ষাপটে কার্যকর। যখন গতি এবং কথোপকথনমূলক ইন্টারঅ্যাকশন গুরুত্বপূর্ণ হয় তখন অটোরিগ্রেসিভ মডেলগুলো জয়ী হয়। ডিফিউশন মডেলগুলো তখন জয়ী হয় যখন চূড়ান্ত পণ্যটিকে সিনট্যাক্টিক্যালি সঠিক এবং কাঠামোগতভাবে সুসংগত হতে হয়, এমনকি যদি তারা অতিরিক্ত কম্পিউট সাইকেল ব্যবহার করে।
পরবর্তী যা লক্ষ্য রাখা উচিত
- হাইব্রিড পাইপলাইন। ভবিষ্যতের সিস্টেমগুলো হয়তো একটি অটোরিগ্রেসিভ মডেলকে দ্রুত একটি প্রাথমিক খসড়া তৈরি করতে দেবে, যা পরে পরিমার্জনের জন্য একটি ডিফিউশন মডেলের কাছে হস্তান্তর করা হবে।
- স্ট্রাকচারাল মাস্কের জন্য টুলিং। ডিফিউশন মডেলগুলোকে ভাষা-নির্দিষ্ট সীমাবদ্ধতাগুলো মেনে চলতে সাহায্য করার জন্য গবেষকরা সিনট্যাক্স-সচেতন অ্যাটেনশন মাস্কগুলো ক্রমাগত উন্নত করে চলেছেন।
সারসংক্ষেপ
ডিফিউশন মডেলগুলো কোড জেনারেশনের প্রচলিত ধারা বদলে দিচ্ছে: টোকেন বাই টোকেন অগ্রসর হওয়ার পরিবর্তে, তারা ইটারেটিভ ডিনয়েজিংয়ের মাধ্যমে একটি সম্পূর্ণ প্রোগ্রামকে রূপদান করে। এই পদ্ধতিটি অটোরিগ্রেসিভ সিস্টেমের মূল দুর্বলতাটিকে মোকাবিলা করে—যা হলো বড় এবং পরিবর্তনশীল কোডবেসে গ্লোবাল কনসিস্টেন্সি বজায় রাখা। যদিও এটি ধীরগতির এবং এতে কম্পিউটেশনাল ক্ষমতা বেশি প্রয়োজন হয়, তবুও রিফ্যাক্টরিং, বাগ ফিক্সিং এবং এমন যেকোনো পরিস্থিতির জন্য ডিফিউশন একটি চমৎকার টুল যেখানে দ্রুত গতির চেয়ে একটি পরিচ্ছন্ন এবং সিনট্যাক্টিক্যালি সঠিক আউটপুট বেশি গুরুত্বপূর্ণ। সামনের দিকে এগিয়ে যাওয়ার সবচেয়ে সম্ভাবনাময় পথ হিসেবে একটি হাইব্রিড ওয়ার্কফ্লো প্রতীয়মান হচ্ছে, যা অটোরিগ্রেশনের দ্রুত খসড়া তৈরির ক্ষমতার সাথে ডিফিউশনের সামগ্রিক পরিমার্জন করার ক্ষমতার সমন্বয় ঘটায়।
