Alises statusa prasmju izveide, izmantojot Yandex.Cloud un Python bezservera funkcijas

Sāksim ar jaunumiem. Vakar Yandex.Cloud paziņoja par bezservera skaitļošanas pakalpojuma uzsākšanu Yandex mākoņa funkcijas. Tas nozīmē: jūs rakstāt tikai sava pakalpojuma kodu (piemēram, tīmekļa lietojumprogrammai vai tērzēšanas robotam), un mākonis pats izveido un uztur virtuālās mašīnas, kur tas darbojas, un pat atkārto tās, ja palielinās slodze. Jums vispār nav jādomā, tas ir ļoti ērti. Un maksājums ir tikai par aprēķina laiku.

Tomēr daži var nemaksāt vispār. Tie ir izstrādātāji Alises ārējās prasmes, tas ir, tajā iebūvētie tērzēšanas roboti. Jebkurš izstrādātājs var rakstīt, mitināt un reģistrēt šādu prasmi, un no šodienas prasmes pat nav jāmitina — vienkārši augšupielādējiet savu kodu mākonī formā. tā pati bezservera funkcija.

Bet ir pāris nianses. Pirmkārt, jūsu bedres kodam var būt nepieciešamas dažas atkarības, un to vilkšana mākonī nav triviāla. Otrkārt, jebkuram normālam tērzēšanas robotam ir kaut kur jāsaglabā dialoga stāvoklis (tātad statuss); Kāds ir vienkāršākais veids, kā to izdarīt bezservera funkcijā? Treškārt, kā var uzrakstīt ātri un netīrās prasmes Alisei vai pat kaut kādu botu ar sižetu, kas nav nulles? Raksts patiesībā ir par šīm niansēm.

Alises statusa prasmju izveide, izmantojot Yandex.Cloud un Python bezservera funkcijas

Morālā sagatavošanās

Nepacietīgajiem: pirms funkcijas augšupielādes mākonī es savācu nepieciešamās atkarības ar makefile, saglabāju dialoga stāvokli Yandex Object Storage (tā atbalsta S3 API) un dialoga pārvaldīšanai izmantoju savu bibliotēku. tgalice. Beigās izrādās šāds demo prasme. Tagad apskatīsim to visu nedaudz sīkāk.

Tiem, kas ir mazāk nepacietīgi, pirms iedziļināties manā stāstā par sarežģītību, es ļoti iesaku sākt ar kaut ko vienkāršu. Proti, izveidot viena faila echobot funkciju, reģistrēt un pārbaudīt to Dialogs izstrādātāju konsolē; detaļas - iekšā Dialogu emuārs и Mākoņa dokumentācija. Un tikai tad sāc.

Ja vēlaties uzreiz sajust, par ko mēs šeit cīnāmies, jautājiet Alisei.iespējojiet "IT horoskopa" prasmi'. Jānotiek šādam līdzīgam dialogam:

Alise: Sveiki! Jūs esat "IT horoskopa" prasmē. Sakiet “Sākt”, lai uzzinātu, ko zvaigznes jums sola.
Lietotājs: Sākt
A: Lūdzu, norādiet savu vārdu
Ju: Vasizualijs
A: Tagad pasaki man savu dzimšanas gadu. Tikai četri cipari, nekas papildus.
Yu: otrais
A: Lūdzu, mēģiniet vēlreiz. Ievadiet savu dzimšanas gadu - četri cipari.
J: 2002
Liels! Tagad nosauciet savu dzimšanas mēnesi.
Yu: februāris
Liels! Visbeidzot, pasakiet man savu dzimšanas datumu – tikai cipars, tikai viens vai divi cipari.
J: 18
A: Paldies, Vasisualiy! Tagad mēs zinām: jums ir 17 gadi un esat Ūdensvīrs. Nu, protams, jums ir paveicies! Zvaigznes jums saka: а что говорят звёзды, вы узнаете, запустив навык.

