The Jerusalem PostMichigan rabbis lay out demands for El-Sayed and state Democrats to earn their votesInquirerTwo held, P3.5-M worth of fuel seized in MarinduqueESPNDrake Maye was awesome in 2025 ... could he be even better in 2026? Why he's ready to level upDaily MaverickCASE HALTED: Fraud trial of Komani cop hits bizarre legal snagESPN DeportesTeoscar Hernández da triunfo a Skubal y DodgersPunchBank mourns as branch manager killed by kidnappers in Imoוואלהמשמרות המהפכה: תקפנו 2 כלי שיט אמריקניים ו-8 מיכליות נפט한겨레[단독] ‘통계 사건’ 재판서 김수현 “공소사실 변경” 주장…재판부 “특검 상황까지 고려”SözcüKan basıncını düşüren en iyi kuruyemiş ortaya çıktıCNN Türk"Güller ve Günahlar", İspanya'da zirveden başladıХабрШесть мест, где за два месяца в проде ломался LLM-конвейер над лентами закупок, и почти все вне промптовSCMP ChinaAs China embraces AI, only 24% of US pharma execs bet on it for drug-making
The Daily Newsstand · Free, Always
Wednesday, September 9, 2026

Шесть мест, где за два месяца в проде ломался LLM-конвейер над лентами закупок, и почти все вне промптов

Translate

У нас есть внутренняя система, которая ищет закупки под профиль сервисной ИТ-компании. Раз в час она читает ленты 14 закупочных площадок через платный агрегатор (сервис, который собирает извещения о закупках с сотен площадок), ещё две площадки читает напрямую и реже. Каждое извещение проходит детерминированный фильтр по названию, для новых записей, прошедших фильтр, система заводит карточку закупки, запись у себя в базе, и дешёвая LLM ставит по карточке вердикт. Этот шаг мы зовём предскорингом. Для тендеров-кандидатов система выкачивает документацию, далее средняя LLM собирает из файлов единый текст технического задания и затем оценивает закупку по 18 критериям с обоснованиями: 14 критериев считает LLM, 4 считает код. Решение «идём или нет» принимает человек на гейте - точке, дальше которой без него ничего не происходит. Тендерные заявки тоже подаёт человек.

В системе используется 3 разных LLM, ниже я зову их «дешёвой», «средней» и «старшей». Дешёвая - это Claude Haiku 4.5, средняя - Claude Sonnet 5, старшая - Claude Opus 5, она собирает коммерческое предложение и в этой статье почти не участвует. Всё, что LLM получают и отвечают, пишется в трассу, полный лог каждого обращения с токенами и длительностью, и большинство чисел ниже взяты из неё.

С первого живого прогона с начала июля по начало сентября наша тендерная система завела 4 452 карточки закупок, 3 890 из них отфильтровала ступень предскоринга (то есть жёсткие правила и дешёвая LLM вместе). В статусе тендера-кандидата побывали 580 карточек закупок, 61 из них жёсткие правила задним числом вернули в отсев, они включены в те же 3 890, а ещё 43 карточки закрыты вручную из других статусов или заведены вручную сразу тендерами-кандидатами, минуя предскоринг. Также 198 отклонил человек на гейте, 270 закрыл человек, как отменённые или просроченные, до решения по существу, 23 стали заявками, 18 ждут решения на 6 сентября, ещё 10 в прочих статусах, от четырёх нынешних кандидатов до одной проигранной. Еще из важного: 75% отказов человека по всей базе имеют код «не наш профиль» (это слабость дешёвой ступени, которую мы держим сознательно, к ней вернусь ниже). К началу сентября журнал разработки насчитывал почти 300 записей, большая их часть - про то, как тендерный конвейер ошибался в проде.

Воронка за два месяца, карточки закупок с начала июля по 6 сентября

Ступень

Карточек

Примечание

Заведено карточек закупок

4 452

после детерминированного фильтра по названию

Отсеял предскоринг

3 890

