د Yandex.Cloud او Python د سرور پرته دندو په کارولو سره د ایلیس لپاره د دولت مهارت رامینځته کول

راځئ چې د خبرونو سره پیل وکړو. پرون Yandex.Cloud اعلان وکړ چې د سرور پرته کمپیوټري خدمت پیل کړي د Yandex کلاوډ فعالیتونه. د دې معنی دا ده: تاسو یوازې د خپل خدمت لپاره کوډ ولیکئ (د مثال په توګه ، ویب اپلیکیشن یا چیټ بوټ) ، او کلاوډ پخپله مجازی ماشینونه رامینځته کوي او ساتي چیرې چې دا چلیږي ، او حتی د بار ډیریدو په صورت کې یې تکراروي. تاسو اړتیا نلرئ فکر وکړئ ، دا خورا اسانه دی. او تادیه یوازې د محاسبې وخت لپاره ده.

په هرصورت، ځینې ممکن هیڅ پیسې ورنکړي. دا پرمخ وړونکي دي د الیس بهرني مهارتونه، دا دی چې په دې کې جوړ شوي chatbots. هر پرمخ وړونکی کولی شي دا ډول مهارت ولیکي، کوربه او راجستر کړي، او له نن ورځې څخه دا مهارتونه حتی کوربه کولو ته اړتیا نلري - یوازې خپل کوډ بادل ته په فورمه کې اپلوډ کړئ ورته بې سرور فعالیت.

مګر یو څو لنډیزونه شتون لري. لومړی ، ستاسو د پیټ کوډ ممکن ځینې انحصار ته اړتیا ولري ، او کلاوډ ته یې راښکته کول غیر معمولي دي. دوهم، کوم نورمال چیټباټ اړتیا لري چې د خبرو اترو حالت په کوم ځای کې ذخیره کړي (له همدې امله دولتي)؛ په بې سروره فعالیت کې د دې کولو ترټولو اسانه لاره څه ده؟ دریم ، تاسو څنګه کولی شئ د الیس یا حتی یو ډول بوټ لپاره د غیر صفر پلاټ سره ګړندي او خندا مهارت ولیکئ؟ مقاله په حقیقت کې د دې نزاکتونو په اړه ده.

د Yandex.Cloud او Python د سرور پرته دندو په کارولو سره د ایلیس لپاره د دولت مهارت رامینځته کول

اخلاقي چمتووالی

د بې صبرۍ لپاره: زه کلاوډ ته د فنکشن اپلوډ کولو دمخه د میک فایل سره اړین انحصار راټولوم ، زه د ډیالوګ حالت په Yandex Object Storage کې ذخیره کوم (دا د S3 API ملاتړ کوي) ، او زه د ډیالوګ اداره کولو لپاره خپل کتابتون کاروم tgalice. په پای کې دا معلومه شوه داسې د ډیمو مهارت. اوس راځئ چې دا ټول په لږ تفصیل سره وګورو.

د هغو کسانو لپاره چې لږ بې صبره دي، مخکې له دې چې د پیچلتیا په اړه زما کیسه کې ډوب کړئ، زه په کلکه وړاندیز کوم چې د یو څه ساده سره پیل وکړم. د مثال په توګه ، د واحد فایل ایکوبوټ فنکشن رامینځته کړئ ، ثبت کړئ او د ډیالوګ پراختیا کونکي کنسول کې یې ازموینه وکړئ؛ جزیات - په د خبرو اترو بلاګ и د کلاوډ اسناد. او یوازې بیا پیل کړئ.

که تاسو غواړئ سمدلاسه احساس وکړئ چې موږ دلته د څه لپاره جنګیږو، له الیس څخه پوښتنه وکړئ.د "IT horoscope" مهارت فعال کړئ'. لاندې خبرې اترې باید ترسره شي:

