Kugadzira hunyanzvi hwakasarudzika hwaAlice pane iyo serverless mabasa eYandex.Cloud uye Python

Ngatitange nenhau. Nezuro Yandex.Cloud yakazivisa kutangwa kwe serverless komputa sevhisi Yandex Cloud Mabasa. Izvi zvinoreva: iwe unongonyora kodhi yesevhisi yako (semuenzaniso, webhu application kana chatbot), uye Cloud pachayo inogadzira uye inochengeta chaiwo michina painomhanya, uye inotoidzokorora kana mutoro ukawedzera. Haufanire kufunga zvachose, zviri nyore kwazvo. Uye kubhadhara kunoenda chete kwenguva yekuverenga.

Zvisinei, vamwe vanhu vangasabhadhara zvachose. Ava ndivo vanogadzira Unyanzvi hwekunze hwaAlice, kureva, chatbots akavakwa mairi. Chero mugadziri anogona kunyora, kugamuchira uye kunyoresa hunyanzvi hwakadaro, uye kubva nhasi hunyanzvi hautomboda kuitirwa - ingoisa kodhi yavo kune gore mune fomu. zvakafanana serverless basa.

Asi pane maviri nuances. Chekutanga, kodhi yako yegomba ingangoda zvimwe zvinotsamira, uye kuvazvuzvurudza muGore hakusi kudiki. Kechipiri, chero yakajairwa chatbot inoda kuchengetedza mamiriro enhaurirano kumwe kunhu (yakataura saka); Ndeipi nzira iri nyore yekuita izvi mune isina server basa? Chechitatu, unogona sei kunyora nekukurumidza-uye-tsvina hunyanzvi kuna Alice kana kunyange imwe mhando yebhoti ine isiri-zero zano? Chinyorwa chacho, chokwadi, nezve aya nuances.

Kugadzira hunyanzvi hwakasarudzika hwaAlice pane iyo serverless mabasa eYandex.Cloud uye Python

kugadzirira tsika

Kune vasina kushivirira: Ini ndinounganidza zvinodiwa zvinoenderana ne makefile ndisati ndaisa basa kune gore, ndinochengeta mamiriro ehurukuro muYandex Object Storage (inotsigira S3 API), uye ini ndinoshandisa raibhurari yangu kuti ndigadzirise iyo dialog. tgalice. Somugumisiro, zvinopera wakadaro demo unyanzvi. Uye zvino ngationgororei zvese izvi mune zvishoma zvakadzama.

Kune avo vasina kushivirira zvishoma, ndisati ndanyura mune yangu nyaya yekuoma, ini ndinokurudzira zvikuru kutanga nechinhu chakareruka. Sezvineiwo, gadzira imwe-faira echobot basa, rejista uye uiedze muDialogs developer console; details - in Blog Dialogues и Cloud zvinyorwa. Uye chete ipapo tanga.

Kana iwe uchida kunzwa nekukurumidza zvatiri kurwira, bvunza Alice 'batidza hunyanzvi "IT horoscope"'. Nhaurirano inotevera inofanira kuitika:

Alice: Mhoro! Iwe uri mu "IT Horoscope" unyanzvi. Iti "Tanga" kuti uzive izvo nyeredzi dzinokuvimbisa.
Mushandisi: Tanga
A: Ndapota taura zita rako.
Yu: Vasisualiy
A: Zvino chindiudza gore rawakaberekwa. Madijiti mana chete, hapana chimwe.
Yu: wechipiri
A: Ndapota edza zvakare. Taura gore rekuzvarwa kwako - manhamba mana.
Yu: 2002
A: Hongu! Chipa mwedzi wako wekuzvarwa.
Yu: Kukadzi
A: Zvakanaka! Pakupedzisira, ndiudze zuva rako rekuzvarwa - nhamba chete, nhamba imwe chete kana mbiri.
Yu: 18
A: Ndatenda, Vasisualiy! Iye zvino tava kuziva: une makore 17 uye Aquarius. Zvakanaka, chokwadi, une rombo rakanaka! Nyeredzi dzinokuudza kuti: а что говорят звёзды, вы узнаете, запустив навык.

