Yandex.Cloud ve Python'un sunucusuz işlevlerinde Alice için durum bilgisi olan bir beceri oluşturma

Haberlerle başlayalım. Dün Yandex.Cloud sunucusuz bilgi işlem hizmetinin başlatıldığını duyurdu Yandex Bulut İşlevleri. Bu şu anlama gelir: Siz yalnızca hizmetinizin kodunu yazarsınız (örneğin, bir web uygulaması veya bir sohbet robotu) ve Bulutun kendisi, çalıştığı sanal makineleri oluşturur ve bakımını yapar ve hatta yük artarsa ​​bunları çoğaltır. Hiç düşünmenize gerek yok, çok kullanışlı. Ve ödeme yalnızca hesaplama süresi içindir.

Ancak bazıları hiç ödeme yapmayabilir. Bunlar geliştiriciler Alice'in dış becerileriyani yerleşik sohbet robotları. Herhangi bir geliştirici böyle bir beceriyi yazabilir, barındırabilir ve kaydedebilir ve bugünden itibaren becerilerin barındırılmasına bile gerek yoktur; yalnızca kodlarını formdaki buluta yüklemeniz yeterlidir aynı sunucusuz işlev.

Ancak birkaç nüans var. Öncelikle pit kodunuz bazı bağımlılıklar gerektirebilir ve bunları Bulut'a sürüklemek önemsiz değildir. İkinci olarak, herhangi bir normal chatbotun diyaloğun durumunu bir yerde saklaması gerekir (bu nedenle durum bilgisi vardır); Sunucusuz bir işlevde bunu yapmanın en kolay yolu nedir? Üçüncüsü, Alice için hızlı ve kirli bir beceriyi veya hatta sıfır olmayan bir komploya sahip bir tür botu nasıl yazabilirsiniz? Makale aslında bu nüanslarla ilgili.

Yandex.Cloud ve Python'un sunucusuz işlevlerinde Alice için durum bilgisi olan bir beceri oluşturma

Ahlaki hazırlık

Sabırsızlar için: İşlevi buluta yüklemeden önce gerekli bağımlılıkları bir makefile ile topluyorum, iletişim kutusunun durumunu Yandex Object Storage'da saklıyorum (S3 API'yi destekliyor) ve iletişim kutusunu yönetmek için kendi kitaplığımı kullanıyorum tgalice. Sonunda ortaya çıkıyor bu tür demo becerisi. Şimdi tüm bunlara biraz daha detaylı bakalım.

Daha az sabırsız olanlar için karmaşıklık hakkındaki hikayeme dalmadan önce basit bir şeyle başlamanızı şiddetle tavsiye ederim. Yani, tek dosyalı bir echobot işlevi oluşturun, bunu Dialogs geliştirici konsoluna kaydedin ve test edin; ayrıntılar - içinde Diyaloglar blogu и Bulut belgeleri. Ve ancak o zaman başlayın.

Burada ne için savaştığımızı hemen hissetmek istiyorsanız Alice'e sorun.“BT burç” becerisini etkinleştirin'. Aşağıdakine benzer bir diyalog oluşmalıdır:

Alice: Merhaba! “BT Falı” becerisindesiniz. Yıldızların size neler vaat ettiğini öğrenmek için “Başla” deyin.
Kullanıcı: Başlat
C: Lütfen isminizi söyleyin
Yu: Vasisualiy
C: Şimdi bana doğduğun yılı söyle. Sadece dört rakam, ekstra bir şey yok.
Yu: ikinci
C: Lütfen tekrar deneyin. Doğum yılınızı dört haneli olarak girin.
Yu: 2002
C: Harika! Şimdi doğduğunuz ayı adlandırın.
Yu: Şubat
C: Harika! Son olarak bana doğum tarihinizi söyleyin; yalnızca bir sayı, yalnızca bir veya iki rakam.
Yu: 18
C: Teşekkür ederim Vasisualiy! Artık biliyoruz: 17 yaşındasınız ve Kova burcusunuz. Tabii ki şanslısın! Yıldızlar size şunu söylüyor: а что говорят звёзды, вы узнаете, запустив навык.

