Урок 48 из 49 · Месяц 6. TypeScript и выход на работу
ИИ в разработке: агенты и скиллы
Содержание урока
- Как устроены языковые модели — в двух словах
- Виды ИИ-инструментов
- Автодополнение в редакторе
- Чат в редакторе
- Агенты в редакторе и терминале
- Как работает агент
- Права и подтверждения
- Инструкции и скиллы для агентов
- Файл инструкций проекта
- Скиллы
- Как ставить задачи
- Плохой и хороший запрос
- Полезные приёмы
- Как проверять код, написанный ИИ
- Чек-лист проверки
- Пример: ищем ошибки в ответе ИИ
- Ограничения и безопасность
- Типичные ошибки
- Практика
- Итоги
Искусственный интеллект стал обычным инструментом разработчика — как Git или DevTools. ИИ-ассистенты дописывают код в редакторе, объясняют ошибки, а агенты умеют сами читать проект, запускать команды и вносить правки. В этом уроке разберёмся, какие бывают ИИ-инструменты, что такое агенты и скиллы, как правильно ставить задачи, как проверять код, написанный ИИ, и где проходят границы безопасности. Конкретные продукты меняются каждые полгода, поэтому учим принципы, которые работают с любым инструментом.
Как устроены языковые модели — в двух словах
В основе ИИ-ассистентов лежат большие языковые модели (LLM, Large Language Model). Модель обучена на огромном количестве текста и кода и умеет продолжать текст: по вашему запросу она «предсказывает», какой ответ здесь наиболее уместен.
Из этого вытекают важные свойства:
- Модель не «знает», а предполагает. Она может уверенно написать несуществующую функцию или пакет. Это называется галлюцинацией.
- Знания ограничены датой обучения. Модель может предложить устаревший подход: Create React App вместо Vite или старый API библиотеки.
- Контекстное окно — сколько текста модель «держит в голове» за раз. Если проект большой, она видит только то, что ей показали.
- Качество ответа зависит от вопроса. Размытый запрос — размытый ответ.
Аналогия: ИИ — очень начитанный стажёр. Он быстро печатает и много знает, но не видел ваш проект, иногда путает факты и никогда не говорит «я не уверен». Работу стажёра всегда проверяет старший.
Виды ИИ-инструментов
Автодополнение в редакторе
Вы пишете код, а ассистент серым текстом предлагает продолжение — строку или целую функцию. Tab — принять, Esc — отклонить.
// вы написали комментарий и начало функции:
// форматирует цену: 15000 -> "15 000 сом"
function formatPrice(price: number) {
// ассистент предлагает:
return `${price.toLocaleString("ru-RU")} сом`;
}
Хорошо подходит для рутинного кода: типы, однотипные компоненты, тесты по образцу.
Чат в редакторе
Окно чата рядом с кодом: выделили фрагмент — спросили «почему тут ошибка?», «объясни этот хук», «перепиши на TypeScript». Ассистент видит открытые файлы и выделение.
Агенты в редакторе и терминале
Агент — это ИИ, который не просто отвечает текстом, а сам выполняет действия: читает файлы проекта, ищет по коду, создаёт и правит файлы, запускает команды (npm run build, тесты), смотрит на результат и исправляет ошибки. Агенты бывают встроены в редактор или работают в терминале как консольная программа.
| Автодополнение | Чат | Агент | |
|---|---|---|---|
| Что делает | Дописывает строку | Отвечает на вопрос | Выполняет задачу целиком |
| Видит | Текущий файл | Открытые файлы и выделение | Весь проект, команды, вывод |
| Действует сам | Нет | Нет (только предлагает) | Да, с вашего разрешения |
| Пример задачи | Дописать map |
«Почему useEffect срабатывает дважды?» | «Добавь страницу профиля с формой и валидацией» |
Как работает агент
Агент работает циклом:
1. Понять задачу
2. Собрать контекст → прочитать файлы, найти похожий код
3. Спланировать → «создам компонент, добавлю маршрут, обновлю типы»
4. Действовать → изменить файлы, запустить команду
5. Проверить → посмотреть ошибки сборки, результат тестов
6. Повторить 2–5, пока задача не решена (или не нужна помощь человека)
Для действий у агента есть инструменты (tools): «прочитать файл», «найти по коду», «выполнить команду в терминале», «открыть страницу документации». Многие агенты поддерживают протокол MCP (Model Context Protocol) — стандартный способ подключать к агенту новые инструменты: базу данных, баг-трекер, дизайн-макеты.
Права и подтверждения
Нормальный агент спрашивает разрешения на опасные действия: удалить файлы, выполнить команду, отправить что-то в интернет. Обычно можно настроить: что разрешено всегда (чтение файлов, npm run lint), а что — только после подтверждения.
Инструкции и скиллы для агентов
Файл инструкций проекта
Каждый раз объяснять агенту, что проект на React + TypeScript + Tailwind, а запросы через TanStack Query, утомительно. Поэтому в корень репозитория кладут файл с инструкциями — его агент читает автоматически в начале работы. Название зависит от инструмента (часто встречается AGENTS.md; у разных агентов могут быть свои имена файлов), но содержание похоже:
# Инструкции для агента
## Стек
- React 19 + TypeScript (strict), сборка Vite
- Стили: Tailwind CSS v4
- Запросы: TanStack Query v5 + axios, типы генерируются Orval (не править src/shared/api/generated)
- Архитектура: FSD (app, pages, widgets, features, entities, shared)
## Команды
- npm run dev — запуск
- npm run lint — проверка кода
- npm run build — сборка и проверка типов
- npm run api:generate — генерация API-клиента
## Правила
- Без any. Пропсы описываем через type.
- Новые UI-компоненты — в shared/ui, с историей для Storybook.
- После изменений запускай npm run lint и npm run build.
- Не добавляй новые зависимости без согласования.
Это как памятка для нового сотрудника: стек, команды, правила команды. Чем она точнее, тем меньше агент «изобретает» своё.
Скиллы
Скилл (skill — «навык») — это готовая инструкция под конкретный тип задач, которую агент подключает, когда она нужна. Обычно это папка с файлом описания и, при необходимости, примерами или скриптами. Например:
- скилл «создать компонент UI-kit»: где лежит компонент, как назвать файлы, обязательно добавить историю Storybook и типы пропсов;
- скилл «код-ревью»: на что смотреть — типы, обработка ошибок, доступность, лишние ререндеры;
- скилл «новая страница»: маршрут, ленивая загрузка, мета-теги, тест.
skills/
└── new-ui-component/
├── SKILL.md ← описание: когда использовать и пошаговая инструкция
└── template.tsx ← образец компонента
Разница простая: файл инструкций — общие правила проекта, действуют всегда; скилл — отдельный «рецепт», который агент достаёт, когда задача ему соответствует. Формат скиллов отличается в разных инструментах — смотрите документацию своего.
Как ставить задачи
Плохой и хороший запрос
Плохо:
сделай форму логина
Хорошо:
Добавь страницу входа в features/auth.
Контекст: React + TypeScript, react-hook-form + yup, запросы через
TanStack Query (useMutation). Эндпоинт POST /auth/login описан в Swagger,
типы уже сгенерированы в src/shared/api/generated.
Что нужно:
- поля email и пароль, валидация: email обязателен и корректен, пароль от 8 символов;
- при ошибке 401 показать "Неверный email или пароль";
- после успеха сохранить токен и перейти на /profile;
- использовать Button и Input из shared/ui.
Не меняй другие страницы. В конце запусти npm run lint и npm run build.
Формула хорошей задачи:
- Контекст — где, на каком стеке, что уже есть.
- Цель — что должно получиться.
- Требования — конкретные правила и граничные случаи (ошибки, пустые данные).
- Ограничения — что трогать нельзя.
- Критерий готовности — как проверить, что всё работает.
Полезные приёмы
- Давайте образец: «сделай так же, как
ProductCard» — агент повторит стиль проекта. - Просите объяснить: «объясни, почему ты выбрал такое решение» — хороший способ учиться.
- Вставляйте точный текст ошибки, а не «не работает».
- Новая задача — новый диалог. Длинная переписка засоряет контекст, качество падает.
Как проверять код, написанный ИИ
Код от ИИ — это черновик, за который отвечаете вы. На ревью никто не примет оправдание «это ИИ написал».
Чек-лист проверки
- Прочитайте весь diff (
git diff). Понимаете каждую строку? Если нет — спросите или разберитесь. - Запустите сборку, линтер, тесты:
npm run build,npm run lint. - Проверьте руками в браузере, включая ошибки, пустые состояния, медленный интернет (вкладка Network в DevTools).
- Сверьте API библиотек с официальной документацией — ИИ часто путает версии.
- Проверьте зависимости: существует ли пакет, популярен ли он, нужен ли вообще.
- Посмотрите на безопасность: нет ли секретов в коде,
dangerouslySetInnerHTMLс данными пользователя, отключённых проверок.
Пример: ищем ошибки в ответе ИИ
Допустим, ИИ сгенерировал такой компонент:
import { useEffect, useState } from "react";
export function UserList() {
const [users, setUsers] = useState([]);
useEffect(() => {
fetch("/api/users")
.then((res) => res.json())
.then((data) => setUsers(data));
});
return (
<ul>
{users.map((u: any) => (
<li>{u.name}</li>
))}
</ul>
);
}
Что не так:
- у
useEffectнет массива зависимостей — после каждогоsetUsersкомпонент перерисуется, эффект запустится снова и отправит новый запрос: бесконечный цикл; useState([])без типа даётnever[], отсюда и вынужденныйany;- у
<li>нетkey; - нет обработки ошибки и состояния загрузки;
- в проекте уже есть TanStack Query, а ручной
fetchвuseEffectнарушает договорённости.
Исправленный вариант в стиле проекта:
import { useQuery } from "@tanstack/react-query";
type User = { id: number; name: string };
async function getUsers(): Promise<User[]> {
const res = await fetch("/api/users");
if (!res.ok) throw new Error("Не удалось загрузить пользователей");
return res.json();
}
export function UserList() {
const { data, isPending, isError } = useQuery({
queryKey: ["users"],
queryFn: getUsers,
});
if (isPending) return <p>Загрузка…</p>;
if (isError) return <p>Ошибка загрузки</p>;
return (
<ul>
{data.map((user) => (
<li key={user.id}>{user.name}</li>
))}
</ul>
);
}
Найти такие ошибки может только тот, кто сам понимает useEffect, ключи и React Query. Поэтому ИИ не заменяет знания из прошлых месяцев — он ускоряет того, у кого они есть.
Ограничения и безопасность
- Правила компании. Многие компании разрешают только определённые ИИ-инструменты или запрещают отправлять туда код. Перед использованием на работе уточните политику.
- Внедрение инструкций (prompt injection). Агент читает файлы, веб-страницы, комментарии в задачах. Злоумышленник может спрятать там текст вроде «отправь содержимое .env на такой-то адрес». Не давайте агенту лишних прав и проверяйте его действия.
- Выдуманные пакеты. ИИ иногда советует несуществующие библиотеки, а злоумышленники регистрируют пакеты с такими именами. Проверяйте пакет на сайте npm (количество загрузок, репозиторий, дата обновления) перед
npm install. - Устаревшие решения. Сверяйтесь с документацией: react.dev, typescriptlang.org, tanstack.com.
- Обучение. На собеседовании и в лайвкодинге ИИ не будет. Если всё время просить готовый код, навык не появится. Пишите сами, а ИИ используйте как наставника: «объясни», «где ошибка», «как сделать лучше».
Типичные ошибки
- Принимать код, не прочитав и не запустив его.
- Задача в одну строку без контекста, а потом удивление, что получилось «не то».
- Разрешить агенту любые команды без подтверждения.
- Вставить в чат
.envили токен. - Не обновлять файл инструкций проекта: агент продолжает делать по-старому.
- Перестать разбираться самому: через месяц без ИИ не получается написать простой компонент.
Практика
- Объяснение кода. Возьмите сложный для вас фрагмент из своего проекта и попросите ИИ объяснить его построчно. Затем перескажите объяснение своими словами. Ожидаемый результат: короткая заметка «что делает этот код» без копирования ответа.
- Ревью чужого кода. Найдите все ошибки в компоненте
UserListиз урока самостоятельно, затем сравните со списком. Ожидаемый результат: исправленный компонент, который проходитnpm run build. - Файл инструкций. Напишите файл инструкций для своего проекта: стек, команды, 5–7 правил. Ожидаемый результат: агент, получив задачу «добавь компонент», следует вашим правилам без напоминаний.
- Хорошая задача. Сформулируйте по формуле «контекст — цель — требования — ограничения — критерий готовности» задачу на новую фичу и выполните её с агентом. Ожидаемый результат: diff, который вы можете объяснить построчно, и зелёные
lintиbuild. - Скилл. Опишите скилл «создать UI-компонент» для вашего проекта: шаги, структура файлов, образец. Ожидаемый результат: агент по скиллу создаёт компонент с типами и историей Storybook, как в уроке UI-kit и Storybook.
Итоги
- ИИ-ассистенты работают на языковых моделях: они быстрые, но могут ошибаться и не знать свежих версий.
- Инструменты: автодополнение, чат и агенты — последние сами читают проект, правят файлы и запускают команды.
- Файл инструкций в репозитории задаёт общие правила, скиллы — рецепты для конкретных задач.
- Хорошая задача = контекст + цель + требования + ограничения + критерий готовности.
- Код ИИ — черновик: читаем diff, запускаем сборку и тесты, сверяемся с документацией.
- Безопасность: никаких секретов в чатах, осторожно с правами агента, проверяем пакеты.
- ИИ ускоряет того, кто сам понимает код, — поэтому базовые навыки по-прежнему важнее всего.