Ṣiṣẹda ọgbọn ipinlẹ fun Alice lori awọn iṣẹ olupin ti Yandex.Cloud ati Python

Jẹ ká bẹrẹ pẹlu awọn iroyin. Lana Yandex.Cloud kede ifilọlẹ ti iṣẹ iširo olupin laisi olupin Awọn iṣẹ awọsanma Yandex. Eyi tumọ si: o kọ koodu iṣẹ rẹ nikan (fun apẹẹrẹ, ohun elo wẹẹbu kan tabi chatbot), ati awọsanma funrararẹ ṣẹda ati ṣetọju awọn ẹrọ foju nibiti o nṣiṣẹ, ati paapaa ṣe atunṣe wọn ti ẹru naa ba pọ si. O ko ni lati ronu rara, o rọrun pupọ. Ati sisanwo lọ nikan fun akoko awọn iṣiro.

Sibẹsibẹ, diẹ ninu awọn eniyan le ma sanwo rara. Awọn wọnyi ni awọn olupilẹṣẹ Alice ká ita ogbon, iyẹn, chatbots ti a ṣe sinu rẹ. Eyikeyi Olùgbéejáde le kọ, gbalejo ati forukọsilẹ iru ọgbọn kan, ati lati oni awọn ọgbọn ko paapaa nilo lati gbalejo - kan gbe koodu wọn si awọsanma ni fọọmu naa kanna serverless iṣẹ.

Ṣugbọn awọn nuances meji wa. Ni akọkọ, koodu ọsin rẹ le nilo diẹ ninu awọn igbẹkẹle, ati pe kii ṣe nkan lati fa wọn sinu Awọsanma. Ẹlẹẹkeji, eyikeyi deede chatbot nilo lati fi awọn ipo ti awọn ajọṣọ ibikan (stateful nitorina); bawo ni a ṣe le ṣe ni iṣẹ ti ko ni olupin ni ọna ti o rọrun julọ? Ni ẹkẹta, bawo ni o ṣe le kọ iyara-ati-idọti ọgbọn fun Alice tabi paapaa iru bot kan pẹlu idite ti kii ṣe odo? Nipa awọn nuances wọnyi, ni otitọ, nkan naa.

Ṣiṣẹda ọgbọn ipinlẹ fun Alice lori awọn iṣẹ olupin ti Yandex.Cloud ati Python

iwa igbaradi

Fun alaisan: Mo gba awọn igbẹkẹle pataki pẹlu makefile ṣaaju ikojọpọ iṣẹ naa si awọsanma, Mo tọju ipo ajọṣọ naa ni Ibi ipamọ Nkan Yandex (o ṣe atilẹyin API S3), ati pe Mo lo ile-ikawe ti ara mi lati ṣakoso ọrọ sisọ naa. tgalice. Bi abajade, o wa ni jade iru demo olorijori. Ati nisisiyi jẹ ki a ṣe itupalẹ gbogbo eyi ni awọn alaye diẹ sii.

Fun ailagbara diẹ diẹ, ṣaaju ki o to omiwẹ sinu itan-akọọlẹ ti idiju, Mo ṣeduro gaan lati bẹrẹ irọrun. Eyun, ṣẹda iṣẹ echobot faili kan ṣoṣo, forukọsilẹ ki o ṣe idanwo rẹ ni console Olùgbéejáde Dialog; awọn alaye - ni Awọn ibaraẹnisọrọ bulọọgi и awọsanma iwe aṣẹ. Ati ki o nikan ki o si bẹrẹ.

Ti o ba fẹ lati rilara ohun ti a n ja fun lẹsẹkẹsẹ, beere Alice 'tan-an ọgbọn “horoscope IT”' . Ifọrọwanilẹnuwo atẹle yẹ ki o waye:

Alice: Hello! O wa ninu ọgbọn “ horoscope IT”. Sọ "Bẹrẹ" lati wa ohun ti awọn irawọ ṣe ileri fun ọ.
Olumulo: Bẹrẹ
A: Jọwọ sọ orukọ rẹ.
Yu: Vasisualy
A: Bayi so fun mi odun ibi rẹ. Nikan mẹrin awọn nọmba, ohunkohun siwaju sii.
Yu: keji
A: Jọwọ gbiyanju lẹẹkansi. Sọ ọdun ti ibimọ rẹ - awọn nọmba mẹrin.
Yu: 2002
A: Nla! Nísisìyí dárúkọ oṣù ìbí rẹ.
Yu: Kínní
A: Nla! Ni ipari, sọ ọjọ ibi rẹ fun mi - nọmba kan, o kan awọn nọmba kan tabi meji.
Yu: 18
A: O ṣeun, Vasisual! Bayi a mọ: o jẹ ọdun 17 ati pe o jẹ Aquarius. Nibi ti o ba wa, dajudaju, orire! Awọn irawọ sọ fun ọ а что говорят звёзды, вы узнаете, запустив навык.

