Self-hosted приложение для массового анализа клиентских отзывов из Excel через LLM. Загружаете .xlsx, описываете задачу в промпте, настраиваете поля ответа — сервис прогоняет каждую строку через модель и собирает итоговую xlsx-выгрузку с результатами.
Работает с любым OpenAI-совместимым API (OpenAI, Azure OpenAI, локальные инференсы через vLLM/TGI и т. п.) и опционально с Ollama. Модель и провайдер выбираете через .env, в UI ключ можно вводить на каждый прогон.
- Загрузка xlsx, парсинг листов и колонок, inspect-worker готовит файл в фоне.
- Визуальный конструктор полей ответа — без ручного JSON, типы (текст/число/дата/список), ограничения, enum.
- Групповой режим — LLM получает всю группу строк (например, отзывы одной смены) разом, возвращает один агрегат на группу.
- Потоковая обработка — отчёты на сотни тысяч строк не падают по памяти, xlsx и JSON пишутся на диск по мере поступления.
- Live-превью — первые результаты появляются сразу, пока остальное ещё крутится.
- Умный retry — при невалидном ответе модель получает обратную связь от валидатора и исправляется на следующей попытке.
- LLM-кэш — точный (по хэшу промпта) + семантический (по эмбеддингам), снижает расход токенов при повторных прогонах.
- Пауза / продолжение / перезапуск упавших отчётов без повторного расхода токенов на готовые строки.
- Позиция в очереди — видно сколько задач впереди.
- Два готовых пресета на задачу поиска мошенничества в отзывах сотрудников (построчный и групповой) + демо-файлы в
examples/. - История отчётов, изоляция по пользователю, ролевая модель user/admin, админка.
- Темы light/dark.
- Backend: FastAPI (Python 3.12), psycopg3 + PostgreSQL 15, Redis 7 (очереди + pubsub + кэш), Argon2, Fernet.
- Frontend: React 18 + TypeScript + MUI v6, Vite.
- Инфраструктура: docker compose (
backend,worker,inspect-worker,frontend,postgres,redis).
- Docker + Docker Compose.
- Доступ к OpenAI-совместимому LLM (свой API-ключ). Если нет — можно поднять локальный Ollama.
git clone https://github.com/MaksimSamarin/ai-feedback-analysis.git
cd ai-feedback-analysis
cp .env.example .env
# Откройте .env и задайте:
# OPENAI_BASE_URL — ваш эндпоинт
# OPENAI_API_KEY — ваш ключ (или оставьте пустым и вводите в UI)
# OPENAI_MODELS — список моделей через запятую (первая = дефолтная)
# APP_SECRET — любая длинная случайная строка (генерация: openssl rand -hex 32)
# POSTGRES_PASSWORD — пароль БД
# BOOTSTRAP_ADMIN_USERNAME / BOOTSTRAP_ADMIN_PASSWORD — первый админ (опционально)
docker compose up -d --buildИнтерфейс: http://localhost:8080
Health API: http://localhost:8080/api/health
- Войдите (или зарегистрируйтесь).
- Блок «1. Данные и модель» — перетащите
.xlsxв зону загрузки или нажмите кнопку «Примеры файлов» справа от неё, выберите демо-файл. - Укажите лист, колонки для анализа, опционально колонки для копирования в итоговый отчёт, опционально группировку.
- Блок «2. Шаблон» — выберите готовый пресет или напишите свой промпт и настройте поля ответа. Подсказка «Как это работает» — по кнопке рядом с заголовком.
- Блок «3. Обработка» — «Запустить новый анализ».
- Блок «4. Результаты» — превью обновляется в процессе, готовый xlsx скачивается после завершения.
Демо-файлы в examples/ — две версии на 1 000 и 100 000 отзывов с русскими колонками (id, магазин, смена, отзыв, оценка, дата) и готовыми пресетами под задачу поиска мошенничества.
├─ backend/ # FastAPI + воркеры
│ ├─ app/
│ │ ├─ main.py # HTTP API, endpoints, auth
│ │ ├─ db.py # PostgreSQL (psycopg3), SQL
│ │ ├─ worker.py # analysis / inspect worker
│ │ ├─ queue.py # Redis queues, dedup, lease
│ │ ├─ services/
│ │ │ ├─ job_manager.py # оркестрация обработки, LLM-вызовы
│ │ │ └─ excel_service.py # чтение xlsx, потоковый экспорт
│ │ └─ providers/ # OpenAI-compat, Ollama
│ └─ tests/unit/ # pytest, 225+ тестов
├─ frontend/ # React + MUI
├─ ops/postgres/init/ # 001_schema.sql — инициализация БД
├─ examples/ # демо-xlsx + генератор
├─ branding/ # логотип (замените на свой)
├─ docs/
│ ├─ ARCHITECTURE.md
│ ├─ QUICK_START_RU.md
│ ├─ RELEASE_NOTES.md
│ └─ TESTING.md
├─ docker-compose.yml
└─ .env.example
docs/ARCHITECTURE.md— как устроено приложение, поток данных, кэш, масштабирование.docs/QUICK_START_RU.md— пошаговый гайд на русском.docs/RELEASE_NOTES.md— история версий.docs/TESTING.md— как запускать тесты локально.
Локально в Docker (без CI):
docker compose run --rm --no-deps \
-v "$(pwd)/backend/tests:/tests" backend \
bash -lc "pip install -q pytest pytest-asyncio && python -m pytest /tests/unit/ -v"MIT — см. LICENSE.
Issues и PR приветствуются. Для обсуждения крупных изменений сначала заведите issue.