Að búa til hæfileika fyrir Alice á netþjónalausum aðgerðum Yandex.Cloud og Python

Byrjum á fréttunum. Í gær tilkynnti Yandex.Cloud um kynningu á netþjónalausri tölvuþjónustu Yandex skýjaaðgerðir. Þetta þýðir: þú skrifar aðeins kóðann fyrir þjónustuna þína (til dæmis vefforrit eða spjallbot) og skýið sjálft býr til og viðheldur sýndarvélunum þar sem það keyrir, og endurtekur þær jafnvel ef álagið eykst. Þú þarft alls ekki að hugsa, það er mjög þægilegt. Og greiðslan er aðeins fyrir útreikningstímann.

Sumir borga þó alls ekki. Þetta eru verktaki Ytri hæfileikar Alice, það er að segja spjallbotar innbyggðir í það. Hvaða verktaki sem er getur skrifað, hýst og skráð slíka færni og frá og með deginum í dag þarf ekki einu sinni að hýsa færnina - bara hlaðið kóðanum sínum upp í skýið á formi sama netþjónslausa aðgerðin.

En það eru nokkur blæbrigði. Í fyrsta lagi gæti gryfjukóðinn þinn krafist nokkurra ósjálfstæðis og að draga þá inn í skýið er ekki léttvægt. Í öðru lagi þarf hvaða venjulegt spjallbotni að geyma stöðu samræðunnar einhvers staðar (yfirlitslegt því); Hver er auðveldasta leiðin til að gera þetta í netþjónslausri aðgerð? Í þriðja lagi, hvernig geturðu skrifað fljótlega og óhreina hæfileika fyrir Alice eða jafnvel einhvers konar láni með plott sem er ekki núll? Greinin fjallar reyndar um þessi blæbrigði.

Að búa til hæfileika fyrir Alice á netþjónalausum aðgerðum Yandex.Cloud og Python

Siðferðilegur undirbúningur

Fyrir óþolinmóða: Ég safna nauðsynlegum ósjálfstæði með makefile áður en ég hleð aðgerðinni upp í skýið, ég geymi stöðu gluggans í Yandex Object Storage (það styður S3 API) og ég nota mitt eigið bókasafn til að stjórna glugganum tgalice. Á endanum kemur í ljós svo kynningarhæfileika. Nú skulum við skoða þetta allt aðeins nánar.

Fyrir þá sem eru aðeins minna óþolinmóðir, áður en kafað er í sögu mína um flókið, mæli ég eindregið með því að byrja á einhverju einföldu. Búðu til einni skrá echobot aðgerð, skráðu þig og prófaðu hana í Dialogs þróunarborðinu; upplýsingar - inn Samræður blogg и Skýjaskjöl. Og aðeins þá byrja.

Ef þú vilt strax finna fyrir hverju við erum að berjast fyrir hér, spyrðu Alice 'virkjaðu „IT stjörnuspá“ kunnáttuna'. Samræða svipað og eftirfarandi ætti að eiga sér stað:

Alice: Halló! Þú ert í „IT Stjörnuspá“ kunnáttunni. Segðu „Byrja“ til að komast að því hverju stjörnurnar lofa þér.
Notandi: Byrja
A: Vinsamlegast tilgreinið nafnið þitt
Yu: Vasisualiy
A: Segðu mér nú fæðingarárið þitt. Aðeins fjórir tölustafir, ekkert aukalega.
Yu: annað
A: Vinsamlegast reyndu aftur. Sláðu inn fæðingarár þitt - fjórir tölustafir.
Yu: 2002
A: Frábært! Nefndu nú fæðingarmánuð þinn.
Yu: febrúar
A: Frábært! Segðu mér að lokum fæðingardag þinn - bara tala, bara einn eða tveir tölustafir.
Yu: 18
A: Þakka þér, Vasisualiy! Nú vitum við: þú ert 17 ára og vatnsberi. Jæja, auðvitað ertu heppinn! Stjörnurnar segja þér: а что говорят звёзды, вы узнаете, запустив навык.

