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