Перейти к содержимому
Ступень 1111.4 Расти дальше

Обратная связь: ментор, ИИ-ревьюер и сообщество

Как получать обратную связь, когда учитесь сами: ИИ-помощник в режиме ментора по правилам homework/AGENTS.md, ревью домашней работы командой homework/review.py через чат, локальную модель на vLLM или Ollama либо облачный API, проверка каждого замечания ИИ тестом, вопросы в сообществах с минимальным воспроизводимым примером, учебный напарник, ментор и объяснение другим.

УРОКstage-11/11-4-growth/04-feedback-community.mdx2 чУрок 4 из 5
После урока вы сможете
  • Работать с ИИ-помощником в режиме ментора по правилам homework/AGENTS.md и объяснить, почему он не решает задание за вас
  • Получить ревью своей домашней работы командой homework/review.py — промптом для чата, через локальную модель на vLLM или Ollama и через облачный API
  • Проверять каждое замечание ИИ-ревьюера тестом или запуском и отделять подтверждённые замечания от ошибок модели и вкусовщины
  • Задать вопрос в сообществе с минимальным воспроизводимым примером, найти учебного напарника и ментора, учить других

Пока вы шли по курсу, обратная связь приходила сама. Квиз сразу показывал ошибку и отправлял её в тетрадь ошибок, автогрейдер check.py за секунды говорил «Medium, до Strong не хватает двух тестов», у каждого задания были подсказки. После курса этого не будет. Ваш проект никто не проверяет, у статьи, которую вы воспроизводите, нет автотестов, а в рабочем коде ошибки находят пользователи.

Без обратной связи рост медленный по простой причине: вы не знаете, чего не знаете. Можно месяц писать код с одной и той же ошибкой в понимании — например, считать softmax по всей матрице вместо строк — и ни разу этого не заметить. Опытные инженеры растут быстрее не потому, что больше читают, а потому, что их код каждый день смотрят другие люди: на код-ревьюкод-ревьюEN code reviewПроверка изменений кода другим инженером до слияния в основную ветку — на корректность, читаемость, тесты и производительность., в обсуждениях, на разборах инцидентов.

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

flowchart LR
A["Ваше решение"] --> B["check.py<br/>секунды"]
B --> C["review.py + ИИ<br/>минуты"]
C --> D["Проверка замечаний<br/>тестом или запуском"]
D --> E["Напарник, ментор,<br/>сообщество<br/>часы и дни"]
E --> F["Журнал и тетрадь ошибок"]
F --> A
Чем дальше по петле, тем медленнее ответ и тем глубже проблемы, которые он находит
ИсточникСкоростьЧто ловитЧего не ловит
Автотесты (check.py, свои тесты)секундыневерный результат на проверяемых случаяхнепроверенные случаи, читаемость, «зачем так»
ИИ-ревьюерминутыкраевые случаи, читаемость, типичные ошибки; задаёт вопросы на пониманиеошибается, соглашается с вами, сам код не запускает
Учебный напарникднинепонятные места в объяснении, «а почему не так?»; держит ритмглубокие ошибки может пропустить, как и вы
Ментор, опытный инженернеделивыбор направления и приоритетов, как это делают в индустриивремени у него мало, мелочи — не к нему
Сообществочасы и дниконкретные баги и вопросы с хорошим примеромрасплывчатые вопросы просто игнорируют

Правило из таблицы: каждый вопрос — в самую быструю петлю, которая способна на него ответить. Опечатку в формуле ловит тест, а не ментор. Выбор между инференсом и пост-трейнингом — тема для человека, а не для автотеста.

В папке homework/ лежит файл AGENTS.md — правила «режима ментора» для ИИ-помощников. AGENTS.md — общепринятое имя файла с инструкциями для агентов программирования: его читают Codex, Cursor и другие. Claude Code читает свой CLAUDE.md, поэтому рядом лежит homework/CLAUDE.md из одной строки @AGENTS.md. Это импорт: Claude Code подставит содержимое AGENTS.md. Те же правила review.py отправляет модели как системный промпт.

Суть правил — сократический диалогсократический диалог (обучение вопросами)EN Socratic method (Socratic questioning)Наставник не сообщает ответ, а задаёт вопросы, по которым ученик приходит к нему сам: «что вернёт функция на пустом входе?», «какая форма у тензора после этой строки?». На этом построен «режим ментора» ИИ-помощников курса (homework/AGENTS.md).: помощник ведёт вас к ответу вопросами, а не выдаёт ответ. Что ему можно и чего нельзя:

Помощник делаетПомощник не делает
Объясняет понятия, формулы, сообщения об ошибках, ссылается на уроки и README заданияНе пишет и не дописывает функции задания в homework/<id>/code/
Задаёт наводящие вопросы: «Что вернёт функция на пустом входе?»Не открывает и не пересказывает эталоны из solutions/ до сдачи
Подсказывает по лестнице, от слабой подсказки к сильнойНе меняет тесты, чтобы они проходили
Пишет вспомогательный код: отладочный вывод, свой тест на краевой случай, скрипт для графикаНе выдаёт догадку за факт: числа и поведение кода проверяет запуском
Делает ревью по рубрике из README: 1–3 главные проблемы, сильные стороны, 3 вопроса, оценка уровня

Почему так строго? Если помощник решит задание, вы получите зелёные тесты и ничего не узнаете. На странице «Как учиться» мы разбирали наблюдение за 26 000 школьников: те, кто брал у ИИ готовые ответы, потом заметно хуже сдали экзамены, а те, кто работал с ним как с репетитором, не потеряли ничего. После курса правило то же, только ставки выше: на собеседовании и на работе ИИ за вас думать не будет.

Правила требуют начинать с самой слабой подсказки и переходить к следующей, только если вы попробовали сами и просите ещё. Пример — функция causal_mask из ДЗ s4-hw02-attention, у которой маска выровнена не по тому углу:

СтупеньЧто говорит помощник
1. Вопрос«Что должна вернуть causal_mask(2, 5)? Сколько ключей видит последний запрос?»
2. Где искать«Сравните свою маску с примером из таблицы README: она выровнена по левому верхнему углу или по правому нижнему?»
3. Идея словами«Когда в кэше уже лежат прошлые позиции, запрос ii видит ключи до позиции i+(tk−tq)i + (t_k - t_q) включительно»
4. Псевдокод на других данныхПример для tq=1, tk=3t_q = 1,\ t_k = 3: маска [[1, 1, 1]] — единственный новый запрос видит всё

Чаще всего хватает первой или второй ступени. Если вы сразу просите четвёртую, вы пропускаете ту часть работы, ради которой задание и написано.

  • Запускайте помощника так, чтобы он увидел правила. Надёжнее всего — из папки homework/. Проверьте: спросите «по каким правилам ты работаешь с этой папкой?». Если в ответе нет лестницы подсказок, правила не подхватились.
  • Приходите с попыткой. «Вот мой код, вот ошибка, вот что я уже проверил» — и просите конкретную ступень лестницы.
  • Правила ослабляются в трёх случаях. Задание уже сдано, и вы просите сравнить решение с эталоном. Вопрос не про задание: драйверы, git, сервер модели. Или пользователь говорит, что он автор курса и правит задания. Последняя оговорка нужна авторам. Если вы скажете эту фразу сами, правила выключатся, но обманете вы только себя.

Ревью — это взгляд на готовое решение целиком. Чтобы не собирать промпт руками, в курсе есть скрипт homework/review.py. Что он делает:

  1. Читает homework/<id>/README.md и берёт из раздела «ИИ-ревью» первый блок с промптом. Если раздела нет, берёт общий шаблон: оценить по рубрике, назвать 1–3 главные проблемы, задать 3 вопроса, оценить уровень.

  2. Подставляет вместо заглушек вида «вставьте код» разделы «Что нужно сделать» и «Уровни», ваши файлы из code/ (по списку files в task.yaml; каждый файл обрезается до 40 000 символов) и свежий вывод автогрейдера: скрипт сам запускает check.py. Если в промпте задания есть место для отчёта (как в s11-hw06-grokking), туда подставляется ваш REPORT.md.

  3. Дописывает чек-лист «глазами опытного инженера»: имена и структура, численная устойчивость и краевые случаи, векторизация, свои тесты и документация. Сильные стороны ревьюер тоже должен назвать.

  4. Дальше два пути. Без --api печатает промпт и сохраняет его в journal/reviews/<id>_<дата>_prompt.md — вставьте его в чат с Claude, DeepSeek или Qwen. С --api отправляет промпт на сервер с API, совместимым с OpenAI, вместе с правилами ментора как системным промптом, печатает ответ и сохраняет его в …_review.md.