Vandamálið er að til þess að viðhalda jafnvel svona einföldum samræðum þarftu að muna nafn notandans og fæðingardag og í netþjónalausu aðgerðarumhverfi er þetta ekki léttvægt. Það verður ekki hægt að geyma samhengið í vinnsluminni eða sem skrá á diski, vegna þess að Yandex.Cloud getur keyrt aðgerð á nokkrum sýndarvélum á sama tíma og skipt á milli þeirra að vild. Þú verður að nota einhvers konar ytri geymslu. Object Storage var valið sem frekar ódýr og óbrotin geymsla beint í Yandex.Cloud (þ.e. líklega hratt). Sem ókeypis val geturðu prófað til dæmis ókeypis stykki Skýjað Monga einhvers staðar langt í burtu. Það eru þægilegir Python umbúðir fyrir bæði Object Storage (sem styður S3 viðmótið) og Mongo.

Annað vandamál er að til að fá aðgang að Object Storage, MongoDB og hvaða öðrum gagnagrunni eða gagnageymslu sem er þarftu einhverja ytri ósjálfstæði sem þarf að hlaða upp á Yandex Functions ásamt aðgerðarkóðanum þínum. Og ég myndi vilja gera þetta á þægilegan hátt. Því miður mun það ekki vera alveg þægilegt (eins og á Heroku), en hægt er að búa til grunnþægindi með því að skrifa handrit til að byggja upp umhverfið (gera skrá).

Hvernig á að hefja stjörnuspákunnáttu

  1. Undirbúa: farðu í einhverja vél með Linux. Í grundvallaratriðum geturðu líklega unnið með Windows líka, en þá þarftu að gera nokkra töfra með því að ræsa makefilinn. Og í öllum tilvikum þarftu að minnsta kosti Python 3.6 uppsett.
  2. Klóna það frá Github dæmi um stjörnuspákunnáttu.
  3. Skráðu þig í Y.Cloud: https://cloud.yandex.ru
  4. Búðu til sjálfur tvær fötur í Object Bílskúr, kalla þá hvaða nafni sem er {BUCKET NAME} и tgalice-test-cold-storage (þetta annað nafn er nú harðkóðað inn main.py dæmið mitt). Fyrstu fötuna þarf aðeins til að dreifa, sú seinni - til að geyma gluggastöður.
  5. búa til þjónustureikning, gefðu honum hlutverk editor, og fá kyrrstæður skilríki fyrir það {KEY ID} и {KEY VALUE} — við munum nota þau til að skrá stöðu samtalsins. Allt þetta er nauðsynlegt svo að aðgerð frá Ya.Cloud geti nálgast geymsluna frá Ya.Cloud. Einhvern tíma, vona ég, verði heimildin sjálfvirk, en í bili er það þannig.
  6. (Valfrjálst) setja upp skipanalínuviðmót yc. Einnig er hægt að búa til aðgerð í gegnum vefviðmótið, en CLI er gott því alls kyns nýjungar birtast í því hraðar.
  7. Nú geturðu í raun undirbúið ósjálfstæðissamsetninguna: keyrðu hana á skipanalínunni úr möppunni með hæfileikadæminu make all. Fullt af bókasöfnum (aðallega, eins og venjulega, óþarfi) verður sett upp í möppunni dist.
  8. Hellið í hlutgeymslu með höndunum (í fötuna {BUCKET NAME}) skjalasafn fengin í fyrra skrefi dist.zip. Ef þess er óskað geturðu gert þetta frá skipanalínunni, til dæmis með því að nota AWS CLI.
  9. Búðu til netþjónalausa aðgerð í gegnum vefviðmótið eða með því að nota tól yc. Fyrir tólið mun skipunin líta svona út:

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

Þegar fall er búið til handvirkt eru allar færibreytur fylltar út á sama hátt.

