Как я убил рутину директолога: AI-фильтр семантики который работает

Полгода назад у меня кончилось терпение чистить семантику руками.

Как я убил рутину директолога: AI-фильтр семантики который работает

Сделал инструмент. Думал займёт неделю. Заняло полгода.

Расскажу что вышло, через какие грабли прошёл и почему простой промпт в ChatGPT здесь не работает.

Откуда ноги растут

Стандартная боль при сборе семантики для Директа или SEO: парсишь ядро, получаешь 3000-5000 ключей. Полезных — максимум 30%. Остальное это:

  • люди которые ищут работу ("вакансия ремонт квартир")
  • агрегаторы ("авито ремонт", "профи.ру")
  • информационщики ("как сделать ремонт своими руками")
  • мусор и артефакты парсера

Минус-слова помогают, но не до конца. Руками разбирать 3000 ключей — это 3-4 часа. На каждый проект. Каждый раз.

Мне надоело.

Версия 1: просто перестать копировать из Wordstat

Начал с малого — написал скрипт который парсит Bukvarix вместо ручного копирования. Никакой архитектуры, просто цикл и файл на выходе.

Работало. Можно было остановиться.

Но данные в Bukvarix отстают на несколько месяцев. Для Директа это деньги на ветер — запускаешь рекламу на ключи с устаревшей частотностью.

Версия 2: свежие данные + первые метрики

Подключил XMLRiver — это API к Яндекс Wordstat в реальном времени, без капч. Три типа частотности: базовая, точная "!" и уточнённая [!слово !слово].

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

На этом можно было остановиться второй раз. Не остановился.

Версия 3: кластеризация и неочевидная ловушка

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

Добавил кластеризацию через SentenceTransformers. И сразу нашёл проблему: "Ремонт квартир Москва" и "Ремонт квартир Воронеж" семантически похожи, модель их объединяет. А это две разные страницы.

Решил через SERP Veto — смотрю пересечение URL в ТОП-10 Яндекса. Меньше 2 общих URL — разные кластеры, даже если смысл одинаковый. Плюс гео-изоляция: разные города = разные кластеры всегда.

Ещё выяснил что делать SERP-запросы до дедупликации — дорого и медленно. Bukvarix возвращает кучу морфологических дублей:

ремонт квартир

ремонт квартиры

ремонт квартире

квартир ремонт

Пересобрал порядок: сначала чистим и схлопываем дубли через rapidfuzz + pymorphy2, потом идём за SERP. На реальных данных убирает 30-40% списка до дорогих запросов.

Как я убил рутину директолога: AI-фильтр семантики который работает

Версия 4: AI-фильтрация

Окей, семантика собрана и сгруппирована. Мусор никуда не делся.

Попробовал простой промпт: "оставь коммерческие, удали мусор". Не сработало — DeepSeek без контекста не знает что такое "бригада" в моей нише.

Добавил PlannerAgent — отдельный агент который сначала анализирует нишу и генерирует примеры для классификатора:

Целевой клиент — частное лицо, нанимающее бригаду. Он НЕ является: человеком ищущим работу, покупателем материалов.


ПОДХОДЯЩИЕ: "ремонт квартиры под ключ"


НЕПОДХОДЯЩИЕ: "работа ремонт квартир", "авито ремонт"

Целевой клиент — частное лицо, нанимающее бригаду. Он НЕ является: человеком ищущим работу, покупателем материалов. ПОДХОДЯЩИЕ: "ремонт квартиры под ключ" НЕПОДХОДЯЩИЕ: "работа ремонт квартир", "авито ремонт"

Стало лучше. Но тут я замерил стабильность и расстроился.

37.7% стабильности — это провал

Прогнал один датасет из 671 ключа три раза подряд:

Стабильные (все 3 прогона одинаково): 253 (37.7%) Нестабильные (2 из 3): 166 (24.7%)

Одноразовые (1 из 3): 252 (37.6%)

На трети датасета результат хуже монетки. Даже при temperature=0.

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

Решение — Ensemble Voting: прогоняем каждый батч три раза параллельно, берём большинство. Ничья идёт в отдельный лист "Проверить", потом арбитражный агент разбирает их отдельно.

До: 37.7% стабильных классификаций

После: ~85%

Токенов тратится в 3 раза больше. Но 3000 ключей с тремя голосами стоят $0.30. За задачу которая раньше занимала 4 часа — нормально.

Главный урок который обошёлся дорого

После всего этого — параллельность, ансамбль, арбитр — обнаружил что "ремонт квартир под ключ" с частотностью 45 661 стабильно улетал в ПРОВЕРИТЬ.

Флагманский коммерческий запрос. В мусор.

В промпте было правило: "оставляй если содержит цену, стоимость, заказ, гео". "Под ключ" не содержит ничего из этого. Три агента не могли договориться потому что все трое работали по одному сломанному правилу.

Фикс — три строки в промпте.

Урок: валидируй промпт на edge cases прежде чем строить архитектуру поверх него. Я сделал наоборот.

Как я убил рутину директолога: AI-фильтр семантики который работает

Что ещё есть

Paranoid Mode — whitelist слов которые AI не трогает. Когда у клиента бренд с названием похожим на общее слово, AI без этого режима всё выбрасывает.

SERP-анализ — смотришь кто в топе, есть ли реклама (есть реклама = есть деньги в нише), related queries как бесплатные LSI от Яндекса.

AI-помощник — чат поверх файла с семантикой. Пишешь "покажи коммерческие с частотой выше 500" — получаешь отфильтрованную таблицу.

Итого

  • Прогон 3000 ключей: $0.30 и 20-30 минут вместо 3-4 часов
  • Точность: ~85%, остаток 5% на ручную проверку
  • На выходе Excel с четырьмя листами: Подходящие, Нерелевантные, Минус-слова, Проверить

Инструмент для себя, публичного релиза пока нет.

Ссылку на статью на Хабре с техническими деталями кину в комментах — там разобрал архитектуру подробнее для тех кому интересно как устроено внутри.

Буду рад фидбеку в комментах.

1
1
8 комментариев