Creu sgil urddasol i Alice ar swyddogaethau di-weinydd Yandex.Cloud a Python

Gadewch i ni ddechrau gyda'r newyddion. Ddoe cyhoeddodd Yandex.Cloud lansiad gwasanaeth cyfrifiadura di-weinydd Swyddogaethau Cwmwl Yandex. Mae hyn yn golygu: dim ond cod eich gwasanaeth y byddwch chi'n ei ysgrifennu (er enghraifft, cymhwysiad gwe neu chatbot), ac mae'r Cloud ei hun yn creu ac yn cynnal peiriannau rhithwir lle mae'n rhedeg, a hyd yn oed yn eu hailadrodd os yw'r llwyth yn cynyddu. Nid oes rhaid i chi feddwl o gwbl, mae'n gyfleus iawn. Ac mae'r taliad yn mynd dim ond ar gyfer amser y cyfrifiadau.

Fodd bynnag, efallai na fydd rhai pobl yn talu o gwbl. Dyma'r datblygwyr Sgiliau allanol Alice, hynny yw, chatbots wedi'u hadeiladu i mewn iddo. Gall unrhyw ddatblygwr ysgrifennu, cynnal a chofrestru sgil o'r fath, ac o heddiw ymlaen nid oes angen cynnal sgiliau hyd yn oed - uwchlwythwch eu cod i'r cwmwl ar y ffurflen yr un swyddogaeth di-weinydd.

Ond mae yna un neu ddau o arlliwiau. Yn gyntaf, efallai y bydd angen rhai dibyniaethau ar eich cod anifail anwes, ac nid yw'n ddibwys eu llusgo i'r Cwmwl. Yn ail, mae angen i unrhyw chatbot arferol storio cyflwr yr ymgom yn rhywle (dategol felly); sut i'w wneud mewn swyddogaeth heb weinydd yw'r ffordd hawsaf? Yn drydydd, sut allwch chi ysgrifennu sgil cyflym a budr i Alice neu hyd yn oed rhyw fath o bot gyda chynllwyn di-sero? Ynglŷn â'r arlliwiau hyn, mewn gwirionedd, yr erthygl.

Creu sgil urddasol i Alice ar swyddogaethau di-weinydd Yandex.Cloud a Python

paratoad moesol

Ar gyfer y diamynedd: Rwy'n casglu'r dibyniaethau angenrheidiol gyda makefile cyn uwchlwytho'r swyddogaeth i'r cwmwl, rwy'n storio cyflwr yr ymgom yn Yandex Object Storage (mae'n cefnogi'r API S3), ac rwy'n defnyddio fy llyfrgell fy hun i reoli'r deialog tgalis. O ganlyniad, mae'n troi allan o'r fath sgil demo. Ac yn awr gadewch i ni ddadansoddi hyn i gyd yn fwy manwl.

Ar gyfer y rhai ychydig yn llai diamynedd, cyn plymio i mewn i fy stori o gymhlethdod, rwy'n argymell yn fawr dechrau syml. Sef, creu swyddogaeth echobot un-ffeil, ei gofrestru a'i brofi yn y consol datblygwr Dialog; manylion - yn Deialogau Blog и dogfennaeth cwmwl. A dim ond wedyn dechrau.

Os ydych chi am deimlo'n syth am yr hyn rydyn ni'n ymladd amdano, gofynnwch i Alice 'trowch y sgil "TG horoscope" ymlaen'. Dylid cynnal y ddeialog ganlynol:

Alice: Helo! Rydych chi yn y sgil "horosgop TG". Dywedwch "Cychwyn" i ddarganfod beth mae'r sêr yn ei addo i chi.
Defnyddiwr: Cychwyn
A: Nodwch eich enw.
Yu: Vasisually
A: Nawr dywedwch wrthyf flwyddyn eich geni. Dim ond pedwar digid, dim byd mwy.
Yu: ail
A: Ceisiwch eto. Nodwch flwyddyn eich geni - pedwar digid.
Yu: 2002
A: Gwych! Nawr enwch fis eich geni.
Yu: Chwefror
A: Ardderchog! Yn olaf, dywedwch wrthyf eich dyddiad geni - dim ond rhif, dim ond un neu ddau ddigid.
Yu: 18
A: Diolch, Vasisual! Nawr rydyn ni'n gwybod: rydych chi'n 17 oed ac rydych chi'n Aquarius. Dyma chi, wrth gwrs, yn ffodus! Mae'r sêr yn dweud wrthych а что говорят звёзды, вы узнаете, запустив навык.

