ChatGPT with Dart & Flutter: Is it worth it?

08 January 2024

3 min read

কিছুদিন আগে, Open AI এই নতুন ChatGPT assistant প্রকাশ করেছে এবং এটি পুরা বিশ্বে ঝড় তুলেছে।

কিন্তু চ্যাটজিপিটি কী এবং এটি কীভাবে কাজ করে?

আনুষ্ঠানিক ঘোষণা অনুযায়ী :

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

ChatGPT কে ডায়ালগের জন্য অপ্টিমাইজ করা হয়েছে, এবং এটি ChatGPT কে GitHub Copilot থেকে কিছুটা আলাদা করে।

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

এই আর্টিকেলে, আমি ChatGPT-এর সাথে আমার কিছু এক্সপেরিমেন্ট শেয়ার করবো, এটা কতটা ভালো করেছে তা দেখাব এবং জীবনের সবচেয়ে প্রেসিং প্রশ্নের অবজেক্টিভ উত্তর দেওয়ার চেষ্টা করবো: 

  • আপনি কি আপনার জন্য সঠিক কোড তৈরি করতে ChatGPT কে বিশ্বাস করতে পারেন? 
  • কিভাবে এটির সর্বোত্তম ব্যবহার করতে হয়? 
  • AI কি আপনার চাকরি কেড়ে নেবে?

ডার্ট এবং ফ্লাটারের সাথে চ্যাটজিপিটি ব্যবহার করা: পদ্ধতি

শুরু করার জন্য, আমি বিভিন্ন ধরণের কাজে ChatGPT টেস্ট করার সিদ্ধান্ত নিয়েছি:

  • কমন কোডিং এরর সনাক্ত এবং সংশোধন করতে
  • কোড কিভাবে কাজ করে তা ব্যাখ্যা করতে
  • কোড লিখতে বা সম্পূর্ণ করে একটি প্রদত্ত কাজ সমাধান করতে 

কোড লেখার টাস্কগুলোর জন্য, আমি একটি টু-স্টেপ প্রসেস প্রক্রিয়া অনুসরণ করেছি:

১. একটি নির্দিষ্ট, ডিসক্রিট সমস্যা সমাধানের জন্য কোড লিখতে

২. কোড কম্পাইল, রান, এবং সঠিক আউটপুট প্রডিউস করে কিনা যাচাই করতে 

যখন আউটপুট প্রত্যাশিত ছিল না, ChatGPT নিজেই নিজেকে সংশোধন করবে কিনা তা দেখার জন্য আমি ChatGPT কে ফলো-আপ প্রশ্ন জিজ্ঞাসা করেছি।

আমি নয়টি ভিন্ন টাস্কের মাধ্যমে এই প্রক্রিয়াটি পুনরাবৃত্তি করেছি । আপনি নীচে আমার অবজারবেশনসহ সমস্ত ফলাফল খুঁজে পেতে পারেন:

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

Experiment 1: Detect and Fix an Error

আমি: এই কোডে কি কিছু ভুল আছে?

AI: হ্যাঁ, এই কোডে একটি সমস্যা আছে। Future.delayed মেথডটি একটি Future রিটার্ন করে, কিন্তু এই কোডটিতে, রিটার্ন্ড Future কে await করা বা কোনো ভ্যারিয়েবলে এসাইন করা হয়নি। এর মানে হলো যে debugName প্যারামিটারটি রিটার্ন করার আগে কোডটি আসলে এক সেকেন্ডের জন্যও বিরতি নিবে না। 

এখানে কোডটি ফিক্স করার একটি উপায় দেওয়া হলো:

বিকল্পভাবে, আপনি then মেথড ব্যবহার করতে পারেন একটি ফাংশনকে চেইন করতে, যা একবার কল হবে যখন Future.delayed কমপ্লিট হবে এবং Future রিটার্ন করবে।

এই উভয় উদাহরণে, debugName প্যারামিটার রিটার্ন করার আগে কোডটি এক সেকেন্ডের জন্য বিরতি দেবে।

My comments

await ব্যবহার করতে ভুলে যাওয়া একটি সাধারণ ভুল এবং এমন কিছু নয় যা স্ট্যাটিক অ্যানালাইজার নির্দেশ করবে (যেহেতু এটি একটি সিনট্যাক্স এরর নয়)।

কিন্তু ChatGPT এর কাছে এটি অলক্ষিত থাকে নি।

এমনকি, .then এর উপর ভিত্তি করে একটি বিকল্প ইমপ্লিমেন্টেশন নির্দেশ করেছে যা আমার মাথায়ও ছিলো না।

এটি দেখায় যে চ্যাটজিপিটি ডিবাগিংয়ের জন্য ব্যয় করা সময় কমাতে পারে। 

ফাইনাল রেজাল্ট: সাকসেস! 

যদি আমরা চাই, আমরা এক্সপ্লিসিটলি unawaited_futures এর লিন্টার রুল (যা বাই ডিফল্ট আনএবল করা থাকে) এনাবল করতে পারি যাতে একটি অ্যাসিঙ্ক ফাংশন বডির ভিতরে Future কে await করাতে ভুলে গেলে সতর্কতা পেতে পারি।

Experiment 2: Explain how some code works

