You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
IoT-For-Beginners/translations/el/6-consumer/lessons/2-language-understanding/README.md

539 lines
48 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "6f4ba69d77f16c4a5110623a96a215c3",
"translation_date": "2025-08-27T20:20:15+00:00",
"source_file": "6-consumer/lessons/2-language-understanding/README.md",
"language_code": "el"
}
-->
# Κατανόηση γλώσσας
![Μια επισκόπηση του μαθήματος σε μορφή σκίτσου](../../../../../translated_images/lesson-22.6148ea28500d9e00c396aaa2649935fb6641362c8f03d8e5e90a676977ab01dd.el.jpg)
> Σκίτσο από τη [Nitya Narasimhan](https://github.com/nitya). Κάντε κλικ στην εικόνα για μεγαλύτερη έκδοση.
## Ερωτηματολόγιο πριν το μάθημα
[Ερωτηματολόγιο πριν το μάθημα](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/43)
## Εισαγωγή
Στο προηγούμενο μάθημα μετατρέψατε ομιλία σε κείμενο. Για να χρησιμοποιηθεί αυτό για τον προγραμματισμό ενός έξυπνου χρονοδιακόπτη, ο κώδικάς σας θα πρέπει να κατανοεί τι ειπώθηκε. Θα μπορούσατε να υποθέσετε ότι ο χρήστης θα πει μια σταθερή φράση, όπως "Ρύθμισε έναν χρονοδιακόπτη 3 λεπτών", και να αναλύσετε αυτήν την έκφραση για να προσδιορίσετε τη διάρκεια του χρονοδιακόπτη. Ωστόσο, αυτό δεν είναι πολύ φιλικό προς τον χρήστη. Αν ένας χρήστης έλεγε "Ρύθμισε έναν χρονοδιακόπτη για 3 λεπτά", εσείς ή εγώ θα καταλαβαίναμε τι εννοεί, αλλά ο κώδικάς σας όχι, καθώς θα περίμενε μια σταθερή φράση.
Εδώ έρχεται η κατανόηση γλώσσας, χρησιμοποιώντας μοντέλα τεχνητής νοημοσύνης για την ερμηνεία κειμένου και την επιστροφή των απαραίτητων λεπτομερειών. Για παράδειγμα, το μοντέλο μπορεί να κατανοήσει τόσο τη φράση "Ρύθμισε έναν χρονοδιακόπτη 3 λεπτών" όσο και τη φράση "Ρύθμισε έναν χρονοδιακόπτη για 3 λεπτά" και να καταλάβει ότι απαιτείται ένας χρονοδιακόπτης διάρκειας 3 λεπτών.
Σε αυτό το μάθημα θα μάθετε για τα μοντέλα κατανόησης γλώσσας, πώς να τα δημιουργείτε, να τα εκπαιδεύετε και να τα χρησιμοποιείτε στον κώδικά σας.
Σε αυτό το μάθημα θα καλύψουμε:
* [Κατανόηση γλώσσας](../../../../../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) και ασχολείται με την κατανόηση κειμένου, προσπαθώντας να κατανοήσει τις λεπτομέρειες λέξεων ή προτάσεων. Αν χρησιμοποιείτε έναν φωνητικό βοηθό όπως η Alexa ή η Siri, τότε έχετε χρησιμοποιήσει υπηρεσίες κατανόησης γλώσσας. Αυτές είναι οι υπηρεσίες τεχνητής νοημοσύνης που μετατρέπουν το "Alexa, παίξε το τελευταίο άλμπουμ της Taylor Swift" στο να χορεύει η κόρη μου στο σαλόνι με τα αγαπημένα της τραγούδια.
> 💁 Οι υπολογιστές, παρά τις προόδους τους, έχουν ακόμα πολύ δρόμο να διανύσουν για να κατανοήσουν πραγματικά το κείμενο. Όταν αναφερόμαστε στην κατανόηση γλώσσας από υπολογιστές, δεν εννοούμε κάτι τόσο προχωρημένο όσο η ανθρώπινη επικοινωνία. Αντίθετα, εννοούμε την εξαγωγή βασικών λεπτομερειών από κάποιες λέξεις.
Ως άνθρωποι, κατανοούμε τη γλώσσα χωρίς να το σκεφτόμαστε ιδιαίτερα. Αν ζητούσα από έναν άλλο άνθρωπο να "παίξει το τελευταίο άλμπουμ της Taylor Swift", θα καταλάβαινε αμέσως τι εννοώ. Για έναν υπολογιστή, αυτό είναι πιο δύσκολο. Θα έπρεπε να πάρει τις λέξεις, να τις μετατρέψει από ομιλία σε κείμενο και να επεξεργαστεί τις εξής πληροφορίες:
* Πρέπει να παίξει μουσική
* Η μουσική είναι από την καλλιτέχνιδα Taylor Swift
* Η συγκεκριμένη μουσική είναι ένα ολόκληρο άλμπουμ με πολλαπλά κομμάτια στη σειρά
* Η Taylor Swift έχει πολλά άλμπουμ, οπότε πρέπει να ταξινομηθούν χρονολογικά και να επιλεγεί το πιο πρόσφατο
✅ Σκεφτείτε κάποιες άλλες προτάσεις που έχετε πει όταν κάνετε αιτήματα, όπως να παραγγείλετε καφέ ή να ζητήσετε από ένα μέλος της οικογένειας να σας δώσει κάτι. Προσπαθήστε να τις αναλύσετε στις πληροφορίες που θα έπρεπε να εξάγει ένας υπολογιστής για να κατανοήσει την πρόταση.
Τα μοντέλα κατανόησης γλώσσας είναι μοντέλα τεχνητής νοημοσύνης που εκπαιδεύονται για να εξάγουν συγκεκριμένες λεπτομέρειες από τη γλώσσα και στη συνέχεια εκπαιδεύονται για συγκεκριμένες εργασίες χρησιμοποιώντας μεταφορά μάθησης, με τον ίδιο τρόπο που εκπαιδεύσατε ένα μοντέλο Custom Vision χρησιμοποιώντας ένα μικρό σύνολο εικόνων. Μπορείτε να πάρετε ένα μοντέλο και να το εκπαιδεύσετε χρησιμοποιώντας το κείμενο που θέλετε να κατανοήσει.
## Δημιουργία μοντέλου κατανόησης γλώσσας
![Το λογότυπο του LUIS](../../../../../translated_images/luis-logo.5cb4f3e88c020ee6df4f614e8831f4a4b6809a7247bf52085fb48d629ef9be52.el.png)
Μπορείτε να δημιουργήσετε μοντέλα κατανόησης γλώσσας χρησιμοποιώντας το LUIS, μια υπηρεσία κατανόησης γλώσσας της Microsoft που αποτελεί μέρος των 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 <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. Από τη λίστα *Conversation apps*, επιλέξτε το κουμπί **New app** για να δημιουργήσετε μια νέα εφαρμογή. Ονομάστε τη νέα εφαρμογή `smart-timer` και ορίστε την *Culture* στη γλώσσα σας.
> 💁 Υπάρχει ένα πεδίο για έναν πόρο πρόβλεψης. Μπορείτε να δημιουργήσετε έναν δεύτερο πόρο μόνο για πρόβλεψη, αλλά ο δωρεάν πόρος συγγραφής επιτρέπει 1.000 προβλέψεις το μήνα, που θα πρέπει να είναι αρκετές για ανάπτυξη, οπότε μπορείτε να το αφήσετε κενό.
1. Διαβάστε τον οδηγό που εμφανίζεται μόλις δημιουργήσετε την εφαρμογή για να κατανοήσετε τα βήματα που πρέπει να ακολουθήσετε για να εκπαιδεύσετε το μοντέλο κατανόησης γλώσσας. Κλείστε τον οδηγό όταν τελειώσετε.
## Προθέσεις και οντότητες
Η κατανόηση γλώσσας βασίζεται στις *προθέσεις* και τις *οντότητες*. Οι προθέσεις είναι το τι θέλει να κάνει ο χρήστης, για παράδειγμα να παίξει μουσική, να ρυθμίσει έναν χρονοδιακόπτη ή να παραγγείλει φαγητό. Οι οντότητες είναι το αντικείμενο στο οποίο αναφέρεται η πρόθεση, όπως το άλμπουμ, η διάρκεια του χρονοδιακόπτη ή το είδος του φαγητού. Κάθε πρόταση που ερμηνεύει το μοντέλο θα πρέπει να έχει τουλάχιστον μία πρόθεση και προαιρετικά μία ή περισσότερες οντότητες.
Μερικά παραδείγματα:
| Πρόταση | Πρόθεση | Οντότητες |
| -------------------------------------------------- | ---------------- | ------------------------------------------ |
| "Παίξε το τελευταίο άλμπουμ της Taylor Swift" | *παίξε μουσική* | *το τελευταίο άλμπουμ της Taylor Swift* |
| "Ρύθμισε έναν χρονοδιακόπτη 3 λεπτών" | *ρύθμισε χρονοδιακόπτη* | *3 λεπτά* |
| "Ακύρωσε τον χρονοδιακόπτη μου" | *ακύρωσε χρονοδιακόπτη* | Καμία |
| "Παράγγειλε 3 μεγάλες πίτσες με ανανά και μια σαλάτα καίσαρα" | *παράγγειλε φαγητό* | *3 μεγάλες πίτσες με ανανά*, *σαλάτα καίσαρα* |
✅ Με τις προτάσεις που σκεφτήκατε νωρίτερα, ποια θα ήταν η πρόθεση και ποιες οι οντότητες σε αυτές τις προτάσεις;
Για να εκπαιδεύσετε το LUIS, πρώτα ορίζετε τις οντότητες. Αυτές μπορεί να είναι μια σταθερή λίστα όρων ή να μαθαίνονται από το κείμενο. Για παράδειγμα, μπορείτε να παρέχετε μια σταθερή λίστα φαγητών από το μενού σας, με παραλλαγές (ή συνώνυμα) για κάθε λέξη, όπως *μελιτζάνα* και *aubergine* ως παραλλαγές της *μελιτζάνας*. Το LUIS διαθέτει επίσης προεγκατεστημένες οντότητες που μπορούν να χρησιμοποιηθούν, όπως αριθμοί και τοποθεσίες.
Για τη ρύθμιση ενός χρονοδιακόπτη, μπορείτε να έχετε μία οντότητα που χρησιμοποιεί την προεγκατεστημένη οντότητα αριθμών για τον χρόνο και μία άλλη για τις μονάδες, όπως λεπτά και δευτερόλεπτα. Κάθε μονάδα θα έχει πολλαπλές παραλλαγές για να καλύψει τις ενικό και πληθυντικό μορφές - όπως λεπτό και λεπτά.
Αφού ορίσετε τις οντότητες, δημιουργείτε προθέσεις. Αυτές μαθαίνονται από το μοντέλο βάσει παραδειγμάτων προτάσεων που παρέχετε (γνωστές ως εκφωνήσεις). Για παράδειγμα, για την πρόθεση *ρύθμισε χρονοδιακόπτη*, μπορείτε να παρέχετε τις εξής προτάσεις:
* `ρύθμισε έναν χρονοδιακόπτη 1 δευτερολέπτου`
* `ρύθμισε έναν χρονοδιακόπτη για 1 λεπτό και 12 δευτερόλεπτα`
* `ρύθμισε έναν χρονοδιακόπτη για 3 λεπτά`
* `ρύθμισε έναν χρονοδιακόπτη 9 λεπτών και 30 δευτερολέπτων`
Στη συνέχεια, λέτε στο LUIS ποια μέρη αυτών των προτάσεων αντιστοιχούν στις οντότητες:
![Η πρόταση "ρύθμισε έναν χρονοδιακόπτη για 1 λεπτό και 12 δευτερόλεπτα" χωρισμένη σε οντότητες](../../../../../translated_images/sentence-as-intent-entities.301401696f9922590a99343f5c5d211b710b906f212f0d4d034cee3ffb610272.el.png)
Η πρόταση `ρύθμισε έναν χρονοδιακόπτη για 1 λεπτό και 12 δευτερόλεπτα` έχει την πρόθεση `ρύθμισε χρονοδιακόπτη`. Έχει επίσης 2 οντότητες με 2 τιμές η καθεμία:
| | χρόνος | μονάδα |
| ---------- | ---: | ------ |
| 1 λεπτό | 1 | λεπτό |
| 12 δευτερόλεπτα | 12 | δευτερόλεπτο |
Για να εκπαιδεύσετε ένα καλό μοντέλο, χρειάζεστε μια ποικιλία διαφορετικών παραδειγμάτων προτάσεων για να καλύψετε τους πολλούς διαφορετικούς τρόπους με τους οποίους κάποιος μπορεί να ζητήσει το ίδιο πράγμα.
> 💁 Όπως με οποιοδήποτε μοντέλο τεχνητής νοημοσύνης, όσο περισσότερα και πιο ακριβή δεδομένα χρησιμοποιείτε για την εκπαίδευση, τόσο καλύτερο θα είναι το μοντέλο.
✅ Σκεφτείτε τους διαφορετικούς τρόπους με τους οποίους μπορεί να ζητήσετε το ίδιο πράγμα και να περιμένετε από έναν άνθρωπο να το καταλάβει.
### Εργασία - προσθήκη οντοτήτων στα μοντέλα κατανόησης γλώσσας
Για τον χρονοδιακόπτη, χρειάζεστε 2 οντότητες - μία για τη μονάδα χρόνου (λεπτά ή δευτερόλεπτα) και μία για τον αριθμό των λεπτών ή δευτερολέπτων.
Μπορείτε να βρείτε οδηγίες για τη χρήση της πύλης LUIS στην [τεκμηρίωση Quickstart: Build your app in LUIS portal στο 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*. Προσθέστε τιμές για `λεπτό` και `δευτερόλεπτο` στη λίστα *Normalized values*, προσθέτοντας τις ενικό και πληθυντικό μορφές στη λίστα *synonyms*. Πατήστε `return` μετά την προσθήκη κάθε συνωνύμου για να το προσθέσετε στη λίστα.
| Κανονικοποιημένη τιμή | Συνώνυμα |
| --------------------- | --------------- |
| λεπτό | λεπτό, λεπτά |
| δευτερόλεπτο | δευτερόλεπτο, δευτερόλεπτα |
### Εργασία - προσθήκη προθέσεων στα μοντέλα κατανόησης γλώσσας
1. Από την καρτέλα *Intents*, επιλέξτε το κουμπί **Create** για να δημιουργήσετε μια νέα πρόθεση. Ονομάστε αυτήν την πρόθεση `set timer`.
1. Στα παραδείγματα, εισάγετε διαφορετικούς τρόπους για να ρυθμίσετε έναν χρονοδιακόπτη χρησιμοποιώντας λεπτά, δευτερόλεπτα και συνδυασμούς λεπτών και δευτερολέπτων. Παραδείγματα μπορεί να είναι:
* `ρύθμισε έναν χρονοδιακόπτη 1 δευτερολέπτου`
* `ρύθμισε έναν χρονοδιακόπτη 4 λεπτών`
* `ρύθμισε έναν χρονοδιακόπτη τεσσάρων λεπτών και έξι δευτερολέπτων`
* `ρύθμισε έναν χρονοδιακόπτη 9 λεπτών
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>` με το Endpoint URL από την ενότητα *Azure Resources*.
Αντικαταστήστε το `<app id>` με το App ID από την ενότητα *Settings*.
Αντικαταστήστε το `<primary key>` με το Primary Key από την ενότητα *Azure Resources*.
Αντικαταστήστε το `<sentence>` με την πρόταση που θέλετε να δοκιμάσετε.
1. Η έξοδος αυτής της κλήσης θα είναι ένα έγγραφο JSON που περιγράφει το ερώτημα, την κορυφαία πρόθεση (top 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` ήταν η κορυφαία πρόθεση με πιθανότητα 97%.
* Εντοπίστηκαν δύο οντότητες τύπου *number*, `45` και `12`.
* Εντοπίστηκαν δύο οντότητες τύπου *time-unit*, `minute` και `second`.
## Χρήση του μοντέλου κατανόησης γλώσσας
Αφού δημοσιευτεί, το μοντέλο LUIS μπορεί να κληθεί από τον κώδικα. Σε προηγούμενα μαθήματα, χρησιμοποιήσατε ένα IoT Hub για να διαχειριστείτε την επικοινωνία με τις υπηρεσίες cloud, στέλνοντας τηλεμετρία και λαμβάνοντας εντολές. Αυτή η διαδικασία είναι πολύ ασύγχρονη - μόλις σταλεί η τηλεμετρία, ο κώδικάς σας δεν περιμένει απάντηση, και αν η υπηρεσία cloud δεν είναι διαθέσιμη, δεν θα το γνωρίζετε.
Για έναν έξυπνο χρονοδιακόπτη, θέλουμε μια άμεση απάντηση, ώστε να ενημερώσουμε τον χρήστη ότι ο χρονοδιακόπτης έχει ρυθμιστεί ή να τον ειδοποιήσουμε ότι οι υπηρεσίες cloud δεν είναι διαθέσιμες. Για να το πετύχουμε αυτό, η συσκευή IoT μας θα καλεί απευθείας ένα web endpoint, αντί να βασίζεται σε ένα IoT Hub.
Αντί να καλείτε το LUIS από τη συσκευή IoT, μπορείτε να χρησιμοποιήσετε serverless κώδικα με διαφορετικό τύπο trigger - ένα HTTP trigger. Αυτό επιτρέπει στην εφαρμογή σας να ακούει αιτήματα REST και να απαντά σε αυτά. Αυτή η λειτουργία θα είναι ένα REST endpoint που μπορεί να καλέσει η συσκευή σας.
> 💁 Αν και μπορείτε να καλέσετε το 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. Όταν εκτελεστεί, θα δείτε το endpoint να εμφανίζεται στην έξοδο:
```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) στον browser σας.
```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. Βεβαιωθείτε ότι το terminal του VS Code έχει ενεργοποιημένο το virtual environment και εκτελέστε την παρακάτω εντολή για να εγκαταστήσετε τα πακέτα 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** του LUIS portal:
```JSON
"LUIS_KEY": "<primary key>",
"LUIS_ENDPOINT_URL": "<endpoint url>",
"LUIS_APP_ID": "<app id>"
```
Αντικαταστήστε το `<endpoint url>` με το Endpoint 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 σας και στη συνέχεια δημιουργεί ένα αντικείμενο LUIS client για την αλληλεπίδραση με την εφαρμογή σας 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. Η απάντηση της πρόβλεψης περιέχει την κορυφαία πρόθεση - την πρόθεση με τη μεγαλύτερη βαθμολογία πρόβλεψης, μαζί με τις οντότητες. Αν η κορυφαία πρόθεση είναι `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` θα περιέχει 2 ακέραιους αριθμούς - 4 και 17.
Οι οντότητες `time unit` θα είναι ένας πίνακας από πίνακες συμβολοσειρών, με κάθε μονάδα χρόνου ως πίνακα συμβολοσειρών μέσα στον πίνακα. Για παράδειγμα, αν πείτε *"Set a four minute 17 second timer."*, τότε ο πίνακας `time unit` θα περιέχει 2 πίνακες με μία τιμή ο καθένας - `['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 δευτερόλεπτα).
Ο παρακάτω κώδικας λαμβάνει τον αριθμό των στοιχείων στις οντότητες `number` και χρησιμοποιεί αυτόν τον αριθμό για να εξάγει το πρώτο στοιχείο από κάθε πίνακα, στη συνέχεια το δεύτερο κ.ο.κ. Προσθέστε αυτό μέσα στο μπλοκ `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."*, αυτό θα επαναληφθεί δύο φορές, δίνοντας τις παρακάτω τιμές:
| loop count | `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)
```
Αυτός ο κώδικας δημιουργεί ένα payload που περιέχει τον συνολικό αριθμό δευτερολέπτων για τον χρονοδιακόπτη, το μετατρέπει σε JSON string και το επιστρέφει ως HTTP αποτέλεσμα με κωδικό κατάστασης 200, που σημαίνει ότι η κλήση ήταν επιτυχής.
1. Τέλος, έξω από το μπλοκ `if`, χειριστείτε την περίπτωση που η πρόθεση δεν αναγνωρίστηκε επιστρέφοντας έναν κωδικό σφάλματος:
```python
return func.HttpResponse(status_code=404)
```
Ο κωδικός 404 σημαίνει *not found*.
1. Εκτελέστε την εφαρμογή functions και δοκιμάστε την χρησιμοποιώντας το 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:
```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 endpoint, θα χρειαστεί να γνωρίζει το URL. Όταν το προσπελάσατε νωρίτερα, χρησιμοποιήσατε το `localhost`, που είναι μια συντόμευση για την πρόσβαση σε REST endpoints στον τοπικό σας υπολογιστή. Για να επιτρέψετε στη συσκευή IoT σας να έχει πρόσβαση, πρέπει είτε να δημοσιεύσετε την εφαρμογή στο cloud είτε να βρείτε τη διεύθυνση IP σας για τοπική πρόσβαση.
> ⚠️ Αν χρησιμοποιείτε Wio Terminal, είναι πιο εύκολο να εκτελέσετε την εφαρμογή functions τοπικά, καθώς θα υπάρχει εξάρτηση από βιβλιοθήκες που σημαίνει ότι δεν μπορείτε να αναπτύξετε την εφαρμογή functions με τον ίδιο τρόπο όπως πριν. Εκτελέστε την εφαρμογή functions τοπικά και αποκτήστε πρόσβαση μέσω της διεύθυνσης IP του υπολογιστή σας. Αν θέλετε να την αναπτύξετε στο cloud, θα δοθούν πληροφορίες σε επόμενο μάθημα για τον τρόπο να το κάνετε.
* Δημοσιεύστε την εφαρμογή Functions - ακολουθήστε τις οδηγίες σε προηγούμενα μαθήματα για να δημοσιεύσετε την εφαρμογή functions στο cloud. Μόλις δημοσιευτεί, το URL θα είναι `https://<APP_NAME>.azurewebsites.net/api/text-to-timer`, όπου το `<APP_NAME>` θα είναι το όνομα της εφαρμογής functions. Βεβαιωθείτε ότι δημοσιεύσατε και τις τοπικές ρυθμίσεις σας.
Όταν εργάζεστε με HTTP triggers, αυτά είναι εξ ορισμού ασφαλισμένα με ένα κλειδί εφαρμογής functions. Για να αποκτήσετε αυτό το κλειδί, εκτελέστε την παρακάτω εντολή:
```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 και το `<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 τοπικά και αποκτήστε πρόσβαση χρησιμοποιώντας τη διεύθυνση 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, ακολουθήστε τον [οδηγό εύρεσης διεύθυνσης IP σε Mac](https://www.hellotech.com/guide/for/how-to-find-ip-address-on-mac)
* Στο Linux, ακολουθήστε την ενότητα για την εύρεση της ιδιωτικής διεύθυνσης IP στον [οδηγό εύρεσης διεύθυνσης IP στο Linux](https://opensource.com/article/18/5/how-find-ip-address-linux)
Μόλις βρείτε τη διεύθυνση IP σας, θα μπορείτε να αποκτήσετε πρόσβαση στη συνάρτηση στη διεύθυνση `http://`.
:7071/api/text-to-timer`, όπου `<IP_ADDRESS>` θα είναι η διεύθυνση IP σας, για παράδειγμα `http://192.168.1.10:7071/api/text-to-timer`.
> 💁 Σημειώστε ότι χρησιμοποιείται η θύρα 7071, οπότε μετά τη διεύθυνση IP θα πρέπει να προσθέσετε `:7071`.
> 💁 Αυτό θα λειτουργήσει μόνο αν η συσκευή IoT σας βρίσκεται στο ίδιο δίκτυο με τον υπολογιστή σας.
1. Δοκιμάστε το endpoint αποκτώντας πρόσβαση σε αυτό χρησιμοποιώντας το curl.
---
## 🚀 Πρόκληση
Υπάρχουν πολλοί τρόποι να ζητήσετε το ίδιο πράγμα, όπως να ρυθμίσετε έναν χρονοδιακόπτη. Σκεφτείτε διαφορετικούς τρόπους για να το κάνετε αυτό και χρησιμοποιήστε τους ως παραδείγματα στην εφαρμογή LUIS σας. Δοκιμάστε τους, για να δείτε πόσο καλά μπορεί το μοντέλο σας να ανταποκριθεί σε πολλαπλούς τρόπους αιτήματος ενός χρονοδιακόπτη.
## Κουίζ μετά το μάθημα
[Κουίζ μετά το μάθημα](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/44)
## Ανασκόπηση & Αυτομελέτη
* Διαβάστε περισσότερα για το LUIS και τις δυνατότητές του στη [σελίδα τεκμηρίωσης του Language Understanding (LUIS) στα Microsoft docs](https://docs.microsoft.com/azure/cognitive-services/luis/?WT.mc_id=academic-17441-jabenn)
* Διαβάστε περισσότερα για την κατανόηση γλώσσας στη [σελίδα κατανόησης φυσικής γλώσσας στη Wikipedia](https://wikipedia.org/wiki/Natural-language_understanding)
* Διαβάστε περισσότερα για τα HTTP triggers στη [σελίδα τεκμηρίωσης του 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)
## Εργασία
[Ακύρωση του χρονοδιακόπτη](assignment.md)
---
**Αποποίηση ευθύνης**:
Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.