Spaces:
Running
Running
File size: 12,091 Bytes
e0ad138 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 | # Архитектура проекта
## Обзор
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 для отображения результатов
|