← ко всем постам

Как создать ИИ-агента. Подготовка КП за 5 минут

Как создать ИИ-агента. Подготовка КП за 5 минут

Новый лид пришёл в понедельник, а коммерческое предложение вы отправили в четверг. Не потому, что кто-то ленился: собрать данные по сайту, найти конкурентов, свести находки в план работ, посчитать часы по ставкам, написать текст и сверстать его в документ, который не стыдно показать, — это полдня работы трёх человек, и делать её нужно до того, как клиент заплатил хоть рубль. К четвергу интерес остыл, а два других агентства уже ответили. Эта статья — про конвейер из девяти ролей, который проходит весь этот путь по одному адресу сайта и отдаёт готовый PDF за то время, пока вы пьёте кофе.

Что этот агент должен делать на самом деле

Одна задача, сформулированная как результат: получить URL и вернуть готовое коммерческое предложение в PDF — с реальными метриками сайта, найденными конкурентами, планом работ на четыре месяца, посчитанным бюджетом по вашим ставкам и вашей вёрсткой. Не «структуру КП», не черновик для доработки, а документ, который можно отправлять.

Чего он делать не должен: назначать цену сделки (ставки он берёт из вашей базы знаний, а не придумывает), обещать клиенту позиции в выдаче и отправлять документ сам. Скидку, финальную цифру и момент отправки решает человек.

Почему это девять ролей, а не одна

В гайде про аудит сайта роутер собирал данные шестью шагами и отдавал отчёт. Здесь задача на порядок больше: мало собрать метрики — нужно найти конкурентов, оценить их трафик, посчитать долю рынка, превратить находки в план задач, план задач — в деньги, а деньги — в текст, который читает не технический специалист. Каждый из этих переходов — отдельный тип рассуждения, и попытка описать их одной инструкцией даёт ровно то, чего вы не хотите: правдоподобный текст с выдуманными цифрами.

Роутеры: kp_generator_router · kp_competitor_finder
Сбор данных: kp_competitor_traffic · kp_tech_analyst · kp_content_auditor · kp_commercial_auditor
Расчёт и текст: kp_work_plan_composer · kp_analyst · kp_copywriter
Вёрстка: Pdf Template со слотами

Все девять — обычные роли в панели: название, задача, инструменты. У двух из них есть шаги, остальные семь — плоские субагенты, которых вызывают по имени.

Алгоритм главного роутера: восемь шагов

Шаг 1 · сырые данные
1
{clean_task}
Парсинг сайта
Текст и HTML сайта. Дальше он лежит в контексте запуска, и все аудиторы читают его оттуда — сайт не парсится заново пять раз.
Шаг 2 · вложенный роутер
2
kp_competitor_finder || {clean_task}
Вызвать субагента
У этой роли свои два шага — движок прогоняет их рекурсивно и возвращает готовый список «домен: трафик».
Шаги 3–5 · три аудита
3
kp_tech_analyst || {clean_task} {current_context}
Вызвать субагента
4
kp_content_auditor || {clean_task} {current_context}
Вызвать субагента
5
kp_commercial_auditor || {clean_task} {current_context}
Вызвать субагента
Коммерческий аудитор видит список конкурентов из шага 2 — через тот же {current_context}.
Шаги 6–7 · план работ и деньги
6
kp_work_plan_composer || {clean_task} {current_context}
Вызвать субагента
Превращает находки трёх аудитов в план на четыре месяца — задачи, направления, часы. Без денег: их считает следующий шаг.
7
kp_analyst || {clean_task} {current_context}
Вызвать субагента
Доля рынка, три сценария роста, часы × ставки, итоговый бюджет одной цифрой и срок окупаемости.
Шаг 8 · текст документа
8
ФАКТИЧЕСКИЕ ДАННЫЕ СО ВСЕХ ПРЕДЫДУЩИХ ШАГОВ: {current_context} {db_data_context} + бриф: выбор схемы, набор ключей слотов, запреты по оформлению
Вызвать субагента

Системный промпт самого роутера при этом почти пустой — вся логика живёт в шагах:

Ты — оркестратор подготовки коммерческого предложения по SEO-аудиту
сайта. Твоя единственная задача — точно передать URL сайта и любые
указанные пользователем вводные (регион, CMS, конкуренты, язык отчёта)
через все шаги без искажений.