Вот начало и конец настоящего вывода для первой домашней работы курса. Флаг --no-tests пропускает запуск автогрейдера: так быстрее, когда вы просто смотрите на промпт.

$ python homework/review.py s0-hw01-python-warmup --no-tests
Ты — преподаватель курса ChinaAI. Я начинающий программист, это моя первая домашняя работа на Python:
функции анализа текста (tokenize, top_words, char_counts, bigrams, cyrillic_ratio).
Вот мой код:
### homework/s0-hw01-python-warmup/code/textstats.py
```python
"""ДЗ 0.3 — разминка на Python. Заполните функции. Проверка: python homework/check.py s0-hw01"""
...
```
.
1) Проверь правильность и читаемость, укажи краевые случаи, которые я мог пропустить.
2) НЕ переписывай код за меня и не давай готовое решение — только подсказки и вопросы.
3) Задай мне 3 вопроса на понимание (например, почему Counter быстрее ручного подсчёта, как работает key в sorted).
Условие и рубрика (из README.md):
## Что нужно сделать
...
Вывод автогрейдера:
```text
(автогрейдер не запускался: флаг --no-tests)
```
Дополнительно посмотри на решение глазами опытного инженера на код-ревью (коротко, 3–5 пунктов):
...
— Промпт сохранён: journal/reviews/s0-hw01-python-warmup_2026-10-06_08-34_prompt.md

Три способа отправить промпт:

СпособКомандаКогда брать
Чатpython homework/review.py s4-hw02-attention, затем вставить промпт в чатбыстро и сильной моделью; код уходит провайдеру чата
Свой сервер… --api http://localhost:8000/v1 --model Qwen/Qwen3-32B-AWQ (vLLM) или --api http://localhost:11434/v1 --model qwen3:30b (Ollama)бесплатно, приватно, без лимитов; модель слабее топовых
Облачный APICHINAAI_REVIEW_KEY=<ключ> python homework/review.py s4-hw02-attention --api https://api.deepseek.com --model deepseek-flashсильная модель без чата; платно за токены

Скрипт сам добавляет к адресу /chat/completions, поэтому для DeepSeek указывается корневой адрес. Имена моделей у провайдеров меняются: актуальный список отдаёт сам сервер (GET /models), подробности — в путеводителе по API DeepSeek. Чтобы не писать флаги каждый раз, задайте переменные окружения CHINAAI_REVIEW_API, CHINAAI_REVIEW_MODEL и CHINAAI_REVIEW_KEY. Тогда python homework/review.py <id> сразу отправит промпт на сервер.

  • Галлюцинации. Модель уверенно пишет о проблеме, которой нет, или о функции библиотеки, которой не существует (галлюцинациягаллюцинацияEN hallucination).
  • Угодничество. Возразите ревьюеру — и он часто согласится, даже если был прав (sycophancyугодничество (sycophancy)EN sycophancyСклонность модели соглашаться с пользователем и льстить ему вместо правдивого ответа — частый побочный эффект RLHF., урок 6.3.2). Вопрос «правда ведь, мой код верный?» почти гарантирует «да».
  • Ревьюер не запускает код. review.py даёт модели вывод автогрейдера, но собственных опытов модель не ставит. Всё, что она говорит о поведении кода, — предсказание.
  • «Теоретические» баги. Модели любят находить проблемы, которые на практике почти не случаются. Авторы transformers прямо пишут об этом в своём CONTRIBUTING: агенты для программирования часто цепляются за баги, найденные чтением кода, которые редко или никогда не проявляются.
  • Маленькая локальная модель ошибается чаще большой. 8B хватает, чтобы задать хорошие вопросы, но не чтобы судить о тонкостях численной устойчивости.
  1. Переформулируйте замечание в проверяемое утверждение. «Код неустойчив» — не утверждение. «На входе [1000, 1001] функция вернёт nan» — утверждение.

  2. Напишите самый маленький запуск или тест, который его проверяет. Проверяйте ровно одно: если в тексте теста и заглавные буквы, и знаки препинания, вы не поймёте, что из них сработало.

  3. Прогоните на своём коде и на заведомо верном варианте. Если тест «находит проблему» и в эталонной реализации, ошибка в тесте, а не в коде.

  4. Вынесите вердикт. Подтверждено → исправить и добавить тест в свой набор. Опровергнуто → записать, что ревьюер ошибся. Вкусовое (имена, стиль, «лучше взять scipy») → решить самому и не тратить на это время, пока не закрыты подтверждённые.

  5. Запишите итог в конец файла ревью в journal/reviews/. Подтверждённые ошибки уходят в journal/mistakes.md с полем «как не повторить».

