О проекте
Команда: AI-Krusty-Krab
Кейс HackAlem.ai: Спецтрек — Казахтелеком
Стадия: Рабочий MVP
Задача кейса: Агент, сравнивающий документы оргструктуры до и после реорганизации
Суть
Веб-сервис и Telegram-бот: сравнивает PDF/DOCX/XLSX-документы оргструктуры до и после реорганизации и находит потерю функций, их дублирование и пересечение ответственности. Каждый вывод подкреплён цитатой из источника.
Как устроено
Парсеры (PDF.js, Mammoth+Cheerio, ExcelJS) извлекают текст с координатами. LLM gpt-4o-mini со structured output (json_schema) вместе с правилами выделяет подразделения, функции и роли действий. Эмбеддинги text-embedding-3-small ищут смысловые соответствия, неоднозначные пары уточняет LLM, правила отличают исполнение от контроля. Вывод попадает в результат, только если цитата совпала с извлечённым фрагментом. Результат хранится в SQLite (Fastify-бэкенд), фронт на React опрашивает фоновую задачу.
Ключевые решения
- semantic matching на эмбеддингах
- structured output json_schema
- проверка цитат
- кэш ответов AI-провайдера
- фоновый запуск HTTP 202 + polling
Особенности
Проверка цитат работает как гейт против галлюцинаций. Второй интерфейс — Telegram-бот поверх того же API. В примерах before/after.xlsx заранее заложены случаи потери, переноса и дублирования функций, чтобы жюри могло проверить решение.
Стек
TypeScript · React 19 · Vite · TanStack Query · Tailwind CSS · Node.js · Fastify · SQLite · Zod · Python · python-telegram-bot
Модели
gpt-4o-mini · text-embedding-3-small
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-30bde13e-ai-krusty-krab.
README
README.mdReorg AI — анализ организационной структуры и функционала
Краткое описание
Что изменилось в обязанностях после реорганизации — и где это написано?
Reorg AI — прототип ИИ-агента, который сравнивает комплекты организационных документов до и после реорганизации, сопоставляет подразделения и функции и показывает потенциальные потери функций, дублирование и пересечения ответственности. Каждый выявленный риск сопровождается объяснением и цитатой из исходного документа.
Решение предназначено для сотрудников, анализирующих организационные изменения: специалистов по организационному развитию, внутреннему аудиту и руководителей подразделений. Оно сокращает ручной поиск соответствий в положениях и инструкциях и помогает проверить, кому после изменений поручена конкретная обязанность.
Это инструмент предварительного анализа. Отсутствие соответствия в загруженных документах не доказывает фактическую потерю функции. Выводы проверяет ответственный сотрудник.
Что реализовано
- Загрузка нескольких PDF, DOCX и XLSX на каждую сторону сравнения.
- Извлечение подразделений и функций с привязкой к исходным фрагментам.
- Сопоставление подразделений: сохранённые, переименованные, преобразованные, созданные, удалённые и неопределённые соответствия.
- Сопоставление функций по смыслу, действию, объекту и роли: эквивалентность, перенос, частичное совпадение или отсутствие достаточного соответствия.
- Поиск трёх типов рисков: потеря функции, дублирование функции, пересечение ответственности.
- Проверка цитат: вывод включается в результат только при совпадении источника и цитаты с извлечённым фрагментом.
- Веб-интерфейс: загрузка, история анализов, сводка, списки подразделений и функций, карточки выводов с доказательствами.
- Telegram-бот как второй интерфейс к тому же backend.
- Фоновый запуск из веба, автоматическое обновление статуса, таймер, сохранение ошибок и повторный запуск без повторной загрузки файлов.
- Локальное хранение результатов и кэш успешных ответов AI-провайдера для ускорения повторов.
Как работает решение
- Пользователь создаёт анализ и загружает документы в группы «До» и «После» — минимум один файл с каждой стороны.
- Backend сохраняет файлы, создаёт запись анализа и передаёт содержимое AI Service.
- Парсеры извлекают текст и координаты источников. LLM и правила выделяют подразделения, функции и роли действий.
- Embeddings используются для поиска смысловых соответствий. Для неоднозначных пар функций сервис обращается к LLM; правила различают, например, исполнение и контроль.
- Сервис ищет потенциальные потери, дублирование и пересечения ответственности, проверяет цитаты и возвращает структурированный результат.
- Backend сохраняет результат. Пользователь видит сводку и открывает каждый вывод вместе с доказательствами.
Веб получает HTTP 202 после запуска и опрашивает состояние. Вкладку можно закрыть: обработка продолжится, пока работает backend. Telegram использует синхронный запуск и получает итог через тот же API.
Технологии
| Компонент | Стек |
|---|---|
| Веб-интерфейс | TypeScript, React 19, Vite 8, React Router, TanStack Query, Tailwind CSS 4, Base UI, Lucide |
| Backend | JavaScript, Node.js, Fastify 5, SQLite через node:sqlite, multipart, CORS, Swagger/OpenAPI |
| AI Service | JavaScript, Node.js, PDF.js для PDF, Mammoth и Cheerio для DOCX, ExcelJS для XLSX, Zod для валидации |
| AI-модели по умолчанию | gpt-4o-mini для извлечения и уточнения соответствий; text-embedding-3-small для смысловых векторов |
| Внешние AI API | OpenAI-совместимые /chat/completions и /embeddings; запросы через встроенный fetch |
| Telegram | Python, python-telegram-bot 22.8, httpx, SQLite для пользовательских сессий |
Модели и адреса API настраиваются переменными окружения. LLM-провайдер должен поддерживать используемый формат json_schema structured output. Это заданная последовательность обработки с вызовами моделей, без автономного поиска в интернете и без дообучения моделей.
Архитектура
flowchart TD
Web[Веб: React] -->|HTTP /api| Backend[Backend: Fastify]
Telegram[Telegram Bot API] --> Bot[Python-бот]
Bot -->|HTTP /api| Backend
Backend --> Storage[(SQLite и загруженные файлы)]
Backend -->|POST /analyze: документы в base64| AI[AI Service]
AI --> Parse[Парсеры PDF / DOCX / XLSX]
Parse --> Match[Извлечение и сопоставление]
Match --> Provider[LLM и Embeddings API]
Match --> Cache[(Локальный кэш)]
Match --> Evidence[Проверка цитат и формирование выводов]
Evidence -->|JSON результата| Backend
frontend/ веб-интерфейс и адаптер ответа API
backend/ API, SQLite, загрузка файлов, управление запуском
ai-service/ парсеры, модели, сопоставление и проверка источников
bot/ Telegram-интерфейс и пользовательские сессии
examples/ before.xlsx и after.xlsx для демонстрации
Backend хранит полный ответ AI Service: summary, fragments, departments, functions, department_matches, function_matches, findings. Источники содержат ID документа и фрагмента, имя файла, цитату и доступные координаты.
Основные маршруты:
| Метод и путь | Назначение |
|---|---|
POST /api/analyses | Создать анализ: {"name":"Демонстрация"} |
POST /api/analyses/:id/documents | Загрузить файл: multipart-поля side=before|after и file |
POST /api/analyses/:id/run?background=true | Запустить в фоне, ответ HTTP 202 |
POST /api/analyses/:id/run | Запустить с ожиданием результата, используется ботом |
GET /api/analyses/:id | Прочитать статус и ошибку |
GET /api/analyses/:id/result | Получить полный JSON завершённого анализа |
GET /api/analyses | Получить историю анализов |
Интерактивная документация API: Swagger UI.
Установка и запуск
Требования
- Node.js 24+ и npm.
- Python 3.10+ — только для Telegram-бота.
- Доступ к AI API и ключ с доступом к LLM и embeddings — для реального анализа.
- Три терминала для AI Service, backend и frontend; четвёртый — при запуске бота.
Подготовка
git clone https://github.com/BAITC-Hacks/hack-30bde13e-ai-krusty-krab.git
cd hack-30bde13e-ai-krusty-krab
Если репозиторий закрыт, для клонирования потребуется доступ к нему. Все следующие блоки начинаются из корня репозитория в отдельном терминале. Команды рассчитаны на macOS/Linux. Существующий .env не перезаписывается.
Терминал 1 — AI Service
cd ai-service
npm ci
cp -n .env.example .env
Откройте ai-service/.env и задайте значения:
LLM_PROVIDER=openai
LLM_API_KEY=ваш_API_ключ
LLM_MODEL=gpt-4o-mini
EMBEDDING_PROVIDER=openai
EMBEDDING_MODEL=text-embedding-3-small
Если используется OpenAI, одного LLM_API_KEY достаточно: embeddings используют его при отсутствии отдельного EMBEDDING_API_KEY. При другом провайдере задайте LLM_BASE_URL, EMBEDDING_BASE_URL и подходящие модели. Ключи не нужно добавлять во frontend.
npm start
Проверка: http://localhost:8001/health.
Терминал 2 — backend
cd backend
npm ci
cp -n .env.example .env
В backend/.env установите:
PORT=3000
AI_SERVICE_URL=http://localhost:8001
USE_MOCK_AI=false
CORS_ORIGINS=http://localhost:5173
npm run dev
Проверка: http://localhost:3000/health. База и файлы создаются в backend/data/.
Терминал 3 — frontend
cd frontend
npm ci
npm run dev
Откройте http://localhost:5173. Vite направляет /api на backend, работающий на порту 3000. Для обычного локального запуска VITE_API_URL задавать не нужно: явно пустое значение включает отдельный демонстрационный режим браузера.
После изменения .env перезапустите соответствующий сервис. Если порт занят, завершите прежний экземпляр сервиса или согласованно измените порты и адреса в настройках.
Telegram-бот — необязательно
Получите токен своего бота через BotFather. Backend и AI Service должны быть запущены.
cd bot
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
export TELEGRAM_BOT_TOKEN='токен_вашего_бота'
export BACKEND_URL='http://127.0.0.1:3000'
python bot.py
Бот читает переменные окружения; файл .env автоматически не загружается. Используется long polling, публичный сервер и webhook не нужны.
В личном чате с ботом:
/new Проверка реорганизации.- Отправьте файлы «до» как документы.
/after, затем отправьте файлы «после»./run— запуск;/result— сводка;/finding 1— первый вывод с цитатами./list— ваши анализы, созданные через бота.
Демонстрация без AI-ключа
Запустите только backend и frontend, оставив в backend/.env USE_MOCK_AI=true. Можно проверить загрузку и сохранение данных, навигацию и получение результата. Содержимое документов не анализируется, выводов не будет; интерфейс показывает предупреждение о демонстрационном режиме.
Как проверить решение
Сценарий на примерах из репозитория
- Запустите все три сервиса с
USE_MOCK_AI=false. - На главной нажмите «Начать анализ».
- Загрузите
examples/before.xlsxв «До»,examples/after.xlsx— в «После». - Нажмите «Запустить анализ». Страница покажет состояние обработки, затем результат.
- Изучите «Обзор», «Подразделения», «Функции» и «Выводы». Откройте карточку вывода и сравните цитату с исходной строкой Excel.
В файлах специально заложены следующие ситуации:
| Что проверять | Данные примера |
|---|---|
| Изменение распределения функций | Обработка заявок на закупки была у отдела закупок; после изменений указана у отдела снабжения и отдела логистики. |
| Потенциальная потеря | Ведение реестра договоров аренды есть «до» и отсутствует в комплекте «после». |
| Потенциальное дублирование | Два подразделения «после» обрабатывают заявки на закупки. |
| Пересечение ответственности | Отдел контроля контролирует обработку тех же заявок. Требуется экспертная оценка разграничения ролей. |
Это контрольные ситуации для проверки, а не обещание фиксированного числа выводов: ответы моделей и пороги могут влиять на результат. Для изучения всех пар соответствий откройте GET /api/analyses/:id/result и поле function_matches.
Автоматические проверки — необязательно
Из корня, после установки зависимостей:
npm test --prefix ai-service
npm test --prefix backend
npm run build --prefix frontend
npm run lint --prefix frontend
Для бота, в его виртуальном окружении:
cd bot
python -m unittest test_bot.py
Проверки AI Service используют подставные ответы и не расходуют токены. Они проверяют парсинг, риски, привязку цитат, ошибки провайдера и кэш. Backend проверяет загрузку, передачу файлов, сохранение результата, ошибки и фоновый запуск. Эти проверки не заменяют оценку точности модели на размеченном корпусе.
Данные и интеграции
Входные данные: загруженные пользователем положения о подразделениях, должностные инструкции, организационные и распорядительные документы, приложения и внутренние нормативные документы. Поддерживаются .pdf, .docx, .xlsx; старые бинарные .doc и .xls не поддерживаются.
Внешние сервисы: настроенный LLM/embeddings API и, при использовании бота, Telegram Bot API. Текстовые фрагменты и функции передаются AI-провайдеру; при загрузке через Telegram файлы также проходят через Telegram. Проверка источников работает по загруженному комплекту, без внешнего веб-поиска или автоматического обращения к нормативным базам.
Локальное хранение:
backend/data/app.sqlite— анализы и результаты;backend/data/uploads/— исходные файлы;bot/data/bot.sqlite— сессии и принадлежность анализов пользователям бота;ai-service/data/provider-cache/— успешные ответы моделей и embeddings, содержащие производные данные документов.
Данные, кэш и .env исключены из Git. Кэш учитывает модель, endpoint, учётные данные и содержимое запроса. Для его отключения задайте PROVIDER_CACHE_DIR= в окружении AI Service; для очистки удалите соответствующий каталог. Удаление анализа само по себе не очищает кэш провайдера.
Ограничения текущей версии
- Качество извлечения: зависит от структуры документа и модели. Метрики precision/recall на размеченном наборе не измерены; оценка уверенности не является статистически откалиброванной вероятностью.
- Документы: PDF должен содержать текстовый слой; OCR для сканов отсутствует. DOCX не даёт надёжных номеров страниц, поэтому используются абзацы/разделы. Графические оргсхемы отдельно не распознаются.
- Размер: до 20 МБ на файл через backend; AI Service ограничивает совокупный JSON-запрос 100 МБ, включая base64. Большие комплекты требуют разбиения.
- Модель организации: сопоставление подразделений преимущественно один к одному; полноценного дерева подчинённости и явной модели слияний/разделений нет.
- Полнота выводов: отсутствие функции устанавливается только относительно загруженного комплекта. При пустом наборе функций «после» выводы о потерях подавляются.
- Представление: есть сводка и карточки; нет отдельной веб-таблицы пар функций, единого экспортируемого заключения и конкретных рекомендаций по перераспределению.
- Доступ и эксплуатация: backend без авторизации, предназначен для локального прототипа. Разделение пользователей в боте не защищает прямой доступ к backend. Для публичного использования нужны авторизация, защита документов и настройка сети.
- Масштабирование: один процесс backend на SQLite-базу; нет внешней очереди задач, автоматического продолжения после перезапуска и общего ограничения нагрузки между анализами.
- Дополнительный анализ: проверка по законодательству/стандартам и бенчмаркинг других операторов отсутствуют.
Развёрнутая версия и ссылки
Публичная deployed-версия не указана в репозитории. Проверяемый вариант — локальный запуск по инструкции выше. localhost доступен только на компьютере, где запущены сервисы.
- Локальный веб-интерфейс
- Локальная документация API
- Репозиторий
- Подробности компонентов: backend, AI Service, frontend, Telegram-бот.
Для будущей публикации frontend собирается командой npm run build в frontend/. Vite proxy действует только при разработке: опубликованному интерфейсу нужен настроенный reverse proxy для /api либо VITE_API_URL с адресом backend, включая /api, и соответствующий CORS_ORIGINS. Готового production-развёртывания в проекте нет.
Авторы коммитов
История коммитов
- 2026-09-23 17:39I'm so tired, bossgerc0u
- 2026-09-23 17:34update bot,pzMonky-g0d
- 2026-09-23 17:30Rebrand project to Reorg AI and refresh docscl0rex1
- 2026-09-23 17:17Speed up analysis, cache provider work and recover web resultscl0rex1
- 2026-09-23 16:55Raise provider timeout and identify timed out stagegerc0u
- 2026-09-23 16:52Test configured LLM analysis pathgerc0u
- 2026-09-23 16:49Expose analysis provider failures in resultsgerc0u
- 2026-09-23 16:42Update README.mdMonky-g0d
Все коммиты (28)
- 2026-09-23 16:37Handle long analyses and remove bot token from examplecl0rex1
- 2026-09-23 15:46Polish Hackalem AI interface designcl0rex1
- 2026-09-23 15:42Merge branch 'main' of https://github.com/BAITC-Hacks/hack-30bde13e-ai-krusty-krabgerc0u
- 2026-09-23 15:41Remove redundant frontend env examplegerc0u
- 2026-09-23 15:41Polish Hackalem AI interface designcl0rex1
- 2026-09-23 15:39Fix analysis service configuration and error reportinggerc0u
- 2026-09-23 15:23Merge pull request #4 from BAITC-Hacks/telegram_botBogdan Kovryzhenko
- 2026-09-23 15:20Merge main into telegram_bot, keep backend from mainMonky-g0d
- 2026-09-23 15:14Telegram_BotMonky-g0d
- 2026-09-23 15:08Switch AI handoff to JSON and align clientscl0rex1
- 2026-09-23 14:39add gitignorecl0rex1
- 2026-09-23 14:25dsgerc0u
- 2026-09-23 14:24fix: remove .DS_Store and ignore macOS filesgerc0u
- 2026-09-23 14:12Merge pull request #3 from BAITC-Hacks/backendBogdan Kovryzhenko
- 2026-09-23 14:10backand v1Monky-g0d
- 2026-09-23 14:01Merge pull request #2 from BAITC-Hacks/codex/ai-servicegerc0u
- 2026-09-23 13:59Create .DS_Storegerc0u
- 2026-09-23 13:56Build Node.js AI analysis servicegerc0u
- 2026-09-23 13:52Merge pull request #1 from BAITC-Hacks/frontendAmirlan Suleimenov
- 2026-09-23 13:49Add React frontend for reorg analysiscl0rex1
Структура репозитория (70 файлов)
.gitignore README.md ai-service/.env.example ai-service/README.md ai-service/package-lock.json ai-service/package.json ai-service/src/analysis.js ai-service/src/cache.js ai-service/src/concurrency.js ai-service/src/extraction.js ai-service/src/parsing.js ai-service/src/providers.js ai-service/src/schema.js ai-service/src/server.js ai-service/test/api.test.js ai-service/test/integration.test.js ai-service/test/parsing.test.js ai-service/test/providers.test.js backend/.env.example backend/README.md backend/app/db.js backend/app/main.js backend/app/services/ai_client.js backend/app/services/storage.js backend/data/.gitkeep backend/package-lock.json backend/package.json backend/tests/flow.test.js bot/.env.example bot/README.md bot/bot.py bot/requirements.txt bot/test_bot.py design.md examples/after.xlsx examples/before.xlsx frontend/.oxlintrc.json frontend/README.md frontend/components.json frontend/index.html frontend/package-lock.json frontend/package.json frontend/src/App.tsx frontend/src/api/analysis.ts frontend/src/components/StateMessage.tsx frontend/src/components/ui/badge.tsx frontend/src/components/ui/button.tsx frontend/src/components/ui/card.tsx frontend/src/components/ui/table.tsx frontend/src/features/analysis/FunctionsList.tsx frontend/src/features/analysis/SummaryGrid.tsx frontend/src/features/departments/DepartmentsList.tsx frontend/src/features/evidence/EvidenceViewer.tsx frontend/src/features/findings/FindingsList.tsx frontend/src/features/upload/DocumentPicker.tsx frontend/src/hooks/use-analysis.ts frontend/src/index.css frontend/src/lib/labels.ts frontend/src/lib/utils.ts frontend/src/main.tsx frontend/src/pages/AnalysisPage.tsx frontend/src/pages/FindingPage.tsx frontend/src/pages/HomePage.tsx frontend/src/pages/NewAnalysisPage.tsx frontend/src/types/analysis.ts frontend/tokens.css frontend/tsconfig.app.json frontend/tsconfig.json frontend/tsconfig.node.json frontend/vite.config.ts
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.