Afirandina jêhatîbûnek dewletparêz ji bo Alice bi karanîna fonksiyonên bê server ên Yandex.Cloud û Python

Ka em bi nûçeyê dest pê bikin. Duh Yandex.Cloud destpêkirina karûbarê komputera bê server ragihand Fonksiyonên Cloud Yandex. Ev tê vê wateyê: hûn tenê ji bo karûbarê xwe kodê dinivîsin (mînak, serîlêdanek webê an chatbotek), û Cloud bixwe makîneyên virtual li cihê ku lê dixebitîne diafirîne û diparêze, û heke bar zêde bibe jî wan dubare dike. Hûn ne hewce ne ku hûn qet bifikirin, ew pir hêsan e. Û tezmînat tenê ji bo dema hesabkirinê ye.

Lêbelê, dibe ku hin kes qet nedin. Ev pêşdebir in Hişmendiyên derveyî yên Alice, ango chatbotên ku tê de hatine çêkirin. Her pêşdebir dikare jêhatîbûnek weha binivîsîne, mêvandar bike û tomar bike, û ji îro pê ve jêhatîbûn jî ne hewce ye ku bibin mêvandar - tenê koda xwe bi formê li ewr bar bikin. heman fonksiyona bê server.

Lê çend nuans hene. Pêşîn, dibe ku koda pit we hin pêwendiyan hewce bike, û kişandina wan di nav Cloud-ê de ne hindik e. Ya duyemîn, her chatbotek normal hewce dike ku rewşa diyalogê li cîhek hilîne (ji ber vê yekê dewletdar); Awayê herî hêsan kirina vê yekê di fonksiyonek bê server de çi ye? Ya sêyemîn, hûn çawa dikarin jêhatîbûnek zû û qirêj ji bo Alice an tewra celebek botê bi nexşeyek ne-sifir binivîsin? Gotar, bi rastî, li ser van nuansan e.

Afirandina jêhatîbûnek dewletparêz ji bo Alice bi karanîna fonksiyonên bê server ên Yandex.Cloud û Python

Amadekirina exlaqî

Ji bo kesên bêsebir: Ez berî barkirina fonksiyonê li ewr ve girêdayî girêdanên pêwîst bi pelek çêkirî berhev dikim, ez rewşa diyalogê di Yandex Object Storage de hilînim (ew S3 API piştgirî dike), û ez pirtûkxaneya xwe bikar tînim da ku diyalogê bi rê ve bibe. tgalice. Di dawiyê de derdikeve bi vî rengî jêhatîbûna demo. Niha em li van hemûyan bi hûrgulî hûrgulî binêrin.

Ji bo yên ku hindiktir bêsebir in, berî ku bikevin nav çîroka xwe ya li ser tevliheviyê, ez pir pêşniyar dikim ku bi tiştek hêsan dest pê bikin. Ango, fonksiyonek echobot-a yek-pelê biafirînin, wê di konsolê pêşdebirê Dialogs de tomar bikin û ceribandin; hûragahiyan - li Diyalog blog и Belgekirina Cloud. Û tenê paşê dest pê bikin.

Ger hûn dixwazin tavilê hîs bikin ku em ji bo çi li vir şer dikin, ji Alice bipirsin 'jêhatiya "IT horoscope" çalak bike'. Divê diyalogek mîna ya jêrîn pêk were:

Alice: Merheba! Hûn di jêhatiya "IT Horoscope" de ne. Bêjin "Destpêk" da ku hûn bizanin ka stêrk çi soz didin we.
Bikarhêner: Destpêk
A: Ji kerema xwe navê xwe bêje
Yu: Vasisualiy
A: Niha sala jidayikbûna xwe ji min re bêje. Tenê çar hejmar, tiştek zêde.
Yu: duyemîn
A: Ji kerema xwe dîsa biceribîne. Sala jidayikbûna xwe binivîse - çar jimar.
Yu: 2002
A: Mezin! Niha navê meha jidayikbûna xwe bidin.
Yu: Sibat
A: Mezin! Di dawiyê de, dîroka jidayikbûna xwe ji min re bêje - tenê hejmarek, tenê yek an du hejmar.
Yu: 18
A: Spas dikim, Vasisualiy! Niha em dizanin: tu 17 salî û Aquarius î. Belê, bê guman, hûn bi şens in! Stêrk ji we re dibêjin: а что говорят звёзды, вы узнаете, запустив навык.

