- BrainTools - https://www.braintools.ru -
Заявка на поставку металлопроката и металлоконструкций на реальном рынке живет считанные часы. Снабженец строительного объекта отправляет ведомость одновременно в 4-5 заводов и заказывает у того, кто первым прислал официальное коммерческое предложение с точными ценами, весом и сроками отгрузки.
На производстве подготовка такого расчета занимает от 4 до 8 часов рабочего времени квалифицированного сметчика. Пока завод перебивает номенклатуру в Excel и сверяет коэффициенты, заказчик уже подписывает договор с более оперативным поставщиком.
Ниже технический разбор того, как мы автоматизировали этот процесс: почему популярная идея «скормить все в ChatGPT» приводит к прямому кассовому разрыву завода на сотни тысяч рублей, и как выглядит рабочая трехслойная архитектура на стыке Vision OCR, словарей ГОСТ и детерминированного кода.

В теории интеграторы любят рассуждать об электронном документообороте и структурированных XML-файлах. В реальности 90% входящих заявок – это информационный хаос:
Размытый скан проектной ведомости с наклонными строками и синей печатью поверх текста.
Фрагмент чертежа КМ/КМД, сфотографированный на телефон прямо со стройплощадки.
Разношерстный Excel от субподрядчика без артикулов и кодов 1С.
Простое сообщение в мессенджере с профессиональным сленгом закупщиков.
Типичный текст сообщения в отделе сбыта выглядит так:
«Добрый день! Нужен расчет на объект: уголок на сотку – 50 хлыстов по 12м, швеллер шестнашка П – 300 метров, лист четверка горячекатаный ст3сп – 15 квадратов, труба сотка стенка 4 – 1.2 км. Резка в размер. Жду расчет сегодня до 14:00.»
Чтобы превратить этот текст в официальный документ с печатью завода, инженер-сметчик выполняет длинную цепочку рутинных действий:
Переводит разговорный сленг («швеллер шестнашка П») в строгую нормативную номенклатуру («Швеллер 16П ГОСТ 8240-97»).
Открывает марочники и справочники стандартов, чтобы найти теоретическую массу одного погонного метра или квадратного метра.
Перемножает метры на нормативы ГОСТ, суммирует тоннаж, закладывает процент технологического отхода на раскрой (обычно 3-7%).
Заходит в 1С:УТ или ERP, проверяет фактические остатки на складе и актуальную закупочную цену за тонну.
Добавляет стоимость резки за рез, заводскую наценку, налоги и вручную верстает бланк коммерческого предложения в Word или Excel.
Когда за день в отдел продаж приходит 15 таких спецификаций, сметчики физически захлебываются в рутине.
Первое, что приходит в голову разработчику при слове «нейросети» – написать промпт: «Вот текст ведомости заказчика, посчитай общую массу и итоговую сумму по нашему прайсу».
Мы провели чистый контролируемый тест на реальной ведомости металлопроката в модели GPT-4o. Скормили позицию:
«Швеллер 16П – 300 метров. Рассчитай теоретическую массу партии в тоннах.»
Результат генерации модели:
Модель бодро выдала красивое объяснение с формулами и вывела итог: 2,50 тонны.
Проверяем по государственному стандарту ГОСТ 8240-97 (Швеллеры стальные горячекатаные):
Теоретическая масса 1 погонного метра швеллера 16П составляет 14,20 кг.
Корректная масса партии: 300 м × 14,20 кг/м = 4 260 кг = 4,26 тонны.
Ошибка модели: 1,76 тонны в минус (занижение веса на 41,3%).
Если завод применит этот расчет при цене металла, например, 72 000 рублей за тонну:
Корректная себестоимость партии металла: 4,26 т × 72 000 ₽ = 306 720 ₽.
Себестоимость по расчету ChatGPT: 2,50 т × 72 000 ₽ = 180 000 ₽.
Прямой кассовый убыток предприятия на одной позиции: 126 720 рублей.
Языковая модель – это вероятностный генератор токенов, а не детерминированный калькулятор. Она помнит, что у слова «швеллер» в обучающей выборке часто встречались цифры 8, 10, 14, 16, 20. В процессе предсказания следующего токена она берет правдоподобную плотность стали или справочный вес соседнего типоразмера (например, швеллера 10П или 12П с массой ~8,59 кг/м) и с абсолютной уверенностью выдает галлюцинацию за чистую монету.
Доверять языковой модели арифметику, физические единицы измерения и расчет денег на производстве категорически запрещено.
Чтобы исключить человеческий фактор и при этом гарантировать нулевой процент галлюцинаций в цифрах, мы разделили обработку заявки на три строго изолированных контура:
Нейросеть решает ровно ту задачу, для которой она создана: работает с неструктурированным языком и сложной геометрией документов. Никакой математики [2] на этом слое нет.
Предобработка сканов (OpenCV):
Выравнивание угла наклона листа (deskew через преобразование Хафа).
Нормализация контраста и приглушение синего канала печатей в цветовом пространстве HSV (без жесткой бинаризации, чтобы не убить полутона и градиенты для мультимодальной сети).
Извлечение таблиц:
Мультимодальная модель (Vision API) анализирует разметку документа. В отличие от Tesseract OCR, мультимодальные модели понимают контекст объединенных ячеек, нестандартные заголовки граф и рукописные приписки снабженцев на полях.
Нормализация через системный промпт со строгой схемой: Модель извлекает семантику: семейство проката, калибр и единицы измерения. При этом сам номер стандарта модель не придумывает – точный ГОСТ подтягивается жестким кодом на Слое 2 из реестра соответствий по связке семейства и размера профиля (например, channel + 16П однозначно мапится в ГОСТ 8240-97). Это гарантирует, что модель не подставит устаревший или выдуманный стандарт.
{
"name": "parse_specification_items",
"description": "Извлечение позиций металлопроката и параметров заказа",
"parameters": {
"type": "object",
"properties": {
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"raw_text": { "type": "string", "description": "Исходный текст позиции из заявки" },
"standard_family": {
"type": "string",
"enum": ["channel", "angle", "beam", "sheet_hot", "pipe_round", "pipe_profile"],
"description": "Семейство проката для маппинга на стандарт"
},
"profile_size": { "type": "string", "description": "Калибр/размер, например 16П, 100х100х8" },
"steel_grade": { "type": "string", "description": "Марка стали, например Ст3сп5, 09Г2С" },
"quantity": { "type": "number", "description": "Числовое значение объема" },
"unit": { "type": "string", "enum": ["meters", "tons", "pieces", "sq_meters"] },
"cut_length": { "type": ["number", "null"], "description": "Длина реза/хлыста в метрах, если явно указана для позиции" }
},
"required": ["raw_text", "standard_family", "profile_size", "quantity", "unit", "cut_length"]
}
}
},
"required": ["items"]
}
}
Модель выдает типизированный JSON. Фраза «швеллер шестнашка П – 300 метров» (где длина хлыста для резки не была задана) преобразуется в валидный объект с cut_length: null:
{
"raw_text": "швеллер шестнашка П - 300 метров",
"standard_family": "channel",
"profile_size": "16П",
"steel_grade": "Ст3сп",
"quantity": 300,
"unit": "meters",
"cut_length": null
}
Второй слой – это полностью детерминированный код без использования нейросетей. В систему загружена локальная реляционная база справочных весов по всем государственным стандартам РФ.
Фрагмент расчетного модуля на Python:
from decimal import Decimal, ROUND_HALF_UP
# Детерминированный реестр стандартов по семейству проката (исключает галлюцинации LLM)
FAMILY_TO_GOST = {
"channel": "ГОСТ 8240-97",
"angle": "ГОСТ 8509-93",
"beam": "ГОСТ 26020-83",
"sheet_hot": "ГОСТ 19903-2015",
"pipe_round": "ГОСТ 10704-91",
}
# Справочные коэффициенты погонной массы по ГОСТ 8240-97 (кг на 1 метр)
GOST_8240_97_WEIGHTS = {
"10П": Decimal("8.59"),
"12П": Decimal("10.40"),
"14П": Decimal("12.30"),
"16П": Decimal("14.20"),
"18П": Decimal("16.30"),
"20П": Decimal("18.40"),
"24П": Decimal("24.00"),
}
def calculate_item_cost(item: dict, warehouse_price_per_ton: Decimal, markup_ratio: Decimal = Decimal("1.12")):
"""
Строгий расчет массы и стоимости позиции с контролем размерностей.
Метры * (кг/м) = кг -> кг / 1000 = тонны -> тонны * (руб/т) = рубли.
"""
family = item["standard_family"]
standard_code = FAMILY_TO_GOST.get(family)
if not standard_code:
raise ValueError(f"Неизвестное семейство проката: {family}")
size = item["profile_size"]
qty = Decimal(str(item["quantity"]))
unit = item["unit"]
if standard_code == "ГОСТ 8240-97":
weight_per_meter = GOST_8240_97_WEIGHTS.get(size)
if not weight_per_meter:
raise ValueError(f"Размер {size} не найден в справочнике ГОСТ 8240-97")
if unit == "meters":
total_weight_kg = qty * weight_per_meter
total_meters = qty
elif unit == "tons":
total_weight_kg = qty * Decimal("1000")
total_meters = total_weight_kg / weight_per_meter
else:
raise NotImplementedError(f"Единица измерения {unit} требует дополнительных параметров")
total_weight_tons = (total_weight_kg / Decimal("1000")).quantize(Decimal("0.001"), rounding=ROUND_HALF_UP)
# Расчет себестоимости партии и цены с учетом наценки
base_cost = total_weight_tons * warehouse_price_per_ton
final_price = (base_cost * markup_ratio).quantize(Decimal("1"), rounding=ROUND_HALF_UP)
return {
"standard_title": f"Швеллер {size} {standard_code} / {item.get('steel_grade', 'Ст3сп')}",
"meters": float(total_meters),
"weight_tons": float(total_weight_tons),
"base_cost_rub": float(base_cost),
"final_price_rub": float(final_price)
}
Актуальные складские остатки сырья и базовая себестоимость подтягиваются из 1С:ERP через стандартный REST API по коду номенклатуры. Алгоритм не имеет права фантазировать: если нужной марки стали нет на складе, позиция помечается флагом requires_procurement.
Ни одно реальное производство с многомиллионными контрактами не выпустит документ клиенту в полностью автоматическом режиме без участия инженера.
Конвейер формирует проект коммерческого предложения за 15-20 секунд и отображает его сметчику в удобном интерфейсе:
Зеленый статус: позиции, которые распознаны с уверенностью 99%+ и имеют полное совпадение по номенклатуре склада.
Желтый статус: позиции, где в исходном скане была неразборчивая цифра либо нестандартный раскрой. Сметчик тратит 30 секунд на сверку сомнительной строки.
Генерация чистового КП: после подтверждения инженером движок рендерит официальный PDF-документ на фирменном бланке завода со сквозной нумерацией, таблицей ГОСТ, условиями доставки, факсимиле подписи и круглой печатью организации.
Готовый файл автоматически прикрепляется к сделке в CRM (Битрикс24 или AmoCRM), а ссылка на скачивание отправляется клиенту в WhatsApp или на почту.
Мы замерили результаты работы сметного отдела завода до и после внедрения расчетного конвейера на выборке из 350 входящих промышленных спецификаций:
|
Параметр |
Ручной расчет инженера |
Автоматизированный конвейер |
|---|---|---|
|
Время подготовки 1 КП |
4 – 8 рабочих часов |
20 – 30 секунд на генерацию + 2 мин на валидацию |
|
Вычисление массы |
Ручной поиск по бумажным справочникам и формулам в Excel |
Детерминированный расчет по базам ГОСТ |
|
Риск ошибки в тоннаже |
До 8-12% из-за опечаток и усталости к концу дня |
0% (алгоритмическая проверка единиц) |
|
Роль сметчика |
Монотонная перебивка строк со сканов в таблицы |
Экспертный контроль сомнительных позиций |
|
Скорость ответа клиенту |
На следующий рабочий день (сделка часто теряется) |
В течение 10-15 минут после обращения |
|
Нагрузка на отдел сбыта |
Максимум 8-10 сложных расчетов в день на отдел |
До 200 спецификаций в смену без расширения штата |
Чтобы проверить, как связка Vision-модели и детерминированных словарей ГОСТ отрабатывает на нестандартных таблицах и чертежах без необходимости поднимать контур локально, я собрал открытую песочницу-демо: samartsev.tech/kp [3].
Там можно загрузить собственный скан спецификации металлопроката, фото чертежа или Excel-таблицу без регистрации и посмотреть, как сырые строки раскладываются на чистые позиции стандарта с расчетом массы и себестоимости.
Большие языковые модели отлично работают как универсальный транслятор человеческого языка, нечетких сканов и разношерстных таблиц в строгие структуры данных. Но как только дело доходит до физики, ГОСТов и рублей, управление должно немедленно передаваться детерминированному коду.
Такая связка превращает рутинный рабочий день сметчика в двухминутный контроль готового черновика и позволяет предприятию забирать контракты первыми.
Автор: Алексей Самарцев (samartsev.tech [4]). Обсудить архитектуру пайплайна и нюансы нормализации можно в комментариях или в Telegram: @samartsev_ai [5].
Автор: a_samartsev
Источник [6]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/38532
URLs in this post:
[1] ошибка: http://www.braintools.ru/article/4192
[2] математики: http://www.braintools.ru/article/7620
[3] samartsev.tech/kp: http://samartsev.tech/kp
[4] samartsev.tech: http://samartsev.tech
[5] @samartsev_ai: https://t.me/samartsev_ai
[6] Источник: https://habr.com/ru/articles/1107610/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1107610
Нажмите здесь для печати.