Pull to refresh

Comments 10

«Уверенный и неправильный результат» — у меня это была самая дорогая ошибка, причём безо всякой модели. Приложение красит продукты по составу, и когда на этикетке нет отдельной строки про насыщенные жиры, алгоритм досчитывал их сам: общий жир умножить на 0,3. Число не с потолка, это доля насыщенных у сливочного масла. Беда в том, что у оливкового масла она около 14%, у грецкого ореха 9%, и орехам мы бодро приписывали вчетверо больше, чем в них есть.

Нашлось не по жалобам, а случайно: полез посмотреть общую картину по базе и завис на том, что в красной зоне подозрительно много сыра, орехов и оливкового масла. Прогнал — 6245 товаров, 43% всех красных вердиктов, стали красными исключительно из-за этой догадки. Ровно ваш сюжет, только несопоставимое консолидировал не RAG-агент, а одна строчка в формуле.

Лечение оказалось близко к вашему про справочники: проблема была не в самом предположении, а в том, что предположение и факт с этикетки шли в расчёт с одинаковым весом. Развели по весам — доля красных упала с 24% до 18%, и ушли оттуда именно сыр с орехами, а колбаса с нитритом осталась где была.

Раз эталон рыночных цен у вас пока открытый вопрос — не пробовали вместо абсолютного эталона держать распределение по собственной истории и ловить выбросы относительно него? У нас с составами это выручает там, где никакой «нормы» не существует: работает формулировка «эта позиция резко выбивается из того, что мы видели по такой категории». Для закупок, правда, есть неприятный побочный эффект: если завышают систематически и давно, распределение уже отравлено и считает это нормой.

По распределению вместо абсолютного эталона — да, склоняемся туда же, но ваша оговорка про отравленную историю для закупок решающая. Медиана и MAD хорошо держат отдельные выбросы, пока завышена меньшая часть истории по позиции: тогда такая закупка остаётся далеко от центра и ловится. Но если по позиции задирают цену давно и системно, сам центр уезжает вверх, завышение становится «нормой», и отклоняться уже не от чего.

Поэтому своя история у нас скорее базовый слой, а сверху всё равно нужен внешний ориентир и проверка человеком.

И да, отравленное распределение частично лечится тем же, что вы сделали с составами: учитывать происхождение данных и уровень доверия к ним. Например, цена из конкурентной закупки и цена из разовой закупки у единственного поставщика не должны влиять на «норму» одинаково, даже если обе попали в историю.

Эталон рыночных цен - это своя история закупок, очищенная от аномалий и нестандартных условий оплаты, всех эти Cito! (Срочно!) итд..

Да, источник так себе, он не самый дешёвый и не самый низко ценовой, но он почти неоспорим т.к. реален и хорошо коррелирует с некоторыми персоналиями.

Тут поспорю. Своя история реальна и под рукой, но «почти неоспоримой» я бы её не называл — как раз из-за того, чем вы заканчиваете. Если цена хорошо коррелирует с конкретными людьми, а ставят её эти люди не первый год, то в «очищенной» истории их уровень уже сидит как норма. Разовые Cito! и явные выбросы вычистить можно, а ровное систематическое завышение останется: оно не выброс, его нечем зацепить.

Поэтому свою историю берём только базовым слоем и будет сверять с внешним источником, которого те же персоналии не касались. Иначе эталон подтверждает ровно то, что в него заложили.

Отловить эталон рыночных цен - очень не простая задача. Делал подобное, столкнулся с проблемой, что цена - это очень плавающий критерий, здесь может быть еще множество дополнительных факторов. Например цена запчастей на промышленное оборудование - это просто вынос мозга. Дешевое - не значит приемлемое. Дорогое - не значит лучшее. Качественное и по средней цене - тоже не всегда хорошо, так как канал доставки не стабильный и товар может задерживаться на недопустимые сроки.

