Креирање вештине стања за Алис на функцијама Иандек.Цлоуд и Питхон без сервера

Почнимо са вестима. Јуче је Иандек.Цлоуд најавио покретање рачунарске услуге без сервера Иандек Цлоуд функције. То значи: пишете само код своје услуге (на пример, веб апликација или цхатбот), а сам Цлоуд креира и одржава виртуелне машине тамо где ради, па чак и реплицира их ако се оптерећење повећа. Уопште не морате да размишљате, веома је згодно. А плаћање иде само за време обрачуна.

Међутим, неки људи можда уопште не плаћају. Ово су програмери Алисине спољне вештине, односно у њега уграђени цхат ботови. Сваки програмер може да напише, угости и региструје такву вештину, а од данас вештине не морају ни да буду хостоване – само отпремите њихов код у облак у форми исту функцију без сервера.

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

Креирање вештине стања за Алис на функцијама Иандек.Цлоуд и Питхон без сервера

морална припрема

За нестрпљиве: прикупљам неопходне зависности помоћу макефиле-а пре него што отпремим функцију у облак, чувам стање дијалога у Иандек Објецт Стораге-у (подржава С3 АПИ) и користим сопствену библиотеку за управљање дијалогом тгалице. Као резултат тога, испоставља се такав демо вештина. А сада да анализирамо све ово мало детаљније.

За оне мало мање нестрпљиве, пре него што зароне у моју причу о сложености, топло препоручујем да почну једноставно. Наиме, креирајте ецхобот функцију са једном датотеком, региструјте је и тестирајте је у конзоли за програмере Диалог; детаљи - у Блог Диалогуес и документација у облаку. И тек онда почните.

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

Алиса: Здраво! Налазите се у вештини "ИТ хороскоп". Реците "Почни" да бисте сазнали шта вам звезде обећавају.
Корисник: Старт
О: Молимо наведите своје име.
Иу: Васисуали
О: Сада ми реци годину свог рођења. Само четири цифре, ништа више.
Ју: друго
О: Покушајте поново. Наведите годину свог рођења - четири цифре.
Ју: 2002
Велика! Сада назовите месец свог рођења.
Иу: Фебруар
О: Одлично! На крају, реците ми свој датум рођења - само број, само једну или две цифре.
Ју: 18
О: Хвала, Васисуал! Сада знамо: имаш 17 година и ти си Водолија. Овде сте, наравно, срећни! Звезде ти говоре а что говорят звёзды, вы узнаете, запустив навык.

Проблем је у томе што да бисте одржали чак и тако једноставан дијалог, морате запамтити име и датум рођења корисника, а у окружењу без сервера то није тривијално. Неће радити чување контекста у РАМ-у или као фајл на диску, јер Иандек.Цлоуд може истовремено покренути функцију на неколико виртуелних машина и произвољно се пребацивати између њих. Мораћете да користите неку врсту спољне меморије. Складиште објеката је изабрано као прилично јефтино и једноставно складиште директно у Иандек.Цлоуд (то јест, вероватно брзо). Као бесплатну алтернативу, можете испробати, на пример, бесплатан комад Цлоуди Монги негде далеко. И Објецт Стораге (подржава С3 интерфејс) и Монго имају згодне омоте за Питхон.