Iṣoro naa ni pe lati ṣetọju paapaa iru ọrọ sisọ ti o rọrun, o nilo lati ranti orukọ ati ọjọ ibi ti olumulo, ati ni agbegbe ti ko ni olupin eyi kii ṣe nkan. Kii yoo ṣiṣẹ lati tọju ọrọ-ọrọ ni Ramu tabi bi faili lori disk, nitori Yandex.Cloud le ṣiṣẹ iṣẹ naa lori awọn ẹrọ foju pupọ ni akoko kanna ati yipada laarin wọn lainidii. Iwọ yoo ni lati lo iru ibi ipamọ ita kan. Ibi ipamọ Nkan ni a yan bi ilamẹjọ ti ko gbowolori ati ibi ipamọ ti o rọrun taara ni Yandex.Cloud (iyẹn, boya yarayara). Bi yiyan ọfẹ, o le gbiyanju, fun apẹẹrẹ, nkan ọfẹ kan Awọsanma Mongi ibikan jina kuro. Ibi ipamọ Nkan mejeeji (o ṣe atilẹyin wiwo S3) ati Mongo ni awọn ohun elo Python irọrun.

Iṣoro miiran ni pe lati le lọ si Ibi ipamọ Nkan, MongoDB, ati eyikeyi data data miiran tabi ile itaja data, o nilo diẹ ninu awọn igbẹkẹle ita ti o nilo lati gbe si Awọn iṣẹ Yandex pẹlu koodu iṣẹ rẹ. Ati pe Emi yoo fẹ lati ṣe ni itunu. O rọrun patapata (bii lori heroku), alas, kii yoo ṣiṣẹ, ṣugbọn o le ṣẹda diẹ ninu itunu ipilẹ nipa kikọ iwe afọwọkọ lati kọ ayika (ṣe faili).

Bii o ṣe le bẹrẹ ọgbọn horoscope

  1. Ṣetan: lọ si ẹrọ diẹ pẹlu Linux. Ni opo, o le ṣee ṣiṣẹ pẹlu Windows paapaa, ṣugbọn lẹhinna o ni lati ṣajọpọ pẹlu ifilọlẹ makefile naa. Ati ni eyikeyi ọran, iwọ yoo nilo o kere ju 3.6 ti fi sori ẹrọ Python.
  2. Oniye lati github apẹẹrẹ ti horoscope olorijori.
  3. Forukọsilẹ ni Ya.Cloud: https://cloud.yandex.ru
  4. Ṣẹda awọn buckets meji ni ara rẹ Ibi apamọ, pe wọn ni eyikeyi orukọ {BUCKET NAME} и tgalice-test-cold-storage (orukọ arin yii ti ni koodu lile sinu main.py apẹẹrẹ mi). Garawa akọkọ yoo nilo nikan fun imuṣiṣẹ, keji - fun titoju awọn ipinlẹ ajọṣọ.
  5. Ṣẹda iroyin iṣẹ, fun u ni ipa kan editor, ati gba awọn iwe-ẹri aimi fun rẹ {KEY ID} и {KEY VALUE} - a yoo lo wọn lati ṣe igbasilẹ ipo ti ibaraẹnisọrọ naa. Gbogbo eyi ni a nilo ki iṣẹ lati Ya.Cloud le wọle si ibi ipamọ lati Ya.Cloud. Ni ọjọ kan, Mo nireti, aṣẹ yoo di adaṣe, ṣugbọn fun bayi - bẹ.
  6. (Iyan) fi sori ẹrọ pipaṣẹ ila ni wiwo yc. O tun le ṣẹda iṣẹ kan nipasẹ wiwo wẹẹbu, ṣugbọn CLI dara nitori gbogbo iru awọn imotuntun han ninu rẹ ni iyara.
  7. Bayi o le, ni otitọ, mura apejọ ti awọn igbẹkẹle: ṣiṣẹ lori laini aṣẹ lati folda pẹlu apẹẹrẹ ọgbọn make all. Apọpọ awọn ile-ikawe (julọ, bii igbagbogbo, ti ko wulo) yoo fi sii ninu folda naa dist.
  8. Fọwọsi pẹlu awọn aaye sinu Ibi ipamọ Nkan (sinu garawa kan {BUCKET NAME}) iwe ipamọ ti o gba ni igbesẹ ti tẹlẹ dist.zip. Ti o ba fẹ, o tun le ṣe eyi lati laini aṣẹ, fun apẹẹrẹ, lilo Aws CLI.
  9. Ṣẹda iṣẹ ti ko ni olupin nipasẹ wiwo wẹẹbu tabi lilo ohun elo naa yc. Fun IwUlO, aṣẹ naa yoo dabi eyi:

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

Nigbati o ba ṣẹda iṣẹ pẹlu ọwọ, gbogbo awọn paramita ti kun ni ọna kanna.

Bayi iṣẹ ti o ṣẹda le ṣe idanwo nipasẹ console olupilẹṣẹ, ati lẹhinna pari ati ọgbọn ti a tẹjade.