жёсткие правила и дешёвая LLM вместе, включая 61 карточку, возвращённую в отсев задним числом

Побывали тендерами-кандидатами

580

ещё 43 закрыты вручную или заведены кандидатами сразу

Закрыл человек как отменённые или просроченные

270

до решения по существу

Отклонил человек на гейте

198

75% отказов по базе с кодом «не наш профиль»

Стали заявками

23

Ждут решения на 6 сентября

18

ещё 10 в прочих статусах, от четырёх кандидатов до одной проигранной

Воронка за два месяца, карточки закупок

Воронка за два месяца, карточки закупок

При этом промпт предскоринга дошёл до шестой версии за первые две недели и с конца июля не менялся. Закупки в тендерной системе коммерческие и по 223-ФЗ (закупки госкомпаний), госзаказ по 44-ФЗ под наш профиль не подходит и отсекается правилом.

Поиск по словам в чужом индексе

Первая версия обнаружения строилась на словаре из 14 слов (заказная разработка, чат-бот, аутстафф и им подобные), запросах к поисковому API агрегатора и дешёвой LLM поверх. Пропуски пошли с первой недели. Формулировка закупки не совпадала со словарём. Закупка аутстаффа называлась «Ставки специалистов», «ИТ-аутсорсинг» через дефис поиск не находил, он матчил слово целиком, а по «аутсорсинг» без «ИТ» выдавал около 100 записей про детсады, транспорт и грузчиков.

Дальше вскрылось другое - нам прислали из чужой рассылки закупку на внедрение системы ИИ-агентов. Слово «ИИ-агентов» стояло в её названии, а поиск по «ИИ-агент» её не возвращал. Через два дня разбор другого пропуска показал, в чём дело. По слову «чат-бот», которое стоит в названии записи, она не находится. По «чатбот», которого в названии нет, находится. Индекс, судя по всему, ищет по телу извещения, название в него не входит. Расширение словаря здесь не помогает, в случае с чат-ботом слово в словаре уже было, а «ИИ-агент» не помог бы и добавленный.

В конце июля мы перестали искать и начали читать ленты площадок, страница за страницей, а решение «наше или нет» отдали своему фильтру. Первый же расчёт показал, во что обойдётся чтение лент без отметки «докуда дочитали». Часовой проход стоил бы около 500 запросов при лимите тарифа в 30 000 в месяц, лимит кончался бы за трое суток. С отметкой по каждой тендерной площадке проход в установившемся режиме стоит по запросу на ленту, сейчас 14 запросов в час. Отдельно раз в сутки идёт глубокий обход, который перечитывает окно записей ниже отметки без оглядки на неё.

Первый прогон по лентам читал площадки в фиксированном порядке при максимум 200 запросов на прогон, и потолок кончался на трёх самых длинных лентах. До двух площадок, где лежали оба тендера, с которых начался разбор конца июля, проход не доходил вообще. Счётчики при этом показывали найденные профильные записи, по ним ничего не было заметно. Починили ротацией площадок по времени последнего чтения. Позже, когда суточный потолок был уже поднят до 1 000 запросов, выяснилось, что он проверяется только на старте прохода. Два дня подряд расход составил 1 008 и 1 023, а пропущенными оказались 11 и 10 часовых проходов из 24, остаток суток проходы отменялись. Проверку перенесли внутрь цикла, глубокий обход разбили на трети площадок по дням, и он стал стоить 131 запрос вместо прежних 430 с лишним.

Во что обходится чтение лент, запросов к агрегатору

Режим

Запросов

Что это значило

Чтение без отметки «докуда дочитали»

около 500 в час

лимит тарифа 30 000 в месяц кончался бы за трое суток

Чтение с отметкой по каждой площадке

14 в час

по запросу на ленту в установившемся режиме

Первый прогон с фиксированным порядком площадок

потолок 200 на прогон

потолок кончался на трёх самых длинных лентах, до двух площадок проход не доходил

Суточный потолок 1 000 с проверкой только на старте

1 008 и 1 023 за сутки