আমি: আমাকে ব্যাখ্যা দেও কিভাবে এই কোড কাজ করে?

AI: এই কোডটি TMDBMoviesResponse নামক একটি ক্লাসকে ডিফাইন করে ডার্ট প্রোগ্রামিং ল্যাঙ্গুয়েজে। ক্লাসটি @freezed এনোটেশন দিয়ে চিহ্নিত করা হয়েছে, এটি একটি ডার্ট প্যাকেজ যার নাম freezed_annotation যা ডার্টে "immutable and serializable" ক্লাস তৈরি করার একটি উপায় প্রদান করে।

TMDBMoviesResponse ক্লাসটিতে বেশ কয়েকটি ফিল্ড রয়েছে যা এমন ডেটা রিপ্রেসেন্ট করে যা কোনো ধরণের API থেকে রিটার্ন করা, যেমন page, results, totalResults, এবং totalPages. এই ফিল্ডগুলোকে রিকইয়ার্ড হিসাবে চিহ্নিত করা হয়েছে, অর্থাৎ ক্লাসের একটি ইনস্ট্যান্স তৈরি করার সময় সেগুলোকে অবশ্যই প্রদান করতে হবে। 

TMDBMoviesResponse ক্লাসের একটি errors ফিল্ডও রয়েছে, যা @Default এনোটেশন দিয়ে চিহ্নিত করা হয় এবং এটি একটি এম্পটি List<String> (স্ট্রিংসের একটি এম্পটি লিস্ট) দিয়ে শুরু করা হয়। এর মানে হলো যদি errors ক্লাসের একটি ইনস্ট্যান্স তৈরি করার সময় ফিল্ডের জন্য কোনো ভ্যালু প্রদান করা না হয়, তাহলে এটি একটি এম্পটি লিস্ট হিসেবে শুরু হবে।

ক্লাসটির একটি factory কনস্ট্রাক্টরও আছে যাকে TMDBMoviesResponse.fromJson বলা হয়, যা একটি Map<String, dynamic> (কী এবং ভ্যালুগুলোর একটি ম্যাপ যেখানে ভ্যালুগুলো যেকোনো ধরনের হতে পারে) ইনপুট নেয় এবং এটি TMDBMoviesResponse ক্লাসের একটি ইনস্ট্যান্স তৈরি এবং শুরু করতে ব্যবহার করে। এই কনস্ট্রাক্টরটি একটি JSON অবজেক্ট থেকে ক্লাসের একটি ইনস্ট্যান্স তৈরি করতে ব্যবহৃত হয়, যা সাধারণত API-এ ডেটা রিপ্রেসেন্ট করার উপায় হিসাবে ব্যবহৃত হয়। 

এটি লক্ষণীয় যে কোডটিতে দুটি part ডিরেক্টিভ রয়েছে: 'tmdb_movies_response.freezed.dart' এবং 'tmdb_movies_response.g.dart'. part ডিরেক্টিভটি হলো অন্য ফাইল থেকে একই ডার্ট লাইব্রেরি বা প্যাকেজে কোড অন্তর্ভুক্ত করার একটি উপায়। এই ক্ষেত্রে, সম্ভবত tmdb_movies_response.freezed.dart ফাইলটিতে freezed প্যাকেজের সাথে সম্পর্কিত অতিরিক্ত কোড রয়েছে, অন্যদিকে tmdb_movies_response.g.dart ফাইলটিতে জেনারেটেড কোড রয়েছে যা একটি JSON অবজেক্ট থেকে TMDBMoviesResponse ক্লাসের ইনস্ট্যান্স তৈরি করতে ব্যবহৃত হয়।

My comments

চ্যাটজিপিটি freezed প্যাকেজ এবং এটি কীভাবে কাজ করে সে সম্পর্কে স্পষ্টভাবে জানে।

যারা কখনও ডার্ট কোড জেনারেশন ব্যবহার করেননি তারা উপরের সিনট্যাক্সটি বোঝার জন্য স্ট্রাগল করবে এবং এই ধরনের বিশদ ব্যাখ্যাকে অত্যন্ত প্রশংসা করবে।

ফাইনাল রেজাল্ট: সাকসেস! 

Experiment 3: Complete a binary search implementation

আমি: আমি একটি বাইনারি সার্চ ফাঙ্কশন লিখছি ইন্টিজারের অর্ডার্ড লিস্ট থেকে একটি আইটেম খুঁজতে। তুমি কি মিসিং কোড যোগ করতে পারো এবং সংক্ষেপে ব্যাখ্যা করতে পারো কিভাবে এটি কাজ করে?

AI: অবশ্যই, এখানে ডার্টে বাইনারি সার্চ ফাংশন বাস্তবায়নের একটি উপায় রয়েছে:

এই ফাংশনটি প্রদত্ত লিস্ট থেকে একটি আইটেম খুঁজতে বাইনারি সার্চ অ্যালগরিদম ব্যবহার করে। এটি তালিকার শুরুতে এবং শেষে যথাক্রমে low এবং high ইন্ডিসেস সেট করে শুরু হয়। তারপর এটি একটি লুপে প্রবেশ করে যেখানে এটি ক্রমাগত অনুসন্ধান স্পেসকে অর্ধেকে ভাগ করে যতক্ষণ না এটি আইটেমটি খুঁজে পায় বা নির্ধারণ করে এটি লিস্টে নেই।

