ืืืื ื ืชืืื ืขื ืืืืฉืืช. ืืชืืื ืืืืืขื Yandex.Cloud ืขื ืืฉืงืช ืฉืืจืืช ืืืฉืื ืืื ืฉืจืชืื
ืขื ืืืช, ืืืชืื ืฉืืืง ืืืื ืฉืื ืื ืืฉืืื ืืื. ืืื ืืืคืชืืื
ืืื ืืฉ ืืื ื ืืืื ืกืื. ืจืืฉืืช, ืงืื ืืืืช ืืืืื ืฉืื ืขืฉืื ืืืจืืฉ ืืื ืชืืืช, ืืื ืื ืืจืืืืืืื ืืืจืืจ ืืืชื ืืขื ื. ืฉื ืืช, ืื ืฆ'ืื ืืื ืจืืื ืฆืจืื ืืืืกื ืืช ืืฆื ืืื-ืฉืื ืืืคืฉืื (ืืฆืื ืืืื); ืืื ืืขืฉืืช ืืช ืื ืืคืื ืงืฆืื ืืื ืฉืจืช ืืฆืืจื ืืงืื ืืืืชืจ? ืฉืืืฉืืช, ืืื ืืชื ืืืื ืืืชืื ืืืืื ืืช ืืืืจื ืืืืืืืืช ืขืืืจ ืืืืก ืื ืืคืืื ืกืื ืฉื ืืื ืขื ืขืืืื ืฉืืื ื ืืคืก? ืขื ื ืืืื ืกืื ืืื, ืืืขืฉื, ืืืืืจ.
ืืื ื ืืืกืจืืช
ืืืกืจื ืกืืื ืืช: ืื ื ืืืกืฃ ืืช ืืชืืืช ืื ืืจืฉืช ืขื makefile ืืคื ื ืืขืืืช ืืคืื ืงืฆืื ืืขื ื, ืื ื ืืืืกื ืืช ืืฆื ืืื-ืฉืื ื-Yandex Object Storage (ืืื ืชืืื ื-S3 API), ืืื ื ืืฉืชืืฉ ืืกืคืจืืื ืฉืื ืืื ืื ืื ืืช ืืื-ืฉืื
ืืงืฆืช ืคืืืช ืืกืจื ืกืืื ืืช, ืืคื ื ืฉืฆืืืืื ืืกืืคืืจ ืืืืจืืืืช ืฉืื, ืื ื ืืืืืฅ ืืืื ืืืชืืื ืืคืฉืืืช. ืืืืืจ, ืฆืืจ ืคืื ืงืฆืืืช echobot ืฉื ืงืืืฅ ืืืื, ืจืฉืื ืืืืืง ืืืชื ืืืกืืฃ ืืืคืชืืื ืฉื Dialog; ืคืจืืื - ื
ืื ืืชื ืจืืฆื ืืืจืืืฉ ืืื ืขื ืื ืื ืื ื ื ืืืืื, ืฉืื ืืช ืืืืก'
ืืืืก: ืฉืืื! ืืชื ืืืืืื ืืช "ืืืจืืกืงืืค IT". ืืืืจ "ืืชืื" ืืื ืืืืืช ืื ืืืืืืื ืืืืืืื ืื.
ืืฉืชืืฉ: ืืชืื
ืช: ื ื ืืฆืืื ืืช ืฉืื.
Yu: Vasisualy
ืช: ืขืืฉืื ืกืคืจ ืื ืืช ืฉื ืช ืืืืชื. ืจืง ืืจืืข ืกืคืจืืช, ืื ืืืชืจ.
ืื: ืฉื ื
ืช: ืื ื ื ืกื ืฉืื. ืฆืืื ื ืืช ืฉื ืช ืืืืื ืฉืืื - ืืจืืข ืกืคืจืืช.
ืื: 2002
ืืืื! ืขืืฉืื ืชื ืฉื ืืืืืฉ ืืืืื ืฉืื.
ืื: ืคืืจืืืจ
ืืืื! ืืืกืืฃ, ืกืคืจ ืื ืืช ืชืืจืื ืืืืื ืฉืื - ืจืง ืืกืคืจ, ืจืง ืกืคืจื ืืืช ืื ืฉืชืืื.
ืื: 18
ืช: ืชืืื ืื, Vasisual! ืขืืฉืื ืื ืื ื ืืืืขืื: ืืชื ืื 17 ืืืชื ืืื. ืื ื ืืชื, ืืืืื, ืืจ ืืื! ืืืืืืื ืืืืจืื ืื ะฐ ััะพ ะณะพะฒะพััั ะทะฒัะทะดั, ะฒั ัะทะฝะฐะตัะต, ะทะฐะฟัััะธะฒ ะฝะฐะฒัะบ.
ืืืขืื ืืื ืฉืืื ืืฉืืืจ ืืคืืื ืขื ืืืืืื ืื ืื ืคืฉืื, ืฆืจืื ืืืืืจ ืืช ืืฉื ืืชืืจืื ืืืืื ืฉื ืืืฉืชืืฉ, ืืืกืืืื ืืื ืฉืจืช ืื ืื ืืจืืืืืืื. ืื ืื ืืขืืื ืืืืกื ืืช ืืืงืฉืจ ื-RAM ืื ืืงืืืฅ ืืืืกืง, ืืืื Yandex.Cloud ืืืื ืืืคืขืื ืืช ืืคืื ืงืฆืื ืขื ืืกืคืจ ืืืื ืืช ืืืจืืืืืืืช ืื ืืื ืืช ืืืขืืืจ ืืื ืืื ืืืืคื ืฉืจืืจืืชื. ืชืฆืืจื ืืืฉืชืืฉ ืืืืกืื ืืืฆืื ื ืืืฉืื. Object Storage ื ืืืจ ืืืืกืื ืื ืืื ืืคืฉืื ืืฉืืจืืช ื-Yandex.Cloud (ืืืืืจ, ืื ืจืื ืืืืจ). ืืืืืคื ืืื ืืืช, ืืชื ืืืื ืื ืกืืช, ืืืฉื, ืืฆืืจื ืืืื ื
ืืขืื ื ืืกืคืช ืืื ืฉืืื ืืขืืืจ ื-Object Storage, MongoDB ืืืื ืืกื ื ืชืื ืื ืื ืืืืจ ื ืชืื ืื ืืืจ, ืืชื ืฆืจืื ืืื ืชืืืช ืืืฆืื ืืืช ืฉืืชื ืฆืจืื ืืืขืืืช ื- Yandex Functions ืืื ืขื ืงืื ืืคืื ืงืฆืื ืฉืื. ืืื ื ืจืืฆื ืืขืฉืืช ืืช ืื ืื ืืืืช. ืื ื ืื ืืืืืืื (ืืื ื-heroku), ืืืื, ืื ืื ืืขืืื, ืืื ืืชื ืืืื ืืืฆืืจ ืงืฆืช ื ืืืืช ืืกืืกืืช ืขื ืืื ืืชืืืช ืกืงืจืืคื ืืื ืืืช ืืกืืืื (ืขืฉื ืงืืืฅ).
ืืื ืืืชืืื ืืช ืืืืื ืืช ืืืืจืืกืงืืค
- ืชืชืืื ื: ืื ืืืืื ืืืฉื ืขื ืืื ืืงืก. ืืืืคื ืขืงืจืื ื, ืกืืืจ ืืื ืื ืฉืื ืืชื ืืืื ืืขืืื ืขื Windows, ืืื ืื ืืชื ืฆืจืื ืืืขืืืช ืขื ืืืขืช ืขื ืืฉืงืช ื-makefile. ืืืื ืืงืจื, ืชืฆืืจื ืืคืืืช Python ืืืชืงื 3.6.
- ืฉืืืื ื-github
ืืืืื ืืืืืื ืืช ืืืจืืกืงืืค . - ืืจืฉืื ื-Ya.Cloud:
https://cloud.yandex.ru - ืฆืืจ ืืขืฆืื ืฉื ื ืืืืื ืคื ืืื
ืืืกืื ืืืืืืงืืื , ืงืจื ืืื ืืื ืฉื{BUCKET NAME}
ะธtgalice-test-cold-storage
(ืฉื ืืืฆืขื ืื ืืงืืื ืืขืช ืืชืืmain.py
ืืืืืื ืฉืื). ืืืื ืืจืืฉืื ืืืื ื ืืืฅ ืจืง ืืคืจืืกื, ืืฉื ื - ืืืืกืื ืืฆืื ืืืืืื. - ืืืฆืืจ
ืืฉืืื ืฉืืจืืช , ืชื ืื ืชืคืงืืeditor
, ืืงืื ืืืฉืืจืื ืกืืืืื ืขืืืจื{KEY ID}
ะธ{KEY VALUE}
- ื ืฉืชืืฉ ืืื ืืื ืืชืขื ืืช ืืฆื ืืืืืืื. ืื ืื ื ืืืฅ ืืื ืฉืืคืื ืงืฆืื ื- Ya.Cloud ืชืืื ืืืฉืช ืืืืกืื ื- Ya.Cloud. ืืชืืฉืื, ืื ื ืืงืืื, ืืืืฉืืจ ืืืคืื ืืืืืืืื, ืืื ืืขืช ืขืชื - ืื. - (ืืืคืฆืืื ืื) ืืืชืงืื
ืืืฉืง ืฉืืจืช ืืคืงืืื yc
. ืืคืฉืจ ืืืฆืืจ ืคืื ืงืฆืื ืื ืืจื ืืืฉืง ืืืื ืืจื ื, ืืื ื-CLI ืืื ืื ืื ืืื ื ืืืืืฉืื ืืืคืืขืื ืื ืืืจ ืืืชืจ. - ืขืืฉืื ืืชื ืืืื, ืืืขืฉื, ืืืืื ืืช ืืืืื ืืชืืืช: ืืคืขื ืขื ืฉืืจืช ืืคืงืืื ืืืชืืงืื ืขื ืืืืืช ืืืืืื ืืช
make all
. ืืืืจื ืฉื ืกืคืจืืืช (ืืขืืงืจ, ืืจืืื, ืืืืชืจืืช) ืืืชืงื ื ืืชืืงืืืdist
. - ืืืื ืืขืืื ืืืืกืื ืืคืฆืื (ืืืื
{BUCKET NAME}
) ืืืจืืืื ืฉืืืฉื ืืฉืื ืืงืืืdist.zip
. ืื ืชืจืฆื, ืชืืื ืืขืฉืืช ืืืช ืื ืืฉืืจืช ืืคืงืืื, ืืืฉื, ืืืืฆืขืืชAWS CLI . - ืฆืืจ ืคืื ืงืฆืื ืืื ืฉืจืช ืืจื ืืืฉืง ืืืื ืืจื ื ืื ืืืืฆืขืืช ืืื ืืฉืืจืืช
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
ืืขืช ืืฆืืจื ืืื ืืช ืฉื ืคืื ืงืฆืื, ืื ืืคืจืืืจืื ืืชืืืืื ืืืืชื ืืืคื.
ืืขืช ื ืืชื ืืืืืง ืืช ืืคืื ืงืฆืื ืฉืืฆืจืช ืืจื ืืกืืฃ ืืืคืชืืื, ืืืืืจ ืืื ืืกืืื ืืืคืจืกื ืืช ืืืืืื ืืช.
ืื ืืฉ ืืชืืช ืืืืกื ืืื ืืข
ื-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
ืขืืื ืคืฉืื: ืืื ืื ืกื ืืืืื ืขื ืืืฆื ืื ืืืื ืฉื ืืืืืืื ืืช ืื ืืจืืืืื ืืชืืจื, ืืืืืจ ืืช ืืจืืืื ืื ืืจืืฉืื.
ืืชืืืื ืืื ืืืืขื, ืื ืื ืืื-ืฉืื ืืืืืจ ืืืืืืงื ืคืืชืื Response
, ืืฉืจ ืืืืจ ืืื ื ืืชื ืืืืืจ ืืืงืกื ืจืืื, ืื ืืืืืขื ืืืืืก ืื ืืืืืจื - ืชืืื ืืืคื ืืืื ืคืืขื; ืืื ืืืื ืื ืืช ืืืฆื ืืืฉืชื ื ืฉื ืชืืืช ืืื-ืฉืื ืฉืืฉ ืืฉืืืจ. ืื ืืืืื ืืื ืืืืคื ืขื ืืื ืืืชื ืืืจืช, 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. ืืืฆื ื ืขืฉื ืฉืืืืฉ ืืฉืืจ ืืืืืืจ ืืื, ืืชื ืืืื ืืงืจืื
ืืฉืืจื ืืืืจืื ื ืืืฆืจืช ืคืื ืงืฆืื alice_handler
- ืื ืฉืืืื ื ืืืฉืื ืืช Yandex.Cloud ืืืฉืจ ืื ื ืืืืืจืื ืืช ืืคืจืืืจ --entrypoint=main.alice_handler
.
ืื, ืืืขืฉื, ืืื. Makefiles ืืื ืืื, ืืืกืื ืืืืืืงืืื ืืืื S3 ืืืืกืื ืืงืฉืจ, ืืกืคืจืืืช ืคืืชืื tgalice
. ืืื ืขื ืืชืืื ืืช ืืกืจืืช ืืฉืจืช ืืืืฉืจ ืืืืขื ืฉื ืคืืชืื, ืื ืืกืคืืง ืืื ืืคืชื ืืช ืืืืืื ืืช ืฉื ืืื ืืจืื.
ืืชื ืืืื ืืฉืืื ืืื ืืชื ืฆืจืื ืืืฆืืจ tgalice
? ืื ืืงืื ืืืฉืขืื ืฉืืขืืืจ JSON ืืืงืฉื ืืชืืืื ืืืืืกืื ืืืืืจืื ืืืืืจื ืืืื ืื. ืืฉ ืื ืืคืืืงืฆืื ืจืืืื, ืคืื ืงืฆืื ืืืื ื ืฉ"ืคืืจืืืจ" ืืืื ื"ืคืืจืืืจ", ืืขืื NLU ืืขื ืืื. ืืคื ืืจืขืืื ืฉืื, ืื ืืืจ ืืืืจ ืืืกืคืืง ืืื ืืืืืช ืืกืืื ืืฉืจืื ืืืืช ืืืคืืก ืฉื ืืืืื ืืช ืืงืืฆื yaml ืืืื ืืืืืช ืืืกืืช ืืื ืขื ืืื ืคืจืืื ืืื ืืื.
ืื ืืชื ืจืืฆื NLU ืจืฆืื ื ืืืชืจ, ืืชื ืืืื ืืืคืืง ืืืชื ืืืืืื ืืช ืฉืื
ืืืื, ืขืืฉืื ืืฆืืจืฃ
ืืงืืจ: www.habr.com