Сам анализ и написание КП делают шаги-инструменты и субагенты — не пиши
собственных выводов и не дублируй их работу.

Если на входе не удаётся распознать URL сайта — сразу сообщи об этом и
не запускай шаги.

Почему поиск конкурентов — отдельный вложенный роутер

Это выглядит избыточно: зачем целая роль на два шага, если можно было добавить их в главный алгоритм? Причина техническая, и её стоит знать до того, как вы потратите на неё вечер.

Гугл-поиск и обычные инструменты не живут в одном вызове. У Gemini поиск — это grounding-инструмент, и он не смешивается с обычными function calls: дать одному шагу одновременно google_search и get_rapid_seo_metrics нельзя. А обычный шаг-инструмент всегда бьёт в первый URL контекста — для списка из четырёх разных доменов конкурентов это не работает. Нужен субагент со своим циклом вызовов: он получает список доменов и дёргает метрики по каждому отдельно.

Отсюда и разделение: kp_competitor_finder ищет домены поиском, а вторым шагом передаёт их kp_competitor_traffic, который вызывает метрики по каждому и возвращает строки вида «домен: оценка трафика (DR X)». Обратите внимание на инструкцию второго шага — там нет {clean_task}: субагенту не нужен исходный URL, ему нужен только список доменов, а он и так в контексте.

Данные — блоком перед брифом, а не в конце

Самая дорогая ошибка этого конвейера стоила нескольких прогонов, и выглядит она безобидно. В инструкции восьмого шага сначала идёт подробный бриф на две страницы — что писать в каждом разделе, — а в самом конце подставляются собранные данные. Логично: сначала задание, потом материал.

На практике копирайтер добросовестно следовал структуре брифа буквально и дописывал в разделы плейсхолдеры вида «уточняется» — до данных в хвосте промпта он попросту не долистывал. Лечится перестановкой: блок с цифрами идёт первым, до текста брифа.

Заодно про два плейсхолдера, которые легко перепутать. {current_context} — это выводы предыдущих шагов текущего запуска: список конкурентов, аудиты, план работ, расчёты. Без него следующий шаг их не увидит вообще. {db_data_context} — то, что осело в базе задачи напрямую, например результаты отдельных шагов-инструментов. Нужны оба.

Семь названий направлений, которые нельзя переименовывать

Составитель плана работ проставляет каждой задаче направление, а аналитик по этому направлению ищет ставку в вашей таблице тарифов. Сопоставление идёт по точному совпадению строки — и если план сказал «Tech SEO / Dev», а в таблице написано «Технический SEO», ставка просто не находится, и в КП уезжает плейсхолдер вместо цены.

Поэтому в промпте составителя список направлений задан жёстко, с требованием проверить себя перед выводом таблицы:

«Направление» — СТРОГО одно из семи: SEO-стратегия и аналитика,
Технический SEO, Контент и редактура, Разработка и внедрение, CRO и
аналитика, Link building и outreach, Проектное управление. Не
придумывай свои формулировки — следующий шаг сопоставляет направление
с таблицей ставок по точному названию, другое название = ставка
потеряна. Перед тем как выводить готовую таблицу — построчно
перепроверь себя: у КАЖДОЙ задачи «Направление» дословно совпадает с
одним из этих семи названий?

С той же стороны подстрахован и аналитик: прежде чем считать, он обязан выписать таблицу ставок из базы знаний в сам ответ. Приём выглядит странно, но работает — это проверка на себя: если модель не может выписать таблицу, значит базы знаний в промпте действительно нет, и только тогда плейсхолдер честен.

Две схемы одним вызовом: техническое КП и КП для руководителя

У предложения два читателя, и им нужны разные документы. Внутренний защитник сделки — SEO-специалист или head of e-com — хочет техническую доказательную базу, чтобы продать работы своему руководству. Сам руководитель хочет три цифры и следующий шаг.

Копирайтер вызывается один раз и пишет один документ, а какой именно — решает по формулировке исходного запроса:

