image

Сегодня мне в голову пришла мысль: «А почему бы не написать Telegram чат-бота с ИИ, которого потом можно будет обучать?»


Сейчас сделать это совсем легко, поэтому, недолго думая, я принялся к написанию кода.
Языком я выбрал Python, т.к. на нём легче всего работать с подобного рода приложениями.

Итак, для создания Telegram чат-бота с ИИ нам потребуется:

1. API Telegram. В качестве обёртки я взял проверенную библиотеку python-telegram-bot

2. API ИИ. Выбрал я продукт от Google, а именно Dialogflow. Он предоставляет довольно-таки неплохое бесплатное API. Обёртка Dialogflow для Python

Шаг 1. Создаём бота в Telegram


Придумываем имя нашему боту и пишем @botfather. После создания бота нам придёт API токен, который желательно бы где-то сохранить, т.к. в дальнейшем он нам понадобится.

image

Шаг 2. Пишем основу бота


Создаём папку Bot, в которой потом создаём файл bot.py. Здесь будет код нашего бота.
Открываем консоль и переходим в директорию с файлом, устанавливаем python-telegram-bot.

pip install python-telegram-bot --upgrade

После установки мы уже можем написать «основу», которая пока что будет просто отвечать однотипными сообщениями. Импортируем необходимые модули и прописываем наш токен API:

Код настроек и импорта
# Настройки
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters
updater = Updater(token='ВАШ API КЛЮЧ') # Токен API к Telegram
dispatcher = updater.dispatcher


Далее напишем 2 обработчика команд. Это callback-функции, которые будут вызываться тогда, когда будет получено обновление. Напишем две таких функции для команды /start и для обычного любого текстового сообщения. В качестве аргументов туда передаются два параметра: bot и update. Bot содержит необходимые методы для взаимодействия с API, а update содержит данные о пришедшем сообщении.

Код callback'ов
# Обработка команд
def startCommand(bot, update):
    bot.send_message(chat_id=update.message.chat_id, text='Привет, давай пообщаемся?')
def textMessage(bot, update):
    response = 'Получил Ваше сообщение: ' + update.message.text
    bot.send_message(chat_id=update.message.chat_id, text=response)


Теперь осталось лишь присвоить уведомлениям эти обработчики и начать поиск обновлений.
Делается это очень просто:

Код хендлеров
# Хендлеры
start_command_handler = CommandHandler('start', startCommand)
text_message_handler = MessageHandler(Filters.text, textMessage)
# Добавляем хендлеры в диспетчер
dispatcher.add_handler(start_command_handler)
dispatcher.add_handler(text_message_handler)
# Начинаем поиск обновлений
updater.start_polling(clean=True)
# Останавливаем бота, если были нажаты Ctrl + C
updater.idle()


Итого, полная основа скрипта выглядит вот так:

Код полной основы бота
# Настройки
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters
updater = Updater(token='ВАШ API ТОКЕН') # Токен API к Telegram
dispatcher = updater.dispatcher
# Обработка команд
def startCommand(bot, update):
    bot.send_message(chat_id=update.message.chat_id, text='Привет, давай пообщаемся?')
def textMessage(bot, update):
    response = 'Получил Ваше сообщение: ' + update.message.text
    bot.send_message(chat_id=update.message.chat_id, text=response)
# Хендлеры
start_command_handler = CommandHandler('start', startCommand)
text_message_handler = MessageHandler(Filters.text, textMessage)
# Добавляем хендлеры в диспетчер
dispatcher.add_handler(start_command_handler)
dispatcher.add_handler(text_message_handler)
# Начинаем поиск обновлений
updater.start_polling(clean=True)
# Останавливаем бота, если были нажаты Ctrl + C
updater.idle()


Теперь мы можем проверить работоспособность нашего нового бота. Вставляем на 2 строке наш API токен, сохраняем изменения, переносимся в консоль и запускаем бота:

python bot.py

После запуска пишем ему. Если всё настроено правильно, то Вы увидите вот это:

image

Основа бота написана, приступаем к следующему шагу!
P.s. не забывайте выключить бота, для этого вернитесь в консоль и нажмите Ctrl + C, подождите пару секунд и бот успешно завершит работу.

Шаг 3. Настройка ИИ