লুপের প্রতিটি পুনরাবৃত্তিতে, ফাংশনটি বর্তমান সার্চ স্পেসের মাঝামাঝি ইনডেক্স গণনা করে এবং সেই ইনডেক্সে আইটেমটিকে টার্গেট আইটেমের সাথে তুলনা করে। যদি তারা মিলে যায়, ফাংশনটি ইনডেক্স রিটার্ন করে। যদি মিডেল ইনডেক্স আইটেম টার্গেট আইটেমের থেকে বড় হয়, ফাংশনটি সার্চ স্পেসকে লিস্টের লোয়ার হাফে রেডিউস করে (high ইনডেক্সটিকে, মিডেল ইনডেক্স থেকে ১ বিয়োগ করে সেট করে)। অন্যথায়, এটি লিস্টের সার্চ স্পেসকে আপার হাফে ইনক্রিস করে (low ইনডেক্সটিকে, মিডেল ইনডেক্সের সাথে ১ যোগ করে সেট করে)।

যদি আইটেমটি খুঁজে না পেয়ে লুপটি শেষ হয়, তবে ফাংশনটি -1 রিটার্ন করে নির্দেশ করে যে আইটেমটি তালিকায় পাওয়া যায়নি।

My comments

Once again, good job!

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

এবং আমি নিশ্চিত যে অনেক সিএস স্টুডেন্ট তাদের পরীক্ষায় চিট করার জন্য এটি ব্যবহার করবে! 

ফাইনাল রেজাল্ট: সাকসেস! 

Experiment 4: Play Rock, Paper, and Scissors

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

AI: এখানে ডার্টের একটি স্যাম্পল প্রোগ্রাম রয়েছে যা একজন মানুষকে কম্পিউটারের সাথে রক, পেপার, সিজরস খেলতে দেয়:

এই প্রোগ্রামে, আমরা মুভসের একটি লিস্ট তৈরি করেছি যা থেকে মানুষ এবং কম্পিউটার বেছে নিতে পারে। তারপরে, আমরা রেন্ডম সংখ্যা তৈরি করতে একটি Random অবজেক্ট ব্যবহার 

করেছি, যা আমরা কম্পিউটারের মুভগুলো বেছে নিতে ব্যবহার করি।

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

অবশেষে, আমরা রাউন্ডের ফলাফল প্রিন্ট করি এবং যতক্ষণ না মানুষ গেমটি কুইট করে, ততক্ষণ পর্যন্ত গেম চালিয়ে যাই।

My comments

উত্তরে কোডটি প্রশংসনীয় বলে মনে হয় এবং ফলো-আপ ব্যাখ্যাটি স্পষ্ট এবং আত্মবিশ্বাসী।

কিন্তু এটা কি সঠিক?

প্রথম দর্শনে, কোডটি সংক্ষিপ্ত এবং এতে কিছু ডিফেন্সিভ প্রোগ্রামিং অন্তর্ভুক্ত রয়েছে (মানুষের মুভ ভ্যালিডব কিনা তা পরীক্ষা করা)।

AI একটি গেম লুপ (while (true)) যোগ করেছে প্রম্পট না করেই। এতে আমি কীভাবে গেমটি খেলতে চাই তার একটি ভালো আন্ডারস্ট্যান্ডিং দেখায়। 

“যখন একটি প্রশ্ন যথেষ্ট সুনির্দিষ্ট না হয়, তখন ChatGPT আপনার ইনটেনশন সম্পর্কে অনুমান করবে। যদি আপনি একটি ভিন্ন উত্তর পেতে "Try again" চাপুন, তাহলে এটি বিভিন্ন অনুমান করতে পারে।”

কোড কম্পাইল হয়?

আমি এটি VSCode-এ একটি ডার্ট ফাইলে কপি করেছি এবং দুটি কম্পাইল এরর চিহ্নিত করেছি:

প্রথম এররটি সহজেই একটি ! যোগ করে সংশোধন করা যায়, যেহেতু readLineSync() একটি nullable ভ্যালু রিটার্ন করে:

এবং দ্বিতীয় এররটি print() statement সম্পূর্ণভাবে রিমুভ করে সংশোধন করা হয়েছে (নিশ্চিত নই কেন এটি প্রথমে এড করা হয়েছিল)।

দেখুন, গেমটি এখন খেলার যোগ্য! 

একই প্রোগ্রাম লিখতে আমার ~১৫ মিনিট সময় লাগত।

তবুও চ্যাটজিপিটি প্রথম চেষ্টাতেই এটি পেরে গেছে, এবং আমি খুব ছোটখাটো সংশোধনের সাথে ১ মিনিটে কাজ করার কোড পেয়েছি।

সত্যিই খুবই ইম্প্রেসিভ! 

ফাইনাল রেজাল্ট: সাকসেস! 

Experiment 5: Get the Current Weather

আমি: OpenWeatherMap API ব্যবহার করে একটি প্রদত্ত শহরের বর্তমান আবহাওয়া জানতে একটি ডার্ট প্রোগ্রাম লিখ। ইনপুট সিটি কমান্ড লাইন আর্গুমেন্ট হিসাবে পাছ করতে হবে।