Sorun şu ki, bu kadar basit bir diyaloğu sürdürmek için bile kullanıcının adını ve doğum tarihini hatırlamanız gerekir ve sunucusuz bir işlev ortamında bu önemsiz değildir. İçeriği RAM'de veya diskte bir dosya olarak saklamak mümkün olmayacaktır çünkü Yandex.Cloud, bir işlevi aynı anda birden fazla sanal makinede çalıştırabilir ve bunlar arasında isteğe bağlı olarak geçiş yapabilir. Bir çeşit harici depolama kullanmanız gerekecek. Nesne Depolama, doğrudan Yandex.Cloud'da (yani muhtemelen hızlı) oldukça ucuz ve karmaşık olmayan bir depolama olarak seçildi. Ücretsiz bir alternatif olarak, örneğin ücretsiz bir parçayı deneyebilirsiniz Bulutlu Monga uzaklarda bir yerde. Hem Object Storage (S3 arayüzünü destekler) hem de Mongo için kullanışlı Python sarmalayıcıları vardır.

Diğer bir sorun ise Object Storage'a, MongoDB'ye ve diğer herhangi bir veri tabanına veya veri deposuna erişmek için, işlev kodunuzla birlikte Yandex İşlevleri'ne yüklenmesi gereken bazı harici bağımlılıklara ihtiyaç duymanızdır. Ve bunu rahatlıkla yapmak isterim. Ne yazık ki, tamamen kullanışlı olmayacaktır (Heroku'da olduğu gibi), ancak ortamı oluşturmak için bir komut dosyası yazarak (dosya oluştur) bazı temel rahatlıklar yaratılabilir.

Burç becerisi nasıl başlatılır

  1. Hazırlanın: Linux'lu bir makineye gidin. Prensip olarak, muhtemelen Windows ile de çalışabilirsiniz, ancak o zaman makefile'ı başlatırken biraz sihir yapmanız gerekecek. Her durumda en azından Python 3.6'nın kurulu olması gerekir.
  2. Github'dan klonlayın burç becerisi örneği.
  3. Y.Cloud'a kaydolun: https://cloud.yandex.ru
  4. Kendinize iki kova oluşturun Nesne Depolama, onlara herhangi bir adla hitap edin {BUCKET NAME} и tgalice-test-cold-storage (bu ikinci ad artık sabit kodlanmıştır) main.py benim örneğim). İlk pakete yalnızca dağıtım için, ikinci pakete ise diyalog durumlarını depolamak için ihtiyaç duyulacaktır.
  5. Oluşturmak hizmet hesabı, ona bir rol ver editorve bunun için statik kimlik bilgilerini alın {KEY ID} и {KEY VALUE} — bunları diyaloğun durumunu kaydetmek için kullanacağız. Ya.Cloud'daki bir fonksiyonun Ya.Cloud'daki depolama alanına erişebilmesi için tüm bunlar gereklidir. Umarım bir gün yetkilendirme otomatik hale gelir ama şimdilik durum böyle.
  6. (İsteğe bağlı) kurulum komut satırı arayüzü yc. Web arayüzü üzerinden de bir işlev oluşturabilirsiniz ancak CLI iyidir çünkü her türlü yenilik içinde daha hızlı görünür.
  7. Artık bağımlılık derlemesini gerçekten hazırlayabilirsiniz: beceri örneğini içeren klasördeki komut satırında çalıştırın make all. Klasöre bir grup kitaplık (çoğunlukla her zamanki gibi gereksiz) yüklenecek dist.
  8. Nesne Deposuna elle dökün (kovanın içine) {BUCKET NAME}) önceki adımda elde edilen arşiv dist.zip. İsterseniz bunu komut satırından, örneğin kullanarak yapabilirsiniz. AWS CLI'si.
  9. Web arayüzü aracılığıyla veya bir yardımcı program kullanarak sunucusuz bir işlev oluşturun yc. Yardımcı program için komut şöyle görünecektir:

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

Manuel olarak bir fonksiyon oluştururken tüm parametreler aynı şekilde doldurulur.

Artık oluşturduğunuz işlev geliştirici konsolu aracılığıyla test edilebilir ve ardından beceri geliştirilip yayınlanabilir.

