ai-seo-analyzer / docs /ARCHITECTURE.md
lsdf's picture
Initial commit: SEO AI Editor MVP with BERT, BM25 and N-gram analysis
e0ad138

Архитектура проекта

Обзор

SEO AI Editor построен на архитектуре клиент-сервер с использованием FastAPI для backend и простого HTML/JavaScript для frontend.

Структура проекта

seo_ai_editor/
├── main.py              # Точка входа, FastAPI приложение
├── logic.py             # Бизнес-логика и алгоритмы анализа
├── models.py            # Pydantic модели данных
├── requirements.txt     # Python зависимости
├── templates/
│   └── index.html       # Frontend интерфейс
├── docs/                # Документация
│   ├── API.md
│   ├── ARCHITECTURE.md
│   └── DEVELOPMENT.md
└── README.md            # Основная документация

Компоненты системы

1. Backend (FastAPI)

main.py - Веб-сервер

Ответственность:

  • Инициализация FastAPI приложения
  • Роутинг HTTP запросов
  • Предзагрузка моделей при старте
  • Обработка запросов и формирование ответов

Ключевые функции:

  • startup_event() - загрузка моделей при старте
  • read_root() - отдача главной страницы
  • analyze_text() - обработка запроса на анализ

logic.py - Бизнес-логика

Разделен на три модуля:

A. SPACY (Лингвистический анализ)

Модели:

  • Глобальный словарь LoadedModels для кэширования загруженных spaCy моделей
  • Поддержка 5 языков: en, ru, de, es, it

Функции:

  • load_model_if_missing(lang) - ленивая загрузка моделей
  • load_models() - предзагрузка всех моделей
  • get_doc(text, lang) - получение spaCy документа
  • is_valid_token(t) - фильтрация токенов (удаление мусора)
  • get_lemmas_flat(text, lang) - получение списка лемм
  • generate_ngrams_safe(text, lang, n) - генерация N-грамм с умной фильтрацией

Особенности:

  • Сохранение стоп-слов внутри фраз для читаемости
  • Фильтрация N-грамм, состоящих только из стоп-слов
  • Обработка больших текстов (max_length = 2,000,000)
B. ANALYTICS (N-граммы и BM25)

Функции:

  • calculate_ngram_stats() - статистика по N-граммам (1-4)
  • parse_keywords() - парсинг ключевых фраз
  • calculate_bm25_recommendations() - многоуровневый BM25 анализ

Алгоритм BM25 (с полной декомпозицией фраз):

  1. Декомпозиция ключевых фраз: Для каждой ключевой фразы генерируются все возможные под-н-граммы длиной от 1 до 3 слов
    • Пример: фраза "chicken road casino" разбивается на:
      • Униграммы: "chicken", "road", "casino"
      • Биграммы: "chicken road", "road casino"
      • Триграммы: "chicken road casino"
    • Используется скользящее окно по токенам фразы
    • Дубликаты отслеживаются через set для оптимизации
  2. Генерация N-грамм для целевого текста и конкурентов (униграммы, биграммы, триграммы)
  3. Обучение BM25 модели на корпусе N-грамм для каждого уровня (1, 2, 3)
  4. Расчет BM25 скоров для каждой декомпозированной фразы
  5. Сравнение скоров целевого текста со средним скором конкурентов
  6. Генерация рекомендаций (add/remove/ok) на основе пороговых значений
  7. Сортировка результатов: сначала проблемные (add/remove), затем по длине фразы, затем алфавитно

Пороги:

  • Униграммы: 0.5
  • Биграммы: 0.25
  • Триграммы: 0.15

Особенности:

  • Полная декомпозиция позволяет анализировать не только целые фразы, но и их части
  • Это особенно полезно для длинных ключевых фраз, которые могут встречаться в тексте частично
  • Автоматическое удаление дубликатов при декомпозиции
C. BERT / VECTOR ANALYSIS

Модель:

  • Глобальная переменная BertModel для кэширования
  • Модель: paraphrase-multilingual-MiniLM-L12-v2
  • Автоматическое определение устройства (CPU/GPU)

Функции:

  • get_bert_model() - загрузка BERT модели
  • perform_bert_analysis() - семантический анализ

Алгоритм BERT анализа:

  1. Разбиение текстов на предложения (chunks)
  2. Генерация эмбеддингов для всех chunks и ключевых фраз
  3. Расчет косинусного сходства между ключевыми фразами и chunks
  4. Global Score: средний максимальный score по всем ключам
  5. Detailed Analysis: топ-5 наиболее релевантных chunks для каждой фразы

models.py - Модели данных

Pydantic модели:

  • AnalysisRequest - входные данные для анализа
  • AnalysisResponse - структура ответа API

2. Frontend

templates/index.html

Технологии:

  • Bootstrap 5 для UI
  • Vanilla JavaScript (без фреймворков)
  • AJAX для взаимодействия с API

Компоненты:

  • Форма ввода данных
  • Табы для отображения результатов
  • Динамическое добавление полей конкурентов
  • Визуализация результатов анализа

Поток данных

1. Пользователь вводит данные в форму
   ↓
2. JavaScript собирает данные и отправляет POST /analyze
   ↓
3. FastAPI получает запрос, валидирует через Pydantic
   ↓
4. main.py вызывает функции из logic.py:
   - calculate_ngram_stats()
   - parse_keywords()
   - calculate_bm25_recommendations()
   - perform_bert_analysis()
   ↓
5. Каждая функция использует:
   - spaCy для лингвистики
   - BM25 для частотного анализа
   - BERT для семантики
   ↓
6. Результаты собираются в AnalysisResponse
   ↓
7. JSON ответ отправляется клиенту
   ↓
8. JavaScript рендерит результаты в UI

Управление состоянием

Backend

Глобальные переменные:

  • LoadedModels - кэш загруженных spaCy моделей
  • BertModel - кэш BERT модели

Стратегия:

  • Модели загружаются один раз при первом использовании
  • Предзагрузка spaCy моделей при старте (опционально)
  • BERT модель загружается лениво при первом запросе

Frontend

Состояние:

  • currentData - последние результаты анализа
  • DOM состояние для табов и форм

Производительность

Оптимизации

  1. Кэширование моделей:

    • spaCy модели загружаются один раз
    • BERT модель загружается один раз
  2. Ленивая загрузка:

    • spaCy модели загружаются только для используемых языков
    • BERT модель загружается при первом запросе
  3. GPU ускорение:

    • Автоматическое использование CUDA для BERT
    • Значительное ускорение на GPU
  4. Ограничения:

    • N-граммы ограничены 150 элементами на тип
    • Топ-5 chunks для BERT анализа

Ограничения

  • Максимальная длина текста для spaCy: 2,000,000 символов
  • Память: зависит от размера моделей и длины текстов
  • Время обработки: зависит от длины текстов и наличия GPU

Масштабируемость

Текущие ограничения

  • Однопоточная обработка запросов
  • Модели загружаются в память
  • Нет кэширования результатов

Возможные улучшения

  1. Асинхронность:

    • Использование async/await для I/O операций
    • Параллельная обработка конкурентов
  2. Кэширование:

    • Redis для кэширования результатов
    • Кэширование эмбеддингов
  3. Микросервисы:

    • Отдельный сервис для BERT
    • Отдельный сервис для spaCy
  4. База данных:

    • Сохранение истории анализов
    • Статистика использования

Безопасность

Текущее состояние

  • Нет аутентификации
  • Нет ограничений на размер запросов
  • Нет валидации входных данных (кроме Pydantic)

Рекомендации

  1. Валидация:

    • Ограничение размера текстов
    • Санитизация входных данных
  2. Аутентификация:

    • API ключи
    • OAuth 2.0
  3. Rate Limiting:

    • Ограничение количества запросов
    • Защита от DDoS

Зависимости

Критические

  • fastapi - веб-фреймворк
  • spacy - NLP библиотека
  • sentence-transformers - BERT модели
  • rank-bm25 - BM25 алгоритм
  • torch - глубокое обучение

Вспомогательные

  • uvicorn - ASGI сервер
  • pydantic - валидация данных
  • jinja2 - шаблонизация
  • numpy - численные вычисления

Расширяемость

Добавление нового языка

  1. Установить spaCy модель для языка
  2. Добавить в MODEL_NAMES в logic.py
  3. Добавить опцию в UI (templates/index.html)

Добавление новой модели BERT

  1. Изменить модель в get_bert_model()
  2. Убедиться в совместимости с sentence-transformers

Добавление нового типа анализа

  1. Создать функцию в logic.py
  2. Добавить вызов в analyze_text() в main.py
  3. Добавить поле в AnalysisResponse
  4. Обновить UI для отображения результатов