Ustvarjanje spretnosti za Alice v brezstrežniških funkcijah Yandex.Cloud in Python

Začnimo z novicami. Včeraj je Yandex.Cloud napovedal uvedbo brezstrežniške računalniške storitve Funkcije v oblaku Yandex. To pomeni: vi samo napišete kodo za svojo storitev (na primer spletno aplikacijo ali klepetalnega robota), oblak pa sam ustvari in vzdržuje virtualne stroje, kjer teče, in jih celo replicira, če se obremenitev poveča. Sploh vam ni treba razmišljati, zelo je priročno. In plačilo je samo za čas izračuna.

Vendar pa nekateri morda sploh ne bodo plačali. To so razvijalci Aliceine zunanje sposobnosti, torej vanj vgrajeni chatboti. Vsak razvijalec lahko napiše, gosti in registrira tako veščino, od danes pa veščin sploh ni treba gostiti - samo naložite njihovo kodo v oblak v obliki ista funkcija brez strežnika.

Vendar obstaja nekaj odtenkov. Prvič, koda vašega hišnega ljubljenčka morda zahteva nekaj odvisnosti in ni trivialno, če jih povlecite v oblak. Drugič, vsak običajni chatbot mora nekje shraniti stanje pogovornega okna (torej s stanjem); kako to najlažje narediti v funkciji brez strežnika? Tretjič, kako lahko napišeš hitro in umazano veščino za Alice ali celo za nekakšnega bota z neničelnim zapletom? O teh niansah, pravzaprav, članek.

Ustvarjanje spretnosti za Alice v brezstrežniških funkcijah Yandex.Cloud in Python

moralna priprava

Za nepotrpežljive: z makefileom zberem potrebne odvisnosti, preden funkcijo naložim v oblak, stanje pogovornega okna shranim v Yandex Object Storage (podpira S3 API) in za upravljanje pogovornega okna uporabljam lastno knjižnico tgalice. Na koncu se izkaže kot demo spretnost. In zdaj analizirajmo vse to malo bolj podrobno.

Malo manj nestrpnim priporočam, da preden se potopite v mojo zgodbo o zapletenosti, začnete preprosto. Ustvarite namreč funkcijo echobot za eno datoteko, jo registrirajte in preizkusite v konzoli za razvijalce Dialog; podrobnosti - v Blog Dialogi и Dokumentacija v oblaku. In šele nato začnite.

Če želite takoj začutiti, za kaj se tukaj borimo, vprašajte Alice'omogočite veščino “IT horoskop”.'. Pojaviti se mora podoben dialog:

Alice: Pozdravljeni! Ste v veščini "IT Horoskop". Recite »Začni«, če želite izvedeti, kaj vam obljubljajo zvezde.
Uporabnik: Začni
O: Prosimo, povejte svoje ime
Yu: Vasisualy
A: Povej mi zdaj leto svojega rojstva. Samo štiri števke, nič dodatnega.
Yu: drugič
O: Prosimo, poskusite znova. Vnesite letnico rojstva - štiri števke.
Yu: 2002
O: Odlično! Zdaj poimenujte mesec svojega rojstva.
Yu: februar
O: Odlično! Nazadnje mi povejte svoj datum rojstva – samo številko, samo eno ali dve števki.
Yu: 18
A: Hvala, Vasisual! Zdaj vemo: stari ste 17 let in ste vodnar. Tukaj imate seveda srečo! Zvezde vam povedo а что говорят звёзды, вы узнаете, запустив навык.

Težava je v tem, da si morate za vzdrževanje še tako preprostega pogovornega okna zapomniti ime in datum rojstva uporabnika, v okolju brez strežnika pa to ni trivialno. Shranjevanje konteksta v RAM ali kot datoteko na disku ne bo delovalo, ker Yandex.Cloud lahko funkcijo izvaja na več virtualnih strojih hkrati in poljubno preklaplja med njimi. Uporabiti boste morali nekakšen zunanji pomnilnik. Object Storage je bil izbran kot dokaj poceni in preprosto shranjevanje neposredno v Yandex.Cloud (to je verjetno hitro). Kot brezplačno alternativo lahko preizkusite na primer brezplačen kos Oblačna Monga nekje daleč stran. Obstajajo priročni ovoji Python za Object Storage (ki podpira vmesnik S3) in Mongo.

Druga težava je, da za dostop do Object Storage, MongoDB in katere koli druge baze podatkov ali shrambe podatkov potrebujete nekaj zunanjih odvisnosti, ki jih je treba naložiti v funkcije Yandex skupaj s kodo vaše funkcije. In to bi rad naredil priročno. Na žalost ne bo povsem priročno (kot na Heroku), vendar lahko nekaj osnovnega udobja ustvarite s pisanjem skripta za gradnjo okolja (make file).

