Scil státmhar a chruthú do Alice ag baint úsáide as feidhmeanna gan fhreastalaí Yandex.Cloud agus Python

Cuirimis tús leis an nuacht. Inné d'fhógair Yandex.Cloud seoladh seirbhís ríomhaireachta gan fhreastalaí Feidhmeanna scamall Yandex. Ciallaíonn sé seo: ní scríobhann tú ach an cód le haghaidh do sheirbhíse (mar shampla, feidhmchlár gréasáin nó chatbot), agus cruthaíonn agus cothaíonn an Cloud féin na meaisíní fíorúla ina ritheann sé, agus fiú iad a mhacasamhlú má mhéadaíonn an t-ualach. Ní gá duit smaoineamh ar chor ar bith, tá sé an-áisiúil. Agus níl an íocaíocht ach amháin le haghaidh an ama ríomh.

Mar sin féin, b'fhéidir nach n-íocann cuid acu ar chor ar bith. Seo iad na forbróirí Scileanna seachtracha Alice, is é sin, chatbots tógtha isteach ann. Is féidir le forbróir ar bith scil den sórt sin a scríobh, a óstáil agus a chlárú, agus ón lá atá inniu ann ní gá fiú scileanna a óstáil - níl le déanamh ach a gcód a uaslódáil chuig an scamall san fhoirm an fheidhm chéanna gan fhreastalaí.

Ach tá cúpla nuances ann. Ar an gcéad dul síos, d'fhéadfadh go mbeadh roinnt spleáchais ag teastáil ó do chód peataí, agus níl sé fánach iad a tharraingt isteach sa Cloud. ar an dara dul síos, ní mór d'aon chatbot gnáth staid an dialóg a stóráil áit éigin (státach dá bhrí sin); conas é a dhéanamh ar fheidhm gan fhreastalaí an bealach is éasca? Ar an tríú dul síos, conas is féidir leat scil sciobtha agus salach a scríobh do Alice nó fiú bot de chineál éigin le plota neamh-nialais? Maidir leis na nuances, i ndáiríre, an t-alt.

Scil státmhar a chruthú do Alice ag baint úsáide as feidhmeanna gan fhreastalaí Yandex.Cloud agus Python

Ullmhúchán morálta

Don mhífhoighneach: bailím na spleáchais riachtanacha le makefile sula n-uaslódálann mé an fheidhm chuig an scamall, stóráilim staid an dialóg i Yandex Object Storage (tacaíonn sé le S3 API), agus úsáidim mo leabharlann féin chun an dialóg a bhainistiú. tgalice. Mar thoradh air sin, casadh sé amach den sórt sin scil taispeána. Agus anois déanaimis anailís beagán níos mine ar seo go léir.

Dóibh siúd atá beagán mífhoighneach, sula tumfaidh mé isteach i mo scéal faoi chastacht, molaim go mór tosú le rud éigin simplí. Eadhon, feidhm macalla aonchomhad a chruthú, cláraigh agus tástáil é sa chonsól forbróra dialóg; sonraí - isteach Dialóga Blag и Doiciméadú scamall. Agus gan ach tosú ansin.

Más mian leat a bhraitheann láithreach cad a bhfuil muid ag troid ar a son anseo, fiafraigh Alice 'cas ar an scil "TF horoscope"'. Ba cheart go dtarlódh agallamh cosúil leis an méid seo a leanas:

Alice: Dia duit! Tá tú sa scil “Horascóp TF”. Abair “Tosaigh” le fáil amach cad a gheallann na réaltaí duit.
Úsáideoir: Tosaigh
A: Luaigh d'ainm le do thoil.
Yu: Vasisualiy
F: Anois inis dom bliain do bhreithe. Níl ach ceithre dhigit, rud ar bith breise.
Yu: dara
A: Bain triail eile as, le do thoil. Luaigh bliain do bhreithe - ceithre dhigit.
Te: 2002
A: Go hiontach! Anois ainmnigh do mhí breithe.
Yu: Feabhra
A: Ar fheabhas! Ar deireadh, inis dom do dháta breithe - gan ach uimhir, gan ach uimhir nó dhó.
Te: 18
A: Go raibh maith agat, Vasisualiy! Anois tá a fhios againn: tá tú 17 mbliana d'aois agus tUisceadóir. Bhuel, ar ndóigh, tá an t-ádh ort! Insíonn na réaltaí duit: а что говорят звёзды, вы узнаете, запустив навык.

