Kupanga luso lapamwamba la Alice pa ntchito zopanda seva za Yandex.Cloud ndi Python

Tiyeni tiyambe ndi nkhani. Dzulo Yandex.Cloud idalengeza kukhazikitsidwa kwa ntchito yamakompyuta yopanda seva Yandex Cloud Functions. Izi zikutanthauza: mumangolemba khodi ya ntchito yanu (mwachitsanzo, pulogalamu yapaintaneti kapena chatbot), ndipo Mtambo womwewo umapanga ndikusunga makina enieni kumene umayenda, ndipo ngakhale kubwereza ngati katunduyo akuwonjezeka. Simuyenera kuganiza konse, ndizosavuta. Ndipo malipiro amapita kokha pa nthawi yowerengera.

Komabe, anthu ena sangamalipire nkomwe. Awa ndi opanga Maluso akunja a Alice, ndiye kuti, ma chatbots opangidwa mmenemo. Wopanga aliyense akhoza kulemba, kuchititsa ndi kulembetsa luso lotere, ndipo kuyambira lero luso silifunikanso kuchitiridwa - ingoyikani ma code awo pamtambo mu mawonekedwe. ntchito yofanana yopanda seva.

Koma pali ma nuances angapo. Choyamba, khodi yanu ya ziweto ingafunike kudalira, ndipo sikophweka kuwakokera mumtambo. Kachiwiri, ma chatbot aliwonse wamba amafunikira kusungitsa momwe zokambiranazo ziliri kwinakwake (zomveka choncho); momwe mungachitire mu ntchito yopanda seva njira yosavuta? Chachitatu, mungalembe bwanji luso lofulumira komanso lodetsa kwa Alice kapena mtundu wina wa bot wokhala ndi chiwembu chopanda zero? Za ma nuances awa, kwenikweni, nkhaniyo.

Kupanga luso lapamwamba la Alice pa ntchito zopanda seva za Yandex.Cloud ndi Python

kukonzekera makhalidwe abwino

Kwa osaleza mtima: Ndimasonkhanitsa zodalira zofunika ndi makefile ndisanatumize ntchitoyi pamtambo, ndimasunga zomwe zili mu Yandex Object Storage (imathandizira S3 API), ndipo ndimagwiritsa ntchito laibulale yanga kuti ndiyang'anire zokambiranazo. tgalice. Zotsatira zake, zimakhala yotero luso la demo. Ndipo tsopano tiyeni tifufuze zonsezi mwatsatanetsatane pang'ono.

Kwa ofooka pang'ono, ndisanalowe mu nkhani yanga yovuta, ndikupangira kuti ndiyambe kuphweka. Mwakutero, pangani fayilo imodzi ya echobot, lembani ndikuyesa mu dialog developer console; zambiri - mu Blog Dialogues и zolemba zamtambo. Ndiyeno pokha poyambira.

Ngati mukufuna kumva zomwe tikumenyera nthawi yomweyo, funsani Alice 'yatsani luso la "IT horoscope"'. Zokambirana zotsatirazi zikuyenera kuchitika:

Alice: Hello! Muli mu luso la "IT horoscope". Nenani "Yambani" kuti mudziwe zomwe nyenyezi zikukulonjezani.
Wogwiritsa: Yambani
Yankho: Chonde tchulani dzina lanu.
Yu: Vasisualy
Yankho: Tsopano ndiuze chaka chimene unabadwa. Manambala anayi okha, palibenso china.
Yu: kachiwiri
A: Chonde yesaninso. Tchulani chaka chimene munabadwa - manambala anayi.
Yu: 2002
A: Zabwino! Tsopano tchulani mwezi umene munabadwa.
Yu: February
A: Zabwino! Pomaliza, ndiuzeni tsiku lanu lobadwa - nambala chabe, manambala amodzi kapena awiri okha.
Yu: 18
A: Zikomo, Vasisual! Tsopano tikudziwa: muli ndi zaka 17 ndipo ndinu Aquarius. Ndinu apa, ndithudi, mwayi! Nyenyezi zimakuuzani а что говорят звёзды, вы узнаете, запустив навык.

