Игорь Градов
Игорь Градов
6 мин
ai

Язык специального назначения для LLM: как ограничить модель и получить стабильный результат

Автору Дзена или разработчику, который хочет получать от большой языковой модели (LLM) предсказуемый результат, а не лотерею, достаточно одного приёма: дать модели не свободу, а язык специального назначения, DSL, жёсткий каркас команд под конкретную задачу.

Почему это важно

LLM генерирует код быстро, но без границ выдаёт десятки вариантов одного и того же действия, и проверять каждый дороже, чем писать самому. DSL, предметно-ориентированный язык (Domain-Specific Language), убирает эту вариативность: модель работает внутри узкого словаря и ошибается реже.

Идея принадлежит Unmesh Joshi, ведущему инженеру компании Thoughtworks и автору книги «Patterns of Distributed Systems». В статье на Martin Fowler's blog он разбирает проект Tickloom, предметную модель и DSL для описания поведения распределённых систем, и показывает, как LLM становится партнёром при итеративном создании такого языка. Для российских проектов, где требования к надёжности и воспроизводимости результатов жёстче среднего, подход с DSL решает конкретную боль: хаотичная генерация кода заменяется каркасом, который можно проверить и переиспользовать.

Зачем вообще ограничивать LLM?

Joshi формулирует проблему так: когда вы просите LLM написать систему по высокоуровневому описанию, вы исходите из того, что «намерение» уже сформулировано точно. На практике это не так.

  • Все проектные решения невозможно знать заранее. Первая спецификация, по словам Joshi, это гипотеза, а не чертёж.
  • Проверка сгенерированного кода не равна его написанию. Просматривая фрагменты, вы оцениваете соответствие замыслу, но не принимаете решения о границах и ответственности.
  • Дизайн раскрывается в процессе реализации, а не до неё.

Язык специального назначения для работы с LLM закрывает этот разрыв: вместо того чтобы описывать «сделай мне систему», вы даёте модели набор строительных блоков, за которые она не может выйти.

Почему DSL и LLM работают в связке?

Joshi указывает на знакомые каждому разработчику примеры:

  • PlantUML, Mermaid, Graphviz для диаграмм.
  • SQL для запросов к базам данных.
  • YAML для Kubernetes для описания облачной инфраструктуры.

Все они намеренно ограничены и описывают узкий набор понятий одной предметной области. LLM генерирует диаграммы Mermaid или SQL-запросы по обычному описанию именно потому, что вариантов мало: язык общего назначения вроде Java даёт десятки корректных способов выразить одно намерение, DSL оставляет один-два.

По наблюдению Joshi, достаточно дать модели несколько примеров на DSL прямо в промпте (промпт, текстовая инструкция для модели), и результат становится стабильнее, чем при работе с обычным языком программирования.

Что понадобится

  • Доступ к любой LLM, поддерживающей длинный контекст: ChatGPT, Claude, GigaChat или YandexGPT.
  • Понимание предметной области, для которой вы создаёте DSL: какие сущности, какие операции, какие ограничения.
  • Набор из трёх-пяти примеров на вашем будущем DSL, чтобы дать модели образец.
  • Около часа на первую итерацию.

Пошаговая инструкция

  1. Определите предметную область и её словарь. Выпишите ключевые понятия. Для блога на Дзене это могут быть «пост», «рубрика», «CTA-блок», «лид», «подзаголовок». Для интернет-магазина: «товар», «скидка», «корзина», «оплата».

  2. Опишите три-пять примеров на будущем DSL. Не программируйте синтаксический анализатор, просто напишите, как должен выглядеть ваш язык. Например:

post "Обзор нейросетей для авторов Дзена"
  rubric: "ИИ-инструменты"
  lid: 1 sentence, 25-30 words
  sections:
    - h2: question
    - h2: statement
  cta: link to dzen.guru/tools
  1. Передайте примеры в системный промпт (system prompt, скрытая инструкция, задающая роль и правила модели) как образцы. Попросите LLM генерировать ответы строго в этом формате:
