Yandex.Cloud болон Python-ийн сервергүй функцууд дээр Алис-д төлөв байдлын ур чадварыг бий болгох

Мэдээнээс эхэлье. Өчигдөр Yandex.Cloud сервергүй тооцоолох үйлчилгээг эхлүүлж байгаагаа зарлав Yandex Cloud функцууд. Энэ нь: та зөвхөн үйлчилгээнийхээ кодыг (жишээ нь вэб програм эсвэл чатбот) бичнэ гэсэн үг бөгөөд Клоуд өөрөө ажиллаж байгаа газартаа виртуал машин үүсгэж, засвар үйлчилгээ хийж, ачаалал ихсэх үед хүртэл хуулбарлана гэсэн үг. Та огт бодох шаардлагагүй, энэ нь маш тохиромжтой. Мөн төлбөр нь зөвхөн тооцоо хийх хугацаанд л явагдана.

Гэсэн хэдий ч зарим хүмүүс огт төлөхгүй байж магадгүй юм. Эдгээр нь хөгжүүлэгчид юм Алисын гадаад ур чадвар, өөрөөр хэлбэл түүнд суулгасан чатботууд. Ямар ч хөгжүүлэгч ийм ур чадварыг бичиж, зохион байгуулж, бүртгүүлэх боломжтой бөгөөд өнөөдрөөс эхлэн ур чадваруудыг байршуулах шаардлагагүй - зүгээр л маягтаар үүлэн дээр кодоо байршуулаарай. ижил сервергүй функц.

Гэхдээ хэд хэдэн нюанс байдаг. Нэгдүгээрт, таны гэрийн тэжээмэл амьтны код зарим хамаарал шаардаж магадгүй бөгөөд тэдгээрийг Cloud руу чирэх нь тийм ч чухал биш юм. Хоёрдугаарт, аливаа ердийн чатбот нь харилцах цонхны төлөвийг хаа нэгтээ хадгалах шаардлагатай (тиймээс төлөвтэй); Үүнийг сервергүй функцээр хэрхэн хамгийн хялбар аргаар хийх вэ? Гуравдугаарт, та яаж Алис руу хурдан бохир ур чадвар, тэр ч байтугай ямар нэг төрлийн ботыг тэгээс өөр схемээр бичиж чадах вэ? Эдгээр нюансын талаар, үнэндээ, нийтлэл.

Yandex.Cloud болон Python-ийн сервергүй функцууд дээр Алис-д төлөв байдлын ур чадварыг бий болгох

ёс суртахууны бэлтгэл

Тэвчээргүй хүмүүсийн хувьд: Би функцийг клоуд руу байршуулахаас өмнө makefile ашиглан шаардлагатай хамаарлыг цуглуулж, Yandex Object Storage-д харилцах цонхны төлөвийг хадгалдаг (энэ нь S3 API-г дэмждэг), харилцах цонхыг удирдахын тулд өөрийн номын санг ашигладаг. tgalice. Үүний үр дүнд энэ нь болж байна Ийм демо ур чадвар. Одоо энэ бүгдийг арай илүү нарийвчлан шинжилье.

Тэвчээр багатай хүмүүст миний ээдрээтэй байдлын тухай өгүүлэхээсээ өмнө энгийн зүйлээс эхлэхийг зөвлөж байна. Тухайлбал, нэг файлын echobot функцийг үүсгэж, Dialog хөгжүүлэгчийн консол дээр бүртгүүлж, туршиж үзээрэй; дэлгэрэнгүй - in Блогын харилцан яриа и үүлэн баримт бичиг. Тэгээд л дараа нь эхэлнэ.

Хэрэв та бидний юуны төлөө тэмцэж байгааг шууд мэдрэхийг хүсвэл Алисаас асуугаарай."IT зурхай" ур чадварыг асаах'. Дараах яриа хэлэлцээ хийх ёстой.

Алис: Сайн уу! Та "IT зурхай" ур чадварт байна. Одод танд юу амлаж байгааг мэдэхийн тулд "Эхлэх" гэж хэлээрэй.
Хэрэглэгч: Эхлэх
Х: Нэрээ хэлнэ үү.
Ю: Васисуали
Х: Одоо надад төрсөн оныг хэлээч. Зөвхөн дөрвөн оронтой, өөр юу ч биш.
Ю: хоёрдугаарт
Х: Дахин оролдоно уу. Төрсөн жилээ дөрвөн оронтой тоогоор бичнэ үү.
Ю: 2002 он
Агуу их! Одоо төрсөн сараа нэрлэ.
Ю: Хоёрдугаар сар
Агуу их! Эцэст нь надад төрсөн он сар өдрөө хэлээрэй - зүгээр л тоо, зөвхөн нэг эсвэл хоёр оронтой тоо.
Ю: 18 он
Х: Баярлалаа, Васисуал! Одоо бид мэднэ: чи 17 настай, чи Aquarius юм. Энд та мэдээж азтай байна! Одод танд хэлж байна а что говорят звёзды, вы узнаете, запустив навык.