ВЫБОР СХЕМЫ ОТВЕТА — реши это ПЕРВЫМ, до начала письма. Проверь
формулировку ИСХОДНОГО запроса пользователя — если в нём ЯВНО назван
получатель словом «директор», «ЛПР», «руководитель» или явным
синонимом этой роли (owner, CEO, decision maker) — используй СХЕМУ 1.
Во всех остальных случаях, включая запросы без явного указания
получателя, — СХЕМУ 2 (поведение по умолчанию). Схемы
взаимоисключающие — выведи РОВНО ОДНУ, не обе сразу и не гибрид.

То есть «подготовь КП по example.com» даёт техническое предложение на 17 страниц, а «подготовь КП по example.com для директора» — короткое на девять. Никакого второго агента и никаких изменений в конфигурации: это чистая промпт-инженерия внутри одного шага.

Разница между схемами — не в длине, а в языке. Там, где техническое КП говорит «Core Web Vitals», КП для руководителя говорит «скорость сайта, из-за которой уходят покупатели». Оба документа приложены к этой статье — откройте их рядом, разница видна с первой страницы.

Слоты: как текст модели превращается в вёрстку

Пока конвейер отдаёт «просто текст», КП выглядит как распечатка чата. Брендированный документ получается за счёт слотов: копирайтер начинает каждый раздел маркером на отдельной строке, а PDF-шаблон подставляет содержимое в свою вёрстку.

[[SLOT:lpr_position]]
Ваша доля рынка сейчас — 4%, у лидера категории — 38%…

Движок вырезает текст по маркеру и кладёт его в переменную {{ slot_lpr_position }} шаблона. Ключей два набора: 14 у технического КП (cover, inputs, domain, visibility, backlinks, technical, onpage, commercial, eeat, workplan и четыре приложения) и 8 у КП для руководителя (lpr_cover, lpr_position, lpr_cost, lpr_approach, lpr_growth, lpr_investment, lpr_case, lpr_risks).

Важное следствие: порядок страниц задаёт шаблон, а не модель. Обложка гарантированно первая, потому что так написана вёрстка, а не потому, что копирайтер не перепутал разделы. Текст без единого маркера не теряется — уходит в конец документа отдельным блоком, — но вёрстка при этом ломается, поэтому маркеры обязательны.

Главная засада: шаблон привязывается к роутеру, а не к копирайтеру

PDF-шаблон нужно привязать к kp_generator_router — той роли, которую вызвал пользователь. Привязка к kp_copywriter, чей текст реально льётся по слотам, не даёт ничего. Причина: документ собирается в фоне отложенной задачей, а она ищет шаблон по роли, которую вызвал человек, — то есть по роутеру. Настроите копирайтера идеально, а шаблон повесите на него — получите обычный проточный текст без вёрстки и полчаса недоумения.

Само поле PDF-шаблон лежит на карточке роли, там же, где галочка фонового режима. Шаблон — это HTML с вашим логотипом, цветом и подписями; акцентный цвет, логотип и название берутся из общих настроек установки, поэтому один и тот же шаблон работает на любом бренде.

Что положить в базу знаний

Конвейеру нужны три файла, и разделены они не для красоты:

  • Факты о компании — кто вы, услуги, отзывы. Большой документ, из него в контекст попадают наиболее подходящие куски.
  • Кейсы — отдельным файлом. Нужен приложению с подтверждённым опытом.
  • Ставки и гарантии — таблица «вид работ → €/час» плюс тексты про GDPR, NDA и порядок оплаты.
Маленький файл надёжнее большого. Документ до 4000 символов попадает в контекст агента целиком и при каждом вызове. Большой проходит через отбор по релевантности — и то, что не набрало баллов, на конкретном прогоне может не попасть в промпт. Именно поэтому ставки и кейсы вынесены из общего файла о компании: они нужны всегда, а не когда повезёт.

Ставки прикрепляются аналитику, все три файла — копирайтеру. Как и в гайде про копирайтера, собирайте базу из уже утверждённых материалов, а не пишите её заново.

Запреты по оформлению, без которых PDF выглядит сломанным

Отдельный блок промпта копирайтера посвящён тому, чего писать нельзя. Выглядит мелочно ровно до первого документа, ушедшего клиенту:

  • Никаких горизонтальных линеек — ни markdown, ни <hr>. Конвертер превращает их в черту посреди слота и ломает вёрстку.
  • Никаких эмодзи и декоративных символов — стрелок, галочек, кружков-маркеров. Шрифт PDF их не содержит: получаются пустые квадраты или пропадают молча.
  • Никакого LaTeX. Реальный случай: формула упущенной выгоды ушла клиенту в виде $$\text{Потерянная выручка} = … — рендерер математику не подключает и печатает запись буквально.
  • Пустая строка до и после таблицы и списка. Без неё markdown не распознаёт начало таблицы, и в PDF попадает строка |---|---| живым текстом.

