Дата публикации
ai_products

Как подружиться с LLM-агентами: экономим токены и получаем более точный код

Что нового

Разработчики финтех-группы «Свой» собрали практический подход к работе с LLM-агентами (Cursor, Windsurf и похожие IDE-ассистенты), который меняет саму роль разработчика:

  1. Контекст как ресурс:

    • Контекстное окно рассматривается как «валюта».
    • Через .cursorignore вы вычищаете шумные файлы (лог‑файлы, сборки, зависимости), снижая стоимость запросов и риск галлюцинаций.
    • По опыту авторов, точность ответов возрастает на 30–40%, а расходы на API падают.
  2. Skills вместо одноразовых подсказок:

    • Вместо бесконечных промптов «сделай хорошо» вводится концепция Skills — формализованных навыков для агента.
    • Каждый Skill описывает триггер, входные данные, алгоритм работы (Chain of Thought), формат ответа, критерии качества и антипаттерны.
  3. Внешняя память для агентов:

    • Состояние работы выносится из чата в файлы проекта (plan_development.md, task-01.md и т.д.).
    • Дешёвая модель может продолжить работу дорогой, опираясь на один и тот же план.
  4. Декомпозиция задач:

    • Крупные фичи режутся на короткие планы и задачи по 15–20 строк.
    • Это уменьшает смещение «координат» в коде и снижает вероятность, что агент правит не то место.
  5. Автоматический цикл «тесты → правки → тесты»:

    • Агенту явно описывается цикл: запусти тесты → проанализируй логи → исправь код → запусти снова → повторяй до зелёных тестов.
  6. 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. Если они упадут — проанализируй логи ошибок в терминале, исправь код в соответствующих файлах и запускай снова, пока все тесты не станут зелеными».

Под капотом агент:

  1. Выполняет команду npm test.
  2. Читает вывод и ищет stack trace.
  3. Переходит к нужным файлам.
  4. Вносит правки.
  5. Снова запускает тесты.

Вы описываете целевой результат (зелёные тесты), а не отдельный шаг.

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" }
    }
  }
}

Агент запускает указанный сервер как инструмент, получает доступ к базе и может выполнять запросы, не зная деталей подключения заранее.

Что это значит для вас

Когда это полезно

  1. Вы много работаете с AI-ассистентами в IDE:

    • Cursor, Windsurf и похожие инструменты перестают быть «поиском по коду».
    • Агент начинает вести себя как разработчик-джун с чёткими инструкциями.
  2. У вас большой монорепозиторий:

    • .cursorignore режет лишнее и экономит токены.
    • Меньше ложных попаданий в нерелевантные файлы.
  3. Команда хочет стандартизировать стиль кода:

    • Skills превращают негласные правила в формальные.
    • Валидация, обработка ошибок, структура модулей — всё описано один раз и применяется автоматически.
  4. Вы делаете долгие фичи с несколькими итерациями:

    • Внешняя память (планы и таски в репозитории) сохраняет контекст между сессиями и моделями.
    • Можно спокойно переключаться между GPT‑классом, Claude‑классом или локальными LLM, не теряя нить.
  5. Нужно подключить агента к реальным данным:

    • Через MCP вы даёте LLM доступ к PostgreSQL, GitHub, документам.
    • Агент работает не в вакууме, а поверх ваших живых систем.

Где это не сработает

  • Если вы используете AI раз в неделю «дописать функцию» — затраты на настройку Skills и MCP вряд ли окупятся.
  • Если в проекте хаос и нет даже базовых правил код-стайла, формализация Skills потребует предварительной уборки.
  • Если у вас очень маленький репозиторий, выгода от .cursorignore будет минимальной.

Практические шаги

  1. Создайте .cursorignore и вычистите шум.
  2. Опишите 2–3 ключевых Skills для вашего проекта:
    • создание эндпоинтов,
    • рефакторинг legacy,
    • обработка ошибок.
  3. Заведите plan_development.md для текущей фичи и разбейте её на task-01.md, task-02.md.
  4. Добавьте в промпты циклы вида «запусти тесты → исправь → повтори».
  5. Если используете внешние данные — настроьте 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 и храните состояние во внешних файлах. Чем лучше вы проектируете контекст, тем меньше платите за токены и тем предсказуемее становится результат.


Читайте также

Как подружиться с LLM-агентами: экономим токены и получаем более точный код — VogueTech | VogueTech