workshop day 3 · самостоятельная работа

Active English Trainer

Два дня вы строили инфраструктуру: бот, БД, AI-интеграции. Сегодня — самостоятельная работа: превращаете пассивный словарь в работающего ИИ-репетитора. Никаких новых концепций, только применение того, что уже знаете.

Кейс: «Мёртвые слова»

Вы уже сделали словарь. Поздравляю — вы создали кладбище слов.

500 слов в базе. Ни одно не используется. Ты добавил ephemeral три месяца назад и с тех пор ни разу не вспомнил. ЕНТ или IELTS не спросит вас: «Сколько слов у тебя в таблице?» Он спросит, можете ли вы их использовать.

Цель дня: превратить пассивную БД из Day 2 в Active English Trainer — ИИ-репетитора, который вытаскивает слова из мёртвой базы в реальный контекст.

MVP Scope: две обязательные команды

Это минимум, без которого бот не считается готовым. Обе команды нужно довести до конца.

КомандаЧто делаетГлавная техникаСложность
/speakingБерёт слова из словаря и заставляет юзера их использоватьSELECT random + AI вопрос + state machine🟢 средне
/new_wordAI предлагает новое слово, проверяет, добавляет в БДSELECT last 50 + AI JSON + INSERT🟡 средне+

Как работать без паники

Это не «слепо копируй из ChatGPT и молись». Ты управляешь кодом, а не наоборот. Обе MVP-фичи ниже разбиты на маленькие подшаги. У каждого подшага есть:

  1. Объяснение — что делаем и зачем (2–4 предложения).
  2. Хинты — открываются по одному. Сначала наводящий вопрос, потом наблюдение, потом ключевая идея.
  3. Псевдокод — открывается в самом конце, когда хинты не помогли. Это план решения, не готовый код — писать всё равно тебе.
  4. Чекпоинт — как проверить, что подшаг работает, прежде чем идти дальше.

Фича 1: /speaking — активация словаря

Идея: пассивное знание становится активным только через применение. Бот заставляет юзера произнести (написать) фразу, в которой обязательно надо использовать слова из его собственного словаря.

Что должно произойти под капотом

Что нужно добавить в БД

sql
alter table words
add column if not exists last_practiced_at timestamptz;

Дальше — 5 подшагов. Каждый делается и проверяется отдельно. Не открывай хинты сразу — сначала попробуй сам.


Подшаг 1.1: SELECT случайных слов

Что делаем: функция, которая по user_id возвращает 3–5 случайных слов из таблицы words. Это вход всей фичи: нет слов — нет вопроса.

Подсказки0 / 4
Попробуй решить самостоятельно, прежде чем смотреть подсказки.

Подшаг 1.2: session и state machine

Что делаем: самая важная часть фичи. После того как бот задал вопрос, следующее сообщение юзера — это не команда, а ответ на вопрос. Без state machine любое сообщение воспринимается как новый запрос, и диалог не работает.

Почему это нужно: Telegram-бот не помнит контекст между сообщениями — каждое сообщение приходит «с нуля». Session — это память между сообщениями, а state — отметка «в каком месте диалога мы находимся».

Жизненный цикл /speaking

0 / 5
1state = 'idle'
2/speaking
3state = 'speaking'
4Юзер отвечает
5state = 'idle'

Нажми Start и пройди диалог по шагам

Подсказки0 / 4
Попробуй решить самостоятельно, прежде чем смотреть подсказки.

Подшаг 1.3: промпт + OpenAI → один вопрос

Что делаем: отправляем выбранные слова в OpenAI и получаем один вопрос, в котором юзеру придётся использовать эти слова. Промпт — это половина продукта: скучный промпт = скучный бот.

Подсказки0 / 4
Попробуй решить самостоятельно, прежде чем смотреть подсказки.

Подшаг 1.4: проверка ответа юзера

Что делаем: юзер ответил текстом, роутер из подшага 1.2 поймал сообщение. Теперь второй вызов OpenAI: использовал ли юзер целевые слова, и короткий мотивирующий фидбэк.

Подсказки0 / 4
Попробуй решить самостоятельно, прежде чем смотреть подсказки.

Подшаг 1.5: UPDATE last_practiced_at

Что делаем: замыкаем цикл с базой — отмечаем использованные слова как «потренированные». Без этого шага фича выглядит работающей, но БД остаётся мёртвой, а /weekly_review (bonus) будет не на чем строить.

Подсказки0 / 3
Попробуй решить самостоятельно, прежде чем смотреть подсказки.

Фича 2: /new_word — умное пополнение

Идея: обычные приложения дают случайные слова из топ-1000. У нас бот знает что юзер уже учил и предлагает только новое и полезное.

Что должно произойти под капотом

Если фича 1 готова — здесь всё знакомо: те же session, тот же роутер, тот же OpenAI. Новое — только JSON mode. 4 подшага.


Подшаг 2.1: список «уже выученного»

Что делаем: забираем последние 50 слов юзера. Это контекст для AI: «вот что юзер знает — предложи что-то новое».

Подсказки0 / 3
Попробуй решить самостоятельно, прежде чем смотреть подсказки.

Подшаг 2.2: JSON mode — слово от AI

Что делаем: просим OpenAI предложить ОДНО новое слово и вернуть его строго в JSON с 4 полями. Здесь главная новая техника дня — JSON mode.

Подсказки0 / 4
Попробуй решить самостоятельно, прежде чем смотреть подсказки.

