ToiMatch AI
Локальный рекомендатель event-подрядчиков: жёсткие фильтры, детерминированный скоринг и объяснения на основе фактов из профиля.
О проекте
Команда: Stardust Crusaders
Кейс HackAlem.ai: Креативные индустрии — Firebird
Стадия: Рабочий MVP
Задача кейса: «#79-lite»: подобрать до 3 подрядчиков для мероприятия и объяснить выбор
Суть
Локальный рекомендатель event-подрядчиков: жёсткие фильтры, детерминированный скоринг и объяснения на основе фактов из профиля. Выдаёт до трёх карточек через FastAPI и Streamlit.
Как устроено
CSV с 66 профилями загружается и нормализуется. Пул формируется по городу и категории, жёсткие фильтры отсекают по занятости на дату, формату, бюджету и длительности, для каждого отказа сохраняется причина. Скоринг с фиксированными весами по бюджету, языку, длительности и описанию, сортировка по score, цене и ID. Объяснения шаблонные, по ключевым словам описания. Статусы matched / category_not_found / no_eligible_candidates. LLM не используется.
Ключевые решения
- hard filters
- deterministic weighted scoring
- keyword evidence extraction
Особенности
Воспроизводимые демо-сценарии: плотная категория, редкая категория, отказ по бюджету, сравнение дат. Есть скрипт аудита качества данных: synthetic, imputed-поля.
Стек
Python · FastAPI · Streamlit · Pydantic · pytest
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-2b4487f7-stardust-crusaders.
README
README.mdToiMatch AI
ToiMatch AI помогает быстро подобрать подрядчиков для мероприятия по городу, категории, формату события, дате, бюджету, длительности и языку. Решение ориентировано на организаторов мероприятий и команды, которым нужно сравнить доступные профили без ручного просмотра всего каталога.
Команда
- Абдрахманова Аружан
- Шихиев Алихан копитан
- Дузелдиков Бекжан
Что реализовано
- загрузка и нормализация CSV-датасета;
- hard filters по городу и категории, занятости на дату, формату, бюджету и длительности;
- deterministic scoring с фиксированными весами и стабильной сортировкой;
- evidence-based explanations без LLM и внешних API;
- статусы
matched,category_not_foundиno_eligible_candidates; - FastAPI endpoints
GET /healthиPOST /recommend; - минимальный Streamlit UI для демонстрации;
- понятные русские статусы, score и расшифровка компонентов оценки в UI;
- воспроизводимые demo cases для плотных и редких категорий, отказа и сравнения дат;
- тесты загрузчика, фильтров, ranking, explanations и API.
Как работает решение
- Пользователь задаёт город, дату не раньше текущего дня, формат мероприятия, категорию, бюджет и необязательные длительность и язык.
- Система формирует pool подрядчиков из выбранных города и категории.
- Hard filters исключают занятых, неподходящих по формату, бюджету или длительности.
- Для оставшихся кандидатов считается детерминированный score.
- Кандидаты сортируются по score, затем по цене и ID.
- Для первых трёх профилей формируются карточки с ценой, флагами качества данных и объяснением на основе evidence из профиля.
Pipeline
Filter → Score → Evidence → Explain
Архитектура
app/dataset.py— чтение CSV и преобразование полей в моделиVendor;app/filters.py— pool по городу и категории и hard-filter evaluation;app/scoring.py— deterministic scoring budget, language, duration и description;app/explanations.py— сбор проверяемых evidence и текст объяснения;app/recommender.py— orchestration pool → filters → scoring → карточки;app/main.py— FastAPI-приложение и локальные endpoints;streamlit_app.py— демонстрационный Streamlit-интерфейс.
Основной поток данных:
CSV → dataset loader → city/category pool → hard filters
→ deterministic scoring → evidence → карточки API/UI
Технологии
- Python;
- FastAPI и Uvicorn для локального API;
- Streamlit для демонстрационного UI;
- Pydantic и Python dataclasses для схем данных;
- стандартный модуль
csvдля загрузки dataset; - pytest для автоматических тестов.
Проект не использует AI-модели, OpenAI, NVIDIA, embeddings или внешние API. Все рекомендации рассчитываются локально на основе CSV.
Установка и запуск
Из корня репозитория:
Windows PowerShell
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
Linux/macOS или Git Bash
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Проверить проект:
pytest -q
python scripts/audit_dataset.py
Запустить API:
python -m uvicorn app.main:app --reload
В Windows при недоступной команде python используйте:
py -3 -m uvicorn app.main:app --reload
Доступны:
GET http://localhost:8000/— ссылки на локальные endpoints;GET http://localhost:8000/health;POST http://localhost:8000/recommend.
Запустить UI:
streamlit run streamlit_app.py
После запуска UI открывается по адресу, который напечатает Streamlit, обычно
http://localhost:8501.
В UI доступны поля города, даты, формата мероприятия, категории, бюджета, необязательной длительности и языка. После поиска отображаются до трёх карточек с именем, ценой, badges, объяснением и итоговой оценкой. В блоке «Как сформирована выдача?» показаны понятные пользователю pool, число прошедших кандидатов, причины отсечения и расшифровка score по бюджету, языку, длительности и описанию.
Как проверить решение
Основной набор тестов запускается командой pytest -q.
Для демонстрации жюри используйте demo/demo_cases.json:
dense_category— Алматы, категорияВедущий, форматкорпоратив, бюджет2 000 000 ₸; показывает несколько кандидатов и ranking.rare_category— Алматы,Флорист, форматсвадьба, бюджет250 000 ₸; показывает редкий pool и выдачу из двух результатов.no_result— Алматы,Флорист, форматсвадьба, бюджет199 999 ₸; показывает понятный отказ по бюджету.date_comparison— одинаковые параметры для2027-01-01и2026-09-24; изменение дат меняет состав top results из-заbusy_dates.
Прошедшие даты не принимаются: UI ограничивает календарь текущим днём, а API возвращает ошибку валидации для даты в прошлом.
Сценарии можно заново найти и проверить командой:
python scripts/find_demo_cases.py
Данные
Используется файл data/hackathon_dataset_anonymized.csv с 66 профилями.
В датасете представлены города Алматы, Астана и Зарубежье, а также категории,
форматы мероприятий, языки, цены, ограничения по длительности, занятые даты и
текстовые описания.
Основные поля профиля:
id,anon_name— идентификатор и анонимное имя;categories,event_formats,languages— pipe-separated списки;city,price_from_kzt,max_hours,busy_dates— параметры подбора;description— источник keyword-based evidence;synthetic— профиль или значения созданы как синтетические данные;city_imputed— город был восстановлен или заполнен при подготовке данных;price_imputed— цена была восстановлена или заполнена при подготовке данных.
По результатам аудита: 13 профилей имеют synthetic=true, 8 —
city_imputed=true, 18 — price_imputed=true; у 9 профилей max_hours пуст.
CSV не изменяется приложением.
Внешние интеграции отсутствуют. Единственный источник данных — локальный
data/hackathon_dataset_anonymized.csv.
Использование AI-агента
Antigravity использовался для реализации задач проекта и проверки результата. Работа была разделена по участникам и этапам: core backend, deterministic ranking, evidence/explanations, API, demo/data QA и Streamlit UI. Каждый этап фиксировался отдельным commit в Git.
Ограничения
- нет бронирования и оформления заявки;
- нет уведомлений;
- нет реальной оплаты;
- нет авторизации;
- нет LLM, embeddings и fine-tuning;
- нет внешних API;
- рекомендации работают только по предоставленному dataset;
- scoring и explanations являются детерминированными baseline-механизмами.
Потенциал развития
- добавить workflow заявки и подтверждения подрядчика;
- подключить уведомления после появления backend-интеграции;
- расширить валидацию и версионирование данных;
- добавить пользовательские настройки весов ranking;
- расширить demo и regression-тесты на новые датасеты;
- отдельно исследовать AI-компоненты после появления качественных размеченных данных и требований к контролю качества.
Авторы коммитов
История коммитов
- 2026-09-23 17:20update README.mdarabdrakh
- 2026-09-23 17:15fix: uiarabdrakh
- 2026-09-23 16:53chore: deletingarabdrakh
- 2026-09-23 16:52chore: remove unused code and clean project structurearabdrakh
- 2026-09-23 16:44feat(app): add API and Streamlit demo UIkapchaman
- 2026-09-23 16:42feat(qa): add explanations, audit and demo scenarioskapchaman
- 2026-09-23 16:39feat(core): implement local recommendation enginekyrusoo
- 2026-09-23 16:37docs: add hackathon README and run instructionskyrusoo
Все коммиты (19)
- 2026-09-23 16:32feat(ui): add Streamlit demo interfacekyrusoo
- 2026-09-23 16:28test(demo): add reproducible demo scenarioskapchaman
- 2026-09-23 16:26feat(api): add FastAPI recommend endpointkapchaman
- 2026-09-23 16:25feat(explain): add evidence-based explanationskapchaman
- 2026-09-23 16:22feat(ranking): add deterministic scoringkapchaman
- 2026-09-23 16:20feat(core): add recommender statuses and baseline matchingkapchaman
- 2026-09-23 16:19feat(core): implement hard filters with rejection reasonskapchaman
- 2026-09-23 16:18feat/core): add schemas and dataset loaderkapchaman
- 2026-09-23 16:12feat(data): add dataset audit scriptkyrusoo
- 2026-09-23 14:57chore: add project skeletonarabdrakh
- 2026-09-23 13:56init: add dataset and project structurearabdrakh
Структура репозитория (26 файлов)
.gitignore README.md app/__init__.py app/dataset.py app/explanations.py app/filters.py app/main.py app/recommender.py app/schemas.py app/scoring.py data/hackathon_dataset_anonymized.csv data/hackathon_dataset_preview.html demo/README.md demo/demo_cases.json pytest.ini requirements.txt scripts/audit_dataset.py scripts/find_demo_cases.py streamlit_app.py tests/__init__.py tests/test_api.py tests/test_dataset.py tests/test_explanations.py tests/test_filters.py tests/test_recommender.py tests/test_scoring.py
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.