AI: এখানে একটি সিম্পল ডার্ট প্রোগ্রাম রয়েছে যা http প্যাকেজ ব্যবহার করে একটি প্রদত্ত শহরের জন্য বর্তমান আবহাওয়া জানতে OpenWeatherMap API কে একটি GET রিকুয়েস্ট করে:

এই উদাহরণে, শহরের নাম কমান্ড লাইন আর্গুমেন্ট হিসাবে পাস করা হয়েছে, এবং API কী প্রোগ্রামে হার্ড-কোড করা হয়েছে।  আপনাকে আপনার OpenWeatherMap এর নিজস্ব API কী দিয়ে <your_api_key> রিপ্লেস করতে হবে।

My comments

প্রথম দেখাতেই, এটি ভালো মনে হচ্ছে!

এই লাইনে একটি কম্পাইল এরর আছে:

এটি সহজেই ফিক্স করা যায় Uri.parse এই মেথডটি ব্যবহার করে:

খুব সম্ভবত, ChatGPT ব্রেকিং চেঞ্জ সম্পর্কে আনঅ্যায়ার ছিল যেখানে http এর যেকোনো একটি মেথড কল করার সময় String এর পরিবর্তে Uri পাস করতে হয়।

ChatGPT 2021 পর্যন্ত পাবলিক ডেটার সাথে ট্রেইনড হওয়ার দাবি করে এবং আমাদের রিসেন্ট ব্রেকিং চেঞ্জগুলো মনে রাখা উচিত API ব্যবহার করার সময়। 

কোড স্টাইল উন্নত করা যেতে পারে async/ await এর পরিবর্তে .then ব্যবহার করে, তবে এটি সহজেই হাতে পরিবর্তন করা যেতে পারে। 

আমার API কী যোগ করার পরে (প্রদত্ত ইন্সট্রাকশনের মতো), প্রোগ্রামটি চালালাম এবং এই আউটপুট পেয়েছি:

প্রোগ্রামটি কাজ করে কিন্তু API থেকে সম্পূর্ণ JSON রেসপন্সটি প্রিন্ট করে।

তো চলুন এটি ফিক্স করা যাক!

Second prompt in thread

আমি: কোডটা মোডিফাই কর যাতে শুধুমাত্র বর্তমান তাপমাত্রা প্রিন্ট হয়। 

AI: এখানে ডার্ট প্রোগ্রামের একটি মোডিফাইড ভার্সন রয়েছে যা শুধুমাত্র OpenWeatherMap API এর রেসপন্স থেকে বর্তমান তাপমাত্রা প্রিন্ট করে। 

দ্রষ্টব্য: পার্সিং কোডে শুধুমাত্র একটি পরিবর্তন বাদে আউটপুটটি আগের মতোই ছিলো:

এই উদাহরণে, API এর রেসপন্স বডি json প্যাকেজ ব্যবহার করে ডিকোড করা হয়েছে এবং JSON ডেটার main section থেকে temp ফিল্ড এক্সট্রাক্টেড এবং প্রিন্ট করা হয়েছে। এই প্রোগ্রামটি অনুমান করে যে API এর রেসপন্স সঠিক ফরমেটের হবে এবং প্রয়োজনীয় ডেটা থাকবে। কোনো অপ্রত্যাশিত রেসপন্স ফরমেট বা অনুপস্থিত ডেটা পরিচালনা করতে আপনাকে এডিশনাল এরর হ্যান্ডলিং এড করতে হতে পারে।

My comments 

খুব ভালো!

চলুন আবার এটি রান করা যাক:

ভাল, কিন্তু "২৭৮.৫১ ডিগ্রী" সঠিক বলে মনে হচ্ছে না। আমির মতে আমি আমার রিকুয়েস্টের সাথে যথেষ্ট নির্দিষ্ট ছিলাম না।

Third prompt in thread

আমি: আউটপুট তাপমাত্রা সেলসিয়াসে হওয়া উচিত, কেলভিনে নয়।

AI: এখানে ডার্ট প্রোগ্রামের একটি মোডিফাইড ভার্সন রয়েছে যা এটিকে প্রিন্টের আগে তাপমাত্রা কেলভিন থেকে সেলসিয়াসে রূপান্তর করে:

দ্রষ্টব্য: পার্সিং কোডে শুধুমাত্র একটি পরিবর্তন বাদে আউটপুটটি আগের মতোই ছিলো:

এই উদাহরণে, কেলভিনের তাপমাত্রা থেকে ২৭৩.১৫ বিয়োগ করে তাপমাত্রা কেলভিন থেকে সেলসিয়াসে কনভার্ট করা হয়েছে। এটি একটি সাধারণ অনুমান যা অনুমান করে যে ০°C তাপমাত্রা ২৭৩.১৫°K এর সমতুল্য, যা একটি সাধারণ অনুমান কিন্তু সব তাপমাত্রায় এটি সঠিক নাও হতে পারে। আপনার যদি আরও নির্ভুলতার প্রয়োজন হয় তবে আপনাকে আরও সঠিক কনভার্সন ফর্মুলা ব্যবহার করতে হতে পারে।

