О проекте
Команда: ITAI GANG #1
Кейс HackAlem.ai: Спецтрек — Казахтелеком
Стадия: Прототип
Задача кейса: Агент, сравнивающий документы оргструктуры до и после реорганизации
Суть
Streamlit-приложение и агент для сравнения документов оргструктуры до и после реорганизации: подразделения, функции (сохранены, переданы, потеряны, дублируются), конфликты интересов и рекомендации со ссылками на источники.
Как устроено
Загружаются два комплекта DOCX/PDF/XLSX. Парсеры (src/parsers.py) нарезают их на фрагменты с id, документом, версией before/after, пунктом и текстом. Агент (src/agent.py) через NVIDIA NIM с function calling строит отчёт по Pydantic-схемам, у каждого вывода обязателен непустой source_ids. UI проверяет JSON-контракт и существование ссылок, показывает пять вкладок и исходные фрагменты, умеет экспортировать JSON и текстовый отчёт. Есть демо-режим на вымышленных документах без ключа.
Ключевые решения
- function calling
- парсинг DOCX/PDF/XLSX
- grounding через source_ids
- Pydantic-схемы
- JSON Schema контракт
Особенности
Жёсткий контракт между парсером, агентом и UI: источники берутся из парсера, а не генерируются моделью, и каждая ссылка проверяется на существование. В README честно оговорено, что отсутствие упоминания в одном фрагменте ещё не доказывает потерю функции.
Стек
Python 3.11 · Streamlit · Pydantic · unittest
Модели
NVIDIA NIM · OpenAI
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-77e81b8d-itai-gang-1.
README
README.mdОргАнализ — интерфейс Person 3
Прототип Streamlit для сравнения организационной структуры и функций до и после реорганизации. Интерфейс показывает результаты агента, обоснования и конкретные фрагменты источников. Решения об изменениях принимает backend команды.
Запуск в VS Code (Windows, PowerShell)
Требуется Python 3.11 или новее. Выполняйте команды в папке проекта:
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
.\.venv\Scripts\python.exe -m streamlit run app.py
Если окружение уже создано и зависимости установлены, нужна только последняя команда.
Откройте http://localhost:8501. Остановить приложение: Ctrl+C в терминале.
В VS Code выберите интерпретатор .venv\Scripts\python.exe через Ctrl+Shift+P → Python: Select Interpreter.
Ключи NIM
Для режима «Документы» нужны NVIDIA_API_KEY и NIM_MODEL. Их можно задать перед запуском:
$env:NVIDIA_API_KEY = "<ваш ключ>"
$env:NIM_MODEL = "<модель NIM с function calling>"
$env:NIM_BASE_URL = "https://integrate.api.nvidia.com/v1"
.\.venv\Scripts\python.exe -m streamlit run app.py
Либо скопируйте .streamlit/secrets.example.toml в .streamlit/secrets.toml и заполните значения. Реальный secrets.toml игнорируется Git. Также ключ можно ввести в боковой панели Streamlit на время текущей сессии.
Что работает сейчас
- Демонстрация: вымышленные документы, потенциальная потеря функции, дублирование и конфликт интересов. Не требует ключа NIM.
- Документы: два комплекта DOCX/PDF/XLSX, по несколько файлов, до 30 МБ на файл. Кнопка анализа включается после подключения
backend.pyи загрузки обоих комплектов. - Готовый JSON: просмотр результата команды по предварительному контракту.
- Пять вкладок: подразделения, функции, дублирование, конфликты, заключение и рекомендации.
- Для выбранного вывода можно раскрыть источник: ID, документ, версия, пункт и текст.
- Скачивание JSON и текстового отчёта с обоснованиями и источниками.
- Проверка формата JSON, уникальности ID источников и существования каждой ссылки.
- После изменения загруженных документов предыдущий результат скрывается.
Интерфейс не выполняет реальный анализ, пока команда не подключит backend. Он не сохраняет загруженные документы на диск. Их обработка и политика хранения после подключения backend зависят от реализации команды.
Подключение Person 1 и Person 2
Формат пока предварительный, так как общего JSON у команды ещё нет. Согласуйте ui_contract.py перед интеграцией; бизнес-валидация остаётся у Person 1.
- Person 2 возвращает фрагменты с полями
id,document,version(before/after),location(пункт/страница/лист и строка),text. ID должны быть уникальны для обоих комплектов, даже если имена файлов совпадают. - Person 1 создаёт
backend.pyрядом сapp.pyс функцией:
def analyze_documents(before, after) -> dict:
# before и after: списки InputDocument(name: str, content: bytes).
# Вызвать парсер, NIM и валидацию; вернуть отчёт по ui_contract.py.
# sources брать из парсера, а не генерировать моделью.
...
- Функция возвращает обычный словарь. Если у команды другая схема/сигнатура, преобразуйте её в
backend_adapter.py.
Поля результата:
| Поле | Содержимое |
|---|---|
departments | Выводы со статусами created, preserved, reorganized, removed |
functions | Выводы со статусами preserved, transferred, lost, duplicated, new; списки before_units, after_units |
duplicates, conflicts, recommendations | Списки выводов |
conclusion | Один итоговый вывод |
sources | Фрагменты парсера |
У каждого вывода обязательны title, explanation, непустой source_ids. Пустые списки разделов допустимы. Полный пример доступен в examples/demo.json: загрузите его в режиме «Готовый JSON». Машиночитаемая схема — examples/report.schema.json.
source_ids и Pydantic проверяют структуру и наличие ссылок, но не доказывают, что цитата подтверждает вывод. Это проверяют агент, backend и ответственный сотрудник. Для потенциальной потери функции нужно проверять полноту комплекта «после»: отсутствие упоминания в одном фрагменте не доказывает потерю функции.
Файлы
app.py— интерфейс и экспорт отчёта; начни редактирование здесь.backend_adapter.py— подключение к функции команды.ui_contract.py— предварительный контракт интерфейса.demo_data.py— учебный пример.tests/test_ui.py— проверка ссылок, интерфейса и передачи документов backend.
Проверка
.\.venv\Scripts\python.exe -m unittest discover -s tests -v
API интерфейса: Streamlit, проверка UI: AppTest.
Для демонстрации откройте вкладку «Функции», выберите потерю реестра договоров, раскройте пункты «до» и «после», затем покажите дублирование и потенциальный конфликт. Скачайте отчёт и загрузите его обратно через «Готовый JSON».
Авторы коммитов
История коммитов
- 2026-09-23 17:47Configure OpenAI example and add local launcherYungArti
- 2026-09-23 16:52Merge pull request #3 from BAITC-Hacks/integration/backend-for-interfacesaper-avi
- 2026-09-23 16:33Add NIM credential configurationsaper-avi
- 2026-09-23 16:28Connect parser and NIM agent to UI backendsaper-avi
- 2026-09-23 16:12Merge pull request #2 from BAITC-Hacks/interface-betaМерей
- 2026-09-23 15:53Merge remote-tracking branch 'origin/M-beta-1' into interface-betaYungArti
- 2026-09-23 15:49Merge pull request #1 from BAITC-Hacks/M-beta-1Мерей
- 2026-09-23 15:44Add interface beta for organizational analysisYungArti
Все коммиты (15)
- 2026-09-23 15:25feat(agent): add NIM function calling and grounded analysis schemasTR-UPI
- 2026-09-23 15:07ArtiaiYungArti
- 2026-09-23 11:56itaiYungArti
- 2026-09-23 11:06Saper_commitsaper-avi
- 2026-09-23 09:48itaiYungArti
- 2026-09-22 21:30commitTR-UPI
- 2026-09-22 21:29New commitTR-UPI
Структура репозитория (23 файлов)
.gitignore .streamlit/config.toml .streamlit/secrets.example.toml M1 py README.md Saper-Avi app.py backend.py backend_adapter.py demo_data.py docs/person1-agent.md examples/demo.json examples/report.schema.json itaigang requirements-agent.txt requirements.txt src/agent.py src/parsers.py src/schemas.py start.ps1 tests/test_agent.py tests/test_ui.py ui_contract.py
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.