пропущены 11 и 10 часовых проходов из 24

Глубокий обход до и после разбиения на трети площадок

430 с лишним, потом 131

раз в сутки, перечитывает окно ниже отметки

Заодно мы узнали про сам канал то, чего нет в документации. Агрегатор тендеров наполняет ленты пакетами раз в сутки, около часа ночи по Москве, так что часовой опрос даёт суточную латентность обнаружения. Идентификаторы записей выдаются блоками по дате публикации, момент попадания в индекс на них не влияет. Доиндексированная запись приходит с номером ниже отметки, поэтому окно глубокого обхода убрать нельзя. За неделю наш тендерный конвейер просматривает от 12 до 23 тысяч записей. Фильтр профиля снимает 2/3, остальное почти целиком госзаказ по 44-ФЗ, новых карточек в неделю выходит от 44 до 106.

Ленты по неделям с 27 июля по 31 августа: просмотрено, снял фильтр профиля, новых карточек

Ленты по неделям с 27 июля по 31 августа: просмотрено, снял фильтр профиля, новых карточек

Регулярка, которая ошибалась с двух сторон

Фильтр профиля устроен так: запись проходит, если в названии есть сильный маркер (тема сама по себе наша) либо пара «действие плюс объект» где угодно в строке. Первый вариант, собранный в конце июля, до прода не дошёл, сухой прогон по живой выдаче показал, что он ошибается в обе стороны сразу. Шаблон вида ИИ[-\s]?(систем|…) без границ слов ловил хвосты русских слов вроде «документацИИ системы оповещения». Маркер \bПО\b без учёта регистра совпадал с предлогом «по», который есть почти в каждом названии, и пропускал бы в кандидаты всё подряд. А требование соседства разработк\w+\s+информацион отбрасывало закупку «разработке (доработке), внедрению и тиражированию информационных систем», наш профиль слово в слово. Сейчас первая строка списка сильных маркеров выглядит как (?-i:\bИИ\b), каждый флаг в ней появился после отдельного урока.

Пропуски продолжались уже в проде, каждый добавлял правило. Латинское AI в списке отсутствовало, и закупка «Сервис AI-агента для автоматизации поиска» ушла в отсев. Корень «разработк» не матчил «разработчиков». В сырой ленте вместо «T&M» (оплата по затраченному времени) лежало экранированное T&M, а нормализация разворачивала только кавычки. Так появились html.unescape и маркеры «разработчик» и «программист». 5 августа требование, чтобы «ИТ-специалист» стоял сразу после «предоставление», отсеяло «Услуги ИТ-специалистов», хотя на паре «действие плюс объект» такое соседство сняли ещё 26 июля. Сняли и здесь, маркер ищет слово где угодно.

Сильных маркеров набралось 17, и главным вопросом стало, как добавить очередной и не сломать остальные. Каждый маркер-кандидат мы прогоняем по пулу названий тендеров, которые фильтр отверг за прошлые дни. Для «парсинг» пул состоял из 607 названий за 10 суток. Вариант с четырьмя формами слова дал ноль лишних, вариант «плюс сбор данных» два лишних, «плюс мониторинг цен» четыре, среди них запрос цен на полуприцепы. Отдельным замером на 660 живых и 152 отвергнутых названиях мы проверяли, можно ли добавить закупочные слова вроде «закупка» и «право использования». Оказалось, что нельзя, так как в кандидаты прошли бы чужие лицензии и «Поставка ПО», где ПО оказалось Псковской областью.

Три вердикта вместо двух

Сначала работают правила, LLM для них не нужна. Госзаказ по 44-ФЗ отсекается по полю закона, следом площадка вне российской доменной зоны и истёкший дедлайн. Только после них карточка уходит дешёвой LLM с потолком в 600 токенов ответа. В карточке название, заказчик, площадка, регион, закон, цена, дедлайн и сниппет извещения. LLM отвечает одним из трёх решений-вердиктов (кандидат, лёгкий отсев, сомнительно), а для сомнительных ещё и одной фразой для человека простым языком.

