О проекте
Команда: vivalet
Кейс HackAlem.ai: Спецтрек — Казахтелеком
Стадия: Рабочий MVP
Задача кейса: Агент, сравнивающий документы оргструктуры до и после реорганизации
Суть
Прототип, сравнивающий документы оргструктуры «до» и «после» реорганизации: находит перемещённые, потерянные, дублирующиеся функции и конфликты исполнения/контроля с цитатами.
Как устроено
PDF/DOCX/XLSX парсятся (pdf-parse, Mammoth, SheetJS) во фрагменты с местоположением (раздел, страница, абзац). OpenAI Responses API со строгой JSON-схемой извлекает подразделения и функции, embeddings text-embedding-3-small ищут кандидатов соответствия, отдельные запросы делают смысловую проверку и итоговое заключение. Валидатор оставляет только выводы с точной цитатой из исходного фрагмента, остальное — в needsReview; без ключа работает режим правил. Результаты в SQLite через Prisma, экспорт JSON/Markdown.
Ключевые решения
- structured output JSON schema
- embeddings similarity matching
- проверка точных цитат
- детекция конфликта функций исполнения и контроля
- rules fallback
Особенности
Жёсткий анти-галлюцинационный слой: вывод о потере функции невозможен без цитаты «до», а о дублировании/конфликте — без цитат обеих функций; документы подаются модели как недоверенные данные. Панель источника показывает точный фрагмент.
Стек
TypeScript · Next.js 16 · React 19 · Prisma · SQLite · OpenAI SDK · Mammoth · pdf-parse · SheetJS · Vitest
Модели
gpt-4.1-mini · text-embedding-3-small
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-d9feb74b-vivalet.
README
README.mdVivalet — AI Organization Auditor
Прототип для сопоставления организационной структуры и функций подразделений до и после реорганизации. Интерфейс и выводы на русском языке.
Problem
Положения, организационные схемы и инструкции приходится сравнивать вручную. При этом трудно проследить, какая функция переместилась, исчезла из нового документа или оказалась закреплена за несколькими подразделениями.
Solution
Приложение принимает документы «до» и «после», извлекает текст с указанием местоположения, строит список подразделений и функций, сопоставляет их и показывает возможные изменения с цитатами. Выводы о потерях, дублировании и конфликте интересов являются гипотезами для проверки сотрудником.
Features
- Загрузка нескольких PDF, DOCX и XLSX в каждую сторону сравнения.
- Сохранение анализов и распознанных фрагментов в SQLite.
- Сопоставление подразделений, функций и потенциальных потерь.
- Поиск возможного дублирования и конфликта функций исполнения и контроля.
- Проверка каждого вывода на наличие точной цитаты в исходном фрагменте.
- Панель источника с разделом, страницей, абзацем или строкой.
- Экспорт результата в JSON и Markdown.
- Демо на документах редакций №8 и №9 из
testdocs/.
Architecture
flowchart LR
A[PDF / DOCX / XLSX] --> B[Парсер и фрагменты]
B --> C[Извлечение подразделений и функций]
C --> D[Нормализация]
D --> E[Сопоставление подразделений]
D --> F[Поиск кандидатов и сверка функций]
E --> G[Выводы]
F --> G
G --> H[Проверка цитат]
H --> I[Заключение и интерфейс]
I --> J[(SQLite)]
AI Pipeline
Если задан OPENAI_API_KEY, приложение использует Responses API со строгой JSON-схемой для извлечения сущностей, embeddings для поиска похожих функций, отдельные запросы для смысловой проверки и генерации итогового заключения. Документы передаются модели как недоверенные данные. Текст функции всегда хранится и цитируется в исходном виде. Кандидаты без точной цитаты отсеиваются.
Без ключа работает явно обозначенный режим правил: извлечение по структуре текста и сопоставление по действиям и словам. Он нужен для локального запуска и демонстрации без внешнего API; его выводы требуют более тщательной проверки. Демо никогда не подменяется готовым JSON.
Tech Stack
Next.js 16, React 19, TypeScript, Prisma 6, SQLite, OpenAI SDK, Mammoth, pdf-parse, SheetJS, Vitest.
Project structure
src/app/— страницы и HTTP-маршруты.src/components/AnalysisView.tsx— экран результатов и панель источника.src/lib/documents.ts— парсеры и привязка цитат.src/lib/analysis/— извлечение, сопоставление, проверка доказательств и pipeline.src/lib/ai/— клиент, схемы ответов и инструкции модели.prisma/schema.prisma— схема хранения.tests/— проверки ключевых правил.testdocs/— предоставленные документы для демо.
Prerequisites
Node.js 20.9+ и npm. Для AI-режима нужен ключ OpenAI и сетевой доступ.
Installation
npm install
При первом npm run dev или npm run build скрипт создаёт .env из примера и инициализирует SQLite через Prisma. Для AI-режима добавьте ключ в .env.
Environment variables
DATABASE_URL="file:./dev.db"
OPENAI_API_KEY=""
OPENAI_MODEL="gpt-4.1-mini"
OPENAI_EMBEDDING_MODEL="text-embedding-3-small"
Ключ используется только на сервере. .env и локальная база исключены из Git.
Database setup
Обычно выполняется автоматически. Для ручного обновления схемы:
npm run db:push
Run locally
npm run dev
Откройте http://localhost:3000. Для production-сборки: npm run build и npm start.
Demo scenario
Нажмите «Запустить демо». Приложение загрузит редакцию №8 как «до», редакцию №9 как «после» и запустит тот же pipeline, что используется для пользовательских файлов. Вкладки результата показывают обзор, структуру, функции, выводы и заключение. Нажмите на ссылку источника, чтобы увидеть точный фрагмент.
How analysis works
- Парсеры переводят документ в фрагменты с местоположением.
- Извлекаются подразделения и функции. Нормализованный текст нужен только для поиска соответствий.
- Подразделения сопоставляются по названиям и функциям.
- Для функций ищутся кандидаты. В AI-режиме используются embeddings и отдельная смысловая проверка.
- Формируются гипотезы о потерях, перемещениях, изменениях, пересечениях и конфликте интересов.
- Валидатор проверяет ссылки на документы, существование фрагмента и точное вхождение цитаты.
- Только проверенные выводы попадают в основной результат; остальные записываются в
needsReview.
Explainability / source traceability
Каждый вывод содержит причину, оценку уверенности и ссылки на фрагменты. Для потенциальной потери обязательна цитата «до»; для дублирования и конфликта — цитаты обеих функций. Отсутствие явного соответствия после реорганизации не доказывает фактическую утрату функции.
Limitations
- PDF без текстового слоя не распознаётся; OCR не включён.
- Режим правил опирается на формулировки документа и может пропустить синонимы или неверно распределить функции между подразделениями.
- Очень большие документы требуют больше запросов к модели и могут обрабатываться дольше; синхронный HTTP-запуск рассчитан на демонстрационные комплекты.
- Локальный прототип не имеет авторизации; не размещайте его публично с конфиденциальными документами.
Security notes
Загруженный текст считается недоверенным. Инструкции из документа не исполняются. API-ключ не передаётся в браузер. Размер одного файла ограничен 20 МБ.
Future development
OCR, более точное извлечение иерархии и ролей, пакетная обработка больших документов, доступ по ролям и сравнение с предоставленными нормативными требованиями.
Verification
npm run lint
npm test
npm run build
Авторы коммитов
История коммитов
- 2026-09-23 17:54commitienslxms
- 2026-09-23 17:30wetassreborn
- 2026-09-23 17:18Fixed sqliteRuslanski
- 2026-09-23 17:09Reviewing semanticsRuslanski
- 2026-09-23 16:13chapterssienslxms
- 2026-09-23 15:53fixesienslxms
- 2026-09-23 15:16frontienslxms
- 2026-09-23 14:36back commitienslxms
Структура репозитория (55 файлов)
.env.example .gitignore AGENTS.md CLAUDE.md PROMPT.md README.md eslint.config.mjs next-env.d.ts next.config.ts package-lock.json package.json prisma/schema.prisma scripts/setup.mjs src/app/analysis/[id]/page.tsx src/app/api/analyses/[id]/chat/route.ts src/app/api/analyses/[id]/documents/route.ts src/app/api/analyses/[id]/review/route.ts src/app/api/analyses/[id]/route.ts src/app/api/analyses/[id]/run/route.ts src/app/api/analyses/route.ts src/app/api/demo/route.ts src/app/globals.css src/app/history/page.tsx src/app/layout.tsx src/app/page.tsx src/components/AnalysisView.tsx src/components/DocumentStructure.tsx src/components/OrgChart.tsx src/components/SemanticResults.tsx src/lib/ai/client.ts src/lib/ai/prompts.ts src/lib/ai/schemas.ts src/lib/analysis/evidence.ts src/lib/analysis/export.ts src/lib/analysis/extract.ts src/lib/analysis/hierarchy.ts src/lib/analysis/matching.ts src/lib/analysis/pipeline.ts src/lib/analysis/quote.ts src/lib/analysis/sections.ts src/lib/analysis/semantic-report.ts src/lib/analysis/semantic.ts src/lib/db.ts src/lib/documents.ts src/lib/types.ts techtask.md testdocs/Положение_о_внутреннем_аудите_редакция_8_обезличено.docx.pdf testdocs/Положение_о_внутреннем_аудите_редакция_9_обезличено.docx tests/core.test.ts tests/extraction-evidence.test.ts tests/sections.test.ts tests/semantic.test.ts tests/setup.test.ts tests/structure.test.ts tsconfig.json
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.