Δημιουργία κρατικής ικανότητας για την Alice χρησιμοποιώντας λειτουργίες χωρίς διακομιστή του Yandex.Cloud και της Python

Ας ξεκινήσουμε με τα νέα. Χθες το Yandex.Cloud ανακοίνωσε την κυκλοφορία μιας υπηρεσίας υπολογιστών χωρίς διακομιστή Λειτουργίες Yandex Cloud. Αυτό σημαίνει: γράφετε μόνο τον κώδικα για την υπηρεσία σας (για παράδειγμα, μια εφαρμογή Ιστού ή ένα chatbot) και το ίδιο το Cloud δημιουργεί και διατηρεί τις εικονικές μηχανές όπου εκτελούνται, ακόμη και τις αναπαράγει εάν το φορτίο αυξάνεται. Δεν χρειάζεται να σκέφτεστε καθόλου, είναι πολύ βολικό. Και η πληρωμή είναι μόνο για τον χρόνο υπολογισμού.

Ωστόσο, κάποιοι μπορεί να μην πληρώσουν καθόλου. Αυτοί είναι οι προγραμματιστές Οι εξωτερικές δεξιότητες της Αλίκης, δηλαδή ενσωματωμένα chatbots. Οποιοσδήποτε προγραμματιστής μπορεί να γράψει, να φιλοξενήσει και να καταχωρήσει μια τέτοια ικανότητα και από σήμερα οι δεξιότητες δεν χρειάζεται καν να φιλοξενηθούν - απλώς ανεβάστε τον κώδικά τους στο cloud στη φόρμα την ίδια λειτουργία χωρίς διακομιστή.

Αλλά υπάρχουν μερικές αποχρώσεις. Πρώτον, ο κωδικός pit σας μπορεί να απαιτεί ορισμένες εξαρτήσεις και η μεταφορά τους στο Cloud δεν είναι ασήμαντη. Δεύτερον, κάθε κανονικό chatbot πρέπει να αποθηκεύει την κατάσταση του διαλόγου κάπου (κατά συνέπεια). Ποιος είναι ο ευκολότερος τρόπος για να το κάνετε αυτό σε μια λειτουργία χωρίς διακομιστή; Τρίτον, πώς μπορείτε να γράψετε μια γρήγορη και βρώμικη δεξιότητα για την Alice ή ακόμα και κάποιο είδος bot με μη μηδενική πλοκή; Το άρθρο είναι, στην πραγματικότητα, για αυτές τις αποχρώσεις.

Δημιουργία κρατικής ικανότητας για την Alice χρησιμοποιώντας λειτουργίες χωρίς διακομιστή του Yandex.Cloud και της Python

Ηθική προετοιμασία

Για τους ανυπόμονους: Συλλέγω τις απαραίτητες εξαρτήσεις με ένα makefile πριν ανεβάσω τη συνάρτηση στο cloud, αποθηκεύω την κατάσταση του διαλόγου στο Yandex Object Storage (υποστηρίζει το S3 API) και χρησιμοποιώ τη δική μου βιβλιοθήκη για τη διαχείριση του διαλόγου tgalice. Στο τέλος αποδεικνύεται τέτοιος δεξιότητα επίδειξης. Τώρα ας τα δούμε όλα αυτά λίγο πιο αναλυτικά.

Για όσους είναι λίγο λιγότερο ανυπόμονοι, πριν βουτήξουν στην ιστορία μου για την πολυπλοκότητα, συνιστώ ανεπιφύλακτα να ξεκινήσουν με κάτι απλό. Δηλαδή, δημιουργήστε μια συνάρτηση echobot ενός αρχείου, εγγραφείτε και δοκιμάστε την στην κονσόλα προγραμματιστή του Dialogs. λεπτομέρειες - μέσα Ιστολόγιο διαλόγων и Τεκμηρίωση cloud. Και μόνο τότε ξεκινήστε.

Αν θέλεις να νιώσεις αμέσως για τι παλεύουμε εδώ, ρώτησε την Αλίκη.ενεργοποιήστε την ικανότητα «ωροσκόπιο πληροφορικής».'. Θα πρέπει να εμφανιστεί ένας διάλογος παρόμοιος με τον ακόλουθο:

