Обновлено @June 27, 2024 10:54 AM (GMT+1)
Краткое описание
- Краткое описание
- ➕ Преимущества
- ➖ Недостатки
- Подробное описание
- Базовые сведения
- Бот Дюся и его семья
- Как общаться с ботом?
- Общая конфигурация
- Аватары
- Настройки бота
- Приветствие
- Режим вызова бота (триггер)
- Как отвечать, если ответ не найден
- Удалять ли сообщение, на которое среагировал бот
- Статистика
- Конфигурация вкладок Google Sheet, с которых бот читает данные ответов
- Команды
- Как создать экземпляр бота для своего города?
- Авторство и обратная связь
- См. также
- Ответственный за страницу
➕ Преимущества
- Пользователи могут получить быстрый ответ сами (через вопрос боту), не вовлекая других участников.
- Желающие помочь могут быстро активизировать нужный ответ бота, даже если сами не знают деталей темы.
- Эксперты могут предоставлять продуманные ответы на стандартные поисковые запросы.
- Ответы даются в привычной среде группы Телеграм (не нужно переходить на веб-сайт).
- Все члены семьи ботов пользуются общими экспертными знаниями (общая часть конфигурации) и общим исходным кодом (не нужен отдельный программист в каждом городе).
- Очень просто обучать бота (таблица с ключевыми словами).
- Во всех ботов также встроен поиск чатов и страниц этой вики по ключевым словам.
➖ Недостатки
- Алгоритм поиска очень простой, поэтому возможны неверные ответы (когда ключевое слово случайно содержится в поисковом запросе)
- Все знания бота эксперты должны заносить вручную и поддерживать со временем.
- Пока нет удобного процесса обратной связи, собирающего запросы, оставшиеся без ответа по частотности (хотя можно видеть последние запросы без ответа по специальной команде)
- База знаний бота не связана напрямую с основной вики, так что любые знания надо заносить и в вики, и в таблицу бота.
- Единственный налаженный импорт данных — импорт немецких чатов на страницу Список чатов и групп по городам и землям Германии выполняется автоматически из конфига бота, а не заносится на страницу вручную.
Подробное описание
Базовые сведения
Бот не использует ни искусственный интеллект, ни полнотекстовый поиск. Он опирается на таблицу в Google Sheets, где в одной колонке перечислены ключевые словоформы (через запятую), а в другой — ответ.
Бот реагирует на любое сообщение, начинающееся с его имени (или, по настройке, включающее его имя). В тексте сообщения бот ищет каждое из ключевых слов из каждой строки конфигурационной таблицы (просто по совпадению, прописные или строчные буквы — не имеет значения). Из всех строк, в которых найдены совпадения, извлекается ответ. Все ответы выдаются пользователю один за другим.
Поскольку бот не ограничивает формат запросов, иногда может создаваться ощущение, что он «понимает» вопрос.
Бот Дюся и его семья
Бот предназначен для работы в региональных группах взаимопомощи в Телеграм. А в каждой группе накоплены свои знания, поэтому бот должен знать «местную специфику». С другой стороны, все группы объединены общей целью помощи украинским беженцам, значит, есть знания, общие для всех городов.
Решение это дилеммы — семья ботов. На базе одного и того же исходного кода запускаются отдельные экземпляры (инстансы) бота. Все экземпляры используют общую конфгиурацию, плюс каждый экземпляр имеет свою индивидуальную конфигурацию. Сначала ответ ищется в индивиуальной конфигурации, и только если не найден — в общей.
Первый член семьи был назван Дюся, так как разработан в Дюссельдорфе и обучен местной специфике. На сегодня (29.12.2022) имеются такие члены семьи:
Имя | Ник | Город | Ответственный |
Дюся | @dv_wiki_bot
Бэкап: @dv_2_wiki_bot | Düsseldorf | |
Нюся | Nürnberg | ||
Ника | Köln | ||
Ганс | Общенемецкий бот | ||
Нана | Hannover | ||
Дуся | Duisburg | ||
Ася | Augsburg | ||
Боря | Paderborn | ||
Есения | Essen | ||
Люба | Lübeck | ||
Людвиг | Ludwigsburg | ||
Маня | Mannheim | ||
Мюля | Mülheim-an-der-Ruhr | ||
Отто | Magdeburg | ||
Потбот | Potsdam | ||
Тёма | Trier | ||
Штуся | Stuttgart | ||
Хайди | Heidelberg | ||
Ясь | Общенемецкий, беларуские чаты | ||
Ося | Особые люди |
Как общаться с ботом?
Зная имя бота (см. выше), можно говорить с ним в личных сообщениях.
работа
вместо Дюся, работа
.Также можно добавить бота в группу, где любой участник может задать вопрос боту, называя его по имени. Тогда и другие участники видят ответ.
Так, эксперт, видя в группе вопрос, ответ на который уже известен, может публично задать вопрос боту, вместо того, чтобы прямо отвечать на вопрос. У этого подхода есть несколько преимуществ:
- Ответ развернут и стандартизован (при условии, что была проделана работа по обучению бота).
- Спросивший видит, как он сам мог бы получить ответ, и возможно, последует этому совету в будущем.
- Все другие пользователи в группе видят, как был дан ответ, и тоже понимают, как пользоваться ботом.
У бота есть ряд настроек, позволяющий уточнить его поведение, когда он отвечает в группе.
Общая конфигурация
Общая конфигурация для всех членов семейства поддерживается инициативой uahelp.wiki и включает в себя:
- Список региональных групп (в основном Телеграм, но также в базу внесены несколько WhatsApp-групп).
- Содержание вики uahelp.wiki (по общим темам).
Если вы хотите участвовать в поддержке этих ресурсов, обращайтесь в чат https://t.me/wiki_ukraine_links_chat.
Аватары
Настройки бота
Следующие настройки могут быть заданы для каждого члена семьи ботов индивидуально:
Приветствие
Setting: StartMessage
Приветствие бота, если начать задавать ему вопросы в личных сообщениях. Например:
Режим вызова бота (триггер)
Setting: BotTriggerMode
Варианты настройки «триггера» бота являются взаимоисключающими, то есть можно выбрать только один из этих вариантов. Почему это важно?
FULL_WORD
— Вызов бота триггерит только сообщение, в котором имя бота указано как отдельное слово (так работает бот Нана).
Если имя вашего бота может содержаться в разных других словах, стоит выбрать настройку FULL_WORD
. Иначе бот с именем «Ника» ответит и на слово «клубника», и на слово «никакой».
STRING_START
— Вызов бота триггерит только сообщение, которое начинается с имени бота (так работает бот Нюся).
Если вам важно мочь упоминать имя бота в текстах сообщений, но чтобы он при этом на них не реагировал, то стоит выбрать настройку STRING_STARТ
, и тогда он не будет реагировать на сообщения вида «что-то Ника сегодня плохо себя ведет», где его имя не стоит в начале сообщения.
ANY_SUBSTRING
— Вызов бота триггерит любая подстрока с его именем.
А настройка ANY_SUBSTRING
подойдет только в случае, когда вам нужно, чтобы бот реагировал на упоминание его имени в любом месте текста сообщения, но при этом имя вашего бота не будет внезапно «всплывать» в не относящихся к делу словах. Например, «Гансу» она подойдет хорошо, а вот «Нике» — плохо.
Как отвечать, если ответ не найден
Setting: ReplyWhenNoAnswer
Setting: NoAnswerReply
Должен ли бот отвечать сообщением на запрос, по которому ничего не нашлось. Если да, то текст такого ответа можно настроить. Если нет, бот промолчит, если он не нашёл ответа.
Удалять ли сообщение, на которое среагировал бот
Setting: DeleteBotCallMessageOnMessageReply
Нужно ли удалять сообщение, на которое среагировал бот.
- Вариант, когда удаление сообщения невыгодно администраторам чата, хорошо описан в разделе Как общаться с ботом.
- Но возможен и вариант использования бота только администраторами, без попыток публичного обучения участников чата. В таком случае, можно включить эту настройку, чтоб оставлять меньше следов в чате.
- ❗Удаляться сообщение вызова бота будет только в том случае, если это сообщение вызова бота было ответом на другое сообщение.
Статистика
Чтобы сделать бота более полезным, нужно знать, о чём и сколько его спрашивают.
Во время работы бот накапливает статистику обращений. Она доступна по специальным командам (см. техническую документацию бота).
Чтобы статистика, хранимая в памяти, не терялась, перед перезапусками ботов мы сохраняем данные запросов в файл. Эти файлы публикуются сюда: успешные запросы и неуспешные запросы.
Ответственным за ботов рекомендуется периодически разбирать эти данные, чтобы пополнять конфигурацию бота.
Конфигурация вкладок Google Sheet, с которых бот читает данные ответов
Для того, чтобы гибко настраивать включаемые/выключаемые ответы бота, вкладки гугл-документа, с которых бот берёт ключевые слова и ответы на них, можно конфигурировать в общем виде.
Пример типичного конфига вкладок:
{
"commandTabs": [
{
"tabName": "Список болталки",
"tabFormat": "COMMANDS",
"tabType": "COMMANDS",
"showHeader": false,
"header": "Ответы бота",
"bullet": "—"
},
{
"tabName": "Общая болталка",
"tabFormat": "COMMANDS",
"tabType": "COMMANDS",
"showHeader": false,
"header": "Общие ответы всех ботов",
"bullet": "—"
}
],
"dataTabs": [
{
"tabName": "Страницы вики и ключевые слова",
"tabFormat": "WIKI_PAGES",
"tabType": "WIKI_PAGES",
"showHeader": true,
"header": "\uD83D\uDCC1 Страницы вики"
},
{
"tabName": "UAhelp.YouTube",
"tabFormat": "COMMANDS",
"tabType": "YOUTUBE_VIDEOS",
"showHeader": true,
"header": "\uD83C\uDFAC Видео UAhelp"
},
{
"tabName": "Список чатов по городам",
"tabFormat": "CHATS",
"tabType": "CITY_CHATS",
"showHeader": true,
"header": "\uD83C\uDDE9\uD83C\uDDEA Чаты по городам Германии"
},
{
"tabName": "Список чатов по странам",
"tabFormat": "CHATS",
"tabType": "COUNTRY_CHATS",
"showHeader": true,
"header": "\uD83C\uDF0E Чаты по странам"
}
]
}
Каждая вкладка конфигурируется следующими полями:
tabName
— Название вкладки в Google Sheet.tabFormat
— Формат данных на вкладке в Google Sheet. Одно из следующих значений:WIKI_PAGES
— 3 столбца: имя страницы, адрес страницы, ключевые слова.CHATS
— Много столбцов: имя чата, ключевые слова, произвольное число столбцов с чатами (каждое значение в стоблце чата должно содержать ссылку на чат, разделитель—
и имя чата).COMMANDS
— 2 столбца: ответ, ключевые слова.tabType
— Тип данных на вкладке.showHeader
— Показывать ли для вкладки заголовок перед списком ответом с этой вкладки (если ответы найдены).header
— Заголовок перед списком ответов, найденных на вкладке (если найден хотя бы один ответ). Настройка будет использоваться в ответе бота из вкладки, только если для этой вкладкиshowHeader == true
. В значенииheader
можно для графической наглядности ответа использовать эмоджи.bullet
— Если в ответах из вкладки будет использование форматирование в виде списка, то этот символ будет использоваться в качестве буллета этого списка.
Сами вкладки делятся на:
- Вкладки команд —
commandTabs
. - Вкладки данных —
dataTabs
.
Внутри массивов commandTabs
и dataTabs
вкладки в json-конфиге можно переупорядочивать, что влияет на их приоритет (для commandTabs
) и порядок выдачи (для dataTabs
).
Логика выдачи ответа:
- В пределах любой вкладки будут выданы все ответы, найденные на этой владке.
- Ищутся ответы во вкладках команд, в порядке их объявления в
commandTabs
. - Если ответ найден на вкладке, он возвращается в ответе бота.
- То есть, если ответ нашёлся на вкладке
commandTabs[0]
, то на вкладкахcommandTabs[1]
,commandTabs[2]
и т.д. поиск выполняться уже не будет. - Таким образом, можно перегружать ответы с одним и тем же словом на вкладке, расположенной ниже в
commandTabs
. - Если ответы во вкладках команд не найдены — ищутся ответы во вкладках данных, в порядке их объявления в
dataTabs
. - Если ответ найден на вкладке, он добавляется в список ответов.
- То есть, если ответ найден на вкладке
dataTabs[0]
, то продолжается поиск на вкладкеdataTabs[1]
, потомdataTabs[2]
и так далее. - Таким образом, можно переупорядочивать найденные ответы между вкладками данных, меняя их порядок в массиве
dataTabs
. - Если хотя бы один ответ найден, то собранные ответы со всех вкладок в
dataTabs
выдаются в ответном сообщении бота. - Если ответ по-прежнему не найден, выдаётся сообщение о том, что ответ не найден, согласно настройкам
ReplyWhenNoAnswer
иNoAnswerReply
.
Команды
Бот поддерживает следующие команды:
Команда | Назначение |
/listCommands | Список поддерживаемых команд |
/helpCommand <commandName> | Описание конкретной команды (название команды включая слэш, например /helpCommand , /start ) |
/start | Приветственное сообщение бота. Можно не указывать имя бота, т.е. просто /start . |
/getEnvironment | Детали окружения конкретного экземпляра бота |
/gs-reload-5150 | Перезагрузить конфигурационные таблицы из Google Sheet в кэш в памяти |
/listSettings | Список всех настроек и их текущих значений |
/helpSetting <settingName> | Описание конкретной настройки |
/getSetting <settingName> | Текущее значение конкретной настройки |
/setSetting <settingName> <settingValue> | Установить новое значение конкретной настройки.
⚠️ Значение устанавливается только в памяти, и перезаписывается при новом старте бота. Чтобы сделать изменение постоянным, необходимо изменить стартовую конфигурацию в файле, см. Как создать экземпляр бота для своего города? Лучше всего сообщить об этом в чат фидбэка по боту. |
/getTabConfigs | Получить конфигурацию вкладок Google Sheet для данного бота. |
/setTabConfigs <tabConfigsJson> | Установить конфигурацию вкладок Google Sheet для данного бота. Конфиг задаётся как строка в формате JSON, см. соответствующий раздел этой страницы. |
/getStats | Статистика обращений к боту с момента последнего старта (количество запросов, успешных, неуспешных, команд, всего). |
/getSuccessfulRequests | Список запросов, на которые бот смог найти ответ (см. также Статистика) с момента последнего старта или последней очистки списка. |
/clearSuccessfulRequests | Очистить список запросов, на который бот смог найти ответ (в памяти). |
/getFailedRequests | Список запросов, на которые бот не смог найти ответа (см. также Статистика) с момента последнего старта или последней очистки списка. |
/clearFailedRequests | Очистить список запросов, на который бот не смог найти ответа (в памяти). |
/listAdmins | Перечислить админов бота, которые могут запускать специальные команды (будет выведен список их ТГ-юзернеймов). |
/allBotsList | Вывести список всех ботов, запущенных в данном окружении. |
/allBotsReloadConfigs | Перезагрузить конфиги всех ботов. Имеет смысл запускать эту команду, если сделано критическое исправление на вкладках с вики-страницами и общенемецкими чатами. |
/allBotsGetTabConfigs | Получить конфигурации вкладок всех ботов. |
/allBotsGetStats | Получить общую статистику для всех ботов. Статистику из этой команды перед рестартом ботов нужно сохранить в ГитХаб.
Ответ может быть разбит на много сообщений. |
/allBotsGetFailedRequests | Получить список неудачных запросов для всех ботов. Статистику из этой команды перед рестартом ботов нужно сохранить в ГитХаб.
Ответ может быть разбит на много сообщений. |
/getChatInfo | Вывести информацию о чате, в котором написано сообщение боту. |
/getUserInfo | Вывести информацию о пользователе, который написал соощение боту. |
/start
) только от сконфигурированных администраторов.Дюся /listSettings
/start
нужно писать вместе с именем бота:
/listSettings
— не вызовет никакой реакции от бота
Дюся /listSettings
— вызовет команду ботаКак создать экземпляр бота для своего города?
Это очень легко!
Вам понадобится:
- Имя бота (ориентируйтесь на уже имеющихся членов семьи и на название вашего города)
- Пол бота (чтобы проставить боту соответствующий аватар)
- Пожелания к настройкам бота (о них мы уже рассказали)
- Список администраторов для бота — тех пользователей Телеграм, от кого он должен выполнять команды (админы должны иметь имя пользователя (username) в Телеграме).
- Конфигурационная таблица с вашими ключевыми словами и ответами (можете начать делать ее заранее).
- E-mail людей, которые будут обновлять вашу конфигурационную таблицу (e-mail должен быть привязан к Гугл-аккаунту).
Обратитесь к @dmitry_weirdo, вам предоставят доступ к Google Sheets для размещения вашей таблицы и запустят ваш экземпляр бота, привязанный к вашей таблице.
Авторство и обратная связь
Бот @dv_wiki_bot разработан группой Digital Volunteers по модели open source.
Автор: @dmitry_weirdo
Исходники: https://github.com/dmitry-weirdo/wiki-telegram-bot
Feedback: https://t.me/dv_wiki_bot_feedback
Feedback по конкретным членам семьи ботов направляйте контактам указанным в таблице выше.
Все экземпляры бота запущены в AWS на EC2.
См. также
Региональная группа взаимопомощи в ТелеграмДругие используемые Телеграм-ботыБот-привратник ShieldyОтветственный за страницу
@Grigory Grin и @Dmitry Popov