My comments

শেষ পরিবর্তনের পরে আউটপুট:

এই মুহুর্তে, আমি AI কে ইন্টিজারে তাপমাত্রা মুদ্রণ করতে বলতে পারতাম।

কিন্তু এটা স্পষ্ট যে ChatGPT আগের কথোপকথনের প্রসঙ্গ মনে রাখে এবং পরবর্তী উত্তর তৈরি করার সময় এটি ব্যবহার করে।

এর মানে হলো যে, যদি আমাদের প্রাথমিক প্রম্পট যথেষ্ট স্পেসিফিক না হয়, তাহলে আমাদের

স্ক্র্যাচ থেকে পুনরায় আরম্ভ করার দরকার নেই এবং আমরা আরও বিশদ বিবরণ এড করে একটি পরিমার্জিত সমাধান পেতে পারি।

সামগ্রিকভাবে, এটি একজন দক্ষ সহকারীর সাথে কথোপকথনের মতো মনে হচ্ছে ।

ফাইনাল রেজাল্ট: সাকসেস!

Experiment 6: CustomPainter

এই পরীক্ষার জন্য, আমি AI কে CustomPainter ব্যবহার করে কিছু ফ্লাটার কোড লিখতে বলেছিলাম, যেহেতু হাত দিয়ে এটি করা সময়সাপেক্ষ হতে পারে।

আমি: একটি ফ্লাটার CustomPainter লিখ যা দুই চোখওয়ালা একটি সমিলিং ফেইস আঁকে। 

AI: এখানে ফ্লাটার CustomPainter এর একটি উদাহরণ দেওয়া হলো দুই চোখওয়ালা একটি সমিলিং ফেইস আঁকে:

CustomPainter ব্যবহার করার জন্য, আপনি আপনার ফ্লাটার অ্যাপের CustomPaint উইজেটে SmilingFacePainter এর একটি ইনস্ট্যান্স পাঠাতে পারেন। 

এটি স্ক্রিনে দুই চোখওয়ালা একটি সমিলিং ফেইস আঁকবে। আপনি paint অবজেক্টের ভ্যালু পরিবর্তন করে মুখের চেহারা, যেমন রঙ বা চোখের আকার কাস্টমাইজ করতে পারেন।

My comments

একটি চমত্কার শুরু!

এই কোডটি ডার্টপ্যাডে আনার পরে আমি শুধুমাত্র একটি ছোট সমস্যা রয়েছে লক্ষ্য করেছি:

এটি সহজেই ফিক্স করা যায় dart:math ইম্পোর্ট করে (যা VSCode-এ কুইক ফিক্স ব্যবহার করে করা যেতে পারে ):

এখানে উপরের কোডের একটি ডার্টপ্যাড ভিউ দেওয়া হলো:

কিন্তু, চোখ মুখ কই?

দেখা যাচ্ছে, এগুলো আঁকা হয়েছে কিন্তু দেখা যাচ্ছে না কারণ তাদের রঙ মুখের মতোই নীল।

Second prompt in thread

আমি: ফেইস হলুদ কর। চোখ ও মুখ লাল হতে হবে।

AI: ফেইস হলুদ করতে, আপনি এইভাবে SmilingFacePainter ক্লাসের paint.color প্রোপার্টি পরিবর্তন করতে পারেন। 

চোখ এবং মুখ লাল করতে, আপনি নতুন Paint অবজেক্ট তৈরি করতে পারেন যার রঙ হবে লাল এবং এটি ব্যবহার করে চোখ এবং মুখকে এভাবে আঁকতে পারেন:

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

My comments

চমৎকার! এখন আমাকে শুধু কোডটা আপডেট করতে হবে! 

ভালো করেছো, ChatGPT. আই এম প্রাউড অফ ইউ!

ফাইনাল রেজাল্ট: সাকসেস!

পরীক্ষা 7: GoRouter প্যাকেজ ব্যবহার করে তিনটি রুট ঘোষণা করুন

আমি: ধর আমার কাছে তিনটি  রুটের একটি ফ্লটার অ্যাপ আছে: /login, /home, এবং /account. GoRouter প্যাকেজ ব্যবহার করে এই রুটগুলো ডিক্লেয়ার কর।

AI: একটি Flutter অ্যাপে GoRouter প্যাকেজ ব্যবহার করে রুট ডিক্লেয়ার করতে, আপনাকে প্রথমে package:gorouter/gorouter.dart লাইব্রেরি ইম্পোর্ট করতে হবে। তারপরে, রুটগুলোকে আপনি নিম্নরূপে সংজ্ঞায়িত করতে পারেন:

বিকল্পভাবে, আপনি .add() মেথড ব্যবহার করে রুটগুলোকে সংজ্ঞায়িত করতে পারেন, যা আপনাকে প্রতিটি রুটের জন্য এডিশনাল অপশন নির্দিষ্ট করতে দেয়, যেমন HTTP মেথড যা এটি সাপোর্ট করে বা যখন রুটকে অ্যাক্সেস করা হয় তখন হ্যান্ডলার ফাংশনটি কল হবে:

একবার আপনি আপনার রুটগুলো সংজ্ঞায়িত করলে, আপনি router.run() মেথড ব্যবহার 