Αλίκη: Γεια σου! Είστε στην ικανότητα του «Ωροσκόπιου Πληροφορικής». Πείτε «Έναρξη» για να μάθετε τι σας υπόσχονται τα αστέρια.
Χρήστης: Έναρξη
Α: Παρακαλώ δηλώστε το όνομά σας
Yu: Vasisualiy
Α: Πες μου τώρα το έτος γέννησής σου. Μόνο τέσσερα ψηφία, τίποτα επιπλέον.
Yu: δεύτερο
Α: Δοκιμάστε ξανά. Εισαγάγετε το έτος γέννησής σας - τέσσερα ψηφία.
Yu: 2002
Α: Τέλεια! Τώρα ονομάστε τον μήνα γέννησής σας.
Yu: Φεβρουάριος
Α: Τέλεια! Τέλος, πείτε μου την ημερομηνία γέννησής σας - μόνο έναν αριθμό, μόνο ένα ή δύο ψηφία.
Yu: 18
Α: Ευχαριστώ, Vasisualiy! Τώρα ξέρουμε: είσαι 17 χρονών και Υδροχόος. Λοιπόν, φυσικά, είστε τυχεροί! Τα αστέρια σου λένε: а что говорят звёзды, вы узнаете, запустив навык.

Το πρόβλημα είναι ότι για να διατηρήσετε ακόμη και έναν τόσο απλό διάλογο, πρέπει να θυμάστε το όνομα και την ημερομηνία γέννησης του χρήστη, και σε περιβάλλον λειτουργίας χωρίς διακομιστή αυτό δεν είναι τετριμμένο. Δεν θα είναι δυνατή η αποθήκευση του περιβάλλοντος στη μνήμη RAM ή ως αρχείο στο δίσκο, επειδή Το Yandex.Cloud μπορεί να εκτελέσει μια λειτουργία σε πολλές εικονικές μηχανές ταυτόχρονα και να εναλλάσσεται μεταξύ τους κατά βούληση. Θα πρέπει να χρησιμοποιήσετε κάποιο είδος εξωτερικού χώρου αποθήκευσης. Το Object Storage επιλέχθηκε ως μια αρκετά φθηνή και απλή αποθήκευση απευθείας στο Yandex.Cloud (δηλαδή, πιθανότατα γρήγορη). Ως δωρεάν εναλλακτική, μπορείτε να δοκιμάσετε, για παράδειγμα, ένα δωρεάν κομμάτι Συννεφιασμένη Μόνγκα κάπου μακριά. Υπάρχουν βολικά περιτυλίγματα Python τόσο για το Object Storage (που υποστηρίζει τη διεπαφή S3) όσο και για το Mongo.

Ένα άλλο πρόβλημα είναι ότι για να αποκτήσετε πρόσβαση στο Object Storage, στο MongoDB και σε οποιαδήποτε άλλη βάση δεδομένων ή χώρο αποθήκευσης δεδομένων, χρειάζεστε ορισμένες εξωτερικές εξαρτήσεις που πρέπει να μεταφορτωθούν στο Yandex Functions μαζί με τον κωδικό λειτουργίας σας. Και θα ήθελα να το κάνω αυτό άνετα. Δυστυχώς, δεν θα είναι εντελώς βολικό (όπως στο Heroku), αλλά μπορεί να δημιουργηθεί κάποια βασική άνεση γράφοντας ένα σενάριο για τη δημιουργία του περιβάλλοντος (make file).

