Telegram-бот для репетитора по математике. Пишешь ему «5 задач на производную из №9 и 2 с параметром» — через несколько секунд приходят два PDF: условия для ученика и ответы с решениями для себя. ДЗ можно поправить прямо в чате: «замени 3-ю на посложнее», «добавь 2 на логарифмы», «без решений».
Задачи берутся из банка Школково (ЕГЭ, профиль), LLM — GigaChat.
flowchart LR
msg[сообщение] --> understand[разбор запроса<br>GigaChat]
understand --> retrieve[поиск кандидатов<br>SQLite]
retrieve --> select[выбор задач<br>GigaChat]
select --> build[сборка PDF<br>Tectonic]
build --> reply[2 PDF в чат]
build -. задача не собралась .-> retrieve
- Парсер на Playwright собирает каталог Школково и исходный LaTeX задач в SQLite — около 9,7 тыс. задач по всем 20 номерам, с решениями и рисунками.
- GigaChat дважды за запрос: разбирает сообщение в структуру (темы, сколько задач, номер задания) и выбирает задачи из найденных кандидатов. Текст задач модель не пишет, PDF собирается из оригинального LaTeX.
- Поиск: сначала подбираются подходящие подтемы каталога, потом задачи внутри них — по векторам (sqlite-vec + multilingual-e5, локально) и полнотекстово (FTS5), результаты сливаются через RRF.
- У задач разные преамбулы с собственными макросами, поэтому каждая компилируется в своей группе, иначе они конфликтуют между собой.
Стек: aiogram 3, LangGraph, langchain-gigachat, SQLite + sqlite-vec, sentence-transformers, Playwright, Jinja2 + Tectonic.
Понадобятся uv, tectonic, Chrome (только для парсинга), токен бота и ключ GigaChat API.
uv sync
cp .env.example .env # TELEGRAM_BOT_TOKEN и GIGACHAT_CREDENTIALS
uv run python -m assistmath.scraper all # пару часов, можно прерывать и продолжать
uv run python -m assistmath.index build
uv run assistmath-botАгента можно погонять и без телеграма:
uv run python -m assistmath.llm.graph "3 задачи на логарифмические неравенства"Пара моментов:
- Сертификат GigaChat подписан НУЦ Минцифры, поэтому проверка TLS по умолчанию выключена
(
GIGACHAT_VERIFY_SSL=false). Нужна проверка — укажите файл сертификата вGIGACHAT_CA_BUNDLE. - Эмбеддинги локальные, так что на одно ДЗ уходит ~2 тыс. токенов GigaChat — freemium-тарифа хватает с запасом.
uv run ruff check && uv run mypy && uv run pytestMIT. Задачи и решения принадлежат Школково — в репозитории их нет, база собирается у себя парсером. Картинки выше собраны на тестовых задачах.

