Vytvorenie stavovej zručnosti pre Alice na bezserverových funkciách Yandex.Cloud a Python

Začnime novinkami. Včera Yandex.Cloud oznámil spustenie bezserverovej výpočtovej služby Funkcie cloudu Yandex. To znamená: napíšete iba kód pre svoju službu (napríklad webovú aplikáciu alebo chatbota) a samotný cloud vytvára a udržiava virtuálne stroje, na ktorých beží, a dokonca ich replikuje, ak sa zaťaženie zvýši. Nemusíte vôbec premýšľať, je to veľmi pohodlné. A platba je len za čas výpočtu.

Niektoré však nemusia platiť vôbec. Toto sú vývojári Vonkajšie schopnosti Alice, teda v ňom zabudovaných chatbotov. Každý vývojár môže napísať, hostiť a zaregistrovať takúto zručnosť a od dnešného dňa tieto zručnosti ani nemusia byť hosťované – stačí nahrať ich kód do cloudu vo forme rovnakú funkciu bez servera.

Existuje však niekoľko nuancií. Po prvé, váš pit kód môže vyžadovať určité závislosti a ich pretiahnutie do cloudu nie je triviálne. Po druhé, každý normálny chatbot potrebuje niekde uložiť stav dialógu (teda stavový); Aký je najjednoduchší spôsob, ako to urobiť vo funkcii bez servera? Po tretie, ako môžete napísať rýchlu a špinavú zručnosť pre Alice alebo dokonca nejakého robota s nenulovým dejom? Článok je v skutočnosti o týchto nuansách.

Vytvorenie stavovej zručnosti pre Alice na bezserverových funkciách Yandex.Cloud a Python

Morálna príprava

Pre netrpezlivých: Pred nahraním funkcie do cloudu zbieram potrebné závislosti pomocou makefile, stav dialógu ukladám do Yandex Object Storage (podporuje S3 API) a na správu dialógu používam vlastnú knižnicu tgalice. Nakoniec sa ukazuje taký demo zručnosť. Teraz sa na to všetko pozrime trochu podrobnejšie.

Pre tých, ktorí sú trochu menej netrpezliví, skôr než sa ponorím do môjho príbehu o zložitosti, vrelo odporúčam začať niečím jednoduchým. Konkrétne vytvorte jednosúborovú funkciu echobot, zaregistrujte ju a otestujte ju vo vývojárskej konzole Dialogs; podrobnosti - v Blog dialógov и Cloudová dokumentácia. A až potom začnite.

Ak chcete okamžite pocítiť, za čo tu bojujeme, opýtajte sa Alice'aktivovať zručnosť „IT horoskop“.'. Mal by sa uskutočniť dialóg podobný nasledujúcemu:

Alice: Ahoj! Ste v zručnosti „IT horoskop“. Povedzte „Štart“, aby ste zistili, čo vám hviezdy sľubujú.
Používateľ: Štart
A: Uveďte svoje meno
Yu: Vasisualiy
A: Teraz mi povedz rok svojho narodenia. Iba štyri číslice, nič extra.
Yu: po druhé
Odpoveď: Skúste to znova. Zadajte rok svojho narodenia - štyri číslice.
Yu: 2002
Veľký! Teraz uveďte mesiac narodenia.
Yu: Február
Veľký! Nakoniec mi povedzte svoj dátum narodenia - iba číslo, iba jednu alebo dve číslice.
Yu: 18
A: Ďakujem, Vasisualiy! Teraz už vieme: máte 17 rokov a ste Vodnár. No, samozrejme, máte šťastie! Hviezdy vám hovoria: а что говорят звёзды, вы узнаете, запустив навык.

Problém je v tom, že na udržanie aj takého jednoduchého dialógu si musíte zapamätať meno používateľa a dátum narodenia a v prostredí funkcií bez servera je to netriviálne. Kontext nebude možné uložiť do RAM ani ako súbor na disk, pretože Yandex.Cloud môže spustiť funkciu na viacerých virtuálnych strojoch súčasne a ľubovoľne medzi nimi prepínať. Budete musieť použiť nejaký druh externého úložiska. Object Storage bolo zvolené ako pomerne lacné a nekomplikované úložisko priamo v Yandex.Cloud (t.j. pravdepodobne rýchle). Ako bezplatnú alternatívu môžete vyskúšať napríklad voľný kúsok Zamračené Monga niekde ďaleko. Existujú pohodlné obaly Pythonu pre úložisko objektov (ktoré podporuje rozhranie S3) a Mongo.

Ďalším problémom je, že na prístup k Object Storage, MongoDB a akejkoľvek inej databáze alebo dátovému úložisku potrebujete nejaké externé závislosti, ktoré je potrebné nahrať do funkcií Yandex spolu s vaším funkčným kódom. A chcel by som to urobiť pohodlne. Bohužiaľ to nebude úplne pohodlné (ako na Heroku), ale určitý základný komfort sa dá vytvoriť napísaním skriptu na vytvorenie prostredia (make file).