করে রাউটার শুরু করতে এবং ইনকামিং রিকোয়েস্টগুলো শুনতে পারেন। উদাহরণ স্বরূপ:

এটি রাউটারটি শুরু করবে এবং এটিকে ডিফাইনড রুটের রিকুয়েস্টগুলো হ্যান্ডেল করার অনুমতি দেবে। তারপরে আপনি router.navigateTo() মেথড দিয়ে আপনার Flutter অ্যাপের একটি নির্দিষ্ট রুটে মধ্যে নেভিগেট করতে পারবেন। উদাহরণ স্বরূপ: 

এটি /login রুটের দিকে নেভিগেট করবে এবং সংশ্লিষ্ট হ্যান্ডলার ফাংশনকে কল করবে।

My comments

সম্পূর্ণ ভুল!

আমার ধারণা ChatGPT GoRouter সম্পর্কে জানে না এবং Flutter ইকোসিস্টেমের বাইরে কিছু (সার্ভার-সাইড) রাউটিং প্যাকেজের উপর ভিত্তি করে উত্তরটি অনুমান করার চেষ্টা করেছে।

এই ক্ষেত্রে, ChatGPT ইউজলেস, এবং কাজের উপযুক্ত নয়।

ফাইনাল রেজাল্ট: ফেইল!

Experiment 8: Write a Firebase Cloud Function

যেহেতু ChatGPT অনেক ভাষায় দক্ষ, তাই আমি ডার্ট অ্যান্ড ফ্লাটার থেকে দূরে সরে যাওয়ার সিদ্ধান্ত নিয়েছি এবং এটিকে একটি ক্লাউড ফাংশন লিখতে বলব।

আমি: একটি ফায়ারবেস ক্লাউড ফাংশন লিখ যা /product/{pid}/reviews কালেকশনের ভিতরের যেকোনো ডকুমেন্ট পরিবর্তন হলে ট্রিগার হবে। ফাংশনটির অ্যাভারেজ রিভিউ স্কোর  ক্যালকুলেট করতে হবে এবং /product/{pid} ডকুমেন্টের ভিতরে avgRating ফিল্ড হিসেবে লিখতে হবে।

AI: এখানে একটি ফায়ারবেস ক্লাউড ফাংশনের একটি উদাহরণ রয়েছে যা /product/{pid}/reviews কালেকশনের ভিতরের একটি ডকুমেন্ট পরিবর্তন হলে ট্রিগার হয়৷ এই ফাংশনটি অ্যাভারেজ রিভিউ স্কোর ক্যালকুলেট করে এবং /product/{pid} ডকুমেন্টের ভিতরে avgRating ফিল্ড হিসেবে লিখে রাখে:

এই ফাংশনটি পাথের মধ্যে /product/{pid}/reviews কালেকশনের ভিতরের যেকোনো ডকুমেন্টের পরিবর্তন ওয়াইল্ডকার্ড {pid} এবং {reviewId} ব্যবহার করে শোনে। যখন একটি পরিবর্তন ডিটেক্ট হয়, ফাংশনটি /product/{pid}/reviews কালেকশনের একটি রেফারেন্স পায় এবং প্রোডাক্টের জন্য সকল রিভিউ পুনরুদ্ধার করে। তারপরে এটি অ্যাভারেজ রেটিং ক্যালকুলেট করে সমস্ত রেটিংগুলিকে যোগ করে এবং রেটিংগুলোর সংখ্যা দ্বারা ভাগ করে। অবশেষে, ফাংশনটি /product/{pid} ডকুমেন্টের একটি রেফারেন্স পায় এবং এটি avgRating ফিল্ড দিয়ে আপডেট করে।

My comments

কোড কম্পাইল হয়, তাই এটি একটি গুড স্টার্ট!

আমি এটি রান করার চেষ্টা করিনি, তবে আমি মনে করি ChatGPT কিছু জিনিস সঠিকভাবে বলেছে: 

  • একটি ডকুমেন্ট আপডেট করার জন্য একটি ট্রিগার কিভাবে লিখতে হয়
  • কনটেক্সট থেকে প্যারামিটার এক্সট্রাকট করা 
  • অ্যাভারেজ রেটিং গণনা করা 
  • সঠিক ডকুমেন্টে লেখা

একদম শুরুতে ইম্পোর্ট করা আমি খুব পছন্দ করিনি, তাই আমি এটি অনুসরণ করেছি। 

Second prompt in thread

আমি: তুমি কি require এর পরিবর্তে মডিউল ইম্পোর্ট ব্যবহার করতে পারো?

AI: হ্যাঁ, আপনি জাভাস্ক্রিপ্টে require এর পরিবর্তে মডিউল ইম্পোর্ট ব্যবহার করতে পারেন। আপনি কীভাবে আপনার ফায়ারবেস ক্লাউড ফাংশনে firebase-functions এবং firebase-admin মডিউলগুলো ইম্পোর্ট করতে পারেন তার একটি উদাহরণ এখানে দেওয়া হলো:

