Разработка системы AI-генерации SEO-контента
AI-система создаёт SEO-оптимизированный контент по ключевым запросам: статьи, категорийные страницы, карточки товаров, FAQ, метатеги. Масштабирует производство контента для органического роста трафика.
Генератор SEO-статей
from openai import AsyncOpenAI
import asyncio
client = AsyncOpenAI()
async def generate_seo_article(
keyword: str,
secondary_keywords: list[str],
search_intent: str, # informational, transactional, commercial, navigational
target_word_count: int = 2000,
competitor_outlines: list[str] = None
) -> dict:
response = await client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "system",
"content": f"""Ты — SEO-копирайтер с опытом 10+ лет.
Пиши для людей, оптимизируй для поисковиков.
ТРЕБОВАНИЯ:
- H1 с ключевым словом в первых 3 словах
- H2 структура: каждый заголовок = отдельный поисковый интент
- Ключевое слово в первых 100 словах
- Целевая плотность {keyword}: 1–2% (без keyword stuffing)
- LSI-ключи: {', '.join(secondary_keywords[:5])} — по 1–2 раза
- Featured snippet блок: таблица, нумерованный список или прямой ответ
- Ответ на вопрос пользователя в первом абзаце (intent matching)
- {target_word_count} слов ± 10%
НЕ ПИСАТЬ: "В этой статье мы расскажем...", "Итак,", "Безусловно,", вводные воды.
Верни JSON: {{article_markdown, meta_title (60 chars), meta_description (160 chars), h1, recommended_internal_links}}"""
}, {
"role": "user",
"content": f"""
Целевой ключ: {keyword}
LSI/семантика: {secondary_keywords}
Интент: {search_intent}
Объём: {target_word_count} слов
{f"Анализ конкурентов (структуры):\\n{chr(10).join(competitor_outlines)}" if competitor_outlines else ""}
"""
}],
response_format={"type": "json_object"}
)
return json.loads(response.choices[0].message.content)
Кластеризация ключевых слов
async def cluster_keywords(keywords: list[str]) -> dict:
"""Группируем ключи по темам для структуры сайта"""
response = await client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "system",
"content": """Сгруппируй ключевые слова по тематическим кластерам.
Для каждого кластера: название темы, ключевой запрос (пиллар), supporting keywords.
Предложи структуру контента: пиллар-страница + кластерные страницы.
Верни JSON."""
}, {
"role": "user",
"content": f"Ключевые слова: {json.dumps(keywords, ensure_ascii=False)}"
}],
response_format={"type": "json_object"}
)
return json.loads(response.choices[0].message.content)
Генерация метатегов для каталога
async def generate_meta_tags_batch(
pages: list[dict], # [{"url": "/product/123", "title": "...", "description": "..."}]
site_context: str
) -> list[dict]:
"""Генерируем meta title и description для массива страниц"""
results = []
batch_size = 20
for i in range(0, len(pages), batch_size):
batch = pages[i:i+batch_size]
response = await client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "system",
"content": f"""Создай meta title (до 60 символов) и meta description (до 160 символов) для каждой страницы.
Контекст сайта: {site_context}.
Title: содержит ключевое слово, уникален, описывает страницу.
Description: призыв к действию, выгода, ключевое слово.
Верни JSON массив: [{{url, meta_title, meta_description}}]"""
}, {
"role": "user",
"content": json.dumps(batch, ensure_ascii=False)
}],
response_format={"type": "json_object"}
)
batch_results = json.loads(response.choices[0].message.content)["pages"]
results.extend(batch_results)
return results
Интеграция с семантическим ядром
import httpx
async def get_search_volume(keywords: list[str], region: str = "ru") -> dict:
"""Получаем частотность из Яндекс.Wordstat или Key.Collector API"""
async with httpx.AsyncClient() as http:
# Key Collector API или Serpstat API
resp = await http.post(
"https://api.serpstat.com/v3",
json={
"method": "SerpstatKeywordProcedure.getKeywords",
"params": {"keywords": keywords, "se": f"g_{region}"}
}
)
return resp.json()
async def prioritize_content_calendar(
keyword_clusters: dict,
available_hours_per_week: int = 20,
words_per_hour: int = 500
) -> list[dict]:
"""Приоритизируем контент-план по ROI (трафик / затраты)"""
articles_per_week = (available_hours_per_week * words_per_hour) // 2000
# ... логика приоритизации по объёму × конкурентности
FAQ генерация для featured snippets
async def generate_faq_section(
topic: str,
num_questions: int = 8
) -> list[dict]:
"""Генерируем FAQ для захвата featured snippets"""
response = await client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "system",
"content": f"""Создай {num_questions} вопросов-ответов в формате FAQ.
Вопросы должны начинаться с: Как, Что, Когда, Почему, Сколько, Где.
Ответы: 40–60 слов, прямо и конкретно — для featured snippet.
Верни JSON: [{{question, answer, schema_type: "FAQPage"}}]"""
}, {
"role": "user",
"content": f"Тема: {topic}"
}],
response_format={"type": "json_object"}
)
return json.loads(response.choices[0].message.content)["faq"]
Сроки: генератор SEO-статей с метатегами — 1–2 недели. Полноценная SEO-платформа с кластеризацией, контент-планом и интеграцией с CMS — 4–6 недель.