Ako spustiť zručnosť horoskopu

  1. Pripravte sa: prejdite na nejaký počítač s Linuxom. V zásade môžete pravdepodobne pracovať aj so systémom Windows, ale potom budete musieť urobiť nejaké kúzlo so spustením súboru makefile. A v každom prípade budete potrebovať nainštalovaný aspoň Python 3.6.
  2. Naklonujte ho z Github príklad zručnosti horoskopu.
  3. Zaregistrujte sa v Y.Cloud: https://cloud.yandex.ru
  4. Vytvorte si dve vedrá Ukladanie objektov, nazvite ich ľubovoľným menom {BUCKET NAME} и tgalice-test-cold-storage (toto druhé meno je teraz pevne zakódované main.py môj príklad). Prvý segment bude potrebný iba na nasadenie, druhý na ukladanie stavov dialógov.
  5. vytvoriť servisný účet, dajte mu rolu editora získajte pre ňu statické poverenia {KEY ID} и {KEY VALUE} — použijeme ich na zaznamenanie stavu dialógu. To všetko je potrebné, aby funkcia z Ya.Cloud mala prístup k úložisku z Ya.Cloud. Dúfam, že jedného dňa sa autorizácia stane automatickou, ale zatiaľ je to tak.
  6. (Voliteľné) nainštalovať rozhranie príkazového riadku yc. Funkciu vytvoríte aj cez webové rozhranie, ale CLI je dobré, pretože sa v ňom rýchlejšie objavujú všemožné inovácie.
  7. Teraz môžete skutočne pripraviť zostavu závislostí: spustite na príkazovom riadku z priečinka s príkladom zručnosti make all. Do priečinka sa nainštaluje kopa knižníc (väčšinou, ako obvykle, nepotrebných). dist.
  8. Nalejte do úložiska objektov ručne (do vedra {BUCKET NAME}) archív získaný v predchádzajúcom kroku dist.zip. Ak chcete, môžete to urobiť z príkazového riadku, napríklad pomocou AWS CLI.
  9. Vytvorte bezserverovú funkciu cez webové rozhranie alebo pomocou utility yc. Pre obslužný program bude príkaz vyzerať takto:

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 manuálnom vytváraní funkcie sa všetky parametre vyplnia rovnakým spôsobom.

Teraz možno funkciu, ktorú ste vytvorili, otestovať prostredníctvom konzoly pre vývojárov a potom je možné zručnosť vylepšiť a publikovať.

Vytvorenie stavovej zručnosti pre Alice na bezserverových funkciách Yandex.Cloud a Python

Čo je pod kapotou

Makefile v skutočnosti obsahuje pomerne jednoduchý skript na inštaláciu závislostí a ich uloženie do archívu dist.zip, približne takto:

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

Zvyšok tvorí niekoľko jednoduchých nástrojov zabalených v knižnici tgalice. Proces vypĺňania používateľských údajov popisuje konfigurácia 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: Пожалуйста, попробуйте ещё раз. Вам нужно назвать число своего рождения (например, двадцатое); это одна или две цифры.

Prácu pri analýze tejto konfigurácie a výpočte konečného výsledku preberá trieda 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

Presnejšie, základná trieda FormFillingDialogManager sa zaoberá vyplňovaním „formulára“ a metódou detskej triedy handle_completed_form hovorí jej, čo má robiť, keď je pripravená.

Okrem tohto hlavného toku dialógu musí byť používateľ tiež pozdravený, ako aj poskytnutá pomoc pomocou príkazu „help“ a uvoľnenie zo zručnosti pomocou príkazu „exit“. Na tento účel v tgalice Existuje aj šablóna, takže celý správca dialógov sa skladá z častí:

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 Funguje to jednoducho: snaží sa postupne aplikovať všetky jeho zložky na aktuálny stav dialógu a vyberie prvú vhodnú.

Dialógový manažér vráti objekt Python ako odpoveď na každú správu. Response, ktorý je možné následne previesť na obyčajný text alebo na správu v Alice alebo Telegrame – v závislosti od toho, kde robot beží; obsahuje aj zmenený stav dialógu, ktorý je potrebné uložiť. Celú túto kuchyňu má na starosti iná trieda, DialogConnector, takže priamy skript na spustenie zručnosti vo funkciách Yandex vyzerá takto:

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

Ako vidíte, väčšina tohto kódu vytvára spojenie s rozhraním S3 Object Storage. Môžete si prečítať, ako sa toto spojenie priamo používa v kódexe tgalice.
Posledný riadok vytvára funkciu alice_handler — ten istý, ktorý sme povedali Yandex.Cloud, aby vytiahol, keď nastavíme parameter --entrypoint=main.alice_handler.

To je vlastne všetko. Makefiles pre zostavenie, S3 Object Storage na ukladanie kontextu a Python knižnica tgalice. V kombinácii s funkciami bez serverov a výraznosťou Pythonu to stačí na rozvoj zdravej ľudskej zručnosti.

Môžete sa opýtať, prečo bolo potrebné vytvoriť tgalice? Všetok nudný kód, ktorý prenáša JSON z požiadavky do odpovede a z úložiska do pamäte a späť, leží v ňom. Existuje aj bežná kódová aplikácia, funkcia na pochopenie, že „február“ je podobný ako „február“ a ďalšie NLU pre chudobných. Podľa mojej predstavy by to už malo stačiť na to, aby ste si mohli načrtnúť prototypy zručností v súboroch yaml bez toho, aby vás príliš rozptyľovali technické detaily.

Ak chcete vážnejšie NLU, môžete ho pripojiť k svojej zručnosti rasa alebo DeepPavlov, ale ich nastavenie si bude vyžadovať ďalšie tance s tamburínou, najmä na bez servera. Ak sa vôbec necítite na kódovanie, mali by ste použiť vizuálny konštruktor ako Aimylogic. Pri tvorbe tgalice som rozmýšľal nad nejakou medzicestou. Uvidíme, čo z toho vzíde.

No a teraz sa pridajte alice skills developer chat, čítať dokumentáciaa vytvoriť úžasné zručností!

Zdroj: hab.com

Pridať komentár