Ṣiṣẹda ọgbọn ipinlẹ fun Alice lori awọn iṣẹ olupin ti Yandex.Cloud ati Python

Ohun ti o wa labẹ awọn Hood

Makefile ni gangan ni iwe afọwọkọ ti o rọrun fun fifi awọn igbẹkẹle sori ẹrọ ati fifi wọn sinu ile-ipamọ kan. dist.zip, nkan bi eleyi:

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

Iyokù jẹ awọn irinṣẹ irọrun diẹ ti a we sinu ile-ikawe kan tgalice. Ilana ti kikun ni data olumulo jẹ apejuwe nipasẹ atunto 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: Пожалуйста, попробуйте ещё раз. Вам нужно назвать число своего рождения (например, двадцатое); это одна или две цифры.

Kilasi Python gba iṣẹ ṣiṣe atunto atunto yii ati ṣe iṣiro abajade ikẹhin

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

Ni deede diẹ sii, kilasi mimọ FormFillingDialogManager ti wa ni npe ni àgbáye jade ni "fọọmu", ati awọn ọna ti ọmọ kilasi handle_completed_form sọ ohun ti o ṣe nigbati o ba ṣetan.

Ni afikun si ṣiṣan akọkọ ti ọrọ sisọ, olumulo gbọdọ tun ni ikini, bakannaa fun iranlọwọ lori aṣẹ “iranlọwọ” ati itusilẹ lati ọgbọn lori aṣẹ “jade”. Fun eyi ni tgalice awoṣe tun wa, nitorinaa gbogbo oluṣakoso ajọṣọ jẹ awọn ege:

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 ṣiṣẹ ni irọrun: o gbiyanju lati kan si ipo lọwọlọwọ ti ijiroro gbogbo awọn paati rẹ ni titan, ati yan akọkọ ti o yẹ.

Gẹgẹbi idahun si ifiranṣẹ kọọkan, oluṣakoso ajọṣọrọsọ da ohun elo Python pada Response, eyi ti o le ṣe iyipada si ọrọ itele, tabi sinu ifiranṣẹ ni Alice tabi Telegram - da lori ibi ti bot nṣiṣẹ; o tun ni ipo ibaraẹnisọrọ ti o yipada ti o nilo lati wa ni fipamọ. Gbogbo ibi idana ounjẹ yii jẹ itọju nipasẹ kilasi miiran, DialogConnector, nitorinaa iwe afọwọkọ taara fun ibẹrẹ ọgbọn kan lori Awọn iṣẹ Yandex dabi eyi:

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

Bii o ti le rii, pupọ julọ koodu yii ṣẹda asopọ si wiwo S3 Ibi ipamọ Nkan. Bawo ni asopọ yii ṣe lo taara, o le ka ni tgalice koodu.
Laini kẹhin ṣẹda iṣẹ kan alice_handler - eyi ti a paṣẹ lati fa Yandex.Cloud nigba ti a ṣeto paramita naa --entrypoint=main.alice_handler.

Iyẹn, ni otitọ, gbogbo rẹ jẹ. Makefiles fun kikọ, S3-bi Ibi ipamọ Nkan fun ibi ipamọ ọrọ-ọrọ, ati ile-ikawe Python kan tgalice. Paapọ pẹlu awọn ẹya ti ko ni olupin ati ikosile ti Python, eyi to lati ṣe idagbasoke ọgbọn ti eniyan ti o ni ilera.

O le beere idi ti o nilo lati ṣẹda tgalice? Gbogbo koodu alaidun ti o gbe awọn JSON lati ibeere si esi ati lati ibi ipamọ si iranti ati ẹhin wa ninu rẹ. Ohun elo deede tun wa, iṣẹ kan fun oye pe “February” jẹ iru si “February”, ati NLU miiran fun awọn talaka. Gẹgẹbi imọran mi, eyi yẹ ki o to tẹlẹ lati ni anfani lati ṣe afọwọya awọn ilana afọwọṣe ni awọn faili yaml laisi idamu pupọ nipasẹ awọn alaye imọ-ẹrọ.

Ti o ba fẹ NLU to ṣe pataki diẹ sii, o le dabaru si ọgbọn rẹ rasa tabi DeepPavlov, ṣugbọn iṣeto wọn yoo nilo afikun ijó pẹlu tambourin, paapaa lori olupin. Ti o ko ba lero bi ifaminsi rara, o yẹ ki o lo olupilẹṣẹ iru wiwo Aimylogic. Nigbati ṣiṣẹda tgalice, Mo ro nipa diẹ ninu awọn iru ti agbedemeji ona. Jẹ ká wo ohun ti o ṣẹlẹ.

O dara, ni bayi darapọ mọ Aliy ogbon Olùgbéejáde iwiregbe, ka iwe aṣẹki o si ṣẹda iyanu ogbon!

orisun: www.habr.com

Fi ọrọìwòye kun