Yandex.CloudずPythonのサヌバヌレス機胜䞊でAliceのステヌトフルスキルを䜜成する

ニュヌスから始めたしょう。 昚日、Yandex.Cloud はサヌバヌレス コンピュヌティング サヌビスの開始を発衚したした Yandexクラりド機胜。 これは、サヌビス (Web アプリケヌションやチャットボットなど) のコヌドを蚘述するだけで、クラりド自䜓が実行される仮想マシンを䜜成しお維持し、負荷が増加した堎合にはそれらを耇補するこずを意味したす。 䜕も考える必芁がなく、ずおも䟿利です。 そしお、支払いは蚈算時のみに発生したす。

ただし、たったく支払わない人もいたす。 これらは開発者です アリスの倖郚スキル、぀たりチャットボットが組み蟌たれおいたす。 開発者は誰でもこのようなスキルを䜜成、ホスト、登録できたす。今日からはスキルをホストする必芁さえなくなり、コヌドを次の圢匏でクラりドにアップロヌドするだけです。 同じサヌバヌレス機胜.

ただし、いく぀かのニュアンスがありたす。 たず、ペット コヌドにはいく぀かの䟝存関係が必芁な堎合があり、それらをクラりドにドラッグするのは簡単ではありたせん。 次に、通垞のチャットボットはダむアログの状態をどこかに保存する必芁がありたす (したがっおステヌトフルです)。 サヌバヌレス関数で最も簡単な方法でそれを行うにはどうすればよいですか? 第䞉に、アリス甚の簡単なスキルや、れロ以倖のプロットを持぀ある皮のボットを䜜成するにはどうすればよいでしょうか? これらのニュアンスに぀いおは、実際には蚘事です。

Yandex.CloudずPythonのサヌバヌレス機胜䞊でAliceのステヌトフルスキルを䜜成する

道埳的な準備

せっかちな人向け: 関数をクラりドにアップロヌドする前に、makefile で必芁な䟝存関係を収集し、ダむアログの状態を Yandex Object Storage (S3 API をサポヌトしおいたす) に保存し、独自のラむブラリを䜿甚しおダむアログを管理したす ツガリス. その結果、 そのような デモスキル。 それでは、これらすべおをもう少し詳しく分析しおみたしょう。

それほどせっかちではない方のために、耇雑な話に入る前に、簡単なこずから始めるこずを匷くお勧めしたす。 ぀たり、単䞀ファむルの゚コヌボット関数を䜜成し、Dialog 開発者コン゜ヌルに登録しおテストしたす。 詳现 - で ブログでの察話 О クラりドドキュメント。 そしおそれから始めおください。

私たちが䜕のために戊っおいるのかをすぐに知りたければ、アリスに聞いおください。」スキル「IT星占い」をオンにする'。 次のようなダむアログが衚瀺されたす。

アリスこんにちは あなたは「ITホロスコヌプ」スキルを持っおいたす。 「スタヌト」ず蚀っお、星があなたに䜕を玄束するかを調べおください。
ナヌザヌ: 開始
A: お名前を蚀っおください。
ゆうノァシゞュアリヌ
A: では、あなたの生たれた幎を教えおください。 たったの XNUMX 桁で、それ以䞊は䜕もありたせん。
ゆXNUMX番目
A: もう䞀床詊しおください。 あなたの誕生幎を XNUMX 桁で入力しおください。
ゆう2002幎
玠晎らしい では、あなたの誕生月に名前を付けおください。
ゆXNUMX月
玠晎らしい 最埌に、あなたの生幎月日を教えおください。数字だけ、XNUMX 桁か XNUMX 桁だけでいいです。
ゆう18幎
A: ありがずう、ノァシシャル 今、私たちは知っおいたすあなたは17歳で、氎瓶座です。 もちろん、ここであなたは幞運です 星が教えおくれる а чтП гПвПрят звёзЎы, вы узМаете, запустОв Мавык.

問題は、このような単玔なダむアログを維持するためにも、ナヌザヌの名前ず生幎月日を芚えおおく必芁があるこずです。サヌバヌレス環境では、これは簡単ではありたせん。 コンテキストを RAM に保存したり、ディスク䞊のファむルずしお保存したりするこずはできたせん。 Yandex.Cloud は、耇数の仮想マシンで同時に機胜を実行し、それらを任意に切り替えるこずができたす。 䜕らかの倖郚ストレヌゞを䜿甚する必芁がありたす。 オブゞェクト ストレヌゞは、Yandex.Cloud 内で盎接、かなり安䟡でシンプルなストレヌゞ (぀たり、おそらく高速) ずしお遞択されたした。 無料の代替案ずしお、たずえば無料の䜜品を詊すこずができたす。 曇りモンギ どこか遠くに。 Object Storage (S3 むンタヌフェヌスをサポヌト) ず Mongo には䞡方ずも䟿利な Python ラッパヌがありたす。

もう XNUMX ぀の問題は、オブゞェクト ストレヌゞ、MongoDB、その他のデヌタベヌスやデヌタ ストアにアクセスするには、関数コヌドずずもに Yandex Functions にアップロヌドする必芁がある倖郚䟝存関係が必芁になるこずです。 そしお気楜にやっおいきたいず思いたす。 これは (heroku のように) 非垞に䟿利ですが、残念ながら機胜したせんが、環境を構築するためのスクリプト (メむク ファむル) を䜜成するこずで、基本的な快適さを䜜り出すこずができたす。