এই উদাহরণে, আমরা import * as সিনটেক্স ব্যবহার করছি সবগুলো মডিউল ইম্পোর্ট করতে এবং functions and admin নামক একটি ভেরিয়েবলে এসাইন করতে। তারপর আপনি functions এবং admin ভেরিয়েবলের মাধ্যমে রেফারেন্স করে firebase-functions এবং firebase-admin মডিউল থেকে ইম্পোর্ট করা ফাংশন এবং ক্লাসগুলো ব্যবহার করতে পারেন।

My comments

দিস থিং ইস লিট!

ফাইনাল রেজাল্ট: সাকসেস!

Experiment 9: How to seed Cloud Firestore with some test data?

আমি: আমি কীভাবে ক্লাউড ফায়ারস্টোর সিড করতে পারি কিছু টেস্ট ডেটা দিয়ে?

AI: টেস্ট ডেটা দিয়ে ক্লাউড ফায়ারস্টোর সিড করতে, আপনি Firebase CLI ব্যবহার করে সরাসরি আপনার ডাটাবেসে ডেটা লিখতে পারেন। প্রথমে, নিশ্চিত করুন যে আপনার মেশিনে Firebase CLI ইনস্টল করা আছে। তারপর, আপনার ডাটাবেস সিড করতে নিম্নলিখিত পদক্ষেপগুলো ব্যবহার করুন:

১. আপনার ফায়ারবেস প্রোজেক্ট যেখানে সংরক্ষিত আছে সেই ডিরেক্টরিতে নেভিগেট করুন।

২. firebase loginআপনার Google অ্যাকাউন্ট দিয়ে Firebase CLI প্রমাণীকরণ করতে কমান্ডটি চালান ।

৩. firebase database:get কমান্ড রান করুন আপনার ডাটাবেসের বর্তমান ডেটা পুনরুদ্ধার করতে। এটি আপনার প্রোজেক্ট ডিরেক্টরিতে database.json নামে একটি লোকাল ফাইল তৈরি করবে, যা আপনি আপনার টেস্ট ডেটার জন্য একটি স্টার্টিং পয়েন্ট হিসাবে ব্যবহার করতে পারেন।

৪. database.json ফাইলটি এডিট করুন টেস্ট ডেটা যোগ করতে যা দিয়ে আপনি আপনার ডাটাবেসের সিড করতে চান। এই ফাইলে ডেটা যোগ করার সময় সঠিক JSON সিনট্যাক্স এবং স্ট্রাকচার অনুসরণ করতে ভুলবেন না।

৫. একবার আপনি আপনার টেস্ট ডেটা যোগ করে ফেললে, firebase database:set কমান্ডটি রান করুন আপনার ডাটাবেসে ডেটা লিখতে। 

৬. আপনি আবার firebase database:set কমান্ড চালিয়ে আপনার ডাটাবেসে আপনার টেস্ট ডেটা যোগ করা হয়েছে কিনা তা যাচাই করতে পারেন, যা আপনার ডাটাবেসের বর্তমান ডেটা পুনরুদ্ধার করবে এবং কনসোলে প্রিন্ট করবে।

এইটও! আপনি সফলভাবে আপনার ক্লাউড ফায়ারস্টোর ডাটাবেস টেস্ট ডেটা দিয়ে সিড করে ফেলেছেন৷

My comments

উত্তরটি যুক্তিসঙ্গত মনে হলেও এটি ভুল !

ডক্স অনুসারে , database:get প্রকৃতপক্ষে একটি ভ্যালিড কমান্ড, কিন্তু এটি শুধুমাত্র ফায়ারবেস রিয়েলটাইম ডেটাবেসে কাজ করে এবং এটি ক্লাউড ফায়ারস্টোরের জন্য ইকুইভ্যালেন্ট না। 

আমি এটি সম্পর্কে আমার বন্ধুত্বপূর্ণ সহকারীকে বলেছিলাম, কিন্তু এটি firestore:setএবং firestore:add কমান্ডের সাথে উত্তর দিয়েছে যা আসলে এক্সিস্টই করে না।

এবং এটি আত্মবিশ্বাসের সাথে ভুল উত্তর দিতে থাকে। 

ফাইনাল রেজাল্ট: ফেইল!

Final Results and Evaluation

আমি অবশ্যই বলবো যে, আমি ChatGPT-এর natural language processing দক্ষতা দেখে সত্যিই খুব ইম্প্রেসেড। স্পষ্টতই, AI প্রতিটি প্রশ্ন বুঝতে পেরেছিল এবং এটি নিজে নিজেই একটি অসাধারণ কীর্তি!

তাছাড়া, ChatGPT ৯ পয়েন্টের মধ্যে ৭ স্কোর করতে সক্ষম হয়েছে এবং এই সমস্ত ক্ষেত্রে মূল্যবান প্রমাণিত হয়েছে:

  • সাধারণ কোডিং এরর সনাক্ত এবং সংশোধন করতে
  • কোড কিভাবে কাজ করে তা ব্যাখ্যা করতে
  • একটি প্রদত্ত কাজ সমাধান করতে কোড লিখতে বা সম্পূর্ণ করতে

চ্যাটজিপিটি দুটি কাজে ব্যর্থ হয়েছে, এটি দেখায় যে এটি সর্বশেষ প্যাকেজ এবং APIগুলোর সাথে আপ টু ডেট নয় এবং রিকুয়েস্ট করা হলে এটি ভুল উত্তর দেয়৷