Инструменты и фоновый режим

Отдельно подключать нечего: парсинг сайта, PageSpeed, метрики ссылочного профиля, проверка доступности для ИИ-ботов, поиск и вызов субагентов идут вместе с платформой — тот же набор, что в гайде по SEO-специалисту.

А вот галочку «Всегда выполнять в фоне» у главного роутера включить обязательно. Девять ролей с реальным рассуждением и вложенным суб-роутером не укладываются в таймаут обычного запроса: пользователь получает подтверждение приёма сразу, а готовый PDF прилетает отдельным сообщением.

Два примера, приложенные к статье

Оба файла ниже — настоящий вывод этого конвейера по одному и тому же сайту, без правок руками. Разница только в формулировке запроса. Техническое КП — 17 страниц с таблицами метрик, планом работ и приложениями. КП для руководителя — девять страниц: где вы сейчас, цена бездействия, подход, план роста, инвестиции, кейс, риски.

Сайт взят для примера — BBC News: крупный, публичный и заведомо не ваш клиент, поэтому на нём удобно показывать механику, ничего не раскрывая.

Смотреть их стоит рядом и с вопросом «что бы я вычеркнул перед отправкой своему клиенту» — это и есть список того, что нужно поправить в брифе под ваше агентство. Один такой пункт видно прямо в файлах.

В приложении с планом работ есть явно лишние строки. Там предлагается бюджет на ссылочное продвижение и «опционально — тематическая PBN-сеть на 50 сайтов». Для BBC News это выглядит нелепо, и в вашем КП такой строки, скорее всего, тоже быть не должно. Важно, откуда она взялась: модель её не выдумала — она записана фиксированным текстом в бриф восьмого шага и потому попадает в каждое предложение, кому бы оно ни готовилось. Лечится удалением двух строк из финального промпта: не переучиванием модели, не новой ролью и не правкой готового документа руками. Это и есть нормальный способ настройки конвейера под себя — вычёркивать из брифа то, что вы не продаёте.

Тестирование и донастройка

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

Частые ошибки

  • PDF-шаблон повешен на копирайтера. Самая частая и самая обидная: всё настроено верно, а на выходе проточный текст. Шаблон привязывается к роутеру — к роли, которую вызывает человек.
  • Данные подставлены в конец брифа. Модель дочитывает структуру раньше, чем цифры, и аккуратно расставляет «уточняется» вместо реальных значений.
  • Свои названия направлений в плане работ. Ставка ищется по точному совпадению строки: «Tech SEO» вместо «Технический SEO» — и цена в приложении превращается в плейсхолдер.
  • Ставки лежат в общем большом файле базы знаний. Иногда попадают в контекст, иногда нет, и КП выходит то с ценами, то без. Маленький отдельный файл читается целиком и всегда.
  • Фоновый режим не включён. Девять шагов не укладываются в таймаут запроса — задача обрывается на середине, и это выглядит как поломка агента.
  • Документ уходит клиенту без вычитки. Конвейер снимает часы работы, но не ответственность: цифры в предложении — это ваши обязательства, а не текст, сгенерированный моделью.

 

≈ 6 часов

≈ 24 000 ₽ экономии в месяц при 10 КП

Около шести часов уходит на одно предложение, собранное руками: поднять данные по сайту, разобраться с конкурентами, составить план работ, посчитать часы, написать текст и сверстать его в документ, который не стыдно отправить. При 10 КП в месяц это 60 часов; по полной ставке джуна, которую сайт использует везде (65 000 ₽/мес ÷ 160 ч ≈ 400 ₽/час), — около 24 000 ₽ в месяц. Подставьте свою ставку и реальные часы. Результат будет намного выше.

Максим Сафьянов
Максим Сафьянов

Я делаю Оракул: оркестратор ИИ-агентов для digital- и SEO-агентств, который разворачивается на вашем сервере — безлимит ролей, исходный код передаётся при внедрении.

Комментариев пока нет — будьте первым.