Пример. Ученик написал softmax, а ревьюер оставил два замечания:

import numpy as np
def softmax(x): # код ученика, который ревьюит ИИ
e = np.exp(x - x.max())
return e / e.sum()
# Замечание 1: «на больших числах exp переполнится и вернёт nan»
print("1:", softmax(np.array([1000.0, 1001.0])))
# Замечание 2: «для батча нормирует по всей матрице, а не по строкам»
batch = np.array([[1.0, 2.0, 3.0], [1.0, 2.0, 3.0]])
print("2: суммы по строкам =", softmax(batch).sum(axis=1))
def softmax_rows(x): # заведомо верный вариант для сравнения
e = np.exp(x - x.max(axis=-1, keepdims=True))
return e / e.sum(axis=-1, keepdims=True)
print(" эталон: ", softmax_rows(batch).sum(axis=1))
1: [0.26894142 0.73105858]
2: суммы по строкам = [0.5 0.5]
эталон: [1. 1.]

Первое замечание опровергнуто: вычитание максимума как раз защищает от переполнения (урок 1.3.2), и на [1000, 1001] всё считается. Модель увидела np.exp и выдала типичное замечание, не проследив код. Второе подтверждено: суммы по строкам равны 0.5, а должны быть 1. Это настоящий баг, который проявится в первом же батче. Без проверки вы могли бы «исправить» первое и не заметить второе.

Полезно вести счёт: сколько замечаний ревьюера подтвердилось. Если у локальной 8B из десяти замечаний подтверждаются два, ей можно поручать вопросы на понимание, но не вердикты.

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

СообществоЯзыкЧто тамДля чего вам
Open Data Science — ods.aiRUОдно из крупнейших русскоязычных сообществ по данным и ML: учебные треки, соревнования, проекты, конференция Data Fest; с ним связан открытый курс mlcourse.aiвопросы на русском, единомышленники, доклады, рекомендации на работу
Kaggle — форумы DiscussionsENОбсуждения у каждого соревнования, общий форум, ноутбуки с кодомвопросы по соревнованиям и данным, чтение чужих решений (урок 11.4.3)
Hugging Face — Discord и форумENКаналы по библиотекам и курсам, форум с поиском«это баг в transformers или в моём коде?»
Хабр — habr.com и Хабр Q&ARUТехнические статьи с обсуждением в комментариях, раздел вопросов и ответовписать посты о проектах, читать разборы
Форумы и трекеры проектов — например, форум vLLM и GitHub IssuesENПользователи и разработчики конкретной библиотекивопросы по vLLM, SGLang, verl и т. п. (урок 11.4.2)
Datawhale — github.com/datawhalechinaZHОткрытые курсы (happy-llm, self-llm, hello-agents) и учебные сезоны группового обученияматериалы и формат групповой учёбы
Чжиху — zhihu.comZHВопросы-ответы и авторские колонки; разборы китайских моделей появляются там в день релизачитать разборы через переводчик (урок «Как читать китайские источники»)

Много живого общения идёт в мессенджерах, но названия чатов меняются быстрее, чем выходят курсы. Ищите действующие ссылки на официальных сайтах и в README сообществ, а не в случайных подборках.

Основы вы знаете с уроков 0.0.3 и 0.2.5: цель, минимальный воспроизводимый примерминимальный воспроизводимый примерEN minimal reproducible example (MRE)Самый короткий код (обычно 10–20 строк), который воспроизводит ошибку без ваших файлов и данных, плюс версии библиотек и полный traceback. Главное содержимое хорошего issue и вопроса на форуме., полный текст ошибки, что ожидали, что пробовали. На уровне инженера добавляются три вещи.

1. Окружение. Половина багов в LLM-стеке — несовпадение версий. Шаблон баг-репорта vLLM требует вывод скрипта collect_env.py, а transformers — команды transformers env. Для PyTorch есть python -m torch.utils.collect_env.