Problēma ir tā, ka, lai uzturētu pat tik vienkāršu dialogu, ir jāatceras lietotāja vārds un dzimšanas datums, un bezservera funkciju vidē tas nav triviāli. Nebūs iespējams saglabāt kontekstu RAM vai kā failu diskā, jo Yandex.Cloud var palaist funkciju vairākās virtuālajās mašīnās vienlaikus un pārslēgties starp tām pēc vēlēšanās. Jums būs jāizmanto kāda veida ārējā atmiņa. Objektu krātuve tika izvēlēta kā diezgan lēta un nesarežģīta krātuve tieši Yandex.Cloud (t.i., iespējams, ātra). Kā bezmaksas alternatīvu varat izmēģināt, piemēram, bezmaksas gabalu Apmācies Monga kaut kur tālu. Ir ērti Python iesaiņotāji gan objektu krātuvei (kas atbalsta S3 saskarni), gan Mongo.

Vēl viena problēma ir tā, ka, lai piekļūtu objektu krātuvei, MongoDB un jebkurai citai datu bāzei vai datu krātuvei, jums ir nepieciešamas dažas ārējās atkarības, kas kopā ar funkcijas kodu ir jāaugšupielādē pakalpojumā Yandex Functions. Un es gribētu to izdarīt ērti. Diemžēl tas nebūs pilnīgi ērti (piemēram, Heroku), taču pamata komfortu var radīt, rakstot skriptu vides veidošanai (make file).

Kā uzsākt horoskopa prasmi

  1. Sagatavojieties: dodieties uz kādu mašīnu ar Linux. Principā jūs, iespējams, varat strādāt arī ar Windows, taču pēc tam jums būs jāveic dažas burvju darbības ar makefile palaišanu. Un jebkurā gadījumā jums būs jāinstalē vismaz Python 3.6.
  2. Klonējiet to no Github horoskopa prasmes piemērs.
  3. Reģistrēties Y.Cloud: https://cloud.yandex.ru
  4. Izveidojiet sev divus spaiņus Objektu glabāšana, sauc tos jebkurā vārdā {BUCKET NAME} и tgalice-test-cold-storage (šis otrais nosaukums tagad ir iekodēts main.py mans piemērs). Pirmais kauss būs nepieciešams tikai izvietošanai, otrais - dialoga stāvokļu glabāšanai.
  5. izveidot pakalpojuma konts, dod viņam lomu editor, un iegūstiet tam statiskus akreditācijas datus {KEY ID} и {KEY VALUE} — mēs tos izmantosim, lai ierakstītu dialoga stāvokli. Tas viss ir nepieciešams, lai Ya.Cloud funkcija varētu piekļūt krātuvei no Ya.Cloud. Es ceru, ka kādreiz autorizācija kļūs automātiska, bet pagaidām tā ir.
  6. (Pēc izvēles) instalējiet komandrindas interfeiss yc. Funkciju var izveidot arī caur tīmekļa saskarni, taču CLI ir laba, jo tajā ātrāk parādās visādi jauninājumi.
  7. Tagad jūs faktiski varat sagatavot atkarības komplektu: palaidiet to komandrindā no mapes ar prasmju piemēru make all. Mapē tiks instalēta virkne bibliotēku (galvenokārt, kā parasti, nevajadzīgas). dist.
  8. Ar roku ielejiet objektu krātuvē (spainī {BUCKET NAME}) arhīvs, kas iegūts iepriekšējā darbībā dist.zip. Ja vēlaties, varat to izdarīt no komandrindas, piemēram, izmantojot AWS CLI.
  9. Izveidojiet bezservera funkciju, izmantojot tīmekļa saskarni vai utilītu yc. Lietderībai komanda izskatīsies šādi:

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

Manuāli veidojot funkciju, visi parametri tiek aizpildīti vienādi.

Tagad izveidoto funkciju var pārbaudīt, izmantojot izstrādātāja konsoli, un pēc tam prasmes var uzlabot un publicēt.

