Tsim cov txuj ci tseem ceeb rau Alice siv serverless zog ntawm Yandex.Cloud thiab Python

Cia peb pib nrog cov xov xwm. Nag hmo Yandex.Cloud tshaj tawm lub community launch ntawm serverless kev pabcuam Yandex Cloud Functions. Qhov no txhais tau tias: koj tsuas yog sau tus lej rau koj qhov kev pabcuam (piv txwv li, daim ntawv thov web lossis chatbot), thiab huab nws tus kheej tsim thiab tswj cov tshuab virtual uas nws khiav, thiab tseem rov ua dua yog tias cov khoom nce ntxiv. Koj tsis tas yuav xav txhua, nws yooj yim heev. Thiab cov nyiaj them tsuas yog rau lub sijhawm xam.

Txawm li cas los xij, qee qhov yuav tsis them tag nrho. Cov no yog cov developers Alice cov txuj ci sab nraud, uas yog, chatbots tsim rau hauv nws. Txhua tus tsim tawm tuaj yeem sau, tuav thiab sau npe cov txuj ci zoo li no, thiab txij li hnub no cov txuj ci tsis tas yuav tsum tau tuav - tsuas yog upload lawv cov lej rau huab hauv daim ntawv. tib yam serverless muaj nuj nqi.

Tab sis muaj ob peb nuances. Ua ntej, koj lub qhov dej code yuav xav tau qee qhov kev cia siab, thiab rub lawv mus rau hauv Huab yog qhov tsis tseem ceeb. Qhov thib ob, ib txwm chatbot yuav tsum khaws lub xeev ntawm kev sib tham nyob qhov twg (ceev xwm txheej yog li ntawd); Dab tsi yog txoj hauv kev yooj yim tshaj los ua qhov no hauv serverless muaj nuj nqi? Qhov thib peb, koj tuaj yeem sau cov txuj ci sai thiab qias neeg rau Alice lossis qee yam ntawm bot nrog cov phiaj xwm tsis yog xoom? Kab lus yog, qhov tseeb, hais txog cov nuances.

Tsim cov txuj ci tseem ceeb rau Alice siv serverless zog ntawm Yandex.Cloud thiab Python

Kev npaj coj ncaj ncees

Rau qhov tsis txaus siab: Kuv sau cov kev vam khom tsim nyog nrog makefile ua ntej upload cov haujlwm rau huab, Kuv khaws lub xeev ntawm kev sib tham hauv Yandex Object Storage (nws txhawb nqa S3 API), thiab kuv siv kuv tus kheej lub tsev qiv ntawv los tswj cov lus sib tham. twg. Thaum kawg nws hloov tawm xws demo txuj. Tam sim no cia saib tag nrho qhov no hauv me ntsis ntxiv.

Rau cov me ntsis siab ntev, ua ntej dhia mus rau hauv kuv zaj dab neeg txog complexity, kuv xav kom pib nrog tej yam yooj yim. Namely, tsim ib daim ntawv echobot muaj nuj nqi, sau npe thiab sim nws hauv Dialogs developer console; cov ntsiab lus - hauv Kev sib tham blog и Huab cov ntaub ntawv. Thiab tsuas yog ces pib.

Yog tias koj xav tam sim ntawd xav tias peb tab tom tawm tsam ntawm no, nug Alice 'pab kom "IT horoscope" txuj ci'. Kev sib tham zoo ib yam li cov hauv qab no yuav tsum tshwm sim:

Alice: Nyob zoo! Koj nyob hauv "IT Horoscope" txuj ci. Hais "Pib" kom paub seb cov hnub qub cog lus li cas rau koj.
Tus neeg siv: Pib
A: Thov qhia koj lub npe
Yus: Vasisualiy
A: Tam sim no qhia kuv lub xyoo koj yug. Tsuas yog plaub tus lej xwb, tsis muaj dab tsi ntxiv.
Yu: ob
A: Thov rov sim dua. Sau lub xyoo koj yug - plaub tus lej.
Xyoo: 2002
A: Zoo heev! Tam sim no npe koj lub hli yug.
yus: February
A: Zoo heev! Thaum kawg, qhia kuv hnub yug - tsuas yog tus lej, tsuas yog ib lossis ob tus lej xwb.
Xyoo: 18
A: Ua tsaug, Vasisualiy! Tam sim no peb paub: koj muaj 17 xyoo thiab Aquarius. Zoo, tau kawg, koj muaj hmoo! Cov hnub qub qhia rau koj: а что говорят звёзды, вы узнаете, запустив навык.