Kako zagnati veščino horoskopa

  1. Pripravite se: pojdite na kak stroj z Linuxom. Načeloma lahko verjetno delate tudi z Windowsi, vendar morate potem pričarati z zagonom makefile. In v vsakem primeru boste potrebovali vsaj 3.6 nameščen Python.
  2. Kloniraj iz githuba primer spretnosti horoskopa.
  3. Registracija v Ya.Cloud: https://cloud.yandex.ru
  4. Ustvarite si dve vedri Shranjevanje objektov, jih pokličite s katerim koli imenom {BUCKET NAME} и tgalice-test-cold-storage (to srednje ime je zdaj trdo kodirano v main.py moj primer). Prvo vedro bo potrebno samo za uvajanje, drugo - za shranjevanje stanj pogovornega okna.
  5. ustvariti storitveni račun, dajte mu vlogo editorin pridobite statične poverilnice zanj {KEY ID} и {KEY VALUE} — z njimi bomo zabeležili stanje dialoga. Vse to je potrebno, da lahko funkcija iz Ya.Cloud dostopa do shrambe iz Ya.Cloud. Nekoč, upam, bo avtorizacija postala avtomatska, a zaenkrat - tako.
  6. (Izbirno) namestitev vmesnik ukazne vrstice yc. Funkcijo lahko ustvarite tudi prek spletnega vmesnika, vendar je CLI dober, ker se v njem hitreje pojavljajo vse vrste novosti.
  7. Zdaj lahko pravzaprav pripravite sestav odvisnosti: zaženite ukazno vrstico iz mape s primerom spretnosti make all. V mapi bo nameščen kup knjižnic (večinoma, kot običajno, nepotrebnih). dist.
  8. S peresi napolnite v Object Storage (v vedro {BUCKET NAME}) arhiv, pridobljen v prejšnjem koraku dist.zip. Če želite, lahko to storite tudi iz ukazne vrstice, na primer z uporabo AWS CLI.
  9. Ustvarite funkcijo brez strežnika prek spletnega vmesnika ali s pomočjo pripomočka yc. Za pripomoček bo ukaz videti takole:

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

Pri ročnem ustvarjanju funkcije se vsi parametri izpolnijo na enak način.

Zdaj lahko funkcijo, ki ste jo ustvarili, preizkusite prek konzole za razvijalce, nato pa spretnost izboljšate in objavite.

Ustvarjanje spretnosti za Alice v brezstrežniških funkcijah Yandex.Cloud in Python

Kaj je pod pokrovom

Makefile pravzaprav vsebuje dokaj preprost skript za namestitev odvisnosti in njihovo arhiviranje. dist.zip, nekaj podobnega:

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

Ostalo je nekaj preprostih orodij, zavitih v knjižnico tgalice. Postopek izpolnjevanja uporabniških podatkov opisuje config 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: Пожалуйста, попробуйте ещё раз. Вам нужно назвать число своего рождения (например, двадцатое); это одна или две цифры.

Razred python prevzame delo razčlenjevanja te konfiguracije in izračuna končnega rezultata

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

Natančneje, osnovni razred FormFillingDialogManager se ukvarja z izpolnjevanjem obrazca in metodo podrejenega razreda handle_completed_form pove, kaj storiti, ko bo pripravljena.

Poleg tega glavnega toka uporabniškega dialoga je potrebno tudi pozdraviti uporabnika, pa tudi izdati pomoč pri ukazu "pomoč" in sprostiti veščino pri ukazu "izhod". Za to v tgalice Obstaja tudi predloga, tako da je celoten upravitelj dialoga sestavljen iz delov:

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 Deluje preprosto: po vrsti poskuša uporabiti vse svoje komponente za trenutno stanje dialoga in izbere prvo ustrezno.

Kot odgovor na vsako sporočilo upravitelj dialogov vrne predmet python Response, ki se nato lahko pretvori v navadno besedilo ali v sporočilo v Alice ali Telegramu – odvisno od tega, kje se bot izvaja; vsebuje tudi spremenjeno stanje pogovornega okna, ki ga je treba shraniti. Vso to kuhinjo upravlja drug razred, DialogConnector, tako da neposredni skript za zagon veščine v funkcijah Yandex izgleda takole:

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

Kot lahko vidite, večina te kode ustvari povezavo z vmesnikom Object Storage S3. Kako se ta povezava neposredno uporablja, si lahko preberete v kodi tgalice.
Zadnja vrstica ustvari funkcijo alice_handler — isti, za katerega smo rekli Yandex.Cloudu, naj ga potegne, ko smo nastavili parameter --entrypoint=main.alice_handler.

To je pravzaprav vse. Makefiles za sestavljanje, S3-podobno Object Storage za shranjevanje konteksta in knjižnica Python tgalice. Skupaj s funkcijami brez strežnika in izraznostjo pythona je to dovolj za razvoj spretnosti zdrave osebe.

Lahko se vprašate, zakaj morate ustvarjati tgalice? Vsa dolgočasna koda, ki prenaša JSON od zahteve do odgovora in iz pomnilnika v pomnilnik in nazaj, je v njem. Obstaja tudi običajna kodna aplikacija, funkcija za razumevanje, da je "februar" podoben "februaru", in druge NLU za revne. Po moji zamisli bi moralo biti že to dovolj, da lahko v datotekah yaml skicirate prototipe veščin, ne da bi vas preveč motile tehnične podrobnosti.

Če želite resnejši NLU, ga lahko privijete svoji spretnosti Rasa ali DeepPavlov, vendar bo njihova nastavitev zahtevala dodatne plese s tamburino, zlasti na brez strežnika. Če vam sploh ni do kodiranja, uporabite vizualni konstruktor, kot je Aimylogic. Pri ustvarjanju tgalice sem razmišljal o neki vmesni poti. Poglejmo, kaj bo iz tega.

No, zdaj pa se pridruži Klepet za razvijalce veščin Aliy, preberi dokumentacijo, in ustvarite čudovito spretnosti!

Vir: www.habr.com

Dodaj komentar