কীভাবে আমি আমাদের কোডবেসে AI-এর হ্যালুসিনেশন বন্ধ করলাম
AI কোডিং টুলগুলো রিয়েল প্রোডাকশন প্রজেক্টে ব্যর্থ হয়। এগুলো নতুন কোডের ক্ষেত্রে ভালো কাজ করে। কিন্তু ইতিহাস বা হিস্ট্রি আছে এমন পুরনো কোডের ক্ষেত্রে এগুলো অকার্যকর হয়ে পড়ে।
আমাদের ফিনটেক প্রজেক্টটির তিন বছরের ইতিহাস রয়েছে। এতে দুটি React ফ্রন্টএন্ড, একটি অ্যাডমিন প্যানেল এবং একটি FastAPI ব্যাকএন্ড রয়েছে। ডাটাবেসটি অনেকগুলো টেবিল এবং হেভি জয় (heavy joins) নিয়ে বেশ জটিল।
আমরা দ্রুত কাজ করার জন্য AI ব্যবহার করার চেষ্টা করেছিলাম। কিন্তু তা ব্যর্থ হয়েছিল।
আমি AI-কে একটি contacts টেবিল তৈরি করতে বলেছিলাম। এটি নাম এবং ইমেলের জন্য নতুন কলাম তৈরি করেছিল। এটি বুঝতে পারেনি যে আমাদের users টেবিলে এগুলো আগে থেকেই ছিল। এটি একটি foreign key ব্যবহার করার পরিবর্তে ডেটা ডুপ্লিকেট করেছিল।
AI বোকা ছিল না। এর কাছে কোনো কনটেক্সট (context) ছিল না। এটি অসম্পূর্ণ তথ্যের ভিত্তিতে একটি সিদ্ধান্ত নিয়েছিল।
আমি কীভাবে আরও ভালো কোড পাওয়া যায় তা জিজ্ঞেস করা বন্ধ করে দিলাম। আমি জিজ্ঞেস করতে শুরু করলাম যে সঠিক সিদ্ধান্ত নেওয়ার জন্য AI-এর কী কী কনটেক্সট প্রয়োজন।
আমরা একটি স্ট্রাকচার্ড ওয়ার্কফ্লো তৈরি করেছি। আপনি যে কনটেক্সট প্রদান করবেন, AI ঠিক ততটুকুই ভালো কাজ করবে। আমরা সেই কনটেক্সটটিকে সুনির্দিষ্ট (explicit) করে তুললাম।
এখানে আমাদের সেটআপ দেওয়া হলো:
- ADR Directory: আমরা Architecture Decision Records-এর জন্য একটি ফোল্ডার তৈরি করেছি। এই ফাইলগুলো ব্যাখ্যা করে যে আমরা কেন নির্দিষ্ট সিদ্ধান্ত নিই। একটি ফাইল AI-কে নির্দেশ দেয় যে নতুন টেবিল তৈরির আগে বিদ্যমান টেবিলগুলো পরীক্ষা করতে। এটি ইউজার ডেটা ডুপ্লিকেট করা নিষিদ্ধ করে।
- context.md: এই ফাইলটি আমাদের নির্দিষ্ট টার্মগুলো ব্যাখ্যা করে। এটি AI-কে জানায় যে আমাদের অনন্য শব্দগুলো একে অপরের সাথে কীভাবে সম্পর্কিত।
- plot.md: এটি প্রজেক্টের একটি হাই-লেভেল ম্যাপ প্রদান করে এবং এর বিভিন্ন অংশ কীভাবে একে অপরের সাথে যুক্ত তা দেখায়।
- Mandatory Tests: প্রতিটি নতুন API রুটের জন্য টেস্ট কেস প্রয়োজন।
এটি সবকিছু বদলে দিয়েছে। একবার, AI একটি শেয়ার্ড ইউটিলিটি ফাংশন পরিবর্তন করেছিল। সেই পরিবর্তনের ফলে সিস্টেমের আরও আটটি অংশ ভেঙে গিয়েছিল। টেস্ট স্যুট (test suite) সাথে সাথে সেটি ধরে ফেলে। AI সেই ব্যর্থতা দেখতে পায় এবং পুরনো ও নতুন উভয় রিকোয়ারমেন্ট হ্যান্ডেল করতে পারে এমন একটি ভার্সন তৈরি করে নিজের ভুল সংশোধন করে নেয়।
টেস্ট ছাড়া সেই বাগটি (bug) প্রোডাকশনে পৌঁছে যেত।
AI-কে একজন নতুন ডেভেলপারের মতো বিবেচনা করুন। আপনার কোডবেস সম্পর্কে না জানার জন্য আপনি একজন নতুন কর্মীকে দোষারোপ করেন না। আপনি তাকে ডকুমেন্টেশন এবং অনবোর্ডিং প্রদান করেন। আমরা AI-এর জন্যও ঠিক একই কাজ করেছি।
আমাদের স্ট্রাকচার:
docs/context.md: প্রজেক্টের টার্ম এবং সংযোগসমূহ।docs/plot.md: হাই-লেভেল কোডবেস ম্যাপ।docs/adr/: টেবিল তৈরি এবং API স্ট্রাকচারের মতো নির্দিষ্ট নিয়মাবলী।
আপনার টিমের জন্য তিনটি নিয়ম:
- ADR-এ সুনির্দিষ্ট হোন। অস্পষ্ট উপদেশের পরিবর্তে স্পষ্ট নির্দেশনা ব্যবহার করুন।
- ডকুমেন্টেশনকে অথরিটেটিভ (authoritative) করুন। AI-কে বলুন যে এই নিয়মগুলো সবার আগে কার্যকর হবে।
- ভুলগুলোকে নিয়মে রূপান্তর করুন। প্রতিবার যখন AI ব্যর্থ হয়, একটি নতুন ADR লিখুন।
এই সিস্টেমটি AI-কে নিখুঁত করে তোলে না। এটি AI-কে প্রেডিক্টেবল (predictable) বা অনুমেয় করে তোলে। আমরা এমন একটি কোডবেস চাই যেখানে AI সামঞ্জস্যপূর্ণ (consistent) থাকবে যাতে টিম আরও দ্রুত কাজ করতে পারে।
