Ալիսի համար պետական ​​հմտության ստեղծում՝ օգտագործելով Yandex.Cloud-ի և Python-ի առանց սերվերի գործառույթները

Սկսենք նորություններից։ Երեկ Yandex.Cloud-ը հայտարարեց առանց սերվերի հաշվողական ծառայության գործարկման մասին Yandex Cloud գործառույթները. Սա նշանակում է, որ դուք գրում եք միայն ձեր ծառայության կոդը (օրինակ՝ վեբ հավելված կամ չաթբոտ), և Cloud-ն ինքն է ստեղծում և պահպանում վիրտուալ մեքենաները, որտեղ աշխատում է, և նույնիսկ կրկնօրինակում է դրանք, եթե ծանրաբեռնվածությունը մեծանում է: Ձեզ ընդհանրապես պետք չէ մտածել, դա շատ հարմար է։ Իսկ վճարումը միայն հաշվարկային ժամանակի համար է։

Այնուամենայնիվ, ոմանք կարող են ընդհանրապես չվճարել: Սրանք մշակողները են Ալիսի արտաքին հմտությունները, այսինքն՝ դրա մեջ ներկառուցված չաթ-բոտեր։ Ցանկացած ծրագրավորող կարող է գրել, հյուրընկալել և գրանցել նման հմտություն, և այսօրվանից այդ հմտությունները նույնիսկ կարիք չունեն հոսթինգի. նույն առանց սերվերի գործառույթը.

Բայց կան մի քանի նրբերանգներ. Նախ, ձեր փոս կոդը կարող է պահանջել որոշ կախվածություններ, և դրանք Ամպի մեջ քաշելը աննշան է: Երկրորդ, ցանկացած նորմալ չաթբոտ պետք է ինչ-որ տեղ պահի երկխոսության վիճակը (հետևաբար, պետական); Ո՞րն է դա անելու ամենահեշտ ձևը առանց սերվերի ֆունկցիայի մեջ: Երրորդ, ինչպե՞ս կարող եք արագ և կեղտոտ հմտություն գրել Ալիսի համար կամ նույնիսկ ինչ-որ բոտի՝ ոչ զրոյական սյուժեով: Հոդվածն, ըստ էության, այս նրբությունների մասին է։

Ալիսի համար պետական ​​հմտության ստեղծում՝ օգտագործելով Yandex.Cloud-ի և Python-ի առանց սերվերի գործառույթները

Բարոյական նախապատրաստություն

Անհամբերների համար. ես հավաքում եմ անհրաժեշտ կախվածությունները makefile-ով նախքան ֆունկցիան ամպ բեռնելը, երկխոսության վիճակը պահում եմ Yandex Object Storage-ում (այն աջակցում է S3 API-ին), և ես օգտագործում եմ իմ սեփական գրադարանը՝ երկխոսությունը կառավարելու համար։ tgalice. Արդյունքում ստացվում է այդպիսի ցուցադրական հմտություն. Հիմա այս ամենին նայենք մի փոքր ավելի մանրամասն։

Նրանց համար, ովքեր մի փոքր ավելի անհամբեր են, նախքան բարդության մասին իմ պատմության մեջ խորանալը, ես խորհուրդ եմ տալիս սկսել ինչ-որ պարզ բանից: Մասնավորապես, ստեղծեք մեկ ֆայլով echobot ֆունկցիա, գրանցեք և փորձարկեք այն Dialogs մշակողի վահանակում; մանրամասները - մեջ Դիալոգների բլոգ и Ամպային փաստաթղթեր. Եվ միայն դրանից հետո սկսեք:

Եթե ​​ցանկանում եք անմիջապես զգալ, թե ինչի համար ենք մենք այստեղ պայքարում, հարցրեք Ալիսին.միացնել «ՏՏ հորոսկոպ» հմտությունը'. Պետք է տեղի ունենա հետևյալ երկխոսությունը.