Πώς να ξεκινήσετε μια δεξιότητα ωροσκοπίου

  1. Προετοιμασία: μεταβείτε σε κάποιο μηχάνημα με Linux. Κατ 'αρχήν, μπορείτε πιθανώς να εργαστείτε και με τα Windows, αλλά στη συνέχεια θα πρέπει να κάνετε κάποια μαγικά με την εκκίνηση του makefile. Και σε κάθε περίπτωση, θα χρειαστείτε τουλάχιστον εγκατεστημένη την Python 3.6.
  2. Κλωνοποιήστε το από το Github παράδειγμα ωροσκοπικής ικανότητας.
  3. Εγγραφείτε στο Y.Cloud: https://cloud.yandex.ru
  4. Δημιουργήστε δύο κουβάδες μέσα Αποθήκευση αντικειμένων, καλέστε τους με οποιοδήποτε όνομα {BUCKET NAME} и tgalice-test-cold-storage (αυτό το δεύτερο όνομα είναι πλέον κωδικοποιημένο main.py το παράδειγμά μου). Ο πρώτος κάδος θα χρειαστεί μόνο για την ανάπτυξη, ο δεύτερος - για την αποθήκευση των καταστάσεων διαλόγου.
  5. δημιουργήσετε λογαριασμό υπηρεσίας, δώστε του έναν ρόλο editor, και λάβετε στατικά διαπιστευτήρια για αυτό {KEY ID} и {KEY VALUE} — θα τα χρησιμοποιήσουμε για να καταγράψουμε την κατάσταση του διαλόγου. Όλα αυτά χρειάζονται για να μπορεί μια συνάρτηση από το Ya.Cloud να έχει πρόσβαση στο χώρο αποθήκευσης από το Ya.Cloud. Κάποτε, ελπίζω, η εξουσιοδότηση θα γίνει αυτόματη, αλλά προς το παρόν είναι έτσι.
  6. (Προαιρετικό) εγκατάσταση διεπαφή γραμμής εντολών yc. Μπορείτε επίσης να δημιουργήσετε μια λειτουργία μέσω της διεπαφής ιστού, αλλά το CLI είναι καλό γιατί όλα τα είδη καινοτομιών εμφανίζονται σε αυτό πιο γρήγορα.
  7. Τώρα μπορείτε πραγματικά να προετοιμάσετε τη διάταξη εξάρτησης: εκτελέστε τη στη γραμμή εντολών από το φάκελο με το παράδειγμα δεξιοτήτων make all. Μια δέσμη βιβλιοθηκών (κυρίως, ως συνήθως, περιττές) θα εγκατασταθούν στο φάκελο dist.
  8. Ρίξτε στο Object Storage με το χέρι (στον κάδο {BUCKET NAME}) αρχείο που αποκτήθηκε στο προηγούμενο βήμα dist.zip. Εάν θέλετε, μπορείτε να το κάνετε αυτό από τη γραμμή εντολών, για παράδειγμα, χρησιμοποιώντας AWS CLI.
  9. Δημιουργήστε μια λειτουργία χωρίς διακομιστή μέσω της διεπαφής Ιστού ή χρησιμοποιώντας ένα βοηθητικό πρόγραμμα yc. Για το βοηθητικό πρόγραμμα, η εντολή θα μοιάζει με αυτό:

yc serverless function version create
    --function-name=horoscope
    --environment=AWS_ACCESS_KEY_ID={KEY ID},AWS_SECRET_ACCESS_KEY={KEY VALUE}
    --runtime=python37
    --package-bucket-name={BUCKET NAME}
    --package-object-name=dist.zip
    --entrypoint=main.alice_handler
    --memory=128M
    --execution-timeout=3s

Κατά τη μη αυτόματη δημιουργία μιας συνάρτησης, όλες οι παράμετροι συμπληρώνονται με τον ίδιο τρόπο.

Τώρα η λειτουργία που δημιουργήσατε μπορεί να δοκιμαστεί μέσω της κονσόλας προγραμματιστή και, στη συνέχεια, η ικανότητα μπορεί να βελτιωθεί και να δημοσιευτεί.

Δημιουργία κρατικής ικανότητας για την Alice χρησιμοποιώντας λειτουργίες χωρίς διακομιστή του Yandex.Cloud και της Python

Τι υπάρχει κάτω από την κουκούλα

Το makefile περιέχει στην πραγματικότητα ένα αρκετά απλό σενάριο για την εγκατάσταση εξαρτήσεων και την τοποθέτησή τους σε ένα αρχείο dist.zip, περίπου ως εξής:

