Как стать автором
Поиск
Написать публикацию
Обновить

AI-бот для QA-инженеров: как я сделал Telegram-ассистента для ежедневной прокачки

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров2K

Что, если бы кто-то 4 раза в день напоминал тебе важное из мира QA — с примерами, объяснениями и без воды? Я сделал такого помощника.

Привет! Меня зовут Евгений. Я — Full-Stack QA Engineer в Devscribed и сегодня хочу поделиться своим экспериментом QA Mentor Bot — Telegram‑бот, который четыре раза в день отправляет случайный вопрос по тестированию из базы данных и сразу же публикует развёрнутый ответ на него с помощью AI в Telegram‑канале.


Зачем мне понадобился QA Mentor Bot

У этого проекта было две цели:

  1. 🎯 Прокачать свои QA‑навыки.

    Регулярная самоподготовка: в нашей сфере без постоянного развития сложно оставаться эффективным. За день тестировщик может работать в разных направлениях: с мобильным приложением, веб-интерфейсом, API, базой данных и параллельно еще автоматизировать пару тестов. Чтобы не "сбрасывать кэш", мне нужно регулярно подпитывать память свежей информацией.

    Борьба с прокрастинацией: у каждого из нас есть вопросы, которые возникают в ходе работы, не критичные, но расширяющие кругозор, и мы откладываем их "на потом" — и это "потом" часто превращается в "никогда". Бот решает эту проблему: он ежедневно напоминает о теории и практике.

  2. 🧠 Прокачаться в проектировании системы и работе с 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

  1. Инициализация
    При запуске bot.py бот:
    — загружает нужную конфигурацию (prod или test окружение)
    — настраивает логгер
    — создаёт подключения к БД, Telegram API и AI-сервису

  2. База данных

    Структура базы данных в 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‑файла и распределяем их по категориям. Это удобный способ пополнить базу новыми вопросами.

  3. 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 и т.п.


  4. ⏰ Планировщик: автопостинг по расписанию

    Для регулярных публикаций я использовал библиотеку APScheduler — мощный инструмент на Python для запуска задач по расписанию.

    В scheduler.py настраивается:

    • Время публикаций (4 раза в день)

    • Количество повторных попыток при ошибках

    • Интервалы между задачами

    Таким образом, бот полностью автономен: подтягивает новый вопрос и публикует AI-ответ без участия человека.


  5. Что по токенам?

    Вот собственно пример поста, сгенерированный AI.

Использование токенов

В ответе от API AI содержится информация вида:

"usage": {
  "prompt_tokens": 546,
  "completion_tokens": 485,
  "total_tokens": 1031
}
  • 546 токенов — занял вопрос и системная инструкция.

  • 485 токенов — ответ модели.

  • 1031 токен — в сумме.

Думаю, если поэкспериментировать с количеством токенов, то можно добиться оптимального соотношения потребления токенов, качества контента с учетом ограничения по символам в посте Telegram.

Запуск и деплой

  1. Бот запускается в Docker-контейнере при деплое на хостинг. Я использую Railway. Представители Railway — свяжитесь, пожалуйста, со мной. Уже второй раз бесплатно пиарю ваш сервис 🙂

  2. Параметры окружения прописаны в config/prod.py.

    Конечно, хранить параметры окружения, такие как ключи API или настройки подключения к базе данных, прямо в коде — не самый безопасный подход. Это может привести к утечке конфиденциальной информации. Вместо этого, рекомендуется хранить такие параметры в переменных окружения, которые можно настроить на хостинге (например, с помощью .env файла). Однако, для ранних этапов прототипирования, когда проект ещё не требует жесткой безопасности и масштабируемости, такой способ хранения конфигов в коде может подойти для быстрого старта.


Что дальше?

  • Расширить базу вопросов. Приглашаю коллег присылать свои любимые кейсы — будет здорово собрать общую копилку.

  • Добавить реакцию на обратную связь. Чтобы можно было оценивать полезность каждого поста.

  • Улучшить AI‑подсказки. Попробовать разные промпты и модели, чтобы ответы были ещё более подробными и релевантными.

  • Улучшить распознавание разметки. Есть некоторые кейсы в заметки на которые я не прописал правила обработки после получения сырого текста.

Как вам идея?
Становимся лучше каждый день — по чуть-чуть, но стабильно. Заходите на канал AI Mentor for QA и делитесь фидбеком — вместе сделаем этот инструмент ещё лучше для сообщества, если в этом будет польза!

Спасибо за внимание 🙌 и до встречи в канале AI Mentor for QA

Теги:
Хабы:
+1
Комментарии1

Публикации

Ближайшие события