Как я убил рутину директолога: 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% списка до дорогих запросов.
Версия 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 прежде чем строить архитектуру поверх него. Я сделал наоборот.
Что ещё есть
Paranoid Mode — whitelist слов которые AI не трогает. Когда у клиента бренд с названием похожим на общее слово, AI без этого режима всё выбрасывает.
SERP-анализ — смотришь кто в топе, есть ли реклама (есть реклама = есть деньги в нише), related queries как бесплатные LSI от Яндекса.
AI-помощник — чат поверх файла с семантикой. Пишешь "покажи коммерческие с частотой выше 500" — получаешь отфильтрованную таблицу.
Итого
- Прогон 3000 ключей: $0.30 и 20-30 минут вместо 3-4 часов
- Точность: ~85%, остаток 5% на ручную проверку
- На выходе Excel с четырьмя листами: Подходящие, Нерелевантные, Минус-слова, Проверить
Инструмент для себя, публичного релиза пока нет.
Ссылку на статью на Хабре с техническими деталями кину в комментах — там разобрал архитектуру подробнее для тех кому интересно как устроено внутри.
Буду рад фидбеку в комментах.