Други проблем је у томе што да бисте отишли ​​у складиште објеката, МонгоДБ и било коју другу базу података или складиште података, потребне су вам неке спољне зависности које морате да отпремите у Иандек функције заједно са кодом функције. И волео бих да то радим удобно. Потпуно је згодно (као на хероку), нажалост, неће радити, али можете створити основну удобност тако што ћете написати скрипту за изградњу окружења (направити датотеку).

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

  1. Спремите се: идите на неку машину са Линуком. У принципу, вероватно можете да радите и са Виндовс-ом, али онда морате да дочарате покретањем макефиле-а. У сваком случају, биће вам потребно најмање 3.6 инсталиран Питхон.
  2. Клон са гитхуб-а пример вештине хороскопа.
  3. Региструјте се у Иа.Цлоуд: https://cloud.yandex.ru
  4. Направите себи две канте Објецт Стораге, назовите их било којим именом {BUCKET NAME} и tgalice-test-cold-storage (ово средње име је сада тврдо кодирано у main.py мој пример). Прва канта ће бити потребна само за примену, друга - за чување стања дијалога.
  5. створити сервисни налог, дајте му улогу editor, и добијете статичке акредитиве за то {KEY ID} и {KEY VALUE} - користићемо их за снимање стања дијалога. Све ово је потребно да би функција из Иа.Цлоуд-а могла да приступи складишту са Иа.Цлоуд-а. Једног дана, надам се, ауторизација ће постати аутоматска, али за сада - тако.
  6. (Опционално) инсталирајте интерфејс командне линије yc. Функцију можете креирати и преко веб интерфејса, али ЦЛИ је добар јер се у њему брже појављују све врсте иновација.
  7. Сада можете, заправо, припремити склоп зависности: покрените на командној линији из фасцикле са примером вештине make all. Гомила библиотека (углавном, као и обично, непотребних) ће бити инсталирана у фасциклу dist.
  8. Напуните оловкама у Складиште објеката (у канту {BUCKET NAME}) архиву добијену у претходном кораку dist.zip. Ако желите, то можете урадити и из командне линије, на пример, користећи АВС ЦЛИ.
  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

Када ручно креирате функцију, сви параметри се попуњавају на исти начин.

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

Креирање вештине стања за Алис на функцијама Иандек.Цлоуд и Питхон без сервера

Шта је испод хаубе

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

Класа питхон преузима посао рашчлањивања ове конфигурације и израчунавања коначног резултата

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 ради једноставно: покушава да примени на тренутно стање дијалога све његове компоненте редом, и бира прву релевантну.

Као одговор на сваку поруку, менаџер дијалога враћа Питхон објекат Response, који се затим може претворити у обичан текст, или у поруку у Алице или Телеграму - у зависности од тога где бот ради; садржи и измењено стање дијалога које треба сачувати. Сву ову кухињу води друга класа, DialogConnector, тако да директна скрипта за покретање вештине на Иандек функцијама изгледа овако:

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

Као што видите, већина овог кода ствара везу са интерфејсом Објецт Стораге С3. Како се ова веза директно користи, можете прочитати у тгалице код.
Последњи ред креира функцију alice_handler - онај који смо наредили да повуче Иандек.Цлоуд када смо поставили параметар --entrypoint=main.alice_handler.

То је, у ствари, све. Маке-датотеке за прављење, складиште објеката налик С3 за складиштење контекста и питхон библиотека tgalice. Заједно са карактеристикама без сервера и експресивношћу питона, ово је довољно да се развије вештина здраве особе.

Можете питати зашто морате да креирате tgalice? Сав досадан код који преноси ЈСОН-ове од захтева до одговора и од складишта до меморије и назад лежи у њему. Постоји и редовна апликација, функција за разумевање да је „фебруар“ сличан „фебруару“, и други НЛУ за сиромашне. По мојој идеји, ово би већ требало да буде довољно да се могу скицирати прототипови вештина у иамл фајловима без превише ометања техничким детаљима.

Ако желите озбиљнији НЛУ, можете га уврнути у своју вештину Раса или ДеепПавлов, али њихово постављање ће захтевати додатно играње уз тамбуру, посебно на серверу без сервера. Ако уопште не желите да кодирате, требало би да користите конструктор визуелног типа Аимилогиц. При стварању тгалице размишљао сам о некој врсти међупута. Хајде да видимо шта се дешава.

Па, сад се придружи Алии скиллс програмер ћаскање, читати документацијаи стварају невероватно вештине!

Извор: ввв.хабр.цом

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