2. Пример, который можно скопировать и запустить. Мейнтейнеры vLLM пишут об этом прямо: мы скопируем ваш код и ожидаем получить тот же результат, поэтому никаких внешних данных. Файл на 2 ГБ заменяется тремя строками в коде, а модель на 32B — самой маленькой, на которой ошибка ещё воспроизводится.

3. Правильное место. Не уверены, чья ошибка — ваша или библиотеки? Авторы transformers просят сначала спросить на форуме или в Discord, а в GitHub Issues нести то, что точно баг библиотеки. Перед вопросом поищите: такой вопрос часто уже задавали.

Пример вопроса на форуме vLLM:

Заголовок: vLLM 0.x зависает на старте с --tensor-parallel-size 2 на двух RTX 4080 (без NVLink)
Окружение: вывод python collect_env.py — под спойлером. Ubuntu 24.04, драйвер …, 4× RTX 4080, PCIe.
Команда (воспроизводится каждый раз):
CUDA_VISIBLE_DEVICES=2,3 vllm serve Qwen/Qwen3-0.6B --tensor-parallel-size 2
Ожидал: сервер стартует, как с одной картой.
Получил: после строки «… NCCL …» нет вывода 10+ минут; полный лог — под спойлером.
Что пробовал:
- с одной картой (без -tp) — стартует за 40 с;
- NCCL_P2P_DISABLE=1 — стартует; без неё — зависает;
- nvidia-smi topo -m показывает PHB между картами 2 и 3.
Вопрос: это ожидаемо на GeForce без P2P или стоит открыть issue?

Модель 0.6B вместо 32B — тоже часть минимальности: ошибка в инициализации NCCL от размера модели не зависит, а ждать загрузки меньше. И не забудьте предупреждение из того же шаблона vLLM: перед публикацией уберите из логов ключи, токены и внутренние адреса.

Этикет. Не пишите мейнтейнерам в личные сообщения. Не задавайте один вопрос в пять мест одновременно, а если перенесли его в другое место, оставьте ссылку. Когда проблема решилась, напишите, что помогло: следующий человек с той же ошибкой найдёт ваш ответ поиском.

учебный напарникучебный напарникEN study buddy (accountability partner)Человек, с которым вы договорились регулярно отчитываться друг другу о занятиях: раз в неделю обменяться ссылками на коммиты, сделать ревью домашней работы, провести пробное собеседование. Учить можно разное — важен общий ритм и данное слово. — самый дешёвый источник регулярной обратной связи. Договоритесь о простом ритме:

  • раз в неделю 30 минут созвона: что сделал, где застрял, что дальше;
  • обмен ссылками на коммиты журнала: пропуск сразу виден, а это лучший стимул не пропускать;
  • ревью домашних работ друг друга по той же рубрике из README, что получает ИИ;
  • пробные собеседования (урок 11.3.1): один интервьюер, другой кандидат.

Учить можно разное — важен общий ритм. Где искать: учебные треки ODS, соревнования на Kaggle (команды часто собираются в обсуждениях), коллеги, однокурсники по другим курсам. Три–пять человек с общим планом — уже учебная группагрупповое обучение, учебная когортаEN study group, learning cohortФормат Datawhale — группа проходит открытый курс по расписанию 2–4 недели, с заданиями и ежедневной отметкой о занятиях.. Формат сезонов на 2–3 недели с заданиями Task01…TaskN разобран в уроке «Учиться по-китайски».

Ментор — человек на 3–10 лет опытнее, который раз в месяц помогает выбирать направление. Чаще всего наставники находятся среди коллег, среди мейнтейнеров проектов, куда вы отправляли pull request (урок 11.4.2), и среди людей, с которыми вы познакомились на митапах и в сообществах. Просьба «будьте моим ментором» пугает. Конкретная просьба — нет:

Здравствуйте! Я прошёл курс по LLM и выбираю между инференсом и пост-трейнингом.
Мой журнал и проекты: <ссылка>. Можно ли раз в месяц на 30 минут показать вам план и задать
3–4 вопроса? Вопросы пришлю заранее, за два дня.

Ведущий в этих отношениях — вы: готовите вопросы, после встречи пишете, что сделали по советам. Тогда ментору интересно продолжать.