Y broblem yw, er mwyn cynnal deialog mor syml, mae angen i chi gofio enw a dyddiad geni'r defnyddiwr, ac mewn amgylchedd di-weinydd nid yw hyn yn ddibwys. Ni fydd yn gweithio i storio'r cyd-destun yn RAM neu fel ffeil ar ddisg, oherwydd Gall Yandex.Cloud redeg y swyddogaeth ar sawl peiriant rhithwir ar yr un pryd a newid rhyngddynt yn fympwyol. Bydd yn rhaid i chi ddefnyddio rhyw fath o storfa allanol. Dewiswyd Gwrthrych Storio fel storfa eithaf rhad a syml yn uniongyrchol yn Yandex.Cloud (hynny yw, yn ôl pob tebyg yn gyflym). Fel dewis arall rhad ac am ddim, gallwch geisio, er enghraifft, darn rhad ac am ddim Mongi cymylog rhywle pell. Mae gan Object Storage (mae'n cefnogi'r rhyngwyneb S3) a Mongo ddeunydd lapio Python cyfleus.

Problem arall yw, er mwyn mynd i Object Storage, MongoDB, ac unrhyw gronfa ddata neu storfa ddata arall, mae angen rhai dibyniaethau allanol arnoch y mae angen i chi eu huwchlwytho i Yandex Functions ynghyd â'ch cod swyddogaeth. A hoffwn ei wneud yn gyfforddus. Mae'n gwbl gyfleus (fel ar heroku), gwaetha'r modd, ni fydd yn gweithio, ond gallwch greu rhywfaint o gysur sylfaenol trwy ysgrifennu sgript i adeiladu'r amgylchedd (gwneud ffeil).

Sut i gychwyn y sgil horosgop

  1. Paratowch: ewch i beiriant gyda Linux. Mewn egwyddor, mae'n debyg y gallwch chi weithio gyda Windows hefyd, ond yna mae'n rhaid i chi gonsurio gyda lansiad y makefile. A beth bynnag, bydd angen o leiaf 3.6 gosod Python arnoch.
  2. Clôn o github enghraifft o sgil horosgop.
  3. Cofrestrwch yn Ya.Cloud: https://cloud.yandex.ru
  4. Creu dau fwced i chi'ch hun Storio Gwrthrychau, ffoniwch nhw wrth unrhyw enw {BUCKET NAME} и tgalice-test-cold-storage (mae'r enw canol hwn bellach wedi'i god caled i mewn main.py fy esiampl). Bydd angen y bwced cyntaf yn unig ar gyfer defnydd, yr ail - ar gyfer storio cyflyrau deialog.
  5. creu cyfrif gwasanaeth, rhowch rôl iddo editor, a chael tystlythyrau sefydlog ar ei gyfer {KEY ID} и {KEY VALUE} - byddwn yn eu defnyddio i gofnodi cyflwr y ddeialog. Mae angen hyn i gyd fel y gall y swyddogaeth o Ya.Cloud gael mynediad i'r storfa o Ya.Cloud. Rhyw ddydd, rwy'n gobeithio, bydd awdurdodiad yn dod yn awtomatig, ond am y tro - felly.
  6. (Dewisol) gosod rhyngwyneb llinell orchymyn yc. Gallwch hefyd greu swyddogaeth trwy'r rhyngwyneb gwe, ond mae'r CLI yn dda oherwydd bod pob math o arloesiadau yn ymddangos ynddo yn gyflymach.
  7. Nawr gallwch chi, mewn gwirionedd, baratoi'r cynulliad o ddibyniaethau: rhedeg ar y llinell orchymyn o'r ffolder gyda'r enghraifft sgil make all. Bydd criw o lyfrgelloedd (yn bennaf, yn ôl yr arfer, yn ddiangen) yn cael eu gosod yn y ffolder dist.
  8. Llenwch â beiros i mewn i Object Storage (i mewn i fwced {BUCKET NAME}) yr archif a gafwyd yn y cam blaenorol dist.zip. Os dymunir, gallwch hefyd wneud hyn o'r llinell orchymyn, er enghraifft, gan ddefnyddio CLI AWS.
  9. Creu swyddogaeth heb weinydd trwy'r rhyngwyneb gwe neu ddefnyddio'r cyfleustodau yc. Ar gyfer y cyfleustodau, bydd y gorchymyn yn edrych fel hyn:

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

Wrth greu swyddogaeth â llaw, caiff yr holl baramedrau eu llenwi yn yr un modd.

Nawr gellir profi'r swyddogaeth a grëwyd gennych trwy'r consol datblygwr, ac yna sgil terfynol a chyhoeddi.