Nú er hægt að prófa aðgerðina sem þú bjóst til í gegnum forritaraborðið og þá er hægt að bæta og birta færnina.

Að búa til hæfileika fyrir Alice á netþjónalausum aðgerðum Yandex.Cloud og Python

Hvað er undir húddinu

Makefile inniheldur í raun frekar einfalt handrit til að setja upp ósjálfstæði og setja þær í skjalasafn dist.zip, um það bil svona:

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

Afgangurinn er nokkur einföld verkfæri vafið inn í bókasafn tgalice. Ferlið við að fylla út notendagögn er lýst af stillingum 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: Пожалуйста, попробуйте ещё раз. Вам нужно назвать число своего рождения (например, двадцатое); это одна или две цифры.

Vinnan við að flokka þessa stillingu og reikna út lokaniðurstöðuna er tekin af Python bekknum

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

Nánar tiltekið grunnflokkurinn FormFillingDialogManager fjallar um að fylla út „eyðublaðið“ og barnabekkjaraðferðina handle_completed_form segir henni hvað hún á að gera þegar hún er tilbúin.

Auk þessa aðalsamræðuflæðis verður einnig að heilsa notandanum, auk þess að fá hjálp með því að nota „hjálp“ skipunina og losa hann frá færninni með „hætta“ skipuninni. Í þessu skyni í tgalice Það er líka til sniðmát, þannig að allur gluggastjórinn er gerður úr hlutum:

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 Það virkar einfaldlega: það reynir að beita öllum íhlutum þess á núverandi stöðu samræðunnar og velur fyrsta viðeigandi.

Gluggastjórinn skilar Python hlut sem svar við hverju skeyti. Response, sem síðan er hægt að breyta í venjulegan texta, eða í skilaboð í Alice eða Telegram - allt eftir því hvar vélmaðurinn er í gangi; það inniheldur einnig breytt ástand samræðunnar sem þarf að vista. Allt þetta eldhús er í umsjá annar bekkjar, DialogConnector, þannig að beina handritið til að ræsa færni á Yandex Functions lítur svona út:

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

Eins og þú sérð skapar megnið af þessum kóða tengingu við S3 viðmót Object Storage. Þú getur lesið hvernig þessi tenging er beint notuð í tgalice kóða.
Síðasta línan býr til fallið alice_handler — sá sami og við sögðum Yandex.Cloud að draga þegar við stillum færibreytuna --entrypoint=main.alice_handler.

Það er allt, reyndar. Makefiles fyrir samsetningu, S3-lík Object Storage til að geyma samhengi og Python bókasafn tgalice. Ásamt netþjónalausum aðgerðum og tjáningargetu Python er þetta nóg til að þróa heilbrigða mannlega færni.

Þú gætir spurt hvers vegna það var nauðsynlegt að búa til tgalice? Allur leiðinlegur kóðinn sem flytur JSON frá beiðni til svars og frá geymslu í minni og til baka liggur í honum. Það er líka til venjulegt kóðaforrit, aðgerð til að skilja að „febrúar“ er svipað og „febrúar“ og önnur NLU fyrir fátæka. Samkvæmt hugmyndinni minni ætti þetta nú þegar að vera nóg svo að þú getir skissað út frumgerðir af færni í yaml skrám án þess að vera of trufluð af tæknilegum smáatriðum.

Ef þú vilt alvarlegri NLU geturðu tengt það við kunnáttu þína Bragð eða DeepPavlov, en uppsetning þeirra mun krefjast viðbótardansa með tambúrínu, sérstaklega á netþjónalausum. Ef þér finnst alls ekki gaman að kóða ættirðu að nota sjónrænan smið eins og Aimylogic. Þegar ég bjó til tgalice hugsaði ég um einhvers konar millileið. Sjáum hvað kemur út úr þessu.

Jæja, vertu nú með alice skills developer spjall, lesa skjöl, og búa til frábæra færni!

Heimild: www.habr.com

Bæta við athugasemd