Самая надёжная проверка понимания — объяснить тему другому. метод Фейнманаметод ФейнманаEN Feynman techniqueПроверка понимания объяснением: изложить тему простыми словами так, будто учите новичка, найти места, где объяснение буксует или держится на непонятом термине, вернуться к источнику и упростить ещё раз. Назван по имени физика Ричарда Фейнмана. устроен так: изложить простыми словами, найти места, где объяснение буксует или держится на непонятом термине, вернуться к источнику, объяснить ещё раз проще. Слушатель — тоже обратная связь: он задаёт вопросы, которых вы себе не задавали. «А что будет без деления на dk\sqrt{d_k}?» — и выясняется, что этого вы не знаете.

Форматы — от лёгкого к трудному:

  • Ответы на чужие вопросы на форумах Kaggle и Hugging Face, в обсуждениях ODS. Начните с вопросов по темам ступеней 0–3: их задают больше всего, и вы уже знаете ответ.
  • Ревью кода напарника. Хорошее замечание конкретно («строка 14: на пустом списке будет деление на ноль»), обосновано (тест или ссылка) и помечено: блокирует оно или «по вкусу». Так же вы хотели бы получать замечания от ИИ.
  • Пост о своём проекте. Например, «Воспроизвёл гроккинг на RTX 4080: что совпало со статьёй и что нет» — по плану отчёта из урока 11.4.1: задача, установка, числа, расхождения, выводы. Как писать технический текст для портфолио — в уроке 11.3.6.
  • Доклад на митапе или внутреннем семинаре — когда пост уже написан и обсуждён.

Публикация — бесплатное ревью от десятков людей. Критика в комментариях неприятна, но каждое обоснованное замечание — то, что вы не нашли бы сами. Перед публикацией проверьте числа запуском: ошибка в посте живёт дольше, чем ошибка в журнале.

Задание в браузере: проверяем замечания ИИ-ревьюера

Заголовок раздела «Задание в браузере: проверяем замечания ИИ-ревьюера»

Перед вами решение tokenize и top_words из первой домашней работы курса и четыре замечания ИИ-ревьюера. Два из них верны, два — нет. Напишите для каждого замечания проверку — функцию, которая принимает любую реализацию и говорит, относится ли к ней замечание. Тесты подставят и код ученика, и исправленные версии, и версии с другими ошибками. Поэтому проверка, которая смешивает два фактора (например, «ё» и заглавные буквы), не пройдёт.

Подтвердить или опровергнуть замечания ИИ6 тестов
"""Проверяем замечания ИИ-ревьюера запуском, а не верой.

Ниже — решение ученика из ДЗ s0-hw01 (функции tokenize и top_words) и четыре замечания, которые оставил
ИИ-ревьюер. Часть замечаний верна, часть — нет. Для каждого замечания напишите проверку: функцию, которая
принимает реализацию и возвращает True, если замечание к ней относится (проблема есть), и False, если нет.

Проверки должны работать для ЛЮБОЙ реализации с той же сигнатурой: тесты подставят и код ученика,
и исправленные варианты, и варианты с другими ошибками. Поэтому каждая проверка должна проверять ровно одно.
"""
import re
from collections import Counter


# ── Код ученика (не меняйте) ───────────────────────────────────────────────────────────────
def student_tokenize(text):
    """Слова в нижнем регистре: кириллица, латиница, цифры."""
    return re.findall(r"[a-zа-я0-9]+", text.lower())


def student_top_words(text, k):
    """k самых частых слов; при равной частоте — по алфавиту."""
    counts = Counter(student_tokenize(text))
    return sorted(counts.items(), key=lambda pair: -pair[1])[:k]


# ── Замечания ИИ-ревьюера ─────────────────────────────────────────────────────────────────
CLAIMS = {
    "A": "tokenize теряет букву «ё»: из слова «ёж» получится «ж»",
    "B": "top_words падает с IndexError, если k больше числа разных слов",
    "C": "при равной частоте top_words расставляет слова не по алфавиту",
    "D": "tokenize не приводит регистр: «Мир» и «мир» считаются разными словами",
}


def claim_a(tokenize):
    """True, если tokenize теряет «ё». Проверяйте на строчном слове «ёж» — без заглавных букв
    и знаков препинания, чтобы на результат не влияло ничего, кроме самой «ё»."""
    # TODO
    ...


def claim_b(top_words):
    """True, если top_words падает с IndexError, когда k больше числа разных слов.
    Ловите только IndexError: другие исключения — уже другая проблема, пусть падают."""
    # TODO
    ...