Alises statusa prasmju izveide, izmantojot Yandex.Cloud un Python bezservera funkcijas

Kas ir zem pārsega

Makefile faktiski satur diezgan vienkāršu skriptu atkarību instalēšanai un ievietošanai arhīvā dist.zip, apmēram šādi:

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

Pārējais ir daži vienkārši rīki, kas iesaiņoti bibliotēkā tgalice. Lietotāja datu aizpildīšanas process ir aprakstīts konfigurācijā 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: Пожалуйста, попробуйте ещё раз. Вам нужно назвать число своего рождения (например, двадцатое); это одна или две цифры.

Šīs konfigurācijas parsēšanas un gala rezultāta aprēķināšanas darbu pārņem Python klase

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

Precīzāk, bāzes klase FormFillingDialogManager nodarbojas ar “veidlapas” aizpildīšanu un bērnu klases metodi handle_completed_form stāsta viņai, ko darīt, kad viņa būs gatava.

Papildus šai galvenajai dialoga plūsmai lietotājs ir arī jāsasveicina, kā arī jāsniedz palīdzība, izmantojot komandu “help”, un jāatbrīvo no prasmes, izmantojot komandu “exit”. Šim nolūkam iekšā tgalice Ir arī veidne, tāpēc viss dialoga pārvaldnieks sastāv no daļām:

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 Tas darbojas vienkārši: tas mēģina pēc kārtas piemērot visus tā komponentus pašreizējam dialoga stāvoklim un izvēlas pirmo atbilstošo.

Dialoga pārvaldnieks atgriež Python objektu kā atbildi uz katru ziņojumu. Response, ko pēc tam var pārvērst vienkāršā tekstā vai ziņojumā programmā Alise vai Telegram — atkarībā no tā, kur darbojas robots; tajā ir arī mainīts dialoga stāvoklis, kas jāsaglabā. Visu šo virtuvi pārvalda cita klase, DialogConnector, tāpēc tiešais skripts prasmes palaišanai pakalpojumā Yandex Functions izskatās šādi:

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

Kā redzat, lielākā daļa šī koda izveido savienojumu ar objektu krātuves S3 interfeisu. Varat lasīt, kā šis savienojums tiek tieši izmantots tgalices kodā.
Pēdējā rindiņa izveido funkciju alice_handler — tas pats, kuru likām Yandex.Cloud vilkt, kad iestatām parametru --entrypoint=main.alice_handler.

Tas arī viss, patiesībā. Makefaili montāžai, S3 līdzīga objektu krātuve konteksta glabāšanai un Python bibliotēka tgalice. Apvienojumā ar Python bezserveru funkcijām un izteiksmīgumu ar to pietiek, lai attīstītu veselīgas cilvēka prasmes.

Jūs varat jautāt, kāpēc bija nepieciešams izveidot tgalice? Tajā atrodas viss garlaicīgais kods, kas pārsūta JSON no pieprasījuma uz atbildi un no krātuves uz atmiņu un atpakaļ. Ir arī parasta koda aplikācija, funkcija, lai saprastu, ka “februāris” ir līdzīgs “februārim”, un citi NLU nabadzīgajiem. Pēc manas idejas ar to jau vajadzētu pietikt, lai jūs varētu ieskicēt prasmju prototipus yaml failos, pārāk neaizraujoties no tehniskām detaļām.

Ja vēlaties nopietnāku NLU, varat to pievienot savai prasmei Rasa vai Dziļi Pavlovs, taču to iestatīšanai būs nepieciešamas papildu dejas ar tamburīnu, īpaši bez servera. Ja jums vispār nevēlas kodēt, jums vajadzētu izmantot vizuālo konstruktoru, piemēram, Mērķis. Veidojot tgalici, domāju par kaut kādu starpceļu. Redzēsim, kas no tā sanāks.

Nu, tagad pievienojies alises prasmju izstrādātāja tērzēšana, lasiet dokumentācija, un radīt brīnišķīgu prasmes!

Avots: www.habr.com

Pievieno komentāru