Qhov teeb meem yog tias txhawm rau tswj hwm qhov kev sib tham yooj yim no, koj yuav tsum nco ntsoov tus neeg siv lub npe thiab hnub yug, thiab nyob rau hauv ib puag ncig kev ua haujlwm tsis muaj nuj nqis qhov no tsis tseem ceeb. Nws yuav tsis tuaj yeem khaws cov ntsiab lus hauv RAM lossis ua cov ntaub ntawv ntawm disk, vim Yandex.Cloud tuaj yeem ua haujlwm ntawm ntau lub tshuab virtual tib lub sijhawm thiab hloov ntawm lawv ntawm qhov xav tau. Koj yuav tau siv qee yam kev cia sab nraud. Object Storage raug xaiv raws li tus nqi pheej yig thiab tsis yooj yim cia ncaj qha hauv Yandex.Cloud (piv txwv li, tej zaum nrawm). Raws li lwm txoj kev pub dawb, koj tuaj yeem sim, piv txwv li, ib daim dawb Huab Monga nyob qhov twg deb. Muaj qhov yooj yim Python wrappers rau Object Cia (uas txhawb S3 interface) thiab Mongo.

Lwm qhov teeb meem yog kom nkag mus rau Cov Khoom Siv Cia, MongoDB, thiab lwm yam ntaub ntawv lossis cov ntaub ntawv khaws cia, koj xav tau qee qhov kev cia siab sab nraud uas yuav tsum tau muab tso rau hauv Yandex Functions nrog rau koj cov lej ua haujlwm. Thiab kuv xav ua qhov no yooj yim. Hmoov tsis zoo, nws yuav tsis yooj yim kiag li (xws li ntawm Heroku), tab sis qee qhov kev nplij siab yooj yim tuaj yeem tsim los ntawm kev sau ntawv los tsim ib puag ncig (ua ntaub ntawv).

Yuav ua li cas tso ib tug horoscope txuj ci

  1. Npaj: mus rau qee lub tshuab nrog Linux. Hauv txoj ntsiab cai, koj tuaj yeem ua haujlwm nrog Windows ib yam nkaus, tab sis tom qab ntawd koj yuav tau ua qee yam khawv koob nrog kev tso tawm lub makefile. Thiab nyob rau hauv txhua rooj plaub, koj yuav xav tau tsawg kawg Python 3.6 ntsia.
  2. Clone nws los ntawm Github piv txwv ntawm kev txawj horoscope.
  3. Sau npe hauv Y.Cloud: https://cloud.yandex.ru
  4. Tsim koj tus kheej ob lub thoob hauv Yam khoom kwv, hu lawv los ntawm ib lub npe {BUCKET NAME} и tgalice-test-cold-storage (Lub npe thib ob yog tam sim no hardcoded hauv main.py kuv piv txwv). Thawj lub thoob yuav xav tau tsuas yog rau kev xa tawm, qhov thib ob - khaws cov lus sib tham.
  5. tsim kev pabcuam account, muab nws lub luag haujlwm editor, thiab tau txais daim ntawv pov thawj zoo li qub rau nws {KEY ID} и {KEY VALUE} - Peb yuav siv lawv los sau lub xeev ntawm kev sib tham. Tag nrho cov no yog xav tau kom muaj nuj nqi los ntawm Ya.Cloud tuaj yeem nkag mus rau qhov chaw cia ntawm Ya.Cloud. Muaj ib hnub, kuv vam tias, kev tso cai yuav dhau los ua tsis siv neeg, tab sis tam sim no nws zoo li ntawd.
  6. (Yeem) nruab hais kom ua kab interface yc. Koj tseem tuaj yeem tsim kev ua haujlwm los ntawm lub vev xaib interface, tab sis CLI yog qhov zoo vim tias txhua yam kev tsim kho tshiab tshwm sim hauv nws sai dua.
  7. Tam sim no koj tuaj yeem npaj qhov kev sib koom ua ke ntawm kev vam meej: khiav nws ntawm kab hais kom ua los ntawm cov ntawv tais ceev tseg nrog cov qauv kev txawj make all. Ib pawg ntawm cov tsev qiv ntawv (feem ntau, raws li niaj zaus, tsis tsim nyog) yuav raug ntsia rau hauv daim nplaub tshev dist.
  8. Ncuav rau hauv Cov Khoom Cia ntawm tes (rau hauv lub thoob {BUCKET NAME}) archive tau txais hauv cov kauj ruam dhau los dist.zip. Yog tias xav tau, koj tuaj yeem ua qhov no los ntawm kab hais kom ua, piv txwv li, siv AWS CLI.
  9. Tsim lub serverless muaj nuj nqi ntawm lub vev xaib interface lossis siv cov khoom siv hluav taws xob yc. Rau kev siv hluav taws xob, cov lus txib yuav zoo li no:

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

Thaum tsim ib qho kev ua haujlwm manually, tag nrho cov tsis tau sau rau hauv tib txoj kev.

Tam sim no cov haujlwm uas koj tsim tuaj yeem raug sim los ntawm tus tsim tawm console, thiab tom qab ntawd cov txuj ci tuaj yeem txhim kho thiab tshaj tawm.

Tsim cov txuj ci tseem ceeb rau Alice siv serverless zog ntawm Yandex.Cloud thiab Python