Dambudziko nderekuti kuchengetedza kunyangwe iri nyore dialog, unofanirwa kuyeuka zita uye zuva rekuzvarwa kwemushandisi, uye munzvimbo isina server izvi hazvisi zvishoma. Izvo hazvishande kuchengetedza mamiriro mu RAM kana sefaira pa diski, nekuti Yandex.Cloud inogona kumhanyisa basa pamichina akati wandei panguva imwe chete uye chinja pakati pavo zvisina tsarukano. Iwe unofanirwa kushandisa imwe mhando yekuchengetedza kunze. Object Storage yakasarudzwa senge isingadhure uye yakapusa chengetedzo yakananga muYandex.Cloud (ndiko kuti, pamwe nekukurumidza). Seimwe nzira yemahara, unogona kuedza, semuenzaniso, chidimbu chemahara Cloudy Mongi kumwe kure kure. Ose maviri Object Storage (inotsigira S3 interface) uye Mongo ine zviri nyore Python wrappers.

Rimwe dambudziko nderekuti kuti uende kuObject Storage, MongoDB, uye chero imwe dhatabhesi kana data chitoro, iwe unoda zvimwe zvekunze zvinotsamira zvaunoda kuisa kuYandex Mabasa pamwe chete nekodhi yako yebasa. Uye ndinoda kuzviita zvakasununguka. Izvo zvakakwana zvakakwana (senge pane heroku), nhamo, hazvizoshande, asi iwe unogona kugadzira imwe nyaradzo yekutanga nekunyora script kuvaka nharaunda (ita faira).

Maitiro ekutanga horoscope hunyanzvi

  1. Gadzirira: enda kune mumwe muchina une Linux. Muchidimbu, unogona kushanda neWindows zvakare, asi ipapo uchafanirwa kuita mamwe mashiripiti nekutanga makefile. Uye mune chero zvazvingava, iwe uchada kanenge Python 3.6 yakaiswa.
  2. Clone kubva github muenzaniso wehunyanzvi hwehoroscope.
  3. Bhalisa muYa.Cloud: https://cloud.yandex.ru
  4. Gadzira iwe mabhakiti maviri mukati Object Storage, vatumire nezita ripi neripi {BUCKET NAME} и tgalice-test-cold-storage (iri zita repakati rave hardcoded kupinda main.py muenzaniso wangu). Bhakiti rekutanga rinozodiwa chete kutumirwa, yechipiri - kuchengetedza dialog states.
  5. Gadzira service account, mupe basa editor, uye tora static zvitupa zvayo {KEY ID} и {KEY VALUE} - tichavashandisa kunyora mamiriro enhaurirano. Zvose izvi zvinodiwa kuitira kuti basa kubva kuYa.Cloud riwane kuchengetedza kubva kuYa.Cloud. Rimwe zuva, ndinovimba, mvumo ichaita otomatiki, asi ikozvino - saka.
  6. (Sarudzo) gadza command line interface yc. Iwe unogona zvakare kugadzira basa kuburikidza newebhu interface, asi iyo CLI yakanaka nekuti ese marudzi ehunyanzvi anoonekwa mairi nekukurumidza.
  7. Iye zvino iwe unogona chaizvo kugadzirira musangano wekutsamira: mhanyisa pamutsara wekuraira kubva kune dhairekitori nemuenzaniso wehunyanzvi make all. Boka remaraibhurari (kazhinji, senguva dzose, zvisina basa) richaiswa mufolda dist.
  8. Zadza nezvinyoreso muObject Storage (mubucket {BUCKET NAME}) archive yakawanikwa munhanho yapfuura dist.zip. Kana uchida, iwe unogona zvakare kuita izvi kubva kumutsara wekuraira, semuenzaniso, uchishandisa AWS CLI.
  9. Gadzira basa risina server kuburikidza newebhu interface kana kushandisa zvinoshandiswa yc. Kune iyo yekushandisa, murairo uchataridzika seizvi:

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

Paunenge uchigadzira basa nemaoko, ese ma parameter anozadzwa nenzira imwechete.

Ikozvino basa rawakagadzira rinogona kuyedzwa kuburikidza neiyo developer console, uye wozopedzwa nekuburitswa hunyanzvi.

