workshop day 3 · самостоятельная работа
Active English Trainer
Два дня вы строили инфраструктуру: бот, БД, AI-интеграции. Сегодня — самостоятельная работа: превращаете пассивный словарь в работающего ИИ-репетитора. Никаких новых концепций, только применение того, что уже знаете.
Кейс: «Мёртвые слова»
Вы уже сделали словарь. Поздравляю — вы создали кладбище слов.
500 слов в базе. Ни одно не используется. Ты добавил ephemeral три месяца назад и с тех пор ни разу не вспомнил. ЕНТ или IELTS не спросит вас: «Сколько слов у тебя в таблице?» Он спросит, можете ли вы их использовать.
Цель дня: превратить пассивную БД из Day 2 в Active English Trainer — ИИ-репетитора, который вытаскивает слова из мёртвой базы в реальный контекст.
MVP Scope: две обязательные команды
Это минимум, без которого бот не считается готовым. Обе команды нужно довести до конца.
| Команда | Что делает | Главная техника | Сложность |
|---|---|---|---|
/speaking | Берёт слова из словаря и заставляет юзера их использовать | SELECT random + AI вопрос + state machine | 🟢 средне |
/new_word | AI предлагает новое слово, проверяет, добавляет в БД | SELECT last 50 + AI JSON + INSERT | 🟡 средне+ |
Как работать без паники
Это не «слепо копируй из ChatGPT и молись». Ты управляешь кодом, а не наоборот. Обе MVP-фичи ниже разбиты на маленькие подшаги. У каждого подшага есть:
- Объяснение — что делаем и зачем (2–4 предложения).
- Хинты — открываются по одному. Сначала наводящий вопрос, потом наблюдение, потом ключевая идея.
- Псевдокод — открывается в самом конце, когда хинты не помогли. Это план решения, не готовый код — писать всё равно тебе.
- Чекпоинт — как проверить, что подшаг работает, прежде чем идти дальше.
Фича 1: /speaking — активация словаря
Идея: пассивное знание становится активным только через применение. Бот заставляет юзера произнести (написать) фразу, в которой обязательно надо использовать слова из его собственного словаря.
Что должно произойти под капотом
Что нужно добавить в БД
alter table words
add column if not exists last_practiced_at timestamptz;
Дальше — 5 подшагов. Каждый делается и проверяется отдельно. Не открывай хинты сразу — сначала попробуй сам.
Подшаг 1.1: SELECT случайных слов
Что делаем: функция, которая по user_id возвращает 3–5 случайных слов из таблицы words. Это вход всей фичи: нет слов — нет вопроса.
Подшаг 1.2: session и state machine
Что делаем: самая важная часть фичи. После того как бот задал вопрос, следующее сообщение юзера — это не команда, а ответ на вопрос. Без state machine любое сообщение воспринимается как новый запрос, и диалог не работает.
Почему это нужно: Telegram-бот не помнит контекст между сообщениями — каждое сообщение приходит «с нуля». Session — это память между сообщениями, а state — отметка «в каком месте диалога мы находимся».
Жизненный цикл /speaking
0 / 5Нажми Start и пройди диалог по шагам
Подшаг 1.3: промпт + OpenAI → один вопрос
Что делаем: отправляем выбранные слова в OpenAI и получаем один вопрос, в котором юзеру придётся использовать эти слова. Промпт — это половина продукта: скучный промпт = скучный бот.
Подшаг 1.4: проверка ответа юзера
Что делаем: юзер ответил текстом, роутер из подшага 1.2 поймал сообщение. Теперь второй вызов OpenAI: использовал ли юзер целевые слова, и короткий мотивирующий фидбэк.
Подшаг 1.5: UPDATE last_practiced_at
Что делаем: замыкаем цикл с базой — отмечаем использованные слова как «потренированные». Без этого шага фича выглядит работающей, но БД остаётся мёртвой, а /weekly_review (bonus) будет не на чем строить.
Фича 2: /new_word — умное пополнение
Идея: обычные приложения дают случайные слова из топ-1000. У нас бот знает что юзер уже учил и предлагает только новое и полезное.
Что должно произойти под капотом
Если фича 1 готова — здесь всё знакомо: те же session, тот же роутер, тот же OpenAI. Новое — только JSON mode. 4 подшага.
Подшаг 2.1: список «уже выученного»
Что делаем: забираем последние 50 слов юзера. Это контекст для AI: «вот что юзер знает — предложи что-то новое».
Подшаг 2.2: JSON mode — слово от AI
Что делаем: просим OpenAI предложить ОДНО новое слово и вернуть его строго в JSON с 4 полями. Здесь главная новая техника дня — JSON mode.
Подшаг 2.3: показать слово, ждать ответа
Что делаем: показываем юзеру слово + перевод + пример + check_question и переводим диалог в состояние new_word_check. Это копия логики подшага 1.2, только state и данные другие.
Подшаг 2.4: проверка YES/NO и INSERT
Что делаем: последний шаг — AI решает, понял ли юзер слово. YES → слово в БД. NO → подсказка и вторая попытка.
Bonus: дополнительные фичи
MVP готов? Можно добавить ещё одну фичу, которая сделает бота заметно полезнее. Используй то, что уже умеешь с Day 2 (Whisper, Vision) — или придумай своё.
| Фича | Что использует | Идея |
|---|---|---|
/speaking голосом | Whisper | Юзер отвечает voice message → транскрипция → та же проверка. Главное упражнение — говорить вслух, а не печатать. |
/photo_quiz | Vision | Фото комнаты → AI находит 5 объектов → бот делает квиз → правильные ответы идут в словарь. |
/translate | LLM | Юзер пишет фразу на русском → бот переводит и сохраняет в словарь все новые слова из перевода. |
/streak | Только БД | Считает сколько дней подряд юзер делал хотя бы одну активность. Ничего AI-шного, но сильно увеличивает retention. |
/weekly_review | SELECT + LLM | Раз в неделю бот показывает 10 слов, которые юзер давно не практиковал (last_practiced_at < NOW() - 7 days), и делает мини-квиз. |
/grammar_check | LLM | Юзер пишет любой текст → бот находит одну главную ошибку и объясняет. Не больше одной — иначе перегруз. |
/role_play | LLM + state | AI играет роль (официант, кассир, пограничник), юзер ведёт диалог на английском. Используются слова из словаря. |
Хинты к bonus-фичам
Выбрал фичу — открой её хинты. Чужие не открывай: меньше соблазна распыляться.
/speaking голосом
/photo_quiz
/translate
/streak
/weekly_review
/grammar_check
/role_play
Как подходить к работе
Шаг 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.
Кодь. Спрашивай. Тестируй.