Dab tsi nyob hauv qab hood

Lub makefile yeej muaj ib tsab ntawv yooj yim rau kev txhim kho kev vam khom thiab muab tso rau hauv ib qho archive dist.zip, kwv yees li no:

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

Tus so yog ob peb yam yooj yim uas qhwv hauv ib lub tsev qiv ntawv tgalice. Cov txheej txheem ntawm kev sau cov neeg siv cov ntaub ntawv tau piav qhia los ntawm config 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: Пожалуйста, попробуйте ещё раз. Вам нужно назвать число своего рождения (например, двадцатое); это одна или две цифры.

Kev ua haujlwm ntawm parsing no config thiab xam qhov kawg tshwm sim yog coj los ntawm Python chav kawm

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

Ntau precisely, lub hauv paus chav kawm FormFillingDialogManager cuam ​​tshuam nrog kev sau "form", thiab tus me nyuam txoj hauv kev handle_completed_form qhia nws yuav ua li cas thaum nws npaj tau.

Ntxiv rau qhov tseem ceeb ntawm kev sib tham no, tus neeg siv yuav tsum tau txais tos, nrog rau kev pab cuam siv "pab" hais kom ua thiab tso tawm los ntawm kev txawj siv "tawm tawm" hais kom ua. Ua qhov no hauv tgalice Kuj tseem muaj tus qauv, yog li tag nrho tus neeg saib xyuas kev sib tham tau ua los ntawm cov khoom:

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 Nws ua haujlwm yooj yim: nws sim siv tag nrho nws cov khoom siv rau lub xeev tam sim no ntawm kev sib tham hauv lem, thiab xaiv thawj qhov tsim nyog.

Tus thawj tswj dialog xa rov qab cov khoom Python raws li cov lus teb rau txhua cov lus. Response, uas tuaj yeem hloov mus rau hauv cov ntawv dawb, lossis rau hauv cov lus hauv Alice lossis Telegram - nyob ntawm qhov chaw uas bot tab tom khiav; nws kuj muaj lub xeev hloov ntawm kev sib tham uas yuav tsum tau txais kev cawmdim. Tag nrho chav ua noj no yog tswj hwm los ntawm lwm chav kawm, DialogConnector, yog li tsab ntawv ncaj qha rau kev tshaj tawm kev txawj ntawm Yandex Functions zoo li no:

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

Raws li koj tuaj yeem pom, feem ntau ntawm cov cai no tsim kev sib txuas rau S3 interface ntawm Object Storage. Koj tuaj yeem nyeem qhov kev sib txuas no ncaj qha siv li cas hauv tgalice code.
Cov kab kawg tsim cov haujlwm alice_handler - tib yam uas peb hais rau Yandex.Cloud kom rub thaum peb teeb tsa qhov ntsuas --entrypoint=main.alice_handler.

Qhov ntawd yog tag nrho, ua tau. Makefiles rau kev sib dhos, S3-zoo li Cov Khoom Cia rau khaws cov ntsiab lus, thiab Python tsev qiv ntawv tgalice. Ua ke nrog serverless lub luag haujlwm thiab kev nthuav qhia ntawm Python, qhov no txaus los tsim kom muaj kev noj qab haus huv tib neeg kev txawj ntse.

Tej zaum koj yuav nug yog vim li cas nws thiaj tsim nyog tsim tgalice? Txhua tus lej tho txawv uas hloov JSONs los ntawm kev thov rau cov lus teb thiab los ntawm kev cia rau lub cim xeeb thiab rov qab nyob hauv nws. Kuj tseem muaj daim ntawv thov kev cai tsis tu ncua, muaj nuj nqi rau kev nkag siab tias "Lub Ob Hlis" zoo ib yam li "Lub Ob Hlis", thiab lwm yam NLU rau cov neeg pluag. Raws li kuv lub tswv yim, qhov no yuav tsum tau txaus kom koj tuaj yeem kos cov qauv ntawm cov kev txawj hauv yaml cov ntaub ntawv yam tsis muaj kev cuam tshuam ntau dhau los ntawm kev paub meej.

Yog tias koj xav tau NLU hnyav dua, koj tuaj yeem txuas rau koj qhov kev txawj ntse Rasa los yog DeepPavlov, tab sis teeb tsa lawv yuav xav tau kev seev cev ntxiv nrog lub tambourine, tshwj xeeb tshaj yog ntawm serverless. Yog tias koj tsis xav tias zoo li coding txhua, koj yuav tsum siv tus tsim teeb pom kev zoo li Aimylogic. Thaum tsim tgalice, kuv xav txog qee yam ntawm txoj kev nruab nrab. Wb saib dab tsi los ntawm qhov no.

Zoo, tam sim no koom nrog alice txawj tsim kev sib tham, nyeem cov ntaub ntawv, thiab tsim kom muaj qhov zoo txuj ci!

Tau qhov twg los: www.hab.com

Ntxiv ib saib