Проблема: Галлюцинации в инженерных расчетах

Я занимаюсь расчетами строительных конструкций в комплексе SOFiSTiK. Основной инструмент взаимодействия с ним — внутренний язык CADINP. Это мощный, но старый процедурный язык с жестким синтаксисом: строгая последовательность модулей (AQUA -> SOFIMSHC -> ASE), специфичные команды фиксации узлов и неявные зависимости.

SOTA-модели (ChatGPT-4o, Claude 3.5 Sonnet) справляются с CADINP посредственно. Основные проблемы при генерации кода general-purpose моделями:

  1. Синтаксический шум: Выдумывание несуществующих аргументов функций.

  2. Потеря контекста: Забывают объявить материалы перед их использованием.

  3. Ошибки физики: Игнорирование степеней свободы (например, отсутствие фиксации кручения для 3D-стержней), что приводит к сингулярности матрицы жесткости.

Имея на руках рабочую станцию с NVIDIA RTX 3090 (24 GB), я поставил задачу: дообучить (fine-tune) небольшую открытую LLM, которая понимала бы специфику инженерной логики лучше, чем гиганты от OpenAI.

Стек и железо

  • GPU: GeForce RTX 3090 (24 GB VRAM).

  • OS: Windows 11 + WSL2 (Ubuntu).

  • Фреймворк: Unsloth (для оптимизации памяти и скорости).

  • Базовая модель: Qwen 2.5 / Qwen 3 (экспериментировал с размерами 7B, 14B, 8B).

Подготовка данных: Chain of Thought

Просто "скармливать" модели мануалы оказалось неэффективным. Модель учила определения, но не логику построения скрипта.
Я собрал датасет из 3500+ пар «Инструкция — Решение», используя подход Chain of Thought (CoT).

Вместо прямой генерации кода я заставил модель сначала формировать блок рассуждений <think>. Это критически важно для инженерных задач.

Пример структуры jsonl (переведено на русский язык для наглядности):

{
  "messages": [
    {"role": "user", "content": "Смоделируй бетонную балку 6м..."},
    {"role": "assistant", "content": "<think>Задача на статику. Нужно определить материал в AQUA, затем геометрию. Внимание: балка в пространстве, необходимо закрепить поворот вокруг оси X.</think>\n+PROG AQUA..."}
  ]
}

Разметка и валидация датасета производилась полуавтоматически с помощью скриптов на Python.

Датасет, собственной персоной
Датасет, собственной персоной

Процесс обучения и борьба с VRAM

Основным вызовом стало ограничение памяти. 24 ГБ VRAM — это пограничное значение для полноценного файнтюнинга даже квантованных моделей, если требуется длинный контекст.

Попытка 1: 14B-модель.
При контексте max_seq_length = 4096 (необходимо для длинных скриптов) я столкнулся с OOM (Out Of Memory). Оверхед WSL и системы съедал около 2-3 ГБ, и батч даже в 1 единицу не влезал.

Попытка 2: 7B-модель (Overfitting).
Обучение на 6 эпох привело к деградации модели. Loss упал до 0.02, модель начала выдавать мусорные токены и перешла на китайский язык (особенность базы Qwen).

Финальная конфигурация:
Я остановился на архитектуре 8B (Qwen 3) с дистилляцией логики DeepSeek.

Гиперпараметры, которые дали стабильный результат:

  • LoRA Rank/Alpha: 32 / 64 (Агрессивное обучение для лучшего запоминания синтаксиса).

  • Epochs: 3 (Оптимум для предотвращения оверфиттинга на датасете в 3.5к записей).

  • Learning Rate: 2e-4 с косинусным планировщиком.

  • Gradient Accumulation: 8.

    • Важный нюанс: Так как физический Batch Size на карте был равен 2, накопление градиента (8 шагов) позволило эмулировать эффективный батч = 16. Это сгладило кривую обучения и сделало модель более "вдумчивой".

Результаты

Модель была квантована в GGUF (q8_0) для инференса через LM Studio.

На тестовых задачах модель демонстрирует способность к самокоррекции через блок <think>.
Пример (сокращенно):

Запрос: Задай нагрузку на балку.
Мысль модели: ...Нагрузка должна быть приложена к структурной линии. Проверяю направление: ось Z смотрит вниз, значит нагрузка положительная.
Код: LINE SLN 1 TYPE PZZ P1 15.0

Скрин из LM Studio
Скрин из LM Studio

Модель корректно расставляет FIX PPMX (фиксация кручения) и соблюдает иерархию модулей. Ошибки случаются (примерно в 10-15% случаев), чаще всего связаны с модулем SOFIMSHA и SOFIMSHC, ответственные за генерацию сетки конечных элементов.

Заключение и планы

На данный момент получился специализированный локальный Copilot, который в узкой доменной области CADINP работает точнее, чем универсальные модели. Проект полностью некоммерческий и открытый (Open Weights).

