Создавање државна вештина за Алис на функциите без сервер на Yandex.Cloud и Python

Да почнеме со вестите. Вчера Yandex.Cloud го објави лансирањето на компјутерска услуга без сервер Функции на облакот Yandex. Ова значи: вие го пишувате само кодот за вашата услуга (на пример, веб-апликација или чет-бот), а самиот Cloud ги создава и одржува виртуелните машини каде што работи, па дури и ги реплицира ако се зголеми оптоварувањето. Воопшто не треба да размислувате, тоа е многу погодно. А плаќањето е само за времето на пресметка.

Сепак, некои можеби нема да платат воопшто. Ова се програмерите Надворешните вештини на Алис, односно чет-ботови вградени во него. Секој развивач може да напише, хостира и регистрира таква вештина, а од денес вештините не треба ни да се хостираат - само прикачете го нивниот код во облакот во форма истата функција без сервер.

Но, постојат неколку нијанси. Прво, вашиот пит-код може да бара некои зависности, а нивното влечење во Облакот е нетривијално. Второ, секој нормален чет-бот треба некаде да ја зачува состојбата на дијалогот (затоа, несомнено); Кој е најлесниот начин да го направите ова во функција без сервер? Трето, како можете да напишете брза и валкана вештина за Алис или дури и некој вид бот со заговор не-нулта? Написот е, всушност, за овие нијанси.

Создавање државна вештина за Алис на функциите без сервер на Yandex.Cloud и Python

Морална подготовка

За нетрпеливите: ги собирам потребните зависности со мејкфајл пред да ја подигнам функцијата во облакот, ја складирам состојбата на дијалогот во Yandex Object Storage (го поддржува S3 API) и користам сопствена библиотека за управување со дијалогот тгалице. На крајот излегува како демо вештина. Сега да го разгледаме сето ова малку подетално.

За оние кои се малку помалку нетрпеливи, пред да се фрлам во мојата приказна за сложеноста, топло препорачувам да започнат со нешто едноставно. Имено, креирајте функција echobot со една датотека, регистрирајте ја и тестирајте ја во програмерската конзола Dialogs; детали - во Блог за дијалози и Облак документација. И само тогаш започнете.

Ако сакате веднаш да почувствувате за што се бориме овде, прашајте ја Алис.овозможете ја вештината „ИТ хороскоп“.'. Треба да се појави дијалог сличен на следниот:

Алис: Здраво! Вие сте во вештината „ИТ хороскоп“. Кажете „Start“ за да дознаете што ви ветуваат ѕвездите.
Корисник: Почеток
О: Ве молиме наведете го вашето име
Ју: Васисуалиј
О: Сега кажи ми ја годината на твоето раѓање. Само четири цифри, ништо дополнително.
Ју: второ
О: Ве молиме обидете се повторно. Внесете ја годината на вашето раѓање - четири цифри.
Ју: 2002 година
Голем! Сега именете го вашиот месец на раѓање.
Ју: февруари
Голем! Конечно, кажете ми го вашиот датум на раѓање - само број, само една или две цифри.
Ју: 18 година
О: Ви благодарам, Васисуалиј! Сега знаеме: имате 17 години и сте Водолија. Па, се разбира, имате среќа! Ѕвездите ви кажуваат: а что говорят звёзды, вы узнаете, запустив навык.

Проблемот е што за да одржите дури и таков едноставен дијалог, треба да го запомните името на корисникот и датумот на раѓање, а во функционална средина без сервер ова е нетривијално. Нема да биде можно да се зачува контекстот во RAM меморија или како датотека на дискот, бидејќи Yandex.Cloud може да изврши функција на неколку виртуелни машини во исто време и да се префрла меѓу нив по желба. Ќе мора да користите некој вид надворешно складирање. Складирањето на објекти беше избрано како прилично евтино и некомплицирано складирање директно во Yandex.Cloud (т.е. веројатно брзо). Како бесплатна алтернатива, можете да пробате, на пример, бесплатно парче Облачна Монга некаде далеку. Постојат практични обвивки за Python и за складирање на објекти (го поддржува интерфејсот S3) и за Mongo.

Друг проблем е што за да пристапите до Object Storage, MongoDB и која било друга база на податоци или продавница за податоци, потребни ви се некои надворешни зависности што треба да се прикачат на Yandex Functions заедно со вашиот функционален код. И јас би сакал да го направам ова погодно. За жал, нема да биде целосно погодно (како на Хероку), но може да се создаде некоја основна удобност со пишување скрипта за да се изгради околината (направи датотека).

Како да започнете вештина за хороскоп

  1. Подгответе се: одете на некоја машина со Linux. Во принцип, веројатно можете да работите и со Виндоус, но тогаш ќе треба да направите некоја магија со лансирањето на мајкетајлот. И во секој случај, ќе ви треба најмалку инсталиран Python 3.6.
  2. Клонирајте го од Github пример за вештина за хороскоп.
  3. Регистрирајте се во Y.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. Рачно истурете во Object Storage (во корпата {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

Што има под хаубата

Фајл-датотеката всушност содржи прилично едноставна скрипта за инсталирање зависности и нивно ставање во архива 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, кој потоа може да се претвори во обичен текст или во порака во Alice или Telegram - во зависност од тоа каде работи ботот; ја содржи и променетата состојба на дијалогот што треба да се зачува. Целата оваа кујна ја управува друга класа, DialogConnector, така што директната скрипта за лансирање вештина на Yandex Functions изгледа вака:

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

Како што можете да видите, поголемиот дел од овој код создава врска со интерфејсот S3 на Object Storage. Можете да прочитате како директно се користи оваа врска во tgalice код.
Последната линија ја креира функцијата alice_handler — истиот што му кажавме на Yandex.Cloud да го повлече кога ќе го поставиме параметарот --entrypoint=main.alice_handler.

Тоа е се, всушност. Make-датотеки за склопување, складирање на објекти слични на S3 за складирање контекст и библиотека на Python tgalice. Во комбинација со функциите без сервер и експресивноста на Python, ова е доволно за да се развие здрава човечка вештина.

Можеби ќе прашате зошто беше потребно да се создаде tgalice? Целиот здодевен код што пренесува JSON од барање до одговор и од складирање до меморија и назад лежи во него. Постои и редовна апликација за кодови, функција за разбирање дека „февруари“ е сличен на „февруари“ и други NLU за сиромашните. Според мојата идеја, ова веќе треба да биде доволно за да можете да скицирате прототипови на вештини во датотеките yaml без да бидете премногу расеан од техничките детали.

Ако сакате посериозен NLU, можете да го прикачите на вашата вештина Раса или Дип Павлов, но нивното поставување ќе бара дополнителни танци со тамбура, особено на без сервер. Ако воопшто не сакате да кодирате, треба да користите визуелен конструктор како Аимилогички. Кога создавав tgalice, размислував за некој вид на среден пат. Ајде да видиме што ќе излезе од ова.

Па, сега приклучи се Разговор за програмери на алис вештини, прочитајте документација, и создадете прекрасни вештини!

Извор: www.habr.com

Додадете коментар