Pirsgirêk ev e ku ji bo domandina diyalogek wusa hêsan jî, hûn hewce ne ku nav û dîroka jidayikbûnê ya bikarhêner bi bîr bînin, û di hawîrdorek fonksiyonek bê server de ev ne hindik e. Dê ne mumkun be ku naverokê di RAM-ê de an wekî pelek li ser dîskê hilîne, ji ber Yandex.Cloud dikare di heman demê de li ser çend makîneyên virtual fonksiyonek bimeşîne û bi kêfa xwe di navbera wan de biguhezîne. Pêdivî ye ku hûn celebek hilanîna derveyî bikar bînin. Object Storage rasterast di Yandex.Cloud de (ango, belkî zû) wekî hilanînek pir erzan û bêtevlihev hate hilbijartin. Wekî alternatîfek belaş, hûn dikarin, wek nimûne, perçeyek belaş biceribînin Cloudy Monga cihekî dûr. Hem ji bo Object Storage (ku navbeynkariya S3 piştgirî dike) hem jî ji bo Mongo, pêçanên Python-ê hêsan hene.

Pirsgirêkek din jî ev e ku ji bo gihîştina Object Storage, MongoDB, û her databasek an dikana daneyê ya din, hûn hewceyê hin girêdanên derveyî ne ku hewce ne ku bi koda fonksiyonê re li Fonksiyonên Yandex werin barkirin. Û ez dixwazim vê yekê bi hêsanî bikim. Mixabin, ew ê bi tevahî ne rehet be (mîna li ser Heroku), lê hin rehetiya bingehîn dikare bi nivîsandina skrîptekê were afirandin da ku hawîrdorê ava bike (pelê çêbike).

Meriv çawa jêhatîbûnek horoscope dest pê dike

  1. Amade bikin: bi Linux re biçin ser makîneyek. Di prensîbê de, dibe ku hûn dikarin bi Windows-ê re jî bixebitin, lê wê hingê hûn neçar in ku bi destpêkirina pelê re hin sêrbaziyê bikin. Û di her rewşê de, hûn ê hewceyê herî kêm Python 3.6 saz bikin.
  2. Wê ji Github klon bikin mînaka jêhatiya horoskopê.
  3. Li Y.Cloud qeyd bikin: https://cloud.yandex.ru
  4. Di nav xwe de du kelûpelan çêbikin Storage Storage, bi her navî ji wan re dibêjin {BUCKET NAME} и tgalice-test-cold-storage (ev navê duyemîn naha tê de kodkirî ye main.py mînaka min). Kevirê yekem dê tenê ji bo bicîhkirinê hewce bike, ya duyemîn - ji bo hilanîna dewletên diyalogê.
  5. ava bike hesabê xizmetê, rolekê bide wî editor, û ji bo wê pêbaweriyên statîk bistînin {KEY ID} и {KEY VALUE} - em ê wan ji bo tomarkirina rewşa diyalogê bikar bînin. Hemî ev hewce ne da ku fonksiyonek ji Ya.Cloud bikaribe xwe bigihîne hilanînê ji Ya.Cloud. Rojek, ez hêvî dikim, destûr dê bixweber bibe, lê ji bo naha ew wusa ye.
  6. (Bijarte) saz bike navrûya rêza fermanê yc. Her weha hûn dikarin bi navgîniya tevnvîsê fonksiyonek biafirînin, lê CLI baş e ji ber ku her cûre nûbûn di wê de zûtir xuya dibin.
  7. Naha hûn dikarin bi rastî meclîsa girêdayîbûnê amade bikin: wê li ser rêzika fermanê ji peldankê bi mînaka jêhatîbûnê bimeşînin. make all. Dê komek pirtûkxane (bi piranî, wekî gelemperî, nepêwist) di peldankê de werin saz kirin dist.
  8. Bi destê xwe birijînin nav Objekt Storage (nav kelek {BUCKET NAME}) arşîva ku di gava berê de hatî bidestxistin dist.zip. Ger bixwaze, hûn dikarin vê yekê ji rêzika fermanê bikin, mînakî, bikar bînin AWS CLI.
  9. Bi navgîniya webê an bi karanîna karûbarek fonksiyonek bê server biafirînin yc. Ji bo karûbar, ferman dê bi vî rengî xuya bike:

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

Dema ku fonksiyonek bi destan diafirîne, hemî pîvan bi heman rengî têne dagirtin.

Naha fonksiyona ku we afirandiye dikare bi navgîniya konsolê pêşdebir ve were ceribandin, û dûv re jî jêhatî dikare were başkirin û weşandin.

