242 lines
6.6 KiB
Markdown
242 lines
6.6 KiB
Markdown
# RuWiki -> SchoolNotes
|
||
|
||
Асинхронная система упрощения статей RuWiki для школьного образования с использованием LLM OpenAI.
|
||
|
||
[](https://github.com/psf/black)
|
||

|
||
|
||
## Описание
|
||
|
||
Система автоматически:
|
||
- Загружает статьи из русской Википедии
|
||
- Упрощает содержимое для учеников 8-11 классов с помощью OpenAI GPT
|
||
- Сохраняет оригинальный и упрощённый текст в SQLite
|
||
- Обрабатывает статьи параллельно
|
||
|
||
## Архитектура
|
||
|
||
```mermaid
|
||
graph TD
|
||
A[CLI / AsyncRunner] -->|URLs| B[TaskQueue asyncio_anyio]
|
||
B --> C[Worker_N coroutine]
|
||
C --> D[RuWikiAdapter]
|
||
C --> E[TextSplitter]
|
||
C --> F[LLMProvider]
|
||
C --> G[WriteQueue]
|
||
G --> H[(SQLite aiosqlite)]
|
||
```
|
||
|
||
## Установка
|
||
|
||
### Требования
|
||
- Python ≥ 3.10
|
||
- OpenAI API ключ
|
||
|
||
### Установка зависимостей
|
||
|
||
```bash
|
||
# Создание виртуального окружения
|
||
python -m venv .venv
|
||
source .venv/bin/activate # Linux/Mac
|
||
# или
|
||
.venv\Scripts\activate # Windows
|
||
|
||
# Установка зависимостей
|
||
pip install -r requirements.txt
|
||
|
||
# Для разработки
|
||
pip install -r requirements-dev.txt
|
||
```
|
||
|
||
### Конфигурация
|
||
|
||
1. Скопируйте `env_example.txt` в `.env`:
|
||
```bash
|
||
cp env_example.txt .env
|
||
```
|
||
|
||
2. Настройте конфигурацию в env:
|
||
```env
|
||
OPENAI_API_KEY=your_openai_api_key_here
|
||
...
|
||
```
|
||
|
||
## Использование
|
||
|
||
### Основные команды
|
||
|
||
```bash
|
||
# Обработка статей из файла
|
||
python -m src.cli process input.txt
|
||
|
||
# Принудительная обработка (повторная)
|
||
python -m src.cli process input.txt --force
|
||
|
||
# Ограничение количества статей
|
||
python -m src.cli process input.txt --max-articles 10
|
||
|
||
# Настройка количества workers
|
||
python -m src.cli process input.txt --max-workers 5
|
||
|
||
# Проверка здоровья системы
|
||
python -m src.cli health
|
||
|
||
# Просмотр статей в БД
|
||
python -m src.cli list-articles --limit 20
|
||
|
||
# Статистика по файлу с URL
|
||
python -m src.cli stats input.txt
|
||
```
|
||
|
||
### Формат файла с URL
|
||
|
||
```
|
||
# input.txt
|
||
https://ru.ruwiki.ru/wiki/Изотопы
|
||
https://ru.ruwiki.ru/wiki/Вещественное_число
|
||
https://ru.ruwiki.ru/wiki/Митоз
|
||
```
|
||
|
||
### Примеры
|
||
|
||
```bash
|
||
# Обработка тестовых статей
|
||
python -m src.cli process input.txt --max-articles 3 --max-workers 2
|
||
|
||
# Вывод результатов в JSON
|
||
python -m src.cli list-articles --format json --status completed
|
||
|
||
# Настройка логирования
|
||
python -m src.cli --log-level DEBUG --log-format json process input.txt
|
||
```
|
||
|
||
## Конфигурация
|
||
|
||
Основные параметры в `.env`:
|
||
|
||
```env
|
||
# OpenAI
|
||
OPENAI_API_KEY=your_openai_api_key_here
|
||
OPENAI_MODEL=gpt-4o
|
||
OPENAI_TEMPERATURE=0.0
|
||
OPENAI_PROXY_URL='socks5h://37.18.73.60:5566' # socks5 recommended
|
||
|
||
# База данных
|
||
DB_PATH=./data/wiki.db
|
||
|
||
# Производительность
|
||
MAX_CONCURRENT_LLM=5
|
||
OPENAI_RPM=200
|
||
MAX_CONCURRENT_WIKI=10
|
||
|
||
# Логирование
|
||
LOG_LEVEL=INFO
|
||
LOG_FORMAT=json
|
||
|
||
# Обработка текста
|
||
CHUNK_SIZE=2000
|
||
CHUNK_OVERLAP=200
|
||
|
||
# Надёжность
|
||
MAX_RETRIES=3
|
||
RETRY_DELAY=1.0
|
||
CIRCUIT_FAILURE_THRESHOLD=5
|
||
CIRCUIT_RECOVERY_TIMEOUT=60
|
||
```
|
||
|
||
## Мониторинг
|
||
|
||
### Логи
|
||
```bash
|
||
# Структурированные логи в JSON
|
||
python -m src.cli --log-format json process input.txt
|
||
|
||
# Отладочные логи
|
||
python -m src.cli --log-level DEBUG process input.txt
|
||
```
|
||
|
||
### Метрики
|
||
- Скорость обработки: статей/минуту
|
||
- Процент успеха
|
||
- Среднее время обработки
|
||
- Использование токенов
|
||
|
||
### Health Check
|
||
```bash
|
||
python -m src.cli health
|
||
```
|
||
|
||
## Тестирование
|
||
|
||
```bash
|
||
# Все тесты
|
||
python -m pytest
|
||
|
||
# С покрытием
|
||
python -m pytest --cov=src --cov-report=html
|
||
|
||
# Без покрытия (быстрее)
|
||
python -m pytest --no-cov
|
||
|
||
# Только unit тесты
|
||
python -m pytest tests/test_models.py tests/test_adapters.py
|
||
|
||
# Интеграционные тесты
|
||
python -m pytest tests/test_integration.py
|
||
|
||
# Конкретный тест
|
||
python -m pytest tests/test_adapters.py::TestLLMProviderAdapter::test_simplify_text_success -v
|
||
|
||
```
|
||
|
||
### Статус тестов
|
||
- ✅ **71 тест** - все проходят
|
||
- ✅ **Unit тесты** - адаптеры, модели, сервисы
|
||
- ✅ **Интеграционные тесты** - база данных, файловые операции
|
||
- ✅ **Системные тесты** - полный цикл обработки
|
||
|
||
## Примеры результатов
|
||
|
||
### Исходная статья (фрагмент)
|
||
```wiki
|
||
'''Изотопы''' (от {{lang-grc|ἴσος}} «равный» и {{lang-grc|τόπος}} «место») — разновидности атомов химического элемента с одинаковым количеством протонов, но различным количеством нейтронов в ядре...
|
||
```
|
||
|
||
### Упрощённая версия
|
||
```wiki
|
||
'''Изотопы''' — это разные виды атомов одного элемента.
|
||
|
||
== Что такое изотопы ==
|
||
У атомов одного элемента всегда одинаковое число протонов. Но число нейтронов может быть разным. Атомы с разным числом нейтронов называются изотопами...
|
||
```
|
||
|
||
## Разработка
|
||
|
||
### Качество кода
|
||
```bash
|
||
# Форматирование
|
||
black src/ tests/
|
||
|
||
# Проверка стиля
|
||
ruff check src/
|
||
|
||
# Типы
|
||
mypy src/
|
||
|
||
# Безопасность
|
||
bandit -r src/
|
||
```
|
||
|
||
### Структура проекта
|
||
```
|
||
ruwiki_test/
|
||
├── src/
|
||
│ ├── adapters/ # Адаптеры для внешних API
|
||
│ ├── models/ # Модели данных
|
||
│ ├── services/ # Бизнес-логика
|
||
│ ├── cli.py # CLI интерфейс
|
||
│ └── runner.py # Основной runner
|
||
├── tests/ # Тесты
|
||
├── data/ # База данных
|
||
└── requirements.txt # Зависимости
|
||
``` |