Czytaj książkę: «Телеграм-боты без страха. От первого бота до своего каталога.»
Введение. «Хочу бота, но я не программист»
Вечер, половина десятого. Мастер маникюра отвечает на сообщение в директе. «Здравствуйте, а сколько стоит покрытие?» Она пишет цену. Следующее сообщение: «А когда можно?» Она открывает записную книжку, смотрит, отвечает. Ещё сообщение — от другого человека: «Здравствуйте, а сколько стоит покрытие?»
Это третий раз за сегодня и, наверное, сотый за месяц. Один и тот же вопрос, один и тот же ответ, набранный заново.
Где-то на этом месте появляется мысль: должен же быть бот, который это делает. Мысль появляется — и тут же упирается. Бот — это программирование. Программирование — это не ко мне.
Эта книга написана ровно про промежуток между «должен быть бот» и «я не программист».
Что такое бот
Одним предложением, без терминов:
Бот — это переписка, в которой за одну сторону заранее написали ответы.
Человек пишет или нажимает кнопку — бот отвечает тем, что для этого случая приготовлено. Больше в нём ничего нет. Ни экрана, который нужно рисовать, ни установки, ни версий для разных телефонов. Только переписка.
Из этого следует главное практическое обстоятельство, ради которого стоит читать дальше: чтобы завести бота, нужно не программирование, а список ответов. Кто составил список, тот соберёт бота. Кто не составил, не соберёт даже с программистом за деньги — потому что программисту нечего будет собирать.
Список составляется на бумаге. Инструмент выбирается потом.
Две части и кому какая
Частей три, но развилка в книге одна, и проходит она посередине. Читателей тоже двое — и это, скорее всего, один и тот же человек с разницей в две недели.
Часть первая — бот без кода. Собирается в конструкторе: вы соединяете готовые блоки, ничего не программируя. К концу части у вас работающий бот, который принимает заявки, задаёт вопросы, складывает ответы в таблицу, напоминает клиентам о визите и умеет обращаться к нейросети. Кода в этой части нет ни строчки — ни одной, это обещание.
Часть вторая — бот на своём коде. Она нужна не всем и не сразу. Конструктор рано или поздно упирается в потолок: не хватает гибкости, вырастает абонентская плата, требуется что-то, чего в нём просто не предусмотрено. Вторая часть — про то, что делать дальше. Python, библиотека для ботов, размещение бота на сервере, чтобы он работал без вашего ноутбука.
Часть третья — каталог. Двадцать ботов с описанием: что делает, кому нужен, собирается в конструкторе или требует кода, за сколько собирается, где ломается. Читается не подряд, а по своей задаче.
Порядок чтения такой: первая часть — всем, вторая — по необходимости, третья — под свою задачу.
Если вы уже пишете код, первую часть можно пролистать. Но две главы из неё прочитайте: про то, из чего состоит бот, и про схему разговора. Они не про инструменты, они про устройство, и во второй части всё стоит на них.
Где лежит код и почему его нет здесь
Во второй части книги вы не найдёте программ, напечатанных целиком. Это сделано намеренно, и причину стоит объяснить сразу, чтобы она не выглядела экономией на читателе.
Электронная книга переверстывается под экран. Строки переносятся там, где решит читалка, отступы съезжают, моноширинный шрифт заменяется обычным. Для обычного текста это неважно. Для Python — смертельно: в нём отступы несут смысл, и программа с поехавшими отступами не запустится. Читатель на телефоне получил бы код, который гарантированно не работает, и был бы прав, поставив книге единицу.
Поэтому сделано так:
Весь код лежит по ссылке, в открытом хранилище (в приложении к книге есть ссылки на зеркала, а также qr-код с ссылкой на эти зеркала). Скачивается целиком или по одному файлу.
В книге — фрагменты по три-семь строк с разбором: что эта часть делает, что в ней меняют под себя, что трогать не нужно.
Каждый файл подписан так же, как сценарий в книге. Читаете про бота записи на услугу — в хранилище лежит файл с этим названием.
Побочная выгода общая: код в хранилище обновляется, когда меняются версии библиотек. Книга при этом не устаревает, потому что в ней объяснена логика, а логика не меняется.
Ссылка повторена в начале второй части — искать её по всей книге не придётся.
Что вы получите
Работающий бот под вашу задачу — сегодня в конструкторе, через неделю на своём коде.
Один бот, который делает одно дело и делает его до конца. Не десять ботов, не система, не «инфраструктура».
Реалистичные сроки, чтобы вы могли планировать: первый бот, отвечающий на сообщение, — полчаса. Бот записи на услугу, собранный в конструкторе по схеме, — вечер. Тот же бот на своём коде, размещённый на сервере, — две-три недели занятий по вечерам, если раньше вы кода не писали.
Последняя цифра не преувеличена и не преуменьшена. Обещания «за выходные» относятся к тем, кто уже умеет.
Чего в этой книге нет
Обещаний заработка. Ни слова про то, сколько можно получать, собирая ботов на заказ. Такие деньги существуют, но это другая профессия и другая книга.
Автоворонок, прогревов и всего, что к ним прилагается. Не потому, что это плохо, а потому что это про продажи, а не про ботов. Бот там — инструмент, и научиться ему можно отдельно.
Уверений, что это просто. Местами будет неприятно. Установка Python на чужой машине умеет портить вечер, а первое размещение бота на сервере — тем более. В таких местах в книге стоит блок «если не получилось» с точным текстом ошибок и объяснением, что они означают.
Историй успеха с цифрами. Ни одного «Марина собрала бота и увеличила выручку втрое».
Обещания, что бот заменит человека. Не заменит там, где нужен человек. Бот хорош на повторяющемся: одни и те же вопросы, один и тот же порядок действий. Переговоры, оценка ситуации, ответственность за чужие деньги остаются вам.
Предупреждение об устаревании
Часть того, что здесь написано, устареет, и лучше знать заранее, какая именно.
Устареет быстро: названия конструкторов, их тарифы, доступность оплаты, лимиты бесплатных версий. Версии библиотек. Цены на размещение кода. Всё это вынесено в приложение в конце книги — там оно собрано в одном месте и переписывается при переиздании, не трогая остальной текст.
Устареет медленно: расположение пунктов в интерфейсах, порядок действий при регистрации. Поэтому в книге нет описаний вида «нажмите кнопку справа вверху» — описывается логика: что нужно сделать, а не куда нажать. Логика переживает переделку интерфейса, а описание кнопки — нет.
Не устареет: устройство бота, схема разговора, места, где боты ломаются. Первые две главы и восьмая написаны так, что будут верны и через пять лет с любым инструментом.
Что пригодится из других книг серии
Если вы никогда не пользовались нейросетями — начните с книги «Нейросети для работы». Не потому, что здесь без неё нельзя, а потому, что здесь она сильно пригодится. Код удобно разбирать и чинить с помощью модели: скопировали текст ошибки, попросили объяснить — и получили ответ вместо часа поисков. Эта книга такому приёму учит, а «Нейросети для работы» учит ставить задачу так, чтобы ответ был полезным.
Если вы читали «ИИ-агенты без кода» — вы узнаете ход мысли. Там задача раскладывалась на шаги. Здесь раскладывается разговор. Разница между агентом и ботом простая: агент работает без человека, бот разговаривает с человеком. Читать ту книгу до этой не обязательно.
Порядковых номеров у книг серии нет намеренно — порядок написания разошёлся с нумерацией, и номера путают. Все ссылки здесь по названиям.
Как устроена каждая глава
Одинаково, чтобы не приходилось искать.
Сначала — что мы делаем и зачем. Потом разбор. В конце — «что должно получиться» и «если не получилось» с типовыми ошибками. В главах второй части добавляется отдельный разбор ситуации, когда код не запускается: с точным текстом сообщения об ошибке и объяснением, что оно значит. Последняя глава устроена иначе — она подводит итог, а не учит новому.
Через всю книгу проходит один сквозной пример — бот записи на услугу. Мы нарисуем его схему во второй главе и соберём в конструкторе в четвёртой. В пятой он научится собирать данные, в шестой — напоминать о визите. В восьмой посмотрим, где он ломается, в девятой упрёмся с ним в потолок конструктора, а в одиннадцатой и двенадцатой соберём заново на коде. В каталоге он идёт первым — в обеих версиях.
Пример выбран не потому, что запись на услугу — самая частая задача. Потому что в ней есть всё: кнопки, пошаговый опрос, проверка ввода, хранение данных, уведомление владельцу, событие по времени и работа с чужим временем. Кто собрал бота записи, соберёт что угодно.
Если ваша задача другая, ничего страшного: в каждой главе есть второй, короткий пример из другой области. Но следить советую за первым — сквозная задача, которую вы ведёте от схемы на бумаге до бота на сервере, даёт больше, чем десять разрозненных.
С чего начать прямо сейчас
Не с конструктора. Возьмите неделю своих переписок с клиентами и выпишите вопросы, которые повторились больше трёх раз.
Этот список и есть техническое задание на вашего первого бота. Всё остальное в книге — про то, как превратить его в работающую переписку.
Начинаем с устройства: из чего вообще состоит бот.
Часть I. Боты без кода
Глава 1. Из чего состоит бот
Человек, который собирается завести бота, обычно представляет его как маленькую программу — что-то вроде приложения, только внутри мессенджера. Из этого представления растёт весь страх: приложение пишут программисты, значит, и здесь без программиста никак.
Представление неверное, и это хорошая новость.
Бот устроен проще любого приложения. У него нет экрана, который нужно рисовать. Нет меню, которое нужно продумывать. Нет установки, обновлений, версий для разных телефонов. Всё, что у бота есть, — это переписка. Человек пишет или нажимает, бот отвечает. Больше ничего.
Поэтому определение, с которого начинается эта книга, звучит так:
Бот — это набор ответов на события.
Не программа. Не сотрудник. Не воронка. Набор заранее описанных ответов на то, что может произойти в переписке.
Вся первая часть книги — про то, как этот набор составить. Вторая — про то, как записать его на языке, который понимает компьютер, когда конструктора перестаёт хватать. Но набор ответов остаётся тем же самым. Меняется только способ записи.
Эта глава даёт модель, по которой дальше разбирается любой бот: и ваш будущий, и чужой, который вы захотите повторить.
Три типа событий
События, на которые бот отвечает, бывают трёх видов. Их действительно только три, и это не упрощение для новичков — за пределами этих трёх у бота ничего не происходит.
Первое: человек написал сообщение. Текст, картинка, файл, геопозиция, голосовое. Для бота это одно событие с разным содержимым: пришло сообщение, надо на него отреагировать.
Отдельный случай — команды. Это те слова со слешем впереди, вроде /start, которые видно в меню бота. Технически команда — то же сообщение, просто платформа подсвечивает его и складывает в отдельный список, чтобы человеку было удобно. Для бота разница небольшая.
Второе: человек нажал кнопку. Кнопки бывают двух видов. Одни живут под полем ввода и заменяют клавиатуру — нажатие на такую превращается в обычное сообщение с текстом кнопки. Другие живут прямо под сообщением бота и при нажатии передают ему служебный сигнал, а само сообщение при этом можно переписать на месте. Разницу мы разберём в четвёртой главе, когда она начнёт иметь практическое значение. Сейчас достаточно: нажатие — событие.
Третье: наступило время. Ровно в девять утра. Через час после записи. За сутки до визита. Каждый понедельник. Здесь никто ничего не делал — событие наступило само, по часам.
Третий тип — единственный, где бот действует первым. Всё остальное — реакция.
Отсюда простая проверка, которая пригодится вам ещё много раз. Если вы хотите, чтобы бот что-то сделал, спросите себя: после чего? Если ответа нет — бот этого не сделает. Не потому, что не умеет, а потому, что ему нечем начать.
«Пусть бот сам напишет клиенту, который давно не приходил» — после чего? После того, как наступила дата на месяц позже последнего визита. Это третий тип, и такое возможно.
«Пусть бот сам поймёт, что клиент недоволен, и предложит скидку» — после чего? После сообщения, в котором есть недовольство. Событие есть, а вот с распознаванием недовольства всё сложнее — к этому вернёмся в главе о подключении нейросети.
Четыре составляющие ответа
Событие произошло. Дальше бот выполняет ответ, и любой ответ раскладывается на четыре части. Эти четыре слова — рабочий инструмент, с которым вы будете жить до конца книги, поэтому запомнить их стоит сразу.
Триггер — что произошло. Пришло сообщение «Записаться». Нажата кнопка «Понедельник». Наступило восемь вечера накануне визита.
Условие — в каком состоянии находится разговор. Одно и то же сообщение в разные моменты означает разное. «Иванов» в начале разговора — это, скорее всего, попытка что-то спросить. «Иванов» после вопроса «Как вас записать?» — это фамилия клиента. Триггер одинаковый, реакция должна быть разной, и различает их именно условие.
Действие — что бот делает внутри. Записывает строку в таблицу. Ставит будильник на завтра. Отправляет вам уведомление о новой заявке. Обращается к нейросети. Ничего из этого человек не видит.
Ответ — что человек видит на экране. Текст. Кнопки. Картинка. Иногда — правка предыдущего сообщения бота вместо нового.
Действие и ответ разделены не для красоты. Это разделение спасает от самой частой ошибки начинающих: бот делает всё правильно, но человек не понимает, что произошло. Заявка ушла в таблицу, уведомление пришло владельцу, а клиент смотрит в экран, где ничего не изменилось, и через минуту нажимает «Записаться» второй раз. Теперь заявок две.
Любое действие должно сопровождаться ответом. Даже коротким. Даже «Готово».
Обратное неверно: ответ без действия — нормальная ситуация. «Мы работаем с десяти до восьми» — просто текст, внутри ничего не происходит.
Состояние разговора
Из четырёх составляющих условие обычно даётся тяжелее всего, потому что за ним стоит понятие, которое звучит технически: состояние разговора.
На деле оно означает вот что: бот помнит, на каком шаге вы находитесь.
Больше ничего. Не помнит вас как личность, не помнит прошлый разговор, не делает выводов. Помнит шаг.
Сравнение, которое работает лучше всего, — анкета на бумаге. Администратор задаёт вопросы по списку и отмечает галочкой, до какой строки дошёл. Имя записано. Телефон записан. Стоим на строке «дата». Что бы вы сейчас ни сказали, администратор попробует понять это как дату — потому что галочка стоит здесь.
Бот делает то же самое. Состояние — это галочка на строке.
Отсюда следуют три вещи, которые сэкономят вам много времени.
Первая: пока состояние не меняется, бот застревает. Если вы забыли перевести галочку на следующую строку, бот будет задавать один и тот же вопрос сколько угодно раз. Это не поломка, а ровно то, что ему велели.
Вторая: состояние может потеряться. Бот перезапустился, конструктор обновился, прошло много времени — галочка стёрлась. Человек оказывается посреди анкеты, а бот не знает, где он. Что с этим делать, разберём в восьмой главе; пока достаточно знать, что такое случается, и это не ваша вина.
Третья: у каждого человека галочка своя. Сто человек в одном боте — сто анкет, каждая на своей строке. Бот их не путает. Это одна из немногих вещей, которую и конструктор, и код делают за вас бесплатно.
Три знакомых бота, разобранных по схеме
Модель проверяется на чужих ботах. Возьмём три, с которыми вы наверняка сталкивались, и разложим каждый на события и составляющие. Заодно вы получите привычку, которая пригодится в третьей части: увидел бота — разобрал.
Бот доставки еды
Событие: человек нажал «Меню». Условие: неважно, из любого места. Действие: подтягивает список блюд из таблицы. Ответ: сообщение с кнопками по числу позиций.
Событие: нажата кнопка с блюдом. Условие: корзина открыта. Действие: добавляет позицию в корзину. Ответ: переписывает то же сообщение, показывая обновлённый состав и сумму.
Событие: нажата «Оформить». Условие: в корзине что-то есть. Действие: сохраняет заказ, отправляет уведомление на кухню. Ответ: «Заказ принят, ждите звонка».
Обратите внимание на условие в последнем случае. Если корзина пуста, а кнопка «Оформить» всё равно нажата, нужен отдельный ответ. Хорошо сделанные боты отвечают «Сначала выберите блюдо». Плохо сделанные — оформляют пустой заказ и присылают его на кухню.
Бот службы поддержки
Событие: человек написал что угодно. Условие: разговор в начале. Действие: нет. Ответ: список тем кнопками.
Событие: выбрана тема. Условие: разговор в начале. Действие: нет. Ответ: готовый текст по теме плюс кнопка «Не помогло».
Событие: нажато «Не помогло». Действие: создаёт обращение, передаёт его человеку из поддержки. Ответ: «Специалист ответит здесь же».
Здесь виден приём, к которому мы вернёмся в главе о том, где боты ломаются: у бота обязан быть выход к живому человеку. Бот, из которого нельзя выйти, злит сильнее, чем его отсутствие.
Бот записи на услугу
Это наш сквозной пример — с ним мы пройдём всю книгу до последней главы. Разберём его подробнее.
Событие: команда «старт». Условие: любое. Действие: нет. Ответ: приветствие и три кнопки — «Записаться», «Мои записи», «Как нас найти».
Событие: нажата «Записаться». Условие: любое. Действие: ставит галочку на строку «услуга». Ответ: список услуг кнопками.
Событие: нажата кнопка с услугой. Условие: галочка на строке «услуга». Действие: запоминает выбор, переводит галочку на строку «дата». Ответ: ближайшие свободные дни кнопками.
Событие: нажата кнопка с днём. Условие: галочка на строке «дата». Действие: запоминает, переводит галочку на «время». Ответ: свободные часы кнопками.
Событие: нажата кнопка с часом. Условие: галочка на «время». Действие: записывает строку в таблицу, отправляет уведомление владельцу, ставит будильник на восемь вечера накануне. Ответ: «Записал: стрижка, четверг, 15:00» и кнопка «Отменить запись».
Событие: наступило восемь вечера накануне. Условие: запись не отменена. Действие: нет. Ответ: напоминание клиенту.
Пересчитайте: шесть ответов на события плюс один по времени. Это весь бот. Ничего сверх этого он не делает, и ничего сверх этого делать не должен.
Если сейчас вам кажется, что вы могли бы описать такой список для своей задачи, — вы правы, могли бы. Именно этим мы займёмся в следующей главе, и это главный навык книги.
Чего бот не умеет
Список ограничений идёт раньше списка возможностей, потому что почти все разочарования в ботах растут из ожиданий, которых бот не обещал.
Понимать намерение вне сценария. Бот отвечает на то, что вы предусмотрели. Человек, который вместо нажатия кнопки пишет «а можно я приду в среду вечером, часов в семь, если у вас там свободно», получит ответ ровно настолько осмысленный, насколько вы этот случай продумали. Нейросеть, подключённая к боту, сдвигает границу, но не убирает: она превратит фразу в дату и час, а решать, что с ними делать, всё равно будете вы. Об этом — глава о подключении модели.
Помнить вечно. Состояние живёт, пока живёт разговор. Данные живут, пока вы их куда-то сложили — в таблицу или в базу. То, что нигде не сохранено, исчезает при первом перезапуске. Это не недостаток конкретного инструмента, а свойство всех.
Отвечать за результат. Бот отправил напоминание — это не значит, что человек его прочитал. Бот принял заявку — это не значит, что клиент придёт. Бот исполняет действия, а не достигает целей.
Работать без вас. Токен отзывают, сервис меняет тарифы, площадка падает, таблица переполняется. Бот требует внимания — немного, но регулярно. Обещания «настроил и забыл» в этой книге не будет.
Заменить человека там, где нужен человек. Бот хорош на повторяющемся: одни и те же вопросы, один и тот же порядок действий, одна и та же форма. Всё, что требует переговоров, оценки ситуации или ответственности за чужие деньги, остаётся вам.
Чем бот отличается от чата с моделью и от агента
Три вещи легко перепутать, а разница между ними определяет, что вам вообще нужно строить.
Чат с моделью — это разговор с нейросетью в её собственном приложении. Инициатива всегда ваша, отвечает модель, каждый ответ рождается заново. Ничего не запускается по расписанию, никто, кроме вас, к этому разговору доступа не имеет. Как ставить задачи модели, разобрано в книге «Нейросети для работы»; здесь этот навык понадобится, но не в первой части.
Агент — записанная последовательность шагов, где один-два шага выполняет модель. Он запускается сам, делает работу и приносит вам результат. Смысл агента в том, чтобы человек в процесс не вмешивался. Об этом книга «ИИ-агенты без кода».
Бот — точка контакта с людьми. Смысл бота в том, что с ним разговаривают. Не вы, а ваши клиенты, читатели, ученики, сотрудники.
Разница практическая: агент — про работу без человека, бот — про разговор с человеком. Если ваша задача формулируется как «пусть это делается само, а мне приходит готовое» — вам нужен агент, и эта книга не самая полезная. Если как «пусть люди могут это сделать сами, не отвлекая меня» — вам нужен бот.
Часто нужно и то, и другое. Бот принимает заявки от клиентов, агент раз в неделю разбирает накопившееся и присылает вам сводку. Собираются они отдельно, соединяются через общую таблицу. Такой связкой мы займёмся ближе к концу книги.
Ещё одна пара, которую путают: бот и канал. Канал — это вещание, вы пишете, люди читают. Бот — переписка. У бота есть важное ограничение, которое стоит узнать сейчас, а не после сборки: бот не может написать человеку первым, пока человек сам к нему не обратился. Платформа устроена так намеренно, чтобы боты не превращались в источник непрошеных сообщений. Из этого следует, что рассылка возможна только по тем, кто хотя бы раз нажал «старт». Что из этого следует для рассылок и почему массовые сообщения — плохая идея даже когда технически возможны, разберём в шестой главе.
Что должно получиться
К концу этой главы у вас должна появиться привычка, а не знание. Проверить её просто: откройте любого бота, которым вы пользуетесь, и разберите три его шага по схеме — событие, условие, действие, ответ.
Если получилось, дальше будет легко: вся книга — это одна и та же схема, применённая к разным задачам и записанная разными способами.
Заодно попробуйте набросать список событий для своего бота. Пока без порядка и без деталей, просто перечислением: что человек может написать, что нажать, когда бот должен проснуться сам. Этот список станет черновиком схемы в следующей главе.
Если не получилось
«Я не могу понять, где у бота условие». Скорее всего, вы разбираете простого бота, у которого состояний нет вовсе — он отвечает одинаково откуда угодно. Так тоже бывает, и это нормальный бот. Условие появляется там, где начинается пошаговый опрос.
«Я не вижу действия — бот просто пишет текст». Значит, действия нет. Ответ без действия — половина всех шагов в любом боте.
«Мой список событий получился на сорок строк». Почти наверняка вы записали туда варианты одного события. «Клиент выбрал стрижку», «клиент выбрал окрашивание», «клиент выбрал укладку» — это одно событие «нажата кнопка с услугой» с разным содержимым. Схлопните такие строки в одну; правило простое: если реакция бота отличается только подставленным словом, событие одно.
«Я не знаю, чего хочу от бота». Тогда описывать события рано. Возьмите неделю переписок с клиентами и выпишите вопросы, которые повторились больше трёх раз. Бот начинается оттуда, а не с инструмента.
«Мне кажется, моя задача сложнее и в эту схему не влезет». Возможно. Проверить это можно только одним способом — попробовать разложить. Задачи, которые действительно не раскладываются на события, существуют, и в девятой главе мы разберём признаки, по которым видно, что вы упёрлись в потолок. Но упираются в него позже, чем боятся.