О проекте
Команда: Батыс
Кейс HackAlem.ai: Спецтрек — Казахтелеком
Стадия: Доведённый продукт
Задача кейса: Агент, сравнивающий документы оргструктуры до и после реорганизации
Суть
Объяснимый агент, который сравнивает комплекты документов оргструктуры до и после реорганизации. Он находит созданные, сохранённые и упразднённые подразделения, потерю и сужение функций, дублирование и конфликты полномочий, а к каждому выводу даёт цитату и номер пункта. Есть веб-версия (PWA), мобильное приложение на Expo и роль эксперта, который подтверждает или отклоняет выводы.
Как устроено
DOCX, PDF, XLSX и TXT разбираются через mammoth, pdf-parse и ExcelJS. Собственный детерминированный алгоритм (русский стеммер, глобальное сопоставление пунктов, учёт перехода функций) строит таблицу «пункт ДО ↔ пункт ПОСЛЕ» с процентом сходства и статусами. По желанию включается AI-агент с tool calling (search_document, read_clause, submit_verdict): он перепроверяет только готовых кандидатов, а каждая его ссылка на пункт сверяется с документом. Анализы и решения эксперта хранятся в PostgreSQL (JSONB), итог выгружается печатным HTML-заключением.
Ключевые решения
- русский стеммер
- глобальное сопоставление функций
- tool calling (search_document/read_clause/submit_verdict)
- проверка ссылок агента на пункты
- RACI-рекомендации
- JWT-роли expert/admin
Особенности
Основной результат даёт детерминированное ядро, которому не нужен ключ. LLM-агент только перепроверяет готовых кандидатов, а ссылки на несуществующие пункты подсвечиваются красным, поэтому выдумать доказательство нельзя. Ожидания по контрольному комплекту организатора (редакции 8→9) закреплены в автотесте. Есть мобильный клиент на Expo и одностраничная презентация в PDF.
Стек
Node.js 22 · Express 5 · PostgreSQL 16 · Docker Compose · Expo / React Native · PWA (vanilla HTML/CSS/JS) · mammoth · pdf-parse · ExcelJS
Модели
OpenAI (OPENAI_MODEL) · NVIDIA NIM deepseek-ai/deepseek-v4.1-flash
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-032ef148-team.
README
README.mdБАТЫС AI
Объяснимый ИИ-агент для анализа организационной структуры и функционала. Кейс HackAlem AI «Анализ организационной структуры и функционала», команда БАТЫС.
Агент сравнивает комплекты документов «до» и «после» реорганизации: оргструктуры, положения, должностные инструкции, приказы (Word, PDF, Excel). На каждую сторону можно загрузить до 10 файлов. Он определяет созданные, сохранённые, преобразованные и упразднённые подразделения, строит таблицу сопоставления функций, находит потери, сужения, переносы, дублирование и конфликты полномочий. Каждый вывод подтверждается номером пункта и цитатой из исходного документа. Окончательное решение принимает эксперт.