В первую очередь, идём и регистрируемся на Dialogflow (просто входим с помощью своего Google аккаунта). Сразу после авторизации мы попадаем в панель управления.

image

Жмём на кнопку Create agent и заполняем поля по усмотрению (это никакой роли не сыграет, это нужно лишь для следующего действия).

image

Жмём на Create и видим следующую картину:

image

Расскажу, почему созданный нами ранее «Агент» никакой роли не играет. Во вкладке Intents есть «команды», по которым работает бот. Сейчас он умеет лишь отвечать на фразы типа «Привет», и если не понимает, то отвечает «Я вас не понял». Не сильно впечатляет.
После создания нашего пустого агента, у нас появилась куча других вкладок. Нам нужно нажать на Prebuilt Agents (это уже специально обученные агенты, которые имеют множество команд) и из всего представленного списка выбрать Small Talk.

image

Наводим на него и жмём Import. Далее ничего не меняя, жмём Ok. Агент импортировался и теперь мы можем его настроить. Для этого в левом верхнем углу жмём на шестерёнку возле Small-Talk и попадаем на страницу настроек. Теперь мы можем изменить имя агента, как захотим (я оставляю как было). Меняем часовой пояс и во вкладке Languages проверяем, чтобы был установлен русский язык (если не установлен, то ставим).

image
image

Возвращаемся на вкладку General, спускаемся немного вниз и копируем Client access token

image

Теперь наш ИИ полностью настроен, можно возвращаться к боту.

Шаг 4. Собираем всё вместе


ИИ готов, основа бота готова, что дальше? Дальше нам нужно скачать обёртку API от Dialogflow для питона.

pip install apiai

Установили? Возвращаемся к нашему боту. Добавляем в нашу секцию «Настройки» импорт модулей apiai и json (нужно, чтобы в будущем разбирать json ответы от dialogflow). Теперь это выглядит вот так:

Код обновлённых настроек
# Настройки
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters
import apiai, json
updater = Updater(token='ВАШ API КЛЮЧ') # Токен API к Telegram
dispatcher = updater.dispatcher


Переходим к функции textMessage (которая отвечает за получение любого текстового сообщения) и посылаем полученные сообщения на сервера Dialogflow:

Код отправления сообщений на Dialogflow
def textMessage(bot, update):
    request = apiai.ApiAI('ВАШ API ТОКЕН').text_request() # Токен API к Dialogflow
    request.lang = 'ru' # На каком языке будет послан запрос
    request.session_id = 'BatlabAIBot' # ID Сессии диалога (нужно, чтобы потом учить бота)
    request.query = update.message.text # Посылаем запрос к ИИ с сообщением от юзера


Этот код будет посылать запрос к Dialogflow, но нам нужно также извлечь ответ. Дописываем парочку строк, итого textMessage выглядит вот так:

Полный код функции textMessage
def textMessage(bot, update):
    request = apiai.ApiAI('ВАШ API ТОКЕН').text_request() # Токен API к Dialogflow
    request.lang = 'ru' # На каком языке будет послан запрос
    request.session_id = 'BatlabAIBot' # ID Сессии диалога (нужно, чтобы потом учить бота)
    request.query = update.message.text # Посылаем запрос к ИИ с сообщением от юзера
    responseJson = json.loads(request.getresponse().read().decode('utf-8'))
    response = responseJson['result']['fulfillment']['speech'] # Разбираем JSON и вытаскиваем ответ
    # Если есть ответ от бота - присылаем юзеру, если нет - бот его не понял
    if response:
        bot.send_message(chat_id=update.message.chat_id, text=response)
    else:
        bot.send_message(chat_id=update.message.chat_id, text='Я Вас не совсем понял!')


Немного пояснений. С помощью

request.getresponse().read()

получается ответ от сервера, закодированный в байтах. Чтобы декодировать его, просто применяем метод

decode('utf-8')

и после этого «заворачиваем» всё в

json.loads()

чтобы распарсить json ответ.

Если ответа нет (точнее, json приходит всегда, но не всегда есть сам массив с ответом ИИ), то это означает, что Small-Talk не понял пользователя (обучением можно будет заняться позже). Поэтому если «ответа» нет, то пишем пользователю «Я Вас не совсем понял!».
Итого, полный код бота с ИИ будет выглядеть вот так:

