Как я скрестил rusprofile и LLM, чтобы не тратить день на поиск подрядчиков
Раньше закупщик в крупной компании реально тратил 6–8 часов в неделю на тупой поиск контрагентов. Открываешь rusprofile, вбиваешь ОКВЭД, фильтруешь по региону, смотришь выручку, лицензии, копируешь в Excel. В итоге из 30 компаний реально подходящих — от силы пять.
Я забрал эту рутину на связку «парсер + LLM». Ниже расскажу, как собрал архитектуру, которую уже запускал в нескольких отделах закупок, и какие грабли собрал по дороге.
Что сервис должен уметь
На вход даём:
- ОКВЭДы (основной + допы)
- Регион или радиус от точки
- Финансовые фильтры: выручка, прибыль, возраст компании
- Юридические требования: лицензии, СРО, реестры
- Плюс свободный текст задачи («монтаж вентиляции в пищевом производстве, опыт от трёх лет»)
На выходе — топ-10 компаний с короткой карточкой, обоснованием и красными флагами (банкротство, налоговые долги, массовый учредитель).
Архитектура
Я разбил систему на четыре отдельных слоя. Смешивать парсинг и LLM в одном скрипте — верный путь к боли при поддержке.
Слой 1. Сбор данных
Беру минимум два источника: rusprofile.ru и Контур.Фокус (через API). Плюс выгрузки ЕГРЮЛ, реестры СРО и недобросовестных поставщиков.
С rusprofile работаю через HTML-парсер с пулом прокси. Сайт быстро начинает капчу, если лезть чаще одного запроса в 2–3 секунды. Поэтому 20–30 резидентных прокси и жёсткий rate limit. Контур даёт стабильный JSON и историю изменений — его использую как основной источник.
Слой 2. Нормализация и обогащение
Привожу всё к одной схеме: ИНН как ключ, выручка в рублях, ОКВЭДы с пометкой основного. Дополнительно проверяю банкротства, лицензии и реестр недобросовестных поставщиков. Однодневки отсеиваю по формальным признакам.
Слой 3. Жёсткая фильтрация
LLM не кормлю тысячу компаний — дорого и бесполезно. До модели доходит максимум 50–100 кандидатов, отобранных обычным SQL-запросом по ОКВЭД, региону, выручке и отсутствию банкротств.
Слой 4. Ранжирование через LLM
Для российских задач беру GigaChat Pro — она нормально понимает бизнес-текст и юридические формулировки. На вход даю описание задачи, JSON-карточку компании и инструкцию оценить релевантность от 0 до 100 с обоснованием в пару предложений. Модель проходит по каждому кандидату отдельно, потом сортирую и беру топ-10.
Подводные камни
Их оказалось больше, чем я думал на старте.
ОКВЭД врёт
Компания может иметь основной код «оптовая торговля», а по факту монтировать оборудование. LLM смотрит не только на коды, но и на название, описание с сайта и тендерную историю. Это и есть главная ценность модели.
Дубликаты и группы компаний
Одна и та же фирма может сидеть в пяти юрлицах. Дедуплицирую по учредителю и адресу, оставляю обычно самое крупное юрлицо.
Свежесть данных
Выручка за 2024 год появляется только во второй половине 2025-го. Банкротства и лицензии меняются ежедневно, поэтому кэш на месяц для финансов — ок, а для рисков — максимум сутки.
Галлюцинации
Модель может написать «есть лицензия МЧС», просто увидев слово «пожарная». Все утверждения в обосновании проверяю регуляркой и подсвечиваю то, чего нет в исходных данных.
Юридические риски
Rusprofile запрещает парсинг в соглашении. Для внутреннего инструмента риски терпимые, для продукта на продажу — лучше сразу идти через официальные API.
Что получает закупщик
Excel или PDF с таблицей: ИНН, компания, регион, выручка, балл, обоснование и флаги. Время на подготовку — 4–7 минут вместо целого дня. Человек всё равно принимает финальное решение, я это принципиально оставляю за ним.
Что в итоге
Подбор подрядчиков — отличный пример, где LLM не заменяет человека, а просто снимает с него рутину. Главный выигрыш не в скорости, а в том, что закупщик реально читает топ-10 вместо того, чтобы пролистывать сотню по диагонали.
Развёртывание под ключ для среднего отдела занимает 3–4 недели: неделя на источники, две на пилот и калибровку промптов, неделя на обучение. Дальше только раз в квартал обновляю промпты под новые категории закупок.
