Эҷоди маҳорати давлатӣ барои Алиса дар функсияҳои бе сервери Yandex.Cloud ва Python

Биёед бо хабарҳо оғоз кунем. Дирӯз Yandex.Cloud дар бораи оғози хидмати компютерии бидуни сервер эълон кард Функсияҳои абрии Yandex. Ин чунин маъно дорад: шумо танҳо рамзи хидмати худро менависед (масалан, веб-барнома ё чатбот) ва худи Абр мошинҳои виртуалиро дар ҷое, ки кор мекунад, эҷод ва нигоҳ медорад ва ҳатто ҳангоми зиёд шудани сарборӣ онҳоро такрор мекунад. Шумо умуман фикр кардан лозим нест, ин хеле қулай аст. Ва пардохт танҳо барои вақти ҳисобҳо меравад.

Бо вуҷуди ин, баъзе одамон метавонанд умуман пардохт накунанд. Инҳо таҳиягарон мебошанд Маҳорати берунии Алис, яъне чатботҳои дар он сохташуда. Ҳар як таҳиягар метавонад чунин маҳоратро нависад, мизбон ва сабти ном кунад ва аз имрӯз маҳоратҳо ҳатто лозим нест, ки мизбон шаванд - танҳо рамзи худро дар шакли абр бор кунед ҳамон функсияи бе сервер.

Аммо якчанд нозукиҳо вуҷуд доранд. Аввалан, рамзи ҳайвоноти шумо метавонад баъзе вобастагиҳоро талаб кунад ва кашонидани онҳо ба Абр ночиз нест. Сониян, ҳар як чатботи муқаррарӣ бояд ҳолати муколамаро дар ҷое нигоҳ дорад (аз ин рӯ, ҳолати он); Чӣ тавр онро дар функсияи бе сервер бо роҳи осонтарин иҷро кардан мумкин аст? Сеюм, чӣ гуна шумо метавонед як маҳорати зуд ва ифлосро барои Алис ё ҳатто як намуди бот бо қитъаи ғайри сифр нависед? Дар бораи ин нозукиҳо, дар асл, мақола.

Эҷоди маҳорати давлатӣ барои Алиса дар функсияҳои бе сервери Yandex.Cloud ва Python

тайёрии маънавй

Барои бесабр: Ман пеш аз бор кардани функсия ба абр вобастагии заруриро бо makefile ҷамъ мекунам, ҳолати муколамаро дар анбори объекти Yandex нигоҳ медорам (он S3 API-ро дастгирӣ мекунад) ва ман китобхонаи шахсии худро барои идоракунии муколама истифода мекунам tgalice. Дар натича маълум мешавад чунин маҳорати намоишӣ. Ва ҳоло биёед ҳамаи инро каме муфассалтар таҳлил кунем.

Барои онҳое, ки каме сабр надоранд, пеш аз ғарқ шудан ба достони ман дар бораи мураккабӣ, ман тавсия медиҳам, ки оддӣ оғоз кунед. Махз, функсияи як файли echobot эҷод кунед, онро дар консоли таҳиягари Dialog сабти ном кунед ва санҷед; тафсилот - дар Муколамаҳои блог и ҳуҷҷатҳои абрӣ. Ва танҳо пас оғоз кунед.

Агар шумо хоҳед, ки дарҳол эҳсос кунед, ки мо барои чӣ мубориза мебарем, аз Алис пурсед.малакаи "гороскопи IT" -ро фаъол созед'. Муколамаи зерин бояд сурат гирад:

Алис: Салом! Шумо дар маҳорати "гороскопи IT" ҳастед. "Оғоз" бигӯед, то бидонед, ки ситораҳо ба шумо чӣ ваъда медиҳанд.
Истифодабаранда: Оғоз
A: Лутфан номи худро баён кунед.
Ю: Васисуали
Ҷавоб: Ҳоло ба ман соли таваллудатро бигӯ. Танҳо чор рақам, дигар чизе нест.
Ю: дуюм
A: Лутфан бори дигар кӯшиш кунед. Соли таваллудатонро қайд кунед - чор рақам.
Ю: 2002
A: Аҷоиб! Акнун моҳи таваллудатонро номбар кунед.
Ю: февраль
A: Аҷоиб! Дар охир, ба ман санаи таваллуди худро бигӯед - танҳо як рақам, танҳо як ё ду рақам.
Ю: 18
A: Ташаккур, Васисуал! Акнун мо медонем: шумо 17-солаед ва шумо Далв ҳастед. Дар ин ҷо шумо, албатта, хушбахт ҳастед! Ситораҳо ба шумо мегӯянд а что говорят звёзды, вы узнаете, запустив навык.