Полный код бота с ИИ
# Настройки
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters
import apiai, json
updater = Updater(token='ВАШ API ТОКЕН') # Токен API к Telegram
dispatcher = updater.dispatcher
# Обработка команд
def startCommand(bot, update):
    bot.send_message(chat_id=update.message.chat_id, text='Привет, давай пообщаемся?')
def textMessage(bot, update):
    request = apiai.ApiAI('ВАШ API ТОКЕН').text_request() # Токен API к Dialogflow
    request.lang = 'ru' # На каком языке будет послан запрос
    request.session_id = 'BatlabAIBot' # ID Сессии диалога (нужно, чтобы потом учить бота)
    request.query = update.message.text # Посылаем запрос к ИИ с сообщением от юзера
    responseJson = json.loads(request.getresponse().read().decode('utf-8'))
    response = responseJson['result']['fulfillment']['speech'] # Разбираем JSON и вытаскиваем ответ
    # Если есть ответ от бота - присылаем юзеру, если нет - бот его не понял
    if response:
        bot.send_message(chat_id=update.message.chat_id, text=response)
    else:
        bot.send_message(chat_id=update.message.chat_id, text='Я Вас не совсем понял!')
# Хендлеры
start_command_handler = CommandHandler('start', startCommand)
text_message_handler = MessageHandler(Filters.text, textMessage)
# Добавляем хендлеры в диспетчер
dispatcher.add_handler(start_command_handler)
dispatcher.add_handler(text_message_handler)
# Начинаем поиск обновлений
updater.start_polling(clean=True)
# Останавливаем бота, если были нажаты Ctrl + C
updater.idle()


Сохраняем изменения, запускаем бота и идём проверять:

image

Вот и всё! Бот в 30 строк с ИИ написан!

Шаг 5. Заключительная часть


Думаю, Вы убедились, что написать бота с ИИ – дело 10 минут. Осталось лишь теперь его учить и учить. Делать это, кстати, можно во вкладке Training. Там можно посмотреть все сообщения, которые писались и что на них ответил бот (или не ответил). Там же его можно и обучать, говоря боту где он ответил правильно, а где нет.

image

Надеюсь, статья была Вам полезна, удачи в обучении!

