Сегодня мне в голову пришла мысль: «А почему бы не написать Telegram чат-бота с ИИ, которого потом можно будет обучать?»
Сейчас сделать это совсем легко, поэтому, недолго думая, я принялся к написанию кода.
Языком я выбрал Python, т.к. на нём легче всего работать с подобного рода приложениями.
Итак, для создания Telegram чат-бота с ИИ нам потребуется:
1. API Telegram. В качестве обёртки я взял проверенную библиотеку python-telegram-bot
2. API ИИ. Выбрал я продукт от Google, а именно Dialogflow. Он предоставляет довольно-таки неплохое бесплатное API. Обёртка Dialogflow для Python
Шаг 1. Создаём бота в Telegram
Придумываем имя нашему боту и пишем @botfather. После создания бота нам придёт API токен, который желательно бы где-то сохранить, т.к. в дальнейшем он нам понадобится.
Шаг 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 содержит данные о пришедшем сообщении.
# Обработка команд
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
После запуска пишем ему. Если всё настроено правильно, то Вы увидите вот это:
Основа бота написана, приступаем к следующему шагу!
P.s. не забывайте выключить бота, для этого вернитесь в консоль и нажмите Ctrl + C, подождите пару секунд и бот успешно завершит работу.
Шаг 3. Настройка ИИ
В первую очередь, идём и регистрируемся на Dialogflow (просто входим с помощью своего Google аккаунта). Сразу после авторизации мы попадаем в панель управления.
Жмём на кнопку Create agent и заполняем поля по усмотрению (это никакой роли не сыграет, это нужно лишь для следующего действия).
Жмём на Create и видим следующую картину:
Расскажу, почему созданный нами ранее «Агент» никакой роли не играет. Во вкладке Intents есть «команды», по которым работает бот. Сейчас он умеет лишь отвечать на фразы типа «Привет», и если не понимает, то отвечает «Я вас не понял». Не сильно впечатляет.
После создания нашего пустого агента, у нас появилась куча других вкладок. Нам нужно нажать на Prebuilt Agents (это уже специально обученные агенты, которые имеют множество команд) и из всего представленного списка выбрать Small Talk.
Наводим на него и жмём Import. Далее ничего не меняя, жмём Ok. Агент импортировался и теперь мы можем его настроить. Для этого в левом верхнем углу жмём на шестерёнку возле Small-Talk и попадаем на страницу настроек. Теперь мы можем изменить имя агента, как захотим (я оставляю как было). Меняем часовой пояс и во вкладке Languages проверяем, чтобы был установлен русский язык (если не установлен, то ставим).
Возвращаемся на вкладку General, спускаемся немного вниз и копируем Client access token
Теперь наш ИИ полностью настроен, можно возвращаться к боту.
Шаг 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:
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 выглядит вот так:
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()
Сохраняем изменения, запускаем бота и идём проверять:
Вот и всё! Бот в 30 строк с ИИ написан!
Шаг 5. Заключительная часть
Думаю, Вы убедились, что написать бота с ИИ – дело 10 минут. Осталось лишь теперь его учить и учить. Делать это, кстати, можно во вкладке Training. Там можно посмотреть все сообщения, которые писались и что на них ответил бот (или не ответил). Там же его можно и обучать, говоря боту где он ответил правильно, а где нет.
Надеюсь, статья была Вам полезна, удачи в обучении!
Комментарии (92)
Vektor-Pro
14.01.2018 17:44Сейчас еще алгоритмы не но столько совершенные, что бы понять, что общаешся с ботом, но в скором времени с помощью технологий машинного обучения будет практически неотличимо.
sjs
14.01.2018 19:03Придется придумывать серию тестовых вопросов, чтобы понять, что общаешься с ботом.
mafia8
14.01.2018 19:12+1Пешу сащипкаме штопы онн неперевеел анлаинперевотчикам.
:)
P.S. Была такая ситуация в чате одной игры. Русские и один иностранец, переводил переводчиком.unStaiL
15.01.2018 12:04проста пока исчо маво кто научил ботаф панимать такую речь :)
p.s. то же может быть и в случае Kaki}{ t0 takux fra3, хотя думаю что многое из этого вполне достижимо
equand
15.01.2018 12:05Да без фонетического воспроизведения бот не будет понимать такой текст (если только не запомнит в тупую благодаря ручному обучению).
unStaiL
15.01.2018 12:10листая ленту постов наткнулся на тему
«Как обучть мдль пнмть упртые скрщня»
habrahabr.ru/post/346578
quantumCat
15.01.2018 09:58+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, можно получить что-то более умное.
ilmarin77
14.01.2018 19:12Сколько надо будет учить такого бота, чтобы он выполнил просьбу "эй, сгоняй за пивом!"
Batlab Автор
14.01.2018 19:16Думаю, что сейчас самое время учить их таким командам. А то когда поумнеют, то поймут, что за такое можно просить деньги)
forcam
15.01.2018 09:59+2А когда поумнеют окончательно, поймут, что за пивом можно не только бегать, но и послать просителя, причем не только за пивом, причем не только послать)
tutam
14.01.2018 19:36Здравствуйте! Буду очень благодарен если кто-нибудь поможет. Проблема в следующем: библиотеку для телеграма я установил, однако питон все равно говорит что нет такого модуля. Должен отметить: у меня стоит несколько версий питона. В одной из них запускается совсем другая программа, а в двух остальных ругается на отсутствие модуля. Библиотеки ставил для всех версий.
Batlab Автор
14.01.2018 19:37Конфликт версий, однозначно. Это urllib3, да?
tutam
14.01.2018 20:49Тоесть нужно снести все кроме одной? И при чем здесь urllib3?
Batlab Автор
14.01.2018 20:58Насчёт «снести всё кроме одной» не знаю (вы точно устанавливали все пакеты, находясь в папке со скриптом?).
Просто отписал в сообщения один юзер, у которого python-telegram-bot не работал из-за конфликта с urllib3.tutam
14.01.2018 21:21Возможно глупый вопрос, но про какую папку со скриптом вы говорите? Я ставил пакеты находясь вот в этой папке: «C:\Users\tutam\AppData\Local\Programs\Python\Python36»
dmitry_ch
14.01.2018 19:46Не показывайте Мегафону и Ростелекому. До них и так не дозвонишься, а если они еще и такого робота прикрутят…
berezuev
15.01.2018 09:30Вот вам лайфхак: большинство автоответчиков можно заткнуть нажатием кнопки 0, для перевода на оператора. А тот уже пусть сам связывает с нужным отделом.
dmitry_ch
15.01.2018 09:37Вот и вам лайфхак — попробуйте с теми, что я назвал. "Я вам не поняла, произнесите тему вашего звонка!"
И хорошо бы по таймауту переводили на оператора, а то ведь порой и трубку робот бросает, если ниасилил распознать.aavezel
15.01.2018 10:24а то ведь порой и трубку робот бросает, если ниасилил распознать.
… — дэвушка, а можна мнэ кого то поэумнээ??
— пи-пи-пи-пи-пи-пи…achekalin
15.01.2018 10:29«Увы, нэт!»
На самом деле становится еще дурнее, когда нужно что-то точно узнать, скажем, тонкости биллинга. Я стараюсь прорываться к живому человеку, а там еще порой приходится исхитряться и просить первую линию поддержку переключить на знающего человека. Правда, вот это как раз не прокатывает, все экономят, так что, в лучшем случае, можно только тикет попросить составить.
ploop
15.01.2018 10:42большинство автоответчиков можно заткнуть нажатием кнопки 0
… и после 40 минут прослушивания музыки таки разбить телефон об стену.
На самом деле лайфхак один: постараться найти альтернативные номера ТП, даже по 8-800 с городского трубку берут чуть ли не моментально, а по нативному можно высадить аккумулятор, пока дождёшься.Ugrum
15.01.2018 16:32Элементарно же. По нативному звонит уже существующий клиент, который будет задавать дурацкие вопросы-«Куда делись деньги, почему у меня изменились условия тарифа, что за рекламу вы мне пихаете в браузер, почему такое хреновое покрытие?» и прочие подобные. А с городского/мобильного другого оператора звонит потенциальный клиент. Кого поставят в начало очереди?
mSiotniHS
14.01.2018 20:57Удивительно, насколько просто теперь можно сделать чат-бота в домашних условиях без смс регистрации.
divcontento
14.01.2018 21:28Ну тут по сути всё готовое собрано вместе :)
Думал будет интереснее...Batlab Автор
14.01.2018 22:08Я не думаю, что кто-то будет писать абсолютно с нуля такие вещи, т.к. на такое уйдут месяца, а возможно и годы разработки.
Целью статьи было показать, что на сегодняшний день создать самому чат-бота (с притягиванием машинного обучения) можно легко и просто (конечно же, не без использования сторонних библиотек). Я думаю, что статья с положенной задачей более чем справилась, ибо что хотели — то и получили.
dark_sage
15.01.2018 12:02ну, вообще то в 30 строк кода можно собрать только готовое… так что просто давай вместе ещё раз поглядим тему поста? Оппа? Ничего не изменилось? Вроде нет… Обучаемый бот в 30 строк…
Batlab Автор
15.01.2018 12:03Окей, а что же мы получили в итоге? Случаем, не обучаемого чат-бота в 30 строк кода на питоне?
В теме не написано «Пишем обучаемый ИИ с нуля на питоне в 30 строк кода».
bak
14.01.2018 22:03Ждём статью «как сделать поисковик в 30 строк кода» и «как сделать соцсеть в 30 строк кода».
dmitry_dvm
14.01.2018 22:23Спасибо за статью. Прикрутил к своему попугаю в стиле джаббероботов. Правда он у меня на .net core.
dmitry_dvm
14.01.2018 22:35А бот будет самообучаться на основе полученных сообщений? Или только вручную учить? Так не интересно, если только вручную, какой же это ИИ.
Batlab Автор
15.01.2018 10:08Самообучение на нём заложено уже в механизмах его работы, но материал для обучения всё-равно нужно давать. Это же как ребёнок в школе — он не поймёт ошибку, пока ему не покажет её учитель.
alex4321
15.01.2018 12:58Самообучение на нём заложено
ЕМНИП, в обучение без учителя (хотя тут скорее semi-superwised learning) dialogflow не может же.
Как максимум — в сбор материала для разметки.
Или я что-то упустил?
ssss41
15.01.2018 08:13У меня глупый вопрос: как запустить бота?
1) Регистрируем нового бота, получаем токен
2) при обращению к api получаю ответ: {«ok»:false,«error_code»:404,«description»:«Not Found»}
Вопрос: для работы с api нужен ssl сертификат на машине? можно самоподписанный? На какое имя он (сертификат) должен быть выдан?Batlab Автор
15.01.2018 10:061. Всё правильно
2. У Вас, скорее всего, неправильно подключен токен api. Проверьте всё ещё раз.
sshmakov
15.01.2018 10:07Что значит «при обращении к api»? К какому api, как обращаетесь?
ssss41
15.01.2018 11:121) пробовал по ссылке после регистрации
2) через curl -F«url=https://my_ip:443/my+token/» -F«certificate=@public.pem» api.telegram.org/my_token/setWebhook после установки ssl
3) из python
ощущение, что я что-то не установил для обращения к немуsshmakov
15.01.2018 11:36А вам обязательно работать через вебхуки?
Через long polling, как в статье, тот же пакет python-telegram-bot у меня взлетел сразу
updater.start_polling()
AxisPod
15.01.2018 08:39Статья в стиле как собрать автомобиль вкрутив один болт.
Покупаем автомобиль без одного болта, болт и ключ. Вкручиваем болт. Поздравляем, вы собрали свой автомобиль.tmin10
17.01.2018 21:27Я вам больше скажу, там на страничке есть уже готовые интеграции с меседжерами и телеграм подключается вообще без программирования, только тоокен вбить.
MarkMars
15.01.2018 10:00Интересная статья, а чем нативный механизм интеграции dialogflow и телеграмм Вас не устроил?
Batlab Автор
15.01.2018 10:06С Integrations будет работать через Webhook и Вы не сможете никак «настроить бота под себя». В таком случае Вы будете полностью зависеть от возможностей Dialogflow, теряя очень большой потенциал для реализации чего-то «авторского».
lavesov
15.01.2018 10:00здрасте) бот удалось запустить, отправляет приветствие, а на ответ не реагирует)
вопрос такой:
- в request.session_id пишем имя своего бота?
- и в начале дана Обёртка Dialogflow для Python — для чего это нужно?
- для pycharm установил apiai, а json не нашел, нужно ли его устанавливать и где найти?
- нужно ли подключать Телеграм через Inegration в DialogFlow?
- обязательно ли нужно заполнять разделы в Small Talk Customization Progress? Или должно работать и так?
спасибоBatlab Автор
15.01.2018 10:041. По документации, вообще, нужно придумывать рандомный токен длиной в 36 символов. Новый токен — новый диалог. Но по скольку я захотел, чтобы диалог был один и можно было легко понять, где на dialogflow общался бот, а где разработчик писал отладку. Поэтому я просто вставил имя бота.
2. Чтобы легче работать с их API. Т.к. в прошлом Dialogflow назывался ApiAI, но когда его купил гугл, то переименовали в Dialogflow, а вот пакеты которые остались на гитхабе — остались со своими старыми названиями.
3. Json устанавливать не нужно, он входит в библиотеку стандартных модулей питона.
4. Не нужно.
5. Это уже по желанию, если вы хотите придать боту «изюминку».lavesov
15.01.2018 12:33вроде, все перепроверил, интеграцию отключил, код скопировал, токены поменял, а ответа от бота нет(
в чем может быть причина?Batlab Автор
15.01.2018 14:15Пересоздайте телеграмм бота и dialogflow агента, спуститесь к концу статьи и скопируйте полный код, заменив токены на свои.
loskiq
15.01.2018 10:00Можно сделать проще.
1. Открыть Dialogflow
2. Перейти в раздел Integrations
3. Найти Telegram
4. Ввести токен от своего бота
Бот автоматически запустится и будет работать. И не нужно задействовать сторонний сервер.Batlab Автор
15.01.2018 10:01С Integrations будет работать через Webhook и Вы не сможете никак «настроить бота под себя». В таком случае Вы будете полностью зависеть от возможностей Dialogflow, теряя очень большой потенциал для реализации чего-то «авторского».
daemonhk
15.01.2018 11:07Я правильно понимаю, что бот не обучается сам, а может лишь отвечать на знакомые ему вопросы?
alex4321
15.01.2018 13:09Я правильно понимаю, что бот не обучается сам, а может лишь отвечать на знакомые ему вопросы?
Если речь о том, нужно ли вручную составлять правило, определяющее в какой intent отправить пользователя — нет, классификатор intent-в тут обучается автоматически.
Если о том, нужно ли вручную разбивать обучающую выборку на отдельные intent-ы — да, кластеризовать (например) готовые диалоги автоматически оно не может.
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
я относительно недавно писал бота, требования к которому были:
- простая модифицируемость
- относительная сложность диалогов
(бот-оператор, продающий топливо для заправок)
и вот пришел к тому, что парадигма: "каждое сообщение пользователя вызывает калбек" — очень неудобная для написания ботов: приходится на каждого пользователя заводить персистетную стейтмашину и каждый вызов калбека начинается с восстановления стейта итп.
намного удобнее парадигма chat
def chat(chat) message = chat.get_message() chat.send_message(reply)
однако реализовать в промышленном масштабе такую парадигму можно только на файберах (на процессах — очень плохо нагрузку будет держать).
не копали в этом направлении? я на perl себе вынужден был цельный фреймворк сваять, но там еще копать и копать...
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 такой ошибки нет
verydima
16.01.2018 02:43Возможно, вопрос глупый. Но что есть «обучение» в контексте этого топика?
«ИИ» выбирает ответы из базы вопросов/ответов, если в базе вопроса нет, то «ИИ» ищет что-то похожее с похожими словами и даёт ответ. Этот ответ Вы потом отмечаете как «правильный/неправильный». И к вопросам, которые непонятны «ИИ», Вы можете задать ответы. Верно? Так оно работает?alex4321
16.01.2018 03:12Возможно, вопрос глупый. Но что есть «обучение» в контексте этого топика?
Настройка классификатора, определяющего, к какому intent-у отнести вопрос, похоже.
выбирает ответы из базы вопросов/ответов, если в базе вопроса нет, то «ИИ» ищет что-то похожее с похожими словами и даёт ответ
Скорее выделяем признаки из вопроса — потом определяем классификатором, какому классу соответсвуют такие их значения. Ну, если там внутри не kNN :-)
recompileme
16.01.2018 10:15Подключил бота в телеграм по этому мануалу t.me/artemiyrobot
Туповат как пробка, пришлось добавить свои костыли для поддержания беседы
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'
Что я сделал не так или надо еще сделать?Batlab Автор
16.01.2018 11:06Здравствуйте.
1. Ошибка — ошибка кодировки, как её решить написано тут
2. Ошибка зависимости. Нужно устанавливать не через git clone, а через pip. Попробуйте ещё раз всё переустановить.mokilo
16.01.2018 17:23Изначально я делал git clone и pip.
Пробовал еще раз через pip тоже самое — оишибкаMassiveBrick
16.01.2018 19:00Попробуйте использовать команду pip3 вместо pip. Кстати, во втором питоне бот может не отвечать на сообщения (первый пример), потому что type('Получил ваше сообщение') возвращает str. А type(update.message.text) возвращает unicode, поэтому сложение строк не срабатывает. Можно пофиксить через
response = 'Получил Ваше сообщение: ' + str(update.message.text)
asvechkar
16.01.2018 18:12Добрый вечер. В Вашем примере мы подключаем через токен только одного агента Small Talk. А если я в DialogFlow добавил несколько агентов: погода, CRM и т.д., и у каждого токен, как мне подключить несколько агентов к ApiAI?
Batlab Автор
16.01.2018 19:01Тут никак
Один запрос к API — 1 агент
Можно попробовать перенести функционал отдельных агентов к главному, читайте доки Dialogflow.
shockable
16.01.2018 23:36С телеграмом не работал, подскажите, пожалуйста, кратко, о возможностях.
Вопрос, возможно, не совсем по теме, но буду признателен за ответ. Хочу, кроме сообщений, чтоб бот какие-то действия поддерживал (например, «перегрузи сервак, бот!»). Есть ли возможность для бота различать пользователей, что ему пишут? Например, по id телеграм. Вопрос второй: известно ли, что будет если запустить второй инстанс бота? Отказ от телеграм на авторизацию для второго инстанса или какие-то блокировки и т. д.?
Вопрос третий: можно ли кроме текста отдавать какие-то кнопки для пользователя, например: «не совсем понял запрос: хотите А(кнопка_а) или Б(кнопка_б)?».Batlab Автор
17.01.2018 10:471. Всё зависит от возможностей Python'а, поэтому да, можно. Различать юзеров по айди можно (читайте документацию пакета бота).
2. Никаких отказов быть не должно, хотя и не проверял.
3. Можно. Опять же таки, читайте доки по телеграмм боту.
sshmakov
17.01.2018 11:38В2 — сомнительно, что с одним api key это возможно. И непонятно, зачем.
В3 — лучше читать не документацию, там этого не разжевано, а примеры из examples в репозитории пакета на github — есть примеры с кнопками.
altervision
Похоже, будущее наступило. Теперь и правда можно собрать себе собеседника за 10 минут из нескольких строк кода и пары готовых библиотек. Welcome to future! ;)