- BrainTools - https://www.braintools.ru -
Что, если бы кто-то 4 раза в день напоминал тебе важное из мира QA — с примерами, объяснениями и без воды? Я сделал такого помощника.
Привет! Меня зовут Евгений. Я — Full-Stack QA Engineer в Devscribed и сегодня хочу поделиться своим экспериментом QA Mentor Bot — Telegram‑бот, который четыре раза в день отправляет случайный вопрос по тестированию из базы данных и сразу же публикует развёрнутый ответ на него с помощью AI в Telegram‑канале.
У этого проекта было две цели:
🎯 Прокачать свои QA‑навыки.
Регулярная самоподготовка: в нашей сфере без постоянного развития сложно оставаться эффективным. За день тестировщик может работать в разных направлениях: с мобильным приложением, веб-интерфейсом, API, базой данных и параллельно еще автоматизировать пару тестов. Чтобы не “сбрасывать кэш”, мне нужно регулярно подпитывать память [1] свежей информацией.
Борьба с прокрастинацией: у каждого из нас есть вопросы, которые возникают в ходе работы, не критичные, но расширяющие кругозор, и мы откладываем их “на потом” — и это “потом” часто превращается в “никогда”. Бот решает эту проблему: он ежедневно напоминает о теории и практике.
🧠 Прокачаться в проектировании системы и работе с AI
Пусть Telegram-бот — это не огромная система, но он помогает понять, как устроены реальные проекты: от конфигурации и базы данных до интеграции с API AI. Эти знания можно масштабировать и применять при тестировании сложных систем.
Так и пришло в голову сделать бота на основе искусственного интеллекта [2], который будет помогать разгребать копящиеся вопросы и поддерживать в целом знания на должном уровне. В итоге получился живой проект — и для себя, и для сообщества.
├── 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
Инициализация
При запуске bot.py [3] бот:
— загружает нужную конфигурацию (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 — позволяет задать контекст запроса и определить поведение [4] модели.
user — предназначена для отправки пользовательских сообщений к модели.
assistant — используется для ответов, которые генерирует модель. При работе в режиме чата ответы модели, помеченные ролью assistant, включаются в состав сообщения для сохранения контекста беседы.
content — текстовое содержание сообщения
Подготовка к постингу
Эта пожалуй, самая сложная часть бота, а именно вывод правильной разметки в Telegram сообщении.
Для решения этой задачи у меня используется tg_markdown.py — это скрипт для автоматической подготовки и экранирования текстов под строгие требования Telegram MarkdownV2, чтобы ваши сообщения всегда выглядели аккуратно и не вызывали ошибок при публикации.
В процессе отладки я постоянно сталкивался с ошибкой [5]:
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 ( |
Всё экранировано и безопасно по умолчанию |
|
Можно накинуть post-processing шаблон |
Например, выделить “Ответ”, “Пример”, “Шаги” и т.п. |
Недостатки
|
Минус |
Объяснение |
|---|---|
|
Потеря “нативной” разметки от AI |
Если AI что-то отформатировал — это будет экранировано |
|
Нужно парсить и собирать разметку вручную |
Например, для жирных заголовков, списков и ссылок |
|
Требует шаблонизации |
Нужен шаблон: где вставлять |
⏰ Планировщик: автопостинг по расписанию
Для регулярных публикаций я использовал библиотеку APScheduler — мощный инструмент на Python для запуска задач по расписанию.
В scheduler.py [6] настраивается:
Время публикаций (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 файла). Однако, для ранних этапов прототипирования, когда проект ещё не требует жесткой безопасности и масштабируемости, такой способ хранения конфигов в коде может подойти для быстрого старта.
Расширить базу вопросов. Приглашаю коллег присылать свои любимые кейсы — будет здорово собрать общую копилку.
Добавить реакцию [7] на обратную связь. Чтобы можно было оценивать полезность каждого поста.
Улучшить AI‑подсказки. Попробовать разные промпты и модели, чтобы ответы были ещё более подробными и релевантными.
Улучшить распознавание разметки. Есть некоторые кейсы в заметки на которые я не прописал правила обработки после получения сырого текста.
Как вам идея?
Становимся лучше каждый день — по чуть-чуть, но стабильно. Заходите на канал AI Mentor for QA и делитесь фидбеком — вместе сделаем этот инструмент ещё лучше для сообщества, если в этом будет польза!
Спасибо за внимание [8] 🙌 и до встречи в канале AI Mentor for QA [9]
Автор: epavlovich29
Источник [10]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/17514
URLs in this post:
[1] память: http://www.braintools.ru/article/4140
[2] интеллекта: http://www.braintools.ru/article/7605
[3] bot.py: http://bot.py
[4] поведение: http://www.braintools.ru/article/9372
[5] ошибкой: http://www.braintools.ru/article/4192
[6] scheduler.py: http://scheduler.py
[7] реакцию: http://www.braintools.ru/article/1549
[8] внимание: http://www.braintools.ru/article/7595
[9] AI Mentor for QA: https://t.me/qa_mentor_ai
[10] Источник: https://habr.com/ru/articles/927708/?utm_source=habrahabr&utm_medium=rss&utm_campaign=927708
Нажмите здесь для печати.