AAYMA
RU
Войти

VERITAS

Streamlit-сервис подбора event-подрядчиков: фильтрует каталог из 66 профилей и возвращает до 3 кандидатов с фактологическим объяснением.

Рабочий MVP
Команда «veritas» 3💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: 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.md

VERITAS • Умный подбор 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.


🏗 Архитектура решения

Решение состоит из трёх частей:

  1. Детерминированная фильтрация и ранжирование:

    • Точное совпадение города (city) и категории (categories).
    • Проверка занятости на дату (busy_dates) в диапазоне 23.09.2026–31.12.2026.
    • Проверка бюджета (price_from_kzt), формата события (event_formats), выбранного языка и предельной длительности (max_hours). Если max_hours пуст, кандидат не исключается по длительности.
    • Кандидаты сортируются фиксированным скорингом: языковое соответствие — 35%, релевантность описания формату — 30%, близость цены к бюджету — 20%, соответствие длительности — 15%. Равные баллы разрешаются по ID и имени.
  2. Фактологические объяснения через OpenAI GPT-4o:

    • Генерируются 2–3 предложения с аргументацией, индивидуальной для профиля.
    • Объяснение включает цену, экономию относительно бюджета, языки и конкретные факты из description.
    • Промпт запрещает выдумывать сведения и использовать клише. Параметр генерации — temperature=0.
  3. Автономный fallback:

    • В автономном режиме и при ошибке OpenAI API используется детерминированный локальный генератор. Для обычного поиска в режиме GPT-4o нужен ключ; демосценарии без ключа автоматически переключаются на автономный режим.
    • Fallback показывает точную экономию, языки и форматы профиля и подходящее предложение или достижение из description.
    • В карточке отображается метка «Объяснение: Детерминированный Fallback (Offline)».

🔑 Режимы генерации и ключи API

В боковой панели доступны два режима; по умолчанию выбран ввод собственного ключа:

  • 🔑 OpenAI GPT-4o (Ввести свой API Key): выбран по умолчанию; поиск доступен после ввода ключа.
  • ⚡ Автономный режим (Offline Fallback): объяснения формируются локально, внешние запросы не отправляются.

При сетевом сбое или ошибке API приложение показывает сообщение и затем автоматически переходит к автономному объяснению. Демо-кнопки одним нажатием запускают сценарий; если пользовательский ключ не введён, они автоматически выбирают автономный режим. Поля параметров поиска собраны в форму и не запускают повторный поиск при простом изменении значений.


🎯 Проверка сценариев жюри

В верхней части приложения доступны три кнопки пресетов:

  1. Плотная категория (Алматы, Ведущий, 15.10.2026, Корпоратив, 1 000 000 ₸): демонстрация скоринга и выдачи до трёх кандидатов.
  2. Редкая категория (Астана, Флорист, 05.11.2026, Свадьба, 350 000 ₸): демонстрация неполной выдачи; ожидаемый кандидат — Хаку.
  3. Запрос без результата (Алматы, Ведущий, 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, заданным в коде. Цена в каталоге указана «от», поэтому показанная экономия — разница между бюджетом и стартовой ценой, а не гарантированная стоимость заказа. Сводка причин отказа считает для каждого кандидата первую причину по порядку: дата, бюджет, формат, язык, длительность.

Звёзды
⭐ 0
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
15
Авторы
2
Файлы
4
Ветки
1

Авторы коммитов

redoandundo 9hainegen 6

История коммитов

  • 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 комментариев

Войдите, чтобы комментировать

Пока нет комментариев — будьте первым.