# ভাষা বোঝা ![এই পাঠের একটি স্কেচনোট সংক্ষিপ্ত বিবরণ](../../../../../translated_images/lesson-22.6148ea28500d9e00c396aaa2649935fb6641362c8f03d8e5e90a676977ab01dd.bn.jpg) > স্কেচনোট: [নিত্য নারাসিমহান](https://github.com/nitya)। বড় সংস্করণের জন্য ছবিতে ক্লিক করুন। ## প্রাক-পাঠ কুইজ [প্রাক-পাঠ কুইজ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/43) ## ভূমিকা গত পাঠে আপনি বক্তৃতাকে টেক্সটে রূপান্তর করেছিলেন। একটি স্মার্ট টাইমার প্রোগ্রাম করার জন্য এটি ব্যবহার করতে হলে, আপনার কোডকে বলতে হবে কী বলা হয়েছে তা বুঝতে হবে। আপনি ধরে নিতে পারেন যে ব্যবহারকারী একটি নির্দিষ্ট বাক্য বলবে, যেমন "৩ মিনিটের টাইমার সেট করুন", এবং সেই বাক্যটি বিশ্লেষণ করে টাইমার কতক্ষণ চলবে তা নির্ধারণ করবেন। কিন্তু এটি খুব ব্যবহারকারী-বান্ধব নয়। যদি একজন ব্যবহারকারী বলেন "৩ মিনিটের জন্য একটি টাইমার সেট করুন", আপনি বা আমি বুঝতে পারব তারা কী বোঝাতে চেয়েছেন, কিন্তু আপনার কোড বুঝতে পারবে না, কারণ এটি একটি নির্দিষ্ট বাক্য প্রত্যাশা করছে। এখানেই ভাষা বোঝার প্রয়োজন হয়, যেখানে AI মডেল ব্যবহার করে টেক্সটকে ব্যাখ্যা করা হয় এবং প্রয়োজনীয় বিবরণ প্রদান করা হয়। উদাহরণস্বরূপ, "৩ মিনিটের টাইমার সেট করুন" এবং "৩ মিনিটের জন্য একটি টাইমার সেট করুন" উভয়ই বুঝতে পারা যায় যে ৩ মিনিটের জন্য একটি টাইমার প্রয়োজন। এই পাঠে আপনি ভাষা বোঝার মডেল সম্পর্কে শিখবেন, কীভাবে সেগুলি তৈরি, প্রশিক্ষণ এবং কোড থেকে ব্যবহার করবেন। এই পাঠে আমরা আলোচনা করব: * [ভাষা বোঝা](../../../../../6-consumer/lessons/2-language-understanding) * [একটি ভাষা বোঝার মডেল তৈরি করুন](../../../../../6-consumer/lessons/2-language-understanding) * [ইচ্ছা এবং সত্তা](../../../../../6-consumer/lessons/2-language-understanding) * [ভাষা বোঝার মডেল ব্যবহার করুন](../../../../../6-consumer/lessons/2-language-understanding) ## ভাষা বোঝা মানুষ হাজার হাজার বছর ধরে ভাষা ব্যবহার করে যোগাযোগ করছে। আমরা শব্দ, শব্দ বা ক্রিয়ার মাধ্যমে যোগাযোগ করি এবং যা বলা হয়েছে তা বুঝি—শব্দ, শব্দ বা ক্রিয়ার অর্থ এবং তাদের প্রেক্ষাপট। আমরা আন্তরিকতা এবং ব্যঙ্গ বুঝি, যা আমাদের কণ্ঠস্বরের সুরের উপর নির্ভর করে একই শব্দকে বিভিন্ন অর্থ দিতে পারে। ✅ সাম্প্রতিক সময়ে আপনার কিছু কথোপকথন সম্পর্কে চিন্তা করুন। সেই কথোপকথনের কতটুকু একটি কম্পিউটারের জন্য কঠিন হবে কারণ এটি প্রেক্ষাপটের প্রয়োজন? ভাষা বোঝা, যা প্রাকৃতিক-ভাষা বোঝা নামেও পরিচিত, কৃত্রিম বুদ্ধিমত্তার একটি ক্ষেত্রের অংশ যা প্রাকৃতিক-ভাষা প্রক্রিয়াকরণ (বা NLP) নামে পরিচিত। এটি পাঠ্য বোঝার সাথে সম্পর্কিত, শব্দ বা বাক্যের বিবরণ বোঝার চেষ্টা করে। আপনি যদি অ্যালেক্সা বা সিরি-এর মতো একটি ভয়েস অ্যাসিস্ট্যান্ট ব্যবহার করেন, তবে আপনি ভাষা বোঝার পরিষেবা ব্যবহার করেছেন। এগুলি হল পর্দার আড়ালে থাকা AI পরিষেবাগুলি যা "অ্যালেক্সা, টেলর সুইফটের সর্বশেষ অ্যালবাম চালান" কে আমার মেয়েকে তার প্রিয় সুরে নাচতে পরিণত করে। > 💁 কম্পিউটার, তাদের সমস্ত অগ্রগতির পরেও, এখনও পাঠ্য সত্যিই বুঝতে অনেক দূরে। যখন আমরা কম্পিউটারের সাথে ভাষা বোঝার কথা বলি, তখন আমরা মানুষের যোগাযোগের মতো উন্নত কিছু বোঝাতে চাই না। আমরা বরং কিছু শব্দ নিয়ে প্রয়োজনীয় মূল বিবরণ বের করার কথা বলি। মানুষ হিসেবে আমরা ভাষা বুঝি খুব সহজেই। যদি আমি অন্য একজন মানুষকে বলি "টেলর সুইফটের সর্বশেষ অ্যালবাম চালান", তারা স্বাভাবিকভাবেই বুঝবে আমি কী বলতে চাইছি। একটি কম্পিউটারের জন্য এটি কঠিন। এটি শব্দগুলোকে, বক্তৃতা থেকে টেক্সটে রূপান্তরিত করে, এবং নিম্নলিখিত তথ্য বের করতে হবে: * সঙ্গীত চালানো দরকার * সঙ্গীতটি শিল্পী টেলর সুইফটের * নির্দিষ্ট সঙ্গীতটি একটি সম্পূর্ণ অ্যালবাম, যেখানে একাধিক ট্র্যাক রয়েছে এবং সেগুলি ক্রমানুসারে রয়েছে * টেলর সুইফটের অনেক অ্যালবাম রয়েছে, তাই সেগুলি কালানুক্রমিকভাবে সাজাতে হবে এবং সর্বশেষ প্রকাশিতটি প্রয়োজন ✅ কিছু অন্যান্য বাক্য সম্পর্কে চিন্তা করুন যা আপনি অনুরোধ করার সময় বলেছেন, যেমন কফি অর্ডার করা বা পরিবারের সদস্যকে কিছু দিতে বলা। সেগুলোকে এমনভাবে ভেঙে দেখুন যে একটি কম্পিউটার বাক্যটি বুঝতে কী তথ্য বের করতে হবে। ভাষা বোঝার মডেল হল AI মডেল যা ভাষা থেকে নির্দিষ্ট বিবরণ বের করতে প্রশিক্ষিত হয় এবং তারপর স্থানান্তর শেখার মাধ্যমে নির্দিষ্ট কাজের জন্য প্রশিক্ষিত হয়। ঠিক যেমন আপনি একটি কাস্টম ভিশন মডেলকে একটি ছোট সেট ইমেজ ব্যবহার করে প্রশিক্ষণ দিয়েছিলেন, আপনি একটি মডেল নিতে পারেন এবং এটি আপনার বোঝার জন্য প্রয়োজনীয় টেক্সট দিয়ে প্রশিক্ষণ দিতে পারেন। ## একটি ভাষা বোঝার মডেল তৈরি করুন ![LUIS লোগো](../../../../../translated_images/luis-logo.5cb4f3e88c020ee6df4f614e8831f4a4b6809a7247bf52085fb48d629ef9be52.bn.png) আপনি LUIS ব্যবহার করে ভাষা বোঝার মডেল তৈরি করতে পারেন, যা মাইক্রোসফটের একটি ভাষা বোঝার পরিষেবা এবং এটি Cognitive Services-এর অংশ। ### কাজ - একটি লেখার রিসোর্স তৈরি করুন LUIS ব্যবহার করতে হলে আপনাকে একটি লেখার রিসোর্স তৈরি করতে হবে। 1. আপনার `smart-timer` রিসোর্স গ্রুপে একটি লেখার রিসোর্স তৈরি করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন: ```python az cognitiveservices account create --name smart-timer-luis-authoring \ --resource-group smart-timer \ --kind LUIS.Authoring \ --sku F0 \ --yes \ --location ``` ``-এর জায়গায় আপনার রিসোর্স গ্রুপ তৈরি করার সময় ব্যবহৃত অবস্থানটি প্রতিস্থাপন করুন। > ⚠️ LUIS সব অঞ্চলে উপলব্ধ নয়, তাই যদি আপনি নিম্নলিখিত ত্রুটি পান: > > ```output > InvalidApiSetId: The account type 'LUIS.Authoring' is either invalid or unavailable in given region. > ``` > > তাহলে একটি ভিন্ন অঞ্চল বেছে নিন। এটি একটি বিনামূল্যের স্তরের LUIS লেখার রিসোর্স তৈরি করবে। ### কাজ - একটি ভাষা বোঝার অ্যাপ তৈরি করুন 1. আপনার ব্রাউজারে [luis.ai](https://luis.ai?WT.mc_id=academic-17441-jabenn) খুলুন এবং Azure-এর জন্য আপনি যে অ্যাকাউন্ট ব্যবহার করছেন তা দিয়ে সাইন ইন করুন। 1. ডায়ালগে প্রদত্ত নির্দেশাবলী অনুসরণ করে আপনার Azure সাবস্ক্রিপশন নির্বাচন করুন, তারপর আপনি যে `smart-timer-luis-authoring` রিসোর্সটি তৈরি করেছেন তা নির্বাচন করুন। 1. *Conversation apps* তালিকা থেকে **New app** বোতামটি নির্বাচন করে একটি নতুন অ্যাপ তৈরি করুন। নতুন অ্যাপটির নাম দিন `smart-timer` এবং *Culture* আপনার ভাষায় সেট করুন। > 💁 একটি পূর্বাভাস রিসোর্সের জন্য একটি ক্ষেত্র রয়েছে। আপনি পূর্বাভাসের জন্য একটি দ্বিতীয় রিসোর্স তৈরি করতে পারেন, তবে বিনামূল্যের লেখার রিসোর্স প্রতি মাসে ১,০০০ পূর্বাভাস অনুমতি দেয় যা উন্নয়নের জন্য যথেষ্ট হওয়া উচিত, তাই আপনি এটি ফাঁকা রাখতে পারেন। 1. অ্যাপ তৈরি করার পরে প্রদর্শিত গাইডটি পড়ুন যাতে ভাষা বোঝার মডেল প্রশিক্ষণ দেওয়ার জন্য আপনাকে কী পদক্ষেপ নিতে হবে তা বোঝা যায়। এই গাইডটি পড়া শেষ হলে বন্ধ করুন। ## ইচ্ছা এবং সত্তা ভাষা বোঝা *ইচ্ছা* এবং *সত্তা*-এর উপর ভিত্তি করে। ইচ্ছা হল শব্দগুলোর উদ্দেশ্য, যেমন সঙ্গীত চালানো, টাইমার সেট করা বা খাবার অর্ডার করা। সত্তা হল ইচ্ছা কী নির্দেশ করছে, যেমন অ্যালবাম, টাইমারের সময়কাল বা খাবারের ধরন। মডেল যে বাক্যটি ব্যাখ্যা করে তাতে অন্তত একটি ইচ্ছা এবং ঐচ্ছিকভাবে এক বা একাধিক সত্তা থাকতে পারে। কিছু উদাহরণ: | বাক্য | ইচ্ছা | সত্তা | | --------------------------------------------------- | ------------------ | ---------------------------------------- | | "টেলর সুইফটের সর্বশেষ অ্যালবাম চালান" | *সঙ্গীত চালান* | *টেলর সুইফটের সর্বশেষ অ্যালবাম* | | "৩ মিনিটের টাইমার সেট করুন" | *টাইমার সেট করুন* | *৩ মিনিট* | | "আমার টাইমার বাতিল করুন" | *টাইমার বাতিল করুন* | কোনোটি নেই | | "৩টি বড় আনারস পিজ্জা এবং একটি সিজার সালাদ অর্ডার করুন" | *খাবার অর্ডার করুন* | *৩টি বড় আনারস পিজ্জা*, *সিজার সালাদ* | ✅ আপনি আগে যে বাক্যগুলো নিয়ে চিন্তা করেছিলেন, সেগুলোতে ইচ্ছা এবং কোনো সত্তা কী হতে পারে? LUIS প্রশিক্ষণ দিতে হলে প্রথমে সত্তাগুলো সেট করতে হবে। এগুলো নির্দিষ্ট শব্দের তালিকা হতে পারে, অথবা টেক্সট থেকে শেখা যেতে পারে। উদাহরণস্বরূপ, আপনি আপনার মেনু থেকে উপলব্ধ খাবারের একটি নির্দিষ্ট তালিকা প্রদান করতে পারেন, প্রতিটি শব্দের বিভিন্ন রূপ (বা সমার্থক শব্দ) সহ, যেমন *egg plant* এবং *aubergine* শব্দগুলো *aubergine*-এর রূপ। টাইমার সেট করার জন্য, আপনি সময়ের জন্য প্রি-বিল্ট সংখ্যা সত্তা এবং একক (যেমন মিনিট এবং সেকেন্ড) জন্য একটি সত্তা রাখতে পারেন। প্রতিটি এককের একাধিক রূপ থাকতে পারে, যেমন একবচন এবং বহুবচন—যেমন minute এবং minutes। একবার সত্তাগুলো সংজ্ঞায়িত হলে, আপনি ইচ্ছা তৈরি করবেন। এগুলো মডেল দ্বারা শেখা হয় উদাহরণ বাক্যগুলোর ভিত্তিতে যা আপনি প্রদান করেন (যা *utterances* নামে পরিচিত)। উদাহরণস্বরূপ, একটি *set timer* ইচ্ছার জন্য, আপনি নিম্নলিখিত বাক্যগুলো প্রদান করতে পারেন: * `১ সেকেন্ডের টাইমার সেট করুন` * `১ মিনিট এবং ১২ সেকেন্ডের জন্য একটি টাইমার সেট করুন` * `৩ মিনিটের জন্য একটি টাইমার সেট করুন` * `৯ মিনিট ৩০ সেকেন্ডের টাইমার সেট করুন` এরপর আপনি LUIS-কে জানাবেন এই বাক্যগুলোর কোন অংশগুলো সত্তার সাথে সম্পর্কিত: ![বাক্যটি সত্তা হিসেবে ভাঙা হয়েছে](../../../../../translated_images/sentence-as-intent-entities.301401696f9922590a99343f5c5d211b710b906f212f0d4d034cee3ffb610272.bn.png) বাক্যটি `১ মিনিট এবং ১২ সেকেন্ডের জন্য একটি টাইমার সেট করুন` এর ইচ্ছা হল `set timer`। এটি ২টি সত্তা এবং প্রতিটি সত্তার ২টি মান রয়েছে: | | সময় | একক | | ---------- | ---: | ------ | | ১ মিনিট | ১ | মিনিট | | ১২ সেকেন্ড | ১২ | সেকেন্ড | একটি ভালো মডেল প্রশিক্ষণ দিতে হলে, আপনাকে বিভিন্ন উদাহরণ বাক্য প্রদান করতে হবে যাতে কেউ একই জিনিসের জন্য বিভিন্নভাবে অনুরোধ করতে পারে। > 💁 যেকোনো AI মডেলের মতো, আপনি প্রশিক্ষণের জন্য যত বেশি এবং যত সঠিক ডেটা ব্যবহার করবেন, মডেল তত ভালো হবে। ✅ আপনি একই জিনিসের জন্য অনুরোধ করার বিভিন্ন উপায় সম্পর্কে চিন্তা করুন এবং একজন মানুষ কীভাবে তা বুঝবে। ### কাজ - ভাষা বোঝার মডেলে সত্তা যোগ করুন টাইমারের জন্য, আপনাকে ২টি সত্তা যোগ করতে হবে—একটি সময়ের একক (মিনিট বা সেকেন্ড) এবং একটি মিনিট বা সেকেন্ডের সংখ্যা। Microsoft Docs-এ [Quickstart: Build your app in LUIS portal](https://docs.microsoft.com/azure/cognitive-services/luis/luis-get-started-create-app?WT.mc_id=academic-17441-jabenn) ডকুমেন্টেশনে LUIS পোর্টাল ব্যবহার করার নির্দেশাবলী পাওয়া যাবে। 1. LUIS পোর্টাল থেকে *Entities* ট্যাব নির্বাচন করুন এবং **Add prebuilt entity** বোতামটি নির্বাচন করে *number* প্রি-বিল্ট সত্তা যোগ করুন। 1. **Create** বোতামটি ব্যবহার করে সময়ের এককের জন্য একটি নতুন সত্তা তৈরি করুন। সত্তার নাম দিন `time unit` এবং টাইপ *List* সেট করুন। *Normalized values* তালিকায় `minute` এবং `second` যোগ করুন এবং *synonyms* তালিকায় একবচন এবং বহুবচন রূপ যোগ করুন। প্রতিটি সমার্থক শব্দ যোগ করার পরে `return` চাপুন। | Normalized value | Synonyms | | ---------------- | --------------- | | minute | minute, minutes | | second | second, seconds | ### কাজ - ভাষা বোঝার মডেলে ইচ্ছা যোগ করুন 1. *Intents* ট্যাব থেকে **Create** বোতামটি নির্বাচন করে একটি নতুন ইচ্ছা তৈরি করুন। এই ইচ্ছার নাম দিন `set timer`। 1. উদাহরণ বাক্যগুলোতে মিনিট, সেকেন্ড এবং মিনিট ও সেকেন্ড একসাথে ব্যবহার করে টাইমার সেট করার বিভিন্ন উপায় লিখুন। উদাহরণ হতে পারে: * `১ সেকেন্ডের টাইমার সেট করুন` * `৪ মিনিটের টাইমার সেট করুন` * `চার মিনিট ছয় সেকেন্ডের টাইমার সেট করুন` * `৯ মিনিট ৩০ সেকেন্ডের টাইমার সেট করুন` * `১ মিনিট এবং ১২ সেকেন্ডের জন্য একটি টাইমার সেট করুন` * `৩ মিনিটের জন্য একটি টাইমার সেট করুন` * `৩ মিনিট এবং ১ সেকেন্ডের জন্য একটি টাইমার সেট করুন` * `তিন মিনিট এবং এক সেকেন্ডের জন্য একটি টাইমার সেট করুন` * `১ মিনিট এবং ১ সেকেন্ডের জন্য একটি টাইমার সেট করুন` * `৩০ সেকেন্ডের জন্য একটি টাইমার সেট করুন` * `১ সেকেন্ডের জন্য একটি টাইমার সেট করুন` সংখ্যাগুলো শব্দ এবং সংখ্যার মিশ্রণ করুন যাতে মডেল উভয়ই পরিচালনা করতে শিখে। 1. প্রতিটি উদাহরণ প্রবেশ করার সময়, LUIS সত্তাগুলো সনাক্ত করতে শুরু করবে এবং যে কোনো সত্তা খুঁজে পেলে আন্ডারলাইন এবং লেবেল করবে। ![LUIS উদাহরণগুলোর সংখ্যা এবং সময়ের একক আন্ডারলাইন করেছে](../../../../../translated_images/luis-intent-examples.25716580b2d2723cf1bafdf277d015c7f046d8cfa20f27bddf3a0873ec45fab7.bn.png) ### কাজ - মডেল প্রশিক্ষণ এবং পরীক্ষা করুন 1. একবার সত্তা এবং ইচ্ছাগুলো কনফিগার করা হলে, **Train** বোতামটি ব্যবহার করে মডেলটি প্রশিক্ষণ দিন। এই বোতামটি নির্বাচন করুন, এবং মডেলটি কয়েক সেকেন্ডের মধ্যে প্রশিক্ষণ সম্পন্ন করবে। প্রশিক্ষণের সময় বোতামটি নিষ্ক্রিয় থাকবে এবং সম্পন্ন হলে পুনরায় সক্রিয় হবে। 1. **Test** বোতামটি নির্বাচন করে ভাষা বোঝার মডেলটি পরীক্ষা করুন। `৫ মিনিট এবং ৪ সেকেন্ডের জন্য একটি টাইমার সেট করুন` এর মতো টেক্সট লিখুন এবং `return` চাপুন। বাক্যটি আপনি যে টেক্সট বক্সে লিখেছেন তার নিচে একটি বাক্সে প্রদর্শিত হবে এবং তার নিচে *top intent* বা সর্বোচ্চ সম্ভাব্যতার সাথে সনাক্ত করা ইচ্ছা প্রদর্শিত হবে। এটি `set timer` হওয়া উচিত। ইচ্ছার নামটি সঠিক ইচ্ছা সনাক্ত করার সম্ভাবনার সাথে প্রদর্শিত হবে। 1. **Inspect** অপশনটি নির্বাচন করে ফলাফলের বিশ্লেষণ দেখুন। আপনি সর্বোচ্চ স্কোরযুক্ত ইচ্ছা এবং তার শতাংশ সম্ভাবনা, পাশাপাশি সনাক্ত করা সত্তাগুলোর তালিকা দেখতে পাবেন। 1. *Test* প্যান বন্ধ করুন যখন আপনি পরীক্ষা শেষ করবেন। ### কাজ - মডেল প্রকাশ করুন এই মডেলটি কোড থেকে ব্যবহার করতে হলে আপনাকে এটি প্রকাশ করতে হবে। LUIS থেকে প্রকাশ করার সময়, আপনি এটি পরীক্ষার জন্য একটি স্টেজিং পরিবেশে বা সম্পূর্ণ প্রকাশের জন্য একটি প্রোডাকশন পরিবেশে প্রকাশ করতে পারেন। এই পাঠে, একটি স্টেজিং পরিবেশ যথেষ্ট। 1. LUIS পোর্টাল থেকে **Publish** বোতামটি নির্বাচন করুন। 1. *Staging slot* নিশ্চিত করুন এবং **Done** নির্বাচন করুন। অ্যাপটি প্রকাশিত হলে একটি বিজ্ঞপ্তি দেখতে পাবেন। 1. আপনি এটি curl ব্যবহার করে পরীক্ষা করতে পারেন। curl কমান্ড তৈরি করতে আপনাকে তিনটি মান প্রয়োজন—endpoint, application ID (App ID) এবং একটি API key। এগুলো **MANAGE** ট্যাব থেকে অ্যাক্সেস করা যাবে যা উপরের মেনু থেকে নির্বাচন করা যাবে। 1. *Settings* বিভাগ থেকে App ID কপি করুন। 1. *Azure Resources* বিভাগ থেকে *Authoring Resource* নির্বাচন করুন এবং *Primary Key* এবং *Endpoint URL* কপি করুন। 1. আপনার কমান্ড প্রম্পট বা টার্মিনালে নিচের curl কমান্ডটি চালান: ```sh curl "/luis/prediction/v3.0/apps//slots/staging/predict" \ --request GET \ --get \ --data "subscription-key=" \ --data "verbose=false" \ --data "show-all-intents=true" \ --data-urlencode "query=" ``` ``-এর জায়গায় *Azure Resources* বিভাগ থেকে প্রাপ্ত Endpoint URL বসান। ``-এর জায়গায় *Settings* বিভাগ থেকে প্রাপ্ত App ID বসান। ``-এর জায়গায় *Azure Resources* বিভাগ থেকে প্রাপ্ত Primary Key বসান। ``-এর জায়গায় আপনি যে বাক্যটি পরীক্ষা করতে চান তা বসান। 1. এই কলের আউটপুট একটি JSON ডকুমেন্ট হবে, যেখানে কুয়েরি, শীর্ষ intent এবং বিভিন্ন প্রকারের entities-এর তালিকা থাকবে। ```JSON { "query": "set a timer for 45 minutes and 12 seconds", "prediction": { "topIntent": "set timer", "intents": { "set timer": { "score": 0.97031575 }, "None": { "score": 0.02205793 } }, "entities": { "number": [ 45, 12 ], "time-unit": [ [ "minute" ], [ "second" ] ] } } } ``` উপরের JSON ডকুমেন্টটি `set a timer for 45 minutes and 12 seconds` কুয়েরি থেকে এসেছে: * `set timer` ছিল শীর্ষ intent, যার সম্ভাবনা ছিল ৯৭%। * দুটি *number* entity শনাক্ত হয়েছে, `45` এবং `12`। * দুটি *time-unit* entity শনাক্ত হয়েছে, `minute` এবং `second`। ## ভাষা বোঝার মডেল ব্যবহার করুন একবার প্রকাশিত হলে, LUIS মডেলটি কোড থেকে কল করা যেতে পারে। পূর্ববর্তী পাঠে, আপনি IoT Hub ব্যবহার করে ক্লাউড সার্ভিসের সাথে যোগাযোগ পরিচালনা করেছেন, টেলিমেট্রি পাঠিয়েছেন এবং কমান্ডের জন্য অপেক্ষা করেছেন। এটি খুবই অ্যাসিঙ্ক্রোনাস - টেলিমেট্রি পাঠানোর পর আপনার কোড কোনো প্রতিক্রিয়ার জন্য অপেক্ষা করে না, এবং যদি ক্লাউড সার্ভিস ডাউন থাকে, তবে আপনি তা জানতে পারবেন না। একটি স্মার্ট টাইমারের জন্য, আমরা তাৎক্ষণিক প্রতিক্রিয়া চাই, যাতে আমরা ব্যবহারকারীকে জানাতে পারি যে টাইমার সেট হয়েছে, অথবা ক্লাউড সার্ভিস উপলব্ধ নয় বলে সতর্ক করতে পারি। এটি করতে, আমাদের IoT ডিভাইস সরাসরি একটি ওয়েব এন্ডপয়েন্ট কল করবে, IoT Hub-এর উপর নির্ভর না করে। IoT ডিভাইস থেকে সরাসরি LUIS কল করার পরিবর্তে, আপনি একটি ভিন্ন ধরনের ট্রিগার সহ সার্ভারলেস কোড ব্যবহার করতে পারেন - একটি HTTP ট্রিগার। এটি আপনার ফাংশন অ্যাপকে REST অনুরোধ শোনার এবং সেগুলোর প্রতিক্রিয়া দেওয়ার অনুমতি দেয়। এই ফাংশনটি একটি REST এন্ডপয়েন্ট হবে যা আপনার ডিভাইস কল করতে পারবে। > 💁 যদিও আপনি সরাসরি IoT ডিভাইস থেকে LUIS কল করতে পারেন, সার্ভারলেস কোডের মতো কিছু ব্যবহার করা ভালো। এভাবে, যখন আপনি একটি উন্নত মডেল প্রশিক্ষণ দেন বা অন্য ভাষায় একটি মডেল প্রশিক্ষণ দেন, তখন শুধুমাত্র আপনার ক্লাউড কোড আপডেট করতে হবে, হাজার বা লক্ষ IoT ডিভাইসে কোড পুনরায় ডিপ্লয় করতে হবে না। ### কাজ - একটি সার্ভারলেস ফাংশন অ্যাপ তৈরি করুন 1. `smart-timer-trigger` নামে একটি Azure Functions অ্যাপ তৈরি করুন এবং এটি VS Code-এ খুলুন। 1. এই অ্যাপে একটি HTTP ট্রিগার যোগ করুন, যা `speech-trigger` নামে পরিচিত হবে। এটি করতে, VS Code টার্মিনাল থেকে নিচের কমান্ডটি চালান: ```sh func new --name text-to-timer --template "HTTP trigger" ``` এটি `text-to-timer` নামে একটি HTTP ট্রিগার তৈরি করবে। 1. ফাংশন অ্যাপটি চালিয়ে HTTP ট্রিগারটি পরীক্ষা করুন। এটি চালানোর সময় আউটপুটে এন্ডপয়েন্টটি তালিকাভুক্ত হবে: ```output Functions: text-to-timer: [GET,POST] http://localhost:7071/api/text-to-timer ``` এটি পরীক্ষা করতে [http://localhost:7071/api/text-to-timer](http://localhost:7071/api/text-to-timer) URL ব্রাউজারে লোড করুন। ```output This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response. ``` ### কাজ - ভাষা বোঝার মডেল ব্যবহার করুন 1. LUIS-এর জন্য SDK একটি Pip প্যাকেজের মাধ্যমে উপলব্ধ। এই প্যাকেজের উপর নির্ভরশীলতা যোগ করতে `requirements.txt` ফাইলে নিচের লাইনটি যোগ করুন: ```sh azure-cognitiveservices-language-luis ``` 1. নিশ্চিত করুন যে VS Code টার্মিনালে ভার্চুয়াল এনভায়রনমেন্ট সক্রিয় আছে এবং নিচের কমান্ডটি চালিয়ে Pip প্যাকেজ ইনস্টল করুন: ```sh pip install -r requirements.txt ``` > 💁 যদি কোনো ত্রুটি পান, তবে নিচের কমান্ডটি চালিয়ে pip আপগ্রেড করতে হতে পারে: > > ```sh > pip install --upgrade pip > ``` 1. `local.settings.json` ফাইলে LUIS API Key, Endpoint URL এবং App ID-এর জন্য নতুন এন্ট্রি যোগ করুন। এগুলো **MANAGE** ট্যাব থেকে সংগ্রহ করুন: ```JSON "LUIS_KEY": "", "LUIS_ENDPOINT_URL": "", "LUIS_APP_ID": "" ``` ``-এর জায়গায় **MANAGE** ট্যাবের *Azure Resources* বিভাগ থেকে প্রাপ্ত Endpoint URL বসান। এটি হবে `https://.api.cognitive.microsoft.com/`। ``-এর জায়গায় **MANAGE** ট্যাবের *Settings* বিভাগ থেকে প্রাপ্ত App ID বসান। ``-এর জায়গায় **MANAGE** ট্যাবের *Azure Resources* বিভাগ থেকে প্রাপ্ত Primary Key বসান। 1. `__init__.py` ফাইলে নিচের ইমপোর্টগুলো যোগ করুন: ```python import json import os from azure.cognitiveservices.language.luis.runtime import LUISRuntimeClient from msrest.authentication import CognitiveServicesCredentials ``` এটি কিছু সিস্টেম লাইব্রেরি এবং LUIS-এর সাথে ইন্টারঅ্যাক্ট করার জন্য প্রয়োজনীয় লাইব্রেরি ইমপোর্ট করে। 1. `main` মেথডের কন্টেন্ট মুছে দিয়ে নিচের কোড যোগ করুন: ```python luis_key = os.environ['LUIS_KEY'] endpoint_url = os.environ['LUIS_ENDPOINT_URL'] app_id = os.environ['LUIS_APP_ID'] credentials = CognitiveServicesCredentials(luis_key) client = LUISRuntimeClient(endpoint=endpoint_url, credentials=credentials) ``` এটি আপনার LUIS অ্যাপের জন্য `local.settings.json` ফাইল থেকে যোগ করা মানগুলো লোড করে, আপনার API key দিয়ে একটি credentials অবজেক্ট তৈরি করে, এবং LUIS অ্যাপের সাথে ইন্টারঅ্যাক্ট করার জন্য একটি LUIS ক্লায়েন্ট অবজেক্ট তৈরি করে। 1. এই HTTP ট্রিগারটি JSON আকারে পাঠানো টেক্সট বুঝতে কল করা হবে, যেখানে টেক্সটটি `text` নামে একটি প্রপার্টিতে থাকবে। HTTP রিকোয়েস্টের বডি থেকে মানটি বের করতে এবং কনসোলে লগ করতে নিচের কোডটি `main` ফাংশনে যোগ করুন: ```python req_body = req.get_json() text = req_body['text'] logging.info(f'Request - {text}') ``` 1. LUIS-এ প্রেডিকশন অনুরোধ পাঠানোর জন্য একটি JSON ডকুমেন্ট তৈরি করুন, যাতে প্রেডিকশন করার জন্য টেক্সট থাকবে। এটি করতে নিচের কোডটি যোগ করুন: ```python prediction_request = { 'query' : text } ``` 1. এই অনুরোধটি LUIS-এ পাঠানো যেতে পারে, যেখানে আপনার অ্যাপটি প্রকাশিত স্টেজিং স্লটে থাকবে: ```python prediction_response = client.prediction.get_slot_prediction(app_id, 'Staging', prediction_request) ``` 1. প্রেডিকশন রেসপন্সে শীর্ষ intent এবং entities থাকবে। যদি শীর্ষ intent `set timer` হয়, তবে entities থেকে টাইমারের জন্য প্রয়োজনীয় সময় বের করা যাবে: ```python if prediction_response.prediction.top_intent == 'set timer': numbers = prediction_response.prediction.entities['number'] time_units = prediction_response.prediction.entities['time unit'] total_seconds = 0 ``` *number* entities একটি সংখ্যার অ্যারে হবে। উদাহরণস্বরূপ, যদি আপনি বলেন *"Set a four minute 17 second timer."*, তবে `number` অ্যারেতে দুটি সংখ্যা থাকবে - ৪ এবং ১৭। *time unit* entities একটি স্ট্রিংয়ের অ্যারের অ্যারে হবে। উদাহরণস্বরূপ, যদি আপনি বলেন *"Set a four minute 17 second timer."*, তবে `time unit` অ্যারেতে দুটি অ্যারে থাকবে, প্রতিটিতে একটি করে মান - `['minute']` এবং `['second']`। *"Set a four minute 17 second timer."* এর জন্য এই entities-এর JSON সংস্করণ: ```json { "number": [4, 17], "time unit": [ ["minute"], ["second"] ] } ``` এই কোডটি টাইমারের মোট সময় সেকেন্ডে গণনা করার জন্য একটি কাউন্টও সংজ্ঞায়িত করে। এটি entities থেকে প্রাপ্ত মান দিয়ে পূরণ করা হবে। 1. Entities লিঙ্ক করা থাকে না, তবে আমরা কিছু অনুমান করতে পারি। এগুলো কথার ক্রমে থাকবে, তাই অ্যারেতে অবস্থান ব্যবহার করে নির্ধারণ করা যাবে কোন সংখ্যা কোন সময় এককের সাথে মেলে। উদাহরণস্বরূপ: * *"Set a 30 second timer"* - এতে একটি সংখ্যা, `30`, এবং একটি সময় একক, `second` থাকবে, তাই একক সংখ্যাটি একক সময় এককের সাথে মিলে যাবে। * *"Set a 2 minute and 30 second timer"* - এতে দুটি সংখ্যা, `2` এবং `30`, এবং দুটি সময় একক, `minute` এবং `second` থাকবে, তাই প্রথম সংখ্যাটি প্রথম সময় এককের জন্য (২ মিনিট), এবং দ্বিতীয় সংখ্যাটি দ্বিতীয় সময় এককের জন্য (৩০ সেকেন্ড) হবে। নিচের কোডটি `if` ব্লকের মধ্যে যোগ করুন, যা এই ক্রমে মান বের করে: ```python for i in range(0, len(numbers)): number = numbers[i] time_unit = time_units[i][0] ``` *"Set a four minute 17 second timer."* এর জন্য এটি দুইবার লুপ করবে, এবং নিচের মানগুলো দেবে: | লুপ সংখ্যা | `number` | `time_unit` | | ---------: | -------: | ----------- | | 0 | 4 | minute | | 1 | 17 | second | 1. এই লুপের ভিতরে, সংখ্যা এবং সময় একক ব্যবহার করে টাইমারের মোট সময় গণনা করুন, প্রতি মিনিটের জন্য ৬০ সেকেন্ড যোগ করে এবং সেকেন্ডের জন্য সংখ্যাটি যোগ করে: ```python if time_unit == 'minute': total_seconds += number * 60 else: total_seconds += number ``` 1. Entities-এর লুপের বাইরে, টাইমারের মোট সময় লগ করুন: ```python logging.info(f'Timer required for {total_seconds} seconds') ``` 1. সেকেন্ডের সংখ্যা HTTP রেসপন্স হিসেবে ফাংশন থেকে ফেরত দিতে হবে। `if` ব্লকের শেষে নিচের কোডটি যোগ করুন: ```python payload = { 'seconds': total_seconds } return func.HttpResponse(json.dumps(payload), status_code=200) ``` এই কোডটি টাইমারের মোট সেকেন্ডের একটি পে-লোড তৈরি করে, এটিকে JSON স্ট্রিংয়ে রূপান্তর করে এবং একটি HTTP রেজাল্ট হিসেবে ২০০ স্ট্যাটাস কোড সহ ফেরত দেয়, যা সফল কল নির্দেশ করে। 1. অবশেষে, `if` ব্লকের বাইরে, যদি intent শনাক্ত না হয় তবে একটি ত্রুটি কোড ফেরত দিন: ```python return func.HttpResponse(status_code=404) ``` ৪০৪ হলো *not found* এর স্ট্যাটাস কোড। 1. ফাংশন অ্যাপটি চালান এবং curl ব্যবহার করে এটি পরীক্ষা করুন। ```sh curl --request POST 'http://localhost:7071/api/text-to-timer' \ --header 'Content-Type: application/json' \ --include \ --data '{"text":""}' ``` ``-এর জায়গায় আপনার অনুরোধের টেক্সট দিন, যেমন `set a 2 minutes 27 second timer`। ফাংশন অ্যাপ থেকে নিচের আউটপুট দেখতে পাবেন: ```output Functions: text-to-timer: [GET,POST] http://localhost:7071/api/text-to-timer For detailed output, run func with --verbose flag. [2021-06-26T19:45:14.502Z] Worker process started and initialized. [2021-06-26T19:45:19.338Z] Host lock lease acquired by instance ID '000000000000000000000000951CAE4E'. [2021-06-26T19:45:52.059Z] Executing 'Functions.text-to-timer' (Reason='This function was programmatically called via the host APIs.', Id=f68bfb90-30e4-47a5-99da-126b66218e81) [2021-06-26T19:45:53.577Z] Timer required for 147 seconds [2021-06-26T19:45:53.746Z] Executed 'Functions.text-to-timer' (Succeeded, Id=f68bfb90-30e4-47a5-99da-126b66218e81, Duration=1750ms) ``` curl কলটি নিচেরটি ফেরত দেবে: ```output HTTP/1.1 200 OK Date: Tue, 29 Jun 2021 01:14:11 GMT Content-Type: text/plain; charset=utf-8 Server: Kestrel Transfer-Encoding: chunked {"seconds": 147} ``` টাইমারের সেকেন্ডের সংখ্যা `"seconds"` মানে থাকবে। > 💁 এই কোডটি [code/functions](../../../../../6-consumer/lessons/2-language-understanding/code/functions) ফোল্ডারে পাওয়া যাবে। ### কাজ - আপনার ফাংশন IoT ডিভাইসের জন্য উপলব্ধ করুন 1. আপনার IoT ডিভাইসকে REST এন্ডপয়েন্ট কল করতে হলে, এটি URL জানতে হবে। আপনি এটি আগে অ্যাক্সেস করার সময় `localhost` ব্যবহার করেছিলেন, যা আপনার লোকাল মেশিনে REST এন্ডপয়েন্ট অ্যাক্সেস করার একটি শর্টকাট। IoT ডিভাইসকে অ্যাক্সেস দিতে হলে আপনাকে হয় ক্লাউডে প্রকাশ করতে হবে, অথবা লোকালভাবে অ্যাক্সেস করতে আপনার IP ঠিকানা পেতে হবে। > ⚠️ যদি আপনি Wio Terminal ব্যবহার করেন, তবে ফাংশন অ্যাপটি লোকালভাবে চালানো সহজ, কারণ কিছু লাইব্রেরির উপর নির্ভরশীলতা থাকবে যা আগের মতো ফাংশন অ্যাপ ডিপ্লয় করতে বাধা দেবে। ফাংশন অ্যাপটি লোকালভাবে চালান এবং আপনার কম্পিউটারের IP ঠিকানা ব্যবহার করে অ্যাক্সেস করুন। যদি আপনি ক্লাউডে ডিপ্লয় করতে চান, তবে পরবর্তী পাঠে এটি করার পদ্ধতি দেওয়া হবে। * ফাংশন অ্যাপটি প্রকাশ করুন - আগের পাঠে দেওয়া নির্দেশনা অনুসরণ করে আপনার ফাংশন অ্যাপটি ক্লাউডে প্রকাশ করুন। একবার প্রকাশিত হলে, URL হবে `https://.azurewebsites.net/api/text-to-timer`, যেখানে `` হবে আপনার ফাংশন অ্যাপের নাম। আপনার লোকাল সেটিংসও প্রকাশ করুন। HTTP ট্রিগার নিয়ে কাজ করার সময়, এগুলো ডিফল্টভাবে একটি ফাংশন অ্যাপ কী দিয়ে সুরক্ষিত থাকে। এই কী পেতে নিচের কমান্ডটি চালান: ```sh az functionapp keys list --resource-group smart-timer \ --name ``` `functionKeys` সেকশনের `default` এন্ট্রির মানটি কপি করুন। ```output { "functionKeys": { "default": "sQO1LQaeK9N1qYD6SXeb/TctCmwQEkToLJU6Dw8TthNeUH8VA45hlA==" }, "masterKey": "RSKOAIlyvvQEQt9dfpabJT018scaLpQu9p1poHIMCxx5LYrIQZyQ/g==", "systemKeys": {} } ``` এই কীটি URL-এ একটি কুয়েরি প্যারামিটার হিসেবে যোগ করতে হবে, তাই চূড়ান্ত URL হবে `https://.azurewebsites.net/api/text-to-timer?code=`, যেখানে `` হবে আপনার ফাংশন অ্যাপের নাম, এবং `` হবে আপনার ডিফল্ট ফাংশন কী। > 💁 HTTP ট্রিগারের অথরাইজেশন টাইপ `function.json` ফাইলের `authlevel` সেটিং ব্যবহার করে পরিবর্তন করা যায়। এটি সম্পর্কে আরও জানতে Microsoft ডকসের [Azure Functions HTTP trigger ডকুমেন্টেশনের কনফিগারেশন সেকশন](https://docs.microsoft.com/azure/azure-functions/functions-bindings-http-webhook-trigger?WT.mc_id=academic-17441-jabenn&tabs=python#configuration) দেখুন। * ফাংশন অ্যাপটি লোকালভাবে চালান এবং IP ঠিকানা ব্যবহার করে অ্যাক্সেস করুন - আপনার কম্পিউটারের লোকাল নেটওয়ার্কে IP ঠিকানা পেয়ে URL তৈরি করুন। আপনার IP ঠিকানা খুঁজুন: * Windows 10-এ, [IP ঠিকানা খুঁজুন গাইড](https://support.microsoft.com/windows/find-your-ip-address-f21a9bbc-c582-55cd-35e0-73431160a1b9?WT.mc_id=academic-17441-jabenn) অনুসরণ করুন। * macOS-এ, [Mac-এ IP ঠিকানা খুঁজুন গাইড](https://www.hellotech.com/guide/for/how-to-find-ip-address-on-mac) অনুসরণ করুন। * Linux-এ, [Linux-এ IP ঠিকানা খুঁজুন গাইডের](https://opensource.com/article/18/5/how-find-ip-address-linux) প্রাইভেট IP ঠিকানা সেকশন অনুসরণ করুন। একবার আপনার IP ঠিকানা পেয়ে গেলে, আপনি ফাংশনটি `http://` দিয়ে অ্যাক্সেস করতে পারবেন। <আইপি_ঠিকানা> :7071/api/text-to-timer`, যেখানে `` হবে আপনার আইপি ঠিকানা, উদাহরণস্বরূপ `http://192.168.1.10:7071/api/text-to-timer`। > 💁 মনে রাখবেন এটি পোর্ট 7071 ব্যবহার করে, তাই আইপি ঠিকানার পরে আপনাকে `:7071` যোগ করতে হবে। > 💁 এটি শুধুমাত্র কাজ করবে যদি আপনার IoT ডিভাইস এবং কম্পিউটার একই নেটওয়ার্কে থাকে। 1. curl ব্যবহার করে এন্ডপয়েন্টটি পরীক্ষা করুন। --- ## 🚀 চ্যালেঞ্জ একই কাজ করার জন্য, যেমন একটি টাইমার সেট করা, বিভিন্ন উপায় রয়েছে। এই ধরণের বিভিন্ন উপায় নিয়ে ভাবুন এবং সেগুলো আপনার LUIS অ্যাপে উদাহরণ হিসেবে ব্যবহার করুন। এগুলো পরীক্ষা করুন এবং দেখুন আপনার মডেল কীভাবে টাইমার অনুরোধ করার বিভিন্ন পদ্ধতির সাথে মানিয়ে নিতে পারে। ## লেকচার-পরবর্তী কুইজ [লেকচার-পরবর্তী কুইজ](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/44) ## পর্যালোচনা ও স্ব-অধ্যয়ন * LUIS এবং এর ক্ষমতা সম্পর্কে আরও জানুন [Microsoft ডকসের Language Understanding (LUIS) ডকুমেন্টেশন পেজে](https://docs.microsoft.com/azure/cognitive-services/luis/?WT.mc_id=academic-17441-jabenn) * ভাষা বোঝার বিষয়ে আরও জানুন [উইকিপিডিয়ার ন্যাচারাল-ল্যাঙ্গুয়েজ আন্ডারস্ট্যান্ডিং পেজে](https://wikipedia.org/wiki/Natural-language_understanding) * HTTP ট্রিগার সম্পর্কে আরও পড়ুন [Microsoft ডকসের Azure Functions HTTP trigger ডকুমেন্টেশন পেজে](https://docs.microsoft.com/azure/azure-functions/functions-bindings-http-webhook-trigger?WT.mc_id=academic-17441-jabenn&tabs=python) ## অ্যাসাইনমেন্ট [টাইমার বাতিল করুন](assignment.md) --- **অস্বীকৃতি**: এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদ প্রদানের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা তার জন্য দায়বদ্ধ থাকব না।