- Дата публикации
Как подружиться с LLM-агентами: экономим токены и получаем более точный код
Что нового
Разработчики финтех-группы «Свой» собрали практический подход к работе с LLM-агентами (Cursor, Windsurf и похожие IDE-ассистенты), который меняет саму роль разработчика:
-
Контекст как ресурс:
- Контекстное окно рассматривается как «валюта».
- Через
.cursorignoreвы вычищаете шумные файлы (лог‑файлы, сборки, зависимости), снижая стоимость запросов и риск галлюцинаций. - По опыту авторов, точность ответов возрастает на 30–40%, а расходы на API падают.
-
Skills вместо одноразовых подсказок:
- Вместо бесконечных промптов «сделай хорошо» вводится концепция Skills — формализованных навыков для агента.
- Каждый Skill описывает триггер, входные данные, алгоритм работы (Chain of Thought), формат ответа, критерии качества и антипаттерны.
-
Внешняя память для агентов:
- Состояние работы выносится из чата в файлы проекта (
plan_development.md,task-01.mdи т.д.). - Дешёвая модель может продолжить работу дорогой, опираясь на один и тот же план.
- Состояние работы выносится из чата в файлы проекта (
-
Декомпозиция задач:
- Крупные фичи режутся на короткие планы и задачи по 15–20 строк.
- Это уменьшает смещение «координат» в коде и снижает вероятность, что агент правит не то место.
-
Автоматический цикл «тесты → правки → тесты»:
- Агенту явно описывается цикл: запусти тесты → проанализируй логи → исправь код → запусти снова → повторяй до зелёных тестов.
-
Model Context Protocol (MCP):
- Агент подключается к внешним источникам (например, PostgreSQL) через единый протокол.
- Конфигурация MCP описывается в
mcp-config.jsonи не требует дообучения модели.
В сумме это переводит работу с LLM из режима «умный поиск» в режим управляемого агента, который работает по вашим правилам и внутри вашей архитектуры.
Как это работает
Контекстная гигиена и .cursorignore
LLM-ассистент в IDE индексирует проект и тратит токены на всё, что видит. Если в индексе лежат node_modules, артефакты билдов и логи, модель платно «читает» мусор и путается.
Решение — завести файл .cursorignore (аналог .gitignore) и явно перечислить, что не нужно индексировать:
# Убираем шум для экономии токенов и точности индексации
node_modules/
dist/
build/
.next/
*.log
data/*.csv
.git/
После этого агент работает только с релевантным кодом и конфигурацией. Это уменьшает размер контекста и снижает вероятность галлюцинаций, потому что модель не пытается учитывать тонны нерелевантных данных.
Skills: программируем поведение агента
Skill — это не код, а структурированная инструкция в системных настройках (Custom Instructions) ассистента. Он описывает, когда и как агент должен действовать.
Структура Skills:
- Область активации (Trigger): чёткое условие, когда навык включается.
- Входные данные (Context): что агент обязан прочитать перед началом работы.
- Алгоритм (Process): пошаговая логика, часто в формате Chain of Thought — сначала анализ, потом план, потом код.
- Формат ответа: JSON, Markdown-шаблон, структура файлов и т.п.
- Критерии качества (Quality Bar): чек-лист для самопроверки.
- Антипаттерны: что делать нельзя (например, не использовать глобальные переменные).
Пример Skills для рефакторинга API в системных инструкциях:
### SKILL: API_REFACTORING
- Trigger: При обнаружении эндпоинтов без валидации входных данных.
- Context: Всегда читай `src/schemas/validation.ts` перед правками.
- Process: 1. Опиши проблему в комментарии.
2. Предложи схему Zod.
3. Интегрируй валидатор в контроллер.
- Quality Bar: Код должен проходить `npm run lint` и не содержать `any` .
LLM перестаёт импровизировать и начинает следовать вашему внутреннему стандарту.
Внешняя память вместо «короткого чата»
LLM-агенты живут в пределах одного контекстного окна. Сменили модель, очистили чат, IDE перезапустилась — и агент теряет историю.
Авторы предлагают хранить состояние в самом проекте:
plan_development.md— общий план фичи.task-01.md,task-02.md— мелкие, атомарные задачи.
Пример plan_development.md:
# План: Интеграция Stripe Checkout
Статус: [В процессе]
## Выполнено:
- [x] Создан файл `services/stripe.ts`.
## Текущая задача (Step 2):
- Реализовать вебхук для обработки `payment_intent.succeeded`.
- Использовать секретный ключ из `.env.local`.
## Ограничения:
- Не менять логику в `orders/db.ts`.
Агент каждый раз читает этот файл перед работой и продолжает с актуального шага, даже если вы сменили модель или IDE.
Декомпозиция: задачи по 15–20 строк
Когда вы даёте агенту огромный план и большой файл, индексы строк плавают: после первых правок всё смещается, и следующие изменения попадают не туда.
Решение:
- Делить план на короткие файлы задач.
- В каждом файле держать небольшой фрагмент кода и конкретную цель.
LLM проще держать в голове 15–20 строк и один чёткий шаг, чем 500 строк и три фичи сразу.
Автоматический цикл обратной связи (Loop)
Агент — это не только генерация текста, но и действия в терминале. Эффективный сценарий: вы описываете полный цикл, а не отдельную команду.
Пример команды для автономной работы:
«Запусти тесты
npm test. Если они упадут — проанализируй логи ошибок в терминале, исправь код в соответствующих файлах и запускай снова, пока все тесты не станут зелеными».
Под капотом агент:
- Выполняет команду
npm test. - Читает вывод и ищет stack trace.
- Переходит к нужным файлам.
- Вносит правки.
- Снова запускает тесты.
Вы описываете целевой результат (зелёные тесты), а не отдельный шаг.
Model Context Protocol (MCP)
MCP — это стандарт, через который LLM-агент подключается к внешним сервисам как к инструментам. Например, к PostgreSQL.
Конфигурация задаётся в mcp-config.json:
{
"mcpServers": {
"database-explorer": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-postgres"],
"env": { "DATABASE_URL": "postgresql://user:pass@localhost:5432/db" }
}
}
}
Агент запускает указанный сервер как инструмент, получает доступ к базе и может выполнять запросы, не зная деталей подключения заранее.
Что это значит для вас
Когда это полезно
-
Вы много работаете с AI-ассистентами в IDE:
- Cursor, Windsurf и похожие инструменты перестают быть «поиском по коду».
- Агент начинает вести себя как разработчик-джун с чёткими инструкциями.
-
У вас большой монорепозиторий:
.cursorignoreрежет лишнее и экономит токены.- Меньше ложных попаданий в нерелевантные файлы.
-
Команда хочет стандартизировать стиль кода:
- Skills превращают негласные правила в формальные.
- Валидация, обработка ошибок, структура модулей — всё описано один раз и применяется автоматически.
-
Вы делаете долгие фичи с несколькими итерациями:
- Внешняя память (планы и таски в репозитории) сохраняет контекст между сессиями и моделями.
- Можно спокойно переключаться между GPT‑классом, Claude‑классом или локальными LLM, не теряя нить.
-
Нужно подключить агента к реальным данным:
- Через MCP вы даёте LLM доступ к PostgreSQL, GitHub, документам.
- Агент работает не в вакууме, а поверх ваших живых систем.
Где это не сработает
- Если вы используете AI раз в неделю «дописать функцию» — затраты на настройку Skills и MCP вряд ли окупятся.
- Если в проекте хаос и нет даже базовых правил код-стайла, формализация Skills потребует предварительной уборки.
- Если у вас очень маленький репозиторий, выгода от
.cursorignoreбудет минимальной.
Практические шаги
- Создайте
.cursorignoreи вычистите шум. - Опишите 2–3 ключевых Skills для вашего проекта:
- создание эндпоинтов,
- рефакторинг legacy,
- обработка ошибок.
- Заведите
plan_development.mdдля текущей фичи и разбейте её наtask-01.md,task-02.md. - Добавьте в промпты циклы вида «запусти тесты → исправь → повтори».
- Если используете внешние данные — настроьте MCP.
Место на рынке
Подход, который описывает финтех-группа «Свой», не привязан к конкретной модели — его можно использовать с GPT‑линейкой, Claude‑линейкой, локальными LLM и встроенными ассистентами IDE.
По сути, это надстройка над любым LLM:
- По стоимости: экономия достигается за счёт уменьшения контекста и снижения числа повторных запросов. Конкретные проценты зависят от тарифа провайдера, но авторы видят 30–40% роста точности ответов при одновременном снижении расходов.
- По качеству: выигрыш не в «умности» модели, а в том, что она работает по вашим правилам и использует меньше шумных данных.
- По применимости: подход одинаково подходит для коммерческих API (GPT‑класс, Claude‑класс) и для локальных моделей, если IDE или агент поддерживают ignore-файлы, системные инструкции и MCP.
Если вы уже платите за мощные модели, этот слой управления контекстом позволяет выжать из них больше — не за счёт апгрейда LLM, а за счёт архитектуры вокруг неё.
Как запустить: практические примеры
1. Настройка .cursorignore
В корне проекта создайте файл .cursorignore:
# Убираем шум для экономии токенов и точности индексации
node_modules/
dist/
build/
.next/
*.log
data/*.csv
.git/
Перезапустите индексирование в Cursor или другом ассистенте, чтобы новый список исключений применился.
2. Добавление Skills в системные инструкции
Откройте настройки Custom Instructions в вашем ассистенте (например, Cursor) и добавьте Skill:
### SKILL: API_REFACTORING
- Trigger: При обнаружении эндпоинтов без валидации входных данных.
- Context: Всегда читай `src/schemas/validation.ts` перед правками.
- Process: 1. Опиши проблему в комментарии.
2. Предложи схему Zod.
3. Интегрируй валидатор в контроллер.
- Quality Bar: Код должен проходить `npm run lint` и не содержать `any` .
Дальше в диалоге можно писать: «Применить SKILL: API_REFACTORING к src/api/orders.ts».
3. Организация внешней памяти
Создайте plan_development.md в корне или в docs/:
# План: Интеграция Stripe Checkout
Статус: [В процессе]
## Выполнено:
- [x] Создан файл `services/stripe.ts`.
## Текущая задача (Step 2):
- Реализовать вебхук для обработки `payment_intent.succeeded`.
- Использовать секретный ключ из `.env.local`.
## Ограничения:
- Не менять логику в `orders/db.ts`.
Разбейте шаги на task-01.md, task-02.md и просите агента: «Открой task-02.md и выполни шаги из него, обновив статус в файле».
4. Пример команды с циклом тестов
В чате с агентом в IDE используйте формулировки с полным циклом:
«Запусти тесты
npm test. Если они упадут — проанализируй логи ошибок в терминале, исправь код в соответствующих файлах и запускай снова, пока все тесты не станут зелеными».
5. Настройка MCP для PostgreSQL
Создайте файл mcp-config.json:
{
"mcpServers": {
"database-explorer": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-postgres"],
"env": { "DATABASE_URL": "postgresql://user:pass@localhost:5432/db" }
}
}
}
После этого агент сможет использовать database-explorer как инструмент для работы с вашей базой, если ваш клиент LLM поддерживает MCP.
Итог
Работа с LLM-агентами перестаёт быть магией и превращается в инженерную задачу: вы управляете вниманием модели, кодируете опыт команды в Skills и храните состояние во внешних файлах. Чем лучше вы проектируете контекст, тем меньше платите за токены и тем предсказуемее становится результат.