সুপারিশ ব্যবস্থা আমাদের জীবনের একটি অবিচ্ছেদ্য এবং অপরিহার্য অংশ হয়ে উঠেছে। এই বুদ্ধিমান অ্যালগরিদমগুলি আমাদের অনলাইন অভিজ্ঞতাগুলিকে আকার দিতে, আমরা যে সামগ্রী ব্যবহার করি, আমরা যে পণ্যগুলি কিনি এবং আমরা যে পরিষেবাগুলি অন্বেষণ করি তা প্রভাবিত করে৷ আমরা Netflix- এর মতো প্ল্যাটফর্মে বিষয়বস্তু স্ট্রিম করছি, Spotify- এ নতুন মিউজিক আবিষ্কার করছি বা অনলাইনে কেনাকাটা করছি না কেন, সুপারিশ সিস্টেমগুলি আমাদের মিথস্ক্রিয়াকে ব্যক্তিগতকৃত এবং উন্নত করার জন্য নীরবে পর্দার আড়ালে কাজ করছে।
এই সুপারিশ সিস্টেমগুলির অনন্য উপাদান হল ঐতিহাসিক আচরণ এবং ব্যবহারকারীর নিদর্শনগুলির উপর ভিত্তি করে আমাদের পছন্দগুলি বোঝার এবং ভবিষ্যদ্বাণী করার ক্ষমতা। আমাদের অতীতের পছন্দগুলি বিশ্লেষণ করে, এই সিস্টেমগুলি আমাদের আগ্রহের সাথে সারিবদ্ধ বিষয়বস্তু/পণ্যগুলির সাথে আমাদের পরিচয় করিয়ে দেওয়ার সময় আমাদের সময় এবং শ্রম সাশ্রয় করে, উপযোগী পরামর্শগুলি তৈরি করে৷ এটি ব্যবহারকারীর সন্তুষ্টি বাড়ায় এবং আবিষ্কারকে উৎসাহিত করে, নতুন এবং প্রাসঙ্গিক অফারগুলির সাথে আমাদের পরিচয় করিয়ে দেয় যা আমরা অন্যথায় সম্মুখীন হইনি।
উচ্চ স্তরে, বিকাশকারীরা বোঝেন যে এই অ্যালগরিদমগুলি মেশিন লার্নিং এবং গভীর শিক্ষার সিস্টেম দ্বারা চালিত হয় (আন্তঃপরিবর্তনযোগ্যভাবে নিউরাল নেটওয়ার্ক বলা হয়), কিন্তু আমি যদি আপনাকে বলি যে আপনার নিউরাল স্থাপনের যন্ত্রণার মধ্য দিয়ে না গিয়ে একটি সুপারিশ ইঞ্জিন তৈরি করার একটি উপায় আছে? নেট বা মেশিন লার্নিং মডেল?
এই প্রশ্নটি বিশেষভাবে প্রারম্ভিক এবং মধ্য-পর্যায়ের স্টার্টআপগুলির প্রসঙ্গে প্রাসঙ্গিক কারণ তাদের মডেলগুলিকে প্রশিক্ষণ দেওয়ার জন্য তাদের কাছে প্রচুর স্ট্রাকচার্ড ডেটা নেই। এবং আমরা ইতিমধ্যে জানি, বেশিরভাগ মেশিন লার্নিং মডেল সঠিক প্রশিক্ষণের ডেটা ছাড়া সঠিক ভবিষ্যদ্বাণী দেবে না।
আমি সম্প্রতি একটি জন্য একটি মৌলিক সুপারিশ ইঞ্জিন তৈরি এবং স্থাপন করেছি
আমি একটি বিস্তৃত ছিল
একটি উচ্চ স্তরে, আমাদের প্রকৌশল দৃষ্টিকোণ থেকে নিম্নলিখিত প্রয়োজনীয়তা ছিল -
সিস্টেমটি কীওয়ার্ড আকারে ব্যবহারকারীর আগ্রহ ক্যাপচার করতে সক্ষম হওয়া উচিত। সিস্টেমটি নির্দিষ্ট কীওয়ার্ডের সাথে ব্যবহারকারীর আগ্রহের স্তরকে শ্রেণীবদ্ধ করতে সক্ষম হওয়া উচিত।
সিস্টেমটি অন্য ব্যবহারকারীদের প্রতি ব্যবহারকারীর আগ্রহ ক্যাপচার করতে সক্ষম হওয়া উচিত। এটি অন্য ব্যবহারকারীর দ্বারা তৈরি সামগ্রীতে ব্যবহারকারীর আগ্রহের স্তরকে শ্রেণিবদ্ধ করতে সক্ষম হওয়া উচিত।
সিস্টেমটি ব্যবহারকারীর আগ্রহের উপর ভিত্তি করে উচ্চ-মানের সুপারিশ তৈরি করতে সক্ষম হওয়া উচিত।
সিস্টেমটি নিশ্চিত করতে সক্ষম হওয়া উচিত যে ব্যবহারকারীর দ্বারা ইতিমধ্যে দেখা/প্রত্যাখ্যান করা সুপারিশগুলি X সংখ্যক দিনের জন্য পুনরায় প্রদর্শিত হবে না।
একই ক্রিয়েটরদের পোস্টগুলি একই পৃষ্ঠায় গোষ্ঠীভুক্ত না হয় তা নিশ্চিত করার জন্য সিস্টেমের যুক্তি থাকা উচিত । একটি ব্যবহারকারী যদি দশটি পোস্ট (আমাদের পৃষ্ঠার আকার) ব্যবহার করে তবে সেগুলি বিভিন্ন নির্মাতাদের থেকে হওয়া উচিত তা নিশ্চিত করার জন্য সিস্টেমের যথাসাধ্য চেষ্টা করা উচিত।
সিস্টেম দ্রুত হতে হবে. P99 লেটেন্সির 150 মিলিসেকেন্ডের কম।
অন্যান্য সমস্ত অ-কার্যকর প্রয়োজনীয়তা, যেমন উচ্চ প্রাপ্যতা, মাপযোগ্যতা, নিরাপত্তা, নির্ভরযোগ্যতা, রক্ষণাবেক্ষণ, ইত্যাদি পূরণ করা উচিত।
আবার, এটি সমস্যা বিবৃতিগুলির একটি অত্যন্ত অতি সরলীকৃত তালিকা। বাস্তবে, নথিগুলি 3000+ শব্দের ছিল কারণ তারা আমাদের বিদ্যমান সিস্টেমে এই সুপারিশ ইঞ্জিনকে একীভূত করার সময় অনেকগুলি প্রান্তের কেস এবং কর্নার কেসগুলিকে কভার করে। এর সমাধানের দিকে এগিয়ে যাওয়া যাক।
আমি একে একে সমস্যার সমাধান নিয়ে আলোচনা করব এবং তারপর পুরো সিস্টেমের সামগ্রিক কাজ বর্ণনা করব।
এর জন্য আমরা একটি নামক কিছু তৈরি করেছি
আপনি উপরের ছবিটি থেকে দেখতে পাচ্ছেন, আমরা অনেক তথ্য সংরক্ষণ করছি, যেমন ইন্টারঅ্যাকশনের সংখ্যা (লাইক, মন্তব্য, শেয়ার) এবং এই ইন্টারঅ্যাকশনগুলির পুনরুদ্ধার (যখন সেগুলি শেষ হয়েছিল) দুটি ব্যবহারকারীর মধ্যে সম্পর্কের ডেটা হিসাবে। একটি ব্যবহারকারী এবং একটি আগ্রহ. এমনকি আমরা দুটি ভিন্ন আগ্রহের কীওয়ার্ডের মধ্যে সম্পর্ক সংরক্ষণ করছি। আমি ব্যবহার করতাম
এই আগ্রহের কীওয়ার্ডগুলি প্রধানত বিশেষ্য। এই কীওয়ার্ড (বিশেষ্য) মধ্যে একটি পোস্টের বিষয়বস্তু ভেঙ্গে নিচে একটি সিস্টেম আছে. এটি AWS বোঝা দ্বারা চালিত; একটি প্রাকৃতিক-ভাষা প্রক্রিয়াকরণ (NLP) পরিষেবা যা মেশিন লার্নিং ব্যবহার করে পাঠ্যকে সত্তা, মূল বাক্যাংশ, ইত্যাদিতে বিভক্ত করতে। আবার, আপনি এটি সম্পন্ন করার জন্য যে কোনও পরিচালিত NLP পরিষেবা (বেশ কিছু উপলব্ধ) ব্যবহার করতে পারেন। আপনাকে আপনার মেশিন-লার্নিং মডেলগুলি শিখতে বা স্থাপন করার দরকার নেই! আপনি যদি ইতিমধ্যেই মেশিন লার্নিং বুঝতে পারেন, তাহলে আপনি পরীক্ষা করতে পারেন
নিম্নলিখিত চিত্রটি সিস্টেমটি কীভাবে কাজ করে তার একটি সরলীকৃত উচ্চ-স্তরের উপস্থাপনা।
যদিও উপরেরটি সহজ দেখায়, প্রতিটি ধাপে আরও অনেক কিছু চলছে, এবং সেই জিনিসগুলিকে সাবধানে চিন্তা করতে হবে এবং তারপরে সিস্টেমটি সর্বোত্তমভাবে কাজ করছে কিনা তা নিশ্চিত করার জন্য প্রোগ্রাম করতে হবে।
আমাকে ধাপে ধাপে ব্যাখ্যা করা যাক:
এই সুপারিশগুলি তৈরি করতে, প্রথমে, আমাদের একটি পোস্টের বিষয়বস্তুকে এমন কিছুতে রূপান্তর করতে হবে -
ভেক্টর এমবেডিং তৈরি করার জন্য, আপনি আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে যে কোনো বিশিষ্ট এমবেডিং মডেল যেমন OpenAI এমবেডিং মডেল , অ্যামাজন টাইটান বা কোনো ওপেন-সোর্স টেক্সট এমবেডিং মডেল ব্যবহার করতে পারেন। আমরা Amazon Titan এর বন্ধুত্বপূর্ণ মূল্য, কর্মক্ষমতা এবং অপারেশনাল সহজতার কারণে এর সাথে গিয়েছিলাম।
এখন, এখানে জিনিসগুলি আকর্ষণীয় হয়ে ওঠে। আপনি আপনার নির্দিষ্ট ব্যবসার চাহিদার উপর ভিত্তি করে প্রশ্নগুলি ডিজাইন করতে চান। উদাহরণস্বরূপ, আমরা একটি নির্দিষ্ট কীওয়ার্ড বা ব্যবহারকারীর সাথে বাগদানের সংখ্যার চেয়ে আগ্রহের প্রশ্ন করার সময় ব্যস্ততার নতুনত্বকে বেশি গুরুত্ব দিই। আমরা ব্যবহারকারীর বিভিন্ন ধরণের আগ্রহ - কীওয়ার্ড বা অন্য ব্যবহারকারীর সন্ধান করতে একাধিক সমান্তরাল প্রশ্নও চালাই। যেহেতু আমরা একজন একক ব্যবহারকারীর জন্য একাধিক ফিড তৈরি করি, তাই আমরা প্রবণতা অনুসারে একটি নির্দিষ্ট বিষয়ের প্রচার করার জন্য কিছু প্রশ্নও চালাই (উদাহরণস্বরূপ, আপনি বড়দিনের কাছাকাছি ক্রিসমাস সম্পর্কিত অনেক পোস্ট বা ভূমিকম্প হলে ভূমিকম্প-সম্পর্কিত পোস্ট দেখতে পাবেন)। বলা বাহুল্য, এই বিষয়টি শুধুমাত্র প্রশ্নের ফলাফলে উঠে আসবে যদি ব্যবহারকারী তাদের ভ্রমণে তাদের প্রতি কিছু আগ্রহ প্রকাশ করে থাকে।
সুতরাং, সমস্ত ব্যবহারকারীর আগ্রহের একটি বড় তালিকা পেতে আপনার ব্যবসায়িক ব্যবহারের ক্ষেত্রে এবং আপনি যে আচরণটি চালাতে এবং একাধিক অনুসন্ধান চালাতে চান তার জন্য উপযুক্ত যুক্তি চয়ন করুন৷
ভেক্টর ডাটাবেস প্রধানত ব্যবহৃত হয় একটি নির্দিষ্ট ধরনের অনুসন্ধান সম্পাদনের জন্য
ক্যাশে ডাটাবেস কারণ একটি সমস্যা যা আমাদের সমাধান করতে হবে তা হল গতি। আমরা একটি নির্দিষ্ট ব্যবহারকারীর জন্য পোস্টের অনন্য আইডি সংরক্ষণ করার জন্য redis সাজানো সেট ব্যবহার করেছি। আমরা redis সাজানো সেট ব্যবহার করেছি কারণ ব্যবহারকারীর ফিডে পোস্টের ক্রম গুরুত্বপূর্ণ। এছাড়াও, আরেকটি সমস্যা যা আপনাকে সমাধান করতে হবে তা হল "একই পৃষ্ঠায় একই নির্মাতাদের পোস্টগুলিকে গোষ্ঠীভুক্ত করা হয়নি তা নিশ্চিত করার জন্য সিস্টেমের যুক্তি থাকা উচিত "। একই স্রষ্টার কাছ থেকে বিষয়বস্তুর পুনরাবৃত্তি এড়াতে, আমরা একটি সাধারণ অ্যালগরিদম লিখেছি যা নিশ্চিত করে যে যদি একটি নির্দিষ্ট স্রষ্টার পোস্ট একটি নির্দিষ্ট ব্যবহারকারীর ফিডে (বাছাই করা সেট) যে কোনও অবস্থানে সন্নিবেশ করা হয় তবে আমরা একই নির্মাতার থেকে অন্য কোনও পোস্ট সন্নিবেশ করি না ক্রমাগত দশটি অবস্থানের জন্য (শেষ ব্যবহারকারীকে ফিড পরিবেশন করার সময় আমাদের পৃষ্ঠার আকার 10 থাকে, তাই জটিলতা এড়াতে আমরা এটিকে স্থির রেখেছি)।
ব্যবহারকারীর একটি নির্দিষ্ট সুপারিশের ক্রম নির্ধারণের জন্য, আমরা নিম্নলিখিত বিষয়গুলিতে ফ্যাক্টর করেছি -
এই ব্যবহারকারীর জন্য একটি নির্দিষ্ট আগ্রহের (বা অন্য ব্যবহারকারী) সাথে সম্পর্কের শক্তি : এটি একটি গাণিতিক সূত্র দ্বারা নির্ধারিত হয় যা সামাজিক গ্রাফ থেকে বিভিন্ন ডেটা পয়েন্ট নেয়। এই সবই হল এনগেজমেন্ট ডেটা যেমন শেষ লাইকের টাইমস্ট্যাম্প, তৈরি করা লাইকের সংখ্যা, শেষ কমেন্ট ইত্যাদি। ব্যবহারকারীর এনগেজমেন্ট আচরণ কোনো কিছুতে তাদের আগ্রহের সূচক।
প্ল্যাটফর্মে পোস্টের জনপ্রিয়তা: এটি নির্ধারণ করার জন্য, আমরা একটি অ্যালগরিদম তৈরি করেছি যা বিভিন্ন বিষয় যেমন এনগেজমেন্ট, এনগেজমেন্ট-টু-ইমপ্রেশন রেশিও, এনগেজমেন্ট স্কোর তৈরি করতে অনন্য ব্যবহারকারীর সংখ্যা ইত্যাদি গ্রহণ করে। একটি প্ল্যাটফর্ম স্তরে পোস্ট করুন।
কিছু ফিডে, আমরা জনপ্রিয়তাকে অগ্রাধিকার দিই; অন্যদের মধ্যে, আমরা সামাজিক গ্রাফকে অগ্রাধিকার দিই। তবে বেশিরভাগই, তাদের সবই দুটির একটি স্বাস্থ্যকর মিশ্রণ।
আপনি উপরের চিত্র থেকে দেখতে পাচ্ছেন, সিস্টেমটি ইচ্ছাকৃতভাবে খুব সহজ রাখা হয়েছে। সিস্টেম কিভাবে কাজ করে তা নিচে দেওয়া হল-
যখন ব্যবহারকারী A একটি পোস্ট তৈরি করে, পোস্ট পরিষেবা, সেই পোস্টটি সংরক্ষণ করার পরে, একটি পাব/সাব ইভেন্টকে একটি সারিতে ট্রিগার করে, যা প্রার্থী তৈরির জন্য একটি ব্যাকগ্রাউন্ড পরিষেবা দ্বারা প্রাপ্ত হয়। আমরা ব্যাবহার করি
এই ব্যাকগ্রাউন্ড পরিষেবাটি অ্যাসিঙ্ক্রোনাসভাবে গ্রহণ করে এবং পূর্বে আলোচনা করা কার্যকারিতাগুলি সম্পাদন করে - গোপনীয়তা পরীক্ষা, সংযম চেক এবং কীওয়ার্ড জেনারেশন এবং তারপর ভেক্টর এমবেডিং তৈরি করে এবং ভেক্টর ডাটাবেসে সঞ্চয় করে। আমরা ব্যবহার করছি
যখনই কোনো ব্যবহারকারী আমাদের প্রধান NoSQL ডাটাবেস আপডেট করার পরে (লাইক/মন্তব্য/শেয়ার, ইত্যাদি) নিযুক্ত হন, পোস্ট-সার্ভিস সুপারিশ ইঞ্জিন পরিষেবায় একটি পাব/সাব ইভেন্ট ট্রিগার করে।
এই সুপারিশ ইঞ্জিন পরিষেবা গ্রাফ ডাটাবেস আপডেট করে এবং তারপর ANN অনুসন্ধান এবং Redis ডাটাবেস আপডেট করার মাধ্যমে কাছাকাছি রিয়েল-টাইমে ব্যবহারকারীর প্রস্তাবিত ফিড আপডেট করে। সুতরাং, ব্যবহারকারীরা যত বেশি ইন্টারঅ্যাক্ট করবে, তত ভাল ফিড পেতে থাকবে। সুপারিশগুলি কীওয়ার্ডের একটি নির্দিষ্ট তালিকার প্রতি পক্ষপাতদুষ্ট নয় তা নিশ্চিত করার জন্য চেক রয়েছে ৷ আমরা গ্রাফ ডাটাবেস জিজ্ঞাসা করার সময় এই চেকগুলি সঞ্চালিত হয়। এই পরিষেবাটি অ্যাসিঙ্ক্রোনাসভাবে এনগেজমেন্ট স্কোর আপডেট করে। এনগেজমেন্ট স্কোরগুলিও পোস্টটি দেখার ব্যবহারকারীদের উপর পুনরায় গণনা করা হয়।
যেহেতু উপরের সমস্ত পদক্ষেপগুলি পর্দার পিছনে অ্যাসিঙ্ক্রোনাসভাবে সম্পাদিত হয়, তাই এই গণনাগুলি শেষ-ব্যবহারকারীর অভিজ্ঞতার উপর কোন প্রভাব ফেলে না।
ফিডটি শেষ পর্যন্ত একটি ফিড পরিষেবার মাধ্যমে শেষ ব্যবহারকারীকে পরিবেশন করা হয়। যেহেতু এই পরিষেবাটি শুধুমাত্র redis এবং আমাদের প্রধান NoSQL ডাটাবেসের উপর একটি সন্ধান করে (
কিছু সেবা লেখা আছে
আমরা ব্যবহার করছি
আমরা ব্যাবহার করি
আপনি যেমন কল্পনা করতে পারেন, যেকোন ব্যবহারের ক্ষেত্রে একটি মৌলিক সুপারিশ ইঞ্জিন তৈরি করতে এই একই সেটআপটি টুইক করা যেতে পারে। কিন্তু, যেহেতু আমাদের একটি সোশ্যাল নেটওয়ার্ক, তাই এই সিস্টেমটিকে আরও দক্ষ করে তোলার জন্য আমাদের কিছু পরিবর্তনের প্রয়োজন হবে।
ব্যবহারকারীর জন্য সবচেয়ে প্রাসঙ্গিক কীওয়ার্ড এবং ব্যবহারকারীদের ভবিষ্যদ্বাণী করতে সামাজিক গ্রাফ স্তরে মেশিন লার্নিং/ডিপ লার্নিং অ্যালগরিদমের প্রয়োজন হবে। বর্তমানে, ডেটা সেটটি খুব ছোট যে কোনো কিছুর সঠিক ভবিষ্যদ্বাণী করার জন্য এটি একটি খুব নতুন পণ্য। যাইহোক, ডেটা বাড়ার সাথে সাথে আমাদের মেশিন লার্নিং অ্যালগরিদমের আউটপুট দিয়ে বর্তমান সাধারণ প্রশ্ন এবং সূত্রগুলি প্রতিস্থাপন করতে হবে।
বিভিন্ন কীওয়ার্ড এবং ব্যবহারকারীদের মধ্যে সম্পর্ক সূক্ষ্ম-টিউন করা উচিত এবং আরও দানাদার করা উচিত। তারা এখন খুব উচ্চ পর্যায়ে আছে. কিন্তু তাদের আরও গভীর হতে হবে। সুপারিশগুলি প্রথমে পরিমার্জিত করার জন্য আমাদের গ্রাফে দ্বিতীয় এবং তৃতীয়-ডিগ্রির সম্পর্কগুলি অন্বেষণ করতে হবে।
আমরা এখনই আমাদের এমবেডিং মডেলগুলিতে কোনও সূক্ষ্ম-টিউনিং করছি না৷ অদূর ভবিষ্যতে আমাদের এটি করতে হবে।
আমি আশা করি আপনি এই ব্লগ সহায়ক খুঁজে পেয়েছেন. আপনার যদি কোন প্রশ্ন, সন্দেহ বা পরামর্শ থাকে, অনুগ্রহ করে নির্দ্বিধায় আমার সাথে যোগাযোগ করুন
এছাড়াও এখানে প্রকাশিত.