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

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

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

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

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

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

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

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

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

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

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

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

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

  1. Պատրաստվեք. մուտք գործեք Linux-ով աշխատող ցանկացած համակարգիչ։ Հիմնականում, Windows Սա նույնպես հավանաբար կարող է աշխատել, բայց makefile-ը գործարկելը կպահանջի որոշակի հնարքներ։ Եվ ամեն դեպքում, ձեզ անհրաժեշտ կլինի տեղադրված Python 3.6 կամ ավելի բարձր տարբերակ։
  2. Կլոնավորեք այն GitHub-ից հորոսկոպի հմտության օրինակ.
  3. Գրանցվեք Yandex.Cloud-ում. https://cloud.yandex.ru
  4. Ստեղծեք երկու դույլ ինքներդ ձեզ համար Նյութերի պահեստավորում, կոչեք նրանց ցանկացած անունով {BUCKET NAME} и tgalice-test-cold-storage (այս երկրորդ անունը այժմ կոշտ կոդավորված է main.py իմ օրինակը): Առաջին դույլը անհրաժեշտ կլինի միայն տեղակայման համար, երկրորդը` երկխոսության վիճակները պահելու համար:
  5. ստեղծել սպասարկման հաշիվ, նրան դեր տվեք editorև ստացեք ստատիկ հավատարմագրեր դրա համար {KEY ID} и {KEY VALUE} — մենք դրանք կօգտագործենք երկխոսության վիճակը արձանագրելու համար։ Այս ամենը անհրաժեշտ է, որպեսզի Yandex.Cloud-ի գործառույթը կարողանա մուտք գործել պահեստ Yandex.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 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.

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

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

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

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

Source: www.habr.com

Գնեք հուսալի հոստինգ DDoS պաշտպանությամբ կայքերի, VPS VDS սերվերների համար 🔥 Գնեք հուսալի կայքերի հոսթինգ՝ DDoS պաշտպանությամբ, VPS VDS սերվերներով | ProHoster