|
|
# យល់ពីភាសា
|
|
|
|
|
|

|
|
|
|
|
|
> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). ចុចរូបភាពដើម្បីមើលជាថាតម្លៃធំជាងនេះ។
|
|
|
|
|
|
## ពិនិត្យមុនម៉ោងរៀន
|
|
|
|
|
|
[ពិនិត្យមុនម៉ោងរៀន](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/43)
|
|
|
|
|
|
## ការណែនាំ
|
|
|
|
|
|
នៅមេរៀនចុងក្រោយអ្នកបានបម្លែងសំឡេងទៅជាអត្ថបទ។ ដើម្បីឱ្យវាបានប្រើប្រាស់ក្នុងការបង្កើតម៉ោងកំណត់លំដាប់ឆ្លាតវៃ កូដរបស់អ្នកត្រូវតែមានការយល់ដឹងអំពីអ្វីដែលបាននិយាយ។ អ្នកអាចសន្មតថាអ្នកប្រើប្រាស់នឹងនិយាយឃ្លាមួយដែលបានកំណត់ដូចជា "កំណត់ម៉ោង 3 នាទី" ហើយបំលែងពាក្យនោះដើម្បីទទួលបានរយៈពេលម៉ោងដែលត្រូវការ ប៉ុន្តែវាមិនងាយស្រួលសម្រាប់អ្នកប្រើប្រាស់ទេ។ ប្រសិនបើអ្នកប្រើប្រាស់និយាយថា "គ្រប់គ្រងម៉ោងសម្រាប់ 3 នាទី" អ្នកឬខ្ញុំនឹងយល់អ្វីដែលពួកគេមានន័យ ប៉ុន្តែកូដរបស់អ្នកមិននឹងយល់ទេ ព្រោះវានឹងរំពឹងថាឃ្លាមួយដែលបានកំណត់ប៉ុណ្ណោះ។
|
|
|
|
|
|
នេះជាកន្លែងដែលការយល់ភាសាចូលមក មានការប្រើប្រាស់ម៉ូដែល AI ក្នុងការបកស្រាយអត្ថបទ និងត្រឡប់មកវិញនូវព័ត៌មានលម្អិតដែលត្រូវការ ឧទាហរណ៍ អាចទទួលបាន "កំណត់ម៉ោង 3 នាទី" និង "កំណត់ម៉ោងសម្រាប់ 3 នាទី" ស្របព្រម ហើយយល់ថាត្រូវការម៉ោងសម្រាប់រយៈពេល 3 នាទី។
|
|
|
|
|
|
នៅមេរៀននេះ អ្នកនឹងរៀនអំពីម៉ូដែលការយល់ភាសា របៀបបង្កើតវា របៀបបណ្តុះវា និងបង្កើតប្រើប្រាស់វាដែលបានតាមកូដរបស់អ្នក។
|
|
|
|
|
|
នៅក្នុងមេរៀននេះ យើងនឹងមានប្រធានបទ៖
|
|
|
|
|
|
* [ការយល់ភាសា](#ការយល់ភាសា)
|
|
|
* [បង្កើតម៉ូដែលការយល់ភាសា](#បង្កើតម៉ូដែលការយល់ភាសា)
|
|
|
* [ចេតនា និងអង្គធាតុ](#ចេតនា-និងអង្គធាតុ)
|
|
|
* [ប្រើម៉ូដែលការយល់ភាសា](#ប្រើម៉ូឌែលអស់ក្នុងការយល់ភាសា)
|
|
|
|
|
|
## ការយល់ភាសា
|
|
|
|
|
|
មនុស្សបានប្រើភាសាដើម្បីទំនាក់ទំនងរយៈពេលរាប់រយពាន់ឆ្នាំ។ យើងទំនាក់ទំនងដោយមួលសញ្ញាល្អ ពាក្យ សំឡេង ឬសកម្មភាព ហើយយល់អ្វីដែលបាននិយាយ ដោយទាំងមានន័យនៃពាក្យ សំឡេងឬសកម្មភាព និងបរិបទរបស់វា។ យើងយល់ពីស្នេហាក្តី និងការសរសើរ ឱ្យពាក្យដូចគ្នាមានន័យខុសគ្នា នឹងអាស្រ័យលើសម្លេងសំឡេងរបស់យើង។
|
|
|
|
|
|
✅ សូមគិតអំពីសំណួរខ្លះដែលអ្នកបានមានចុងពេលថ្មីៗនេះ។ មានប៉ុន្មាននៃការសន្ទនាដែលពិបាកសម្រាប់កុំព្យូទ័រយល់ ដោយសារត្រូវការបរិបទ?
|
|
|
|
|
|
ការយល់ភាសា ដែលត្រូវបានគេហៅថាយល់ភាសាធម្មជាតិ គឺជាសមាសភាពក្នុងវិស័យបញ្ញាសិប្បនិម្មិតដែលហៅថាប្រព័ន្ធដំណើរការភាសាធម្មជាតិ (NLP) ហើយវាគ្របដណ្តប់ពីការយល់អត្ថន័យ អ្នកព្យាយាមយល់លម្អិតពីពាក្យឬវេយ្យាករណ៏។ ប្រសិនបើអ្នកប្រើជំនួយសំឡេងដូចជា Alexa ឬ Siri អ្នកបានប្រើសេវាកម្មការយល់ភាសា។ វាជាសេវាកម្ម AI ផ្ទាំងក្រោយដែលបម្លែង "Alexa, លេងអាល់ប៊ុមថ្មីចុងក្រោយដោយ Taylor Swift" ទៅកូនស្រីរបស់ខ្ញុំកំពុងរុញរាំក្នុងបន្ទប់នៅតាមចំកំពូលតន្រ្តីចំណូលចិត្តរបស់នាង។
|
|
|
|
|
|
> 💁 កុំព្យូទ័រមិនថាពួកវាបានឈានទៅឆ្ងាយប៉ុនណាក៏ដោយ វានៅតែត្រូវមានចម្ងាយវែងមិនទាន់យល់អត្ថបទពេញលេញទេ។ នៅពេលដែលយើងនិយាយអំពីការយល់ភាសាជាមួយកុំព្យូទ័រ យើងមិនមានន័យថាវាជាការទំនាក់ទំនងដូចមនុស្សមែនទេ តែយើងមានន័យថាប្រមួលយកពាក្យខ្លះៗហើយដកស្រង់ព័ត៌មានសំខាន់ៗដែលត្រូវការ។
|
|
|
|
|
|
ជាមនុស្ស យើងយល់ភាសាបានដោយគ្មានការគិតក្នុងចិត្តប្រាកដណាស់។ ប្រសិនបើខ្ញុំសួរមនុស្សម្នាក់ម្នាក់ផ្សេងទៀតថា "លេងអាល់ប៊ុមថ្មីចុងក្រោយដោយ Taylor Swift" ពួកគេនឹងយល់ភ្លាមៗថាខ្ញុំមានន័យអ្វី។ តែសម្រាប់កុំព្យូទ័រពិបាកជាងនេះ វាត្រូវតែយកពាក្យដែលបានបម្លែងពីសំឡេងទៅអត្ថបទ ហើយបញ្ចេញព័ត៌មានដូចខាងក្រោម៖
|
|
|
|
|
|
* ត្រូវតែចាក់តន្រ្តី
|
|
|
* តន្រ្តីត្រូវតែជារបស់តារាចម្រៀង Taylor Swift
|
|
|
* តន្រ្តីជាអាល់ប៊ុមមួយដែលមានច្រៀងជាច្រើនតាមលំដាប់
|
|
|
* Taylor Swift មានអាល់ប៊ុមជាច្រើន ដូច្នេះវាត្រូវតែតម្រៀបតាមលំដាប់ពេលវេលា ហើយកំណត់អាល់ប៊ុមថ្មីចុងក្រោយជាគោលដៅ
|
|
|
|
|
|
✅ សូមគិតអំពីវាក្យបញ្ជាទៀតដែលអ្នកបាននិយាយពេលធ្វើសំណើអ្នកផ្នែកទំនាក់ទំនង រួមទាំងការបញ្ជាទិញកាហ្វេ ឬសូមគ្រួសារដើម្បីផ្តល់អ្វីមួយ។ ព្យាយាមបំបែកវាចេញជាធាតុព័ត៌មានដែលកុំព្យូទ័រត្រូវគឺមកដកស្រង់ដោយដើម្បីយល់វេយ្យាករណ៍។
|
|
|
|
|
|
ម៉ូដែលការយល់ភាសា គឺជាម៉ូដែល AI ដែលបានបណ្តុះបណ្តាលដើម្បីដកព័ត៌មានសំខាន់ៗពីភាសា ហើយបន្ទាប់មកបានបណ្តុះបណ្តាលសម្រាប់បេសកកម្មជាក់លាក់ ដោយប្រើបច្ចេកទេសបង្វឹកប្តូរ (transfer learning) ដូចដែលអ្នកបានបណ្តុះម៉ូដែល Custom Vision ដោយប្រើតំបន់រូបភាពតិចតួច។ អ្នកអាចយកម៉ូដែលមួយ បន្ទាប់មកបណ្តុះបណ្តាលវាជាមួយអត្ថបទដែលអ្នកចង់ឱ្យវាយល់។
|
|
|
|
|
|
## បង្កើតម៉ូដែលការយល់ភាសា
|
|
|
|
|
|

|
|
|
|
|
|
អ្នកអាចបង្កើតម៉ូដែលការយល់ភាសាដោយប្រើ LUIS ដែលជាសេវាកម្មការយល់ភាសាមួយពីមីក្រូសូហ្វ ដែលជាផ្នែកមួយនៃសេវាកម្មជំនាញស្គាល់។
|
|
|
|
|
|
### បេសកកម្ម - បង្កើតធនធានអ្នកនិពន្ធ
|
|
|
|
|
|
ដើម្បីប្រើ 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 <location>
|
|
|
```
|
|
|
|
|
|
ជំនួស `<location>` ជាមួយទីតាំងដែលអ្នកបានប្រើនៅពេលបង្កើតក្រុមធនធាន។
|
|
|
|
|
|
> ⚠️ LUIS មិនមាននៅក្នុងតំបន់ទាំងអស់ទេ ដូច្នេះប្រសិនបើអ្នកទទួលបានកំហុសដូចខាងក្រោម៖
|
|
|
>
|
|
|
> ```output
|
|
|
> InvalidApiSetId: The account type 'LUIS.Authoring' is either invalid or unavailable in given region.
|
|
|
> ```
|
|
|
>
|
|
|
> ជ្រើសរើសតំបន់ផ្សេងទៀត។
|
|
|
|
|
|
នេះនឹងបង្កើតធនធាន LUIS អ្នកនិពន្ធជាឥតគិតថ្លៃ។
|
|
|
|
|
|
### បេសកកម្ម - បង្កើតកម្មវិធីការយល់ភាសា
|
|
|
|
|
|
1. បើកផ្ទាំងគេហទំព័រ LUIS នៅ [luis.ai](https://luis.ai?WT.mc_id=academic-17441-jabenn) ក្នុងកម្មវិធីរុករករបស់អ្នក ភ្ជាប់ចូលដោយគណនីដែលអ្នកកំពុងប្រើសម្រាប់ Azure។
|
|
|
|
|
|
1. អនុវត្តតាមការណែនាំនៅលើប្រអប់ដើម្បីជ្រើសរើសការជាវ Azure របស់អ្នក បន្ទាប់មកជ្រើសរើសធនធាន `smart-timer-luis-authoring` ដែលអ្នកទើបបង្កើត។
|
|
|
|
|
|
1. ពីបញ្ជី *កម្មវិធីសន្ទនា* ជ្រើសយកប៊ូតុង **កម្មវិធីថ្មី** ដើម្បីបង្កើតកម្មវិធីថ្មី។ ឈ្មោះកម្មវិធីថ្មីហៅថា `smart-timer` ហើយកំណត់ *វប្បធម៌* ជាភាសារបស់អ្នក។
|
|
|
|
|
|
> 💁 មានវាលសម្រាប់ធនធានព្យាករណ៍។ អ្នកអាចបង្កើតធនធានទីពីរមួយសម្រាប់ព្យាករណ៍ ប៉ុន្តែធនធានអ្នកនិពន្ធឥតគិតថ្លៃអនុញ្ញាតឱ្យធ្វើព្យាករណ៍ 1,000 ដងក្នុងមួយខែ ដែលគួរតែគ្រប់គ្រាន់សម្រាប់ការអភិវឌ្ឍ ដូច្នេះអ្នកអាចទុកវាបោស។
|
|
|
|
|
|
1. អានតាមមគ្គុទេសក៍ដែលបង្ហាញបន្ទាប់ពីបង្កើតកម្មវិធី ដើម្បីយល់ពីជំហានដែលអ្នកត្រូវធ្វើដើម្បីបណ្តុះម៉ូដែលការយល់ភាសា។ បិទមគ្គុទេសក៍នេះពេលអ្នកបានធ្វើរួច។
|
|
|
|
|
|
## ចេតនា និងអង្គធាតុ
|
|
|
|
|
|
ការយល់ភាសាត្រូវបានគោលគ្រប់គ្រងដោយ *ចេតនា* និង *អង្គធាតុ*។ ចេតនាគឺជាទិសដៅនៃពាក្យ ដូចជា លេងតន្រ្តី កំណត់ម៉ោង ឬបញ្ជាទិញម្ហូប។ អង្គធាតូមានន័យថាចេតនាអំពីអ្វី ដូចជា អាល់ប៊ុម រយៈពេលម៉ោង ឬប្រភេទម្ហូប។ ឃ្លាមួយដែលម៉ូដែលវាយល់ គួរតែមានចេតនាយ៉ាងហោចណាស់មួយ ហើយអាចមានអង្គធាតុមួយចំនួន ឬច្រើន។
|
|
|
|
|
|
ឧទាហរណ៍ខ្លះ៖
|
|
|
|
|
|
| ឃ្លា | ចេតនា | អង្គធាតុ |
|
|
|
| --------------------------------------------------- | ---------------- | ------------------------------------------ |
|
|
|
| "លេងអាល់ប៊ុមថ្មីចុងក្រោយដោយ Taylor Swift" | *លេងតន្រ្តី* | *អាល់ប៊ុមថ្មីចុងក្រោយដោយ Taylor Swift* |
|
|
|
| "កំណត់ម៉ោង 3 នាទី" | *កំណត់ម៉ោង* | *3 នាទី* |
|
|
|
| "បោះបង់ម៉ោងរបស់ខ្ញុំ" | *បោះបង់ម៉ោង* | គ្មាន |
|
|
|
| "បញ្ជាទិញភីហ្សាជំរាប៣និងសាឡាដ Caesar មួយចាន" | *បញ្ជាទិញម្ហូប* | *ភីហ្សាជំរាប៣*, *សាឡាដ Caesar* |
|
|
|
|
|
|
✅ ជាមួយឃ្លាដែលអ្នកបានគិតមុននេះ អ្វីទៅជាចេតនា និងអង្គធាតុ ក្នុងឃ្លានោះ?
|
|
|
|
|
|
ដើម្បីបណ្តុះ LUIS ជាមួយវា អ្នកត្រូវដំបូងកំណត់អង្គធាតុ។ អង្គធាតុទាំងនេះអាចជាបញ្ជីមួយដែលកំណត់រួច ឬរៀនពីអត្ថបទ។ ឧទាហរណ៍ អ្នកអាចផ្តល់បញ្ជីម្ហូបដែលអាចរកបានពីម៉ឺនុយរបស់អ្នក រួមជាមួយបម្លែងវា (ឬពាក្យស្រដៀង) នៃពាក្យនីមួយៗ ដូចជា *egg plant* និង *aubergine* ជាបម្លែងនៃ *aubergine*។ លUIS មានអង្គធាតុកំណត់រួចដែលអាចប្រើបានដូចជា លេខ និងទីតាំង។
|
|
|
|
|
|
សម្រាប់កំណត់ម៉ោង អ្នកអាចមានអង្គធាតុមួយសម្រាប់ឯកតារយៈពេល (នាទី ឬវិនាទី) និងមួយសម្រាប់លេខនៃនាទី ឬវិនាទី។ ក្នុងមួយឯកតានីមួយៗ អាចមានបម្លែងជាច្រើនដើម្បីគ្របដណ្តប់ទាំងមុខនិយាយរួម និងពហុប្រាប់ ដូចជា minute និង minutes។
|
|
|
|
|
|
បន្ទាប់ពីកំណត់អង្គធាតុរួច អ្នកបង្កើតចេតនា។ វាត្រូវបានរៀនដោយម៉ូដែលដោយផ្អែកលើឧទាហរណ៍ឃ្លាដែលអ្នកផ្តល់ (ហៅថា utterances)។ ឧទាហរណ៍ សម្រាប់ចេតនាកំណត់ម៉ោង *set timer* អ្នកអាចផ្តល់ឃ្លាដូចខាងក្រោម៖
|
|
|
|
|
|
* `set a 1 second timer`
|
|
|
* `set a timer for 1 minute and 12 seconds`
|
|
|
* `set a timer for 3 minutes`
|
|
|
* `set a 9 minute 30 second timer`
|
|
|
|
|
|
បន្ទាប់មកអ្នកប្រាប់ LUIS ថាផ្នែកណានៃឃ្លាទាំងនេះដែលបញ្ជូនទៅអង្គធាតុ៖
|
|
|
|
|
|

|
|
|
|
|
|
ឃ្លា `set a timer for 1 minute and 12 seconds` មានចេតនា `set timer`។ វាក៏មាន 2 អង្គធាតុដែលមាន 2 តម្លៃមួយៗ៖
|
|
|
|
|
|
| | រយៈពេល | ឯកតា |
|
|
|
| ---------- | ---: | ------ |
|
|
|
| 1 minute | 1 | minute |
|
|
|
| 12 seconds | 12 | second |
|
|
|
|
|
|
ដើម្បីបណ្តុះម៉ូដែលល្អ អ្នកត្រូវការឧទាហរណ៍ឃ្លាជាច្រើន ដើម្បីគ្របដណ្តប់វិធីសាស្ត្រផ្សេងៗនៃការស្នើសុំនូវអ្វីមួយដូចៗគ្នា។
|
|
|
|
|
|
> 💁 ដូចជាមួយម៉ូដែល AI ប៉ុន្មានទិន្នន័យនិងទិន្នន័យត្រឹមត្រូវប៉ុណ្ណា ដែលអ្នកប្រើសម្រាប់បណ្តុះបណ្តាល ម៉ូដែលនឹងមានគុណភាពល្អប៉ុណ្ណា។
|
|
|
|
|
|
✅ សូមគិតអំពីវិធីផ្សេងៗដែលអ្នកអាចស្នើអំពីអ្វីមួយ និងរំពឹងថាមនុស្សម្នាក់នឹងយល់។
|
|
|
|
|
|
### បេសកកម្ម - បន្ថែមអង្គធាតុទៅម៉ូដែលការយល់ភាសា
|
|
|
|
|
|
សម្រាប់ម៉ោង អ្នកត្រូវបន្ថែមអង្គធាតុ 2 គឺមួយសម្រាប់ឯកតារយៈពេល (នាទី ឬវិនាទី) និងមួយសម្រាប់លេខនៃនាទី ឬវិនាទី។
|
|
|
|
|
|
អ្នកអាចរកការណែនាំដើម្បីប្រើផ្ទាំងគេហទំព័រ LUIS ក្នុងឯកសារ [Quickstart: Build your app in LUIS portal documentation on Microsoft docs](https://docs.microsoft.com/azure/cognitive-services/luis/luis-get-started-create-app?WT.mc_id=academic-17441-jabenn)។
|
|
|
|
|
|
1. ពីផ្ទាំងគេហទំព័រ LUIS ជ្រើស *Entities* ហើយបន្ថែមអង្គធាតុ *number* ដែលបានកំណត់រួច ដោយចុចប៊ូតុង **Add prebuilt entity** ហើយជ្រើស *number* ពីបញ្ជី។
|
|
|
|
|
|
1. បង្កើតអង្គធាតុថ្មីសម្រាប់ឯកតាពេលវេលា ដោយប្រើប៊ូតុង **Create**។ ឈ្មោះអង្គធាតុ `time unit` ហើយកំណត់ប្រភេទជា *List*។ បន្ថែមតម្លៃ `minute` និង `second` ទៅក្នុងបញ្ជី *Normalized values* ហើយបន្ថែមមុខនិយាយទាំងឯកតា និងពហុត្រូវទៅក្នុងបញ្ជី *synonyms*។ ចុច `return` បន្ទាប់ពីបន្ថែមមុខនិយាយនីមួយៗដើម្បីបន្ថែមវាចូលក្នុងបញ្ជី។
|
|
|
|
|
|
| តម្លៃធម្មតា | មុខនិយាយ |
|
|
|
| ------------ | ----------------- |
|
|
|
| minute | minute, minutes |
|
|
|
| second | second, seconds |
|
|
|
|
|
|
### បេសកកម្ម - បន្ថែមចេតនាទៅម៉ូដែលការយល់ភាសា
|
|
|
|
|
|
1. ពីផ្ទាំង *Intents* ចុចប៊ូតុង **Create** ដើម្បីបង្កើតចេតនាថ្មី។ ឈ្មោះចេតនា `set timer`។
|
|
|
|
|
|
1. ក្នុងឧទាហរណ៍ សូមបញ្ចូលវិធីផ្សេងៗដើម្បីកំណត់ម៉ោងប្រើរយៈពេលនាទី វិនាទី និងរួមបញ្ចូលគ្នា។ ឧទាហរណ៍អាចមាន៖
|
|
|
|
|
|
* `set a 1 second timer`
|
|
|
* `set a 4 minute timer`
|
|
|
* `set a four minute six second timer`
|
|
|
* `set a 9 minute 30 second timer`
|
|
|
* `set a timer for 1 minute and 12 seconds`
|
|
|
* `set a timer for 3 minutes`
|
|
|
* `set a timer for 3 minutes and 1 second`
|
|
|
* `set a timer for three minutes and one second`
|
|
|
* `set a timer for 1 minute and 1 second`
|
|
|
* `set a timer for 30 seconds`
|
|
|
* `set a timer for 1 second`
|
|
|
|
|
|
ផ្សំចំនួនជាអក្សរនិងលេខគណនាដើម្បីឱ្យម៉ូដែលរៀនទទួលបានទាំងពីរ។
|
|
|
|
|
|
1. នៅពេលអ្នកបញ្ចូលឧទាហរណ៍នីមួយៗ LUIS នឹងចាប់ផ្តើមរកឃើញអង្គធាតុ ហើយនឹងគូរសំគាល់ហើយដាក់ស្លាកអំពីអង្គធាតុដែលបានស្គាល់។
|
|
|
|
|
|

|
|
|
|
|
|
### បេសកកម្ម - បណ្តុះ និងសាកល្បងម៉ូដែល
|
|
|
|
|
|
1. បន្ទាប់ពីកំណត់អង្គធាតុនិងចេតនា អ្នកអាចបណ្តុះម៉ូដែលដោយប្រើប៊ូតុង **Train** នៅម៉ឺនុយខាងលើ។ ជ្រើសប៊ូតុងនេះ ហើយម៉ូដែលនឹងបណ្តុះក្នុងរយៈពេលប៉ុន្មានវិនាទី។ ប៊ូតុងនឹងជារឺសពណ៌ប្រផេះពេលបណ្តុះ ហើយអាចប្រើបានវិញនៅពេលបញ្ចប់។
|
|
|
|
|
|
1. ជ្រើសប៊ូតុង **Test** ពីម៉ឺនុយខាងលើ ដើម្បីសាកល្បងម៉ូដែលការយល់ភាសា។ បញ្ចូលអត្ថបទដូចជា `set a timer for 5 minutes and 4 seconds` ហើយចុច return។ ឃ្លានឹងបង្ហាញនៅក្នុងប្រអប់ក្រោមប្រអប់អត្ថបទដែលអ្នកបានវាយបញ្ចូល ហើយក្រោមនោះគឺជាចេតនាដែលទទួលបានពិន្ទុខ្ពស់បំផុត (top intent) ដែលគួរតែជាចេតនា `set timer`។ ឈ្មោះចេតនានឹងតាមដានដោយភាគរយនៃលទ្ធផលល្អ។
|
|
|
|
|
|
1. ជ្រើសជម្រើស **Inspect** ដើម្បីមើលបំបែកលទ្ធផល។ អ្នកនឹងឃើញចេតនាដែលបានទទួលពិន្ទុខ្ពស់ជាមួយភាគរយបំផុត ជាមួយនឹងបញ្ជីអង្គធាតុដែលបានស្គាល់។
|
|
|
|
|
|
1. បិទផ្ទាំង *Test* ពេលអ្នកបានសាកល្បងរួច។
|
|
|
|
|
|
### បេសកកម្ម - បោះពុម្ពផ្សាយម៉ូដែល
|
|
|
|
|
|
ដើម្បីប្រើម៉ូដែលនេះពីក្នុងកូដ អ្នកត្រូវបោះពុម្ពផ្សាយវា។ នៅពេលបោះពុម្ពផ្សាយពី LUIS អ្នកអាចបោះពុម្ពផ្សាយទៅបរិយាកាស staging សម្រាប់ការសាកល្បង ឬបរិយាកាសផលិតសម្រាប់ចេញផ្សាយពេញលេញ។ នៅក្នុងមេរៀននេះ បរិយាកាស staging គឺគ្រប់គ្រាន់។
|
|
|
1. ពីបណ្តាញ LUIS portal ជ្រើសរើសប៊ូតុង **Publish** ពីម៉ឺនុយខាងលើ។
|
|
|
|
|
|
1. ធ្វើឱ្យប្រាកដថា បានជ្រើសរើស *Staging slot* រួចជ្រើសរើស **Done**។ អ្នកនឹងមើលឃើញការជូនដំណឹងពេលដែលកម្មវិធីត្រូវបានផ្សាយ។
|
|
|
|
|
|
1. អ្នកអាចសាកល្បងចំណែកនេះផ្អែកលើ curl។ ដើម្បីបង្កើតពាក្យបញ្ជា curl អ្នកត្រូវការតម្លៃបីគឺ - ចំណុចបញ្ចប់ (endpoint), លេខសម្គាល់កម្មវិធី (App ID) និងកូនសោ API។ តម្លៃទាំងនេះអាចចូលដំណើរការបានពីហៅថ្មី **MANAGE** ដែលអាចជ្រើសរាបពីម៉ឺនុយខាងលើ។
|
|
|
|
|
|
1. ពីផ្នែក *Settings* ចំលង App ID
|
|
|
|
|
|
1. ពីផ្នែក *Azure Resources* ជ្រើស *Authoring Resource*, ហើយចំលង *Primary Key* និង *Endpoint URL*
|
|
|
|
|
|
1. សូមដំណើរការពាក្យបញ្ជា curl ខាងក្រោមក្នុងពាក្យបញ្ជា Command Prompt ឬ Terminal របស់អ្នក៖
|
|
|
|
|
|
```sh
|
|
|
curl "<endpoint url>/luis/prediction/v3.0/apps/<app id>/slots/staging/predict" \
|
|
|
--request GET \
|
|
|
--get \
|
|
|
--data "subscription-key=<primary key>" \
|
|
|
--data "verbose=false" \
|
|
|
--data "show-all-intents=true" \
|
|
|
--data-urlencode "query=<sentence>"
|
|
|
```
|
|
|
|
|
|
ជំនួស `<endpoint url>` ជាមួយ URL ចំណុចបញ្ចប់ពីព័ត៌មាន *Azure Resources*។
|
|
|
|
|
|
ជំនួស `<app id>` ជាមួយ App ID ពីផ្នែក *Settings*។
|
|
|
|
|
|
ជំនួស `<primary key>` ជាមួយ Primary Key ពីផ្នែក *Azure Resources*។
|
|
|
|
|
|
ជំនួស `<sentence>` ជាមួយវចនាធិប្បាយដែលអ្នកចង់សាកល្បង។
|
|
|
|
|
|
1. លទ្ធផលនៃការហៅនេះនឹងជាឯកសារ JSON ដែលពិពណ៌នាពីសំណួរ, ចេតនាកំពូល, និងបញ្ជីអង្គភាពត្រូវបានបំបែកតាមប្រភេទ។
|
|
|
|
|
|
```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` គឺជាចេតនាកំពូលដោយមានប្រភេទតម្លៃ 97%។
|
|
|
* មានប្រុងចំនួនពីរដែលត្រូវបានស្គាល់, `45` និង `12`។
|
|
|
* មានប្រុងតម្លៃម៉ោងពីរដែលត្រូវបានស្គាល់, `minute` និង `second`។
|
|
|
|
|
|
|
|
|
## ប្រើម៉ូឌែលអស់ក្នុងការយល់ភាសា
|
|
|
|
|
|
ពេលដែលត្រូវបានផ្សាយហើយ ម៉ូឌែល LUIS អាចត្រូវបានហៅពីកូដ។ ក្នុងមេរៀនមុន អ្នកបានប្រើ IoT Hub ដើម្បីគ្រប់គ្រងការប្រាស្រ័យទាក់ទងជាមួយសេវាកម្ម cloud ដោយជញ្ជូនទិន្នន័យ telemetry និងស្តាប់ការបញ្ជា។ ពីនេះជា asynchronous ល្អណាស់ - ពេលដែលបានផ្ញើ telemetry កូដរបស់អ្នកមិនចាំរង់ចាំការផ្លាស់ប្តូរ ក៏បើសេវាកម្ម cloud បានផ្អាក អ្នកនឹងមិនដឹង។
|
|
|
|
|
|
សម្រាប់ដៃម៉ាញលឿន (smart timer) យើងចង់ស្នើឆ្លើយតបបន្ទាន់ ដូច្នេះអ្នកអាចប្រាប់អ្នកប្រើថា ដៃម៉ាញបានដាក់ហើយ ឬព្រមានថាសេវាកម្ម cloud មិនអាចប្រើបាន។ ដើម្បីធ្វើបែបនេះ ឧបករណ៍ IoT របស់យើងនឹងហៅវេបសាយចំណុចបញ្ចប់ដោយផ្ទាល់ ជំនួសការ ទុកចិត្តលើ IoT Hub។
|
|
|
|
|
|
ជំនួសហៅ LUIS ពីឧបករណ៍ IoT អ្នកអាចប្រើកូដ serverless ជាមួយប្រភេទ trigger ផ្សេងៗមួយគឺជា HTTP trigger។ វាអនុញ្ញាតឲ្យកម្មវិធីអនុគមន៍របស់អ្នកស្តាប់សំណើ REST ហើយឆ្លើយតបជាមួយវា។ អនុគមន៍នេះនឹងជាចំណុចបញ្ចប់ REST ដែលឧបករណ៍អ្នកអាចហៅ។
|
|
|
|
|
|
> 💁 បើទោះបីអ្នកអាចហៅ LUIS ដោយផ្ទាល់ពីឧបករណ៍ IoT អ្នកកាន់តែល្អប្រើកូដបែប serverless។ ដូច្នេះនៅពេលមានបំណងផ្លាស់ប្ដូរកម្មវិធី LUIS ដែលអ្នកហៅ ដូចជាពេលដែលអ្នកបណ្ដុះម៉ូឌែលល្អជាងមុន ឬបណ្ដុះម៉ូឌែលភាសាផ្សេង អ្នកគ្រាន់តែត្រូវបន្ទាន់សម័យកូដ cloud តែប៉ុណ្ណោះ មិនចាំបាច់ដាក់កូដឡើងវិញក្នុងឧបករណ៍ IoT ច្រើនរាប់ពាន់ឬលានគ្រឿងឡើយ។
|
|
|
|
|
|
### ប៉ះប៉ង - បង្កើតកម្មវិធី serverless functions
|
|
|
|
|
|
1. បង្កើតកម្មវិធី Azure Functions ដែលមានឈ្មោះ `smart-timer-trigger` ហើយបើកវានៅក្នុង VS Code
|
|
|
|
|
|
1. បន្ថែម HTTP trigger ទៅកម្មវិធីនេះឈ្មោះ `speech-trigger` ដោយប្រើពាក្យបញ្ជាខាងក្រោមពី terminal ក្នុង VS Code៖
|
|
|
|
|
|
```sh
|
|
|
func new --name text-to-timer --template "HTTP trigger"
|
|
|
```
|
|
|
|
|
|
នេះនឹងបង្កើត HTTP trigger មានឈ្មោះ `text-to-timer`។
|
|
|
|
|
|
1. សាកល្បង HTTP trigger ដោយរត់កម្មវិធី functions app។ ពេលវារត់ អ្នកនឹងឃើញចំណុចបញ្ចប់បង្ហាញនៅលើលទ្ធផល៖
|
|
|
|
|
|
```output
|
|
|
Functions:
|
|
|
|
|
|
text-to-timer: [GET,POST] http://localhost:7071/api/text-to-timer
|
|
|
```
|
|
|
|
|
|
សាកល្បងនេះដោយផ្ទុក URL [http://localhost:7071/api/text-to-timer](http://localhost:7071/api/text-to-timer) នៅក្នុងកម្មវិធី រុករកគេហទំព័រ។
|
|
|
|
|
|
```output
|
|
|
This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.
|
|
|
```
|
|
|
|
|
|
### ប៉ះប៉ង - ប្រើម៉ូឌែលអស់ក្នុងការយល់ភាសា
|
|
|
|
|
|
1. SDK សម្រាប់ LUIS មាននៅតាម ប៉ែគ Pip។ បន្ថែមបន្ទាត់ខាងក្រោមចូលទៅ ឯកសារ `requirements.txt` ដើម្បីបន្ថែមការពឹងពាក់លើប៉ែគនេះ៖
|
|
|
|
|
|
```sh
|
|
|
azure-cognitiveservices-language-luis
|
|
|
```
|
|
|
|
|
|
1. ធ្វើឱ្យ VS Code terminal មាន virtual environment នៅក្នុងសកម្មភាព ហើយរត់ពាក្យបញ្ជាខាងក្រោមដើម្បីដំឡើងប៉ែគ Pip៖
|
|
|
|
|
|
```sh
|
|
|
pip install -r requirements.txt
|
|
|
```
|
|
|
|
|
|
> 💁 បើទទួលបានកំហុស អ្នកប្រហែលជាត្រូវឡើងកម្រិត pip ដោយប្រើពាក្យបញ្ជាខាងក្រោម៖
|
|
|
>
|
|
|
> ```sh
|
|
|
> pip install --upgrade pip
|
|
|
> ```
|
|
|
|
|
|
1. បន្ថែមបញ្ចីថ្មីឲ្យឯកសារ `local.settings.json` សម្រាប់ API Key, Endpoint URL និង App ID របស់ LUIS ពីប៊ូតុង **MANAGE** នៅក្នុង portal LUIS:
|
|
|
|
|
|
```JSON
|
|
|
"LUIS_KEY": "<primary key>",
|
|
|
"LUIS_ENDPOINT_URL": "<endpoint url>",
|
|
|
"LUIS_APP_ID": "<app id>"
|
|
|
```
|
|
|
|
|
|
ជំនួស `<endpoint url>` ជាមួយ URL ចំណុចបញ្ចប់ពីផ្នែក *Azure Resources* នៃប៊ូតុង **MANAGE**។ វានឹងមានរូបរាង `https://<location>.api.cognitive.microsoft.com/`។
|
|
|
|
|
|
ជំនួស `<app id>` ជាមួយ App ID ពីផ្នែក *Settings* នៃប៊ូតុង **MANAGE**។
|
|
|
|
|
|
ជំនួស `<primary key>` ជាមួយ Primary Key ពីផ្នែក *Azure Resources* នៃប៊ូតុង **MANAGE**។
|
|
|
|
|
|
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)
|
|
|
```
|
|
|
|
|
|
កូដនេះផ្ទុកតម្លៃដែលអ្នកបានបន្ថែមក្នុងឯកសារ `local.settings.json` របស់កម្មវិធី LUIS របស់អ្នក បង្កើតវត្ថុ credentials ជាមួយ API key របស់អ្នក ហើយបង្កើត client LUIS ដើម្បីទំនាក់ទំនងជាមួយកម្មវិធី LUIS របស់អ្នក។
|
|
|
|
|
|
1. HTTP trigger នេះនឹងត្រូវហៅដោយផ្ញើអត្ថបទសម្រាប់យល់ជា 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 ដោយប្រើ staging slot ដែលកម្មវិធីរបស់អ្នកត្រូវបានផ្សាយទៅ៖
|
|
|
|
|
|
```python
|
|
|
prediction_response = client.prediction.get_slot_prediction(app_id, 'Staging', prediction_request)
|
|
|
```
|
|
|
|
|
|
1. សំណើប៉ាន់ប្រមាណបង្ហាញចេតនាកំពូល (top intent) គឺជាចេតនាដែលមានពិន្ទុព្យាករណ៍ខ្ពស់បំផុត ជាមួយគ្នានឹងខ្សែអង្គភាព។ ប្រសិនបើចេតនាកំពូលគឺជា `set timer`, អ្នកអាចអានអង្គភាពដើម្បីទាញយកពេលវេលាសម្រាប់ដៃម៉ាញ៖
|
|
|
|
|
|
```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` នឹងជាអារេនៃលេខ។ ឧទាហរណ៍ បើអ្នកថា *"Set a four minute 17 second timer."*, អារេ `number` នឹងមានពេញត្រឹមពីរចំនួនគឺ ៤ និង ១៧។
|
|
|
|
|
|
អង្គភាព `time unit` នឹងជាអារេនៃអារេនៃស្នូលអក្សរ ដែលភាគីនីមួយៗជាអារេស្នូលអក្សរនៅក្នុងអារេ។ ឧទាហរណ៍ បើអ្នកថា *"Set a four minute 17 second timer."*, អារេ `time unit` នឹងមាន ២អារេ ដែលមានតម្លៃតែមួយនៅក្នុងនីមួយៗគឺ `['minute']` និង `['second']`។
|
|
|
|
|
|
JSON នៃអង្គភាពទាំងនេះសម្រាប់ *"Set a four minute 17 second timer."* គឺជា៖
|
|
|
|
|
|
```json
|
|
|
{
|
|
|
"number": [4, 17],
|
|
|
"time unit": [
|
|
|
["minute"],
|
|
|
["second"]
|
|
|
]
|
|
|
}
|
|
|
```
|
|
|
|
|
|
កូដនេះក៏កំណត់តម្លៃគិតសរុបនៃពេលវេលាដៃម៉ាញជាវិនាទី។ តម្លៃនេះនឹងគិតបញ្ចូលតាមតម្លៃពីអង្គភាពនេះ។
|
|
|
|
|
|
1. អង្គភាពមិនត្រូវបានភ្ជាប់ ដែលទើបអាចយកអត្រាពីពួកវា។ វានឹងធ្វើជាតំបន់ទិសដែលបាននិយាយ ដូច្នេះទីតាំងក្នុងអារេអាចប្រើដើម្បីកំណត់នូវលេខណាមួយត្រូវត្វីជាមួយនឹងតុកលក្ខណៈពេលវេលា។ ឧទាហរណ៍៖
|
|
|
|
|
|
* *"Set a 30 second timer"* - នេះមិនមានលេខតែមួយគឺ `30` និងមួយតុក `second` ដូច្នេះលេខតែមួយនឹងត្រូវគ្នាជាមួយតុកតែមួយ។
|
|
|
* *"Set a 2 minute and 30 second timer"* - នេះមានពីរលេខ គឺ `2` និង `30` និងពីរតុក គឺ `minute` និង `second` ដូច្នេះលេខទីមួយនឹងសម្រាប់តុកទីមួយ (2 នាទី) និងលេខទីពីរសម្រាប់តុកទីពីរ (30 វិនាទី)។
|
|
|
|
|
|
កូដខាងក្រោមនេះទាញកំណត់ចំនួនធាតុនៅក្នុងអង្គភាពលេខ ហើយប្រើវាដើម្បីយកធាតុទីមួយពីគ្រប់អារេ ហើយបន្ទាប់មកធាតុទីពីរ និងអញ្ចឹងតទៅ។ បន្ថែមវានៅក្នុង `if` block។
|
|
|
|
|
|
```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. ក្នុងជុំវិញនេះ សូមប្រើលេខ និងតុកពេលវេលាដើម្បីគណនាពេលវេលាសរុបសម្រាប់ដៃម៉ាញ ដោយបន្ថែម 60 វិនាទីសម្រាប់ម каждую минуту និងលេខវិនាទីសម្រាប់វិញទេ។
|
|
|
|
|
|
```python
|
|
|
if time_unit == 'minute':
|
|
|
total_seconds += number * 60
|
|
|
else:
|
|
|
total_seconds += number
|
|
|
```
|
|
|
|
|
|
1. ក្រៅជុំវិញនេះ តាមអង្គភាព សូមកត់ត្រាពេលវេលាសរុបសម្រាប់ដៃម៉ាញ:
|
|
|
|
|
|
```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` block ដោះស្រាយករណីដែលចេតនាមិនត្រូវបានស្គាល់ដោយត្រឡប់កូដកំហុស៖
|
|
|
|
|
|
```python
|
|
|
return func.HttpResponse(status_code=404)
|
|
|
```
|
|
|
|
|
|
404 ជាកូដស្ថានភាពសម្រាប់ *not found*។
|
|
|
|
|
|
1. រត់កម្មវិធី functions app ហើយសាកល្បងវាដោយប្រើ curl។
|
|
|
|
|
|
```sh
|
|
|
curl --request POST 'http://localhost:7071/api/text-to-timer' \
|
|
|
--header 'Content-Type: application/json' \
|
|
|
--include \
|
|
|
--data '{"text":"<text>"}'
|
|
|
```
|
|
|
|
|
|
ជំនួស `<text>` ជាមួយអត្ថបទនៃសំណើរបស់អ្នក, ឧទាហរណ៍ `set a 2 minutes 27 second timer`។
|
|
|
|
|
|
អ្នកនឹងឃើញចេញលទ្ធផលខាងក្រោមពីកម្មវិធី functions app៖
|
|
|
|
|
|
```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 របស់អ្នកអាចចូលដំណើរការ ទាមទារអ្នកផ្សព្វផ្សាយទៅ cloud ឬទទួល IP address របស់អ្នកសម្រាប់ចូលដំណើរការនៅក្នុងស្រុក។
|
|
|
|
|
|
> ⚠️ បើអ្នកកំពុងប្រើ Wio Terminal វាងាយស្រួលដំណើរការ functions app នៅក្នុងតំបន់ស្រុក ដោយសារតែមានការពឹងផ្អែកលើបណ្ណាល័យដែលបង្ខំឱ្យអ្នកមិនអាចដាក់ផ្ទុក functions app ដូចពេលមុនទៀតទេ។ ដំណើរការ functions app នៅក្នុងតំបន់ស្រុក ហើយចូលដំណើរការតាម IP address កុំព្យូទ័ររបស់អ្នក។ បើអ្នកចង់ដាក់ផ្ទុកទៅ cloud ខ្សែព័ត៌មាននឹងត្រូវបានផ្ដល់នៅក្នុងមេរៀនបន្តបន្ទាប់។
|
|
|
|
|
|
* ផ្សាយកម្មវិធី Functions app - អនុវត្តតាមនីតិវិធីនៅក្នុងមេរៀនខាងមុនដើម្បីផ្សាយ functions app ទៅ cloud។ បន្ទាប់ពីផ្សាយកម្រិត URL នឹងមានរូបរាង `https://<APP_NAME>.azurewebsites.net/api/text-to-timer` ដែល `<APP_NAME>` ជាឈ្មោះ functions app របស់អ្នក។ សូមធ្វើឲ្យផ្សាយតម្រូវការកំណត់ក្នុងតំបន់ស្រុករបស់អ្នកដែរ។
|
|
|
|
|
|
នៅពេលធ្វើការជាមួយ HTTP triggers វាត្រូវបានរក្សាសិទ្ធិដោយមូលដ្ឋានជាមួយសោមុខងារ។ ដើម្បីទទួលបានសោនេះ អ្នកត្រូវរត់ពាក្យបញ្ជាខាងក្រោម៖
|
|
|
|
|
|
```sh
|
|
|
az functionapp keys list --resource-group smart-timer \
|
|
|
--name <APP_NAME>
|
|
|
```
|
|
|
|
|
|
ចម្លងតម្លៃចេញពីបញ្ចូល `default` ក្នុងផ្នែក `functionKeys` ។
|
|
|
|
|
|
```output
|
|
|
{
|
|
|
"functionKeys": {
|
|
|
"default": "sQO1LQaeK9N1qYD6SXeb/TctCmwQEkToLJU6Dw8TthNeUH8VA45hlA=="
|
|
|
},
|
|
|
"masterKey": "RSKOAIlyvvQEQt9dfpabJT018scaLpQu9p1poHIMCxx5LYrIQZyQ/g==",
|
|
|
"systemKeys": {}
|
|
|
}
|
|
|
```
|
|
|
|
|
|
សោនេះត្រូវបញ្ចូលជាពួរ តាមលំនាំURL ដូច្នេះ URL ចុងបញ្ចប់នឹងជា `https://<APP_NAME>.azurewebsites.net/api/text-to-timer?code=<FUNCTION_KEY>` ដែល `<APP_NAME>` ជាឈ្មោះ functions app របស់អ្នក ហើយ `<FUNCTION_KEY>` ជាសោមុខងារមូលដ្ឋានរបស់អ្នក។
|
|
|
|
|
|
> 💁 អ្នកអាចផ្លាស់ប្ដូរប្រភេទអនុភាពនៃ HTTP trigger ដោយប្រើការកំណត់ `authlevel` នៅក្នុងឯកសារ `function.json`។ អ្នកអាចអានបន្ថែមអំពីរឿងនេះនៅ [ផ្នែកកំណត់រចនាសម្ព័ន្ធរបស់ Azure Functions HTTP trigger នៅ Microsoft docs](https://docs.microsoft.com/azure/azure-functions/functions-bindings-http-webhook-trigger?WT.mc_id=academic-17441-jabenn&tabs=python#configuration)។
|
|
|
|
|
|
* រត់ functions app នៅក្នុងតំបន់ស្រុក ហើយចូលប្រើតាម IP address - អ្នកអាចទទួល IP addressរបស់កុំព្យូទ័រ នៅលើបណ្តាញស្រុក ហើយប្រើវាដើម្បីបង្កើត URL។
|
|
|
|
|
|
ស្វែងរក IP address របស់អ្នក៖
|
|
|
|
|
|
* លើ Windows 10 សូមអនុវត្តតាម [មេរៀនរក IP address របស់អ្នក](https://support.microsoft.com/windows/find-your-ip-address-f21a9bbc-c582-55cd-35e0-73431160a1b9?WT.mc_id=academic-17441-jabenn)
|
|
|
* លើ macOS សូមអនុវត្តតាម [របៀបរក IP address លើ Mac](https://www.hellotech.com/guide/for/how-to-find-ip-address-on-mac)
|
|
|
* លើ Linux សូមអនុវត្តតាមផ្នែករក IP address ឯកជននៅក្នុង [របៀបរក IP address នៅ Linux](https://opensource.com/article/18/5/how-find-ip-address-linux)
|
|
|
|
|
|
បន្ទាប់ពីមាន IP address អ្នកអាចចូលដំណើរការ function នៅ `http://<IP_ADDRESS>:7071/api/text-to-timer` ដែល `<IP_ADDRESS>` ជា IP address របស់អ្នក, ឧទាហរណ៍ `http://192.168.1.10:7071/api/text-to-timer`។
|
|
|
> 💁 មិនមែនថានេះប្រើច្រក ៧០៧១ ទេ ដូច្នេះបន្ទាប់ពីអាសយដ្ឋាន IP អ្នកនឹងត្រូវមាន `:7071`។
|
|
|
|
|
|
> 💁 នេះនឹងដំណើរការតែបើឧបករណ៍ IoT របស់អ្នកមាននៅលើបណ្ដាញដូចគ្នាជាមួយកុំព្យូទ័ររបស់អ្នក។
|
|
|
|
|
|
1. សាកល្បងចុងបញ្ចប់ដោយចូលប្រើវាតាមរយៈ curl។
|
|
|
|
|
|
---
|
|
|
|
|
|
## 🚀 챌린지
|
|
|
|
|
|
មានវិធីជាច្រើនក្នុងការស្នើសុំអ្វីមួយដូចជា ការកំណត់ម៉ោងសម្រាប់ធ្វើការងារ។ គិតពីវិធីផ្សេងៗដើម្បីធ្វើរឿងនេះ ហើយប្រើពួកវាជាគំរូនៅក្នុងកម្មវិធី LUIS របស់អ្នក។ សាកល្បងពួកវា ដើម្បីមើលថា ម៉ូឌែលរបស់អ្នកអាចធ្វើការប្រយុទ្ធបានយ៉ាងម៉េចជាមួយនឹងវិធីស្នើសុំម៉ោងជាច្រើន។
|
|
|
|
|
|
## ការប្រឡងបន្ទាប់ពីមេរៀន
|
|
|
|
|
|
[ការប្រឡងបន្ទាប់ពីមេរៀន](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/44)
|
|
|
|
|
|
## ពិនិត្យឡើងវិញ និង សិក្សាឯកោ
|
|
|
|
|
|
* អានបន្ថែមអំពី LUIS និងសមត្ថភាពរបស់វានៅលើ [ទំព័រឯកសារយល់ដឹងភាសា (LUIS) នៅលើឯកសាររបស់ Microsoft](https://docs.microsoft.com/azure/cognitive-services/luis/?WT.mc_id=academic-17441-jabenn)
|
|
|
* អានបន្ថែមអំពីការយល់ដឹងភាសានៅលើ [ទំព័រយល់ដឹងភាសាធម្មជាតិនៅលើវិគីភីឌា](https://wikipedia.org/wiki/Natural-language_understanding)
|
|
|
* អានបន្ថែមអំពីកម្មវិធី HTTP triggers នៅក្នុង [ឯកសារកម្មវិធី Azure Functions HTTP trigger លើឯកសាររបស់ Microsoft](https://docs.microsoft.com/azure/azure-functions/functions-bindings-http-webhook-trigger?WT.mc_id=academic-17441-jabenn&tabs=python)
|
|
|
|
|
|
## កិច្ចការផ្ទះ
|
|
|
|
|
|
[បោះបង់ម៉ោង](assignment.md)
|
|
|
|
|
|
---
|
|
|
|
|
|
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
|
|
**ការបដិសេធ**៖
|
|
|
ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលដែលយើងខិតខំសំរាប់ការត្រឹមត្រូវ សូមយកចិត្តទុកដាក់ថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុស ឬការមិនត្រឹមត្រូវ។ ឯកសារដើមក្នុងភាសាម្ចាស់ដំបូងគួរត្រូវបានគេយោងជាដើមប្រភពដែលមានអំណាច។ សម្រាប់ព័ត៌មានសំខាន់ៗ គួរតែប្រើការបកប្រែដោយមនុស្សជំនៀងជាងនេះ។ យើងមិនមានជំនួសចំពោះការយល់ច្រឡំនា ឬការបកប្រែខុសចេញពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។
|
|
|
<!-- CO-OP TRANSLATOR DISCLAIMER END --> |