Презентация на одном листе: docs/presentation.html. Там схема архитектуры, путь анализа, находки на контрольном комплекте и сверка с ТЗ. Готовый PDF для печати и показа: docs/batys-ai-presentation.pdf.
Быстрый старт: 1 команда, 1 клик
git clone https://github.com/BAITC-Hacks/hack-032ef148-team.git
cd hack-032ef148-team
docker compose up --build
Откройте http://localhost:4180 и нажмите «▶ Положение о внутреннем аудите: редакция 8 → 9». Агент проанализирует контрольный комплект организатора примерно за секунду.
Запуск без Docker (Node.js 22+)
npm install
npm start # http://127.0.0.1:4180, хранение в памяти
Чтобы использовать PostgreSQL без Docker, укажите DATABASE_URL в .env (шаблон: .env.example).
Соответствие ТЗ
| Требование ТЗ (Must have) | Как реализовано |
|---|---|
| 1. Какие подразделения реорганизованы, сохранены, созданы | Вкладка «Подразделения»: статусы создано / сохранено / преобразовано / упразднено с учётом перехода функций. Отдельно выявляются упразднённые позиции-владельцы функций |
| 2. Сопоставить функционал, выявить потерю функций | Вкладка «Сопоставление функций»: таблица «пункт ДО ↔ пункт ПОСЛЕ» со статусом и % сходства. Выводы «Потеря функции» и «Сужение функции» |
| 3. Дублирование и конфликт интересов | Сравнение функций разных владельцев в новой редакции. Типовые обязанности руководителей отфильтрованы. Контрольные функции у двух владельцев помечаются как конфликт полномочий |
| 4. Подтверждающий источник для каждого вывода | У каждого вывода есть документ, номер пункта, владелец и цитата. Проверяется автотестом |
| 5. Итоговое аналитическое заключение | Кнопка «Открыть отчёт»: печатное заключение с итогом, таблицами и статусами экспертной проверки |
| Ограничение: выводы рекомендательные | Каждый вывод эксперт подтверждает или отклоняет с комментарием. Прогресс проверки виден в интерфейсе и в отчёте |
| Ограничение: без неподтверждённых утверждений | Детерминированное ядро не может сослаться на несуществующий пункт. AI-агент проверяет только готовых кандидатов, а каждая его ссылка на пункт сверяется с документом (AI-контракт) |
| Опционально: рекомендации по перераспределению | У каждого вывода есть рекомендация: назначить владельца, развести зоны через RACI, подтвердить передачу |
Проверка на контрольном комплекте
ТЗ, п. 11: «проверяется, обнаружил ли агент реорганизацию, потерю функции и дублирование и указал ли корректные источники». Результат на samples/ (редакции 8 → 9):
| Что изменилось в документах | Что нашёл агент | Источник |
|---|---|---|
| Созданы ДИТААД и ДОА | Создано подразделение ×2 | п. 3.4 ред. 9 |
| ДНМ и ДККМ сохранены | Сохранено ×2, указано, сколько функций осталось за каждым | п. 3.4 |
| Упразднена должность «Директор направления внутреннего аудита» | Упразднён владелец функций: 10 из 12 функций перешли к директорам департаментов | п. 5.3 ред. 8 |
| У ДККМ исключены «анализ результатов непрерывного аудита» и «предложения в план работ» | Потеря функции: осталась только у ДНМ | п. 5.5.4, 5.5.10 ред. 8 |
| Из отчётности ДККМ выпала периодичность «ежеквартально и по итогам года» | Сужение функции | п. 5.5.5 → 5.5.3 |
| Функции директоров департаментов пересекаются с функциями директора ДНМ | Возможное дублирование, конфликт полномочий | п. 5.3.x ↔ 5.4.x ред. 9 |
Эти ожидания зафиксированы в автотесте test/analyzer.test.mjs:
npm test # 11 тестов: контрольный комплект организатора, AI-агент на подставной модели, загрузка комплекта файлов, авторизация и роли, помощь и заключение
Демонстрационный сценарий (5 минут)
- Главный экран: кнопка «▶ Положение о внутреннем аудите: редакция 8 → 9».
- Метрики: подразделения, потери, сужения, переносы, дубли, конфликты.
- Фильтр «Потери»: ДККМ 5.5.4 и цитаты «ДО/ПОСЛЕ» рядом.
- Вкладка «Подразделения»: созданы ДИТААД и ДОА, сохранены ДНМ и ДККМ.
- Вкладка «Сопоставление функций», фильтр «Сужены»: пропавшая периодичность отчётов.
- Нажать «Подтвердить»: откроется вход эксперта, зарегистрироваться. Подтвердить один вывод и отклонить другой с комментарием, показать подпись эксперта и прогресс проверки.
- «Открыть отчёт»: печатное заключение.
- Показать то же на телефоне в приложении Expo (или PWA).
В интерфейсе есть раздел «Помощь» с пошаговой инструкцией и скриншотами. Там же показан QR-код и адрес для открытия системы на телефоне. В мобильном приложении есть такая же вкладка «Помощь» и ссылка на веб-версию.
Второй набор, «Синтетический пример», показывает упразднение отдела с передачей 2 из 3 функций и потерю антикоррупционной функции.
Технологии
| Слой | Стек | Почему |
|---|---|---|
| Сервер | Node.js 22+, Express 5, Helmet, rate-limit, JWT (jsonwebtoken), scrypt | Один язык с фронтендом и мобильным приложением, быстрый старт |
| Разбор документов | mammoth (DOCX), pdf-parse (PDF), ExcelJS (XLSX), CSV/TXT | Форматы из ТЗ: Word, PDF, Excel |
| Анализ | Собственный объяснимый алгоритм: русский стеммер, глобальное сопоставление, переход функций | Прослеживаемость и воспроизводимость |
| AI | AI-агент с tool calling: OpenAI или NVIDIA NIM (опционально) | Сам ищет доказательства в документах, ссылки проверяются, решение за экспертом |
| База данных | PostgreSQL 16 (JSONB), резервный режим в памяти | История анализов и решений эксперта |
| Веб | HTML/CSS/JS без фреймворка, PWA | Лёгкий, устанавливается на телефон |
| Мобильное | Expo SDK 57 / React Native, Android и iOS | Один код для двух платформ, запуск через Expo Go |
| Инфраструктура | Docker Compose (app + db), healthcheck | Запуск одной командой |
Подробности: архитектура и алгоритм · AI-контракт · безопасность · мобильные клиенты.
Мобильное приложение (Android и iOS)
cd mobile
npm install
EXPO_PUBLIC_API_URL=http://<IP-компьютера>:4180 npx expo start
Отсканируйте QR-код в Expo Go. Возможности: загрузка файлов с телефона, демо в одно нажатие, выводы с цитатами, экспертная проверка, история. Инструкция и сборка APK: docs/MOBILE.md.
API
| Метод | Путь | Назначение |
|---|---|---|
| GET | /api/health | Готовность, режим AI и хранилища |
| GET | /api/demo | Список демо-наборов |
| POST | /api/demo/:id | Анализ демо-набора (real, synthetic) |
| POST | /api/analyses | multipart: before и after — комплекты до 10 файлов на сторону, name, useAi |
| GET | /api/analyses | История анализов |
| GET | /api/analyses/:id | Полный результат: findings, units, functionMap, summary |
| PATCH | /api/analyses/:id/findings/:findingId | Решение эксперта {status, comment}, нужен вход |
| GET | /api/analyses/:id/report | Печатное заключение (HTML) |
| POST | /api/auth/signup · /signin · /logout | Регистрация, вход (возвращает JWT), выход с отзывом токенов |
| GET | /api/auth/me | Текущий пользователь |
| GET · PATCH · DELETE | /api/users, /api/users/:id | Управление пользователями и ролями (только admin) |
Пользователи и роли
Анализ и просмотр доступны без входа, поэтому демо проверяется в один клик. Подтверждать и отклонять выводы может только эксперт. При нажатии «Подтвердить» открывается вход или регистрация, а решение подписывается именем эксперта и попадает в заключение.
| Роль | Права |
|---|---|
| без входа | анализ, демо, просмотр результатов и заключения |
expert | + подтверждение и отклонение выводов с комментарием |
admin | + управление пользователями и ролями. Первый зарегистрированный пользователь становится администратором |
Для постоянного входа задайте JWT_SECRET в .env. Подробнее: SECURITY.md.
AI-агент (опционально)
Включается переключателем «AI-агент проверки выводов». По каждому значимому выводу (до AI_MAX_FINDINGS, по умолчанию 12, сначала критичные) агент сам ведёт расследование через инструменты:
search_document— ищет функцию в редакции «до» или «после» (в том числе другими словами, чтобы отличить перенос от потери);read_clause— читает найденный пункт целиком;submit_verdict— выносит вердикт (подтверждён / сомнителен, уверенность, обоснование, рекомендация) со ссылками на пункты.
Каждая ссылка агента сверяется с документами: несуществующий пункт помечается красным, поэтому выдумать доказательство нельзя. Все шаги агента видны в карточке вывода, окончательное решение остаётся за экспертом.
Провайдер задаётся в .env: OPENAI_API_KEY (ключ sk-… с platform.openai.com, модель OPENAI_MODEL) или NVIDIA_API_KEY (ключ nvapi-… с build.nvidia.com, модель NVIDIA_MODEL, по умолчанию deepseek-ai/deepseek-v4.1-flash). Ключ другого вида сервер игнорирует. Если ключа нет или произошла ошибка, сохраняется локальный результат. Основной сценарий работает полностью без ключа.
Данные
samples/polozhenie-vnutrenniy-audit-red-8.docx,…-red-9.docx: обезличенный контрольный комплект организатора.samples/synthetic/: синтетический пример, придуман командой, совпадения случайны.
Ограничения
- Стеммер упрощённый. Для других типов документов (должностные инструкции, приказы) могут понадобиться новые шаблоны заголовков.
- Проверка соответствия внешним нормативам и бенчмаркинг с другими операторами (опциональные пункты ТЗ) не реализованы.
- Авторизация по email и паролю. Для промышленного контура нужны корпоративный SSO, TLS и антивирусная проверка, см. SECURITY.md.
- Мобильное приложение проверено сборкой бандлов Android/iOS и
expo-doctor. На физических устройствах в рамках хакатона оно не тестировалось.
Команда и вклад
- Команда: БАТЫС
- Бисенбаев Султан Бекрикулы: постановка задачи, продуктовая логика, проверка требований ТЗ, демо-сценарий, разработка с использованием AI-агентов (Codex, Claude Code).
Авторы коммитов
История коммитов
- 2026-09-23 17:56Revalidate static files on every loadSultan
- 2026-09-23 17:51Fix the collapsed sidebar spilling text over the page titleSultan
- 2026-09-23 17:50Add the presentation as an A4 PDFSultan
- 2026-09-23 17:48Add a one-page presentation in hand-drawn sketch styleSultan
- 2026-09-23 17:46Remove the TaskForge AI prototype from another caseSultan
- 2026-09-23 17:41Restyle the web app as dark glassmorphism with neon accentsSultan
- 2026-09-23 17:37Load styles and scripts over HTTP when opened by LAN addressSultan
- 2026-09-23 17:26Review findings with a tool-using AI agent (OpenAI or NVIDIA)Sultan
Все коммиты (22)
- 2026-09-23 17:24Split help into web and mobile guides with a proper help iconSultan
- 2026-09-23 17:19Ignore OpenAI keys that are not sk- API keysSultan
- 2026-09-23 17:19Suggest a new owner for lost and duplicated functionsSultan
- 2026-09-23 17:14Accept a set of documents per side, as the task scenario requiresSultan
- 2026-09-23 17:10Add in-app help with screenshots and cross-links between web and mobileSultan
- 2026-09-23 17:00Add JWT sign-in with expert and admin rolesSultan
- 2026-09-23 16:52Run the mobile app in a browser via Expo webSultan
- 2026-09-23 16:41Set explicit Compose project nameSultan
- 2026-09-23 16:40Build БАТЫС AI: explainable org-structure analysis agent (HackAlem case)Sultan
- 2026-09-23 15:46Build TaskForge AI hackathon MVPSultan
- 2026-09-23 15:46Add project chat handoff for VS CodeSultan
- 2026-09-23 15:46Initial commitSultan
- 2026-09-23 15:46Protect API keys and local filesSultan
- 2026-09-23 15:46Add API environment templateSultan
Структура репозитория (68 файлов)
.dockerignore .env.example .gitignore Dockerfile README.md docker-compose.yml docs/AI_CONTRACT.md docs/ARCHITECTURE.md docs/CHAT_HISTORY.md docs/MOBILE.md docs/SECURITY.md docs/batys-ai-presentation.pdf docs/presentation.html docs/screenshots/function-map.png docs/screenshots/home.png docs/screenshots/mobile-web.png docs/screenshots/results.png docs/screenshots/units.png mobile/.gitignore mobile/AGENTS.md mobile/App.js mobile/CLAUDE.md mobile/LICENSE mobile/README.md mobile/app.json mobile/assets/android-icon-background.png mobile/assets/android-icon-foreground.png mobile/assets/android-icon-monochrome.png mobile/assets/favicon.png mobile/assets/icon.png mobile/assets/splash-icon.png mobile/index.js mobile/package-lock.json mobile/package.json package-lock.json package.json public/app.js public/help/1-start.png public/help/2-results.png public/help/3-evidence.png public/help/4-units.png public/help/5-functions.png public/help/6-login.png public/help/7-report.png public/help/mobile-1.png public/help/mobile-2.png public/icon.svg public/index.html public/manifest.webmanifest public/styles.css public/sw.js samples/polozhenie-vnutrenniy-audit-red-8.docx samples/polozhenie-vnutrenniy-audit-red-9.docx samples/synthetic/polozhenie-bva-redakciya-8.txt samples/synthetic/polozhenie-bva-redakciya-9.txt src/ai-agent.mjs src/analyzer.mjs src/app.mjs src/auth.mjs src/config.mjs src/connect.mjs src/parser.mjs src/report.mjs src/server.mjs src/store.mjs test/ai-agent.test.mjs test/analyzer.test.mjs test/api.test.mjs
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.