Подбор поставщиков для госзакупок
Сервис находит поставщиков под потребность заказчика и объясняет, откуда взят каждый факт.
- Хакатон
- RLT.Hack
- Организатор
- Росэлторг
- Даты
- 1–2 окт 2026
- Коммитов
- 2 046
На 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, а коммиты после него шли ещё два часа.






