Začnime novinkami. Včera Yandex.Cloud oznámil spustenie bezserverovej výpočtovej služby . 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 , 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 .
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.

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 . Nakoniec sa ukazuje 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 и . A až potom začnite.
Ak chcete okamžite pocítiť, za čo tu bojujeme, opýtajte sa Alice''. 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 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
- Príprava: prihláste sa do ľubovoľného počítača so systémom Linux. V podstate pomocou Windows Toto by pravdepodobne tiež mohlo fungovať, ale spustenie makefile by si vyžadovalo trochu mágie. A v každom prípade budete potrebovať nainštalovaný Python 3.6 alebo novší.
- Naklonujte ho z Github .
- Zaregistrujte sa v Y.Cloud:
- Vytvorte si dve vedrá , nazvite ich ľubovoľným menom
{BUCKET NAME}иtgalice-test-cold-storage(toto druhé meno je teraz pevne zakódovanémain.pymôj príklad). Prvý segment bude potrebný iba na nasadenie, druhý na ukladanie stavov dialógov. - vytvoriť , 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. - (Voliteľné) nainštalovať
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. - 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. - Nalejte do úložiska objektov ručne (do vedra
{BUCKET NAME}) archív získaný v predchádzajúcom krokudist.zip. Ak chcete, môžete to urobiť z príkazového riadku, napríklad pomocou . - 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=3sPri 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ť.

Č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 responsePresnejš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_handlerAko 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 .
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 alebo , 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 . Pri tvorbe tgalice som rozmýšľal nad nejakou medzicestou. Uvidíme, čo z toho vzíde.
No a teraz sa pridajte , čítať a vytvoriť úžasné !
Zdroj: hab.com
