Alice'i olekuteabe loomine Yandex.Cloudi ja Pythoni serverita funktsioonides

Alustame uudistega. Eile teatas Yandex.Cloud serverita andmetöötlusteenuse käivitamisest Yandexi pilvefunktsioonid. See tähendab: kirjutate ainult oma teenuse koodi (näiteks veebirakenduse või vestlusroboti) ning Cloud ise loob ja hooldab virtuaalmasinaid seal, kus see töötab, ja isegi kordab neid, kui koormus suureneb. Sa ei pea üldse mõtlema, see on väga mugav. Ja makse läheb ainult arvutuste aja eest.

Mõned inimesed ei pruugi aga üldse maksta. Need on arendajad Alice'i välised oskused, st sellesse sisseehitatud vestlusrobotid. Iga arendaja saab selliseid oskusi kirjutada, hostida ja registreerida ning tänasest ei pea oskusi isegi hostima – laadige lihtsalt oma kood vormil pilve sama serverita funktsioon.

Kuid on paar nüanssi. Esiteks võib teie lemmikloomakood vajada mõningaid sõltuvusi ja pole triviaalne neid pilve lohistada. Teiseks peab iga tavaline vestlusrobot dialoogi oleku kuhugi salvestama (seega oleklik); kuidas seda serverita funktsioonis kõige lihtsamal viisil teha? Kolmandaks, kuidas saab kirjutada Alice'ile kiire ja määrdunud oskuse või isegi mingi nullist erineva süžeega roboti? Nende nüansside kohta tegelikult artikkel.

Alice'i olekuteabe loomine Yandex.Cloudi ja Pythoni serverita funktsioonides

moraalne ettevalmistus

Kannatamatutele: kogun enne funktsiooni pilve üleslaadimist makefile'iga kokku vajalikud sõltuvused, salvestan dialoogi oleku Yandex Object Storage'i (see toetab S3 API-d) ja kasutan dialoogi haldamiseks oma teeki tgalice. Selle tulemusena selgub selline demo oskus. Ja nüüd analüüsime seda kõike veidi üksikasjalikumalt.

Pisut vähem kannatamatutel soovitan enne minu keerulisesse lugu sukeldumist alustada lihtsast. Nimelt luua ühe failiga echoboti funktsioon, registreerida ja testida seda Dialogi arendajakonsoolis; üksikasjad - sisse Blogi dialoogid и pilve dokumentatsioon. Ja alles siis alusta.

Kui soovite kohe tunda, mille nimel me võitleme, küsige Alice'ilt.lülitage sisse oskus "IT horoskoop"'. Peaks toimuma järgmine dialoog:

Alice: Tere! Oled "IT horoskoobi" oskuses. Öelge "Start", et teada saada, mida tähed teile lubavad.
Kasutaja: Alusta
V: Palun öelge oma nimi.
Yu: Vasisualy
V: Nüüd ütle mulle oma sünniaasta. Ainult neli numbrit, ei midagi enamat.
Yu: teine
V: Palun proovi uuesti. Märkige oma sünniaasta – neli numbrit.
Yu: 2002
Suur! Nimetage nüüd oma sünnikuu.
Yu: veebruar
Suur! Lõpuks öelge mulle oma sünnikuupäev – ainult number, ainult üks või kaks numbrit.
Yu: 18
V: Aitäh, Vasisual! Nüüd teame: sa oled 17-aastane ja oled Veevalaja. Siin on teil muidugi õnne! Tähed ütlevad sulle а что говорят звёзды, вы узнаете, запустив навык.

Probleem on selles, et isegi nii lihtsa dialoogi säilitamiseks peate meeles pidama kasutaja nime ja sünnikuupäeva ning serverita keskkonnas pole see tühine. Konteksti salvestamine RAM-i või failina kettale ei tööta, kuna Yandex.Cloud saab funktsiooni käivitada korraga mitmes virtuaalmasinas ja suvaliselt nende vahel vahetada. Peate kasutama mingit välist salvestusruumi. Objektide salvestusruum valiti üsna odavaks ja lihtsaks salvestuseks otse Yandex.Cloudis (st tõenäoliselt kiireks). Tasuta alternatiivina võid proovida näiteks tasuta tükki Pilves Mongi kuskil kaugel. Nii Object Storage'il (see toetab S3 liidest) kui ka Mongol on mugavad Pythoni ümbrised.

Teine probleem on see, et objektide salvestusruumi, MongoDB ja mis tahes muu andmebaasi või andmehoidla avamiseks vajate mõnda välist sõltuvust, mille peate koos funktsiooni koodiga Yandexi funktsioonidesse üles laadima. Ja ma tahaksin seda mugavalt teha. See on täiesti mugav (nagu heroku puhul), paraku see ei tööta, kuid saate luua elementaarse mugavuse, kirjutades keskkonna loomiseks skripti (faili loomine).