Мушкилот дар он аст, ки ҳатто барои нигоҳ доштани чунин муколамаи оддӣ, шумо бояд ном ва санаи таваллуди корбарро дар хотир нигоҳ доред ва дар муҳити бе сервер ин чизи ночиз нест. Он барои нигоҳ доштани контекст дар RAM ё ҳамчун файл дар диск кор намекунад, зеро Yandex.Cloud метавонад ин функсияро дар як вақт дар якчанд мошини виртуалӣ иҷро кунад ва дар байни онҳо худсарона гузаред. Шумо бояд як намуди нигаҳдории берунаро истифода баред. Анбори объект ҳамчун як нигаҳдории хеле арзон ва оддӣ бевосита дар Yandex.Cloud интихоб карда шуд (яъне, эҳтимолан зуд). Ҳамчун алтернативаи ройгон, шумо метавонед, масалан, як порчаи ройгонро санҷед Монги абрнок дар ҷое дур. Ҳам Object Storage (он интерфейси S3-ро дастгирӣ мекунад) ва ҳам Mongo дорои парпечҳои қулай Python мебошанд.

Мушкилоти дигар дар он аст, ки барои ворид шудан ба Объектҳо, MongoDB ва ҳама гуна дигар пойгоҳи додаҳо ё мағозаи додаҳо, ба шумо вобастагии беруна лозим аст, ки ба шумо лозим аст, ки ба Яндекс Функсияҳо ҳамроҳ бо рамзи функсияи худ бор кунед. Ва ман мехоҳам, ки ин корро бароҳат иҷро кунам. Ин комилан қулай аст (ба монанди дар heroku), мутаассифона, он кор намекунад, аммо шумо метавонед бо навиштани скрипт барои сохтани муҳити зист (файл созед) каме бароҳатии асосӣ эҷод кунед.

Чӣ тавр оғоз кардани маҳорати гороскопи

  1. Тайёр шавед: ба ягон мошин бо Linux равед. Аслан, шумо эҳтимол метавонед бо Windows низ кор кунед, аммо пас шумо бояд бо оғози файли makefile тасаввур кунед. Ва дар ҳар сурат, ба шумо ҳадди аққал 3.6 Python насбшуда лозим аст.
  2. Клон аз github намунаи маҳорати гороскопи.
  3. Дар Ya.Cloud сабти ном кунед: https://cloud.yandex.ru
  4. Дар худ ду сатил эҷод кунед Нигоҳдории ашё, онҳоро бо ягон ном даъват кунед {BUCKET NAME} и tgalice-test-cold-storage (ин номи миёна ҳоло сахт рамзгузорӣ шудааст main.py мисоли ман). Сатили аввал танҳо барои ҷойгиркунӣ лозим аст, дуюм - барои нигоҳ доштани ҳолати муколама.
  5. Эҷод кунед ҳисоби хидматрасонӣ, ба у роль дихед editor, ва барои он маълумоти статикӣ гиред {KEY ID} и {KEY VALUE} — мо онхоро барои кайд кардани вазъияти муколама истифода мебарем. Ҳамаи ин барои он лозим аст, ки функсияи Ya.Cloud ба нигаҳдории Ya.Cloud дастрасӣ пайдо кунад. Рӯзе, ман умедворам, авторизатсия автоматӣ мешавад, аммо ҳоло - ҳамин тавр.
  6. (Ихтиёрӣ) насб кунед интерфейси сатри фармон yc. Шумо инчунин метавонед тавассути веб-интерфейс функсия эҷод кунед, аммо CLI хуб аст, зеро ҳама навъҳои навовариҳо дар он зудтар пайдо мешаванд.
  7. Акнун шумо метавонед, воқеан, маҷмӯи вобастагиҳоро омода кунед: дар сатри фармон аз ҷузвдон бо намунаи маҳорат иҷро кунед make all. Дар папка як даста китобхонаҳо (асосан, одатан, нолозим) насб карда мешаванд. dist.
  8. Бо қаламҳоро ба анбори объект пур кунед (ба сатил {BUCKET NAME}) бойгоние, ки дар қадами қаблӣ гирифта шудааст dist.zip. Агар хоҳед, шумо инчунин метавонед инро аз сатри фармон иҷро кунед, масалан, бо истифода аз AWS CLI.
  9. Тавассути интерфейси веб ё бо истифода аз утилита функсияи бе сервер эҷод кунед yc. Барои утилита, фармон чунин хоҳад буд:

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

Ҳангоми ба таври дастӣ эҷод кардани функсия, ҳама параметрҳо ҳамон тавр пур карда мешаванд.

Акнун функсияи эҷодкардаи шумо метавонад тавассути консоли таҳиякунанда санҷида шавад ва сипас маҳорати ба итмом расонидашуда нашр карда шавад.