Is í an fhadhb atá ann ná chun fiú agallamh simplí den sórt sin a choinneáil, ní mór duit ainm agus dáta breithe an úsáideora a mheabhrú, agus i dtimpeallacht feidhm gan freastalaí tá sé seo neamhfhánach. Ní bheidh sé indéanta an comhthéacs a stóráil i RAM nó mar chomhad ar diosca, mar gheall ar Is féidir le Yandex.Cloud feidhm a rith ar roinnt meaisíní fíorúla ag an am céanna agus aistriú eatarthu de réir toil. Beidh ort roinnt stórála seachtrach a úsáid. Roghnaíodh Stóráil Objection mar stóráil sách saor agus neamhchasta go díreach i Yandex.Cloud (ie, is dócha go tapa). Mar rogha eile saor in aisce, is féidir leat triail a bhaint as, mar shampla, píosa saor in aisce Scamaill Scaipthe Monga áit éigin i bhfad ar shiúl. Tá fillteáin áisiúil Python ann do Object Storage (a thacaíonn le comhéadan S3) agus do Mhongó.

Fadhb eile is ea chun dul chuig Object Storage, MongoDB, agus aon bhunachar sonraí nó stór sonraí eile, tá roinnt spleáchais sheachtracha ag teastáil uait a theastaíonn uait a uaslódáil chuig Feidhmeanna Yandex mar aon le do chód feidhme. Agus ba mhaith liom é seo a dhéanamh go caothúil. Tá sé go hiomlán áisiúil (cosúil le heroku), faraor, ní oibreoidh sé, ach is féidir leat compord bunúsach a chruthú trí script a scríobh chun an timpeallacht a thógáil (comhad a dhéanamh).

Conas scil horoscope a sheoladh

  1. Faigh réidh: téigh chuig meaisín éigin le Linux. I bprionsabal, is dócha gur féidir leat a bheith ag obair le Windows freisin, ach ansin caithfidh tú a conjure le seoladh an makefile. Agus in aon chás, beidh ort ar a laghad 3.6 Python suiteáilte.
  2. Clón ó github sampla de scil horoscope.
  3. Cláraigh in Ya.Cloud: https://cloud.yandex.ru
  4. Cruthaigh duit féin dhá bhuicéad isteach Stóráil Réada, glaoch orthu le haon ainm {BUCKET NAME} и tgalice-test-cold-storage (tá an dara hainm seo códaithe isteach anois main.py mo shampla). Ní bheidh an chéad bhuicéad ag teastáil ach amháin le haghaidh imscaradh, an dara ceann - chun stáit dialóg a stóráil.
  5. a chruthú cuntas seirbhíse, ról a thabhairt dó editor, agus dintiúir statacha a fháil dó {KEY ID} и {KEY VALUE} — úsáidfimid iad chun staid an chomhphlé a thaifeadadh. Tá sé seo go léir ag teastáil ionas gur féidir le feidhm ó Ya.Cloud rochtain a fháil ar an stóráil ó Ya.Cloud. Lá éigin, tá súil agam, go dtiocfaidh údarú uathoibríoch, ach is mar sin atá sé faoi láthair.
  6. (Roghnach) suiteáil comhéadan líne ordaithe yc. Is féidir leat feidhm a chruthú freisin tríd an gcomhéadan gréasáin, ach tá an CLI go maith mar go bhfeictear gach cineál nuálaíochta ann níos tapúla.
  7. Anois is féidir leat an tionól spleáchais a ullmhú i ndáiríre: reáchtáil ar an líne ordaithe ón bhfillteán leis an sampla scile make all. Beidh a bunch de leabharlanna (den chuid is mó, mar is gnách, gan ghá) a shuiteáil san fhillteán dist.
  8. Doirt isteach Stóráil Réad de láimh (isteach sa bhuicéad {BUCKET NAME}) cartlann a fuarthas sa chéim roimhe seo dist.zip. Más mian leat, is féidir leat é seo a dhéanamh freisin ón líne ordaithe, mar shampla, ag baint úsáide as AWS CLI.
  9. Cruthaigh feidhm gan fhreastalaí tríd an gcomhéadan gréasáin nó ag baint úsáide as fóntais yc. Maidir leis an bhfóntas, beidh cuma mar seo ar an ordú:

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

Nuair a bhíonn feidhm á cruthú de láimh, líontar na paraiméadair go léir ar an mbealach céanna.

Anois is féidir an fheidhm a chruthaigh tú a thástáil tríd an gconsól forbróra, agus ansin is féidir an scil a fheabhsú agus a fhoilsiú.