কিন্তু বাকি কাজগুলোতে, আমি ব্যাখ্যাগুলোর সাথে খুব মুগ্ধ হয়েছিলাম এবং ভেবেছিলাম কোডটি বেশ ভালো ছিলো।

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

Some reflections on ChatGPT and a word of caution

ChatGPT এর সাথে পরিচিত হওয়ার জন্য আরও বেশি সময় ব্যয় করার পরে, আমি সংক্ষেপে বলবো:

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

আপনি যদি ChatGPT- প্রশিক্ষিত ডেটার উপর ভিত্তি করে simplewell-defined, এবং self-contained কাজগুলো করে থাকেন, তাহলে একটি ChatGPT-ভিত্তিক ওয়ার্কফ্লোও হাতে কোড করার চেয়ে 10 গুণ দ্রুততর হতে পারে। এবং এই বেশ উল্লেখযোগ্য!

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

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

বিশেষভাবে সতর্ক থাকুন যদি আপনি dynamically typed languages এর সাথে ChatGPT ব্যবহার করেন যা আপনাকে কোনো কম্পাইল-টাইম গ্যারান্টি দেয় না। উত্তরটি ভুল হলে, আপনি শুধুমাত্র রানটাইমে খুঁজে পাবেন এবং আমরা সবাই জানি যে এটি কতটা মজার।

Figure 1: Developer days before and after Open AI. Source: r/ProgrammerHumor

ChatGPT সহায়ক কিন্তু অবিশ্বস্ত হতে পারে, তাই মনে রাখবেন:

ChatGPT হল "শুধু" একজন সহকারী, এবং কোডটি সঠিক কিনা তা নিশ্চিত করার জন্য আপনি দায়ী!

প্রকৃতপক্ষে, চ্যাটজিপিটি একটি উচ্চ-মানের টিউটোরিয়াল বা অফিসিয়াল ডকুমেন্টেশনের মতো একটি প্রামাণিক উৎস নয়।

এখানে Daniel Vassallo এর একটি আকর্ষণীয় টুইট রয়েছে:

Graphical user interface, text, application, email

Description automatically generated

Making the most of ChatGPT with Prompt Engineering

চ্যাটজিপিটি এবং অন্যান্য AI সরঞ্জামগুলোর সর্বাধিক ব্যবহার করতে, আপনাকে প্রম্পট ইঞ্জিনিয়ারিংয়ে ভাল হতে হবে ।

এখানে কিছু থটস আছে যা আমি এটি সম্পর্কে শেয়ার করেছি:

প্রম্পট ইঞ্জিনিয়ারিং অবশ্যই আজ একটি মূল্যবান দক্ষতা। কিন্তু ভবিষ্যতে AI কী ভূমিকা পালন করবে?

Will AI take your job away?

ডেভেলপার টুলসগুলো আরও ভালো হচ্ছে।

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

আমরা যদি কৌশলগতভাবে এটিকে ব্যবহার করতে শিখি তাহলে AI আমাদের আরও ভালো সফ্টওয়্যার দ্রুত ডেভেলপ করতে সাহায্য করতে পারে, এবং আপাতত, ChatGPT এবং GitHub Copilot আমাদের মৌলিক প্রোগ্রামিং সমস্যা সমাধানে সাহায্য করতে পারে।

কিন্তু AI যেভাবে উন্নত হচ্ছে, আমাদের ভাবতে হবে:

  • এটা কি আমাদের কাজ কেড়ে নেবে?

আমি এই বিষয়ে Fireship কে কুয়োট করবো, কারণ তিনি ইতিমধ্যে GitHub Copilot এবং ChatGPT সম্পর্কে কিছু দুর্দান্ত ভিডিও তৈরি করেছেন। তার মতে:

  • স্টেপ ১ - ডেভেলপাররা কোড ডেটা শেয়ার করে
  • স্টেপ ২ - সেই ডেটা দিয়ে একটি AI তৈরি করে
  • স্টেপ ৩ - ডেভেলপারদের সাথে এআইকে শক্তিশালী করে 
  • স্টেপ ৪ - AI দিয়ে ডেভেলপারদের প্রতিস্থাপন করে 

মনে হচ্ছে আমরা আজ ৩য় স্টেপে আছি, এবং শুনছি GPT-4 দ্রুতি আসতে চলেছে।

আসলে কী ঘটবে তা খুঁজে বের করার জন্য, আমি ChatGPT-কে একটি শেষ প্রশ্ন জিজ্ঞাসা করার সিদ্ধান্ত নিয়েছি। 

Figure 2: Will ChatGPT take our jobs away?

হ্যাপি কোডিং!

References

ChatGPT কীভাবে কাজ করে এবং এটি কী করতে পারে তা আরও ভালোভাবে বুঝতে, আমি এই রিসোর্সগুলোকে সহায়ক বলে মনে করেছি:

Share this article

অনলাইন লাইভ স্কিল ডেভেলপমেন্ট প্ল্যাটফর্ম।

ডাউনলোড করুন ওস্তাদ অ্যাপ

কমিউনিটি -এর সাথে কানেক্টেড থাকতে