Обучаемый Telegram чат-бот с ИИ в 30 строчек кода на Python

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

Надеюсь, статья была Вам полезна, удачи в обучении!
Поделиться публикацией
Похожие публикации
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама
Комментарии 89
  • +2
    Похоже, будущее наступило. Теперь и правда можно собрать себе собеседника за 10 минут из нескольких строк кода и пары готовых библиотек. Welcome to future! ;)
    • 0
      Сейчас еще алгоритмы не но столько совершенные, что бы понять, что общаешся с ботом, но в скором времени с помощью технологий машинного обучения будет практически неотличимо.
      • 0
        Придется придумывать серию тестовых вопросов, чтобы понять, что общаешься с ботом.
        • +10
          Пешу сащипкаме штопы онн неперевеел анлаинперевотчикам.
          :)
          P.S. Была такая ситуация в чате одной игры. Русские и один иностранец, переводил переводчиком.
          • 0
            проста пока исчо маво кто научил ботаф панимать такую речь :)
            p.s. то же может быть и в случае Kaki}{ t0 takux fra3, хотя думаю что многое из этого вполне достижимо
            • 0

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

              • 0
                листая ленту постов наткнулся на тему
                «Как обучть мдль пнмть упртые скрщня»
                habrahabr.ru/post/346578
            • –1
              Тест Тьюринга придуман уже довольно давно и описан даже в Википедии.
              • 0
                Тест Тьюринга описывает конкретные вопросы для разоблачения машины?
                • 0
                  Некоторые боты уже прошли его, только если пообщаться с ними, никаких иллюзий ИИ нет.
                  • 0
                    Читая диалоги на некоторых форумах иногда возникает чувство что собеседники этот тест не пройдут. :)
                    • +1
                      Подъезжая к сией станцыи и глядя на природу в окно, у меня слетела шляпа.
                      • +1
                        Того и гляди — эта шляпа ещё и, собственно, тест Тьюринга прошла бы.
                • +1
                  Какого цвета зелёная стена?
                  • +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

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

                • +1
                  Думаю, что сейчас самое время учить их таким командам. А то когда поумнеют, то поймут, что за такое можно просить деньги)
                  • +2
                    А когда поумнеют окончательно, поймут, что за пивом можно не только бегать, но и послать просителя, причем не только за пивом, причем не только послать)
                • 0
                  Здравствуйте! Буду очень благодарен если кто-нибудь поможет. Проблема в следующем: библиотеку для телеграма я установил, однако питон все равно говорит что нет такого модуля. Должен отметить: у меня стоит несколько версий питона. В одной из них запускается совсем другая программа, а в двух остальных ругается на отсутствие модуля. Библиотеки ставил для всех версий.
                  • 0
                    Конфликт версий, однозначно. Это urllib3, да?
                    • 0
                      Тоесть нужно снести все кроме одной? И при чем здесь urllib3?
                      • 0
                        Насчёт «снести всё кроме одной» не знаю (вы точно устанавливали все пакеты, находясь в папке со скриптом?).
                        Просто отписал в сообщения один юзер, у которого python-telegram-bot не работал из-за конфликта с urllib3.
                        • 0
                          Возможно глупый вопрос, но про какую папку со скриптом вы говорите? Я ставил пакеты находясь вот в этой папке: «C:\Users\tutam\AppData\Local\Programs\Python\Python36»
                          • +2
                            Забудьте.
                            • 0
                              Оказалось проблема была в файле test.py, который лежал в той же папке и запускался вместо bot.py :) Спасибо за статью и помощь!
                  • +2
                    Не показывайте Мегафону и Ростелекому. До них и так не дозвонишься, а если они еще и такого робота прикрутят…
                    • 0
                      Можно подумать, что это какая-то уникальная идея сделать такого бота. Пфф…
                      • 0

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

                        • 0

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

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

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

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

                            На самом деле лайфхак один: постараться найти альтернативные номера ТП, даже по 8-800 с городского трубку берут чуть ли не моментально, а по нативному можно высадить аккумулятор, пока дождёшься.
                            • +1
                              Элементарно же. По нативному звонит уже существующий клиент, который будет задавать дурацкие вопросы-«Куда делись деньги, почему у меня изменились условия тарифа, что за рекламу вы мне пихаете в браузер, почему такое хреновое покрытие?» и прочие подобные. А с городского/мобильного другого оператора звонит потенциальный клиент. Кого поставят в начало очереди?
                              • 0
                                Да это понятно, плюс ещё неизвестно, вдруг сам П... кто на линии.
                        • 0
                          Удивительно, насколько просто теперь можно сделать чат-бота в домашних условиях без смс регистрации.
                          • +5

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

                            • 0
                              Я не думаю, что кто-то будет писать абсолютно с нуля такие вещи, т.к. на такое уйдут месяца, а возможно и годы разработки.
                              Целью статьи было показать, что на сегодняшний день создать самому чат-бота (с притягиванием машинного обучения) можно легко и просто (конечно же, не без использования сторонних библиотек). Я думаю, что статья с положенной задачей более чем справилась, ибо что хотели — то и получили.
                              • 0
                                ну, вообще то в 30 строк кода можно собрать только готовое… так что просто давай вместе ещё раз поглядим тему поста? Оппа? Ничего не изменилось? Вроде нет… Обучаемый бот в 30 строк…
                                • 0
                                  Окей, а что же мы получили в итоге? Случаем, не обучаемого чат-бота в 30 строк кода на питоне?
                                  В теме не написано «Пишем обучаемый ИИ с нуля на питоне в 30 строк кода».
                              • +10
                                Ждём статью «как сделать поисковик в 30 строк кода» и «как сделать соцсеть в 30 строк кода».
                                • +7
                                  а внутри будет написано «подключаем модуль поисковика/соцсети»
                                  • +2

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

                                  • 0
                                    Спасибо за статью. Прикрутил к своему попугаю в стиле джаббероботов. Правда он у меня на .net core.
                                    • +1
                                      А бот будет самообучаться на основе полученных сообщений? Или только вручную учить? Так не интересно, если только вручную, какой же это ИИ.
                                      • 0
                                        Самообучение на нём заложено уже в механизмах его работы, но материал для обучения всё-равно нужно давать. Это же как ребёнок в школе — он не поймёт ошибку, пока ему не покажет её учитель.
                                        • 0
                                          Самообучение на нём заложено


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

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

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

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

                                        • 0
                                          Спасибо, не заметил, просто привык всё транскриптом переводить)
                                        • 0
                                          У меня глупый вопрос: как запустить бота?
                                          1) Регистрируем нового бота, получаем токен
                                          2) при обращению к api получаю ответ: {«ok»:false,«error_code»:404,«description»:«Not Found»}
                                          Вопрос: для работы с api нужен ssl сертификат на машине? можно самоподписанный? На какое имя он (сертификат) должен быть выдан?
                                          • 0
                                            1. Всё правильно
                                            2. У Вас, скорее всего, неправильно подключен токен api. Проверьте всё ещё раз.
                                            • 0
                                              через @BotFather придумываешь имя и он тебе выдает токен + ссылку. Больше ничего и не делал
                                              • 0
                                                Токен API ещё должен быть также от ИИ. Читайте внимательнее статью. Client access token
                                            • 0
                                              Что значит «при обращении к api»? К какому api, как обращаетесь?
                                              • 0
                                                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
                                                  А вам обязательно работать через вебхуки?
                                                  Через long polling, как в статье, тот же пакет python-telegram-bot у меня взлетел сразу
                                                  updater.start_polling()
                                                  • 0
                                                    для работы ssl не надо делать? можно на своем обычном компе и PyCHarm пробовать?
                                                    • 0
                                                      Конечно. Делайте всё, как в статье. Всё отлично работает.
                                              • 0
                                                Можно самоподписанный. https://core.telegram.org/bots/self-signed
                                              • +5
                                                Статья в стиле как собрать автомобиль вкрутив один болт.

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

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

                                                • +2
                                                  Интересная статья, а чем нативный механизм интеграции dialogflow и телеграмм Вас не устроил?
                                                  • 0
                                                    С Integrations будет работать через Webhook и Вы не сможете никак «настроить бота под себя». В таком случае Вы будете полностью зависеть от возможностей Dialogflow, теряя очень большой потенциал для реализации чего-то «авторского».
                                                  • 0
                                                    здрасте) бот удалось запустить, отправляет приветствие, а на ответ не реагирует)
                                                    вопрос такой:

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

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

                                                        в чем может быть причина?
                                                        • 0
                                                          Пересоздайте телеграмм бота и dialogflow агента, спуститесь к концу статьи и скопируйте полный код, заменив токены на свои.
                                                    • 0
                                                      Можно сделать проще.

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

                                                      Бот автоматически запустится и будет работать. И не нужно задействовать сторонний сервер.
                                                      • 0
                                                        С Integrations будет работать через Webhook и Вы не сможете никак «настроить бота под себя». В таком случае Вы будете полностью зависеть от возможностей Dialogflow, теряя очень большой потенциал для реализации чего-то «авторского».
                                                      • 0
                                                        В былые времена было такая программка — chatmaster. Ностальгия прям
                                                        • 0
                                                          Я правильно понимаю, что бот не обучается сам, а может лишь отвечать на знакомые ему вопросы?
                                                          • 0
                                                            Обучаться он может, не без Вашей помощи, конечно.
                                                            • 0
                                                              Я правильно понимаю, что бот не обучается сам, а может лишь отвечать на знакомые ему вопросы?


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

                                                              Если о том, нужно ли вручную разбивать обучающую выборку на отдельные intent-ы — да, кластеризовать (например) готовые диалоги автоматически оно не может.
                                                            • +1
                                                              Технические статьи такие технические.
                                                              • 0
                                                                Код 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 себе вынужден был цельный фреймворк сваять, но там еще копать и копать...

                                                                • 0
                                                                  А для Discord подойдет такой бот?
                                                                  • 0
                                                                    Если есть api от Discord'а, то почему бы и нет.
                                                                  • 0
                                                                    Если кто-то захочет потренироваться на примере используя 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 такой ошибки нет
                                                                    • 0
                                                                      Возможно, вопрос глупый. Но что есть «обучение» в контексте этого топика?
                                                                      «ИИ» выбирает ответы из базы вопросов/ответов, если в базе вопроса нет, то «ИИ» ищет что-то похожее с похожими словами и даёт ответ. Этот ответ Вы потом отмечаете как «правильный/неправильный». И к вопросам, которые непонятны «ИИ», Вы можете задать ответы. Верно? Так оно работает?
                                                                      • 0
                                                                        Возможно, вопрос глупый. Но что есть «обучение» в контексте этого топика?

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

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

                                                                        Скорее выделяем признаки из вопроса — потом определяем классификатором, какому классу соответсвуют такие их значения. Ну, если там внутри не kNN :-)
                                                                      • 0
                                                                        Подключил бота в телеграм по этому мануалу t.me/artemiyrobot
                                                                        Туповат как пробка, пришлось добавить свои костыли для поддержания беседы
                                                                      • 0
                                                                        Здравствуйте!
                                                                        Новичок в этой теме.Вчера узнал, решил попробовать.Но в коне модули не распознаются.
                                                                        У меня 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
                                                                          Здравствуйте.
                                                                          1. Ошибка — ошибка кодировки, как её решить написано тут
                                                                          2. Ошибка зависимости. Нужно устанавливать не через git clone, а через pip. Попробуйте ещё раз всё переустановить.
                                                                          • 0
                                                                            Изначально я делал git clone и pip.
                                                                            Пробовал еще раз через pip тоже самое — оишибка
                                                                            • 0
                                                                              Попробуйте использовать команду pip3 вместо pip. Кстати, во втором питоне бот может не отвечать на сообщения (первый пример), потому что type('Получил ваше сообщение') возвращает str. А type(update.message.text) возвращает unicode, поэтому сложение строк не срабатывает. Можно пофиксить через
                                                                              response = 'Получил Ваше сообщение: ' + str(update.message.text)
                                                                        • 0
                                                                          Добрый вечер. В Вашем примере мы подключаем через токен только одного агента Small Talk. А если я в DialogFlow добавил несколько агентов: погода, CRM и т.д., и у каждого токен, как мне подключить несколько агентов к ApiAI?
                                                                          • 0
                                                                            Тут никак
                                                                            Один запрос к API — 1 агент
                                                                            Можно попробовать перенести функционал отдельных агентов к главному, читайте доки Dialogflow.
                                                                          • 0
                                                                            С телеграмом не работал, подскажите, пожалуйста, кратко, о возможностях.
                                                                            Вопрос, возможно, не совсем по теме, но буду признателен за ответ. Хочу, кроме сообщений, чтоб бот какие-то действия поддерживал (например, «перегрузи сервак, бот!»). Есть ли возможность для бота различать пользователей, что ему пишут? Например, по id телеграм. Вопрос второй: известно ли, что будет если запустить второй инстанс бота? Отказ от телеграм на авторизацию для второго инстанса или какие-то блокировки и т. д.?
                                                                            Вопрос третий: можно ли кроме текста отдавать какие-то кнопки для пользователя, например: «не совсем понял запрос: хотите А(кнопка_а) или Б(кнопка_б)?».

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