Что происходит с карточкой до гейта

Ступень

Кто решает

Исход

Правила до LLM

код

отсев по закону 44-ФЗ, по площадке вне российской доменной зоны, по истёкшему дедлайну

Предскоринг

дешёвая LLM, до 600 токенов ответа

кандидат, лёгкий отсев или сомнительно с фразой для человека

Гардрейлы после LLM

код

«отсев» поднимается до «сомнительно», если в карточке видны LLM, заказная разработка и лицензирование или сбор данных; трижды невалидный JSON тоже «сомнительно»

Гейт

человек

идём или нет, заявку подаёт человек

Третий вердикт был с первой версии, но после первого же живого прогона его пришлось переопределить. Закупки госкомпаний по 223-ФЗ идут по более свободным правилам, чем 44-ФЗ, для нас они возможны, но каждую такую закупку человек подтверждает до выгрузки документов. Первая реализация понимала это буквально и помечала сомнительной любую закупку по 223-ФЗ, из 30 таких кандидатов 28 оказались поставками, питанием и стройкой. Правило переписали в коде. Профильный отсев работает для любого закона, а 223-ФЗ переводит в «сомнительно» только профильную закупку. Через два дня дешёвая LLM отсеяла закупку ИТ-аутсорсинга за то, что в карточке нет сниппета, цены и данных заказчика, и в промпт вошёл запрет. Неполнота карточки это основание для «сомнительно», для отсева её мало. В то же утро выяснилось, что запрос информации (RFI) оценивался как исследовательская работа, хотя оценивать его надо по теме запроса, как обычную закупку. Три версии промпта за одно утро, потом ещё две до 24 июля, и это единственное из шести мест, где чинили промпт.

Гардрейлы стоят и после LLM. Если она сказала «отсев», а в названии, сниппете и имени заказчика одновременно видны слова про LLM, заказную разработку и лицензирование, вердикт поднимается до «сомнительно». Это правило живёт с середины июля. 4 августа к нему добавилось второе, про сбор данных, после того как фильтр пропустил закупку парсинга цен, а предскоринг за семь секунд снял её как сбор и мониторинг данных без разработки. Если ответ трижды не разбирается как валидный JSON с одним из трёх вердиктов, карточка становится сомнительной с причиной «предскоринг не дал валидного ответа». Это тоже зашито в код, промпт про сбои ничего не знает. Отсюда и 75 % отказов «не наш профиль» из лида. Дешёвая ступень пропускает к человеку много лишнего, и мы держим её такой, пока цена ложного отсева выше цены лишней карточки.

Больше всего карточек эта ступень отбила по неверной причине на дате. У 1 274 карточек с дедлайном из 1 344, что были в базе на 28 июля, дедлайн задан датой без времени. Парсер даёт полночь по Москве, то есть 21:00 UTC предыдущего дня, а счётчик рабочих дней брал календарную дату от UTC-значения и получал «дедлайн сегодня». Порог по рабочим дням жил в четырёх местах кода, на предскоринге он был «меньше одного рабочего дня», и 109 карточек были отбиты им за сутки до срока. После разбора порог сняли вовсе, оставив только «дедлайн уже прошёл».

Сбои, которые не подняли алерт

Скоринг устроен в два яруса и один положительный флаг. Дисквалификаторы отвечают «да или нет», например продукт вместо разработки или закрытая для нас отрасль. Взвешенные критерии дают балл от 0 до 100, например референсы и экономика. У каждого текстовое обоснование. 27 июля мы разбирали тендер, чей балл на трёх пересчётах менялся от 39,4 к 27,9 и дальше к 5,0. В трассе стояли 12 вызовов подряд со stop_reason равным refusal. Средняя LLM отказалась отвечать, причину отказа она не сообщает, и мы её не установили. Код дисквалификатора трактовал пустой ответ как «критерий пройден». Таких «пройден» при сбое набралось 20, а 28 оценок взвешенных критериев из 1 172 на тот день выпали из балла без следа, сбой выкидывал критерий и из числителя, и из знаменателя.

