Два инструмента, с которых начинается работа с кодом
01
ИИ в разработке
02
Устройство модели
03
Инструменты ИИ
04
Основы Git
05
Ветки и слияние
06
Совместная работа
Цель лекции
Профессиональный минимум: ассистент на языковой модели и контроль версий
Инструмент усиливает того, кто понимает, что делает, и подводит того, кто не понимает. Ответственность за строку, сгенерированную моделью, остаётся на подписавшем работу.
ИИ в разработке
История, распространение и измерения
01
ИИ в разработке
Устройство модели
Инструменты ИИ
Основы Git
Ветки и слияние
Совместная работа
Хронология
развития
2012
AlexNet
победа глубоких свёрточных сетей на графических ускорителях в ImageNet
2014
GAN
убедительное порождение данных нейросетями
2017
Трансформер
статья «Attention Is All You Need»: архитектура современных моделей
2018–2020
Масштабирование
рост качества с числом параметров, объёмом данных и вычислений; GPT-2 и GPT-3
2022
ChatGPT
дообучение под диалог и удобный интерфейс к существующей модели
Пояснение
Между научной идеей и инструментом на рабочем столе проходят годы: трансформеру к выходу ChatGPT было уже пять лет.
Скорость
распространения
5
дней
понадобилось ChatGPT, чтобы набрать миллион пользователей; Instagram — около двух с половиной месяцев
2/3
разработчиков
уже применяли ИИ-инструменты в работе по опросу Stack Overflow 2024 года
1/7
разработчиков
собирались начать применять ИИ-инструменты по тому же опросу
Тот же опрос: инструментами пользуются охотно, однако коду, предложенному моделью, не доверяют и перепроверяют его.
Для физика
Инструмент, освоенный большинством коллег, становится частью профессионального минимума, как двадцать лет назад система контроля версий.
Ощущения и
измерения
Замер
19 %
медленнее выполнялись задачи с ассистентом
Ощущение участников
20 %
ускорения — по оценке тех же разработчиков
METR, 2025: опытные разработчики проектов с открытым кодом решали задачи в собственных хорошо знакомых репозиториях; ассистент разрешался или запрещался по случайному выбору.
01
Ощущение ускорения не заменяет измерения
помогает ли инструмент, устанавливается только замером
02
Выигрыш зависит от знания задачи
в незнакомой библиотеке и шаблонном коде он реален, в своём коде у эксперта — нет
Устройство модели
Токены, обучение, ошибки, агенты
02
ИИ в разработке
Устройство модели
Инструменты ИИ
Основы Git
Ветки и слияние
Совместная работа
Предсказание
следующего токена
Текст запроса
Токенизатор
Трансформер: слои внимания
Вероятности следующего токена
Выбранный токен
дописывание токена к тексту и повторение цикла
Пояснение
Диалог, генерация кода и объяснения надстроены над одной задачей: продолжить имеющийся текст.
Пояснение
Внимание позволяет связать определение функции в начале файла с её вызовом в конце.
Токены и
язык запроса
Русский, токенизатор cl100k_base: 26 токенов на 9 слов
Git
·х
ран
ит
·с
н
им
ки
·про
ект
а
,
·а
·не
·раз
лич
ия
·м
еж
д
у
·вер
с
ия
ми
.
Русский, токенизатор o200k_base: 15 токенов
Git
·хран
ит
·сним
ки
·проекта
,
·а
·не
·различ
ия
·между
·версия
ми
.
Английский, оба токенизатора: 12 токенов на 10 слов
Git
·stores
·snapshots
·of
·the
·project
,
·not
·differences
·between
·versions
.
· — пробел в начале токена. Токенизаторы OpenAI: cl100k_base (GPT-4) и o200k_base (GPT-4o).
Пояснение
Цена запроса и заполнение контекстного окна считаются в токенах: один и тот же текст на русском обходится дороже.
Обучение и его
пределы
Предобучение: месяцы на корпусе текстов из интернета — язык, факты, приёмы программирования
Дообучение: следование инструкциям и полезность в диалоге
Важно
Дата среза: о событиях после окончания обучающего корпуса модель не знает.
Важно
Модели недоступны файлы пользователя, пока они не переданы ей явно.
Уверенные
ошибки
Модель обучена порождать правдоподобное продолжение, а не истинное; механизма проверки фактов у неё нет.
01
Выдуманный аргумент функции
в документации его нет, но «логично было бы иметь»
02
Несуществующая ссылка
правдоподобный адрес статьи или страницы документации
03
Перепутанный коэффициент
формула выглядит уверенно, программа выдаёт числа
04
Несуществующая библиотека
осмысленное название; обнаруживается при первом импорте
Для физика
Несуществующая библиотека обнаруживается сразу, а перепутанный коэффициент может дойти до отчёта. Сведения ассистента о физике, численных методах и API проверяются по документации.
Демонстрация:
цепь Маркова
01
Корпус: главы книги об ИИ и Git
02
Начало корпуса
03
Текст из 40 слов
04
Второй запуск: другой текст
Что наблюдается
Каждая пара соседних слов взята из книги, поэтому текст звучит связно, но утверждения в нём порождены случаем.
root@lab — запись со стенда
Характеристики
модели
01
Размер
число параметров — от единиц миллиардов до триллионов; чем больше модель, тем тоньше улавливаемые зависимости, но тем дороже и медленнее работа
02
Контекстное окно
сколько токенов модель видит за раз, включая вопрос, файлы и ответ; детали из середины длинного контекста удерживаются хуже
03
Рассуждение
модели, порождающие промежуточные шаги, сильнее в многошаговых задачах, но отвечают дольше и стоят дороже
Пояснение
Названия моделей и цены меняются каждые несколько месяцев; сравнение по качеству, скорости и стоимости ведут независимые площадки artificialanalysis.ai и openrouter.ai.
Запрос и
контекст
Приём
Суть
Zero-shot
вопрос без примеров; достаточно для типовых задач
Few-shot
один-два примера в нужном формате
Chain-of-thought
просьба рассуждать по шагам; в рассуждающих моделях встроена
Пояснение
Качество ответа определяется не изяществом формулировки, а тем, что модель видит: нужный файл, сообщение об ошибке целиком, фрагмент документации.
Для физика
Трейсбек прикладывается целиком, а не пересказывается по памяти.
Агенты
Задача
Выбор действия моделью
Инструмент: файлы, команды, поиск
Готовый результат
вызов
результат
чтение и запись файлов, запуск команд и тестов, поиск по репозиторию
Важно
Агент выполняет команды в системе пользователя: его допускают только в репозиторий под контролем версий.
Инструменты ИИ
Формы, правила, MCP, Copilot
03
ИИ в разработке
Устройство модели
Инструменты ИИ
Основы Git
Ветки и слияние
Совместная работа
Три формы
инструментов
01
Плагин к редактору
работает в привычной среде: VS Code, JetBrains, Neovim
GitHub Copilot
02
Редактор вокруг ассистента
модель видит проект целиком; большинство таких редакторов выросло из VS Code
Cursor, Windsurf
03
Терминальный агент
работает в каталоге проекта: правит файлы, запускает тесты; подходит для кластера по SSH
Claude Code, Aider, Gemini CLI
Пояснение
Границы между формами размываются: редакторы получают агентный режим, агенты — интеграцию с IDE. Выбор определяется тем, где ведётся работа.
Глубина
вмешательства
01
Автодополнение
продолжение по ходу набора; серый текст легко принять без чтения
02
Правка выделенного
«добавь обработку ошибок», «векторизуй этот цикл»
03
Чат по проекту
вопрос со ссылками на файлы и трейсбеком
04
Агентный режим
читает файлы, вносит правки, запускает тесты и исправляется сам
меньше самостоятельности
больше самостоятельности, меньше контроля — тщательнее проверка
Правила
проекта
Файл правил в корне репозитория (пример договорённостей группы):
- Код на Python 3.12, стиль — PEP 8, длина строки 79 символов. - Единицы СИ везде, кроме энергии частиц: она в МэВ. - Массивы обрабатываем векторизованно, циклов по элементам не пишем. - Новый код сопровождается тестом в tests/. - Данные экспериментов в репозиторий не коммитим.
Пояснение
Агент добавляет файл правил к каждому запросу: договорённости группы не повторяются вручную.
Важно
Файл игнорирования исключает из передачи модели пароли, токены, персональные данные и неопубликованные сырые данные: отправленное вернуть невозможно.
MCP:
подключение инструментов
Без протокола: интеграция для каждой пары
Редактор
Агент
Чат
База данных
Вики группы
Архив установки
С MCP: одна реализация инструмента для всех клиентов
MCP
Редактор
Агент
Чат
База данных
Вики группы
Архив установки
Для физика
MCP-сервер к архиву телеметрии установки позволяет спросить у агента, что происходило с током в магнитах в ночь неудачного запуска.
Меры
предосторожности
01
Только под контролем версий
всё сделанное агентом видно в git diff и откатывается одной командой
02
Чтение перед принятием
отказаться от непонятной правки дешевле, чем впоследствии искать в ней ошибку
03
Мелкие шаги
результат задачи «вынеси в функцию и добавь тест» вычитывается, задачи «перепиши модуль» — нет
04
Разрушительные команды — за человеком
удаление файлов, git push, отправка данных наружу
05
Ответственность на разработчике
автор кода — тот, кто поставил под ним коммит
GitHub
Copilot
Плагин к редактору, дописывающий код по контексту всего файла. Первая версия вышла в 2021 году, на полтора года раньше ChatGPT.
Под тем же названием сегодня существуют чат по проекту, агентный режим, агент для командной строки и ревью pull request.
Для физика
Начинать лучше с автодополнения: оно требует меньше всего доверия к модели.
Подключение
01
Аккаунт на GitHub
02
Расширение «GitHub Copilot» в VS Code
03
Вход через GitHub по запросу расширения
04
Student Developer Pack на education.github.com: полный тариф вместо бесплатного
Приёмы
работы
Комментарий задаёт намерение, ассистент предлагает продолжение (пример из главы книги):
# Напиши функцию для расчёта среднего значения списка def calculate_average(numbers): return sum(numbers) / len(numbers) if numbers else 0
Пояснение
Управление ассистентом возможно только через контекст: открытый файл, соседние вкладки и комментарии разработчика.
01
Точная формулировка задачи в комментарии
02
Чтение предложения целиком: пустой список, деление на ноль
Каким из файлов построен третий рисунок статьи, через месяц не помнит никто, включая автора.
01
История вместо множества файлов
один processing.py, все прошлые версии — в Git; любые две сравниваются построчно
02
Воспроизводимость расчётов
хеш коммита рядом с результатом позволяет восстановить код, построивший график
03
Совместная работа
изменения нескольких человек объединяются; видно, кто, что и зачем изменил
Пояснение
Репозиторий на сервере служит и резервной копией: выход из строя диска перестаёт быть катастрофой.
Снимки, а не
различия
a4e6e8f
Добавлен расчёт энергии пучка
processing.py — новый
cdf6ff6
Добавлено описание проекта
processing.py — ссылка
README.md — новый
73315e0
Дополнено описание проекта
processing.py — ссылка
README.md — изменён
родитель
родитель
Пояснение
Коммит — снимок всего проекта с автором, датой, сообщением и ссылкой на родителя. Объект адресуется хешем SHA-1; в командах достаточно первых 6–8 символов.
Для физика
Хеш рядом с результатом делает расчёт воспроизводимым: «Рисунок 3 построен на коммите a3f2c17».
Три
состояния
Рабочий каталог
обычные файлы, которые правит разработчик
Индекс
изменения, отобранные в следующий коммит
Репозиторий .git
все зафиксированные снимки проекта
git add
git commit
git restore
git restore --staged
Пояснение
Индекс позволяет зафиксировать часть накопленных правок: исправление формулы одним коммитом, эксперименты с графиками — другим.
В репозитории хранится написанное вручную — код, тексты, конфигурации — и не хранится измеренное на установке или полученное расчётом. Сам .gitignore фиксируется в репозитории: правила общие для группы.
Демонстрация:
.gitignore
01
Каталоги data и __pycache__ с файлами
02
git status --short: два неотслеживаемых каталога
03
Два правила в .gitignore
04
В списке — только .gitignore
05
Коммит .gitignore и чистый рабочий каталог
Что наблюдается
После записи правил git status перестаёт показывать данные и кеши, а сам .gitignore попадает в репозиторий.
root@lab — запись со стенда
Ветки и слияние
Граф коммитов, merge, конфликты
05
ИИ в разработке
Устройство модели
Инструменты ИИ
Основы Git
Ветки и слияние
Совместная работа
Граф
коммитов
A
B
C
F
D
E
main
HEAD
fft-filter
01
Коммит
снимок со ссылкой на родителя; у коммита слияния F два родителя
02
Ветка
подвижный указатель на коммит, файл размером 41 байт внутри .git
03
HEAD
текущее положение в графе, обычно указывает на ветку
Работа с
ветками
Для проверки другого алгоритма фильтрации сигнала не требуется комментировать половину файла: эксперимент ведётся в ветке, названной по его сути.
git branch # список веток, звёздочка — текущая git switch -c fft-filter # создание ветки и переход на неё # ...правки и коммиты в ветке... git switch main # возврат на main и прежний вид файлов
Пояснение
git switch появился в Git 2.23; в старых руководствах те же действия выполняются командами git checkout -b fft-filter и git checkout main.
Важно
Если незафиксированные правки конфликтуют с содержимым другой ветки, git switch откажется переключаться; поэтому перед переключением правки фиксируются коммитом.
Слияние
веток
Fast-forward
A
B
D
E
main до
main
fft-filter
main без изменений: перемещение указателя вперёд, без новых коммитов
Коммит слияния
A
B
C
F
D
E
main
main с изменениями: коммит слияния F с двумя родителями
git switch main git merge fft-filter # слияние fft-filter с main git branch -d fft-filter # удаление ненужного указателя
Демонстрация:
ветки и слияние
01
Ветка fft-filter и коммит с фильтром
02
Возврат на main и правка описания
03
git merge: коммит слияния
04
git log --oneline --graph --all
05
Удаление указателя fft-filter
Что наблюдается
Граф в выводе git log повторяет схему: две линии расходятся после общего коммита и сходятся в коммите слияния.
root@lab — запись со стенда
Конфликты
слияния
В двух ветках изменена одна и та же строка integrator.py:
<<<<<<< HEAD dt = 1e-12 # шаг для жёсткой задачи ======= dt = 5e-12 # компромисс между точностью и скоростью >>>>>>> step-tuning
Пояснение
Конфликт является не ошибкой, а вопросом к разработчику: Git не выбирает вариант самостоятельно.
01
Выбор верного варианта или объединение обоих
02
Удаление маркеров
03
git add integrator.py
04
git commit: завершение слияния
Важно
git merge --abort откатывает слияние целиком, пока оно не завершено коммитом.
Демонстрация:
конфликт
01
Ветка step-tuning: шаг 5e-12
02
main: та же строка, шаг 1e-12
03
git merge: конфликт в integrator.py
04
Маркеры в файле
05
Выбор варианта, git add, git commit
06
Граф с коммитом слияния
Что наблюдается
Git останавливает слияние и ждёт решения разработчика; коммит слияния фиксирует это решение.
root@lab — запись со стенда
Совместная работа
Удалённые репозитории, fork, исправление ошибок
06
ИИ в разработке
Устройство модели
Инструменты ИИ
Основы Git
Ветки и слияние
Совместная работа
Удалённые
репозитории
Локальный репозиторий разработчика
Удалённый репозиторий: GitHub, GitLab, машина группы
Локальный репозиторий коллеги
git push
git pull
git push
git pull
git remote -v # список удалённых репозиториев git remote add origin <адрес> # привязка к серверу git push -u origin main # отправка main и запоминание связки git fetch # загрузка коммитов без изменения файлов git pull # fetch и слияние с текущей веткой
Пояснение
Ритм работы: в начале сеанса git pull, по окончании git push. Чем чаще синхронизация, тем меньше конфликтов.
Демонстрация:
удалённый репозиторий
01
Голый репозиторий ~/server/beam.git в роли сервера
02
git remote add и git push -u
03
Клон коллеги: правка и git push
04
git fetch: коммит коллеги в origin/main
05
git pull: перемотка вперёд
Что наблюдается
После git fetch рабочие файлы не изменились, а коммит коллеги уже виден в origin/main; git pull переносит его в main.
root@lab — запись со стенда
Fork и
pull request
01
Fork
кнопкой на GitHub создаётся личная копия репозитория
02
Клон и ветка
форк клонируется, в новой ветке фиксируется исправление
03
Push в форк
ветка отправляется в личную копию
04
Pull request
предложение включить коммиты: описание и дифф
05
Ревью
владельцы пишут замечания, новые коммиты обновляют PR
06
Слияние
одобренный PR вливается в основной репозиторий
Пояснение
По этой схеме работает весь open source: исправление одной строки в документации scipy проходит тот же путь. Задания курса сдаются так же.
Хорошие
практики
01
Атомарные коммиты
одно логическое изменение на коммит; проект запускается в каждом коммите
02
Сообщение с причиной изменения
заголовок до 50 символов, не более 72; что изменилось, покажет дифф
03
Большие файлы вне истории
сырые данные, HDF5, ROOT, модели — в Git LFS или DVC
04
Секреты вне репозитория
пароль, попавший в историю, удалить почти невозможно
Неинформативно
fix · fix2 · wip · изменил всякое
Информативно
Увеличен шаг сетки: старый не помещался в память на кластере
Исправление
ошибок
Ситуация
Команда
Испорченный файл
git restore file.py — потеря правок
Лишнее в индексе
git restore --staged file.py
Опечатка в сообщении или забытый файл
git commit --amend — до отправки
Отмена коммита с сохранением изменений
git reset --soft HEAD~1 — правки в индексе
Удаление последнего коммита с правками
git reset --hard HEAD~1 — потеря правок
Отмена отправленного коммита
git revert a3f2c17 — обратный коммит
Смена ветки при незаконченных правках
git stash, затем git stash pop
Пропавшие коммиты
git reflog и git reset --hard <хеш>
Важно
git reset --hard без предупреждения уничтожает незафиксированную работу: перед ним вызывается git status. Историю, уже отправленную коллегам, не переписывают.
Демонстрация:
исправление ошибок
01
Отладочная строка и git restore
02
Опечатка в сообщении и --amend
03
git reset --soft: изменения снова в индексе
04
git reset --hard HEAD~1: удаление коммита
05
git reflog и возврат по HEAD@{1}
Что наблюдается
Удалённый коммит остаётся в журнале reflog и возвращается по нему; незафиксированные правки так не восстанавливаются.
root@lab — запись со стенда
Агент в
репозитории
Коммит: точка возврата
Правки агента
git diff: чтение каждой правки
Принятие: git add -p, git commit
Отказ: git restore .
Пояснение
git add -p позволяет принять часть правок агента и отвергнуть остальные.
Важно
git restore не удаляет новые файлы, созданные агентом: их перечисляет git status.
Заключение
01
Языковая модель порождает правдоподобное продолжение, а не истинное: результат проверяется тестом и документацией.
02
Ощущение ускорения не заменяет измерения; выигрыш тем больше, чем менее знакома задача.
03
Качество ответа определяется контекстом: файлом, трейсбеком, фрагментом документации.
04
Git хранит снимки проекта, а ветки являются лёгкими указателями, поэтому эксперименты ведутся в ветках.
05
Агент работает только в репозитории под контролем версий: каждая правка видна в git diff и отменяется.
Ответственность за код несёт тот, кто поставил под ним коммит.
Домашнее задание
Генератор текста на цепи Маркова
01
Программа с двумя аргументами: имя файла с корпусом и длина результата в словах
02
Тексты на двух корпусах разных авторов, не менее ста тысяч слов каждый
03
Сравнение цепочек по два и по три слова: изменение связности и его причина
04
Случай слова, встретившегося один раз в самом конце текста
Сдача через Git
Форк репозитория задания, решение в отдельной ветке
Атомарные коммиты с сообщениями, объясняющими изменения
.gitignore, исключающий кеши Python и виртуальное окружение
Pull request с описанием решения
Объяснение на защите каждой строки, в том числе предложенной ассистентом