Цена плавает по куче факторов, поэтому модель должна выдавать не «среднюю цену», а интервал - в каких границах цена нормальна для данной позиции, региона, объёма и срочности. Аномалия тогда - не «дороже эталона», а «вылет за хвост распределения». И сравнивать закупку надо не по одной цифре, а по нескольким осям сразу: цена, срок поставки, оригинал или реплика, надёжность поставщика по истории. Иначе система научится, что дешёвое - это хорошо, и пропустит подделку как удачную закупку.

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

Порядок у меня выстроился тот же, что у вас: детерминированные правила и справочники, первые лейблы через вердикты экономиста, потом ML.

LLM - только для объяснений сверху.

Можно в универсальный денежный измеритель пересчитать вообще всё: качество, доступность ЗИП, срок гаранти и доставки, дни предоплаты/отсрочки, рейтинг поставщика итд итп. Нужно всего лишь утвердить веса и знак каждого фактора. Получим цену, которой нигде не видно, и которая отражает реальную ценностность актива.

Но видели бы вы лица тендер-шмендер-менов, собственников и их свиты, когда они видят в соседней колонке эту эфф цену... Да никогда в жизни ни в какие коммерческие или госзакупки они не позволят внедрить подобное, поскольку оно лишит смысла работать всех тех кто живёт манипуляциями на торгах. Это их хлеб, и они не делятся властью, которую даёт им засилие номинальной "низкой цены".

Пересчитать конечно можно, но не всегда это легко, особенно когда все параметры которые нужно учесть в голове у пары сотрудников и делятся они ими не очень охотно :)
И лица тех кто живёт за счёт откатов и прочего видеть доводилось и не раз. И как они с пеной у рта доказывают, что такая система не будет работать, что система не сможет учесть фактические изменения на рынке...
Но это уже другая история.

Важнейшие факторы ценообразования назовет любой здравомыслящий человек (от уборщицы, понимающей в бытовой химии до владельца) - вот их и надо спрашивать. Ну или у LLM. Просто нужно изначально договориться, что мутные комлпексные факторы типа "ремонтопригодность" - придется разбить на неск. внятных, проверямых по api или скриптом: "наличие 3-х самых часто заменяемых расходников/ЗИП на 5-ти площадках" итд.

Ошибки при назначении весов факторов - да, возможны. Но и их можно постепенно изжить, если заранее договориться что будет использован A/B-подход. Он позволяет пересчитать веса ближе к оптимальным. Саботаж возможен в любом деле, но он не может быть вечным, люди устают врать или просто забывают свои же установки. Вот тут-то их веса и пересмотрят. Эффективная цена (ставка, активность итп) - ключ к управлению себестоимостью при закупках. Однажды устаканенные веса могут работать десятилетиями.

223/44-ФЗ как внешний источник — дельно, спасибо. Внешний якорь мы искали, но до госзакупок как источника не дошли, а там есть важное преимущество: цена зафиксирована реальной сделкой, вместе с датой и регионом.

Оговорюсь как практик: сама по себе такая цена тоже не истина. На неё могут сильно влиять специфика ТЗ, условия поставки, срочность, объём и уровень конкуренции, а по редким промышленным позициям сопоставимой номенклатуры в ЕИС часто просто не находится. Но как внешняя точка, которую наша собственная закупочная история не может сама себе «нормализовать», это уже намного сильнее, чем вариться только в своих данных.

И «каждую цену с источником и меткой времени» — абсолютно да. Без этого эталон действительно устаревает молча, тут вы прямо в больное.

По специфике:
1. Срочность по 223/44-ФЗ обычно понятие относительное и не учитывается.
2. Объём и уровень конкуренции по позиции обычно величина постоянная - тоже не учитывается.
3. Редкие позиции, это позиции для ручного заполнения, так как обычно по ним и производителей 1-2 и цена в основном постоянная, привязанная например к Евро.
4. По остальной специфике - писать в дополнительные поля, важные для последующей интерпретации, всё что не требуется интерпретировать - мусор.

Sign up to leave a comment.

Articles