VERITAS
Streamlit-сервис подбора event-подрядчиков: фильтрует каталог из 66 профилей и возвращает до 3 кандидатов с фактологическим объяснением.
О проекте
Команда: veritas
Кейс HackAlem.ai: Креативные индустрии — Firebird
Стадия: Рабочий MVP
Задача кейса: «#79-lite»: подобрать до 3 подрядчиков для мероприятия и объяснить выбор
Суть
Streamlit-сервис подбора event-подрядчиков: фильтрует каталог из 66 профилей и возвращает до 3 кандидатов с фактологическим объяснением.
Как устроено
CSV каталога обрабатывается стандартной библиотекой; жёсткие фильтры: город, категория, занятость на дату, бюджет (price_from_kzt), формат события, язык, max_hours. Ранжирование фиксированным скорингом: язык 35%, релевантность описания 30%, близость цены к бюджету 20%, длительность 15%, при равенстве сортировка по ID. GPT-4o (temperature=0) через urllib пишет 2–3 предложения с ценой, экономией и фактами из description; при ошибке или без ключа работает детерминированный fallback. Для пустой выдачи показывается сводка причин отсева.
Ключевые решения
- жёсткая фильтрация
- взвешенный скоринг 35/30/20/15
- LLM-объяснения temperature=0
- детерминированный fallback
- сводка причин отказа
Особенности
Минимализм: одна зависимость (Streamlit), без OpenAI SDK; три пресета жюри (плотная категория, редкая категория, пустой результат) и объяснение, почему кандидаты не прошли фильтры.
Стек
Python · Streamlit
Модели
GPT-4o
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-277a2398-veritas.
README
README.mdVERITAS • Умный подбор event-подрядчиков (#79-lite)
Разработано командой Veritas в рамках технологического хакатона HackAlem AI 2026 (Astana Hub).
Трек: Креативные индустрии • Владелец задачи: Firebird.
Сервис интеллектуального подбора event-подрядчиков в Казахстане (Алматы, Астана, Зарубежье). Система детерминированно фильтрует каталог и возвращает до 3 карточек, формируя для каждого кандидата фактологическое объяснение на основе профиля.
⚡ Быстрый старт
Проект не использует тяжёлые C-зависимости, pandas, numpy или сторонний OpenAI SDK. CSV обрабатывается стандартной библиотекой Python, запросы к OpenAI API выполняются через встроенный модуль urllib.
1. Клонирование и переход в директорию
git clone https://github.com/astanahub/hack-277a2398-veritas.git
cd hack-277a2398-veritas
2. Установка зависимостей
python -m pip install -r requirements.txt
3. Запуск приложения
python -m streamlit run app.py
(Также поддерживается стандартный вызов streamlit run app.py.)
После запуска приложение автоматически откроется в браузере по адресу: http://localhost:8501.
🏗 Архитектура решения
Решение состоит из трёх частей:
-
Детерминированная фильтрация и ранжирование:
- Точное совпадение города (
city) и категории (categories). - Проверка занятости на дату (
busy_dates) в диапазоне 23.09.2026–31.12.2026. - Проверка бюджета (
price_from_kzt), формата события (event_formats), выбранного языка и предельной длительности (max_hours). Еслиmax_hoursпуст, кандидат не исключается по длительности. - Кандидаты сортируются фиксированным скорингом: языковое соответствие — 35%, релевантность описания формату — 30%, близость цены к бюджету — 20%, соответствие длительности — 15%. Равные баллы разрешаются по ID и имени.
- Точное совпадение города (
-
Фактологические объяснения через OpenAI GPT-4o:
- Генерируются 2–3 предложения с аргументацией, индивидуальной для профиля.
- Объяснение включает цену, экономию относительно бюджета, языки и конкретные факты из
description. - Промпт запрещает выдумывать сведения и использовать клише. Параметр генерации —
temperature=0.
-
Автономный fallback:
- В автономном режиме и при ошибке OpenAI API используется детерминированный локальный генератор. Для обычного поиска в режиме GPT-4o нужен ключ; демосценарии без ключа автоматически переключаются на автономный режим.
- Fallback показывает точную экономию, языки и форматы профиля и подходящее предложение или достижение из
description. - В карточке отображается метка «Объяснение: Детерминированный Fallback (Offline)».
🔑 Режимы генерации и ключи API
В боковой панели доступны два режима; по умолчанию выбран ввод собственного ключа:
- 🔑 OpenAI GPT-4o (Ввести свой API Key): выбран по умолчанию; поиск доступен после ввода ключа.
- ⚡ Автономный режим (Offline Fallback): объяснения формируются локально, внешние запросы не отправляются.
При сетевом сбое или ошибке API приложение показывает сообщение и затем автоматически переходит к автономному объяснению. Демо-кнопки одним нажатием запускают сценарий; если пользовательский ключ не введён, они автоматически выбирают автономный режим. Поля параметров поиска собраны в форму и не запускают повторный поиск при простом изменении значений.
🎯 Проверка сценариев жюри
В верхней части приложения доступны три кнопки пресетов:
- Плотная категория (Алматы, Ведущий, 15.10.2026, Корпоратив, 1 000 000 ₸): демонстрация скоринга и выдачи до трёх кандидатов.
- Редкая категория (Астана, Флорист, 05.11.2026, Свадьба, 350 000 ₸): демонстрация неполной выдачи; ожидаемый кандидат — Хаку.
- Запрос без результата (Алматы, Ведущий, 25.12.2026, Той, 300 000 ₸): детальная сводка причин, по которым специалисты не прошли фильтры.
Также приложение сообщает, если в выбранном городе нет специалистов нужной категории или если нашлось меньше трёх подходящих кандидатов.
📁 Структура проекта
hack-277a2398-veritas/
├── app.py # Streamlit-приложение на стандартной библиотеке Python
├── requirements.txt # Единственная зависимость: Streamlit
├── hackathon-dataset-anonymized.csv # Каталог подрядчиков (66 профилей)
└── README.md # Документация
Приложение ищет CSV рядом с app.py под именем hackathon-dataset-anonymized.csv или hackathon-dataset-anonymized .csv (пробел перед .csv). В списковых полях поддерживаются разделители ,, ;, | и строковое представление Python-списка.
Данные и ограничения
Ожидаемые поля: id, anon_name, categories, city, price_from_kzt, event_formats, languages, max_hours, busy_dates, description. Метка «Синтетический» на карточке определяется значением поля synthetic в CSV.
Результаты зависят от полноты каталога и данных профилей. Балл ранжирования — правило сортировки прототипа, а не независимая оценка качества подрядчика. Объяснения основаны на информации из профиля и не подтверждают её независимо.
Даты в интерфейсе ограничены периодом 23.09.2026–31.12.2026, заданным в коде. Цена в каталоге указана «от», поэтому показанная экономия — разница между бюджетом и стартовой ценой, а не гарантированная стоимость заказа. Сводка причин отказа считает для каждого кандидата первую причину по порядку: дата, бюджет, формат, язык, длительность.
Авторы коммитов
История коммитов
- 2026-09-23 17:56Add files via uploadhainegen
- 2026-09-23 17:42Add files via uploadhainegen
- 2026-09-23 17:29VFin1redoandundo
- 2026-09-23 17:12demoredoandundo
- 2026-09-23 17:06v5redoandundo
- 2026-09-23 16:16Merge branch 'main' of https://github.com/BAITC-Hacks/hack-277a2398-veritasredoandundo
- 2026-09-23 16:15v4redoandundo
- 2026-09-23 16:05Delete .gitignorehainegen
Все коммиты (15)
- 2026-09-23 16:03Add .gitignore filehainegen
- 2026-09-23 15:33Merge branch 'main' of https://github.com/BAITC-Hacks/hack-277a2398-veritasredoandundo
- 2026-09-23 15:27v3redoandundo
- 2026-09-23 15:14Revise README with project overview and usagehainegen
- 2026-09-23 15:14Delete hackathon-dataset-anonymized .csvhainegen
- 2026-09-23 14:36v2redoandundo
- 2026-09-23 13:52v1redoandundo
Структура репозитория (4 файлов)
README.md app.py hackathon-dataset-anonymized.csv requirements.txt
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.