Что, если бы кто-то 4 раза в день напоминал тебе важное из мира QA — с примерами, объяснениями и без воды? Я сделал такого помощника.
Привет! Меня зовут Евгений. Я — Full-Stack QA Engineer в Devscribed и сегодня хочу поделиться своим экспериментом QA Mentor Bot — Telegram‑бот, который четыре раза в день отправляет случайный вопрос по тестированию из базы данных и сразу же публикует развёрнутый ответ на него с помощью AI в Telegram‑канале.
Зачем мне понадобился QA Mentor Bot
У этого проекта было две цели:
🎯 Прокачать свои QA‑навыки.
Регулярная самоподготовка: в нашей сфере без постоянного развития сложно оставаться эффективным. За день тестировщик может работать в разных направлениях: с мобильным приложением, веб-интерфейсом, API, базой данных и параллельно еще автоматизировать пару тестов. Чтобы не "сбрасывать кэш", мне нужно регулярно подпитывать память свежей информацией.
Борьба с прокрастинацией: у каждого из нас есть вопросы, которые возникают в ходе работы, не критичные, но расширяющие кругозор, и мы откладываем их "на потом" — и это "потом" часто превращается в "никогда". Бот решает эту проблему: он ежедневно напоминает о теории и практике.
🧠 Прокачаться в проектировании системы и работе с AI
Пусть Telegram-бот — это не огромная система, но он помогает понять, как устроены реальные проекты: от конфигурации и базы данных до интеграции с API AI. Эти знания можно масштабировать и применять при тестировании сложных систем.
Так и пришло в голову сделать бота на основе искусственного интеллекта, который будет помогать разгребать копящиеся вопросы и поддерживать в целом знания на должном уровне. В итоге получился живой проект — и для себя, и для сообщества.
Архитектура и ключевые компоненты проекта
├── bot.py # Основная логика бота
├── sheduler.py # Настройки расписания публикаций
├── requirements.txt # Зависимости Python
├── Dockerfile # Сборка образа для деплоя в Railway
├── schema.sql # Схема базы данных PostgreSQL
├── import_questions.py # Скрипт импорта вопросов в БД из Excel
├── bot.log # Логи работы бота
├── questions.xlsx # Исходные файлы с вопросами
├── config/ # Конфигурации для разных окружений
│ ├── base.py
│ ├── prod.py
│ └── test.py
└── utils/ # Утилиты: Markdown-фиксер и логгер
├── tg_markdown.py
└── logger.py
Как всё устроено под капотом: архитектура QA Mentor Bot
Инициализация
При запускеbot.py
бот:
— загружает нужную конфигурацию (prod
илиtest
окружение)
— настраивает логгер
— создаёт подключения к БД, Telegram API и AI-сервисуБаза данных
Структура базы данных в PostgreSQL проста и включает таблицы
categories
,questions
,category_usage_cycle
.Таблица
categories
содержит категории вопросовТаблица
category_usage_cycle
— это механизм, который гарантирует равномерное и последовательное использование всех категорий вопросов, чтобы публикации были разнообразными и не повторялись подряд из одной и той же категории.Таблица хранит идентификаторы категорий (
category_id
) и временные метки (cycle_timestamp
), когда категория была выбрана для публикации вопроса.Это позволяет боту выбирать вопросы из всех категорий, пока не будут использованы все доступные категории. Когда все категории использованы, таблица очищается, и цикл начинается заново.
Таблица с вопросами
questions
Атрибут
is_used
получает значениеtrue
как только вопрос был обработан и ответ опубликован в Telegram канале, что позволяет добиваться уникальности контента, не повторяясь, пока весь цикл вопросов не будет закончен.В import_questions.py с помощью
openpyxl
илиpandas
подтягиваем вопросы из Excel‑файла и распределяем их по категориям. Это удобный способ пополнить базу новыми вопросами.AI Service
Самое интересное... В роли «ментора» я использовал DeepSeek API (deepseek-chat
). Боту отправляется вопрос и сгенерированный промпт, а модель возвращает развёрнутый ответ. Для модели я задаю «персонажа» — опытного QA-инженера, который умеет объяснять понятно и по делу 😁Написание промпта — это пространство для экспериментов: даже небольшие изменения могут существенно повлиять на результат. Неудивительно, что на этом фоне появилась отдельная специализация — промпт-инженерия, пусть и временно переоценённая из-за ажиотажа вокруг AI.
Какие бывают роли в промпте?
messages — список сообщений, которые задают контекст для модели:
role — роль отправителя сообщения:
system — позволяет задать контекст запроса и определить поведение модели.
user — предназначена для отправки пользовательских сообщений к модели.
assistant — используется для ответов, которые генерирует модель. При работе в режиме чата ответы модели, помеченные ролью assistant, включаются в состав сообщения для сохранения контекста беседы.
content — текстовое содержание сообщения
Подготовка к постингу
Эта пожалуй, самая сложная часть бота, а именно вывод правильной разметки в Telegram сообщении.Для решения этой задачи у меня используется
tg_markdown.py
— это скрипт для автоматической подготовки и экранирования текстов под строгие требования Telegram MarkdownV2, чтобы ваши сообщения всегда выглядели аккуратно и не вызывали ошибок при публикации.В процессе отладки я постоянно сталкивался с ошибкой:
Can't parse entities: can't find end of the entity starting at character
Причина этому — особенности работы с Markdown в Telegram.🔍 Что такое Markdown и как он работает в Telegram
Markdown — это простой язык разметки, который позволяет форматировать текст с помощью специальных символов:
**жирный**
→ жирный*курсив*
→ курсив
Когда вы отправляете в Telegram текст с
*
,_
,[
,]
и другими спецсимволами, Telegram воспринимает их не как символы, а как команды форматирования.Один и тот же символ может быть и текстом, и командой. Это ломает парсер. И Telegram не пытается "догадаться", что ты имел в виду. Он строго смотрит на каждую строку: если где-то есть
*
,[
,_
и т.д. — он предполагает, что ты хочешь отформатировать, даже если это было просто текстом.✅ Мой подход к решению:
1. Сначала экранируем всё,
2. Потом "восстанавливаем" нужную разметку вручную (по заранее заданным правилам) 🤪AI может:
Поставить * в неожиданных местах
Генерировать разметку с ошибками
Если ты сначала экранируешь всё, ты получаешь безопасную "сырую" версию текста, а потом вставляешь нужные разметки в контролируемых местах.
Преимущества
Плюс
Объяснение
Защищён от ошибок AI
Никакие случайные
*
или_
не сломают сообщениеПолный контроль над форматированием
Вставляешь только то, что хочешь
Нет ошибок Telegram (
Can't parse entities
)Всё экранировано и безопасно по умолчанию
Можно накинуть post-processing шаблон
Например, выделить "Ответ", "Пример", "Шаги" и т.п.
Недостатки
Минус
Объяснение
Потеря "нативной" разметки от AI
Если AI что-то отформатировал — это будет экранировано
Нужно парсить и собирать разметку вручную
Например, для жирных заголовков, списков и ссылок
Требует шаблонизации
Нужен шаблон: где вставлять
*
, где[]()
, гдеcode
и т.п.⏰ Планировщик: автопостинг по расписанию
Для регулярных публикаций я использовал библиотеку APScheduler — мощный инструмент на Python для запуска задач по расписанию.
В
scheduler.py
настраивается:Время публикаций (4 раза в день)
Количество повторных попыток при ошибках
Интервалы между задачами
Таким образом, бот полностью автономен: подтягивает новый вопрос и публикует AI-ответ без участия человека.
Что по токенам?
Вот собственно пример поста, сгенерированный AI.

Использование токенов
В ответе от API AI содержится информация вида:
"usage": {
"prompt_tokens": 546,
"completion_tokens": 485,
"total_tokens": 1031
}
546 токенов — занял вопрос и системная инструкция.
485 токенов — ответ модели.
1031 токен — в сумме.
Думаю, если поэкспериментировать с количеством токенов, то можно добиться оптимального соотношения потребления токенов, качества контента с учетом ограничения по символам в посте Telegram.
Запуск и деплой
Бот запускается в Docker-контейнере при деплое на хостинг. Я использую Railway. Представители Railway — свяжитесь, пожалуйста, со мной. Уже второй раз бесплатно пиарю ваш сервис 🙂
Параметры окружения прописаны в config/prod.py.
Конечно, хранить параметры окружения, такие как ключи API или настройки подключения к базе данных, прямо в коде — не самый безопасный подход. Это может привести к утечке конфиденциальной информации. Вместо этого, рекомендуется хранить такие параметры в переменных окружения, которые можно настроить на хостинге (например, с помощью
.env
файла). Однако, для ранних этапов прототипирования, когда проект ещё не требует жесткой безопасности и масштабируемости, такой способ хранения конфигов в коде может подойти для быстрого старта.
Что дальше?
Расширить базу вопросов. Приглашаю коллег присылать свои любимые кейсы — будет здорово собрать общую копилку.
Добавить реакцию на обратную связь. Чтобы можно было оценивать полезность каждого поста.
Улучшить AI‑подсказки. Попробовать разные промпты и модели, чтобы ответы были ещё более подробными и релевантными.
Улучшить распознавание разметки. Есть некоторые кейсы в заметки на которые я не прописал правила обработки после получения сырого текста.
Как вам идея?
Становимся лучше каждый день — по чуть-чуть, но стабильно. Заходите на канал AI Mentor for QA и делитесь фидбеком — вместе сделаем этот инструмент ещё лучше для сообщества, если в этом будет польза!
Спасибо за внимание 🙌 и до встречи в канале AI Mentor for QA