Комментарии (92)


  1. altervision
    14.01.2018 17:06

    Похоже, будущее наступило. Теперь и правда можно собрать себе собеседника за 10 минут из нескольких строк кода и пары готовых библиотек. Welcome to future! ;)


  1. Vektor-Pro
    14.01.2018 17:44

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


    1. sjs
      14.01.2018 19:03

      Придется придумывать серию тестовых вопросов, чтобы понять, что общаешься с ботом.


      1. mafia8
        14.01.2018 19:12
        +1

        Пешу сащипкаме штопы онн неперевеел анлаинперевотчикам.
        :)
        P.S. Была такая ситуация в чате одной игры. Русские и один иностранец, переводил переводчиком.


        1. unStaiL
          15.01.2018 12:04

          проста пока исчо маво кто научил ботаф панимать такую речь :)
          p.s. то же может быть и в случае Kaki}{ t0 takux fra3, хотя думаю что многое из этого вполне достижимо


        1. equand
          15.01.2018 12:05

          Да без фонетического воспроизведения бот не будет понимать такой текст (если только не запомнит в тупую благодаря ручному обучению).


          1. unStaiL
            15.01.2018 12:10

            листая ленту постов наткнулся на тему
            «Как обучть мдль пнмть упртые скрщня»
            habrahabr.ru/post/346578


      1. System12
        15.01.2018 07:32

        Тест Тьюринга придуман уже довольно давно и описан даже в Википедии.


        1. KodyWiremane
          15.01.2018 12:41

          Тест Тьюринга описывает конкретные вопросы для разоблачения машины?


        1. tmin10
          16.01.2018 10:41

          Некоторые боты уже прошли его, только если пообщаться с ними, никаких иллюзий ИИ нет.


          1. System12
            16.01.2018 11:53
            -1

            Читая диалоги на некоторых форумах иногда возникает чувство что собеседники этот тест не пройдут. :)


            1. Ugrum
              16.01.2018 13:04
              +1

              Подъезжая к сией станцыи и глядя на природу в окно, у меня слетела шляпа.


              1. alex4321
                16.01.2018 13:11
                +1

                Того и гляди — эта шляпа ещё и, собственно, тест Тьюринга прошла бы.


      1. quantumCat
        15.01.2018 09:58
        +1

        Какого цвета зелёная стена?


        1. JTG
          16.01.2018 11:00
          +1

          В этом направлении копают, но результаты пока так себе. Например, есть датасет The Stanford Question Answering Dataset на котором обучают модели для разбора естественных языков. Вот эта allenai.github.io/bi-att-flow/demo может отвечать на простые вопросы вроде:

          Paragraph: There's a room with white walls, red sofa and two green parrots sitting on the top of it.

          Q: What's the color of walls?
          A: white

          Q: What's the color of sofa?
          A: red

          Q: What's the color of two parrots?
          A: green

          Q: How many parrots there are in the room?
          A: two

          Хотя модель на самом деле «не понимает» о чём речь:

          Q: What's the color of parrots?
          A: red

          Q: How many walls there are in the room?
          A: white

          но, объединив это с банком знаний вроде start.csail.mit.edu, можно получить что-то более умное.


  1. ilmarin77
    14.01.2018 19:12

    Сколько надо будет учить такого бота, чтобы он выполнил просьбу "эй, сгоняй за пивом!"


    1. Batlab Автор
      14.01.2018 19:16

      Думаю, что сейчас самое время учить их таким командам. А то когда поумнеют, то поймут, что за такое можно просить деньги)


      1. forcam
        15.01.2018 09:59
        +2

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


  1. tutam
    14.01.2018 19:36

    Здравствуйте! Буду очень благодарен если кто-нибудь поможет. Проблема в следующем: библиотеку для телеграма я установил, однако питон все равно говорит что нет такого модуля. Должен отметить: у меня стоит несколько версий питона. В одной из них запускается совсем другая программа, а в двух остальных ругается на отсутствие модуля. Библиотеки ставил для всех версий.


    1. Batlab Автор
      14.01.2018 19:37

      Конфликт версий, однозначно. Это urllib3, да?


      1. tutam
        14.01.2018 20:49

        Тоесть нужно снести все кроме одной? И при чем здесь urllib3?


        1. Batlab Автор
          14.01.2018 20:58

          Насчёт «снести всё кроме одной» не знаю (вы точно устанавливали все пакеты, находясь в папке со скриптом?).
          Просто отписал в сообщения один юзер, у которого python-telegram-bot не работал из-за конфликта с urllib3.


          1. tutam
            14.01.2018 21:21

            Возможно глупый вопрос, но про какую папку со скриптом вы говорите? Я ставил пакеты находясь вот в этой папке: «C:\Users\tutam\AppData\Local\Programs\Python\Python36»


            1. Batlab Автор
              14.01.2018 21:28

              Забудьте.


              1. tutam
                14.01.2018 23:03

                Оказалось проблема была в файле test.py, который лежал в той же папке и запускался вместо bot.py :) Спасибо за статью и помощь!


  1. dmitry_ch
    14.01.2018 19:46

    Не показывайте Мегафону и Ростелекому. До них и так не дозвонишься, а если они еще и такого робота прикрутят…


    1. samodum
      14.01.2018 22:14

      Можно подумать, что это какая-то уникальная идея сделать такого бота. Пфф…


    1. berezuev
      15.01.2018 09:30

      Вот вам лайфхак: большинство автоответчиков можно заткнуть нажатием кнопки 0, для перевода на оператора. А тот уже пусть сам связывает с нужным отделом.


      1. dmitry_ch
        15.01.2018 09:37

        Вот и вам лайфхак — попробуйте с теми, что я назвал. "Я вам не поняла, произнесите тему вашего звонка!"
        И хорошо бы по таймауту переводили на оператора, а то ведь порой и трубку робот бросает, если ниасилил распознать.


        1. aavezel
          15.01.2018 10:24

          а то ведь порой и трубку робот бросает, если ниасилил распознать.

          … — дэвушка, а можна мнэ кого то поэумнээ??
          — пи-пи-пи-пи-пи-пи…


          1. achekalin
            15.01.2018 10:29

            «Увы, нэт!»
            На самом деле становится еще дурнее, когда нужно что-то точно узнать, скажем, тонкости биллинга. Я стараюсь прорываться к живому человеку, а там еще порой приходится исхитряться и просить первую линию поддержку переключить на знающего человека. Правда, вот это как раз не прокатывает, все экономят, так что, в лучшем случае, можно только тикет попросить составить.


      1. ploop
        15.01.2018 10:42

        большинство автоответчиков можно заткнуть нажатием кнопки 0

        … и после 40 минут прослушивания музыки таки разбить телефон об стену.

        На самом деле лайфхак один: постараться найти альтернативные номера ТП, даже по 8-800 с городского трубку берут чуть ли не моментально, а по нативному можно высадить аккумулятор, пока дождёшься.


        1. Ugrum
          15.01.2018 16:32

          Элементарно же. По нативному звонит уже существующий клиент, который будет задавать дурацкие вопросы-«Куда делись деньги, почему у меня изменились условия тарифа, что за рекламу вы мне пихаете в браузер, почему такое хреновое покрытие?» и прочие подобные. А с городского/мобильного другого оператора звонит потенциальный клиент. Кого поставят в начало очереди?


          1. ploop
            16.01.2018 16:30

            Да это понятно, плюс ещё неизвестно, вдруг сам П... кто на линии.


  1. mSiotniHS
    14.01.2018 20:57

    Удивительно, насколько просто теперь можно сделать чат-бота в домашних условиях без смс регистрации.


  1. divcontento
    14.01.2018 21:28

    Ну тут по сути всё готовое собрано вместе :)
    Думал будет интереснее...


    1. Batlab Автор
      14.01.2018 22:08

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


    1. dark_sage
      15.01.2018 12:02

      ну, вообще то в 30 строк кода можно собрать только готовое… так что просто давай вместе ещё раз поглядим тему поста? Оппа? Ничего не изменилось? Вроде нет… Обучаемый бот в 30 строк…


      1. Batlab Автор
        15.01.2018 12:03

        Окей, а что же мы получили в итоге? Случаем, не обучаемого чат-бота в 30 строк кода на питоне?
        В теме не написано «Пишем обучаемый ИИ с нуля на питоне в 30 строк кода».


  1. bak
    14.01.2018 22:03

    Ждём статью «как сделать поисковик в 30 строк кода» и «как сделать соцсеть в 30 строк кода».


    1. Dreyk
      14.01.2018 23:35

      а внутри будет написано «подключаем модуль поисковика/соцсети»


    1. Bringoff
      15.01.2018 11:30

      Это было трендом года 4 назад.


  1. dmitry_dvm
    14.01.2018 22:23

    Спасибо за статью. Прикрутил к своему попугаю в стиле джаббероботов. Правда он у меня на .net core.


  1. dmitry_dvm
    14.01.2018 22:35

    А бот будет самообучаться на основе полученных сообщений? Или только вручную учить? Так не интересно, если только вручную, какой же это ИИ.


    1. Batlab Автор
      15.01.2018 10:08

      Самообучение на нём заложено уже в механизмах его работы, но материал для обучения всё-равно нужно давать. Это же как ребёнок в школе — он не поймёт ошибку, пока ему не покажет её учитель.


      1. alex4321
        15.01.2018 12:58

        Самообучение на нём заложено


        ЕМНИП, в обучение без учителя (хотя тут скорее semi-superwised learning) dialogflow не может же.

        Как максимум — в сбор материала для разметки.

        Или я что-то упустил?


  1. j-ker
    15.01.2018 04:11

    Супер! Спасибо за статью о Питоне.
    P.S> для слова "dispatcher" есть замечательный перевод на русский: ДИСПЕТЧЕР


    1. Batlab Автор
      15.01.2018 10:06

      Спасибо, не заметил, просто привык всё транскриптом переводить)


  1. ssss41
    15.01.2018 08:13

    У меня глупый вопрос: как запустить бота?
    1) Регистрируем нового бота, получаем токен
    2) при обращению к api получаю ответ: {«ok»:false,«error_code»:404,«description»:«Not Found»}
    Вопрос: для работы с api нужен ssl сертификат на машине? можно самоподписанный? На какое имя он (сертификат) должен быть выдан?


    1. Batlab Автор
      15.01.2018 10:06

      1. Всё правильно
      2. У Вас, скорее всего, неправильно подключен токен api. Проверьте всё ещё раз.


      1. ssss41
        15.01.2018 11:10

        через @BotFather придумываешь имя и он тебе выдает токен + ссылку. Больше ничего и не делал


        1. Batlab Автор
          15.01.2018 12:04

          Токен API ещё должен быть также от ИИ. Читайте внимательнее статью. Client access token


    1. sshmakov
      15.01.2018 10:07

      Что значит «при обращении к api»? К какому api, как обращаетесь?


      1. ssss41
        15.01.2018 11:12

        1) пробовал по ссылке после регистрации
        2) через curl -F«url=https://my_ip:443/my+token/» -F«certificate=@public.pem» api.telegram.org/my_token/setWebhook после установки ssl
        3) из python
        ощущение, что я что-то не установил для обращения к нему


        1. sshmakov
          15.01.2018 11:36

          А вам обязательно работать через вебхуки?
          Через long polling, как в статье, тот же пакет python-telegram-bot у меня взлетел сразу

          updater.start_polling()


          1. ssss41
            15.01.2018 11:49

            для работы ssl не надо делать? можно на своем обычном компе и PyCHarm пробовать?


            1. Batlab Автор
              15.01.2018 12:05

              Конечно. Делайте всё, как в статье. Всё отлично работает.


    1. ilyaplot
      15.01.2018 12:01

      Можно самоподписанный. https://core.telegram.org/bots/self-signed


  1. AxisPod
    15.01.2018 08:39

    Статья в стиле как собрать автомобиль вкрутив один болт.

    Покупаем автомобиль без одного болта, болт и ключ. Вкручиваем болт. Поздравляем, вы собрали свой автомобиль.


    1. tmin10
      17.01.2018 21:27

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


  1. kav3rz
    15.01.2018 10:00

    А на node.js можно такое написать?


    1. Batlab Автор
      15.01.2018 10:05

      Можно) Вот, вроде, пакет для нода


  1. MarkMars
    15.01.2018 10:00

    Интересная статья, а чем нативный механизм интеграции dialogflow и телеграмм Вас не устроил?


    1. Batlab Автор
      15.01.2018 10:06

      С Integrations будет работать через Webhook и Вы не сможете никак «настроить бота под себя». В таком случае Вы будете полностью зависеть от возможностей Dialogflow, теряя очень большой потенциал для реализации чего-то «авторского».


  1. lavesov
    15.01.2018 10:00

    здрасте) бот удалось запустить, отправляет приветствие, а на ответ не реагирует)
    вопрос такой:

    1. в request.session_id пишем имя своего бота?
    2. и в начале дана Обёртка Dialogflow для Python — для чего это нужно?
    3. для pycharm установил apiai, а json не нашел, нужно ли его устанавливать и где найти?
    4. нужно ли подключать Телеграм через Inegration в DialogFlow?
    5. обязательно ли нужно заполнять разделы в Small Talk Customization Progress? Или должно работать и так?

    спасибо


    1. Batlab Автор
      15.01.2018 10:04

      1. По документации, вообще, нужно придумывать рандомный токен длиной в 36 символов. Новый токен — новый диалог. Но по скольку я захотел, чтобы диалог был один и можно было легко понять, где на dialogflow общался бот, а где разработчик писал отладку. Поэтому я просто вставил имя бота.
      2. Чтобы легче работать с их API. Т.к. в прошлом Dialogflow назывался ApiAI, но когда его купил гугл, то переименовали в Dialogflow, а вот пакеты которые остались на гитхабе — остались со своими старыми названиями.
      3. Json устанавливать не нужно, он входит в библиотеку стандартных модулей питона.
      4. Не нужно.
      5. Это уже по желанию, если вы хотите придать боту «изюминку».


      1. lavesov
        15.01.2018 12:33

        вроде, все перепроверил, интеграцию отключил, код скопировал, токены поменял, а ответа от бота нет(

        в чем может быть причина?


        1. Batlab Автор
          15.01.2018 14:15

          Пересоздайте телеграмм бота и dialogflow агента, спуститесь к концу статьи и скопируйте полный код, заменив токены на свои.


  1. loskiq
    15.01.2018 10:00

    Можно сделать проще.

    1. Открыть Dialogflow
    2. Перейти в раздел Integrations
    3. Найти Telegram
    4. Ввести токен от своего бота

    Бот автоматически запустится и будет работать. И не нужно задействовать сторонний сервер.


    1. Batlab Автор
      15.01.2018 10:01

      С Integrations будет работать через Webhook и Вы не сможете никак «настроить бота под себя». В таком случае Вы будете полностью зависеть от возможностей Dialogflow, теряя очень большой потенциал для реализации чего-то «авторского».


  1. plastilinko
    15.01.2018 10:25

    В былые времена было такая программка — chatmaster. Ностальгия прям


  1. daemonhk
    15.01.2018 11:07

    Я правильно понимаю, что бот не обучается сам, а может лишь отвечать на знакомые ему вопросы?


    1. Batlab Автор
      15.01.2018 12:06

      Обучаться он может, не без Вашей помощи, конечно.


    1. alex4321
      15.01.2018 13:09

      Я правильно понимаю, что бот не обучается сам, а может лишь отвечать на знакомые ему вопросы?


      Если речь о том, нужно ли вручную составлять правило, определяющее в какой intent отправить пользователя — нет, классификатор intent-в тут обучается автоматически.

      Если о том, нужно ли вручную разбивать обучающую выборку на отдельные intent-ы — да, кластеризовать (например) готовые диалоги автоматически оно не может.


  1. Ununtrium
    15.01.2018 13:15

    Технические статьи такие технические.


  1. linuxover
    15.01.2018 13:40

    Код callback'ов

    # Обработка команд
    def startCommand(bot, update):
        bot.send_message(chat_id=update.message.chat_id, text='Привет, давай пообщаемся?')
    def textMessage(bot, update):
        response = 'Получил Ваше сообщение: ' + update.message.text
        bot.send_message(chat_id=update.message.chat_id, text=respons

    я относительно недавно писал бота, требования к которому были:


    1. простая модифицируемость
    2. относительная сложность диалогов

    (бот-оператор, продающий топливо для заправок)


    и вот пришел к тому, что парадигма: "каждое сообщение пользователя вызывает калбек" — очень неудобная для написания ботов: приходится на каждого пользователя заводить персистетную стейтмашину и каждый вызов калбека начинается с восстановления стейта итп.


    намного удобнее парадигма chat


    def chat(chat)
       message = chat.get_message()
       chat.send_message(reply)

    однако реализовать в промышленном масштабе такую парадигму можно только на файберах (на процессах — очень плохо нагрузку будет держать).


    не копали в этом направлении? я на perl себе вынужден был цельный фреймворк сваять, но там еще копать и копать...


  1. Vedyn
    15.01.2018 14:16

    А для Discord подойдет такой бот?


    1. Batlab Автор
      15.01.2018 14:17

      Если есть api от Discord'а, то почему бы и нет.


  1. Sudo
    15.01.2018 17:10

    Если кто-то захочет потренироваться на примере используя Python 2.7, то при отправке запроса можно получить ошибку вида:
    UnicodeDecodeError: ‘utf8’ codec can’t decode byte 0xe7 in position 7: invalid continuation byte
    Это связано с форматом часового пояса (в Windows), который отсылается в запросе на сервер Dialogflow
    (у меня был "RTZ 2 (зима)")

    После явного указания часового пояса все становится ОК:
    request.time_zone = "GMT+3"

    Используя Python 3.6 такой ошибки нет


  1. verydima
    16.01.2018 02:43

    Возможно, вопрос глупый. Но что есть «обучение» в контексте этого топика?
    «ИИ» выбирает ответы из базы вопросов/ответов, если в базе вопроса нет, то «ИИ» ищет что-то похожее с похожими словами и даёт ответ. Этот ответ Вы потом отмечаете как «правильный/неправильный». И к вопросам, которые непонятны «ИИ», Вы можете задать ответы. Верно? Так оно работает?


    1. alex4321
      16.01.2018 03:12

      Возможно, вопрос глупый. Но что есть «обучение» в контексте этого топика?

      Настройка классификатора, определяющего, к какому intent-у отнести вопрос, похоже.

      выбирает ответы из базы вопросов/ответов, если в базе вопроса нет, то «ИИ» ищет что-то похожее с похожими словами и даёт ответ

      Скорее выделяем признаки из вопроса — потом определяем классификатором, какому классу соответсвуют такие их значения. Ну, если там внутри не kNN :-)


  1. recompileme
    16.01.2018 10:15

    Подключил бота в телеграм по этому мануалу t.me/artemiyrobot
    Туповат как пробка, пришлось добавить свои костыли для поддержания беседы


    1. recompileme
      16.01.2018 10:21

      Пример диалога: recoilmeblog.tggram.com/post/80


  1. mokilo
    16.01.2018 11:04

    Здравствуйте!
    Новичок в этой теме.Вчера узнал, решил попробовать.Но в коне модули не распознаются.
    У меня kaili linux.
    Сразу прописал git clone и ссылку на telegram bot, тоже самое сделал с dialogflowers.
    Потом вбил pip install python-telegram-bot --upgrade, pip install apiai.
    Скопировал конечный код. Засунул в файл bot.py. Изменил токены.Пробую запустить
    python Desktop/bot/bot.py — ошибка SyntaxError: Non-ASCII character '\xd0' in file Desktop/bot/bot.py on line 1, but no encoding declared; see python.org/dev/peps/pep-0263 for details
    Python3 Desktop/bot/bot.py — ошибка Traceback (most recent call last):
    File «Desktop/bot/bot.py», line 2, in from telegram.ext import Updater, CommandHandler, MessageHandler, Filters
    ModuleNotFoundError: No module named 'telegram'
    Что я сделал не так или надо еще сделать?


    1. Batlab Автор
      16.01.2018 11:06

      Здравствуйте.
      1. Ошибка — ошибка кодировки, как её решить написано тут
      2. Ошибка зависимости. Нужно устанавливать не через git clone, а через pip. Попробуйте ещё раз всё переустановить.


      1. mokilo
        16.01.2018 17:23

        Изначально я делал git clone и pip.
        Пробовал еще раз через pip тоже самое — оишибка


        1. MassiveBrick
          16.01.2018 19:00

          Попробуйте использовать команду pip3 вместо pip. Кстати, во втором питоне бот может не отвечать на сообщения (первый пример), потому что type('Получил ваше сообщение') возвращает str. А type(update.message.text) возвращает unicode, поэтому сложение строк не срабатывает. Можно пофиксить через
          response = 'Получил Ваше сообщение: ' + str(update.message.text)


  1. asvechkar
    16.01.2018 18:12

    Добрый вечер. В Вашем примере мы подключаем через токен только одного агента Small Talk. А если я в DialogFlow добавил несколько агентов: погода, CRM и т.д., и у каждого токен, как мне подключить несколько агентов к ApiAI?


    1. Batlab Автор
      16.01.2018 19:01

      Тут никак
      Один запрос к API — 1 агент
      Можно попробовать перенести функционал отдельных агентов к главному, читайте доки Dialogflow.


  1. shockable
    16.01.2018 23:36

    С телеграмом не работал, подскажите, пожалуйста, кратко, о возможностях.
    Вопрос, возможно, не совсем по теме, но буду признателен за ответ. Хочу, кроме сообщений, чтоб бот какие-то действия поддерживал (например, «перегрузи сервак, бот!»). Есть ли возможность для бота различать пользователей, что ему пишут? Например, по id телеграм. Вопрос второй: известно ли, что будет если запустить второй инстанс бота? Отказ от телеграм на авторизацию для второго инстанса или какие-то блокировки и т. д.?
    Вопрос третий: можно ли кроме текста отдавать какие-то кнопки для пользователя, например: «не совсем понял запрос: хотите А(кнопка_а) или Б(кнопка_б)?».


    1. Batlab Автор
      17.01.2018 10:47

      1. Всё зависит от возможностей Python'а, поэтому да, можно. Различать юзеров по айди можно (читайте документацию пакета бота).
      2. Никаких отказов быть не должно, хотя и не проверял.
      3. Можно. Опять же таки, читайте доки по телеграмм боту.


    1. sshmakov
      17.01.2018 11:38

      В2 — сомнительно, что с одним api key это возможно. И непонятно, зачем.
      В3 — лучше читать не документацию, там этого не разжевано, а примеры из examples в репозитории пакета на github — есть примеры с кнопками.