✦RLT.Hack — 5 место✦Хакатон Московского транспорта — 3 место, 200 000 ₽✦КосмоХакатон 2026 · финал — финалисты✦КосмоХакатон 2026 — 3 место, 100 000 ₽✦Хакатон MAX — итоги ещё не объявили✦Sber × AIRI — не в призах✦AIOS — не в призах✦Ozon Hackathon — не в призах✦наберите «восторг» на клавиатуре
← все проекты
NDV-008

Подбор поставщиков для госзакупок

Сервис находит поставщиков под потребность заказчика и объясняет, откуда взят каждый факт.

5 место
Хакатон
RLT.Hack
Организатор
Росэлторг
Даты
1–2 окт 2026
Коммитов
2 046
СтекPythonоткрытые реестры ФНСDocker
недо-

На RLT.Hack нам не хватило часа до code freeze

Заморозку кода перенесли с 16:30 на 17:30. Коммиты после неё шли ещё два часа.

Code freeze: 16:30 Code freeze: 17:30 Последний коммит: 19:36

заморозка кода по-хакатонски

Кто был в этот раз5 человек

Состав: m1x, IR6, fafakaj, Ivan Banan, Chichetin.

Кейс

Росэлторг попросил сервис, который подбирает исполнителей госконтрактов: поставщиков, производителей и дистрибьюторов для АИС ГЗ и Электронного магазина Петербурга. Это региональная система госзаказа и её часть для закупок малого объёма. Заказчик пишет, что хочет купить, сервис отвечает, кого позвать.

Сложность в том, что поставщик в данных организаторов — это только ИНН: без названия, контактов и цены контракта. А круг узкий. В 2025 году в 57,85 % закупок побеждал тот, кто уже выигрывал у этого заказчика. Подбор по истории повторяет круг знакомых, поэтому искать нужно и тех, кого в данных нет.

Что сдали

Веб-сервис с выдачей из двух блоков. «С опытом госзакупок» — компании, которые уже участвовали в похожих закупках Петербурга. «Новые из открытых источников» — компании из госреестров, которых в данных нет. У каждой рекомендации видно, почему она в списке, а у каждого факта — ссылка и дата.

  • Подбор по тексту, коду товара или номеру закупки.
  • Карточка компании: балл по критериям, роль с основанием, источники.
  • Фильтры, выгрузка в Excel, описание API для встраивания в АИС ГЗ.
  • Демо работает без интернета: ответы реестров сохранены в кеше.

Как устроено

  • Понимаем запрос: исправляем опечатки и раскладку. Если не указан ОКПД2 — код товара или услуги по общероссийскому классификатору, — угадываем его по похожим прошлым позициям.
  • Берём до 200 кандидатов из самых похожих прошлых закупок. Недействующих и попавших в реестр недобросовестных поставщиков отсекаем.
  • Ставим балл от 0 до 1. Балл — ровно взвешенная сумма шести критериев: соответствие товару, опыт, надёжность, активность, цена и география. Если заказчик известен, порядок задаёт модель на деревьях решений, обученная на прошлых закупках.
  • Новых ищем так: переводим код товара в ОКВЭД — код вида деятельности — и ищем фирмы Петербурга и Ленобласти в реестре МСП ФНС, открытом реестре малого и среднего бизнеса. Второй канал — ГИСП, реестр промышленной продукции Минпромторга.
  • Карточки компаний собираются из открытых реестров в кеш. Факт показываем, только если он дословно есть на сохранённой странице.

Цифры

  • 604 452 лота за 2024–2025 годы и 44 196 поставщиков — объём данных организаторов.
  • В среднем 59 % участников закупки попадают в нашу первую десятку. У подбора по истории заказчика — 39 %, у поиска по словам — 45 %. Замер на 2 000 закупках июля–сентября 2025 года.
  • В 3 раза чаще находим поставщиков, новых для заказчика: 42 % против 13,9 % у истории заказчика.
  • 480 166 позиций реестра ГИСП подключили к «Новым». Закупок с кандидатом оттуда стало 447 из 2 000 вместо нуля.
  • С 2,3 с до 655 мс сократилась медиана ответа поиска на Postgres.

Что было трудно

Ранжировщик учили на запросах, где заказчик известен. Без заказчика он проигрывал обычному поиску по словам. Решение простое: нет заказчика — порядок задаёт формула балла.

Самым скромным оказался блок «Новые». Ручная проверка подтвердила 11 компаний из 100 показанных: на запрос про повышение квалификации приходили автошколы, ведь класс ОКВЭД тот же. ГИСП поднял счёт до 21 из 102, но услуги не покрывает. Postgres поначалу отвечал в четыре раза медленнее файлов parquet, и больше трёх четвертей времени съедал один запрос. Помог предрасчёт.

Отдельная история — ФНС. Без карточки из сервиса «Прозрачный бизнес» у поставщика нет ни названия, ни статуса, а сервис после трёх карточек подряд начал требовать капчу. Сначала выкрутились запасными реестрами — МСП и ГИР БО. На второй день написали свой распознаватель капчи: ddddocr и модель, заточенная ровно на шесть цифр. Обогащение датасета снова пошло.

Финал классический: code freeze сдвинули с 16:30 на 17:30, а коммиты после него шли ещё два часа.

Как это выгляделонажмите на кадр, чтобы рассмотреть

код пока приватныйОткроем, когда перестанем стесняться
следующий · NDV-007Трамвай без GNSS →