Подшаг 2.3: показать слово, ждать ответа

Что делаем: показываем юзеру слово + перевод + пример + check_question и переводим диалог в состояние new_word_check. Это копия логики подшага 1.2, только state и данные другие.

Подсказки0 / 3
Попробуй решить самостоятельно, прежде чем смотреть подсказки.

Подшаг 2.4: проверка YES/NO и INSERT

Что делаем: последний шаг — AI решает, понял ли юзер слово. YES → слово в БД. NO → подсказка и вторая попытка.

Подсказки0 / 4
Попробуй решить самостоятельно, прежде чем смотреть подсказки.

Bonus: дополнительные фичи

MVP готов? Можно добавить ещё одну фичу, которая сделает бота заметно полезнее. Используй то, что уже умеешь с Day 2 (Whisper, Vision) — или придумай своё.

ФичаЧто используетИдея
/speaking голосомWhisperЮзер отвечает voice message → транскрипция → та же проверка. Главное упражнение — говорить вслух, а не печатать.
/photo_quizVisionФото комнаты → AI находит 5 объектов → бот делает квиз → правильные ответы идут в словарь.
/translateLLMЮзер пишет фразу на русском → бот переводит и сохраняет в словарь все новые слова из перевода.
/streakТолько БДСчитает сколько дней подряд юзер делал хотя бы одну активность. Ничего AI-шного, но сильно увеличивает retention.
/weekly_reviewSELECT + LLMРаз в неделю бот показывает 10 слов, которые юзер давно не практиковал (last_practiced_at < NOW() - 7 days), и делает мини-квиз.
/grammar_checkLLMЮзер пишет любой текст → бот находит одну главную ошибку и объясняет. Не больше одной — иначе перегруз.
/role_playLLM + stateAI играет роль (официант, кассир, пограничник), юзер ведёт диалог на английском. Используются слова из словаря.

Хинты к bonus-фичам

Выбрал фичу — открой её хинты. Чужие не открывай: меньше соблазна распыляться.

/speaking голосом

Подсказки0 / 2
Попробуй решить самостоятельно, прежде чем смотреть подсказки.

/photo_quiz

Подсказки0 / 2
Попробуй решить самостоятельно, прежде чем смотреть подсказки.

/translate

Подсказки0 / 2
Попробуй решить самостоятельно, прежде чем смотреть подсказки.

/streak

Подсказки0 / 2
Попробуй решить самостоятельно, прежде чем смотреть подсказки.

/weekly_review

Подсказки0 / 2
Попробуй решить самостоятельно, прежде чем смотреть подсказки.

/grammar_check

Подсказки0 / 2
Попробуй решить самостоятельно, прежде чем смотреть подсказки.

/role_play

Подсказки0 / 2
Попробуй решить самостоятельно, прежде чем смотреть подсказки.

Как подходить к работе

Шаг 1: нарисуй state machine на бумаге (15 минут)

Шаг 2: пиши по одной команде целиком

Сделай /speaking от начала до конца — SELECT, OpenAI вызов, state, проверка ответа. Только потом начинай /new_word. Не пытайся писать обе команды параллельно — потеряешься.

Шаг 3: тестируй каждые 15 минут в Telegram

Не пиши 200 строк и потом запускай. Пиши 30 строк → запускай → проверяй в живом боте → следующие 30 строк.

Как использовать AI (ChatGPT / Copilot / Cursor)

AI — множитель, а не замена мозга. Если ты не понимаешь что просишь — AI выдаст красивый, но неправильный код.

❌ Плохой запрос к AI✅ Хороший запрос к AI
«сделай мне бота»«У меня есть grammY-бот с session middleware. Напиши хендлер bot.command('speaking', ...), который делает SELECT 5 случайных строк из таблицы words по user_id через мою функцию dbSelect(...)»
«не работает, помоги»«Получаю TypeError: Cannot read property 'state' of undefined в этой строке: [код]. Что я упустил?»
«напиши промпт для английского»«Напиши system prompt для OpenAI, который принимает массив из 5 английских слов уровня B2 и возвращает один вопрос на английском для 17-летнего казахстанского школьника, в котором обязательно нужно использовать все эти слова»

Do и Don't — чек-лист

✅ Делай❌ Не делай
Закоммить рабочую версию по ходу работыНе оставляй всё на последний момент
Сначала MVP, потом красотаНе начинай с дизайна сообщений
Тестируй в Telegram каждые 15 минутНе пиши 2 часа без запуска
Задавай конкретные вопросы, если застрял >20 минутНе сиди молча с багом 2 часа
Используй AI для бойлерплейтаНе доверяй AI промпты для AI
Закрой одну фичу полностьюНе делай 3 фичи на 60% каждая
Логируй ошибки (console.error)Не глотай ошибки в catch {}

Рекомендуемый порядок работы

ЭтапЦель
🗺️ ПланированиеПрочитал задание, нарисовал state machine
🔧 /speakingПолностью работающая команда, протестирована в Telegram
🔧 /new_wordПолностью работающая команда + INSERT работает
🧪 Polish + edge casesПустой словарь, кривой JSON, юзер пишет фигню — всё обработано
⭐ Bonus-фичаОдна дополнительная команда, только если MVP стабилен

Финальная установка

За два дня вы написали 400+ строк кода. Сегодня — когда из этого кода получается продукт, которым реально можно пользоваться перед IELTS.

Кодь. Спрашивай. Тестируй.

© 2026 aqlacademy.kz