Ալիս: Բարև: Դուք «IT Horoscope» հմտության մեջ եք: Ասա «Սկսիր»՝ պարզելու, թե ինչ են քեզ խոստանում աստղերը:
Օգտագործող: Սկսել
A: Խնդրում եմ նշեք ձեր անունը
Յու: Վասիսուալի
Ա- Հիմա ասա քո ծննդյան տարեթիվը: Ընդամենը չորս նիշ, ոչ մի ավելորդ բան:
Յու: Երկրորդ
A: Խնդրում ենք կրկին փորձել: Մուտքագրեք ձեր ծննդյան տարեթիվը` չորս նիշ:
Յու: 2002 թ
Մեծ! Հիմա անվանեք ձեր ծննդյան ամիսը:
Յու: Փետրվար
Մեծ! Ի վերջո, ասա ինձ քո ծննդյան ամսաթիվը՝ ընդամենը մի թիվ, ընդամենը մեկ կամ երկու թվանշան:
Յու: 18 թ
A: Շնորհակալություն, Վասիսուալի: Այժմ մենք գիտենք, որ դուք 17 տարեկան եք և Ջրհոս: Դե, իհարկե, դուք հաջողակ եք: Աստղերը ձեզ ասում են. а что говорят звёзды, вы узнаете, запустив навык.

Խնդիրն այն է, որ նույնիսկ այսպիսի պարզ երկխոսություն պահպանելու համար հարկավոր է հիշել օգտատիրոջ անունը և ծննդյան ամսաթիվը, իսկ առանց սերվերի ֆունկցիայի միջավայրում դա աննշան է: Հնարավոր չի լինի կոնտեքստը պահել RAM-ում կամ որպես ֆայլ սկավառակի վրա, քանի որ Yandex.Cloud-ը կարող է միաժամանակ մի քանի վիրտուալ մեքենաների վրա գործառույթ գործարկել և ըստ ցանկության անցնել դրանց միջև: Դուք ստիպված կլինեք օգտագործել ինչ-որ արտաքին պահեստ: Object Storage-ը ընտրվել է որպես բավականին էժան և ոչ բարդ պահեստ անմիջապես Yandex.Cloud-ում (այսինքն՝ հավանաբար արագ): Որպես անվճար այլընտրանք, դուք կարող եք փորձել, օրինակ, անվճար կտոր Ամպամած Մոնգա ինչ-որ տեղ հեռու: Կան հարմար Python փաթաթիչներ ինչպես Object Storage-ի (որն աջակցում է S3 ինտերֆեյսին), այնպես էլ Mongo-ի համար:

Մեկ այլ խնդիր այն է, որ Object Storage-ին, MongoDB-ին և ցանկացած այլ տվյալների շտեմարան կամ տվյալների պահեստ մուտք գործելու համար ձեզ անհրաժեշտ են որոշ արտաքին կախվածություններ, որոնք պետք է վերբեռնվեն Yandex Functions-ում՝ ձեր ֆունկցիայի կոդի հետ միասին: Եվ ես կցանկանայի դա անել հարմար: Ցավոք սրտի, դա լիովին հարմար չի լինի (ինչպես Heroku-ում), բայց որոշ հիմնական հարմարավետություն կարելի է ստեղծել՝ գրելով սցենար՝ միջավայրը ստեղծելու համար (ֆայլ ստեղծել):

Ինչպես սկսել հորոսկոպի հմտությունը

  1. Պատրաստվեք. գնացեք Linux-ով ինչ-որ մեքենա: Սկզբունքորեն, դուք, հավանաբար, կարող եք նաև աշխատել Windows-ի հետ, բայց այնուհետև ստիպված կլինեք ինչ-որ հմայքը գործարկել makefile-ի գործարկման հետ: Եվ ամեն դեպքում, ձեզ հարկավոր կլինի տեղադրել առնվազն 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-ի առանց սերվերի գործառույթները

Ինչ կա գլխարկի տակ

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

Ինչպես տեսնում եք, այս կոդի մեծ մասը կապ է ստեղծում Object Storage-ի S3 ինտերֆեյսի հետ: Դուք կարող եք կարդալ, թե ինչպես է ուղղակիորեն օգտագործվում այս կապը tgalice կոդով.
Վերջին տողը ստեղծում է գործառույթը alice_handler — նույնը, որը մենք ասացինք Yandex.Cloud-ին, որ քաշի, երբ մենք սահմանեցինք պարամետրը --entrypoint=main.alice_handler.

Այսքանը, իրականում: Մեյքֆայլեր հավաքման համար, S3-ի նման Օբյեկտների պահեստավորում համատեքստը պահելու համար և Python գրադարան tgalice. Համակցված Python-ի առանց սերվերի գործառույթների և արտահայտչականության հետ՝ սա բավական է առողջ մարդկային հմտություններ զարգացնելու համար։

Դուք կարող եք հարցնել, թե ինչու էր անհրաժեշտ ստեղծել tgalice? Ամբողջ ձանձրալի ծածկագիրը, որը JSON-ները փոխանցում է հարցումից պատասխան և պահեստից հիշողություն և ետ, գտնվում է դրանում: Կա նաև սովորական կոդի հավելված, ֆունկցիա՝ հասկանալու, որ «փետրվարը» նման է «փետրվարին», և այլ NLU աղքատների համար: Իմ պատկերացմամբ՝ սա արդեն բավական է, որպեսզի կարողանաք ուրվագծել հմտությունների նախատիպերը yaml ֆայլերում՝ առանց տեխնիկական մանրամասներից շատ շեղվելու:

Եթե ​​ցանկանում եք ավելի լուրջ NLU, կարող եք այն կցել ձեր հմտությանը Ռասա կամ Դիփ Պավլով, բայց դրանց տեղադրումը կպահանջի լրացուցիչ պարեր դափով, հատկապես առանց սերվերի: Եթե ​​դուք ընդհանրապես չեք ցանկանում կոդավորել, ապա պետք է օգտագործեք նման տեսողական կոնստրուկտոր Այիմլոգիկ. Tgalice-ը ստեղծելիս ես մտածում էի ինչ-որ միջանկյալ ճանապարհի մասին։ Տեսնենք, թե ինչ է ստացվում սրանից:

Դե, հիմա միացեք alice skills ծրագրավորողների զրույցկարդալ փաստաթղթեր, և ստեղծել հիանալի հմտություններ!

Source: www.habr.com

Добавить комментарий