Kuidas alustada horoskoobi oskust

  1. Olge valmis: minge mõne Linuxiga masina juurde. Põhimõtteliselt saab ilmselt töötada ka Windowsiga, kuid siis tuleb makefile'i käivitamisega võluda. Ja igal juhul on teil vaja vähemalt 3.6 installitud Pythonit.
  2. Kloonige githubist näide horoskoobi oskusest.
  3. Registreeruge Ya.Cloudis: https://cloud.yandex.ru
  4. Looge endale kaks ämbrit Objekti salvestamine, kutsuge neid mis tahes nimega {BUCKET NAME} и tgalice-test-cold-storage (see keskmine nimi on nüüd kõvasti kodeeritud main.py minu näide). Esimest ämbrit on vaja ainult juurutamiseks, teist - dialoogiolekute salvestamiseks.
  5. looma teenuse konto, anna talle roll editorja hankige selle jaoks staatilised mandaadid {KEY ID} и {KEY VALUE} - kasutame neid dialoogi oleku salvestamiseks. Kõik see on vajalik selleks, et Ya.Cloudi funktsioon pääseks Ya.Cloudi salvestusruumi juurde. Kunagi, ma loodan, muutub autoriseerimine automaatseks, aga praegu - nii.
  6. (Valikuline) installige käsurea liides yc. Funktsiooni saab luua ka veebiliidese kaudu, kuid CLI on hea, sest kõikvõimalikud uuendused ilmuvad sinna kiiremini.
  7. Nüüd saate tegelikult ette valmistada sõltuvuste komplekti: käivitage käsureal kaustast oskuste näitega make all. Kausta installitakse hulk teeke (enamasti, nagu tavaliselt, mittevajalikud). dist.
  8. Täitke pliiatsid objektihoidlasse (ämbrisse {BUCKET NAME}) eelmises etapis saadud arhiiv dist.zip. Soovi korral saab seda teha ka käsurealt, näiteks kasutades AWS CLI.
  9. Looge veebiliidese või utiliidi abil serverita funktsioon yc. Utiliidi jaoks näeb käsk välja selline:

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

Funktsiooni käsitsi loomisel täidetakse kõik parameetrid ühtemoodi.

Nüüd saab loodud funktsiooni testida arendajakonsooli kaudu ning seejärel oskusi lõplikult vormistada ja avaldada.

Alice'i olekuteabe loomine Yandex.Cloudi ja Pythoni serverita funktsioonides

Mis on kapoti all

Makefile sisaldab tegelikult üsna lihtsat skripti sõltuvuste installimiseks ja nende arhiivi paigutamiseks. dist.zip, midagi sellist:

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 ./*

Ülejäänud on mõned lihtsad tööriistad, mis on pakitud teeki tgalice. Kasutajaandmete täitmise protsessi kirjeldab konfiguratsioon 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: Пожалуйста, попробуйте ещё раз. Вам нужно назвать число своего рождения (например, двадцатое); это одна или две цифры.

Pythoni klass võtab selle konfiguratsiooni sõelumise ja lõpptulemuse arvutamise üle

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

Täpsemalt baasklass FormFillingDialogManager tegeleb "ankeedi" täitmisega ja lapseklassi meetodiga handle_completed_form ütleb, mida teha, kui ta on selleks valmis.

Lisaks sellele kasutaja dialoogi põhivoolule on vaja ka kasutajat tervitada, samuti anda abi käsul "help" ja vabastada oskusest "exit" käsul. Selle jaoks sisse tgalice seal on ka mall, nii et kogu dialoogihaldur koosneb osadest:

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 toimib lihtsalt: ta proovib rakendada dialoogi hetkeseisule kordamööda kõiki selle komponente ja valib esimese asjakohase.

Vastuseks igale sõnumile tagastab dialoogihaldur pythoni objekti Response, mille saab seejärel teisendada lihttekstiks või Alice'i või Telegrami sõnumiks – olenevalt sellest, kus robot töötab; see sisaldab ka salvestamist vajava dialoogi muutunud olekut. Kogu selle köögiga tegeleb teine ​​klass, DialogConnector, seega näeb otsene skript Yandex Functionsi oskuste käivitamiseks välja järgmine:

...
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

Nagu näete, loob suurem osa sellest koodist ühenduse Object Storage S3 liidesega. Kuidas seda ühendust otseselt kasutatakse, saate lugeda tgalice koodis.
Viimane rida loob funktsiooni alice_handler - see, mille käskisime parameetri määramisel Yandex.Cloudi tõmmata --entrypoint=main.alice_handler.

See on tegelikult kõik. Makefailid ehitamiseks, S3-laadne objektide salvestusruum konteksti salvestamiseks ja pythoni teek tgalice. Koos Pythoni serverita funktsioonide ja väljendusrikkusega piisab sellest terve inimese oskuste arendamiseks.

Võite küsida, miks peate looma tgalice? Selles peitub kogu igav kood, mis edastab JSON-id päringust vastuseni ning salvestusest mällu ja tagasi. Samuti on olemas tavaline rakendus, funktsioon mõistmiseks, et "veebruar" on sarnane "veebruarile", ja muud vaeste jaoks mõeldud NLU. Minu idee kohaselt peaks sellest juba piisama, et saaks yaml-failidesse visandada oskuste prototüüpe, ilma et tehnilisi detaile liigselt segaks.

Kui soovite tõsisemat NLU-d, võite selle oma oskuste järgi kruvida Maitse või Sügav Pavlov, kuid nende seadistamine nõuab täiendavat tantsu tamburiiniga, eriti serverita. Kui te ei soovi kodeerida, peaksite kasutama visuaalset tüüpi konstruktorit Aimüloogiline. Tgalicet luues mõtlesin mingisugusele vahepealsele teele. Vaatame mis juhtub.

Noh, liitu nüüd Aliy oskuste arendaja vestlus, loe dokumentatsioonja luua hämmastav oskused!

Allikas: www.habr.com

Lisa kommentaar