Ты — генератор контент-планов для Дзена.
Отвечай ТОЛЬКО в формате DSL, приведённом ниже.
Не добавляй пояснений вне формата.
[вставьте три примера]
  1. Итерируйте вместе с моделью. Joshi подчёркивает, что LLM выступает партнёром при создании DSL: вы задаёте границы, модель предлагает варианты синтаксиса, вы проверяете и корректируете. Каждый цикл «описание, генерация, проверка» уточняет и спецификацию, и сам язык.

  2. Зафиксируйте DSL как единственный источник истины. Когда формат стабилизировался, любые изменения в системе проходят через DSL-описание, а не через свободный промпт. Модель генерирует код или контент только по каркасу.

Что ввели и что получили

Задача: автор Дзена хочет, чтобы LLM генерировала структуру поста по его правилам, а не по своим.

Ввод (системный промпт с DSL-образцами + запрос):

Системный промпт: [три примера DSL контент-плана, как в шаге 2]
Запрос: Сгенерируй контент-план для поста про сравнение ChatGPT и GigaChat для копирайтеров.

Результат (модель ответила строго в формате DSL):

post "ChatGPT против GigaChat: что полезнее копирайтеру в 2025"
  rubric: "ИИ-инструменты"
  lid: 1 sentence, 28 words
  sections:
    - h2: "Чем отличается генерация текста?"
    - h2: "GigaChat понимает русский контекст лучше?"
    - h2: "Где каждая модель проигрывает"
  cta: link to dzen.guru/tools

Модель не ушла в свободное сочинение, не добавила лишних секций, не сменила формат. Каркас сработал.

Частые ошибки

DSL слишком свободный. Если ваш язык допускает десятки вариантов одной команды, вы воспроизводите проблему языка общего назначения. Чем жёстче синтаксис, тем предсказуемее результат.

Примеров слишком мало. Один пример в промпте означает, что модель додумает остальное сама. Три-пять примеров дают ей паттерн (повторяющийся образец), от которого сложнее отклониться.

Спецификацию написали один раз и забыли. Joshi прямо говорит: первая спецификация это гипотеза. Если после двух-трёх итераций DSL не обновился, значит, вы не учитываете то, что узнали.

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

Что делать с этим прямо сейчас, по ролям

Автору Дзена. Создайте DSL для своих постов: формат лида, набор допустимых типов подзаголовков, правила CTA-блока. Вставьте три примера в системный промпт и перестаньте каждый раз объяснять модели, «как надо».

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

Маркетологу. DSL-подход пригодится для генерации однотипного контента: карточек товаров, описаний акций, шаблонов рассылок. Один раз опишите формат, потом масштабируйте через промпт без потери качества.

Мнение редакции dzen.guru

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

Честная оговорка: DSL не спасает от галлюцинаций (когда модель уверенно выдумывает то, чего не было). Каркас ограничивает структуру, но не гарантирует фактическую точность содержимого. Проверять факты внутри сгенерированного контента по-прежнему нужно вручную.

Попробуйте за час: возьмите свой самый частый тип контента, опишите его формат тремя примерами, вставьте в системный промпт и попросите модель сгенерировать четвёртый. Если результат совпал с ожиданием, вы только что создали свой первый DSL.

Генератор промптов dzen.guru

Соберите системный промпт с DSL-каркасом для ваших задач за пять минут

Попробовать бесплатно
Поделиться:TelegramVK
Игорь Градов
Игорь Градов

Основатель dzen.guru. Эксперт по монетизации и продвижению на Дзен. Автор курса «Старт на Дзен 2026».

Комментарии

Читайте также

Reasoning effort в больших языковых моделях: как платить меньше за простые задачи
ai

Reasoning effort в больших языковых моделях: как платить меньше за простые задачи

Настройка reasoning effort в больших языковых моделях позволяет управлять тем, сколько вычислительных ресурсов модель тратит на «обдумывание» ответа, и…

5 мин
Запуск LLM на ноутбуке: модель с 2,8 трлн параметров уместили в 64 ГБ памяти
ai

Запуск LLM на ноутбуке: модель с 2,8 трлн параметров уместили в 64 ГБ памяти

Запуск языковой модели с 2,8 триллиона параметров на обычном ноутбуке стал возможен в конце июля 2026 года благодаря архитектуре «смесь экспертов» и новым…

6 мин
Автодополнение кода нейросетью: три приёма сборки контекста, которые убирают галлюцинации
ai

Автодополнение кода нейросетью: три приёма сборки контекста, которые убирают галлюцинации

Языковая модель (LLM, large language model) умеет не просто генерировать текст, а восстанавливать пропущенный фрагмент кода прямо в редакторе, и качество такой…

5 мин