SEO как агентская задача
Почему SEO — одна из лучших задач для автоматизации агентами
Масштаб против качества
SEO — это дисциплина, в которой работа делится на два принципиально разных типа: механические операции над данными (сбор позиций, аудит ссылок, генерация отчётов) и стратегические суждения (выбор приоритетов, формирование голоса бренда, оценка рисков). Первый тип идеально подходит для агентов — он структурирован, повторяем и масштабируем. Второй требует бизнес-контекста и человеческой экспертизы.
Цифры говорят сами за себя: агент проверяет 10 000 URL за несколько минут, тогда как опытный SEO-специалист потратит на ту же задачу несколько дней. При этом качество механической проверки у агента не ниже — он не устаёт, не пропускает строки в таблице, не делает опечаток при копировании данных.
Однако агент не заменяет SEO-экспертизу. Он усиливает её: берёт на себя рутинный объём, освобождая специалиста для задач, где важно понимание — стратегия, бренд, интерпретация аномалий, кризисный менеджмент. Это и есть ключевой принцип агентного SEO: агент — инструмент, а не замена эксперту.
Три зоны автоматизируемости
Не все SEO-задачи одинаково поддаются автоматизации. Полезно разделить их на три зоны:
Полная автоматизация
Агент выполняет задачу от начала до конца без участия человека.
- Rank tracking (мониторинг позиций)
- Keyword data fetch (сбор данных по ключевым словам)
- Broken link checks (проверка битых ссылок)
- Performance monitoring (мониторинг скорости/Core Web Vitals)
- Sitemap генерация
- Автоматическая отчётность
Augmentation (агент + человек)
Агент выполняет объём, человек принимает решения.
- Написание контента (LLM генерирует → редактор проверяет)
- Link prospecting (агент находит кандидатов, человек выбирает)
- Технический аудит (агент находит проблемы, человек приоритизирует)
Остаётся человеку
- SEO-стратегия — требует знания бизнес-целей, рынка, конкурентной позиции
- Brand voice — тональность и стиль определяет команда бренда
- Кризисный менеджмент — резкое падение трафика требует контекстного суждения
- E-E-A-T сигналы — оценка авторитетности и экспертизы требует качественного анализа
График ниже показывает ROI автоматизации для восьми репрезентативных SEO-задач по шкале от 0 до 10:
Цветовое кодирование: ▮ Зелёный — высокий ROI, полная автоматизация; ▮ Жёлтый — средний ROI, augmentation (агент + человек); ▮ Красный — низкий ROI, задача остаётся человеку.
Типы SEO-агентов
Агентные системы в SEO делятся на несколько функциональных типов — каждый решает свой класс задач:
- Data-collector — собирает данные из API (Search Console, Ahrefs, Semrush, PageSpeed Insights), парсит SERP, агрегирует метрики в таблицы. Базовый строительный блок большинства SEO-систем.
- Auditor — сканирует сайт, выявляет технические проблемы (404, дубли, missing meta, медленные страницы), формирует приоритизированный список находок для SEO-специалиста.
- Content-generator — использует LLM для написания черновиков, оптимизации title/description, генерации семантического ядра. Работает в паре с редактором.
- Monitor — отслеживает изменения в реальном времени: падение позиций, появление новых конкурентов, изменения алгоритма. Отправляет алерты при аномалиях.
- Orchestrator — координирует работу остальных агентов, управляет очередью задач, агрегирует результаты в единый отчёт. Самый сложный тип — требует надёжного планирования и обработки ошибок.
Проверьте себя
Агентский стек для SEO
Четыре слоя: от источников данных до готового результата
Архитектура стека
Любой SEO-агент состоит из четырёх слоёв. Каждый слой решает свою задачу — важно понимать их границы, чтобы правильно выбирать инструменты.
1. Data Sources
- Google Search Console API — позиции, CTR, клики, импрессии по каждому запросу и странице. Единственный официальный источник данных от Google.
- SERP APIs (SerpAPI, DataForSEO, Bright Data) — реальная выдача Google в реальном времени: топ-10, featured snippets, PAA.
- Ahrefs / Semrush API — бэклинки, keyword difficulty, органический трафик конкурентов.
- Веб-краулеры —
requests + BeautifulSoupдля статических сайтов,Scrapyдля масштаба,Playwrightдля JS-сайтов (рендеринг в браузере).
2. Processing
- Парсинг HTML — извлечение title, h1, meta description, canonical, structured data.
- Нормализация данных — приведение URL к единому виду, очистка текста, удаление HTML-тегов.
- Дедупликация — выявление дублей страниц и ключевых слов.
- Хранение —
SQLiteдля старта и прототипов,PostgreSQLдля production-нагрузки.
3. Agent Logic
- LLM — Claude API, GPT-4o, Ollama (локально). Мозг агента: анализирует, рассуждает, формирует рекомендации.
- Промпт-инжиниринг — системный промпт с контекстом сайта, ролью и форматом вывода.
- Tool use / function calling — агент сам вызывает GSC API, SERP API, краулер в нужный момент.
- Память — сохранение предыдущего состояния (прошлые позиции, история изменений) для сравнения динамики.
4. Output
- Отчёты — Markdown или JSON с конкретными рекомендациями и приоритетами.
- Задачи в трекер — автоматическое создание тикетов в Jira или Linear.
- CMS API — публикация оптимизированного контента напрямую в WordPress, Strapi, Contentful.
- Алерты — уведомления в Telegram или Email при резком падении позиций.
Минимальный Python-агент
Вот скелет простейшего SEO-агента. В реальном проекте каждая функция расширяется, но структура остаётся той же:
import anthropic
import sqlite3
from datetime import datetime
# --- 1. Data Sources ---
def fetch_gsc_data(site_url: str, days: int = 28) -> list[dict]:
"""
Возвращает топ-страницы из Google Search Console API.
Требует: google-auth, google-api-python-client
Scope: googleapis.com/auth/webmasters.readonly
"""
# ... инициализация credentials ...
# ... вызов searchanalytics.query(...) ...
return [
{"page": "/blog/seo-guide", "clicks": 320, "position": 4.2},
# ...
]
def fetch_serp(keyword: str) -> dict:
"""
Реальная выдача через SerpAPI / DataForSEO.
"""
# import serpapi; результаты top-10
return {"organic_results": [...]}
# --- 2. Processing ---
def normalize_pages(raw_data: list[dict]) -> list[dict]:
"""Дедупликация URL, нормализация позиций."""
seen = set()
result = []
for row in raw_data:
url = row["page"].rstrip("/")
if url not in seen:
seen.add(url)
result.append({**row, "page": url})
return result
def save_to_db(conn: sqlite3.Connection, rows: list[dict]) -> None:
conn.execute("""
CREATE TABLE IF NOT EXISTS pages
(page TEXT, clicks INT, position REAL, date TEXT)
""")
for row in rows:
conn.execute(
"INSERT INTO pages VALUES (?,?,?,?)",
(row["page"], row["clicks"], row["position"],
datetime.today().isoformat())
)
conn.commit()
# --- 3. Agent Logic ---
client = anthropic.Anthropic()
def analyze_pages(pages: list[dict]) -> str:
"""LLM анализирует данные и генерирует рекомендации."""
data_str = "\n".join(
f"- {p['page']}: позиция {p['position']:.1f}, кликов {p['clicks']}"
for p in pages[:20] # топ-20
)
message = client.messages.create(
model="claude-sonnet-4-6" # актуальный ID: проверьте docs.anthropic.com,
max_tokens=1024,
system=(
"Ты SEO-аналитик. Анализируй позиции страниц, "
"выявляй возможности роста, давай конкретные приоритеты."
),
messages=[{
"role": "user",
"content": f"Данные GSC за 28 дней:\n{data_str}\n\n"
"Выдай топ-5 рекомендаций в формате Markdown."
}]
)
return message.content[0].text
# --- 4. Output ---
def save_report(text: str, path: str = "report.md") -> None:
with open(path, "w", encoding="utf-8") as f:
f.write(f"# SEO-отчёт {datetime.today().date()}\n\n{text}")
print(f"Отчёт сохранён: {path}")
# --- Main ---
if __name__ == "__main__":
conn = sqlite3.connect("seo.db")
raw = fetch_gsc_data("example.com")
pages = normalize_pages(raw)
save_to_db(conn, pages)
report = analyze_pages(pages)
save_report(report)
fetch_gsc_data на реальный вызов API, добавьте логирование — и у вас уже рабочий агент. Усложнять можно постепенно.
Выбор инструментов
SERP API: сравнение по цене и возможностям
SerpAPI
- Free tier: 100 запросов/мес — только для прототипа
- Платный план: от $50/мес за 5 000 запросов
- Простой API, хорошая документация
- Поддержка Google, Bing, YouTube, Maps
DataForSEO
- Pay-as-you-go: от $0.0006 за запрос
- Широкое покрытие: 50+ поисковых систем
- Bulk API для большого объёма
- Подходит для production с непредсказуемым трафиком
Bright Data
- Специализация: сложные JS-сайты, обход защиты
- Выше по цене, но надёжнее при масштабе
- Подходит для агентов, работающих с динамическим контентом
LLM: выбор модели для SEO-агента
Claude Sonnet — оптимальный выбор
GPT-4o — альтернатива от OpenAI
Ollama — локальный запуск (бесплатно)
Калькулятор стоимости агентского стека
При 10 000 запросов/мес полный стек обходится около $30/мес — меньше одного часа работы SEO-специалиста. Рассчитайте свой сценарий:
Проверьте себя
Технический аудит сайта
Агент-аудитор: находить, приоритизировать, сообщать
Чеклист технического SEO
Агент-аудитор последовательно проверяет каждый из этих пунктов при обходе сайта:
- robots.txt и sitemap.xml — файлы доступны, синтаксис корректен, sitemap зарегистрирован в GSC
- Статус индексации — нет нежелательных
noindex;canonicalуказывает на правильные URL - Broken links (4xx / 5xx) — все внутренние ссылки возвращают 2xx
- Дублированный контент — одинаковые или почти одинаковые страницы без canonical приводят к каннибализации
- Core Web Vitals — LCP ≤ 2.5 сек, CLS ≤ 0.1, INP ≤ 200 мс (прямые факторы ранжирования Google)
- HTTPS и mixed content — весь контент загружается по HTTPS, нет HTTP-ресурсов на HTTPS-странице
- Мобильная адаптация — viewport meta присутствует, контент не обрезается на экранах < 375 px
- Structured Data / Schema.org — разметка валидна, охватывает ключевые типы сущностей
- Alt тексты у изображений — каждое значимое изображение имеет описательный
alt - Мета-теги —
title50–60 символов,description120–158 символов, уникальны на каждой странице - Глубина вложенности страниц — важные страницы доступны не более чем за 3 клика от главной
- Orphan pages — ни одна индексируемая страница не лишена входящих внутренних ссылок
Архитектура агента-аудитора
crawl(url) → fetch_page(url) # скачать HTML, статус, заголовки → check_all(page): [findings] # прогнать все 12+ проверок → prioritize(findings): # priority = severity × traffic_impact → generate_report(findings) # JSON / Markdown / HTML-отчёт → notify(report) # Slack / email / Jira ticket
Инструменты краулера
Базовый краулер для статического HTML. Быстро, без зависимостей браузера.
JS-рендеринг для SPA и React-сайтов. Видит то, что видит реальный браузер.
Промышленный краулер для крупных сайтов при наличии лицензии.
Приоритизация находок
Сырой список из сотен находок бесполезен. Агент-аудитор применяет формулу:
- Severity (1–5): 5 = прямой фактор ранжирования Google, 1 = косметическая правка
- Traffic Impact (1–5): 5 = затрагивает весь сайт, 1 = одна страница
- Итоговый диапазон: 1–25
Примеры приоритетов
| Находка | Severity | Traffic Impact | Priority |
|---|---|---|---|
| LCP > 4 сек (Core Web Vitals fail) | 5 | 5 | 25 |
| Mixed content (HTTP на HTTPS) | 4 | 5 | 20 |
| Дубли страниц без canonical | 4 | 4 | 16 |
| Broken links (4xx) | 3 | 3 | 9 |
| Отсутствует H1 | 3 | 3 | 9 |
| Alt тексты у изображений | 2 | 2 | 4 |
- 5 — прямой фактор ранжирования Google (Core Web Vitals, noindex, robots.txt block)
- 4 — значимый технический сигнал (дублированный контент, HTTPS/mixed content)
- 3 — умеренное влияние (broken links, отсутствие H1, meta description)
- 2 — косметика с минимальным SEO-влиянием (alt текст, мелкие schema-ошибки)
- 1 — не влияет на ранжирование (стилевые несоответствия, избыточные теги)
Калькулятор приоритета находки
Проверьте себя
Keyword Intelligence
Кластеризация, intent mapping и поиск gap-возможностей
Классификация ключевых слов
Прежде чем агент приступит к работе с семантикой, ему нужна таксономия ключевых слов — единая система классификации по длине и по намерению. Без неё кластеризация не имеет смысла: агент не знает, каким страницам назначать найденные слова.
По длине запроса
Head keywords
1–2 слова. Высокий объём (>10 000 / мес), сложность KD > 70. Огромная конкуренция — нереалистичная цель для нового сайта.
python, SEO, купить телефон
Body keywords
3–4 слова. Средний объём и сложность. Хороший баланс, но всё ещё высокая конкуренция в большинстве ниш.
купить iPhone 15, курс по SEO
Long-tail keywords — sweet spot для нового сайта
5+ слов. Объём < 500 / мес, KD < 30. По отдельности дают немного трафика, но тысячи таких запросов в сумме перекрывают одно head-ключевое слово — и продвигаться по ним несравнимо легче.
как выбрать SEO-агентство для интернет-магазина в 2025
По намерению (Search Intent)
Search intent — это цель пользователя за запросом. Агент, неправильно определивший intent, назначит ключ на неправильный тип страницы и контент никогда не выйдет в топ — даже при высоком техническом качестве.
Информационный
Пользователь хочет узнать.
"как работает SEO""что такое PageRank"
→ статьи, гайды, FAQ
Навигационный
Пользователь ищет конкретный сайт.
"ahrefs войти""google search console"
→ брендовые страницы
Коммерческий
Пользователь сравнивает варианты.
"лучший SEO-инструмент""ahrefs vs semrush"
→ обзоры, сравнительные таблицы
Транзакционный
Пользователь готов купить.
"купить semrush""цена ahrefs подписка"
→ продуктовые страницы, PLP
Семантическая кластеризация
Агент собирает тысячи ключевых слов, но без группировки это просто шум. Кластеризация превращает плоский список в карту будущей структуры сайта: каждый кластер — одна страница (или раздел).
Традиционный N-gram overlap
Объединяет ключи, которые содержат одинаковые слова. Быстро, без ML, работает на любом железе.
Минус: не понимает синонимы. «Ноутбук» и «лэптоп» попадут в разные кластеры.
Embeddings + k-means
sentence-transformers преобразует каждый запрос в вектор → cosine similarity → k-means кластеризация по семантической близости.
Плюс: ловит синонимы и перефразировки. Минус: требует GPU / облачного API.
Выход агента после кластеризации — карта кластеров с предложением по структуре сайта: «Кластер "покупка iPhone" (42 ключа, avg KD 35) → создать раздел /shop/iphone/ с 1 категорийной и 4 продуктовыми страницами».
Keyword Gap Analysis
Gap Analysis — это поиск ключевых слов, по которым конкурент уже ранжируется, а вы — нет. Это готовые к захвату позиции: спрос подтверждён, релевантность доказана конкурентом, ваша задача — создать лучшую страницу.
Алгоритм агента
- Fetch доменных ключевых слов конкурента через Ahrefs / Semrush API
- Fetch ваших доменных ключевых слов
- Set difference:
competitor_kw - your_kw→ список gap-ключей - Сортировка по формуле приоритета:
Volume / (KD + 1) - Фильтрация по matching intent — подбор нужного типа страниц
- Вывод топ-N в отчёт с рекомендациями по контенту
«Sweet spot» в gap-анализе — ключи с высоким Volume + низким KD + matching intent под существующие страницы или страницы, которые легко создать. Агент умеет автоматически выделять этот квадрант.
Пример Python-псевдокода:
# gap_analysis.py — псевдокод агентного Gap Analysis
import requests
AHREFS_TOKEN = "..."
def fetch_domain_keywords(domain: str) -> set[str]:
"""Возвращает множество ключевых слов домена через Ahrefs API."""
# GET api.ahrefs.com/v3/site-explorer/organic-keywords
resp = requests.get(
AHREFS_TOKEN, # endpoint вынесен в конфиг
params={"target": domain, "limit": 10000},
headers={"Authorization": f"Bearer {AHREFS_TOKEN}"}
)
resp.raise_for_status()
return {row["keyword"] for row in resp.json()["keywords"]}
def fetch_kw_metrics(keywords: list[str]) -> dict:
"""Получает Volume и KD для списка ключевых слов."""
# POST api.ahrefs.com/v3/keywords-explorer/overview
resp = requests.post(
AHREFS_TOKEN, # endpoint вынесен в конфиг
json={"keywords": keywords},
headers={"Authorization": f"Bearer {AHREFS_TOKEN}"}
)
resp.raise_for_status()
return {r["keyword"]: r for r in resp.json()["keywords"]}
def gap_analysis(your_domain: str, competitor_domain: str, top_n: int = 50):
your_kws = fetch_domain_keywords(your_domain)
competitor_kws = fetch_domain_keywords(competitor_domain)
gap_kws = list(competitor_kws - your_kws) # разница множеств
metrics = fetch_kw_metrics(gap_kws)
# Сортировка: высокий объём, низкая сложность — сначала
ranked = sorted(
gap_kws,
key=lambda kw: metrics.get(kw, {}).get("volume", 0)
/ (metrics.get(kw, {}).get("kd", 100) + 1),
reverse=True
)
return [
{
"keyword": kw,
"volume": metrics[kw]["volume"],
"kd": metrics[kw]["kd"],
"intent": metrics[kw].get("intent", "unknown"),
"score": metrics[kw]["volume"] / (metrics[kw]["kd"] + 1),
}
for kw in ranked[:top_n]
if kw in metrics
]
if __name__ == "__main__":
results = gap_analysis("yoursite.com", "competitor.com", top_n=50)
for r in results:
print(f"{r['score']:6.1f} Vol={r['volume']:5d} KD={r['kd']:2d} "
f"[{r['intent'][:4]}] {r['keyword']}")
Карта ключевых слов
Scatter-карта «Volume vs Difficulty» — главный визуальный инструмент приоритизации. Каждая точка — ключевое слово; пунктирные линии делят пространство на квадранты.
Проверьте себя
Запросы «купить iPhone 15 Pro Max», «цена iPhone 15 Pro Max», «где купить iPhone 15 Pro Max дешевле» — какой у них search intent?
- A) Информационный
- B) Навигационный
- C) Транзакционный / коммерческий
- D) Образовательный
Контентный агент
От ключевого слова до готовой SEO-статьи за один пайплайн
6-этапный пайплайн
Контентный агент не пишет статью за один вызов — он проходит шесть последовательных этапов, каждый из которых сужает контекст и повышает качество результата.
Целевое ключевое слово, кластер смежных запросов и search intent — информационный, транзакционный или навигационный.
Агент создаёт бриф: тема, целевая аудитория, структура H1/H2/H3, тональность, анализ конкурентов в топ-10.
Агент генерирует полное оглавление и ключевые тезисы каждого раздела на основе брифа.
Агент пишет полный текст статьи, строго следуя утверждённому outline. Каждый раздел — отдельный вызов или один большой промпт.
Агент проверяет: ключ в H1 и meta title, плотность 1–2%, длина title 50–60 симв., meta description 120–158 симв.
Человек проверяет факты, соответствие бренд-голосу и публикует. Единственный обязательный ручной шаг.
System Prompt: что внутри
Качество контентного агента на 80% определяется системным промптом. Вот обязательные компоненты:
- Целевое ключевое слово и LSI-слова — явным списком, чтобы агент знал, какие варианты использовать естественно.
- Search intent — что именно хочет пользователь: узнать (информационный), купить (транзакционный) или найти сайт (навигационный).
- Требуемая структура — H1 с ключевым словом, 4–5 H2, обязательный вывод/CTA.
- Ограничения-запреты — НЕ выдумывать статистику без источников, НЕ использовать ключ чаще 2% от объёма текста.
- Примерная длина — 1000–1500 слов для информационного контента, 500–800 для транзакционного.
Шаблон системного промпта (псевдокод):
Ты SEO-копирайтер. Напиши статью строго по параметрам.
ЦЕЛЕВОЙ ЗАПРОС: {target_keyword}
LSI-СЛОВА: {lsi_list}
INTENT: {intent_type} # informational | transactional
СТРУКТУРА:
H1: обязательно содержит {target_keyword}
H2 x 4-5: {h2_list}
Заключение: краткое резюме + призыв к действию
ОГРАНИЧЕНИЯ:
- НЕ придумывать статистику без ссылки на источник
- Плотность ключевого слова: 1-2% от текста
- Длина: {min_words}-{max_words} слов
META:
title: 50-60 символов, содержит {target_keyword}
description: 120-158 символов, призыв кликнуть
АУДИТОРИЯ: {audience_description}
ТОНАЛЬНОСТЬ: {tone} # formal | conversational | expert
Когда агент, когда редактор
Агент справится сам
- Long-tail контент с низкой конкуренцией
- Programmatic SEO — тысячи однотипных страниц (города, товары, категории)
- Технические описания с чёткой структурой
- FAQ-страницы и глоссарии
Редактор обязателен
- YMYL-контент (здоровье, финансы, юридическое)
- E-E-A-T материалы с личным опытом автора
- Экспертные статьи со свежими данными
- Бренд-голос с уникальной тональностью
Стоимость контент-пайплайна
Рассчитайте реальную стоимость производства контента при вашем масштабе.
Проверь себя
Что нельзя включать в system prompt контентного агента для SEO-статьи о смартфонах?
SERP-мониторинг и ссылочный профиль
Агент следит за позициями и backlinks — и бьёт тревогу первым
SERP-мониторинг
Поисковые позиции меняются каждый день. Мониторить их вручную — значит всегда узнавать об изменениях с опозданием. Агент-монитор решает это системно.
Что отслеживать
Ранжирование в органике — базовый сигнал. Отслеживать ежедневно по приоритетным ключам.
Google Search Console даёт реальные клики и impressions. Позиция стабильна, а CTR падает? Заголовок или сниппет требует доработки.
Featured Snippet, People Also Ask, Local Pack — занимают место над органикой. Потеря сниппета = падение CTR даже при той же позиции.
Пороги аномалий
- Падение > 20% трафика за день — немедленная диагностика: algo update или техническая проблема
- Падение позиции > 10 мест за день по одному ключу — проверить конкурентов и свежий контент на странице
- Падение по всем ключам одновременно — скорее всего robots.txt / noindex или Google algo update
Волатильность рынка в целом отслеживают инструменты MozCast и SERPoscope — если их индексы высокие, "штормит" не только ваш сайт.
Агент-монитор: псевдокод
# Агент-монитор позиций (cron: каждые 24ч)
def serp_monitor_agent(keywords: list, threshold_drop: int = 5):
state = load_state("serp_positions.json") # предыдущие позиции
alerts = []
for keyword in keywords:
current_pos = fetch_position(keyword) # GSC API / DataForSEO
prev_pos = state.get(keyword, current_pos)
drop = current_pos - prev_pos # положительное = хуже
if drop > threshold_drop:
alerts.append({
"keyword": keyword,
"prev": prev_pos,
"current": current_pos,
"drop": drop,
"severity": "HIGH" if drop > 15 else "MEDIUM"
})
state[keyword] = current_pos # обновить состояние
save_state("serp_positions.json", state)
if alerts:
# Дополнительный контекст: проверить MozCast
volatility = fetch_mozcast_score()
context = "algo-update likely" if volatility > 80 else "site-specific issue"
send_alert(alerts, context=context)
return alerts
Динамика позиций за 30 дней
На графике ниже: чем ниже линия — тем выше позиция в поиске (позиция 1 лучше позиции 25).
Ссылочный профиль
Backlinks — один из ключевых факторов ранжирования Google с момента появления PageRank. Ссылки передают "авторитет" (link equity) от одного домена к другому.
Метрики качества ссылки
0–100, логарифмическая
0–100, логарифмическая
качество ссылочного пути
уникальные домены-доноры
Токсичные ссылки и риски
Признаки токсичных ссылок:
- Домены с DR < 5 и нерелевантной тематикой
- Один и тот же anchor text в сотнях ссылок (over-optimized anchors)
- Ссылки с форумных подписей, комментариев, каталогов низкого качества
- Внезапный прирост сотен ссылок за короткий период (ссылочный взрыв)
Link Gap Analysis
Link Gap — домены, с которых ссылаются на конкурентов, но не на вас. Это готовый список перспектив для получения ссылок.
# Агент: анализ ссылочного профиля + link gap
def link_profile_agent(my_domain: str, competitors: list):
# 1. Получить backlinks через API (Ahrefs / Semrush)
my_backlinks = fetch_backlinks(my_domain)
comp_backlinks = {c: fetch_backlinks(c) for c in competitors}
# 2. Скорить домены-доноры
scored = []
for link in my_backlinks:
score = compute_link_score(
dr=link["domain_rating"],
tf=link["trust_flow"],
relevance=link["topical_relevance"] # 0..1
)
scored.append({**link, "score": score})
# 3. Фильтровать токсичные (score < 0.2)
toxic = [l for l in scored if l["score"] < 0.2]
healthy = [l for l in scored if l["score"] >= 0.2]
if toxic:
build_disavow_file(toxic) # -> disavow.txt для Google
# 4. Link Gap: домены конкурентов, которых нет у нас
my_domains = {l["domain"] for l in healthy}
gap_domains = set()
for comp, links in comp_backlinks.items():
for link in links:
if link["domain"] not in my_domains:
gap_domains.add(link["domain"])
# 5. Приоритизировать проспекты по DR
prospects = sorted(gap_domains,
key=lambda d: get_dr(d), reverse=True)[:50]
return {
"healthy_links": len(healthy),
"toxic_links": len(toxic),
"prospects": prospects
}
Проверь себя
Оркестрация SEO-пайплайнов
Как собрать все воркеры в единую систему с надёжными триггерами
Паттерн оркестратор-воркеры
В агентской SEO-системе оркестратор — это центральный агент-координатор. Он не выполняет задачи сам: получает задачу, декомпозирует её на подзадачи, раздаёт воркерам и собирает результаты. Воркеры — специализированные агенты, каждый знает свою область.
Параллельный запуск воркеров существенно сокращает общее время выполнения: пока KeywordWorker собирает данные, AuditorWorker краулит сайт.
class SEOOrchestrator:
def route_task(self, task_type, complexity):
"""Выбор модели по типу задачи (интеграция с M10)."""
if complexity == 'high' or task_type in ('strategy', 'eeat', 'competitive'):
return 'claude-opus-4' # frontier — глубокий анализ
elif task_type in ('content', 'audit', 'monitor'):
return 'claude-sonnet-4-6' # workhorse — контент и аудит
else:
return 'claude-haiku-4-5' # bulk — массовая обработка
async def run(self, task: SEOTask):
# Декомпозиция задачи
subtasks = self.decompose(task)
# Параллельный запуск воркеров
results = await asyncio.gather(
self.auditor.run(subtasks.audit),
self.keyword.run(subtasks.keywords),
self.monitor.run(subtasks.serp),
)
# Агрегация и принятие решений
plan = self.aggregate(results)
# HITL-проверка перед необратимыми действиями
if plan.requires_human_approval:
await self.request_approval(plan)
else:
await self.execute(plan)
Типы триггеров
Пайплайн запускается тремя способами — каждый подходит для своего сценария:
- Ежедневный SERP-мониторинг (06:00)
- Еженедельный аудит (понедельник)
- Ежемесячный сводный отчёт
0 6 * * * serp_monitor.py- Новая страница опубликована → keyword + audit check
- Позиции упали на 20% → алерт + причинный анализ
- Конкурент вышел в топ-3 → пересмотр контента
- По запросу менеджера — разовый аудит
- Срочный анализ конкурента
- Проверка перед запуском рекламной кампании
Интерактивный пайплайн
Нажмите на любой блок, чтобы узнать подробнее о его роли в системе.
Human-in-the-loop: когда обязателен
Автоматизация не означает полное отсутствие человека. Есть сценарии, где HITL обязателен — когда действие необратимо, репутационно рискованно или может уронить сайт.
Обработка ошибок и управление состоянием
Устойчивость к ошибкам
delay = base * (2 ** attempt)
# 1s → 2s → 4s → 8s
# для API 429 / 503
Что хранить между запусками (State)
Пайплайн должен «помнить» предыдущие запуски — без этого невозможно обнаружить аномалии и тренды.
| Что хранить | Формат | Зачем |
|---|---|---|
| Позиции по ключевым словам | SQLite / JSON |
Тренды, аномалии, алерты на падение |
| Список проиндексированных URL | SQLite |
Инкрементальный краулинг, дедупликация |
| Результаты аудита | JSON |
Сравнение «до/после», отслеживание прогресса |
| Статус задач / DLQ | SQLite |
Retry-логика, ручной разбор ошибок |
Проверь себя
Оценка и итерация
KPI, anti-patterns и путь от курса к первому рабочему агенту
KPI для SEO-агентов
Метрики делятся на два уровня: операционные (система работает правильно) и бизнес (система приносит пользу).
Операционные KPI
| KPI | Формула | Цель | Источник |
|---|---|---|---|
Coverage |
% страниц аудировано | ≥ 95% | Краулер |
Error Rate |
# ошибок / # запусков | < 2% | Логи |
Latency |
Время воркфлоу | < 30 мин | Оркестратор |
Cost/Action |
$ / единица работы | Тренд вниз | API биллинг |
Бизнес KPI
| KPI | Формула | Цель |
|---|---|---|
Organic Traffic Growth |
% рост MoM | ≥ 5% MoM |
Avg Position Improvement |
Δ avg_pos | Тренд вниз |
Content Conversion Rate |
Конверсии / визиты с SEO | ≥ 2% |
Indexed Pages Growth |
# проиндексированных страниц | Тренд вверх |
A/B тесты контента
Что тестировать: meta title, H1, вводный абзац, CTA.
Процесс:
- Агент генерирует вариант B (альтернативный title / H1).
- Публикуешь рядом или по расписанию — два URL или ротация.
- Ждёшь 2–4 недели, GSC собирает CTR по каждому варианту.
- Агент мониторит CTR → обнаруживает победителя (ΔCTR > порог) → рекомендует (или автоматически применяет) лучший вариант.
Anti-patterns — что убивает систему
robots.txt или canonical-теги — сайт может полностью выпасть из индекса за часы. Любые необратимые действия с индексированием — только через Human-in-the-Loop.
- Hallucinated facts — агент выдумывает статистику и цитаты. Google E-E-A-T штрафует сайты с недостоверным контентом → потеря доверия и позиций.
- Keyword stuffing — избыточное насыщение ключами. Google Panda filter → понижение всего сайта в выдаче.
- Duplicate content — агент генерирует похожие статьи без проверки на уникальность. Каннибализация — оба URL теряют позиции, Google не знает, какой ранжировать.
- Blind scaling — публикация 500 статей без контроля качества. Массовый low-quality контент → возможный Manual Action от Google.
-
Missing HITL — агент меняет
robots.txt/ canonical без проверки человека. Сайт выпадает из индекса. Необратимые действия — только через подтверждение.
ROI SEO-автоматизации
Рассчитай, сколько экономит агентская система по сравнению с ручным SEO.
5 шагов к первому рабочему агенту
-
Выбрать ОДНУ задачу.
Лучший старт — rank monitoring: нет необратимых действий, быстрый feedback, легко проверить результат вручную.
-
Собрать минимальный стек.
GSC API + Claude API — меньше $5/мес для старта. Никаких сложных инфраструктур на первом этапе.
-
Запустить на 50–100 ключевых словах.
Вручную проверить первые результаты. Убедиться, что данные корректны, логика правильная, нет hallucinations.
-
Добавить второй воркер.
Аудит страниц или keyword gap analysis — задачи с высоким ROI и низким риском.
-
Итерировать по данным.
Что работает в топ-15% → изучить паттерн → обновить промпты и топик-листы → масштабировать. Повторять каждые 4–6 недель.
Проверь себя
AI-поиск и GEO
Как изменить SEO-стратегию, когда поиск уходит в AI-ответы
Что происходит с поиском
За 2024–2026 годы поисковая выдача претерпела структурный сдвиг: AI-сгенерированный ответ появляется над органическими результатами, и пользователь всё реже доходит до синих ссылок.
Появляются в 40–60% информационных запросов. Пользователь получает сводку прямо в SERP и зачастую не кликает дальше.
Featured Snippet, PAA (People Also Ask) и AI Overview дают ответ без перехода. Органический клик по информационному запросу стал редкостью.
Perplexity — цитирует источники. ChatGPT Search, Bing Copilot — самостоятельные поисковые поверхности с многомиллионной аудиторией.
GEO — новый термин, новая логика
GEO (Generative Engine Optimization) — оптимизация не под клик пользователя, а под цитирование AI-движком. Цель: стать источником, который Perplexity, Google AI Overview или ChatGPT Search включит в свой ответ.
Как AI выбирает источники
- E-E-A-T (Experience / Expertise / Authoritativeness / Trustworthiness) — Google и LLM-движки выше доверяют авторитетным доменам с явными экспертами.
- Структурированные данные — FAQ schema, HowTo schema, Article schema помогают парсеру AI вычленить структуру.
- Цитируемость — сколько других авторитетных ресурсов ссылается на страницу.
- Авторитетность домена — Domain Rating / Domain Authority как прокси надёжности.
Форматы контента, которые AI предпочитает
В первом абзаце — ответ на запрос.
AI легко цитирует шаги и перечни.
Вопрос–ответ — идеальный формат для snippet.
Статистика с указанием первоисточника повышает trust-score.
Вероятность AI Overview по типу запроса
Стратегия по типам запросов
Не все запросы одинаково подвержены AI Overviews. Правильная тактика зависит от intent:
«как выбрать», «что такое», «почему»
AIO-риск: высокий (~47% в среднем, до 77% в нише). Стратегия: GEO — FAQ-структура, structured data, чёткие определения, авторитетность.
«курс по», «руководство», «обучение»
AIO-риск: средний (40–50%). Стратегия: гибридная — GEO + традиционный SEO.
«лучший», «сравнение», «рейтинг»
AIO-риск: низкий (15–20%). Стратегия: традиционное SEO, акцент на конверсию.
«купить», «цена», «[бренд] сайт»
AIO-риск: минимальный (5–10%). Стратегия: традиционное SEO работает в полную силу.
Агент мониторинга AI Overviews
Задача агента — отслеживать, появился ли AI Overview по вашим ключевым словам, и менять контент-стратегию по алерту.
Инструменты
- DataForSEO SERP API — поддерживает
ai_overviewв объекте ответа (полеitems_types[]). - SerpAPI / Bright Data — альтернативы с аналогичным детектированием AIO.
- Хранилище состояний — SQLite/Redis: фиксировать дату первого появления AIO и динамику.
Псевдокод агента
# AIO Monitor Agent — псевдокод
# Запуск: cron каждые 24 ч (или webhook по изменению позиций)
import serp_api, db, alerts
def run_aio_monitor(keywords: list[str]):
for kw in keywords:
result = serp_api.fetch(kw, features=["ai_overview", "featured_snippet"])
aio_present = result.has("ai_overview")
prev_state = db.get_aio_state(kw) # True/False/None
if aio_present and not prev_state:
# AIO появился впервые
db.set_aio_state(kw, True, date=today())
alerts.send(
channel="slack",
msg=f"[AIO ALERT] AI Overview появился для '{kw}'. "
f"Текущий URL в топ-1: {result.top_organic_url}. "
f"Рекомендация: переключить стратегию на GEO."
)
content_pipeline.schedule_geo_rewrite(kw)
elif not aio_present and prev_state:
# AIO исчез — возврат к традиционному SEO
db.set_aio_state(kw, False, date=today())
alerts.send(
channel="slack",
msg=f"[AIO GONE] AI Overview исчез для '{kw}'. "
f"Традиционный SEO снова приоритетен."
)
# Логировать позицию в органике независимо от AIO
db.log_rank(kw, result.organic_position, result.url)
ai_overview. Стоимость: ~$0.002–0.005 за запрос. Для 500 ключевых слов в день — менее $2.5/день.
Обновление контент-пайплайна для GEO
Мост к модулю M5: добавляем GEO-слой поверх существующего пайплайна генерации контента.
1. Изменения в system prompt контент-агента
# Добавить в SYSTEM PROMPT контент-агента (GEO-режим):
CONTENT_RULES_GEO = """
- Первый абзац = чёткое определение: ответь на запрос в 1–2 предложениях.
- Добавь раздел FAQ (минимум 4 вопроса-ответа) в конце статьи.
- Для каждого утверждения с цифрами — указывай первоисточник в скобках.
- Используй нумерованные списки для шагов и инструкций.
- Автор статьи должен быть указан с credentials (bio блок).
- Избегай разбавленных введений — AI выбирает плотный, фактический контент.
"""
2. Добавить structured data
# Генерация FAQ schema (добавить в SEO Check шаг пайплайна)
def generate_faq_schema(faq_items: list[dict]) -> str:
"""
faq_items: [{"question": "...", "answer": "..."}, ...]
Возвращает JSON-LD строку для вставки в <head>.
"""
schema = {
"@context": "schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": item["question"],
"acceptedAnswer": {
"@type": "Answer",
"text": item["answer"]
}
}
for item in faq_items
]
}
return f'<script type="application/ld+json">{json.dumps(schema)}</script>'
# Аналогично: HowTo schema для пошаговых инструкций,
# Article schema с author.name + author.url для E-E-A-T
3. Intent detection как шаг SEO Check
# Добавить в SEO Check Agent перед публикацией:
def check_aio_risk(keyword: str, content: str) -> dict:
intent = classify_intent(keyword) # 'informational'|'commercial'|...
aio_prob = AIO_RISK_MAP.get(intent, 0.5) # из базы данных мониторинга
if aio_prob > 0.4:
geo_score = score_geo_readiness(content)
# geo_score: 0..1 (наличие FAQ, определений, структ. данных, авторства)
if geo_score < 0.6:
return {
"status": "warn",
"msg": f"AIO-риск {aio_prob:.0%}, GEO-готовность {geo_score:.0%}. "
"Рекомендуется: добавить FAQ, structured data, улучшить определение."
}
return {"status": "ok", "aio_prob": aio_prob}
Тест: проверь понимание
Frontier Models в SEO — правильный роутинг
Sonnet делает 95% работы. Opus нужен реже, чем вы думаете.
Мы подошли к финальному модулю курса. Прежде чем перейти к практике — важная коррекция ментальной модели, без которой вы будете тратить деньги на Opus там, где Sonnet справляется отлично.
1. Переосмысление «умных» задач
Большинство SEO-специалистов наследуют устаревшую ментальную модель уровней моделей. Вот где она ломается:
Неправильно
| Haiku | = дёшево |
| Sonnet | = средний уровень |
| Opus | = умный, для сложных задач |
Эта модель ведёт к избыточным расходам и неправильным ожиданиям
Правильно
| Haiku | = bulk throughput (10k+ вызовов/день) |
| Sonnet | = стратегия + контент + анализ (95% задач) |
| Opus | = extended thinking, edge cases (<5%) |
Правильный вопрос: «Справится ли Sonnet?» — почти всегда да
Ключевой сдвиг: Sonnet — это не «средний уровень», это основной рабочий инструмент. Opus — страховка для <5% случаев, где расширенное мышление принципиально меняет результат.
2. Три реальных сценария выбора модели
Haiku — когда нужен МАСШТАБ при фиксированном шаблоне
Используйте когда задача шаблонная и количество вызовов исчисляется тысячами:
- Проверить 50 000 мета-тегов на длину и дубли
- Классифицировать 10 000 ключевых слов по intent (информационный/транзакционный/навигационный)
- Генерировать краткие alt-тексты для 5 000 изображений по шаблону
- Выгружать и структурировать данные GSC в табличный формат
Sonnet — почти всё остальное (включая «умные» задачи)
Это дефолтная модель для всего, что требует анализа, синтеза или стратегии:
- Конкурентный анализ ТОП-10 SERP по ключевому слову
- Оценка E-E-A-T профиля страницы конкурента
- Стратегическое решение: атаковать head term или long-tail кластер?
- Создание контентного брифа, outline, черновика статьи
- Технический SEO-аудит с интерпретацией приоритетов
- Анализ 50–100 страниц сайта за один запрос (200k контекст)
- GEO-оптимизация под AI Overviews
- «Какой content gap заполнить следующим?»
Opus — только когда Sonnet реально недостаточен
Не «сложная задача» — а задача где расширенное мышление меняет вывод:
- Мульти-шаговое рассуждение на 15+ шагов с ветвящейся неопределённостью
- Документ 500+ страниц в одном вызове с глубоким синтезом
- Необратимое решение (напр., полный редизайн архитектуры сайта), где одна ошибка = месяцы работы
- Задача, где именно extended thinking принципиально меняет итоговый вывод
3. Sonnet в действии: паттерны для «сложных» задач
Три задачи, которые кажутся «умными» — и все три решаются Sonnet:
Паттерн A — Competitive Intelligence
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=4096,
messages=[{"role": "user", "content": f"""
Проанализируй ТОП-10 результатов Google по запросу '{keyword}'.
Для каждого: тип контента, длина, структура H1-H3, основные темы.
Выяви: какие темы пропущены? Какой формат доминирует?
Составь бриф для статьи, которая займёт первое место.
"""}]
)
Паттерн B — E-E-A-T Assessment
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=2048,
messages=[{"role": "user", "content": f"""
Оцени E-E-A-T профиль этой страницы по шкале 1-10:
{page_content}
Что улучшить? Какие сигналы авторитетности добавить?
"""}]
)
Паттерн C — Strategic Decision
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=3000,
messages=[{"role": "user", "content": f"""
GSC данные: {gsc_summary}
Конкурентный профиль: {competitor_data}
Вопрос: стоит ли нам конкурировать по head-term '{head_term}'
или сосредоточиться на long-tail кластере '{longtail_cluster}'?
Обоснуй через данные, укажи риски каждого варианта.
"""}]
)
claude-sonnet-4-6 — не как компромисс по бюджету, а как правильный выбор для этих задач.4. Честный порог для Opus
Пример задачи, где Opus оправдан в SEO:
- Выявить конфликтующие canonical-ошибки среди 200 страниц
- Кластеризовать в типовые проблемы
- Автоматически сгенерировать план редиректов
- Разработать canonical-стратегию для всей структуры
Ошибка в этом плане = сотни часов ручной работы → extended thinking меняет качество вывода.
Обратите внимание: это не «сложная SEO-задача», а очень специфичная комбинация: огромный объём входных данных + многошаговая логика + высокая цена ошибки. Конкурентный анализ по одному ключевому слову под это определение не подпадает.
5. Model Routing в реальном пайплайне
Правильный роутер ставит Sonnet дефолтом, а не исключением:
def route_task(task_type, input_size, complexity):
# Правило 1: massive bulk -> Haiku
if task_type in ('bulk_classify', 'simple_check') and input_size > 1000:
return 'claude-haiku-4-5'
# Правило 2: Opus только для truly exceptional
if complexity == 'exceptional' and task_type in ('full_site_strategy', 'canonical_rebuild'):
return 'claude-opus-4-8'
# Правило 3: Sonnet -- дефолт для всего остального
return 'claude-sonnet-4-6'
return 'claude-sonnet-4-6' — это не fallback для «средних» задач. Это правильный выбор для конкурентного анализа, E-E-A-T оценки, контентных стратегий и технических аудитов.
6. Калькулятор стоимости SEO-пайплайна
Посмотрим на реальные цифры. По умолчанию — типичное распределение: Haiku берёт объём, Sonnet — ценность:
Формула: пусть Haiku делает объём — Sonnet делает ценность.
7. Проверьте понимание
Готово!
10 модулей пройдены. Вы изучили полный стек SEO-агентов — от архитектуры до AI-поиска и frontier-аналитики.
- Декомпозировать SEO-воркфлоу на задачи для агентов
- Собрать агентский стек: Data Sources → LLM → Output
- Построить агент технического аудита с приоритизацией
- Автоматизировать keyword research и intent mapping
- Настроить контентный пайплайн с SEO-оптимизацией
- Мониторить SERP и backlink-профиль агентом
- Оркестрировать полный SEO-пайплайн с human-in-the-loop
- Измерять ROI автоматизации и итерировать систему
- Адаптировать SEO-стратегию к AI Overviews и GEO
- Применять frontier-модели для глубокого SEO-анализа
Что читать дальше
- Google Search Central Blog — официальные обновления алгоритмов
- Anthropic API Docs — Claude API для контентных агентов
- Screaming Frog Docs — продвинутый технический аудит
- Ahrefs Academy — keyword research и backlink analysis