Spaces:
Sleeping
Sleeping
Архитектура проекта
Обзор
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 до 3 слов
- Пример: фраза "chicken road casino" разбивается на:
- Униграммы: "chicken", "road", "casino"
- Биграммы: "chicken road", "road casino"
- Триграммы: "chicken road casino"
- Используется скользящее окно по токенам фразы
- Дубликаты отслеживаются через set для оптимизации
- Пример: фраза "chicken road casino" разбивается на:
- Генерация N-грамм для целевого текста и конкурентов (униграммы, биграммы, триграммы)
- Обучение BM25 модели на корпусе N-грамм для каждого уровня (1, 2, 3)
- Расчет BM25 скоров для каждой декомпозированной фразы
- Сравнение скоров целевого текста со средним скором конкурентов
- Генерация рекомендаций (add/remove/ok) на основе пороговых значений
- Сортировка результатов: сначала проблемные (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 анализа:
- Разбиение текстов на предложения (chunks)
- Генерация эмбеддингов для всех chunks и ключевых фраз
- Расчет косинусного сходства между ключевыми фразами и chunks
- Global Score: средний максимальный score по всем ключам
- 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 состояние для табов и форм
Производительность
Оптимизации
Кэширование моделей:
- spaCy модели загружаются один раз
- BERT модель загружается один раз
Ленивая загрузка:
- spaCy модели загружаются только для используемых языков
- BERT модель загружается при первом запросе
GPU ускорение:
- Автоматическое использование CUDA для BERT
- Значительное ускорение на GPU
Ограничения:
- N-граммы ограничены 150 элементами на тип
- Топ-5 chunks для BERT анализа
Ограничения
- Максимальная длина текста для spaCy: 2,000,000 символов
- Память: зависит от размера моделей и длины текстов
- Время обработки: зависит от длины текстов и наличия GPU
Масштабируемость
Текущие ограничения
- Однопоточная обработка запросов
- Модели загружаются в память
- Нет кэширования результатов
Возможные улучшения
Асинхронность:
- Использование async/await для I/O операций
- Параллельная обработка конкурентов
Кэширование:
- Redis для кэширования результатов
- Кэширование эмбеддингов
Микросервисы:
- Отдельный сервис для BERT
- Отдельный сервис для spaCy
База данных:
- Сохранение истории анализов
- Статистика использования
Безопасность
Текущее состояние
- Нет аутентификации
- Нет ограничений на размер запросов
- Нет валидации входных данных (кроме Pydantic)
Рекомендации
Валидация:
- Ограничение размера текстов
- Санитизация входных данных
Аутентификация:
- API ключи
- OAuth 2.0
Rate Limiting:
- Ограничение количества запросов
- Защита от DDoS
Зависимости
Критические
fastapi- веб-фреймворкspacy- NLP библиотекаsentence-transformers- BERT моделиrank-bm25- BM25 алгоритмtorch- глубокое обучение
Вспомогательные
uvicorn- ASGI серверpydantic- валидация данныхjinja2- шаблонизацияnumpy- численные вычисления
Расширяемость
Добавление нового языка
- Установить spaCy модель для языка
- Добавить в
MODEL_NAMESвlogic.py - Добавить опцию в UI (
templates/index.html)
Добавление новой модели BERT
- Изменить модель в
get_bert_model() - Убедиться в совместимости с
sentence-transformers
Добавление нового типа анализа
- Создать функцию в
logic.py - Добавить вызов в
analyze_text()вmain.py - Добавить поле в
AnalysisResponse - Обновить UI для отображения результатов