Материал подготовлен в преддверии старта курса «ИИ для разработчиков».
Всем привет, меня зовут Сергей Прощаев и в этой статье расскажу про ревью кода, созданного ИИ, и про то, почему AI Code Review так часто не спасает. Я Tech Lead и руководитель направления Java | Kotlin разработки в FinTech & E‑commerce, преподаю на курсах разработки и архитектуры в ОТУС.
Типичный сценарий, который я всё чаще вижу в командах, выглядит так. Разработчик ставит задачу агенту, тот за несколько минут собирает патч на 600 строк, гоняет тесты, отчитывается об успехе.
Открывается pull request, в нём уже сидит AI‑ревьюер и оставил девять комментариев:
-
три про именование;
-
два про отсутствующий docstring;
-
один про потенциальный NPE, остальные про стиль.
Автор поправил, бот пометил замечания устранёнными, CI зелёный. Человек открывает diff, видит восемь файлов, аккуратный код и закрытые замечания — и ставит апрув.
Через неделю приходит расхождение по балансам, и на разборе выясняется, что изменение сломало контракт, которого в diff вообще не было.

Сразу разведу два понятия.
-
AI Code Review — автоматическая проверка pull request моделью или агентом.
-
ИИ‑код — код, который агент написал или существенно изменил. Это независимые понятия: ревьюер прекрасно проверяет и полностью человеческий PR.
Разберём 7 ошибок, из‑за которых ревью перестаёт защищать продукт именно тогда, когда команда начинает всерьёз генерировать код агентами.
Для каждой — симптом, причина, что она ломает и как я обычно её чиню. Часть правил появилась не от хорошей жизни, а после разборов инцидентов.
Что показывают цифры за 2026 год
Мне как‑то попалась совместная работа GitClear и GitKraken “The Maintainability Gap”:
-
Там считают не опросы, а реальные изменения строк: 623 миллиона изменений, проанализированных за период 2023–2026 годов, причём данные за 2026-й неполные.
-
Дублированные блоки (пять и больше подряд повторяющихся значащих строк): 40,3 на миллион изменённых строк в 2023 году против 73,0 в 2026-м, рост на 81%.
-
Доля изменений, которые GitClear классифицирует как перемещённые, то есть moved/refactored: 21% в 2022-м, 13% в 2023-м и 3,8% в 2026-м на момент исследования.
-
Связность — число обращений нового кода к существующему на тысячу изменённых строк — снизилась с 343 до 223.
Здесь легко сделать слишком сильный вывод, поэтому оговорюсь: это метрики структуры изменений, а не приговор качеству кода, и речь о корреляции. Авторы не утверждают, что ИИ‑код сам по себе плохой: их данные показывают ухудшение нескольких структурных метрик на фоне роста доли ИИ‑разработки. Одно из возможных объяснений — локальная оптимизация агента под текущую задачу без учёта существующего кода.
Вторую цифру часто цитируют без источника. Отчёт CodeRabbit: выборка из 470 открытых pull request, 320 с признаками ИИ‑соавторства и 150 без них. В первых нашлось в среднем 10,83 замечания против 6,45 во вторых. Оговорок две:
-
авторство определялось по косвенным признакам;
-
а находки считал анализатор самого CodeRabbit — вендора инструмента для code review.
Переведу на язык дежурства: изменений больше, они чаще дублирующие и требуют больше внимания, а ревьюеров столько же.
По опросу LeadDev за 2026 год так и выходит. 68% инженеров говорят, что ИИ изменил их подход к ревью, и внутри этой группы 86% ищут проблемы моделью до того, как код посмотрит человек. При этом 29% отмечают, что ревью стало дольше, 24% — что быстрее, 47% не заметили разницы.
Ошибка 1. AI Code Review смотрит только на diff
-
Симптом. Бот молчит, человек ставит апрув, регрессия вылезает в соседнем сервисе, которого не было в списке изменённых файлов.
-
Почему возникает. Дешёвая конфигурация отдаёт модели только унифицированный diff. Это самый дешёвый по токенам вариант и одновременно самый слепой по смыслу: видны изменённые строки, но не вызывающий код, не контракты и не тесты вокруг. Хуже другое — человек подстраивается под инструмент и тоже начинает читать только подсвеченные строки.
-
Что ломает. Сквозные изменения: правка middleware аутентификации на сорок строк выглядит чистой, а рядом ломается DTO, из которого пропал обязательный атрибут.
Пример из платёжного сервиса (Java). ledgerClient — синхронный HTTP‑клиент на Feign во внешний сервис проводок. В diff код смотрится безупречно: исключение обработано, лог есть, метод возвращает Optional.
@Transactional
public Optional<PaymentReceipt> confirm(UUID paymentId) {
Payment payment = repository.findById(paymentId).orElseThrow();
payment.markConfirmed(); // уедет в БД по коммиту транзакции
try {
ledgerClient.post(payment.toLedgerEntry()); // синхронный HTTP, Feign
} catch (FeignException e) {
log.warn("Ledger unavailable, skip posting: {}", e.getMessage());
return Optional.empty(); // транзакция при этом коммитится
}
return Optional.of(receiptFactory.from(payment));
}
Локальная транзакция БД не распространяется на HTTP‑вызов: коммит и успешное выполнение ledgerClient.post() не являются одной атомарной операцией. Исключение подавлено, метод завершается штатно, транзакция коммитится. Платёж помечен подтверждённым, проводки нет.
Отдельная проблема — семантика возврата. Что означает Optional.empty() из метода confirm()? Платёж не подтверждён? Квитанция не создана? Вызывающая сторона получает «не знаю, получилось ли», хотя состояние в базе изменено. Дефект тут не только в проглоченном исключении, а в разъехавшихся бизнес‑состояниях. Обнаружиться это может сильно позже: по сверке или по алерту на отсутствующую проводку — если такой алерт заведён.
Нормальный способ починки — не хитрый catch, а перенос внешнего вызова за границу транзакции через outbox (Java):
@Transactional
public PaymentReceipt confirm(UUID paymentId) {
Payment payment = repository.findById(paymentId).orElseThrow();
payment.markConfirmed();
// событие уходит в ТУ ЖЕ транзакцию, что и смена статуса
outbox.save(LedgerEntryRequested.from(payment, payment.idempotencyKey()));
return receiptFactory.from(payment);
}
Предполагается, что outbox.save() пишет в ту же базу и участвует в той же локальной транзакции, что и изменение Payment. Отдельный publisher работает только с уже закоммиченными записями outbox и публикует соответствующие сообщения. Дальше нужны ключ идемпотентности на стороне леджера и ретраи на стороне публикации, а для асинхронного контура — ещё и DLQ или parking lot для сообщений, которые не удалось доставить. Именно такой разговор я жду от ревьюера в платёжном сервисе — и его не будет, если в контекст ушли только изменённые строки.
Как чинить. Минимум — отдавать модели целиком, изменённые файлы. Дальше — поиск по репозиторию: определения вызываемых символов, вызывающий код, контракты, связанные тесты. Тут важно не обмануться: даже с окном на миллион токенов задача не «залить весь репозиторий», а отобрать релевантное.
Ошибка 2. AI‑ревьюер блокирует merge с первого дня
-
Симптом. Через две недели после внедрения в рабочем чате появляется вопрос «а можно этого бота отключить, он мешает».
-
Почему возникает. Кажется логичным: раз поставили проверку, пусть защищает ветку. Но пока модель ошибается, каждое ложное срабатывание — остановленный релиз.
-
Что ломает. Доверие, а с ним и весь смысл затеи. Инструмент, который шумит, начинают игнорировать. А инструмент, который игнорируют, приучает игнорировать комментарии вообще, включая человеческие.
Как чинить. Первую версию делаем неблокирующей: обязательной к запуску — да, блокирующей слияние — нет.
С чего начинать — вопрос, на котором я сам сначала ошибся. Логика «давайте со стиля, там не страшно» выглядит безопасной, но противоречит ошибке 4: стиль ловится форматтером и линтером, отдавать его модели незачем. Начинать стоит с узких категорий, где дефект формулируется достаточно однозначно, а замечание можно независимо проверить: подозрительная обработка исключений, нарушения ваших же инженерных правил, небезопасные конструкции, изменения публичных контрактов при наличии явной спецификации.
Расширять зону тоже стоит не по ощущениям. У LLM, как правило, нет надёжно калиброванной вероятности правильности, которую можно трактовать как классический порог, поэтому решение «публиковать эту категорию» я принимаю по статистике: какая доля замечаний в ней подтверждалась людьми на прошлых ревью.
Технически это выглядит так (YAML, GitLab CI):
ai-review:
stage: review
script:
- python -m aireview --pr "$CI_MERGE_REQUEST_IID" --context full-files
allow_failure: true # упрощённо: технический сбой ревью не роняет pipeline
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
Оговорюсь про allow_failure: он лишь про то, что падение job не валит pipeline. Решение «не блокировать слияние по замечаниям» живёт в логике самого ревьюера: он не выставляет статус, который branch protection считает обязательным для merge.
Право блокировать при этом заработать можно. В Cloudflare серьёзные находки и уязвимости могут становиться блокирующими для merge — но это появилось после десятков тысяч merge request и большой работы над точностью. Это финал пути, а не его начало.
Ошибка 3. Модель возвращает свободный текст вместо структурированного ответа
-
Симптом. Бот пишет складное эссе на полстраницы под pull request, и с этим эссе решительно нечего делать.
-
Почему возникает. Первый прототип почти всегда собирают так: «посмотри diff и напиши замечания». Выглядит убедительно, дальше не масштабируется.
-
Что ломает. Всё, что идёт после генерации: замечание не привязать к строкам, не разложить по критичности, не посчитать долю ложных срабатываний, не дедуплицировать при повторном запуске.
Как чинить. Требовать структурированный ответ с первого дня. Упрощённый контракт ответа — это псевдосхема, реальную придётся описать строгой JSON Schema — выглядит так (JSON):
{
"summary": "Краткая оценка изменения в 1-3 предложениях",
"comments": [
{
"text": "Что не так и как поправить",
"file_path": "src/payment/ConfirmService.java",
"line_start": 42,
"line_end": 47,
"severity": "major"
}
]
}
Допустимые значения severity: critical, major, minor, info. По ним фильтруем, по file_path раскладываем inline, по истории считаем, сколько замечаний команда реально приняла.
Небольшая история: MVP собирается за дни, доверие — за месяцы
Помню, как однажды на встрече мне сказали, что своё ревью — это квартал работы и отдельная команда. Поэтому мне была интересна публикация ребят из Content AI, где всё описано довольно честно.
MVP они собрали за три дня. На каждый pull request в CI поднимается контейнер, Python‑обвязка забирает diff и метаданные, готовит контекст, дёргает агента в неинтерактивном режиме и раскладывает ответ обратно как inline‑комментарии. Все ревьюерские знания при этом живут в промпте.
Дальше цифры из их собственного отчёта, то есть self‑reported. За первый месяц: прогон около пяти минут, около 20% комментариев нерелевантны из‑за нехватки контекста, расходы выросли примерно с пяти до пятнадцати тысяч рублей после подключения всей команды. И самый честный вывод: авторы считают, что ревью ускорилось — но допускают, что просто потому, что люди стали смотреть менее вдумчиво.
Отдельно отмечу их решение не давать агенту широкий доступ к репозиторию: отдельный технический пользователь, токен с минимальными правами.
Договорю мысль, которой в кейсах обычно не хватает. Как только ревьюер умеет не только читать diff, но и вызывать инструменты, его надо рассматривать как агента с недоверенным входом: код, комментарии, описание PR и тестовые фикстуры вполне могут содержать prompt injection в духе «игнорируй предыдущие инструкции». Минимальные права, песочница и ограничение инструментов по allowlist — часть модели угроз, а не только вопрос прав токена.
Доступ к репозиторию по возможности делаем read‑only, но сам по себе он проблему не закрывает: инъекция опасна ровно настолько, насколько широк набор инструментов, доступных агенту дальше.
У больших команд то же самое, только на другом масштабе. В Cloudflare ревьюер запускается на merge request автоматически, и они опубликовали цифры: 131 246 прогонов на 48 095 merge request в 5 169 репозиториях за первый месяц, в среднем 2,7 прогона на MR. Работает не «одна модель с большим промптом», а оркестрация: до семи специализированных ревьюеров плюс координатор, который схлопывает дубли и публикует один структурированный комментарий. Самое интересное там результат фильтрации: около 1,2 находки на прогон.
Система намеренно публикует лишь часть найденного, жертвуя полнотой ради качества опубликованных замечаний. При этом обходить её вердикт через break glass инженерам понадобилось 288 раз — 0,6% merge request.
Ошибка 4. LLM ставят на детерминированные проверки
-
Симптом. Бот сегодня ругается на кодировку файла, завтра на неё же молчит. Счёт за токены растёт, польза — нет.
-
Почему возникает. После первого успеха хочется поручить модели всё подряд. Но LLM не стоит считать детерминированным механизмом проверки: одинаковый вход не гарантирует идентичный результат во всех реализациях и настройках.
-
Что ломает. Предсказуемость проверок и бюджет. Плюс размывается ответственность: непонятно, почему одно и то же правило срабатывает нестабильно.
Как чинить. Разделить слои. Что формулируется как правило — должно быть правилом: линтер, форматтер, Semgrep. Модели оставляем то, что требует разбора предполагаемого намерения и нетривиальных зависимостей.
Намеренно упрощённая иллюстрация идеи, не готовое production‑правило (YAML, Semgrep):
rules:
- id: swallowed-exception-in-transaction
patterns:
- pattern-inside: |
@Transactional
$RET $METHOD(...) { ... }
- pattern: |
catch ($EXC $E) { log.$LEVEL(...); return ...; }
message: "Исключение проглочено внутри транзакции: состояние закоммитится частично"
languages: [java]
severity: ERROR
Шаблон узкий: он не поймает ни catch с возвратом заранее подготовленного результата, ни вариант со счётчиком метрик вместо лога, ни молчаливый return. Боевая версия потребует более точных семантических паттернов и тестов на реальные варианты кода — зато сработает одинаково каждый раз, чего от модели ждать не приходится.
Как контуры складываются вместе, показано на рисунке 2.
Главное из схемы: контуры логически независимы и могут выполняться параллельно — человек вправе открыть diff одновременно с ботом. И они не заменяют друг друга: детерминированные проверки дают повторяемость, модель — разбор предполагаемого намерения, человек — ответ на вопрос «а что мы вообще строим». Попытка закрыть один контур другим — одна из самых частых ошибок при внедрении.
Ошибка 5. Большие сгенерированные PR проходят ревью формально
-
Симптом. Pull request на 1500 строк, ревьюер листает его четыре минуты и ставит апрув. Комментариев ноль.
-
Почему возникает. Агент генерирует быстрее, чем человек читает. Раньше размер PR ограничивался усталостью автора, теперь этот ограничитель исчез.
-
Что ломает. Ревью превращается в ритуал. Болезнь не новая: и без ИИ разработчик часто смотрел на большой кусок чужой системы, думал «вроде нормально» и одобрял. ИИ просто увеличил дозу.
Как чинить. Ограничивать размер того, что приходит на ревью. У нас два правила: базовое — не больше 400 строк дельты, иначе изменение возвращается автору на разбиение; для заранее известных механических изменений (массовый rename, обновление зависимостей) действует список исключений. И второе: в описании PR автор своими словами объясняет решение и перечисляет то, что решил не делать.
Первое правило удобно сделать детерминированным (Bash, шаг в CI):
CHANGED=$(git diff --numstat "origin/$TARGET_BRANCH...HEAD"
-- . ':(exclude)**/*.lock' ':(exclude)**/generated/**'
| awk '{added+=$1; removed+=$2} END {print added+removed}')
if [ "$CHANGED" -gt 400 ]; then
echo "Дельта $CHANGED строк при лимите 400. Разбейте изменение на несколько PR."
exit 1
fi
Пример упрощённый: в нём исключены только lock‑файлы и каталог сгенерированного кода, а боевая версия должна отдельно обрабатывать бинарные и другие нетекстовые изменения, для которых --numstat возвращает прочерки, и явно исключать протобуфы, Terraform и сгенерированные клиенты. И про саму цифру оговорюсь дважды. Во‑первых, 400 — наш ориентир, а не константа: машинный код в дельту считать бессмысленно. Во‑вторых, лимит строк — предохранитель, а не оценка сложности: PR на 600 строк тестов безопаснее восьмидесяти строк, меняющих семантику распределённой транзакции. Поэтому рядом с размером живёт список зон риска — аутентификация, платежи, миграции схемы, публичные контракты, конкурентность. Попадание в них означает второго ревьюера независимо от объёма.
По сути мы гоняемся не за размером, а за тем, чтобы изменение вообще можно было отревьюить.
Маленький PR не ценен сам по себе. Ценен PR, который можно качественно проверить.
Проверяю тремя вопросами: что изменилось и зачем; какие инварианты обязаны сохраниться; какие сценарии автор проверил. Не может ответить — код на ревью не идёт. Знаю, что выглядит бюрократией, но за год ничего мягче не сработало.
Ошибка 6. Модель плодит дубли вместо переиспользования
-
Симптом. В кодовой базе появляется третий маппер, вторая схема обработки ошибок и новый сервис, повторяющий существующий слой доступа к данным:
src/main/java/com/acme/billing/
├── mapper/PaymentMapper.java # был исходно
├── payment/support/PaymentDtoMapper.java # добавил агент в марте
├── api/v2/PaymentConverter.java # добавил агент в июне
└── payment/PaymentQueryService.java # дублирует BillingRepository
-
Почему возникает. Без поиска по репозиторию и инструментов навигации модель просто не получает сигнала о том, что аналогичное решение уже есть. Ревьюер, который смотрит только на diff, тоже этого не увидит: в границах изменения код выглядит нормально.
-
Что ломает. Сопровождение. Продублированный блок создаёт налог на распространение: правя одну копию, вы обязаны найти все остальные, в файлах и доменах, которых можете не знать. Механизм согласуется с ростом дублирования на 81%, наблюдаемым в исследовании GitClear, хотя причинную связь отчёт не доказывает.
Как чинить. Дать модели инструменты навигации: поиск по символу и типу, обход caller/callee, индекс репозитория. Полный контекст здесь не нужен: нужен способ быстро ответить на вопрос «есть ли в проекте что‑то похожее». Тот же вопрос вынести отдельным пунктом в человеческий чек‑лист. И держать в репозитории два‑три эталонных примера: сервис, миграция, обработчик.
Ошибка 7. Эффект AI Code Review не измеряют
-
Симптом. На вопрос «стало ли лучше» команда отвечает «субъективно да».
-
Почему возникает. Метрики закладывают в последнюю очередь, а обычно не закладывают вовсе. Считать начинают то, что легко: количество комментариев бота в неделю.
-
Что ломает. Возможность управлять. Без базовой линии вы не отличите ускорение ревью от его деградации, а выглядят они одинаково: цикл сократился, все довольны.
Как чинить. Снять замеры до внедрения. Вот таблица, которую мы ведём у себя, цифры в колонке «было» — реальная база одной из команд за месяц до запуска:
|
Метрика |
Было |
Целевое поведение |
|---|---|---|
|
Медианное время ревью PR |
19 ч |
Снижается |
|
Время до первого комментария |
6,5 ч |
Снижается |
|
Доля замечаний, после которых действительно потребовалась правка |
— |
Растёт, порог задаём после базового замера |
|
Доля ложных срабатываний |
— |
Снижается, условие для расширения категории |
|
Дефекты, обнаруженные после merge |
11 за месяц |
Не растёт |
|
Повторные изменения того же кода в течение двух недель |
7 PR за месяц |
Не растёт, это сигнал, а не доказательство дефекта |
Ложному срабатыванию нужно определение, иначе метрика превращается в спор. У нас это замечание, которое после проверки человеком признано некорректным. Замечание, с которым разработчик не согласился, но проблема реальна, ложным не считается — для него есть категория «не требует изменений».
И сразу оговорюсь: одной доли ложных срабатываний мало. Ревьюер, который выдаёт один идеально верный комментарий на сотню PR, имеет великолепный показатель и нулевую пользу.
Поэтому в паре с ним идёт доля замечаний, после которых действительно потребовалась правка, а в горизонте месяца — дефекты, обнаруженные после слияния. Полноту, то есть recall, корректно посчитать трудно: у ревью обычно нет полного эталона всех существующих дефектов. Поэтому пропуски видны лишь приблизительно — по тому, что доехало до прода.
Маршрут внедрения показан на рисунке 3. Он разложен по шагам, но переход между ними завязан не на календарь.
Главная мысль схемы: расширение зоны доверия — не календарь, а условие. Порог по доле ложных срабатываний и по доле замечаний, приводящих к правке, задаём до пилота, а не по факту результатов.
Пока категория его не проходит, следующую не открываем. Обратная стрелка на шаг с контекстом стоит там не случайно: во многих случаях причина плохих замечаний не только модель, но и недостаток контекста.
Где этот подход не сработает
Проблема полного контекста не только в размере репозитория, хотя гигабайты выкачивать на каждое ревью долго и дорого. Даже при большом окне остаётся задача отбора: какие символы, вызывающий код, контракты и тесты нужны именно для этого изменения. Стоимость, задержка и устаревший индекс тоже никуда не деваются.
В закрытом контуре, где код нельзя отдавать наружу, приходится жить на self‑hosted моделях и своём инференсе. Качество и стоимость эксплуатации там могут заметно отличаться от коммерческих моделей, особенно на задачах с длинными рассуждениями, — это стоит замерить на своих PR до того, как строить процесс. На legacy без тестов ревьюер не заменяет отсутствующую страховку: подозрительное место подсветит, а подтвердить регрессию будет нечем.
И главное: если ревью и так было формальностью, ИИ ничего не починит, он усилит то, что есть.
Сводная таблица
|
Ошибка |
Признак в процессе |
Что проверить |
|---|---|---|
|
Ревью смотрит только на diff |
Регрессии вне изменённых файлов |
Какой контекст реально уходит в модель |
|
Блокирующий ревьюер с первого дня |
Просьбы отключить бота |
Статус шага в CI и выбор стартовой категории |
|
Ответ в свободной форме |
Нельзя посчитать долю ложных срабатываний |
Есть ли контракт ответа и severity |
|
LLM на детерминированных проверках |
Нестабильные замечания, растущий счёт |
Что из проверок выносится в правила |
|
Ревью объёма вместо решения |
Апрув за четыре минуты на 1500 строк |
Лимит дельты, зоны риска, описание решения |
|
Дубли вместо переиспользования |
Третий маппер и два способа обработки ошибок |
Есть ли у модели поиск по репозиторию |
|
Эффект не измеряют |
Ответ «субъективно лучше» |
Дефекты после merge и доля корректных замечаний |
Какой навык на самом деле проверяет этот список
Если посмотреть на все семь пунктов сразу, речь в них не про ИИ, а про умение держать границы системы в голове, когда объём изменений растёт быстрее вашего внимания.
Есть и более фундаментальное ограничение. Модель не может проверить требование, которого нет в её контексте: если в контекст передан только diff, она вынуждена проверять код в основном относительно самого этого контекста. if (amount > limit) выглядит корректно ровно до момента, пока кто‑то не откроет требование, где написано >=. Пока в контекст не попали критерии приёмки, ADR, контракт API и доменные инварианты, у части дефектов для модели просто нет наблюдаемого эталона. В платёжном сервисе это особенно заметно: вопрос «правильно ли написан метод» там менее важен, чем «сохраняются ли идемпотентность операции, защита от двойного списания и границы авторизации между ролями и арендаторами».
Отсюда вывод за год. AI Code Review не решает проблему ревью, он меняет её форму. Когда код генерируется дешевле, чем его можно прочитать, узким местом становится не написание, а верификация. И зрелое ревью — это не «подключить LLM к diff», а связка: контекст, детерминированные проверки, структурированный результат, человек и измерение качества. Как и предполагал, самой дорогой частью проекта у нас оказалась не модель, а обвязка вокруг неё: контекст, правила, работа над качеством замечаний и измерение эффекта.
Чек‑лист перед тем, как включать AI‑ревьюера:
-
базовая линия по времени ревью и дефектам, обнаруженным после merge, снята до внедрения;
-
шаг в CI обязателен к запуску и не блокирует слияние;
-
стартовая категория узкая, с объективно проверяемым результатом;
-
модель отдаёт структурированный ответ с привязкой к строкам и severity;
-
в контекст уходят изменённые файлы, связанные тесты и результаты символьного поиска;
-
детерминированные проверки живут в правилах, а не в промпте;
-
у изменения есть лимит размера, список зон риска и описание решения от автора;
-
ревьюер рассматривается как агент с недоверенным входом: доступ read‑only, инструменты ограничены allowlist, права минимально необходимые;
-
определено, что считается ложным срабатыванием, и это измеряется.
Если из всего списка вы возьмёте один пункт, возьмите первый. Без базовой линии вы не узнаете, помог инструмент или просто сделал ревью быстрее и слепее.

Когда ИИ ускоряет генерацию кода, узким местом становится уже его проверка: важно понимать, какие модели и инструменты подходят для разработки и где заканчиваются их возможности.
На бесплатных открытых уроках преподаватели‑практики OTUS покажут, как устроены локальные LLM и современные ИИ‑технологии, а также как выбирать подход под конкретные инженерные задачи.
-
3 сентября в 20:00. «Локальные LLM модели для разработки». Записаться
-
17 сентября в 20:00. «Обзор ИИ‑технологий для разработчиков. От идей до рабочих решений». Записаться
А полный список открытых уроков августа собрали в дайджесте.
Автор: sproshchaev