Yandex.Cloud ve Python'un sunucusuz işlevlerinde Alice için durum bilgisi olan bir beceri oluşturma

Kaputun altında ne var

Makefile aslında bağımlılıkları yüklemek ve bunları bir arşive koymak için oldukça basit bir komut dosyası içeriyor dist.zip, yaklaşık olarak şöyle:

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

Gerisi bir kütüphaneye sarılmış birkaç basit araçtır tgalice. Kullanıcı verilerini doldurma işlemi yapılandırma tarafından açıklanmaktadır. 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: Пожалуйста, попробуйте ещё раз. Вам нужно назвать число своего рождения (например, двадцатое); это одна или две цифры.

Bu yapılandırmayı ayrıştırma ve nihai sonucu hesaplama işi Python sınıfı tarafından üstlenilir.

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

Daha doğrusu temel sınıf FormFillingDialogManager "form"un doldurulması ve alt sınıf yöntemiyle ilgilenir handle_completed_form hazır olduğunda ne yapması gerektiğini söyler.

Bu ana diyalog akışına ek olarak, kullanıcının da selamlanması, "yardım" komutu kullanılarak yardım edilmesi ve "çıkış" komutu kullanılarak beceriden kurtarılması gerekir. Bunu yapmak için tgalice Ayrıca bir şablon da var, dolayısıyla tüm diyalog yöneticisi parçalardan oluşuyor:

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 Basitçe çalışır: tüm bileşenlerini sırasıyla diyaloğun mevcut durumuna uygulamaya çalışır ve ilk uygun olanı seçer.

İletişim yöneticisi her mesaja yanıt olarak bir Python nesnesi döndürür. Responsebotun nerede çalıştığına bağlı olarak daha sonra düz metne veya Alice veya Telegram'da bir mesaja dönüştürülebilir; aynı zamanda kaydedilmesi gereken diyaloğun değiştirilmiş durumunu da içerir. Bütün bu mutfak başka bir sınıf tarafından idare ediliyor. DialogConnector, yani Yandex İşlevlerinde bir beceriyi başlatmak için doğrudan komut dosyası şuna benzer:

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

Gördüğünüz gibi bu kodun çoğu Object Storage'ın S3 arayüzüne bağlantı oluşturuyor. Bu bağlantının doğrudan nasıl kullanıldığını okuyabilirsiniz Tgalice koduyla.
Son satır işlevi oluşturur alice_handler — parametreyi ayarladığımızda Yandex.Cloud'a çekmesini söylediğimiz şeyin aynısı --entrypoint=main.alice_handler.

Aslında hepsi bu. Derleme için Makefile dosyaları, bağlamı depolamak için S3 benzeri Object Storage ve Python kitaplığı tgalice. Python'un sunucusuz işlevleri ve ifade gücüyle birleştiğinde bu, sağlıklı bir insan becerisi geliştirmek için yeterlidir.

yaratmanın neden gerekli olduğunu sorabilirsiniz. tgalice? JSON'ları istekten yanıta, depolamadan belleğe ve geriye aktaran tüm sıkıcı kod bunun içindedir. Ayrıca düzenli bir kod uygulaması, “Şubat”ın “Şubat”a benzediğini anlama işlevi ve yoksullar için başka NLU da var. Benim fikrime göre, teknik ayrıntılarla dikkatiniz dağılmadan yaml dosyalarındaki becerilerin prototiplerini çizebilmeniz için bu zaten yeterli olmalıdır.

Daha ciddi bir NLU istiyorsanız bunu yeteneğinize ekleyebilirsiniz. Rasa veya DerinPavlovancak bunları ayarlamak, özellikle sunucusuz ortamda tefle ek danslar gerektirecektir. Eğer kodlamayı hiç sevmiyorsanız, aşağıdaki gibi bir görsel oluşturucu kullanmalısınız: Aimolojik. Tgalice'i yaratırken bir çeşit ara yol düşündüm. Bakalım bundan ne çıkacak.

Peki şimdi katıl alice beceri geliştirici sohbeti, okuman belgelemeve harikalar yaratın becerileri!

Kaynak: habr.com

Yorum ekle