mkdir -p dist/
pip3 install -r requirements.txt --target dist/ 
cp main.py dist/main.py
cp form.yaml dist/form.yaml
cd dist && zip --exclude '*.pyc' -r ../dist.zip ./*

Τα υπόλοιπα είναι μερικά απλά εργαλεία τυλιγμένα σε μια βιβλιοθήκη tgalice. Η διαδικασία συμπλήρωσης των δεδομένων χρήστη περιγράφεται από τη διαμόρφωση form.yaml:

form_name: 'horoscope_form'
start:
  regexp: 'старт|нач(ать|ни)'
  suggests:
    - Старт
fields:
  - name: 'name'
    question: Пожалуйста, назовите своё имя.
  - name: 'year'
    question: Теперь скажите мне год вашего рождения. Только четыре цифры, ничего лишнего.
    validate_regexp: '^[0-9]{4}$'
    validate_message: Пожалуйста, попробуйте ещё раз. Назовите год вашего рождения - четыре цифры.
  - name: 'month'
    question: Замечательно! Теперь назовите месяц вашего рождения.
    options:
      - январь
     ...
      - декабрь
    validate_message: То, что вы назвали, не похоже на месяц. Пожалуйста, назовите месяц вашего рождения, без других слов.
  - name: 'day'
    question: Отлично! Наконец, назовите мне дату вашего рождения - только число, всего одна или две цифры.
    validate_regexp: '[0123]?d$'
    validate_message: Пожалуйста, попробуйте ещё раз. Вам нужно назвать число своего рождения (например, двадцатое); это одна или две цифры.

Το έργο της ανάλυσης αυτής της διαμόρφωσης και του υπολογισμού του τελικού αποτελέσματος αναλαμβάνεται από την κλάση Python

class CheckableFormFiller(tgalice.dialog_manager.form_filling.FormFillingDialogManager):
    SIGNS = {
        'январь': 'Козерог',
        ...
    }

    def handle_completed_form(self, form, user_object, ctx):
        response = tgalice.dialog_manager.base.Response(
            text='Спасибо, {}! Теперь мы знаем: вам {} лет, и вы {}. n'
                 'Вот это вам, конечно, повезло! Звёзды говорят вам: {}'.format(
                form['fields']['name'],
                2019 - int(form['fields']['year']),
                self.SIGNS[form['fields']['month']],
                random.choice(FORECASTS),
            ),
            user_object=user_object,
        )
        return response

Πιο συγκεκριμένα, η βασική κατηγορία FormFillingDialogManager ασχολείται με τη συμπλήρωση της «φόρμας» και τη μέθοδο της τάξης του παιδιού handle_completed_form της λέει τι να κάνει όταν είναι έτοιμη.

Εκτός από αυτήν την κύρια ροή διαλόγου, ο χρήστης πρέπει επίσης να χαιρετιστεί, καθώς και να του δοθεί βοήθεια χρησιμοποιώντας την εντολή "help" και να απελευθερωθεί από την ικανότητα χρησιμοποιώντας την εντολή "exit". Για το σκοπό αυτό στο tgalice Υπάρχει επίσης ένα πρότυπο, επομένως ολόκληρος ο διαχειριστής διαλόγου αποτελείται από κομμάτια:

dm = tgalice.dialog_manager.CascadeDialogManager(
    tgalice.dialog_manager.GreetAndHelpDialogManager(
        greeting_message=DEFAULT_MESSAGE,
        help_message=DEFAULT_MESSAGE,
        exit_message='До свидания, приходите в навык "Айтишный гороскоп" ещё!'
    ),
    CheckableFormFiller(`form.yaml`, default_message=DEFAULT_MESSAGE)
)

CascadeDialogManager Λειτουργεί απλά: προσπαθεί να εφαρμόσει όλα τα στοιχεία του στην τρέχουσα κατάσταση του διαλόγου με τη σειρά του και επιλέγει το πρώτο κατάλληλο.

Ο διαχειριστής διαλόγου επιστρέφει ένα αντικείμενο Python ως απάντηση σε κάθε μήνυμα. Response, το οποίο μπορεί στη συνέχεια να μετατραπεί σε απλό κείμενο ή σε μήνυμα στο Alice ή στο Telegram - ανάλογα με το πού εκτελείται το bot. περιέχει επίσης την αλλαγμένη κατάσταση του διαλόγου που πρέπει να αποθηκευτεί. Όλη αυτή η κουζίνα διαχειρίζεται άλλη τάξη, DialogConnector, οπότε το άμεσο σενάριο για την εκκίνηση μιας δεξιότητας στις Λειτουργίες Yandex μοιάζει με αυτό:

...
session = boto3.session.Session()
s3 = session.client(
    service_name='s3',
    endpoint_url='https://storage.yandexcloud.net',
    aws_access_key_id=os.environ['AWS_ACCESS_KEY_ID'],
    aws_secret_access_key=os.environ['AWS_SECRET_ACCESS_KEY'],
    region_name='ru-central1',
)
storage = tgalice.session_storage.S3BasedStorage(s3_client=s3, bucket_name='tgalice-test-cold-storage')
connector = tgalice.dialog_connector.DialogConnector(dialog_manager=dm, storage=storage)
alice_handler = connector.serverless_alice_handler

Όπως μπορείτε να δείτε, το μεγαλύτερο μέρος αυτού του κώδικα δημιουργεί μια σύνδεση με τη διεπαφή S3 του Object Storage. Μπορείτε να διαβάσετε πώς χρησιμοποιείται απευθείας αυτή η σύνδεση σε κώδικα tgalice.
Η τελευταία γραμμή δημιουργεί τη συνάρτηση alice_handler — το ίδιο που είπαμε να τραβήξει το Yandex.Cloud όταν ορίσαμε την παράμετρο --entrypoint=main.alice_handler.

Αυτό είναι όλο, στην πραγματικότητα. Makefiles για assembly, S3-like Object Storage για αποθήκευση περιβάλλοντος και βιβλιοθήκη Python tgalice. Σε συνδυασμό με τις λειτουργίες χωρίς διακομιστή και την εκφραστικότητα της Python, αυτό είναι αρκετό για να αναπτύξει μια υγιή ανθρώπινη ικανότητα.

Μπορείτε να ρωτήσετε γιατί ήταν απαραίτητο να δημιουργήσετε tgalice? Όλος ο βαρετός κώδικας που μεταφέρει JSON από αίτημα σε απάντηση και από αποθήκευση στη μνήμη και πίσω βρίσκεται σε αυτόν. Υπάρχει επίσης μια κανονική εφαρμογή κώδικα, μια λειτουργία για την κατανόηση ότι ο "Φεβρουάριος" είναι παρόμοιος με τον "Φεβρουάριο" και άλλες NLU για τους φτωχούς. Σύμφωνα με την ιδέα μου, αυτό θα πρέπει ήδη να είναι αρκετό για να μπορείτε να σκιαγραφήσετε πρωτότυπα δεξιοτήτων σε αρχεία yaml χωρίς να σας αποσπούν πολύ τεχνικές λεπτομέρειες.

Εάν θέλετε ένα πιο σοβαρό NLU, μπορείτε να το συνδέσετε με τις ικανότητές σας Rasa ή DeepPavlov, αλλά η τοποθέτησή τους θα απαιτήσει επιπλέον χορούς με ντέφι, ειδικά σε διακομιστές. Εάν δεν σας αρέσει καθόλου η κωδικοποίηση, θα πρέπει να χρησιμοποιήσετε έναν οπτικό κατασκευαστή όπως Αιμιλογικός. Όταν δημιουργούσα το tgalice, σκέφτηκα κάποιο είδος ενδιάμεσου μονοπατιού. Ας δούμε τι προκύπτει από αυτό.

Λοιπόν, μπείτε τώρα συνομιλία προγραμματιστών alice skills, ανάγνωση τεκμηρίωση, και δημιουργήστε υπέροχα δεξιότητες!

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο