Демократизация AI-кодинга: почему мы построили C#-слой синтеза для лёгких локальных моделей
Проблема, о которой молчат евангелисты AI
Индустрия любит рассказывать про GPT-4o и Claude, которые пишут идеальный код по одному промпту. Но большинство инди-разработчиков не сидят на подписках за $20-200 в месяц и не гоняют агентов через облачные API с оплатой за токен. У них есть RTX 3050 Ti с 4 ГБ VRAM, желание автоматизировать рутину в Unity Editor — и ноль бюджета на эксперименты.
Мы в MLLM Studio решили эту задачу не через "подождём, пока модели станут умнее", а через инженерию на стороне клиента. Результат — Ather, локальный AI-агент для Unity, который работает на моделях типа Qwen 2.5 Coder 3B или Llama 3.2 3B и при этом выдаёт стабильный, компилируемый C#-код внутри редактора. Без единого цента на API-ключи.
Это статья о том, как мы это сделали.
Почему маленькие модели "ломаются" именно в Unity
3B-параметрические модели — это не urезанные GPT-4. Это принципиально другой класс инструментов: быстрые, бесплатные, работающие офлайн на слабом железе, но статистически менее устойчивые к формату вывода. В обычном чат-боте это незаметно. В Unity Editor — фатально.
Мы выделили два системных паттерна отказа, которые не лечатся "более хорошим промптом":
1. Escape-мутация JSON-полезной нагрузки.
Малые модели регулярно "перестраховываются" и экранируют управляющие символы там, где это не нужно. < и > превращаются в \u003c и \u003e, кавычки дублируются, генерик-типы C# (List<Vector3>) превращаются в JSON-калеку. Для человека это забавная деталь. Для компилятора Roslyn — синтаксическая ошибка, которая останавливает весь пайплайн генерации.
2. Смерть в момент Domain Reload.
Unity Editor пересобирает домен приложения при каждой компиляции C#-скриптов. Это выгружает всё состояние в памяти — включая контекст выполняющегося AI-агента. Если агент писал код, ждал ответа модели или выполнял tool-call именно в момент, когда Unity триггерит recompile — процесс просто обрывается. Агент "забывает", что он делал, и пользователь получает зависший интерфейс без объяснений.
Больше модель, больше VRAM — не решает ни одну из этих двух проблем. Это не про интеллект модели. Это про архитектуру среды, в которой эта модель работает.
Решение: C#-слой синтеза, а не более умный промпт
Наш подход был осознанно контрарным. Вместо того чтобы бесконечно "уговаривать" модель через prompt engineering выдавать идеальный формат, мы построили детерминированный C#-слой между выводом LLM и Unity API. Мы назвали его Synthesizer/Sanitizer — по аналогии с тем, как компилятор синтезирует AST из токенов, а не доверяет программисту писать идеальный байт-код руками.