Afirandina jêhatîbûnek dewletparêz ji bo Alice bi karanîna fonksiyonên bê server ên Yandex.Cloud û Python

Çi di bin kulikê de ye

Pelê çêkirinê bi rastî ji bo sazkirina pêwendiyan û xistina wan di arşîvekê de skrîptek pir hêsan vedihewîne. dist.zip, bi qasî vê:

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

Ya mayî çend amûrên hêsan in ku di pirtûkxaneyê de hatine pêçan tgalice. Pêvajoya dagirtina daneyên bikarhêner ji hêla vesazkirinê ve tête diyar kirin 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: Пожалуйста, попробуйте ещё раз. Вам нужно назвать число своего рождения (например, двадцатое); это одна или две цифры.

Karê parskirina vê konfigurasyonê û hesabkirina encama dawîn ji hêla çîna Python ve tê girtin

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

Bi rastî, çîna bingehîn FormFillingDialogManager bi dagirtina "formê", û rêbaza pola zarokan re mijûl dibe handle_completed_form jê re dibêje dema ku ew amade be dê çi bike.

Ji bilî vê herikîna sereke ya diyalogê, divê bikarhêner jî were silav kirin, û hem jî bi karanîna fermana "alîkarî" re bibe alîkar û bi karanîna fermana "derketin"ê ji jêhatîbûnê were berdan. Ji bo vê armancê di tgalice Di heman demê de şablonek jî heye, ji ber vê yekê tevahiya rêveberê diyalogê ji perçeyan pêk tê:

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 Ew bi hêsanî dixebite: ew hewl dide ku hemî pêkhateyên xwe li ser rewşa heyî ya diyalogê bi dorê bicîh bîne, û ya yekem guncan hildibijêre.

Rêvebirê diyalogê wekî bersivek ji her peyamê re tiştek Python vedigerîne. Response, ku dûv re dikare bibe nivîsek sade, an jî bi peyamek li Alice an Telegram - li gorî cîhê ku bot dimeşe; di heman demê de rewşa guhertî ya diyalogê jî heye ku divê were xilas kirin. Tevahiya vê metbexê ji hêla çînek din ve tê rêve kirin, DialogConnector, ji ber vê yekê skrîpta rasterast ji bo destpêkirina jêhatîbûnek li ser Fonksiyonên Yandex wiha xuya dike:

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

Wekî ku hûn dikarin bibînin, piraniya vê kodê pêwendiyek bi navgîniya S3 ya Object Storage re diafirîne. Hûn dikarin bixwînin ka ev pêwendiya rasterast çawa tê bikar anîn di koda tgalice de.
Rêza dawîn fonksiyonê diafirîne alice_handler - eynî ya ku me ji Yandex.Cloud re got ku gava ku em pîvanê destnîşan bikin, bikişîne --entrypoint=main.alice_handler.

Bi rastî jî ev e. Pelên çêkirî yên ji bo kombûnê, S3-wek Object Storage ji bo hilanînê, û pirtûkxaneyek Python tgalice. Bi fonksiyonên bê server û eşkerebûna Python re, ev bes e ku meriv jêhatîbûnek mirovî ya saxlem pêş bixe.

Hûn dikarin bipirsin ka çima pêdivî bû ku were afirandin tgalice? Hemî koda boringê ya ku JSON ji daxwazê ​​ber bi bersivê û ji hilanînê ber bi bîranîn û paş ve vediguhezîne di nav de ye. Di heman demê de serîlêdanek kodek birêkûpêk jî heye, fonksiyonek ji bo têgihîştina ku "Sibbat" dişibihe "Sibat" û NLU yên din ji bo feqîran. Li gorî ramana min, divê ev jixwe bes be da ku hûn di pelên yaml de prototîpên jêhatîbûnê xêz bikin bêyî ku hûn ji hûrguliyên teknîkî pir aciz bibin.

Ger hûn NLU-yek cidîtir dixwazin, hûn dikarin wê bi jêhatiya xwe ve girêbidin Rasa an DeepPavlov, lê sazkirina wan dê hewceyê dansên din ên bi tembûrê bike, nemaze li ser bê server. Heke hûn qet wekî kodkirinê hîs nakin, divê hûn çêkerek dîtbarî mîna bikar bînin Aimylogic. Dema ku tgalice diafirand, ez li ser rêgezek navîn fikirîm. Ka em bibînin ka ji vê yekê çi tê.

Erê, niha tevlî bibin alice skills sohbeta pêşdebiran, xwendin belgekirin, û ecêb biafirînin jêhatîbûn!

Source: www.habr.com

Add a comment