Асуудал нь ийм энгийн харилцах цонхыг хадгалахын тулд та хэрэглэгчийн нэр, төрсөн огноог санах хэрэгтэй бөгөөд сервергүй орчинд энэ нь тийм ч чухал биш юм. Энэ нь контекстийг RAM-д эсвэл дискэн дээрх файл хэлбэрээр хадгалахад ажиллахгүй, учир нь Yandex.Cloud нь функцийг хэд хэдэн виртуал машин дээр нэгэн зэрэг ажиллуулж, тэдгээрийн хооронд дур мэдэн шилжих боломжтой. Та ямар нэгэн гадаад санах ой ашиглах хэрэгтэй болно. Object Storage нь Yandex.Cloud дээр шууд (өөрөөр хэлбэл хурдан) нэлээд хямд бөгөөд энгийн хадгалалтаар сонгогдсон. Үнэгүй хувилбарын хувьд та жишээ нь үнэгүй хэсгийг туршиж үзэж болно Үүлэрхэг Монги хаа нэгтээ хол. Object Storage (энэ нь S3 интерфэйсийг дэмждэг) болон Mongo хоёулаа тохиромжтой Python боодолтой.

Өөр нэг асуудал бол Object Storage, MongoDB болон бусад мэдээллийн сан эсвэл өгөгдлийн сан руу орохын тулд танд функцийн кодын хамт Yandex Functions-д байршуулах шаардлагатай гадны хамаарал хэрэгтэй болно. Тэгээд аятайхан хиймээр байна. Энэ нь бүрэн тохиромжтой (heroku дээрх шиг), харамсалтай нь энэ нь ажиллахгүй, гэхдээ та орчинг (файл үүсгэх) скрипт бичих замаар үндсэн тав тухыг бий болгож чадна.

Зурхайн ур чадварыг хэрхэн эхлүүлэх вэ

  1. Бэлэн байгаарай: Линукстэй машин руу оч. Зарчмын хувьд та Windows-тэй ажиллах боломжтой, гэхдээ дараа нь makefile-ийг эхлүүлэх хэрэгтэй. Ямар ч тохиолдолд танд дор хаяж 3.6 суулгасан Python хэрэгтэй болно.
  2. Github-аас клон хийх зурхайн ур чадварын жишээ.
  3. Ya.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-ийн сервергүй функцууд дээр Алис-д төлөв байдлын ур чадварыг бий болгох

Бүрээсний доор юу байна

Makefile нь үнэндээ хамаарлыг суулгаж, архивт оруулах маш энгийн скриптийг агуулдаг. 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 бэлэн болмогц юу хийхийг нь хэлдэг.

Хэрэглэгчийн харилцан ярианы энэ үндсэн урсгалаас гадна хэрэглэгчтэй мэндлэх, мөн "тусламж" командын тусламжийг өгөх, "гарах" команд дээр ур чадвараас чөлөөлөх шаардлагатай. Үүний тулд дотор 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, дараа нь энгийн текст болгон хувиргах эсвэл Алис эсвэл Telegram дахь мессеж болгон хувиргах боломжтой - робот хаана ажиллаж байгаагаас хамааран; Энэ нь мөн хадгалах шаардлагатай харилцах цонхны өөрчлөгдсөн төлөвийг агуулдаг. Энэ бүх гал тогоог өөр анги хариуцдаг. 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

Таны харж байгаагаар энэ кодын ихэнх нь Object Storage S3 интерфейстэй холболт үүсгэдэг. Энэ холболтыг хэрхэн шууд ашиглаж байгааг уншиж болно tgalice код дээр.
Сүүлийн мөр нь функц үүсгэдэг alice_handler - параметрийг тохируулахдаа Yandex.Cloud-ийг татахыг бидэнд тушаасан зүйл --entrypoint=main.alice_handler.

Энэ бол үнэндээ бүх зүйл юм. Барилгад зориулсан Makefiles, контекст хадгалахад зориулсан S3-тэй төстэй Object Storage, мөн python номын сан tgalice. Python-ийн сервергүй шинж чанар, илэрхий байдлын хамт энэ нь эрүүл хүний ​​ур чадварыг хөгжүүлэхэд хангалттай юм.

Та яагаад бүтээх хэрэгтэй гэж асууж магадгүй юм tgalice? JSON-г хүсэлтээс хариулт руу, хадгалах сангаас санах ой руу шилжүүлдэг бүх уйтгартай кодууд үүнд оршдог. Мөн "Хоёрдугаар сар" нь "Хоёрдугаар сар"-тай төстэй гэдгийг ойлгох функц, ядуу хүмүүст зориулсан бусад NLU програм байдаг. Миний бодлоор энэ нь техникийн нарийн ширийн зүйлд хэт сатааралгүйгээр yaml файлд ур чадварын прототипийг зурахад хангалттай байх ёстой.

Хэрэв та илүү ноцтой NLU хүсэж байгаа бол, Хэрэв та өөрийн ур чадвар нь шураг болно Раса буюу Гүн Павлов, гэхдээ тэдгээрийг тохируулахын тулд хэнгэрэгтэй нэмэлт бүжиг, ялангуяа сервергүй дээр бүжиглэх шаардлагатай болно. Хэрэв танд код бичих хүсэл огтхон ч байхгүй бол визуал төрлийн бүтээгчийг ашиглах хэрэгтэй Аймилогик. Tgalice-г бүтээхдээ би ямар нэгэн завсрын замын талаар бодсон. Юу болсныг харцгаая.

За одоо нэгдээрэй Aliy чадвар хөгжүүлэгчийн чат, уншина уу баримт бичигмөн гайхалтай бүтээх ур чадвар!

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх