Paghimo og stateful nga kahanas alang kang Alice gamit ang serverless functions sa Yandex.Cloud ug Python

Magsugod ta sa balita. Kagahapon gipahibalo sa Yandex.Cloud ang paglansad sa usa ka serbisyo nga wala’y server nga kompyuter Yandex Cloud Functions. Nagpasabot kini: isulat lang nimo ang code para sa imong serbisyo (pananglitan, usa ka web application o usa ka chatbot), ug ang Cloud mismo ang nagmugna ug nagmintinar sa mga virtual machine diin kini nagdagan, ug gani gikopya kini kung motaas ang load. Dili nimo kinahanglan nga maghunahuna sa tanan, kini sayon ​​​​kaayo. Ug ang pagbayad kay para lang sa oras sa kalkulasyon.

Bisan pa, ang uban mahimo’g wala’y bayad. Kini mao ang mga developers Ang mga kahanas sa gawas ni Alice, sa ato pa, mga chatbots nga gitukod niini. Ang bisan kinsa nga developer mahimong magsulat, mag-host ug magparehistro sa ingon nga kahanas, ug gikan karon ang mga kahanas dili na kinahanglan nga i-host - i-upload lang ang ilang code sa panganod sa porma parehas nga wala’y server nga function.

Apan adunay pipila ka mga nuances. Una, ang imong pit code mahimong magkinahanglan og pipila ka mga dependency, ug ang pag-drag niini ngadto sa Cloud dili importante. Ikaduha, ang bisan unsang normal nga chatbot kinahanglan nga tipigan ang kahimtang sa dayalogo sa usa ka dapit (mao nga stateful); Unsa ang labing kadali nga paagi aron mahimo kini sa usa ka function nga wala’y server? Ikatulo, unsaon nimo pagsulat ang usa ka dali-ug-hugaw nga kahanas alang kang Alice o bisan sa usa ka matang sa bot nga adunay dili zero nga laraw? Ang artikulo, sa tinuud, bahin sa kini nga mga nuances.

Paghimo og stateful nga kahanas alang kang Alice gamit ang serverless functions sa Yandex.Cloud ug Python

Pagpangandam sa moral

Alang sa walay pailub: Gikolekta nako ang gikinahanglan nga mga dependency sa usa ka makefile sa dili pa i-upload ang function ngadto sa cloud, akong gitipigan ang estado sa dialog sa Yandex Object Storage (kini nagsuporta sa S3 API), ug akong gigamit ang akong kaugalingong librarya sa pagdumala sa dialog tgalice. Sa katapusan kini nahimo sa maong mga kahanas sa demo. Karon atong tan-awon ang tanan niini sa usa ka gamay nga detalye.

Alang sa mga dili kaayo mapailubon, sa wala pa mag-dive sa akong istorya bahin sa pagkakomplikado, girekomenda nako nga magsugod sa usa ka butang nga yano. Nga mao, paghimo og usa ka file nga echobot function, pagrehistro ug pagsulay niini sa Dialogs developer console; mga detalye - sa Dialogue blog и Dokumentasyon sa panganod. Ug dayon magsugod.

Kung gusto nimo mabati dayon kung unsa ang among gipakigbisogan dinhi, pangutan-a si Alice 'makahimo sa kahanas sa "IT horoscope".'. Kinahanglang mahitabo ang usa ka dialogue nga susama sa mosunod:

Alice: Hello! Anaa ka sa kahanas sa "IT Horoscope". Isulti ang "Start" aron mahibal-an kung unsa ang gisaad sa mga bituon kanimo.
User: Pagsugod
A: Palihug isulti ang imong ngalan
Yu: Vasisualiy
A: Karon isulti kanako ang tuig sa imong pagkahimugso. Upat lang ka digit, walay extra.
Yu: ikaduha
A: Palihug sulayi pag-usab. Pagsulod sa tuig sa imong pagkahimugso - upat ka numero.
Yu: 2002
A: Nindot! Karon hingalan ang imong bulan nga natawhan.
Yu: Pebrero
A: Nindot! Sa katapusan, isulti kanako ang imong petsa sa natawhan - usa lang ka numero, usa o duha lang ka numero.
Yu: 18
A: Salamat, Vasisualiy! Karon nahibal-an namon: 17 ka tuig ang edad ug usa ka Aquarius. Aw, siyempre, swerte ka! Ang mga bituon nagsulti kanimo: а что говорят звёзды, вы узнаете, запустив навык.