Kugadzira hunyanzvi hwakasarudzika hwaAlice pane iyo serverless mabasa eYandex.Cloud uye Python

Chii chiri pasi pehood

Iyo makefile inonyatso ine script yakapusa yekuisa zvinotsamira uye nekuzviisa mudura dist.zip, chimwe chinhu chakadai:

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

Asara mashoma maturusi akaputirwa muraibhurari tgalice. Maitiro ekuzadza mushandisi data anotsanangurwa neiyo config 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: Пожалуйста, попробуйте ещё раз. Вам нужно назвать число своего рождения (например, двадцатое); это одна или две цифры.

Iyo python kirasi inotora basa rekuparura iyi config uye kuverenga mhedzisiro yekupedzisira

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

Kunyanya chaizvo, the base class FormFillingDialogManager ari kuita kuzadza "fomu", uye nzira yekirasi yemwana handle_completed_form anomuudza zvokuita kana agadzirira.

Mukuwedzera kune iyi huru inoyerera yehurukuro yemushandisi, inofanirwawo kukwazisa mushandisi, pamwe nekupa rubatsiro pa "rubatsiro" murairo uye kusunungurwa kubva kune unyanzvi pa "exit" murairo. Kuti izvi in tgalice kune zvakare template, saka iyo yese dialog maneja inogadzirwa nezvidimbu:

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 Inoshanda zviri nyore: inoedza kushandisa zvikamu zvayo zvose kune ikozvino mamiriro ehurukuro pamwe chete, uye inosarudza yekutanga yakakodzera.

Iyo dialog maneja anodzosera chinhu chePython semhinduro kune yega meseji. Response, iyo inogona kushandurwa kuita mavara akajeka, kana meseji muAlice kana Telegraph - zvichienderana nekuti bhoti iri kushanda kupi; iyo ine zvakare yakashandurwa mamiriro eiyo dialog inoda kuchengetwa. Yese iyi kicheni inobatwa neimwe kirasi, DialogConnector, saka iyo yakananga script yekutanga hunyanzvi paYandex Functions inoita seizvi:

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

Sezvauri kuona, yakawanda yekodhi iyi inogadzira chinongedzo kune Object Storage S3 interface. Kuti kubatana uku kunoshandiswa sei zvakananga, unogona kuverenga mune tgalice kodhi.
Mutsara wekupedzisira unogadzira basa alice_handler - iyo imwechete yatakaudza Yandex.Cloud kudhonza kana taisa parameter --entrypoint=main.alice_handler.

Ndizvo zvose, chaizvoizvo. Makefiles egungano, S3-seChinhu Chekuchengeta chekuchengetedza mamiriro, uye raibhurari yePython. tgalice. Yakasanganiswa neasina server mabasa uye kutaura kwePython, izvi zvakakwana kukudziridza hutano hwevanhu hunyanzvi.

Iwe unogona kubvunza kuti nei uchifanira kugadzira tgalice? Yese kodhi inobhowa inotamisa maJSONs kubva pakukumbira kuenda kumhinduro uye kubva pakuchengetera kuenda kundangariro uye kumashure irimo. Kune zvakare kodhi yenguva dzose application, basa rekunzwisisa kuti "February" yakafanana ne "February", uye imwe NLU yevarombo. Zvinoenderana nepfungwa yangu, izvi zvinofanirwa kunge zvatokwana kuti iwe ugone kudhirowa prototypes yehunyanzvi mumafaira aml pasina kukanganiswa zvakanyanya nehunyanzvi ruzivo.

Kana iwe uchida yakawedzera kukomba NLU, unogona kuipusha kune hunyanzvi hwako Idya kana DeepPavlov, asi kudzigadzira kunoda kuwedzera kutamba nengoma, kunyanya isina server. Kana iwe usinganzwe kuda kukodha zvachose, iwe unofanirwa kushandisa yekuona mhando yekuvaka Aimylogic. Pakugadzira tgalice, ndakafunga nezveimwe nzira yepakati. Ngationei zvinoitika.

Zvakanaka, zvino batana Aliy hunyanzvi hwekuvandudza chat, verenga zvinyorwauye kugadzira zvinoshamisa hunyanzvi!

Source: www.habr.com

Voeg