Vuto ndiloti kuti mukhalebe ndi zokambirana zosavuta zotere, muyenera kukumbukira dzina ndi tsiku lobadwa kwa wogwiritsa ntchito, ndipo m'malo opanda seva izi sizochepa. Sizigwira ntchito kusunga zomwe zili mu RAM kapena ngati fayilo pa diski, chifukwa Yandex.Cloud imatha kuyendetsa ntchitoyi pamakina angapo nthawi imodzi ndikusintha pakati pawo mosasamala. Muyenera kugwiritsa ntchito mtundu wina wa zosungira zakunja. Object Storage idasankhidwa ngati yosungirako yotsika mtengo komanso yosavuta mwachindunji mu Yandex.Cloud (ndiko kuti, mwina mwachangu). Monga njira yaulere, mutha kuyesa, mwachitsanzo, chidutswa chaulere Cloudy Mongi kwinakwake kutali. Zonse Zosungirako Zinthu (zimathandizira mawonekedwe a S3) ndipo Mongo ali ndi zolembera za Python zosavuta.

Vuto lina ndilakuti kuti mupite ku Object Storage, MongoDB, ndi database ina iliyonse kapena sitolo ya data, mukufunikira zodalira zakunja zomwe muyenera kuziyika ku Yandex Functions pamodzi ndi code yanu. Ndipo ndikufuna kuchita bwino. Ndikoyenera kwathunthu (monga pa heroku), tsoka, sizingagwire ntchito, koma mukhoza kupanga chitonthozo choyambirira mwa kulemba script kuti mumange chilengedwe (pangani fayilo).

Momwe mungayambitsire luso la horoscope

  1. Konzekerani: pitani ku makina ena okhala ndi Linux. M'malo mwake, mutha kugwiranso ntchito ndi Windows, koma ndiye kuti muyenera kulumikizana ndi kukhazikitsidwa kwa makefile. Ndipo mulimonse, mufunika Python yosachepera 3.6.
  2. Clone kuchokera ku github chitsanzo cha luso la horoscope.
  3. Lembani mu Ya.Cloud: https://cloud.yandex.ru
  4. Pangani nokha zidebe ziwiri Kusungirako Zinthu, azitcha dzina lililonse {BUCKET NAME} и tgalice-test-cold-storage (dzina lapakati ili tsopano ndi lolimba main.py chitsanzo changa). Chidebe choyamba chidzangofunika kutumizidwa, chachiwiri - kusunga mayiko a dialog.
  5. kulenga akaunti ya utumiki, amupatse udindo editor, ndikupeza zidziwitso zokhazikika za izo {KEY ID} и {KEY VALUE} - tidzawagwiritsa ntchito kulemba momwe zokambirana zilili. Zonsezi ndizofunikira kuti ntchito yochokera ku Ya.Cloud ikwaniritse zosungirako kuchokera ku Ya.Cloud. Tsiku lina, ndikuyembekeza, chilolezo chidzakhala chodziwikiratu, koma pakadali pano - choncho.
  6. (Ngati mukufuna) khazikitsani lamulo mzere mawonekedwe yc. Mutha kupanganso ntchito kudzera pa intaneti, koma CLI ndiyabwino chifukwa mitundu yonse yazatsopano imawonekera mwachangu.
  7. Tsopano mutha, kwenikweni, kukonzekera kusonkhana kwa zodalira: thamangani pamzere wolamula kuchokera pafoda ndi chitsanzo cha luso make all. Mulu wa malaibulale (makamaka, mwachizolowezi, osafunikira) adzayikidwa mufoda dist.
  8. Lembani ndi zolembera mu Kusungirako Zinthu (mu chidebe {BUCKET NAME}) zosungidwa zomwe zidapezedwa pa sitepe yapitayi dist.zip. Ngati mungafune, mutha kuchitanso izi kuchokera pamzere wolamula, mwachitsanzo, pogwiritsa ntchito AWS CLI.
  9. Pangani ntchito yopanda seva kudzera pa intaneti kapena kugwiritsa ntchito zofunikira yc. Kwa ogwiritsa ntchito, lamulo liziwoneka motere:

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

Mukamapanga pamanja ntchito, magawo onse amadzazidwa mofanana.

Tsopano ntchito yomwe mudapanga ikhoza kuyesedwa kudzera pa developer console, kenako kumalizidwa ndikusindikiza luso.