Ang problema mao nga aron mapadayon bisan ang usa ka yano nga dayalogo, kinahanglan nimo nga hinumdoman ang ngalan sa tiggamit ug petsa sa pagkahimugso, ug sa usa ka wala’y server nga function nga palibot kini dili hinungdanon. Dili mahimo nga tipigan ang konteksto sa RAM o ingon usa ka file sa disk, tungod kay Ang Yandex.Cloud mahimong magpadagan sa usa ka function sa daghang mga virtual machine sa parehas nga oras ug magbalhin-balhin tali kanila kung gusto. Kinahanglan ka nga mogamit usa ka matang sa eksternal nga pagtipig. Ang Pagtipig sa Object gipili ingon usa ka medyo barato ug dili komplikado nga pagtipig direkta sa Yandex.Cloud (ie, tingali paspas). Ingon usa ka libre nga alternatibo, mahimo nimong sulayan, pananglitan, usa ka libre nga piraso Madag-umon nga Monga dapit nga layo. Adunay kombenyente nga Python wrapper para sa Object Storage (nga nagsuporta sa S3 interface) ug Mongo.

Ang laing problema mao nga aron ma-access ang Object Storage, MongoDB, ug bisan unsang uban nga database o data store, kinahanglan nimo ang pipila ka mga eksternal nga dependency nga kinahanglan i-upload sa Yandex Functions kauban ang imong function code. Ug gusto nako nga buhaton kini nga komportable. Ikasubo, dili kini hingpit nga kombenyente (sama sa Heroku), apan ang pipila nga sukaranan nga kahupayan mahimo nga mahimo pinaagi sa pagsulat sa usa ka script aron matukod ang palibot (paghimo file).

Giunsa ang paglansad sa kahanas sa horoscope

  1. Pag-andam: adto sa pipila ka makina nga adunay Linux. Sa prinsipyo, mahimo ka usab nga magtrabaho sa Windows, apan kinahanglan nimo nga buhaton ang pipila ka salamangka sa paglansad sa makefile. Ug sa bisan unsang kaso, kinahanglan nimo nga ma-install ang Python 3.6.
  2. I-clone kini gikan sa Github pananglitan sa kahanas sa horoscope.
  3. Pagrehistro sa Y.Cloud: https://cloud.yandex.ru
  4. Paghimo og duha ka balde sa imong kaugalingon Pagtipig sa Imo, tawga sila sa bisan unsang ngalan {BUCKET NAME} и tgalice-test-cold-storage (Kini nga ikaduha nga ngalan karon gi-hardcode sa main.py akong ehemplo). Ang una nga balde gikinahanglan lamang alang sa pag-deploy, ang ikaduha - sa pagtipig sa mga estado sa dialogo.
  5. paghimo account sa serbisyo, hatagi siya ug papel editor, ug pagkuha og static nga mga kredensyal alang niini {KEY ID} и {KEY VALUE} — gamiton namo sila sa pagrekord sa kahimtang sa dayalogo. Kining tanan gikinahanglan aron ang usa ka function gikan sa Ya.Cloud maka-access sa storage gikan sa Ya.Cloud. Sa pila ka adlaw, nanghinaut ko, ang pagtugot mahimong awtomatiko, apan sa pagkakaron ingon niana.
  6. (Opsyonal) instalar interface sa command line yc. Mahimo ka usab nga maghimo usa ka function pinaagi sa web interface, apan ang CLI maayo tungod kay ang tanan nga mga lahi sa mga inobasyon mas paspas nga makita niini.
  7. Karon mahimo nimong maandam ang dependency assembly: ipadagan kini sa command line gikan sa folder nga adunay pananglitan sa kahanas make all. Usa ka hugpong sa mga librarya (kadaghanan, sama sa naandan, dili kinahanglan) i-install sa folder dist.
  8. Ibubo ngadto sa Object Storage pinaagi sa kamot (ngadto sa balde {BUCKET NAME}) archive nga nakuha sa miaging lakang dist.zip. Kung gusto, mahimo nimo kini gikan sa command line, pananglitan, gamit AWS CLI.
  9. Paghimo og usa ka serverless function pinaagi sa web interface o gamit ang usa ka utility yc. Alang sa utility, ang command ingon niini:

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

Kung mano-mano ang paghimo sa usa ka function, ang tanan nga mga parameter napuno sa parehas nga paagi.

Karon ang function nga imong gibuhat mahimong masulayan pinaagi sa developer console, ug unya ang kahanas mahimong mapauswag ug mamantala.

Paghimo og stateful nga kahanas alang kang Alice gamit ang serverless functions sa Yandex.Cloud ug Python

Unsa ang naa sa ilawom sa tabon

Ang makefile sa tinuud adunay usa ka yano nga script alang sa pag-install sa mga dependency ug pagbutang niini sa usa ka archive dist.zip, halos sama niini:

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

Ang nahabilin mao ang pipila ka yano nga mga himan nga giputos sa usa ka librarya tgalice. Ang proseso sa pagpuno sa data sa user gihulagway sa 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: Пожалуйста, попробуйте ещё раз. Вам нужно назвать число своего рождения (например, двадцатое); это одна или две цифры.

Ang trabaho sa pag-parse niini nga config ug pagkalkula sa katapusang resulta gikuha sa klase sa 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

Mas tukma, ang base nga klase FormFillingDialogManager naghisgot sa pagpuno sa "porma", ug ang pamaagi sa klase sa bata handle_completed_form gisultihan siya kung unsa ang buhaton kung andam na siya.

Dugang pa niini nga nag-unang dagan sa dialogue, ang user kinahanglan usab nga timbaya, ingon man usab sa paghatag og tabang sa paggamit sa "tabang" sugo ug gipagawas gikan sa kahanas sa paggamit sa "exit" sugo. Alang niini nga katuyoan sa tgalice Adunay usab usa ka template, mao nga ang tibuuk nga tagdumala sa dialogo gilangkoban sa mga piraso:

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 Naglihok kini nga yano: gisulayan niini nga ipadapat ang tanan nga mga sangkap niini sa karon nga kahimtang sa dayalogo, ug gipili ang una nga angay.

Gibalik sa tagdumala sa dialogo ang usa ka butang nga Python isip tubag sa matag mensahe. Response, nga mahimo unya nga mabag-o sa yano nga teksto, o sa usa ka mensahe sa Alice o Telegram - depende kung diin nagdagan ang bot; kini usab naglangkob sa nausab nga kahimtang sa dialogue nga kinahanglan nga maluwas. Kining tibuok kusina gidumala sa laing klase, DialogConnector, mao nga ang direkta nga script alang sa paglansad sa usa ka kahanas sa Yandex Functions ingon niini:

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

Sama sa imong makita, kadaghanan niini nga code nagmugna og koneksyon sa S3 interface sa Object Storage. Mahimo nimo mabasa kung giunsa kini nga koneksyon direkta nga gigamit sa tgalice code.
Ang katapusan nga linya nagmugna sa function alice_handler - ang parehas nga giingon namon sa Yandex.Cloud nga ibira kung among gitakda ang parameter --entrypoint=main.alice_handler.

Kana lang, sa tinuod. Makefiles para sa assembly, S3-like Object Storage para sa pagtipig sa konteksto, ug Python library tgalice. Inubanan sa mga serverless function ug expressiveness sa Python, kini igo na aron mapalambo ang usa ka himsog nga kahanas sa tawo.

Mahimong mangutana ka nganong gikinahanglan ang paghimo tgalice? Ang tanan nga makalaay nga code nga nagbalhin sa mga JSON gikan sa hangyo ngadto sa tubag ug gikan sa pagtipig ngadto sa panumduman ug balik anaa niini. Adunay usab usa ka regular nga aplikasyon sa code, usa ka function alang sa pagsabut nga ang "Pebrero" parehas sa "Pebrero", ug uban pang NLU alang sa mga kabus. Sumala sa akong ideya, kini igo na aron mahimo nimong i-sketch ang mga prototype sa kahanas sa yaml file nga dili kaayo mabalda sa mga teknikal nga detalye.

Kung gusto nimo ang usa ka mas seryoso nga NLU, mahimo nimo kini ilakip sa imong kahanas Rasa o DeepPavlov, apan ang pagpahimutang niini magkinahanglan ug dugang nga mga sayaw gamit ang tamburin, ilabina sa walay server. Kung dili nimo gusto ang pag-coding, kinahanglan nimo nga mogamit usa ka visual constructor nga gusto Aimylogic. Sa paghimo sa tgalice, naghunahuna ko bahin sa usa ka matang sa intermediate nga agianan. Atong tan-awon kon unsay resulta niini.

Aw, apil na chat sa developer sa kahanas sa alice, basaha dokumentasyon, ug paghimo og talagsaon kahanas!

Source: www.habr.com

Idugang sa usa ka comment