48 KiB
Κατανόηση γλώσσας
Σκίτσο από τη Nitya Narasimhan. Κάντε κλικ στην εικόνα για μεγαλύτερη έκδοση.
Ερωτηματολόγιο πριν το μάθημα
Εισαγωγή
Στο προηγούμενο μάθημα μετατρέψατε ομιλία σε κείμενο. Για να χρησιμοποιηθεί αυτό για τον προγραμματισμό ενός έξυπνου χρονοδιακόπτη, ο κώδικάς σας θα πρέπει να κατανοεί τι ειπώθηκε. Θα μπορούσατε να υποθέσετε ότι ο χρήστης θα πει μια σταθερή φράση, όπως "Ρύθμισε έναν χρονοδιακόπτη 3 λεπτών", και να αναλύσετε αυτήν την έκφραση για να προσδιορίσετε τη διάρκεια του χρονοδιακόπτη. Ωστόσο, αυτό δεν είναι πολύ φιλικό προς τον χρήστη. Αν ένας χρήστης έλεγε "Ρύθμισε έναν χρονοδιακόπτη για 3 λεπτά", εσείς ή εγώ θα καταλαβαίναμε τι εννοεί, αλλά ο κώδικάς σας όχι, καθώς θα περίμενε μια σταθερή φράση.
Εδώ έρχεται η κατανόηση γλώσσας, χρησιμοποιώντας μοντέλα τεχνητής νοημοσύνης για την ερμηνεία κειμένου και την επιστροφή των απαραίτητων λεπτομερειών. Για παράδειγμα, το μοντέλο μπορεί να κατανοήσει τόσο τη φράση "Ρύθμισε έναν χρονοδιακόπτη 3 λεπτών" όσο και τη φράση "Ρύθμισε έναν χρονοδιακόπτη για 3 λεπτά" και να καταλάβει ότι απαιτείται ένας χρονοδιακόπτης διάρκειας 3 λεπτών.
Σε αυτό το μάθημα θα μάθετε για τα μοντέλα κατανόησης γλώσσας, πώς να τα δημιουργείτε, να τα εκπαιδεύετε και να τα χρησιμοποιείτε στον κώδικά σας.
Σε αυτό το μάθημα θα καλύψουμε:
- Κατανόηση γλώσσας
- Δημιουργία μοντέλου κατανόησης γλώσσας
- Προθέσεις και οντότητες
- Χρήση του μοντέλου κατανόησης γλώσσας
Κατανόηση γλώσσας
Οι άνθρωποι χρησιμοποιούν τη γλώσσα για να επικοινωνούν εδώ και εκατοντάδες χιλιάδες χρόνια. Επικοινωνούμε με λέξεις, ήχους ή ενέργειες και κατανοούμε τι λέγεται, τόσο τη σημασία των λέξεων, των ήχων ή των ενεργειών, όσο και το πλαίσιο τους. Κατανοούμε την ειλικρίνεια και τον σαρκασμό, επιτρέποντας στις ίδιες λέξεις να σημαίνουν διαφορετικά πράγματα ανάλογα με τον τόνο της φωνής μας.
✅ Σκεφτείτε κάποιες από τις συνομιλίες που είχατε πρόσφατα. Πόσο δύσκολο θα ήταν για έναν υπολογιστή να κατανοήσει τη συνομιλία επειδή χρειάζεται πλαίσιο;
Η κατανόηση γλώσσας, που ονομάζεται επίσης κατανόηση φυσικής γλώσσας, είναι μέρος ενός τομέα της τεχνητής νοημοσύνης που ονομάζεται επεξεργασία φυσικής γλώσσας (ή NLP) και ασχολείται με την κατανόηση κειμένου, προσπαθώντας να κατανοήσει τις λεπτομέρειες λέξεων ή προτάσεων. Αν χρησιμοποιείτε έναν φωνητικό βοηθό όπως η Alexa ή η Siri, τότε έχετε χρησιμοποιήσει υπηρεσίες κατανόησης γλώσσας. Αυτές είναι οι υπηρεσίες τεχνητής νοημοσύνης που μετατρέπουν το "Alexa, παίξε το τελευταίο άλμπουμ της Taylor Swift" στο να χορεύει η κόρη μου στο σαλόνι με τα αγαπημένα της τραγούδια.
💁 Οι υπολογιστές, παρά τις προόδους τους, έχουν ακόμα πολύ δρόμο να διανύσουν για να κατανοήσουν πραγματικά το κείμενο. Όταν αναφερόμαστε στην κατανόηση γλώσσας από υπολογιστές, δεν εννοούμε κάτι τόσο προχωρημένο όσο η ανθρώπινη επικοινωνία. Αντίθετα, εννοούμε την εξαγωγή βασικών λεπτομερειών από κάποιες λέξεις.
Ως άνθρωποι, κατανοούμε τη γλώσσα χωρίς να το σκεφτόμαστε ιδιαίτερα. Αν ζητούσα από έναν άλλο άνθρωπο να "παίξει το τελευταίο άλμπουμ της Taylor Swift", θα καταλάβαινε αμέσως τι εννοώ. Για έναν υπολογιστή, αυτό είναι πιο δύσκολο. Θα έπρεπε να πάρει τις λέξεις, να τις μετατρέψει από ομιλία σε κείμενο και να επεξεργαστεί τις εξής πληροφορίες:
- Πρέπει να παίξει μουσική
- Η μουσική είναι από την καλλιτέχνιδα Taylor Swift
- Η συγκεκριμένη μουσική είναι ένα ολόκληρο άλμπουμ με πολλαπλά κομμάτια στη σειρά
- Η Taylor Swift έχει πολλά άλμπουμ, οπότε πρέπει να ταξινομηθούν χρονολογικά και να επιλεγεί το πιο πρόσφατο
✅ Σκεφτείτε κάποιες άλλες προτάσεις που έχετε πει όταν κάνετε αιτήματα, όπως να παραγγείλετε καφέ ή να ζητήσετε από ένα μέλος της οικογένειας να σας δώσει κάτι. Προσπαθήστε να τις αναλύσετε στις πληροφορίες που θα έπρεπε να εξάγει ένας υπολογιστής για να κατανοήσει την πρόταση.
Τα μοντέλα κατανόησης γλώσσας είναι μοντέλα τεχνητής νοημοσύνης που εκπαιδεύονται για να εξάγουν συγκεκριμένες λεπτομέρειες από τη γλώσσα και στη συνέχεια εκπαιδεύονται για συγκεκριμένες εργασίες χρησιμοποιώντας μεταφορά μάθησης, με τον ίδιο τρόπο που εκπαιδεύσατε ένα μοντέλο Custom Vision χρησιμοποιώντας ένα μικρό σύνολο εικόνων. Μπορείτε να πάρετε ένα μοντέλο και να το εκπαιδεύσετε χρησιμοποιώντας το κείμενο που θέλετε να κατανοήσει.
Δημιουργία μοντέλου κατανόησης γλώσσας
Μπορείτε να δημιουργήσετε μοντέλα κατανόησης γλώσσας χρησιμοποιώντας το LUIS, μια υπηρεσία κατανόησης γλώσσας της Microsoft που αποτελεί μέρος των Cognitive Services.
Εργασία - δημιουργία πόρου συγγραφής
Για να χρησιμοποιήσετε το LUIS, πρέπει να δημιουργήσετε έναν πόρο συγγραφής.
-
Χρησιμοποιήστε την παρακάτω εντολή για να δημιουργήσετε έναν πόρο συγγραφής στην ομάδα πόρων
smart-timer
:az cognitiveservices account create --name smart-timer-luis-authoring \ --resource-group smart-timer \ --kind LUIS.Authoring \ --sku F0 \ --yes \ --location <location>
Αντικαταστήστε το
<location>
με την τοποθεσία που χρησιμοποιήσατε κατά τη δημιουργία της ομάδας πόρων.⚠️ Το LUIS δεν είναι διαθέσιμο σε όλες τις περιοχές, οπότε αν λάβετε το παρακάτω σφάλμα:
InvalidApiSetId: The account type 'LUIS.Authoring' is either invalid or unavailable in given region.
επιλέξτε διαφορετική περιοχή.
Αυτό θα δημιουργήσει έναν πόρο συγγραφής LUIS δωρεάν επιπέδου.
Εργασία - δημιουργία εφαρμογής κατανόησης γλώσσας
-
Ανοίξτε την πύλη LUIS στο luis.ai στον περιηγητή σας και συνδεθείτε με τον ίδιο λογαριασμό που χρησιμοποιείτε για το Azure.
-
Ακολουθήστε τις οδηγίες στο παράθυρο διαλόγου για να επιλέξετε τη συνδρομή Azure σας και στη συνέχεια επιλέξτε τον πόρο
smart-timer-luis-authoring
που μόλις δημιουργήσατε. -
Από τη λίστα Conversation apps, επιλέξτε το κουμπί New app για να δημιουργήσετε μια νέα εφαρμογή. Ονομάστε τη νέα εφαρμογή
smart-timer
και ορίστε την Culture στη γλώσσα σας.💁 Υπάρχει ένα πεδίο για έναν πόρο πρόβλεψης. Μπορείτε να δημιουργήσετε έναν δεύτερο πόρο μόνο για πρόβλεψη, αλλά ο δωρεάν πόρος συγγραφής επιτρέπει 1.000 προβλέψεις το μήνα, που θα πρέπει να είναι αρκετές για ανάπτυξη, οπότε μπορείτε να το αφήσετε κενό.
-
Διαβάστε τον οδηγό που εμφανίζεται μόλις δημιουργήσετε την εφαρμογή για να κατανοήσετε τα βήματα που πρέπει να ακολουθήσετε για να εκπαιδεύσετε το μοντέλο κατανόησης γλώσσας. Κλείστε τον οδηγό όταν τελειώσετε.
Προθέσεις και οντότητες
Η κατανόηση γλώσσας βασίζεται στις προθέσεις και τις οντότητες. Οι προθέσεις είναι το τι θέλει να κάνει ο χρήστης, για παράδειγμα να παίξει μουσική, να ρυθμίσει έναν χρονοδιακόπτη ή να παραγγείλει φαγητό. Οι οντότητες είναι το αντικείμενο στο οποίο αναφέρεται η πρόθεση, όπως το άλμπουμ, η διάρκεια του χρονοδιακόπτη ή το είδος του φαγητού. Κάθε πρόταση που ερμηνεύει το μοντέλο θα πρέπει να έχει τουλάχιστον μία πρόθεση και προαιρετικά μία ή περισσότερες οντότητες.
Μερικά παραδείγματα:
Πρόταση | Πρόθεση | Οντότητες |
---|---|---|
"Παίξε το τελευταίο άλμπουμ της Taylor Swift" | παίξε μουσική | το τελευταίο άλμπουμ της Taylor Swift |
"Ρύθμισε έναν χρονοδιακόπτη 3 λεπτών" | ρύθμισε χρονοδιακόπτη | 3 λεπτά |
"Ακύρωσε τον χρονοδιακόπτη μου" | ακύρωσε χρονοδιακόπτη | Καμία |
"Παράγγειλε 3 μεγάλες πίτσες με ανανά και μια σαλάτα καίσαρα" | παράγγειλε φαγητό | 3 μεγάλες πίτσες με ανανά, σαλάτα καίσαρα |
✅ Με τις προτάσεις που σκεφτήκατε νωρίτερα, ποια θα ήταν η πρόθεση και ποιες οι οντότητες σε αυτές τις προτάσεις;
Για να εκπαιδεύσετε το LUIS, πρώτα ορίζετε τις οντότητες. Αυτές μπορεί να είναι μια σταθερή λίστα όρων ή να μαθαίνονται από το κείμενο. Για παράδειγμα, μπορείτε να παρέχετε μια σταθερή λίστα φαγητών από το μενού σας, με παραλλαγές (ή συνώνυμα) για κάθε λέξη, όπως μελιτζάνα και aubergine ως παραλλαγές της μελιτζάνας. Το LUIS διαθέτει επίσης προεγκατεστημένες οντότητες που μπορούν να χρησιμοποιηθούν, όπως αριθμοί και τοποθεσίες.
Για τη ρύθμιση ενός χρονοδιακόπτη, μπορείτε να έχετε μία οντότητα που χρησιμοποιεί την προεγκατεστημένη οντότητα αριθμών για τον χρόνο και μία άλλη για τις μονάδες, όπως λεπτά και δευτερόλεπτα. Κάθε μονάδα θα έχει πολλαπλές παραλλαγές για να καλύψει τις ενικό και πληθυντικό μορφές - όπως λεπτό και λεπτά.
Αφού ορίσετε τις οντότητες, δημιουργείτε προθέσεις. Αυτές μαθαίνονται από το μοντέλο βάσει παραδειγμάτων προτάσεων που παρέχετε (γνωστές ως εκφωνήσεις). Για παράδειγμα, για την πρόθεση ρύθμισε χρονοδιακόπτη, μπορείτε να παρέχετε τις εξής προτάσεις:
ρύθμισε έναν χρονοδιακόπτη 1 δευτερολέπτου
ρύθμισε έναν χρονοδιακόπτη για 1 λεπτό και 12 δευτερόλεπτα
ρύθμισε έναν χρονοδιακόπτη για 3 λεπτά
ρύθμισε έναν χρονοδιακόπτη 9 λεπτών και 30 δευτερολέπτων
Στη συνέχεια, λέτε στο LUIS ποια μέρη αυτών των προτάσεων αντιστοιχούν στις οντότητες:
Η πρόταση ρύθμισε έναν χρονοδιακόπτη για 1 λεπτό και 12 δευτερόλεπτα
έχει την πρόθεση ρύθμισε χρονοδιακόπτη
. Έχει επίσης 2 οντότητες με 2 τιμές η καθεμία:
χρόνος | μονάδα | |
---|---|---|
1 λεπτό | 1 | λεπτό |
12 δευτερόλεπτα | 12 | δευτερόλεπτο |
Για να εκπαιδεύσετε ένα καλό μοντέλο, χρειάζεστε μια ποικιλία διαφορετικών παραδειγμάτων προτάσεων για να καλύψετε τους πολλούς διαφορετικούς τρόπους με τους οποίους κάποιος μπορεί να ζητήσει το ίδιο πράγμα.
💁 Όπως με οποιοδήποτε μοντέλο τεχνητής νοημοσύνης, όσο περισσότερα και πιο ακριβή δεδομένα χρησιμοποιείτε για την εκπαίδευση, τόσο καλύτερο θα είναι το μοντέλο.
✅ Σκεφτείτε τους διαφορετικούς τρόπους με τους οποίους μπορεί να ζητήσετε το ίδιο πράγμα και να περιμένετε από έναν άνθρωπο να το καταλάβει.
Εργασία - προσθήκη οντοτήτων στα μοντέλα κατανόησης γλώσσας
Για τον χρονοδιακόπτη, χρειάζεστε 2 οντότητες - μία για τη μονάδα χρόνου (λεπτά ή δευτερόλεπτα) και μία για τον αριθμό των λεπτών ή δευτερολέπτων.
Μπορείτε να βρείτε οδηγίες για τη χρήση της πύλης LUIS στην τεκμηρίωση Quickstart: Build your app in LUIS portal στο Microsoft Docs.
-
Από την πύλη LUIS, επιλέξτε την καρτέλα Entities και προσθέστε την προεγκατεστημένη οντότητα number επιλέγοντας το κουμπί Add prebuilt entity και στη συνέχεια επιλέγοντας number από τη λίστα.
-
Δημιουργήστε μια νέα οντότητα για τη μονάδα χρόνου χρησιμοποιώντας το κουμπί Create. Ονομάστε την οντότητα
time unit
και ορίστε τον τύπο σε List. Προσθέστε τιμές γιαλεπτό
καιδευτερόλεπτο
στη λίστα Normalized values, προσθέτοντας τις ενικό και πληθυντικό μορφές στη λίστα synonyms. Πατήστεreturn
μετά την προσθήκη κάθε συνωνύμου για να το προσθέσετε στη λίστα.Κανονικοποιημένη τιμή Συνώνυμα λεπτό λεπτό, λεπτά δευτερόλεπτο δευτερόλεπτο, δευτερόλεπτα
Εργασία - προσθήκη προθέσεων στα μοντέλα κατανόησης γλώσσας
-
Από την καρτέλα Intents, επιλέξτε το κουμπί Create για να δημιουργήσετε μια νέα πρόθεση. Ονομάστε αυτήν την πρόθεση
set timer
. -
Στα παραδείγματα, εισάγετε διαφορετικούς τρόπους για να ρυθμίσετε έναν χρονοδιακόπτη χρησιμοποιώντας λεπτά, δευτερόλεπτα και συνδυασμούς λεπτών και δευτερολέπτων. Παραδείγματα μπορεί να είναι:
ρύθμισε έναν χρονοδιακόπτη 1 δευτερολέπτου
ρύθμισε έναν χρονοδιακόπτη 4 λεπτών
ρύθμισε έναν χρονοδιακόπτη τεσσάρων λεπτών και έξι δευτερολέπτων
- `ρύθμισε έναν χρονοδιακόπτη 9 λεπτών
-
Από την ενότητα Azure Resources, επιλέξτε Authoring Resource και αντιγράψτε το Primary Key και το Endpoint URL.
-
Εκτελέστε την παρακάτω εντολή curl στο command prompt ή το terminal σας:
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>
με την πρόταση που θέλετε να δοκιμάσετε. -
Η έξοδος αυτής της κλήσης θα είναι ένα έγγραφο JSON που περιγράφει το ερώτημα, την κορυφαία πρόθεση (top intent) και μια λίστα οντοτήτων (entities) ταξινομημένων ανά τύπο.
{ "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
-
Δημιουργήστε μια εφαρμογή Azure Functions με όνομα
smart-timer-trigger
και ανοίξτε την στο VS Code. -
Προσθέστε ένα HTTP trigger σε αυτή την εφαρμογή με όνομα
speech-trigger
χρησιμοποιώντας την παρακάτω εντολή μέσα από το terminal του VS Code:func new --name text-to-timer --template "HTTP trigger"
Αυτό θα δημιουργήσει ένα HTTP trigger με όνομα
text-to-timer
. -
Δοκιμάστε το HTTP trigger εκτελώντας την εφαρμογή functions. Όταν εκτελεστεί, θα δείτε το endpoint να εμφανίζεται στην έξοδο:
Functions: text-to-timer: [GET,POST] http://localhost:7071/api/text-to-timer
Δοκιμάστε το φορτώνοντας το URL http://localhost:7071/api/text-to-timer στον browser σας.
This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.
Εργασία - χρήση του μοντέλου κατανόησης γλώσσας
-
Το SDK για το LUIS είναι διαθέσιμο μέσω ενός πακέτου Pip. Προσθέστε την παρακάτω γραμμή στο αρχείο
requirements.txt
για να προσθέσετε την εξάρτηση από αυτό το πακέτο:azure-cognitiveservices-language-luis
-
Βεβαιωθείτε ότι το terminal του VS Code έχει ενεργοποιημένο το virtual environment και εκτελέστε την παρακάτω εντολή για να εγκαταστήσετε τα πακέτα Pip:
pip install -r requirements.txt
💁 Αν λάβετε σφάλματα, ίσως χρειαστεί να αναβαθμίσετε το pip με την παρακάτω εντολή:
pip install --upgrade pip
-
Προσθέστε νέες καταχωρήσεις στο αρχείο
local.settings.json
για το LUIS API Key, το Endpoint URL και το App ID από την καρτέλα MANAGE του LUIS portal:"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. -
Προσθέστε τις παρακάτω εισαγωγές στο αρχείο
__init__.py
:import json import os from azure.cognitiveservices.language.luis.runtime import LUISRuntimeClient from msrest.authentication import CognitiveServicesCredentials
Αυτό εισάγει κάποιες βιβλιοθήκες συστήματος, καθώς και τις βιβλιοθήκες για την αλληλεπίδραση με το LUIS.
-
Διαγράψτε τα περιεχόμενα της μεθόδου
main
και προσθέστε τον παρακάτω κώδικα: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. -
Το HTTP trigger θα καλείται περνώντας το κείμενο που πρέπει να κατανοηθεί ως JSON, με το κείμενο σε μια ιδιότητα που ονομάζεται
text
. Ο παρακάτω κώδικας εξάγει την τιμή από το σώμα του HTTP αιτήματος και την καταγράφει στην κονσόλα. Προσθέστε αυτόν τον κώδικα στη συνάρτησηmain
:req_body = req.get_json() text = req_body['text'] logging.info(f'Request - {text}')
-
Οι προβλέψεις ζητούνται από το LUIS στέλνοντας ένα αίτημα πρόβλεψης - ένα έγγραφο JSON που περιέχει το κείμενο για πρόβλεψη. Δημιουργήστε το με τον παρακάτω κώδικα:
prediction_request = { 'query' : text }
-
Αυτό το αίτημα μπορεί στη συνέχεια να σταλεί στο LUIS, χρησιμοποιώντας το staging slot στο οποίο δημοσιεύτηκε η εφαρμογή σας:
prediction_response = client.prediction.get_slot_prediction(app_id, 'Staging', prediction_request)
-
Η απάντηση της πρόβλεψης περιέχει την κορυφαία πρόθεση - την πρόθεση με τη μεγαλύτερη βαθμολογία πρόβλεψης, μαζί με τις οντότητες. Αν η κορυφαία πρόθεση είναι
set timer
, τότε οι οντότητες μπορούν να διαβαστούν για να ληφθεί ο χρόνος που απαιτείται για τον χρονοδιακόπτη: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." είναι:
{ "number": [4, 17], "time unit": [ ["minute"], ["second"] ] }
Αυτός ο κώδικας ορίζει επίσης έναν μετρητή για τον συνολικό χρόνο του χρονοδιακόπτη σε δευτερόλεπτα. Αυτός θα συμπληρωθεί από τις τιμές των οντοτήτων.
-
Οι οντότητες δεν είναι συνδεδεμένες, αλλά μπορούμε να κάνουμε κάποιες υποθέσεις γι' αυτές. Θα βρίσκονται στη σειρά που ειπώθηκαν, οπότε η θέση στον πίνακα μπορεί να χρησιμοποιηθεί για να καθοριστεί ποιος αριθμός αντιστοιχεί σε ποια μονάδα χρόνου. Για παράδειγμα:
- "Set a 30 second timer" - αυτό θα έχει έναν αριθμό,
30
, και μία μονάδα χρόνου,second
, οπότε ο μοναδικός αριθμός θα αντιστοιχεί στη μοναδική μονάδα χρόνου. - "Set a 2 minute and 30 second timer" - αυτό θα έχει δύο αριθμούς,
2
και30
, και δύο μονάδες χρόνου,minute
καιsecond
, οπότε ο πρώτος αριθμός θα είναι για την πρώτη μονάδα χρόνου (2 λεπτά) και ο δεύτερος αριθμός για τη δεύτερη μονάδα χρόνου (30 δευτερόλεπτα).
Ο παρακάτω κώδικας λαμβάνει τον αριθμό των στοιχείων στις οντότητες
number
και χρησιμοποιεί αυτόν τον αριθμό για να εξάγει το πρώτο στοιχείο από κάθε πίνακα, στη συνέχεια το δεύτερο κ.ο.κ. Προσθέστε αυτό μέσα στο μπλοκif
.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 - "Set a 30 second timer" - αυτό θα έχει έναν αριθμό,
-
Μέσα σε αυτόν τον βρόχο, χρησιμοποιήστε τον αριθμό και τη μονάδα χρόνου για να υπολογίσετε τον συνολικό χρόνο για τον χρονοδιακόπτη, προσθέτοντας 60 δευτερόλεπτα για κάθε λεπτό και τον αριθμό των δευτερολέπτων για οποιαδήποτε δευτερόλεπτα.
if time_unit == 'minute': total_seconds += number * 60 else: total_seconds += number
-
Έξω από αυτόν τον βρόχο μέσω των οντοτήτων, καταγράψτε τον συνολικό χρόνο για τον χρονοδιακόπτη:
logging.info(f'Timer required for {total_seconds} seconds')
-
Ο αριθμός των δευτερολέπτων πρέπει να επιστραφεί από τη συνάρτηση ως HTTP απάντηση. Στο τέλος του μπλοκ
if
, προσθέστε τα εξής:payload = { 'seconds': total_seconds } return func.HttpResponse(json.dumps(payload), status_code=200)
Αυτός ο κώδικας δημιουργεί ένα payload που περιέχει τον συνολικό αριθμό δευτερολέπτων για τον χρονοδιακόπτη, το μετατρέπει σε JSON string και το επιστρέφει ως HTTP αποτέλεσμα με κωδικό κατάστασης 200, που σημαίνει ότι η κλήση ήταν επιτυχής.
-
Τέλος, έξω από το μπλοκ
if
, χειριστείτε την περίπτωση που η πρόθεση δεν αναγνωρίστηκε επιστρέφοντας έναν κωδικό σφάλματος:return func.HttpResponse(status_code=404)
Ο κωδικός 404 σημαίνει not found.
-
Εκτελέστε την εφαρμογή functions και δοκιμάστε την χρησιμοποιώντας το curl.
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:
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 θα επιστρέψει τα εξής:
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.
Εργασία - κάντε τη συνάρτησή σας διαθέσιμη στη συσκευή IoT σας
-
Για να καλέσει η συσκευή 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. Για να αποκτήσετε αυτό το κλειδί, εκτελέστε την παρακάτω εντολή:
az functionapp keys list --resource-group smart-timer \ --name <APP_NAME>
Αντιγράψτε την τιμή της καταχώρησης
default
από την ενότηταfunctionKeys
.{ "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. -
Εκτελέστε την εφαρμογή functions τοπικά και αποκτήστε πρόσβαση χρησιμοποιώντας τη διεύθυνση IP - μπορείτε να βρείτε τη διεύθυνση IP του υπολογιστή σας στο τοπικό δίκτυο και να τη χρησιμοποιήσετε για να δημιουργήσετε το URL.
Βρείτε τη διεύθυνση IP σας:
- Στα Windows 10, ακολουθήστε τον οδηγό εύρεσης διεύθυνσης IP
- Στο macOS, ακολουθήστε τον οδηγό εύρεσης διεύθυνσης IP σε Mac
- Στο Linux, ακολουθήστε την ενότητα για την εύρεση της ιδιωτικής διεύθυνσης IP στον οδηγό εύρεσης διεύθυνσης IP στο 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 σας βρίσκεται στο ίδιο δίκτυο με τον υπολογιστή σας.
- Δοκιμάστε το endpoint αποκτώντας πρόσβαση σε αυτό χρησιμοποιώντας το curl.
🚀 Πρόκληση
Υπάρχουν πολλοί τρόποι να ζητήσετε το ίδιο πράγμα, όπως να ρυθμίσετε έναν χρονοδιακόπτη. Σκεφτείτε διαφορετικούς τρόπους για να το κάνετε αυτό και χρησιμοποιήστε τους ως παραδείγματα στην εφαρμογή LUIS σας. Δοκιμάστε τους, για να δείτε πόσο καλά μπορεί το μοντέλο σας να ανταποκριθεί σε πολλαπλούς τρόπους αιτήματος ενός χρονοδιακόπτη.
Κουίζ μετά το μάθημα
Ανασκόπηση & Αυτομελέτη
- Διαβάστε περισσότερα για το LUIS και τις δυνατότητές του στη σελίδα τεκμηρίωσης του Language Understanding (LUIS) στα Microsoft docs
- Διαβάστε περισσότερα για την κατανόηση γλώσσας στη σελίδα κατανόησης φυσικής γλώσσας στη Wikipedia
- Διαβάστε περισσότερα για τα HTTP triggers στη σελίδα τεκμηρίωσης του Azure Functions HTTP trigger στα Microsoft docs
Εργασία
Αποποίηση ευθύνης:
Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης Co-op Translator. Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.