Go2Study Bot — это Telegram-бот для изучения математики, построенный на базе адаптивной системы обучения. Бот предоставляет персонализированные тесты, отслеживает прогресс пользователя и помогает закреплять слабые места в знаниях.
- 🎯 Адаптивное тестирование: Фокус на темах, где пользователь совершает ошибки.
- 📊 Аналитика прогресса: Подробная статистика для отслеживания обучения.
- 🔄 Работа над ошибками: Механизмы для повторения и закрепления материала.
- 👥 Система администрирования: Управление пользователями, темами и вопросами.
- 🌐 Многоязычность: Поддержка русского и казахского языков.
- 🤖 AI-генерация: Автоматическое создание вопросов и объяснений с помощью AI.
- 💡 Оптимизация UI: Ключевые сообщения (например, "Мой прогресс", "Панель администратора", "Помощь") теперь не дублируются в чате, а заменяют собой предыдущее аналогичное сообщение. Это делает интерфейс чище и удобнее. Для этого была добавлена таблица
managed_messagesи сервисMessageManager.
Проект имеет модульную структуру с четким разделением ответственности:
main.py: Главный файл для запуска бота.src/handlers/: Обработчики команд, колбэков и сообщений от пользователя.src/services/: Основная бизнес-логика (работа с БД, AI, генерация тестов).src/db/: Управление подключением к базе данных, модели и репозитории.src/config/: Константы и конфигурационные файлы.src/utils/: Вспомогательные функции (например, создание клавиатур).
Проект готов к развертыванию на облачных платформах, таких как Railway.
Основные шаги:
- Клонировать репозиторий.
- Создать
.envфайл на основе.env.exampleи заполнить его своими данными (токен бота, API-ключ для AI, данные для подключения к PostgreSQL). - Использовать Dockerfile: Проект содержит готовый
Dockerfileдля сборки и запуска в контейнере. - Настроить платформу: На Railway достаточно подключить репозиторий и указать команду запуска. Все необходимые зависимости будут установлены из
requirements.txt.
- Улучшение .gitignore (16.09.2025):
- Проблема: Директория
question_images/, содержащая изображения для вопросов, не была добавлена в.gitignore, что могло привести к раздуванию репозитория. - Решение: Директория
question_images/была добавлена в.gitignoreдля исключения медиафайлов из системы контроля версий. Также были добавлены распространенные расширения для баз данных SQLite (*.sqlite3,*.db3) в качестве превентивной меры. - Результат: Репозиторий защищен от случайного добавления изображений и временных файлов баз данных, что обеспечивает его чистоту и оптимальный размер.
- Проблема: Директория
- Исправлено усечение объяснений (12.07.2024):
- Проблема: Длинные и правильно отформатированные объяснения, хранящиеся в базе данных, обрезались до одной строки при отображении пользователю.
- Решение: Убрана избыточная функция очистки
_clean_explanation_text, которая ошибочно применялась к текстам из базы данных. Эта функция была предназначена только для первоначальной обработки ответов от AI и некорректно удаляла форматирование (например, строки, начинающиеся с "Шаг..."). - Результат: Теперь все объяснения из базы данных отображаются в полном объеме, без искажений.
- Добавлена недостающая зависимость: В
requirements.txtдобавлен пакетsqlalchemy, чтобы устранить ошибкуModuleNotFoundErrorпри запуске приложения. - Исправление ошибки совместимости с Python 3.9: Устранена ошибка
TypeErrorпри запуске приложения в Docker-контейнере с Python 3.9. Ошибка была вызвана использованием нового синтаксиса для аннотаций типов (|), который не поддерживается в данной версии. Все вхожденияdict | Noneбыли заменены наOptional[dict]для обеспечения обратной совместимости. - Переход на
ImprovedAIService: Вся система переведена на использование нового, улучшенного сервисаImprovedAIServiceдля генерации AI-контента. Это потребовало рефакторингаmain.py, всех обработчиков в админ-панели и сервисаPDFProcessorдля корректной передачи зависимостей. - Созданы тесты для AI-сервиса: Написаны модульные тесты для
ImprovedAIService, которые проверяют корректность парсинга ответов от AI для русского и казахского языков, а также обработку некорректных ответов. - Реализован менеджер сообщений: Создан механизм для управления ключевыми сообщениями, чтобы они существовали в единственном экземпляре. Это исправляет дублирование UI-элементов и улучшает UX.
- Рефакторинг слоя доступа к данным: Проведена унификация работы с базой данных. Все репозитории теперь используют единый базовый класс и менеджер соединений.
- Исправлена логика для администраторов:
- Администраторы теперь могут использовать функцию "Пройти снова тест". Их ошибки корректно загружаются, но не влияют на общую статистику студентов.
- Исправлена неработающая кнопка "Удалить админа" путем добавления недостающих обработчиков в
main.py.
- Добавлена возможность создания суперадмина: Реализован SQL-запрос для ручного добавления суперадминистратора в базу данных.
- Удалена старая ветка: Очищена история Git путем удаления неактуальной ветки
feature/supabase-migration. - Commit 7 (Date): Improved the duplicate question detection mechanism by replacing the simple keyword-based search with a more robust fuzzy search using
pg_trgm'ssimilarityfunction. The threshold is set to 60%, which prevents adding obvious duplicates while allowing for slight variations in questions. - Commit 6 (Date): Fixed API rate-limiting issue during batch question generation by adding a one-second delay between concurrent requests. This prevents the system from exceeding the API's requests-per-minute quota when creating multiple questions for a new topic.
- Commit 5 (Date): Solved a critical bug where the question generation process would fail due to API rate limiting (429 errors). Implemented a robust retry mechanism with exponential backoff in the AI service. This prevents system failure when the request limit is exceeded by intelligently re-spacing the API calls.
- Commit 4 (Date): Fixed a bug where the test generation system would create tests with fewer questions than intended. The root cause was the use of non-unique "ghost" questions. The fix ensures that duplicate questions are correctly identified and skipped during generation. Also added a
languageparameter to theget_question_by_idfunction.
- Успешный деплой на Railway: Проект был успешно развернут на платформе Railway с использованием PostgreSQL в качестве базы данных.
- Исправлена логика тестов: Устранены ошибки в SQL-запросах, что позволило корректно загружать существующие вопросы из базы данных вместо постоянной генерации новых.
- Рефакторинг и стабилизация:
- Проведен рефакторинг
main.pyдля упрощения регистрации обработчиков. - Улучшена логика автоудаления сообщений: теперь она срабатывает только во время тестов.
- Исправлены многочисленные ошибки, связанные с обработкой данных пользователя, управлением темами и разделами в админ-панели.
- Проведен рефакторинг
- Миграция на PostgreSQL: Проект успешно переведен с SQLite на Neon/Supabase PostgreSQL.
- Оптимизация работы с БД: Внедрен механизм "умного" пинга базы данных для экономии ресурсов на бесплатных тарифах.
- Улучшение качества AI-контента: Улучшены промпты для генерации более качественных и разнообразных вопросов с подробными объяснениями, а также внедрена система дедупликации.
- Очистка проекта: Удалены устаревшие скрипты, тестовые файлы и документация.
- Фундаментальные работы: Создана базовая архитектура, система моделей БД, основные обработчики и сервисы.
- Beksultan
Дата: 2024-07-11
Анализ логов ai_responses.log показал, что AI часто генерировал несколько вопросов в одном ответе и не всегда придерживался заданной темы. Это приводило к большому количеству отклоненных (REJECTED) запросов и неэффективному использованию API.
-
Рефакторинг AI Service:
- В
src/services/ai_service_improved.pyбыл внедрен новый, универсальный методgenerate_task. - Этот метод использует строго структурированный промпт с уникальными маркерами (
[QUESTION],[CORRECT_ANSWER]и т.д.) для повышения надежности парсинга. - Старые, экспериментальные методы (
v2,v3,v4) и их вспомогательные функции были удалены для упрощения кодовой базы.
- В
-
Обновление логики вызова:
- В
src/services/question_service.pyбыла обновлена логика вызова AI. Теперь она всегда использует новый, надежный методgenerate_task.
- В
-
Повышение качества: AI теперь генерирует более релевантные и качественные вопросы, строго по одной теме за раз.
-
Надежность: Новый парсер, основанный на маркерах, работает значительно надежнее, чем старый на регулярных выражениях.
-
Упрощение кода: Кодовая база стала чище и проще в поддержке.
-
Commit 8 (2025-07-10): Исправлена критическая ошибка
AttributeErrorвQuestionService, которая возникала из-за вызова удаленного методаgenerate_task_v3. Вызов был заменен на актуальный методgenerate_task, что восстановило функциональность генерации AI-вопросов. -
Commit 9 (2025-07-10): Внедрен механизм повторных попыток с экспоненциальной задержкой в
AIServiceдля обработки ошибок429 (Rate Limit Exceeded). Это повышает надежность генерации вопросов, позволяя системе автоматически восстанавливаться после временных ограничений API. -
Commit 10 (2025-07-10): Улучшен парсер ответов AI в
AIService. Добавлена очистка поляcorrect_answerот случайных символов (например,*,-), что повышает устойчивость к ошибкам форматирования и увеличивает количество успешно разобранных вопросов. -
Commit 11 (2025-07-10): Улучшен парсер ответов AI в
AIServiceдля обработки некорректного форматирования. Теперь парсер удаляет символы-маркеры (*) и обрабатывает многострочные ответы, повышая надежность и чистоту генерируемых данных.
-
Commit 12 (2025-07-11): Проект был возвращен к состоянию коммита
c09453773dc1bccab681595443c2a2ab2afe318f. Это решение было принято для отката ряда последовательных изменений, которые привели к полной блокировке API и остановке генерации вопросов. Возврат к предыдущей стабильной версии позволяет восстановить базовую функциональность, несмотря на отказ от недавних улучшений в механизме валидации. -
Commit 13 (2025-07-11): Исправлена критическая проблема с блокировкой API (
Rate Limit Exceeded) путем внедренияasyncio.Semaphore(2)вQuestionService. Это ограничивает количество одновременных запросов к AI до двух, предотвращая массовую отправку запросов, которая приводила к ошибкам. Блокирующие вызовы AI теперь выполняются в отдельных потоках с помощьюasyncio.to_threadдля предотвращения заморозки приложения. -
Commit 14 (2025-07-11): Оптимизирован расход дневного лимита API. Логика генерации вопросов в
QuestionServiceизменена так, чтобы создавать ровно необходимое количество запросов, а не избыточное. Это предотвращает быстрое исчерпание дневной квоты (200 запросов/день) и повышает стабильность работы бота. -
Commit 15 (2025-07-11): Упрощена валидация AI-вопросов в
QuestionService. Была удалена избыточная и слишком строгая проверка на соответствие ответа и объяснения (_validate_answer_explanation_consistency), которая отбраковывала валидные вопросы. Это повысит процент успешно сгенерированных заданий. -
Commit 16 (2025-07-11):
- Ускорение генерации: В связи с переходом на платный API-тариф, количество одновременных запросов к AI в
QuestionServiceувеличено до 10, что значительно повышает скорость создания тестов. - Исправлен баг с вариантами: В
ImprovedAIServiceулучшен парсер для фильтрации "мусорных" вариантов ответа (например, состоящих из одной точки), которые иногда генерировал AI.
- Ускорение генерации: В связи с переходом на платный API-тариф, количество одновременных запросов к AI в
-
Commit 17 (2025-07-11): Исправлена ошибка в
_clean_explanation_text, из-за которой отбраковывались валидные объяснения от AI, содержащие списки. Это приводило к генерации меньшего количества вопросов, чем требовалось. Теперь парсер корректно обрабатывает такие объяснения, что повышает стабильность и надежность генерации тестов. -
Commit 18 (2025-07-11): Глобальное улучшение стабильности и качества генерации тестов.
- Гарантированная генерация: Логика генерации вопросов в
QuestionServiceполностью переработана. Теперь система настойчиво запрашивает вопросы у AI до тех пор, пока не наберет ровно 10 валидных. - Улучшенная генерация вариантов: Система больше не добавляет фиктивные варианты. Вместо этого она подбирает релевантные неправильные ответы из базы данных, что значительно повышает качество вариантов.
- Повышение разнообразия вопросов: В промпт для AI добавлено требование избегать повторяющихся сценариев и персонажей для создания более интересных тестов.
- Детальное логирование: Улучшена диагностика ошибок парсинга для быстрого выявления проблем в будущем.
- Гарантированная генерация: Логика генерации вопросов в
-
Commit 19 (2025-07-11): Исправлена критическая ошибка и улучшена логика обработки ответов.
- Восстановлена умная генерация вариантов: Добавлен недостающий метод
get_similar_incorrect_optionsв слой доступа к данным, что позволило включить механизм подбора релевантных неправильных ответов из базы. - Смягчена очистка вариантов: Ослаблена логика очистки в
_clean_option_text, чтобы предотвратить удаление валидных вариантов ответа (например, "Невозможно определить"), что повысило процент успешно принимаемых AI-вопросов.
- Восстановлена умная генерация вариантов: Добавлен недостающий метод
- Исправлена критическая ошибка SQL: Устранена ошибка
for SELECT DISTINCT, ORDER BY expressions must appear in select listвget_similar_incorrect_options, которая возникала при попытке сгенерировать дополнительные варианты ответов. - Улучшена логика парсинга: Модифицирован парсер ответов AI для корректной обработки коротких (в том числе односимвольных) вариантов ответа, что предотвращает отбраковку валидных числовых ответов.
- Усилен промпт для AI: В промпт добавлена более общая инструкция, требующая от AI проявлять креативность и не повторять одних и тех же персонажей или сценарии в нескольких вопросах подряд. Это решает проблему генерации однотипных задач.
- Внедрен "умный" промпт: Вместо общих просьб о креативности реализован новый, продвинутый промпт, в котором AI дается роль "опытного методиста".
- Управление разнообразием через
task_type: Добавлен новый параметрtask_type("жизненная ситуация", "числовая прямая" и т.д.), который позволяет напрямую управлять типом создаваемой задачи, гарантируя их структурное разнообразие. - Улучшенные творческие ограничения: В промпт добавлены более конкретные примеры желаемых сюжетов (космос, роботы) и негативные ограничения (запрет на "Петю и Васю"), что стимулирует AI создавать более интересный контент.
- Внедрена самопроверка (self-verification): В промпт добавлено критически важное правило, требующее от AI перед генерацией ответа проверять, что итоговый результат в пошаговом объяснении точно совпадает со значением в поле
[CORRECT_ANSWER]. Это предотвращает "галлюцинации" и внутренние противоречия в ответах. - Ограничение на краткость объяснений: Добавлена инструкция, требующая создавать объяснения не более чем в 2-4 шага. Это защищает от слишком длинных, бессвязных ответов, которые могут возникать, когда AI "зацикливается" на сложной задаче.
- Повышен порог схожести (similarity): Порог для нечеткого поиска дубликатов при загрузке вопросов из PDF увеличен с
0.7до0.85. Это делает проверку более строгой и предотвращает ложные срабатывания, когда система ошибочно помечала уникальные, но похожие по структуре вопросы как дубликаты.
Проблема: При загрузке PDF с большим количеством структурно похожих вопросов (например, "Вычислите: ..."), система нечеткого поиска (fuzzy search) ошибочно помечала их как дубликаты, даже если они были уникальными. В результате из 36 вопросов в базу добавлялось только 19.
Решение:
- Внедрение флага
exact_only: В основной метод проверки дубликатовget_explanation_by_question_textбыл добавлен флагexact_only. Если он установлен вTrue, выполняется только строгая проверка на 100% совпадение текста вопроса, полностью отключая нечеткий поиск. - Сквозная передача флага: Вся цепочка вызовов при обработке PDF, начиная от
QuestionsHandlerв админ-панели, черезPDFProcessorиSyncDatabaseFacade, была модифицирована для передачи флагаexact_only=True. - Результат: Теперь при импорте из PDF используется исключительно точное совпадение, что гарантирует добавление всех уникальных вопросов, предоставленных преподавателем, и решает проблему ложного обнаружения дубликатов.
Проблема: Иногда ИИ "галлюцинировал" — в пошаговом объяснении все было верно, но в поле [CORRECT_ANSWER] стоял неправильный ответ. Также вопросы были слишком однотипными.
- Проблема: В тестах появлялись "мусорные" варианты ответов (например, "Вариант 3") и неоднозначные (например, "Невозможно определить"). Это происходило, когда системе не удавалось сгенерировать достаточное количество осмысленных неправильных ответов.
- Решение:
- Старый механизм, создававший бесполезные заглушки, полностью удален.
- Реализована новая функция
generate_universal_options, которая подбирает в качестве неправильных ответов реальные, но неверные ответы из других вопросов по той же теме. - Если в базе не находится подходящих вариантов, система генерирует числовые вариации (например, для ответа
10могут быть предложены12,8.5и т.д.). - Фильтры AI обновлены, чтобы исключить генерацию неоднозначных фраз.
- Результат: Качество тестов значительно выросло. Теперь все варианты ответов являются осмысленными и релевантными, что делает процесс обучения более эффективным.
- Улучшение UI и фильтрация контента (12.07.2024):
- Проблема 1 (UI): При выходе из теста через кнопку "Выбрать другую тему", сообщение с последним вопросом оставалось на экране, создавая визуальный мусор.
- Решение 1: Логика обработчика
handle_back_to_topicsбыла изменена. Теперь он полностью удаляет сообщение с вопросом (delete_message) вместо того, чтобы просто убирать клавиатуру.
-
Проблема: Система пыталась "исправить" некачественные ответы от AI, у которых не хватало неправильных вариантов, с помощью сложной и ненадежной логики, что приводило к появлению "мусорных" вариантов вроде "Вариант 3".
-
Решение (на основе вашего предложения):
- Отказ от усложнения: Вместо того чтобы "исправлять" плохие ответы, мы теперь просто их отвергаем.
- Строгая валидация AI: Любой ответ от AI, не содержащий 3 неправильных варианта, немедленно отбраковывается.
- Удаление сложного кода: Громоздкая функция
generate_universal_optionsи все связанные с ней вызовы были полностью удалены. - Контроль качества для БД: Добавлена проверка, которая отсеивает вопросы из основной базы данных, если у них по какой-либо причине менее 4 вариантов ответа.
-
Результат: Код стал значительно проще, чище и надежнее. Система теперь гарантирует, что все вопросы, попадающие в тест (независимо от источника), соответствуют строгому стандарту качества.
-
Улучшена работа с кэшем тем: Теперь кэш сбрасывается только при необходимости, что уменьшает количество обращений к базе данных.
-
Исправлен редкий баг: Устранена ошибка, когда бот мог зависнуть при генерации объяснений к вопросам в редких случаях.
-
Надежность раздела редактирования тем: Добавлены проверки и улучшена обработка ошибок в разделе редактирования тем для администраторов, что предотвращает падения из-за некорректных данных.
-
Исправлена ошибка
KeyError: Устранена ошибкаKeyError: 'name'в разделе редактирования тем, возникшая после переименования поля в базе данных. Код обновлен для использования актуального имени поляsubtopic_name.
- Решена проблема с кешем доступа: Устранена проблема, когда пользователь с активированным доступом (
has_access=TRUE) не мог войти в бот. Причиной был устаревший отрицательный результат в кеше. - Внедрена команда
/clear_cache: Добавлена администраторская команда/clear_cache <user_id>, позволяющая принудительно сбрасывать кеш для конкретного пользователя без перезапуска бота. - Автоматическая очистка кеша: Улучшена логика работы с кешем. Теперь при любом изменении прав или данных пользователя (добавление, изменение статуса доступа, обновление информации) его кеш сбрасывается автоматически, что предотвращает подобные проблемы в будущем.