Где взять:
Модель опубликована на Hugging Face. Там же, в карточке модели (README), я собрал всю необходимую информацию:

  • Ссылку на скачивание GGUF (q8_0).

  • Инструкцию по запуску через LM Studio.

  • Контакты для обратной связи (Телеграм, Discussions) — для тех, кто готов помочь с тестированием.

Планы на v2:
Сейчас я собираю «Red Team» из инженеров для поиска edge-cases — сценариев, где модель ошибается. Если вам интересна тема применения локальных LLM в проектировании, буду рад вашим баг-репортам. Ссылки на каналы связи ищите в описании модели.

Репозиторий проекта:
ссылка

Комментарии (16)


  1. Andnet
    21.01.2026 06:03

    Непонятно только для чего взята такая кривая модель, как Qwen. Gemma3 есть, с отличной логикой и отличным русским. OpenAI тоже не плох, но гугловская лучше. Странно что 8В не влезла в 24Гб, можно было и на процессоре частично попробовать а не только на видео и модель 27 выбрать.

    С китайскими Дипсик и Квен у меня вообще ни одного результата не было нормального, вот вообще ни одного. Куча кривых рассуждений, потеря логики и целей и подмена и незаметное исправление задания. Джема или Джемини все с первого раза делает, даже не требует поправок. Попробуй, вдруг зайдет.


    1. Vovenzza Автор
      21.01.2026 06:03

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


  1. Smolensk
    21.01.2026 06:03

    Что насчёт морально-этической стороны вопроса? Для неспециалистов поясню, что речь идёт о проектировании несущей способности зданий, которые сейчас возводятся преимущественно из монолитного железобетона. Вручную этот вид конструкций рассчитать практически невозможно, поэтому их полностью моделируют и полагаются на результат машинного расчёта. Т.о. эта задача сводится к "засунуть данные в чёрный ящик" и затем следовать результатам, которые невозможно перепроверить (упростил ради ясности). Вместо инженера становится достаточно оператора. А человек, как известно, закономерно достигает уровня своей некомпетентности на текущей позиции. Эта проблема стала очевидной задолго до ИИ и в разных странах её нивелируют как могут на нормативном уровне. В России, к примеру, закон требует проводить эти вычисления не менее чем в двух разных "чёрных ящиках", чтобы можно было обезопасить себя от ошибочного ввода исходных данных и сопоставить результаты. Прочитайте предыдущее предложение ещё раз. И если оператор решит ещё более упростить себе жизнь, скармливая исходные данные в чёрный ящик с помощью ИИ, то именно так это и будет попадать в продакшн. И если это будет проще на порядок, то именно на порядок больше и попадёт. Не думаю, что автор этого поста по случайному совпадению только сегодня утром завёл себе аккаунт на хабре и не имеет ни статей, ни комментов. Ибо вопрос, скажем так, деликатный...


    1. ratmanz
      21.01.2026 06:03

      Так может речь не о полном доверии ИИ, а на быстрой отработке идей и прототипов? После которых будет найдет 1-3 варианта для полноценного расчета. Тогда можно быстрее и проще проверять больше вариантов которые в другом случаи не взяли работу из-за рисков с расчетами. А так быстрее подсчитали, выявили больше потенциально успешных решений и уже с ними работать.


    1. Vovenzza Автор
      21.01.2026 06:03

      Так, ну начну с того, что я не недавно тут. Просто опытом своих разработок я еще здесь не делился, и подумал, что возможно здесь найдутся люди, которые дадут хорошие советы по реализации моих идей.
      В чем, собственно цель моего проекта. Софистик - очень сложный инструмент, но при этом максимальную гибкость ему дает знание языка cadinp, и я считаю, что инженер не обязан его знать. Я лично не учился на программиста и мне хватает вещей, которые я должен знать и постоянно изучать в своей работе. Инженер, например, обязан знать и понимать, как работают конструкции. Должен, посмотрев на расчет, понять, соответствует ли действительности то, что ему показывает программа. Нейросети, мкэ-программы и программы для 3д-моделирования - были, есть и останутся только инструментами.
      А что касается этики: цель моего проекта - не заменять инженеров операторами. Экспертиза чаще всего требует, чтобы помимо красивых картинок из программ для конечно-элементного анализа вы прилагали аналитический расчет. И не только экспертиза, сами инженеры не любят рисковать. К Вашим словам по поводу черных ящиков я добавлю, что мы не только проверяем расчеты в нескольких программах, но и почти всегда проверяем сами программы аналитическими методами, вручную. А это, как Вы можете догадаться, занимает время.
      Если Вы боитесь, что развитие технологий и ускорение работы в программах как-то затронет качество расчетов, то претензии я бы тут предъявлял определенно не к людям, которые хотят упростить жизнь инженерам. А, например, к университетам, которые не дают достаточного уровня знаний и понимания, что вообще такое - работа инженером. Либо к застройщикам/заказчикам, которые зачастую от своих подрядчиков требуют невыполнимых сроков и максимально экономные варианты проектирования, что максимально увеличивает шанс ошибки банально из-за человеческого фактора.