ホロスコヌプスキルの始め方

  1. 準備: Linux を実行しおいるマシンにログむンしたす。基本的には、 Windows これもおそらくうたくいくでしょうが、Makefileを実行するには倚少の工倫が必芁です。いずれにしおも、Python 3.6以降がむンストヌルされおいる必芁がありたす。
  2. github からクロヌンする 星占いスキルの䟋.
  3. Ya.Cloud に登録したす。 https://cloud.yandex.ru
  4. XNUMX ぀のバケットを自分で䜜成したす オブゞェクト蚘憶域、任意の名前で呌んでください {BUCKET NAME} О tgalice-test-cold-storage (このミドルネヌムは珟圚ハヌドコヌドされおいたす main.py 私の䟋。 最初のバケットはデプロむメントにのみ必芁で、XNUMX 番目のバケットはダむアログの状態を保存するために必芁です。
  5. 䜜りたす サヌビスアカりント、圌に圹割を䞎えたす editor、その静的認蚌情報を取埗したす {KEY ID} О {KEY VALUE} - 察話の状態を蚘録するために䜿甚したす。 これらはすべお、Ya.Cloud の関数が Ya.Cloud のストレヌゞにアクセスできるようにするために必芁です。 い぀か認蚌が自動的に行われるこずを願っおいたすが、今のずころはそうです。
  6. (オプション) むンストヌル コマンドラむンむンタヌフェヌス yc。 Web むンタヌフェむスを通じお関数を䜜成するこずもできたすが、あらゆる皮類のむノベヌションがより速く衚瀺されるため、CLI の方が優れおいたす。
  7. これで、実際に䟝存関係のアセンブリを準備できたす。スキルの䟋を含むフォルダヌからコマンド ラむンで実行したす。 make all。 倚数のラむブラリ (通垞どおり、ほずんどは䞍芁) がフォルダヌにむンストヌルされたす dist.
  8. オブゞェクトストレヌゞにペンで蚘入したすバケツに入れたす {BUCKET NAME}) 前のステップで取埗したアヌカむブ dist.zip。 必芁に応じお、たずえば次のようにコマンドラむンからこれを実行するこずもできたす。 AWSCLI.
  9. Web むンタヌフェむスたたはナヌティリティを䜿甚しおサヌバヌレス関数を䜜成する 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のサヌバヌレス機胜䞊でAliceのステヌトフルスキルを䜜成する

ボンネットの䞋には䜕があるのか

実際、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 準備ができたら䜕をすべきかを䌝えたす。

ナヌザヌのダむアログのこの䞻な流れに加えお、ナヌザヌに挚拶したり、「help」コマンドでヘルプを発行したり、「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ボットが実行されおいる堎所に応じお、プレヌン テキストに倉換したり、Alice や Telegram のメッセヌゞに倉換したりできたす。 これには、保存する必芁があるダむアログの倉曎された状態も含たれたす。 このキッチンはすべお別のクラスが担圓しおいたす、 DialogConnectorしたがっお、Yandex Functions でスキルを開始するための盎接スクリプトは次のようになりたす。

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

実際、それだけです。 ビルド甚の Makefile、コンテキスト ストレヌゞ甚の S3 のようなオブゞェクト ストレヌゞ、および Python ラむブラリ tgalice。 Python のサヌバヌレス機胜ず衚珟力を組み合わせるず、これは健党な人間のスキルを開発するのに十分です。

なぜ䜜成する必芁があるのか​​ず疑問に思うかもしれたせん。 tgalice? JSON をリク゚ストからレスポンス、ストレヌゞからメモリ、そしおその逆に転送する退屈なコヌドはすべおこの䞭にありたす。 通垞のアプリケヌションや、「XNUMX月」が「XNUMX月」に䌌おいるこずを理解するための機胜、その他貧困局向けのNLUもありたす。 私の考えによれば、技術的な詳现にあたり気をずられるこずなく、yaml ファむルでスキルのプロトタむプをスケッチできるようにするには、これで十分なはずです。

より本栌的な NLU が必芁な堎合は、自分のスキルに合わせお調敎できたす ラヌザ たたは ディヌプパブロフただし、特にサヌバヌレスでは、それらをセットアップするには、タンバリンを䜿った远加のダンスが必芁になりたす。 コヌディングする気がたったくない堎合は、ビゞュアルタむプコンストラクタヌを䜿甚しおください。 アむミロゞック。 tgalice を䜜成するずき、私はある皮の䞭間パスを考えたした。 しばらく様子を芋おみたしょう。

さお、今すぐ参加しおください Aliy スキル開発者チャット、 読んだ ドキュメンテヌションそしお玠晎らしいものを生み出す スキル!

出所 habr.com

DDoS 保護機胜を備えた信頌性の高いサむト甚ホスティング、VPS VDS サヌバヌを賌入する 🔥 DDoS攻撃察策付きの信頌性の高いりェブサむトホスティング、VPS/VDSサヌバヌを賌入したしょう | ProHoster