Починка прошла мимо промптов. В шлюзе (единой точке, через которую идут все обращения к LLM) у результата вызова появились свойства refused и failure_reason рядом с уже жившим truncated, а у критерия третье состояние. passed равно None, критерий не считается ни пройденным, ни сработавшим, карточка показывает «балл неполный, оценено N из M», уходит алерт. За два месяца в базе набралось 44 результата с пустой оценкой из 6 174. Немного, но каждый из них раньше либо выпадал из балла, либо считался пройденным.

Сбой средней LLM на скоринге, до и после починки

Что случилось

Было

Стало

Отказ LLM (stop_reason равен refusal) на дисквалификаторе

пустой ответ считался «критерий пройден», таких набралось 20

у критерия третье состояние, passed равно None, карточка показывает «балл неполный, оценено N из M», уходит алерт

Отказ или обрыв на взвешенном критерии

28 оценок из 1 172 за день выпали из балла без следа

пустая оценка видна, за два месяца 44 из 6 174

База знаний недоступна (нет токена в окружении)

обоснование «база недоступна», балл 44,5 вместо 35,5, читали глазами на приёмке

отсутствие базы знаний поднимает алерт

Обрыв по max_tokens на выжимке

48 вызовов за 36 минут, 774 тысячи входных токенов

капы попыток по трассе, переживают перезапуск воркера

Ещё два сбоя были такими же тихими. Скоринг подключает базу знаний с каталогами наших услуг и кейсов, и с первого прогона он работал без неё. Токен доступа отсутствовал в окружении контейнера, система штатно писала в обоснование, что база знаний недоступна, и это прочитали только на приёмке, глазами. Пересчёт с живой базой дал 35,5 вместо 44,5, девять баллов итога вслепую держались на завышенном соответствии референсам, и с тех пор отсутствие базы знаний поднимает алерт. Затем короткая выжимка по одному тендеру, которую делает дешёвая LLM, обошлась в 48 вызовов за 36 минут на 774 тысячи входных токенов, обрыв по max_tokens порождал повтор без счётчика. Капы попыток считаются по трассе, она переживает перезапуск воркера.

Молчали и два отказа вне LLM. Прокси лежал двое суток, туннель не поднимался ни к одному хосту, 69 отказов загрузки из 69, 49 алертов «приложите вручную» и ни одного про канал. Появилась проверка канала опорным запросом, чтобы отличать «лёг прокси» от «закрыт домен». Второй отказ случился в воркере. Он работает в две полосы, быстрая ведёт весь конвейер от обнаружения до скоринга, медленная собирает коммерческие предложения и документы заявки. Одна ячейка в 71 знак против колонки varchar(64) откатывала транзакцию каждые пять секунд и остановила быструю полосу на 20 часов. Алерт отправить было некому, отправка стояла в той же полосе ниже места падения. Проходы изолированы друг от друга, а сторож после 60 падений подряд поднимает алерт уровня «ошибка», который доходит до мессенджера.

Всё это возможно потому, что шлюз один. Он пишет в трассу полный промпт, ответ, имя LLM, токены, длительность и причину остановки, если она не штатная. По трассе за два месяца сделано 10,5 тысячи вызовов. По тарифам, зашитым в код, это около 433 долларов, 53 % на среднюю LLM для скоринга и сборки ТЗ, 41 % на старшую для коммерческих предложений, 5 % на дешёвую. Это расчёт по трассе, счёт провайдера мы с ним не сверяли. Выходные токены в трассе включают и размышления LLM.

Вызовы LLM за два месяца по трассе шлюза

LLM

Вызовов

Входных токенов, млн

Выходных токенов, млн

Отказов

Обрывов

Среднее время, с

Доля затрат

Дешёвая (Claude Haiku 4.5)

4 489

15,0

1,5

0

155

4,4

5%

Средняя (Claude Sonnet 5)

5 514

47,6

5,9

12

2

15,6

53%

Старшая (Claude Opus 5, в июле Opus 4.8)

459

10,7

5,0

0

12

151

41%

Итого

10 462

73,4

12,4

12

169

около 433 долларов по тарифам в коде

Скачать документацию и не получить ТЗ

Документация скачивается в три яруса. Первый это прямая загрузка через российский прокси с общим таймаутом, без российского адреса на пробных прогонах проваливались 9 загрузок из 10. Второй ярус это браузер, и тут развилка по площадке, либо headless-браузер без логина по одному файлу за раз, либо вход по учётке площадки. Третий это «приложите вручную» с алертом. За два месяца по базе 429 документов с извлечённым текстом пришли через учётку, 428 через публичный браузер, 265 прямой загрузкой и 41 руками.

Как пришли документы с извлечённым текстом, два месяца

Ярус

Документов

Учётка площадки в браузере

429

Публичный headless-браузер

428

Прямая загрузка через российский прокси

265

Приложены вручную

41

Отличать временный сбой от постоянного пришлось учиться на инцидентах. Сначала любая ошибка TLS считалась жёстким отказом, потом транзиенты получили кулдаун 15 минут и восемь попыток. Обратная ошибка стоила дороже. Мёртвая ссылка с 404 держала тендер восемь часов, пока пауза между попытками росла от двух минут до шести часов, а 12 файлов из 13 на 550 тысяч знаков не уходили в извлечение текста, пока не скачается тринадцатый. С тех пор 404 и 410 постоянные с первой попытки, и страница HTML вместо файла тоже.

Хуже отказа только успех с мусором. Браузер сохранял файлом страницу «Доступ запрещен.» из 70 байт. С сайта заказчика вместо ТЗ скачивался годовой отчёт на 9 МБ. Площадки кладут в подвал страницы регламент и политику обработки данных в PDF. Пять таких файлов маскировали отсутствие документации и заодно отменяли повторный сбор ссылок со страницы, ведь «документы уже есть». Автодетектор подвала вычитает ссылки главной страницы площадки из ссылок карточки, уборка по новому правилу сняла 35 мусорных документов из базы и из папок тендеров в облачном хранилище.

В собранном тексте технического задания однажды нашлось слово «по模ели», потом «в低нагрузку». Средняя LLM, собирающая единый текст из одного или нескольких документов, изредка подменяет русский слог иероглифом, живых случаев за два месяца ровно два. Восстановить слово из символа нельзя, поэтому чинить автоматически мы отказались. Детектор при записи ищет иероглифы в собранном тексте, кладёт их контексты в отдельное поле рядом с ним и поднимает алерт, дальше решает человек.