Scil státmhar a chruthú do Alice ag baint úsáide as feidhmeanna gan fhreastalaí Yandex.Cloud agus Python

Cad atá faoin gcochall

I ndáiríre tá script simplí go leor sa makefile chun spleáchais a shuiteáil agus iad a chur i gcartlann dist.zip, rud éigin mar seo:

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

Tá an chuid eile roinnt uirlisí simplí fillte i leabharlann tgalice. Déanann an cumraíocht cur síos ar an bpróiseas chun sonraí úsáideora a líonadh 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: Пожалуйста, попробуйте ещё раз. Вам нужно назвать число своего рождения (например, двадцатое); это одна или две цифры.

Glacann an rang python an obair chun an cumraíocht seo a pharsáil agus an toradh deiridh a ríomh

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íos cruinne, an rang bonn FormFillingDialogManager déileálann sé leis an “foirm” a líonadh amach, agus modh ranga an linbh handle_completed_form insíonn sé cad atá le déanamh nuair a bhíonn sí réidh.

Chomh maith leis an bpríomhshreabhadh comhrá seo, ní mór beannú don úsáideoir freisin, chomh maith le cabhair a thabhairt leis an ordú “cúnamh” agus é a scaoileadh ón scil leis an ordú “scoir”. Chun na críche seo i tgalice tá teimpléad ann freisin, mar sin tá an bainisteoir dialóige iomlán comhdhéanta de phíosaí:

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 Oibríonn sé go simplí: déanann sé iarracht a chuid comhpháirteanna go léir a chur i bhfeidhm ar staid reatha an chomhphlé ar a seal, agus roghnaíonn sé an chéad cheann oiriúnach.

Mar fhreagra ar gach teachtaireacht, cuireann an bainisteoir dialóige rud python ar ais Response, ar féidir é a thiontú ansin go gnáth-théacs, nó isteach i dteachtaireacht in Alice nó Telegram - ag brath ar an áit a bhfuil an bot ag rith; cuimsíonn sé freisin staid athraithe an chomhphlé nach mór a shábháil. Tá an chistin iomlán seo láimh ag rang eile, DialogConnector, mar sin is cosúil seo an script dhíreach chun scil a sheoladh ar Feidhmeanna Yandex:

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

Mar a fheiceann tú, cruthaíonn an chuid is mó den chód seo nasc le comhéadan Object Storage S3. Is féidir leat léamh conas a úsáidtear an nasc seo go díreach i gcód tgalice.
Cruthaíonn an líne dheireanach an fheidhm alice_handler - an ceann a d'ordaigh muid Yandex.Cloud a tharraingt nuair a shocraigh muid an paraiméadar --entrypoint=main.alice_handler.

Is é sin, i ndáiríre, go léir. Déan comhaid le haghaidh cóimeála, Stóráil Oibiachta cosúil le S3 chun comhthéacs a stóráil, agus leabharlann Python tgalice. In éineacht le feidhmeanna gan fhreastalaí agus léiritheacht Python, is leor é seo chun scil shláintiúil daonna a fhorbairt.

Is féidir leat a iarraidh cén fáth ar gá duit a chruthú tgalice? Tá gach cód leadránach a aistríonn JSONanna ó iarratas go freagra agus ó stóráil go cuimhne agus ar ais ann. Tá iarratas rialta ann freisin, feidhm chun a thuiscint go bhfuil "Feabhra" cosúil le "Feabhra", agus NLU eile do na boicht. De réir mo thuairime, ba cheart go mbeadh sé seo go leor cheana féin chun fréamhshamhlacha scileanna a sceitseáil i gcomhaid yaml gan a bheith ró-dhírithe ar shonraí teicniúla.

Más mian leat NLU níos tromchúisí, is féidir leat é a cheangal le do scil BlasDeep Pavlov, ach chun iad a bhunú beidh gá le damhsa breise le tambóirín, go háirithe ar fhreastalaí. Más rud é nach mbraitheann tú cosúil le códú ar chor ar bith, ba cheart duit an cruthaitheoir cineál amhairc a úsáid aimilice. Agus tgalice á chruthú agam, smaoinigh mé ar chosán idirmheánach de chineál éigin. A ligean ar a fheiceáil cad a tharlaíonn.

Bhuel, páirt a ghlacadh anois Comhrá forbróir scileanna Aliy, léigh doiciméadúagus iontach a chruthú scileanna!

Foinse: will.com

Add a comment