Yandex.Cloud және Python серверсіз функцияларында Алиса үшін жағдайды білу дағдысын жасау

Жаңалықтан бастайық. Кеше Yandex.Cloud серверсіз есептеу сервисінің іске қосылғанын хабарлады Яндекс бұлтты функциялары. Бұл дегеніміз: сіз тек қызметіңіздің кодын жазасыз (мысалы, веб-бағдарлама немесе чат бот), және бұлттың өзі жұмыс істейтін жерде виртуалды машиналарды жасайды және оларға қызмет көрсетеді, тіпті жүктеме артқан жағдайда оларды қайталайды. Мүлдем ойланудың қажеті жоқ, бұл өте ыңғайлы. Ал төлем тек есеп айырысу уақытына ғана кетеді.

Дегенмен, кейбір адамдар мүлде төлемеуі мүмкін. Бұл әзірлеушілер Алисаның сыртқы дағдылары, яғни оған орнатылған чат-боттар. Кез келген әзірлеуші ​​мұндай дағдыны жаза алады, орналастырады және тіркей алады және бүгіннен бастап дағдыларды орналастырудың қажеті жоқ — жай ғана өз кодын пішінде бұлтқа жүктеп салыңыз. бірдей серверсіз функция.

Бірақ бірнеше нюанстар бар. Біріншіден, сіздің үй жануарларыңыздың коды кейбір тәуелділіктерді қажет етуі мүмкін және оларды бұлтқа апару маңызды емес. Екіншіден, кез келген қалыпты чатбот диалогтың күйін бір жерде сақтауы керек (сондықтан күйі); оны серверсіз функцияда қалай оңай жасауға болады? Үшіншіден, Алиса үшін жылдам және лас дағдыны немесе тіпті нөлдік емес сюжеті бар қандай да бір бот түрін қалай жазуға болады? Бұл нюанстар туралы, шын мәнінде, мақала.

Yandex.Cloud және Python серверсіз функцияларында Алиса үшін жағдайды білу дағдысын жасау

моральдық дайындық

Шыдамағандар үшін: Функцияны бұлтқа жүктеп салмас бұрын мен қажетті тәуелділіктерді makefile арқылы жинаймын, диалогтың күйін Яндекс нысандар қоймасында сақтаймын (ол S3 API интерфейсін қолдайды) және диалогты басқару үшін өз кітапханамды пайдаланамын. tgalice. Нәтижесінде, бұл шығады мұндай демо шеберлігі. Ал енді осының бәрін аз-кем талдап көрейік.

Сәл шыдамсыз адамдар үшін, менің күрделілік туралы әңгімеме кіріспес бұрын, мен қарапайымдылықтан бастауды ұсынамын. Атап айтқанда, бір файлдық echobot функциясын жасаңыз, оны Dialog әзірлеуші ​​консолінде тіркеңіз және тексеріңіз; мәліметтер - в Блог диалогтары и бұлттық құжаттама. Содан кейін ғана бастаңыз.

Егер сіз біздің не үшін күресіп жатқанымызды бірден сезінгіңіз келсе, Алисадан сұраңыз.«IT гороскоп» дағдысын қосыңыз'. Келесі диалог болуы керек:

Алиса: Сәлем! Сіз «IT гороскоп» шеберлігіндесіз. Жұлдыздар сізге не уәде ететінін білу үшін «Бастау» деп айтыңыз.
Қолданушы: Бастау
Ж: Аты-жөніңізді көрсетіңіз.
Ю: Васисуалы
Ж: Енді маған туған жылыңды айт. Тек төрт сан, басқа ештеңе жоқ.
Ю: екінші
A: Қайталап көріңіз. Туған жылыңызды көрсетіңіз - төрт сан.
Ю: 2002 ж
A: Тамаша! Енді туған айыңызды атаңыз.
Ю: ақпан
A: Керемет! Соңында маған туған күніңізді айтыңыз - тек сан, бір немесе екі цифр ғана.
Ю: 18 ж
A: Рахмет Василий! Енді біз білеміз: сіз 17 жастасыз және сіз суқұйғышсыз. Міне, сіз, әрине, бақыттысыз! Жұлдыздар айтады а что говорят звёзды, вы узнаете, запустив навык.

Мәселе мынада, тіпті осындай қарапайым диалогты сақтау үшін пайдаланушының аты мен туған күнін есте сақтау керек, ал серверсіз ортада бұл маңызды емес. Ол мәтінмәнді жедел жадта немесе дискідегі файл ретінде сақтау үшін жұмыс істемейді, себебі Yandex.Cloud бұл функцияны бір уақытта бірнеше виртуалды машиналарда іске қосып, олардың арасында еркін ауыса алады. Сізге сыртқы жадтың қандай да бір түрін пайдалану керек болады. Object Storage тікелей Yandex.Cloud жүйесінде өте арзан және қарапайым сақтау орны ретінде таңдалды (яғни, жылдам). Тегін балама ретінде, мысалы, тегін бөлікті көруге болады Бұлтты Монги алыс жерде. Object Storage (ол S3 интерфейсін қолдайды) және Mongo-да ыңғайлы Python орауыштары бар.

Тағы бір мәселе - Object Storage, MongoDB және кез келген басқа дерекқорға немесе деректер қоймасына өту үшін сізге функция кодымен бірге Яндекс функцияларына жүктеп салу қажет кейбір сыртқы тәуелділіктер қажет. Ал мен мұны ыңғайлы түрде жасағым келеді. Бұл мүлдем ыңғайлы (герокудағы сияқты), өкінішке орай, ол жұмыс істемейді, бірақ ортаны құру (файл жасау) үшін сценарий жазу арқылы кейбір қарапайым жайлылықты жасауға болады.

Жұлдызнама шеберлігін қалай бастау керек

  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, содан кейін оны қарапайым мәтінге немесе Alice немесе 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 тәрізді нысан қоймасы және питон кітапханасы tgalice. Питонның серверсіз мүмкіндіктері мен экспрессивтілігімен бірге бұл сау адамның шеберлігін дамыту үшін жеткілікті.

Сіз не үшін жасау керек деп сұрауыңыз мүмкін tgalice? JSON файлдарын сұраудан жауапқа, жадтан жадқа және кері тасымалдайтын барлық скучно код онда жатыр. Сондай-ақ тұрақты өрнек қолданбасы, «ақпанның» «ақпанға» ұқсас екенін түсінуге арналған функция және кедейлерге арналған басқа NLU бар. Менің ойым бойынша, бұл техникалық мәліметтерге тым алаңдамай, yaml файлдарында шеберліктің прототиптерін сызу үшін жеткілікті болуы керек.

Егер сіз әлдеқайда маңызды NLU алғыңыз келсе, оны өз шеберлігіңізге бұра аласыз Раса немесе Терең Павлов, бірақ оларды орнату бубенмен қосымша биді қажет етеді, әсіресе серверсіз. Егер кодтауды мүлде қаламасаңыз, визуалды түр конструкторын пайдалануыңыз керек Аймилогиялық. Tgalice құру кезінде мен қандай да бір аралық жол туралы ойладым. Не болатынын көрейік.

Ал, енді қосылыңыз Aliy дағдыларын дамытушы чатыоқыңыз құжаттамажәне таң қалдырыңыз дағдылар!

Ақпарат көзі: www.habr.com

пікір қалдыру