Creu sgil urddasol i Alice ar swyddogaethau di-weinydd Yandex.Cloud a Python

Beth sydd o dan y cwfl

Mae'r makefile mewn gwirionedd yn cynnwys sgript eithaf syml ar gyfer gosod dibyniaethau a'u rhoi mewn archif. dist.zip, rhywbeth fel hyn:

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

Mae'r gweddill yn ychydig o offer syml wedi'u lapio mewn llyfrgell tgalice. Disgrifir y broses o lenwi data defnyddwyr gan y ffurfwedd 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: Пожалуйста, попробуйте ещё раз. Вам нужно назвать число своего рождения (например, двадцатое); это одна или две цифры.

Mae'r dosbarth python yn cymryd drosodd y gwaith o ddosrannu'r ffurfwedd hon a chyfrifo'r canlyniad terfynol

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

Yn fwy manwl gywir, y dosbarth sylfaen FormFillingDialogManager yn cymryd rhan mewn llenwi'r "ffurflen", a dull y dosbarth plentyn handle_completed_form yn dweud beth i'w wneud pan fydd hi'n barod.

Yn ogystal â'r prif lif hwn o ddeialog y defnyddiwr, mae hefyd angen cyfarch y defnyddiwr, yn ogystal â chymorth mater ar y gorchymyn "help" a rhyddhau o'r sgil ar y gorchymyn "ymadael". Am hyn yn tgalice mae yna hefyd dempled, felly mae'r rheolwr deialog cyfan yn cynnwys darnau:

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 yn gweithio'n syml: mae'n ceisio cymhwyso ei holl gydrannau yn eu tro i gyflwr presennol y ddeialog, ac yn dewis yr un perthnasol cyntaf.

Fel ymateb i bob neges, mae'r rheolwr deialog yn dychwelyd gwrthrych python Response, y gellir wedyn ei drawsnewid yn destun plaen, neu'n neges yn Alice neu Telegram - yn dibynnu ar ble mae'r bot yn rhedeg; mae hefyd yn cynnwys cyflwr newidiol yr ymgom y mae angen ei gadw. Mae'r gegin hon i gyd yn cael ei thrin gan ddosbarth arall, DialogConnector, felly mae'r sgript uniongyrchol ar gyfer cychwyn sgil ar Yandex Functions yn edrych fel hyn:

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

Fel y gwelwch, mae'r rhan fwyaf o'r cod hwn yn creu cysylltiad â rhyngwyneb Gwrthrych Storio S3. Sut mae'r cysylltiad hwn yn cael ei ddefnyddio'n uniongyrchol, gallwch chi ddarllen mewn cod tgalice.
Mae'r llinell olaf yn creu swyddogaeth alice_handler - yr un y gwnaethom orchymyn i dynnu Yandex.Cloud pan fyddwn yn gosod y paramedr --entrypoint=main.alice_handler.

Dyna, mewn gwirionedd, yw'r cyfan. Makefiles ar gyfer adeiladu, Storio Gwrthrych tebyg i S3 ar gyfer storio cyd-destun, a llyfrgell python tgalice. Ynghyd â nodweddion di-weinydd a mynegiant python, mae hyn yn ddigon i ddatblygu sgil person iach.

Efallai y byddwch yn gofyn pam fod angen i chi greu tgalice? Mae'r holl god diflas sy'n trosglwyddo JSONs o gais i ymateb ac o storio i gof ac yn ôl yn gorwedd ynddo. Mae yna hefyd gais rheolaidd, swyddogaeth ar gyfer deall bod "Chwefror" yn debyg i "Chwefror", a NLU eraill ar gyfer y tlawd. Yn ôl fy syniad, dylai hyn fod yn ddigon eisoes i allu braslunio prototeipiau sgiliau mewn ffeiliau yaml heb i fanylion technegol dynnu gormod o sylw.

Os ydych chi eisiau NLU mwy difrifol, gallwch chi ei sgriwio i'ch sgil Rasa neu DeepPavlov, ond bydd eu sefydlu yn gofyn am ddawnsio ychwanegol gyda thambwrîn, yn enwedig ar ddi-weinydd. Os nad ydych chi'n teimlo fel codio o gwbl, dylech ddefnyddio'r llunydd math gweledol Aimylogic. Wrth greu tgalice, meddyliais am ryw fath o lwybr canolradd. Gawn ni weld beth sy'n digwydd.

Wel, yn awr ymunwch Sgwrs datblygwr sgiliau Aliy, darllen dogfennaetha chreu anhygoel sgiliau!

Ffynhonnell: hab.com

Ychwanegu sylw