EventMatch AI
Streamlit-сервис подбора event-подрядчиков: LLM разбирает свободный запрос в форму, система фильтрует и ранжирует подрядчиков по формуле и…
О проекте
Команда: Rise
Кейс HackAlem.ai: Креативные индустрии — Firebird
Стадия: Рабочий MVP
Задача кейса: «#79-lite»: подобрать до 3 подрядчиков для мероприятия и объяснить выбор
Суть
Streamlit-сервис подбора event-подрядчиков: LLM разбирает свободный запрос в форму, система фильтрует и ранжирует подрядчиков по формуле и показывает до трёх карточек с объяснениями от LLM.
Как устроено
OpenAI извлекает из текста параметры (город, категория, дата, бюджет, часы, язык), пользователь проверяет форму. Жёсткие фильтры отсекают подрядчиков по городу, категории, календарю, бюджету, формату, часам и языку; оставшиеся ранжируются по фиксированной формуле баллов со стабильной сортировкой. Для выбранных карточек LLM параллельно пишет объяснения (таймаут 5 с); guardrail сверяет пропущенные и добавленные числа и при расхождении возвращается к шаблону, успешные ответы кэшируются.
Ключевые решения
- LLM query parsing
- жёсткие фильтры
- детерминированное ранжирование
- числовой guardrail для объяснений LLM
- шаблонный fallback
- кэш объяснений
Особенности
Объяснения LLM проверяются на добавленные и пропущенные числа, в интерфейсе видно, от ИИ объяснение или по шаблону и почему. Демо-сценарии покрывают плотную категорию, редкую категорию и пустой результат.
Стек
Python · Streamlit · OpenAI API
Модели
gpt-4o-mini
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-fd130a18-rise.
README
README.md🎯 EventMatch AI (#79-lite)
Сервис подбора event-подрядчиков в Казахстане: строгие фильтры, детерминированные баллы и объяснения от OpenAI.
💡 Пайплайн
- LLM-парсер (
ai/parse_query.py): OpenAI извлекает параметры из текста; пользователь проверяет форму перед поиском. - Фильтры (
pipeline/filters.py): Город, категория, календарь, бюджет, формат, часы и язык. - Ранжирование (
pipeline/ranking.py): Фиксированная формула баллов и стабильная сортировка. Эмбеддинги в основной подбор не включены. - Объяснения (
ai/polish.py): Послеrecommend()интерфейс вызывает LLM для выбранных карточек. Фильтры, баллы и порядок не меняются.
Объяснения генерируются параллельно с таймаутом 5 секунд, без автоматических повторов. Проверяются пропущенные и добавленные числа; при ошибке используется исходный шаблон и показывается причина. Числовая проверка не гарантирует отсутствие любых смысловых ошибок: исходные факты доступны в раскрывающемся блоке карточки. Успешные объяснения кэшируются в памяти по фактам, запросу, модели и инструкции. Кэш очищается после перезапуска.
🚀 Быстрый запуск
Нужен Python 3.11 или новее. Команды выполняются из корня проекта:
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt
Создайте .env рядом с README по образцу .env.example, указав свой OPENAI_API_KEY.
По умолчанию используется gpt-4o-mini; модель можно задать через OPENAI_MODEL.
Ключ автоматически читается сервером из .env, не отправляется браузеру и не должен попадать в Git.
Запрос и факты показанных карточек отправляются в OpenAI; нужен доступный баланс API.
python -m streamlit run ui/app.py
Откройте http://localhost:8501. Введите запрос, нажмите «Разобрать запрос с ИИ», проверьте форму и запустите подбор. Бейдж «Объяснение от ИИ» означает успешный ответ LLM. «Объяснение по шаблону» сопровождается причиной возврата к шаблону. Без доступного API можно заполнить форму вручную; подбор продолжит работать с шаблонными объяснениями.
Пример: «Нужен ведущий на свадьбу в Алматы 7 октября 2026, бюджет 1,2 млн, на 5 часов, на русском». Календари датасета покрывают 23.09.2026–31.12.2026. В запросе без года используется 2026.
Проверки без вызова OpenAI:
python -m tests.test_scenarios
python test_pipeline.py
🧪 Демо-сценарии
- Плотная категория: Ведущий в Алматы на 14 ноября
- Редкая категория: Флорист в Астане
- Нулевой результат: Банкетный зал в Алматы на 20 декабря (бюджет 100k ₸)
Авторы коммитов
История коммитов
- 2026-09-23 17:22Final work pushАлтынбекова Жаннур
- 2026-09-23 17:15Connect LLM parsing and explanationsАлтынбекова Жаннур
- 2026-09-23 16:41docs: add READMEzmeyramkhanova-dotcom
- 2026-09-23 16:14AI Serviceszmeyramkhanova-dotcom
- 2026-09-23 16:05aiPipeline & GuardrailsАлтынбекова Жаннур
- 2026-09-23 15:33Изминение архитектуры под дизайнАлтынбекова Жаннур
- 2026-09-23 15:30Дизайнzmeyramkhanova-dotcom
- 2026-09-23 14:36Черновик: воронка подбора (фильтры, ранжирование, 3 исхода, тесты)Алтынбекова Жаннур
Структура репозитория (28 файлов)
.env.example .gitignore .streamlit/config.toml README.md ai/llm_client.py ai/parse_query.py ai/polish.py data/hackathon dataset anonymized .csv final_work.zip pipeline/agent_filters.py pipeline/explain.py pipeline/filters.py pipeline/guardrails.py pipeline/load.py pipeline/ranking.py pipeline/recommend.py requirements.txt scripts/generate_embeddings.py test_pipeline.py tests/test_scenarios.py ui/DESIGN.md ui/app.py ui/design-reference/1-landing.html ui/design-reference/2-quiz.html ui/design-reference/3-results.html ui/design-reference/4-empty.html ui/mock_data.py ui/style.css
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.