ایلیس: سلام! تاسو د "IT Horoscope" مهارت کې یاست. "پیل" ووایاست ترڅو ومومئ چې ستوري تاسو سره څه ژمنه کوي.
کارن: پیل
ځواب: مهرباني وکړئ خپل نوم ولیکئ
یو: ویسیوالی
ځواب: اوس راته د زیږون کال ووایه. یوازې څلور عدده، هیڅ اضافي نه.
یو: دوهم
ځواب: مهرباني وکړئ بیا هڅه وکړئ. د خپل زیږون کال دننه کړئ - څلور عدد.
یو: ۲۰۰۲
يو غوره! اوس د خپل زیږون میاشت نوم کړئ.
یو: فبروري
يو غوره! په پای کې، ما ته د زیږون نیټه ووایاست - یوازې یوه شمیره، یوازې یو یا دوه عددونه.
یو: ۲۰۰۲
ځواب: مننه، واسعالی! اوس موږ پوهیږو: تاسو 17 کلن یاست او Aquarius یاست. ښه، البته، تاسو بختور یاست! ستوري درته وايي: а что говорят звёзды, вы узнаете, запустив навык.

ستونزه دا ده چې حتی د داسې ساده ډیالوګ ساتلو لپاره ، تاسو اړتیا لرئ د کارونکي نوم او د زیږون نیټه په یاد ولرئ ، او د سرور پرته فعالیت چاپیریال کې دا غیر معمولی دی. دا به امکان ونلري چې شرایط په RAM کې یا په ډیسک کې د فایل په توګه ذخیره کړئ ، ځکه چې Yandex.Cloud کولی شي په ورته وخت کې په څو مجازی ماشینونو کې فعالیت پرمخ بوځي او په خپله خوښه د دوی ترمینځ تیر کړي. تاسو باید یو ډول بهرنۍ ذخیره وکاروئ. د آبجیکٹ ذخیره په مستقیم ډول په Yandex.Cloud کې د کافي ارزانه او غیر پیچلي ذخیره په توګه غوره شوې (یعنې شاید ګړندي). د وړیا بدیل په توګه، تاسو کولی شئ هڅه وکړئ، د بیلګې په توګه، وړیا ټوټه ورېځې مونګا چیرته لرې. د دواړو آبجیکٹ ذخیره کولو (کوم چې د S3 انٹرفیس ملاتړ کوي) او مونګو لپاره مناسب Python ریپرونه شتون لري.

بله ستونزه دا ده چې د آبجیکٹ ذخیره، MongoDB، او کوم بل ډیټابیس یا ډیټا ذخیره ته د لاسرسي لپاره، تاسو ځینې بهرني انحصار ته اړتیا لرئ چې ستاسو د فنکشن کوډ سره د Yandex Functions ته اپلوډ کولو ته اړتیا لري. او زه غواړم دا په اسانۍ سره ترسره کړم. له بده مرغه، دا به په بشپړه توګه اسانه نه وي (لکه په هیروکو کې)، مګر د چاپیریال جوړولو لپاره د سکریپټ په لیکلو سره یو څه لومړني آرامۍ رامینځته کیدی شي (فایل جوړ کړئ).

د هوروسکوپ مهارت څنګه پیل کړئ

  1. چمتو کړئ: د لینکس سره ځینې ماشین ته لاړ شئ. په اصولو کې، تاسو ممکن د وینډوز سره هم کار وکړئ، مګر بیا تاسو باید د میک فایل په لاره اچولو سره یو څه جادو ترسره کړئ. او په هر حالت کې، تاسو به لږترلږه Python 3.6 نصب ته اړتیا ولرئ.
  2. له ګیتوب څخه یې کلون کړئ د هوروسکوپ مهارت مثال.
  3. په Y.Cloud کې راجستر کړئ: https://cloud.yandex.ru
  4. خپل ځان ته دوه بالټونه جوړ کړئ د ذخیرې ذخیره، دوی ته په هر نوم غږ وکړئ {BUCKET NAME} и tgalice-test-cold-storage (دا دوهم نوم اوس په هارډ کوډ شوی دی main.py زما مثال). لومړی بالټ به یوازې د ځای په ځای کولو لپاره اړین وي ، دوهم - د ډیالوګ حالتونو ذخیره کولو لپاره.
  5. رامنځ ته د خدمت حساب، هغه ته یو رول ورکړئ editor، او د دې لپاره جامد سندونه ترلاسه کړئ {KEY ID} и {KEY VALUE} - موږ به دوی د خبرو اترو حالت ثبتولو لپاره وکاروو. دا ټول اړین دي ترڅو د Ya.Cloud څخه یو فنکشن د Ya.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 د سرور پرته دندو په کارولو سره د ایلیس لپاره د دولت مهارت رامینځته کول