Kupanga luso lapamwamba la Alice pa ntchito zopanda seva za Yandex.Cloud ndi Python

Zomwe zili pansi pa hood

Makefile ali ndi zolemba zosavuta kukhazikitsa zodalira ndikuziyika muzosungira. dist.zip, chinthu chonga ichi:

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

Zotsalazo ndi zida zingapo zosavuta zitakulungidwa mulaibulale tgalice. Njira yodzaza deta ya ogwiritsa ntchito ikufotokozedwa ndi 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: Пожалуйста, попробуйте ещё раз. Вам нужно назвать число своего рождения (например, двадцатое); это одна или две цифры.

Gulu la python limatenga ntchito yosinthira izi ndikuwerengera zotsatira zomaliza

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

Ndendende, kalasi yoyambira FormFillingDialogManager akugwira ntchito yodzaza "fomu", ndi njira ya kalasi ya mwanayo handle_completed_form amandiuza zoyenera kuchita akakonzeka.

Kuwonjezera pa kutuluka kwakukulu kwa zokambirana za wogwiritsa ntchito, m'pofunikanso kupereka moni kwa wogwiritsa ntchito, komanso kupereka chithandizo pa lamulo la "thandizo" ndikumasula luso pa lamulo la "kutuluka". Za izi mu tgalice palinso template, kotero woyang'anira zokambirana ali ndi zidutswa:

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 imagwira ntchito mophweka: imayesa kugwiritsa ntchito momwe zokambirana zilili panopa zigawo zake zonse, ndikusankha yoyamba yoyenera.

Monga yankho ku uthenga uliwonse, woyang'anira zokambirana amabwezera chinthu cha python Response, yomwe imatha kusinthidwa kukhala mawu omveka bwino, kapena uthenga mu Alice kapena Telegalamu - kutengera komwe bot ikuyendetsa; ilinso ndi kusintha kwa zokambirana zomwe zikuyenera kusungidwa. Khitchini yonseyi imayendetsedwa ndi kalasi ina, DialogConnector, kotero zolemba zachindunji zoyambira luso pa Yandex Functions zikuwoneka motere:

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

Monga mukuwonera, zambiri mwa code iyi zimapanga kulumikizana ndi mawonekedwe a Object Storage S3. Momwe kugwirizana uku kumagwiritsidwira ntchito mwachindunji, mukhoza kuwerenga pa tgalice kodi.
Mzere womaliza umapanga ntchito alice_handler - yomwe tidalamula kukoka Yandex.Cloud tikayika chizindikiro --entrypoint=main.alice_handler.

Ndizo zonse. Makefiles omanga, S3-ngati Object Storage posungira nkhani, ndi laibulale ya python tgalice. Pamodzi ndi mawonekedwe opanda seva komanso kufotokozera kwa python, izi ndizokwanira kukulitsa luso la munthu wathanzi.

Mutha kufunsa chifukwa chake muyenera kupanga tgalice? Ma code onse otopetsa omwe amasamutsa ma JSONs kuchokera ku pempho kupita ku mayankho komanso kuchokera ku yosungirako kupita kumtima ndikubwereranso ali mmenemo. Palinso ntchito yokhazikika, ntchito yomvetsetsa kuti "February" ikufanana ndi "February", ndi NLU ina kwa osauka. Malinga ndi lingaliro langa, izi ziyenera kukhala zokwanira kale kuti muzitha kujambula ma prototypes mumafayilo a yaml popanda kusokonezedwa ndi zambiri zaukadaulo.

Ngati mukufuna NLU yovuta kwambiri, mutha kuyipotoza ku luso lanu Lawani kapena DeepPavlov, koma kuwakhazikitsa kudzafunika kuvina kowonjezereka ndi maseche, makamaka osagwiritsa ntchito seva. Ngati simukufuna kukopera konse, muyenera kugwiritsa ntchito mawonekedwe opangira Aimylogic. Popanga tgalice, ndimaganiza za njira yapakatikati. Tiyeni tione zimene zimachitika.

Chabwino, tsopano lowani Aliy luso lopanga macheza, werengani zolembandi kulenga zodabwitsa luso!

Source: www.habr.com

Kuwonjezera ndemanga