def claim_c(top_words):
    """True, если при равной частоте порядок слов НЕ алфавитный.
    Возьмите текст, где все слова встречаются по одному разу, а впервые появляются не по алфавиту,
    и сравните только порядок слов."""
    # TODO
    ...


def claim_d(tokenize):
    """True, если tokenize считает «Мир» и «мир» разными словами.
    Текст — без знаков препинания: проверяем только регистр."""
    # TODO
    ...


def verdicts():
    """Словарь {"A": bool, "B": bool, "C": bool, "D": bool} — вердикты по коду ученика.
    Не пишите ответы руками: вызовите свои проверки на student_tokenize и student_top_words."""
    # TODO
    ...


if __name__ == "__main__":
    print(student_tokenize("Ёжик и мир, Мир!"))   # посмотрите глазами, что делает код ученика
    print(student_top_words("в б а в б а", 3))
    print(verdicts())
  1. Возьмите домашнюю работу, которую вы сдали на Strong или Boss, например s11-hw06-grokking или s4-hw02-attention. Запустите python homework/review.py <id> и отправьте промпт удобным способом: в чат, своему серверу или по API.

  2. Для каждого замечания заполните таблицу в конце файла ревью в journal/reviews/:

    | # | Замечание | Проверка (тест или запуск) | Вердикт |
    |---|---|---|---|
    | 1 | «на пустом входе деление на ноль» | test_empty_input в tests/my_tests.py | подтверждено → исправил |
    | 2 | «лучше векторизовать цикл» | timeit: 1.2 мс против 0.9 мс на 10⁴ элементах | вкусовое → оставил |
  3. Ответьте ревьюеру на его три вопроса на понимание — письменно, в том же файле. На какой не смогли ответить, тот и есть тема для повторения.

  4. Если запускаете локальную модель — сделайте то же самое второй моделью и сравните, сколько замечаний подтвердилось у каждой.

  5. Задайте один вопрос живым людям: в обсуждении ODS, на форуме Hugging Face или напарнику. Подойдёт вопрос, на который не ответил ИИ, или просьба посмотреть README вашего проекта.

  6. Запишите в журнал дня строку «ИИ: …» (какие вопросы задавали) и строку «Люди: …» (кому и что).

Проверь себя6 вопросов
1 ИИ-ревьюер пишет: «top_words упадёт с IndexError, если k больше числа слов». Что сделать первым?
2 Что ИИ-помощник может делать в режиме ментора по правилам homework/AGENTS.md? Выберите все верные варианты.Можно выбрать несколько ответов
3 Зачем запускать Qwen3 в vLLM с флагом --reasoning-parser qwen3, когда ревью идёт через review.py?
4 На какой вопрос на форуме вероятнее всего ответят по существу?
5 Из четырёх замечаний ревьюера два подтвердились тестами, одно опровергнуто, одно — о стиле имён. Что записать в journal/mistakes.md?
6 Вы объясняете напарнику attention и не можете ответить, что будет без деления на dk\sqrt{d_k}. Что это значит по методу Фейнмана?
  • Обратная связь приходит из трёх петель: тесты (секунды), ИИ-ревьюер (минуты) и люди (дни). Каждый вопрос — в самую быструю петлю, которая способна на него ответить.
  • homework/AGENTS.md переводит ИИ-помощника в режим ментора: объясняет, спрашивает, подсказывает по лестнице и не решает задание за вас. homework/review.py собирает промпт ревью из README, вашего кода и вывода автогрейдера и отправляет его в чат, в свой vLLM или Ollama либо в облачный API.
  • Замечание ИИ — гипотеза. Проверка ровно одного фактора на вашем коде и на верном варианте, затем вердикт: подтверждено, опровергнуто или вкусовое. Правки — только по подтверждённым.
  • Живые люди — в ODS, на форумах Kaggle и Hugging Face, на Хабре, в Datawhale и на Чжиху. Вопрос с окружением, минимальным примером и тем, что вы уже пробовали, получает ответ. Напарник держит ритм, ментор помогает с направлением.
  • Объяснять другим — лучшая проверка понимания и самый быстрый способ получить ревью от многих людей сразу.

Дальше: урок 11.4.5 — план на год после курса: четыре траектории, цели по кварталам, недельный ритм, ежемесячный обзор в журнале и чек-лист «я готов к первой работе».