د هود لاندې څه دي

د میک فایل په حقیقت کې د انحصارونو نصبولو او آرشیف کې اچولو لپاره خورا ساده سکریپټ لري 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 هغې ته وايي چې څه وکړي کله چې هغه چمتو وي.

د خبرو اترو د دې اصلي جریان سربیره، کارونکي ته باید ښه راغلاست هم ورکړل شي، او همدارنګه د "مدد" کمانډ په کارولو سره مرسته ورکړل شي او د "exit" کمانډ په کارولو سره د مهارت څخه خوشې شي. د دې هدف لپاره په 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، کوم چې بیا په ساده متن کې بدلیدلی شي ، یا په ایلیس یا ټلیګرام کې پیغام کې بدلیدلی شي - پدې پورې اړه لري چې بوټ چیرې روان دی؛ دا د ډیالوګ بدل شوی حالت هم لري چې باید خوندي شي. دا ټول پخلنځي د بل ټولګي لخوا اداره کیږي، DialogConnector، نو په Yandex افعال کې د مهارت پیل کولو لپاره مستقیم سکریپټ داسې ښکاري:

...
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 انٹرفیس سره اړیکه رامینځته کوي. تاسو کولی شئ ولولئ چې دا اړیکه په مستقیم ډول څنګه کارول کیږي په tgalice کوډ کې.
وروستۍ کرښه فنکشن رامینځته کوي alice_handler - هماغه یو چې موږ د Yandex.Cloud ته وویل چې راوباسي کله چې موږ پیرامیټر تنظیم کړو --entrypoint=main.alice_handler.

دا ټول دي، په حقیقت کې. د اسمبلۍ لپاره میک فایلونه، د شرایطو ذخیره کولو لپاره د S3 په څیر آبجیکٹ ذخیره، او د Python کتابتون tgalice. د Python د بې سروره دندو او څرګندتیا سره یوځای، دا د صحي انساني مهارتونو پراختیا لپاره کافي دی.

تاسو شاید پوښتنه وکړئ چې ولې دا اړینه وه چې رامینځته شي tgalice؟ ټول بورینګ کوډ چې JSONs له غوښتنې څخه ځواب ته او له ذخیره کولو څخه حافظې ته لیږدوي او بیرته په دې کې دي. د منظم کوډ غوښتنلیک هم شتون لري، د دې پوهیدو لپاره چې "فبروري" د "فبروري" سره ورته دی، او د غریبانو لپاره نور NLU. زما د نظر له مخې ، دا باید لا دمخه کافي وي نو تاسو کولی شئ د تخنیکي توضیحاتو له پامه غورځولو پرته د یامل فایلونو کې د مهارتونو پروټوټایپونه سکیچ کړئ.

که تاسو یو ډیر جدي NLU غواړئ، تاسو کولی شئ دا د خپل مهارت سره ضمیمه کړئ راسا او یا ډیپ پاولوف، مګر د دوی تنظیم کول به د تیمبورین سره اضافي نڅا ته اړتیا ولري ، په ځانګړي توګه بې سرور کې. که تاسو د کوډ کولو په څیر احساس نه کوئ، تاسو باید د بصری جوړونکي څخه کار واخلئ Aimylogic. کله چې ټیګالیس رامینځته کړم ، ما د یو ډول مینځنۍ لارې په اړه فکر وکړ. راځئ وګورو چې له دې څخه څه راځي.

ښه، اوس یوځای شئ د ایلیس مهارتونو پراختیا کونکي چیٹلوستل اسناد، او په زړه پورې جوړ کړئ مهارتونه!

سرچینه: www.habr.com

Add a comment