Эҷоди маҳорати давлатӣ барои Алиса дар функсияҳои бе сервери Yandex.Cloud ва Python

Дар зери сарпӯш чӣ аст

Дар makefile воқеан як скрипти хеле содда барои насб кардани вобастагӣ ва гузоштани онҳо ба бойгонӣ иборат аст. dist.zip, чизе монанди ин:

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

Боқимонда чанд асбоби оддиест, ки дар китобхона печонида шудаанд tgalice. Раванди пур кардани маълумоти корбарро конфигуратсия тавсиф мекунад 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: Пожалуйста, попробуйте ещё раз. Вам нужно назвать число своего рождения (например, двадцатое); это одна или две цифры.

Синфи python кори таҳлили ин конфигуратсия ва ҳисоб кардани натиҷаи ниҳоиро ба ӯҳда мегирад

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

Аниқтараш, синфи асосӣ FormFillingDialogManager бо пур кардани «форма» машгул аст ва усули бачаго-наи синф handle_completed_form мегӯяд, ки ҳангоми омода шудан чӣ кор кардан лозим аст.

Илова бар ин ҷараёни асосии муколамаи корбар, инчунин ба корбар салом додан, инчунин додани кӯмак аз рӯи фармони "кӯмак" ва аз маҳорат дар фармони "хуруҷ" озод кардан лозим аст. Барои ин дар tgalice Шаблон низ вуҷуд дорад, бинобар ин тамоми мудири муколама аз қисмҳо иборат аст:

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 оддй кор мекунад: вай кушиш мекунад, ки ба вазъияти хозираи муколама хамаи кисмхои онро бо навбат татбик намояд ва аввалин мувофикро интихоб мекунад.

Ҳамчун посух ба ҳар як паём, мудири муколама объекти python -ро бармегардонад Response, ки пас аз он метавонад ба матни оддӣ ё ба паём дар Алис ё Telegram табдил дода шавад - вобаста аз он ки бот дар куҷо кор мекунад; он инчунин ҳолати тағирёфтаи муколамаро дар бар мегирад, ки бояд захира карда шавад. Ҳамаи ин ошхонаро синфи дигар идора мекунад, DialogConnector, бинобар ин скрипти мустақим барои оғоз кардани малака дар Функсияҳои 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

Тавре ки шумо мебинед, аксари ин рамз пайвастшавӣ ба интерфейси Object Storage S3 эҷод мекунад. Чӣ тавр ин пайвастшавӣ бевосита истифода мешавад, шумо метавонед хонед дар рамзи tgalice.
Сатри охирин функсия эҷод мекунад alice_handler - он чизе, ки мо фармон додем, ки ҳангоми насб кардани параметр Yandex.Cloud-ро кашем --entrypoint=main.alice_handler.

Дар асл, ҳамааш ҳамин аст. Makefiles барои сохтмон, нигаҳдории ба монанди S3 объект барои нигаҳдории контекст ва китобхонаи python tgalice. Якҷоя бо хусусиятҳои бе сервер ва ифоданокии python, ин барои рушди маҳорати шахси солим кофӣ аст.

Шумо метавонед пурсед, ки чаро шумо бояд эҷод кунед tgalice? Ҳама рамзи дилгиркунанда, ки JSON-ро аз дархост ба ҷавоб ва аз анбор ба хотира ва бозгашт интиқол медиҳад, дар он ҷойгир аст. Инчунин як барномаи муқаррарӣ мавҷуд аст, ки функсия барои фаҳмидани он, ки "феврал" ба "феврал" монанд аст ва дигар NLU барои камбизоатон. Ба андешаи ман, ин бояд аллакай кофӣ бошад, то тавонанд прототипҳои маҳоратро дар файлҳои yaml бидуни парешон аз тафсилоти техникӣ кашола кунанд.

Агар шумо хоҳед, ки NLU-и ҷиддитаре дошта бошед, шумо метавонед онро ба маҳорати худ буред Раса ё ДепПавлов, аммо насб кардани онҳо рақси иловагиро бо танбур талаб мекунад, махсусан дар серверҳои бе сервер. Агар шумо тамоман рамзгузорӣ карданро ҳис накунед, шумо бояд конструктори намуди визуалиро истифода баред Aimylogic. Ҳангоми эҷоди tgalice, ман дар бораи як роҳи мобайнӣ фикр мекардам. Биёед бубинем, ки чӣ мешавад.

Хуб, акнун ҳамроҳ шавед Чати таҳиягари малакаҳои Aliyхонед ҳуҷҷатҳова аҷиб эҷод кунед маҳорат!

Манбаъ: will.com

Илова Эзоҳ