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 для отображения результатов