Size: a a a

Яндекс.Диалоги (сообщество разработчиков)

2020 May 22

A

Alexey in Яндекс.Диалоги (сообщество разработчиков)
Может взять впску просто или в яндекс-облако?
источник

Сс

Страшный сетевой адм... in Яндекс.Диалоги (сообщество разработчиков)
Alexey
Может взять впску просто или в яндекс-облако?
функцию?
источник

A

Alexey in Яндекс.Диалоги (сообщество разработчиков)
звучит, как затраченное время на костыли позволит на годик оплатить впс
источник

Сс

Страшный сетевой адм... in Яндекс.Диалоги (сообщество разработчиков)
ваще халява же будет
источник

ÐХ

Ðаниил Хрøмøв... in Яндекс.Диалоги (сообщество разработчиков)
Для функции в Яндекс облаке придётся переписывать весь навык почти
источник

A

Alexey in Яндекс.Диалоги (сообщество разработчиков)
ну да, там вроде недавно контексты добавили, можно даже данные хранить
источник

Сс

Страшный сетевой адм... in Яндекс.Диалоги (сообщество разработчиков)
Ðаниил Хрøмøв
Для функции в Яндекс облаке придётся переписывать весь навык почти
в жизни нету счастья, только боль и тлен. Лишь одно нетленно - полиэтилен.
источник

DD

David Dale in Яндекс.Диалоги (сообщество разработчиков)
Ðаниил Хрøмøв
Для функции в Яндекс облаке придётся переписывать весь навык почти
Почему?
источник

ÐХ

Ðаниил Хрøмøв... in Яндекс.Диалоги (сообщество разработчиков)
David Dale
Почему?
Тиммейт так сказал :) Но если нет, то попробуем, конечно
источник

A

Alexey in Яндекс.Диалоги (сообщество разработчиков)
там если не используются внешние хранилища, то вроде вообще минимум действий. если базы, то да, придется переделывать
источник

ÐХ

Ðаниил Хрøмøв... in Яндекс.Диалоги (сообщество разработчиков)
А  вообще, нужно где-то хранить сессии? Чтобы они не сбрасывались
источник

ÐХ

Ðаниил Хрøмøв... in Яндекс.Диалоги (сообщество разработчиков)
Могу скинуть код, как у нас сделано
источник

A

Alexey in Яндекс.Диалоги (сообщество разработчиков)
да, надо хранить состояние, привязанное к id сессии (прогресс в игре, например)
источник

ÐХ

Ðаниил Хрøмøв... in Яндекс.Диалоги (сообщество разработчиков)
Могу скинуть часть нашего кода, чтобы вы посмотрели
источник

DD

David Dale in Яндекс.Диалоги (сообщество разработчиков)
Ðаниил Хрøмøв
А  вообще, нужно где-то хранить сессии? Чтобы они не сбрасывались
Да, надо. Или в самой Алисе (дока), или в какой-то подключаемой БД (например, в yandex object storage - вот постик об этом). Ещё хорошо бесплатная mongo от mlab заходит.
источник

ÐХ

Ðаниил Хрøмøв... in Яндекс.Диалоги (сообщество разработчиков)
David Dale
Да, надо. Или в самой Алисе (дока), или в какой-то подключаемой БД (например, в yandex object storage - вот постик об этом). Ещё хорошо бесплатная mongo от mlab заходит.
Ок, спасибо!
источник

DD

David Dale in Яндекс.Диалоги (сообщество разработчиков)
А у меня тем временем есть более абстрактный вброс для этой хмурой пятницы.
Поделитесь, пожалуйста, кто какие диалоговые менеджеры использует для goal-oriented навыков/ботов?

За время работы в Алисе я привык к примерно следующему стеку (он неплохо описан в посте авторства Бори Янгеля):

- Запрос пользователя, как он есть;
- Разобранный запрос с выделенным интентом, слотами и сущностями - то, что лингвисты называют semantic frame, а в API Яндекс.Диалогов называется формой;
- "Состояние диалога" в виде мешка переменных (его тоже можно называть формой). Помимо слотов из запроса, там есть слоты, унаследованные из предыдущего диалога, притянутые из профиля пользователя или из внешних источников;
- ???
- Интерфейс, посылающий запросы в ручки тех сервисов, которые собственно и делают вашего бота полезным, и передающий их ответы в бота;
- Профит.

И вот что именно должно быть на месте знаков вопроса - не очевидно.
В Алисе в большинстве сценариев используется нехитрый dialog manager, который или сразу выдаёт ответ, определяемый текущим интентом, или дозапрашивает необходимые слоты (типа "куда вы хотите поехать?").

Проблема в том, что иногда для заполнения слота нужно выполнить отдельную цепочку действий. В Алисе, например, может состояться такой диалог:
- Вызови такси
- Куда вы хотите поехать?
- Домой
- А где находится дом?
- Красная площадь 1
- Ваш адрес - Красная площадь дом один, верно?
- Да
- Заказываю от адреса 3-я улица Строителей дом 25 до адреса Красная площадь дом 1, стоимость 350 рублей...