Проверка скоримости, дешёвый классификатор «есть ли в документации предмет закупки», получала первые 24 тысячи знаков склейки всех файлов без сортировки. В одном тендере оба ТЗ по 62 тысячи знаков остались за срезом, в окно попали анкета аккредитации и минимальные требования, и тендер получил метку «регламент аккредитации». Классификатор теперь смотрит голову каждого файла, per_file = max(800, cap // len(docs)), где cap это общий бюджет знаков на проверку. Ту же ошибку среза делал инструмент замера фильтра. Он печатал названия обрезанными до 86 знаков, и отчёт «фильтр пропускает одно название из 660» на деле означал пять. Смотреть на обрезок и считать, что видишь целое, самая частая наша ошибка за эти два месяца.

Пропуски покрытия и как мы их считаем

За два месяца мы разобрали 14 пропусков, причины у них разные. Формулировка не совпала со словарём, индекс не отдал запись, фильтр не сработал, площадку не читали, предскоринг снял, индексация запоздала, перепубликация легла глубже досягаемой ленты. Эти случаи и двигали правила. Площадку мы добавляем по доказанному промаху, без «на всякий случай». Так 13 августа в список попала площадка, где закупка «Виртуальный сотрудник ИТ поддержки» висела в ленте, которую никто не читал.

3 августа выяснилось, что одна площадка публикует за сутки не меньше 300 процедур, лента агрегатора за те же сутки отдаёт 52. Для неё появился свой канал, чтение через браузер под своей учёткой раз в три часа. 7 августа мы замерили покрытие тем же поисковым API агрегатора, четырьмя фразами, и нашли 19 профильных записей за трое суток. 11 из них были на наших лентах, 6 на площадках вне списка, 2 без метки площадки, то есть 8 из 19 конвейер не видел. Перепись 140 кодов площадок агрегатора показала 63 живых, из которых на тот день читались 11. А в конце августа словарный поиск, от которого мы ушли в июле, вернули как страховку за 200 запросов в сутки после случая с перепубликацией. Та же закупка под новым номером есть в точечном поиске, но в ленте на глубине 700 записей её нет.

Замер покрытия 7 августа поисковым API агрегатора, четыре фразы, трое суток

Профильных записей

19

Были на наших лентах

11

На площадках вне списка

6

Без метки площадки

2

Конвейер не видел

8 из 19

Кодов площадок у агрегатора

140, из них живых 63, читались 11

Шесть мест, где ломалось, и где чинили

Место

Что ломалось

Где чинили

Поиск по словам в чужом индексе

индекс не ищет по названию, словарь не совпадает с формулировками, потолки запросов

код: чтение лент целиком, отметка «докуда дочитали», ротация площадок, глубокий обход по третям

Регулярка фильтра профиля

ловила хвосты слов и предлог «по», отбрасывала профильные названия

правила: границы слов, регистр, html.unescape, 17 сильных маркеров, проверка по пулу отвергнутых названий

Три вердикта предскоринга

223-ФЗ целиком уходил в «сомнительно», неполная карточка отсеивалась, RFI считался НИР, дата «дедлайн сегодня»

промпт: пять версий до 24 июля (единственное место); код: правило 223-ФЗ, гардрейлы, снятый порог по дате

Сбои без алерта

отказ LLM считался «пройден», выпадал из балла, база знаний молчала, прокси и воркер лежали без алерта

код: шлюз с refused и failure_reason, третье состояние критерия, капы по трассе, проверка канала, сторож воркера

Документация без ТЗ

404 держал тендер восемь часов, мусорные файлы из подвала, иероглифы в тексте, срез склейки

код: 404 и 410 постоянные, автодетектор подвала, детектор иероглифов, голова каждого файла

Пропуски покрытия

площадку не читали, индексация запоздала, перепубликация легла глубже ленты

правила и каналы: площадка по доказанному промаху, свой канал раз в три часа, словарный поиск как страховка

Что из этого полезного

К закупкам описанные приёмы не привязаны, они годятся для любого конвейера на LLM над потоком документов. Источник стоит читать целиком и фильтровать своими правилами, с отметкой «докуда дочитали» и окном перечитывания, чужой поиск матчит не то, что кажется на первый взгляд. Жёсткие правила до LLM у нас отбили почти половину отсеянных карточек (44-ФЗ и истёкшие сроки), и ошибались они так же, только тише, поэтому порог по дате мы сняли вовсе. У дешёвой LLM вердиктов три, и сомнение с причиной уходит человеку.

Отказ, обрыв и нечитаемый ответ LLM мы считаем третьим состоянием критерия с алертом «оценено N из M», иначе сбой прячется под «пройден» или выпадает из балла. И классификатору надо показывать голову каждого файла, срез склейки прячет главное. Это же правило работает для любого отчёта, который вы читаете глазами.

Оговорки

Все замеры сделаны на своей базе, систематического третьего источника для проверки покрытия у нас нет, пропуски находил человек по чужим рассылкам. Суточную латентность лент мы не решили. Не решены закупки, которых агрегатор не отдаёт вовсе (три подтверждённых случая, статистику копим), и ложные зеркала, когда две разные закупки одного портала совпадают по названию, сроку и именам файлов.

View the original on Хабр

KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.