В этом примере сценарий запоминания адреса "вложен" в сценарий заказа такси. И вот в общем случае может существовать целый стек таких вложенных задач, необходимых для решения основной задачи. А плюс к основной задаче, у бота могут быть дополнительные - например, втюхать юзеру какую-нибудь услугу или собрать с него какой-нибудь фидбек. И отвлекаясь на вспомогательные задачи, надо не забывать про основную, и по возможности - про дополнительные.

И теперь собственно вопрос: как вы управляете задачами бота, когда их становится больше, чем одна?
Если вы пользуетесь готовым фреймворком для этого, будет клёво, если поделитесь текстом/видосом, где он разбирается.
Если вы накодили какой-то свой удачный велосипед, будет особенно любопытно послушать рассказ про его принципы 🙂
источник

ДП

Денис Пешехонов... in Яндекс.Диалоги (сообщество разработчиков)
Ðаниил Хрøмøв
Всем привет! Первый раз пишем навык для Алисы, сначала тестировали через ngrok (писали на питоне), потом решили выложить на Heroku. Но там очень криво работает навигация в навыке, и постоянно кидаются ошибки типа webhook 400 или 500. Сайт написан на фласке, никакого интерфейса нет, просто чтобы было что сделать вебхуком. Могут ли эти ошибки возникать из-за того, что сайт статический? Возможно, на Heroku не стоит выкладывать, или мы просто чего-то не дописали)?
У хероку для питона из коробки балансировщик нагрузки который поднимает больше одного процесса, и поэтому состояние может быть при разных запросах не одинаковым. Если вы храните состояние в памяти запущенной программы. И ошибки могу быть из-за этого.

Варианты решения
1. Хранить состояние в Алисе
2. Гуглится как отключать балансировщик, но я не помню
источник

ÐХ

Ðаниил Хрøмøв... in Яндекс.Диалоги (сообщество разработчиков)
Денис Пешехонов
У хероку для питона из коробки балансировщик нагрузки который поднимает больше одного процесса, и поэтому состояние может быть при разных запросах не одинаковым. Если вы храните состояние в памяти запущенной программы. И ошибки могу быть из-за этого.

Варианты решения
1. Хранить состояние в Алисе
2. Гуглится как отключать балансировщик, но я не помню
Да, пытаемся сейчас сделать хранение состояния в Алисе, спасибо
источник

ДП

Денис Пешехонов... in Яндекс.Диалоги (сообщество разработчиков)
David Dale
А у меня тем временем есть более абстрактный вброс для этой хмурой пятницы.
Поделитесь, пожалуйста, кто какие диалоговые менеджеры использует для goal-oriented навыков/ботов?

За время работы в Алисе я привык к примерно следующему стеку (он неплохо описан в посте авторства Бори Янгеля):

- Запрос пользователя, как он есть;
- Разобранный запрос с выделенным интентом, слотами и сущностями - то, что лингвисты называют semantic frame, а в API Яндекс.Диалогов называется формой;
- "Состояние диалога" в виде мешка переменных (его тоже можно называть формой). Помимо слотов из запроса, там есть слоты, унаследованные из предыдущего диалога, притянутые из профиля пользователя или из внешних источников;
- ???
- Интерфейс, посылающий запросы в ручки тех сервисов, которые собственно и делают вашего бота полезным, и передающий их ответы в бота;
- Профит.

И вот что именно должно быть на месте знаков вопроса - не очевидно.
В Алисе в большинстве сценариев используется нехитрый dialog manager, который или сразу выдаёт ответ, определяемый текущим интентом, или дозапрашивает необходимые слоты (типа "куда вы хотите поехать?").

Проблема в том, что иногда для заполнения слота нужно выполнить отдельную цепочку действий. В Алисе, например, может состояться такой диалог:
- Вызови такси
- Куда вы хотите поехать?
- Домой
- А где находится дом?
- Красная площадь 1
- Ваш адрес - Красная площадь дом один, верно?
- Да
- Заказываю от адреса 3-я улица Строителей дом 25 до адреса Красная площадь дом 1, стоимость 350 рублей...

В этом примере сценарий запоминания адреса "вложен" в сценарий заказа такси. И вот в общем случае может существовать целый стек таких вложенных задач, необходимых для решения основной задачи. А плюс к основной задаче, у бота могут быть дополнительные - например, втюхать юзеру какую-нибудь услугу или собрать с него какой-нибудь фидбек. И отвлекаясь на вспомогательные задачи, надо не забывать про основную, и по возможности - про дополнительные.

И теперь собственно вопрос: как вы управляете задачами бота, когда их становится больше, чем одна?
Если вы пользуетесь готовым фреймворком для этого, будет клёво, если поделитесь текстом/видосом, где он разбирается.
Если вы накодили какой-то свой удачный велосипед, будет особенно любопытно послушать рассказ про его принципы 🙂
Я использую паттерн Chain of responsibility и каждое звено может возвращать информацию о том, нужны ли следующие звенья или остановиться на этом.

Сейчас переписываю решению чтобы цепочку превратить в дерево, то есть чтобы звено могло содержать вложенные звенья
источник