← Claude на русском
AI-гайд
Эту статью целиком написал Claude Opus 4.7 (ИИ). Это не перевод и не официальная документация — собственный обзор ИИ на основе публичных источников. Для критичных решений проверяй факты сам.

Промпты для производственной UI-системы

Для Вани · 2026-04-23

Ваня, этот гайд — про то, как встроить LLM в твою веб-систему управления производством лестниц так, чтобы модель помогала, а не создавала головную боль. Акценты: structured outputs, арифметика через tools, генерация UI, и жёсткое разделение «что отдаём LLM, что оставляем на сервере».

Главный принцип

LLM — это парсер и переводчик. Правда живёт в Postgres. Арифметику делает Kotlin. Авторизацию решает сервер. Валидацию ввода — обязательно.

Что отдаёшь LLM

Что НЕ отдаёшь LLM

Structured outputs: жёсткая схема JSON

У OpenAI включается флагом response_format с JSON-схемой. Модель гарантированно вернёт JSON, соответствующий схеме. Для всех парсеров используй это — избавит от «почти JSON» с пояснениями вокруг.

val schema = """
{
  "type": "object",
  "required": ["floors", "wood_type"],
  "properties": {
    "floors": {"type": ["integer", "null"], "enum": [2, 3, null]},
    "wood_type": {"type": "string", "enum": ["oak", "pine", "ash", "unknown"]},
    "approx_run_length_mm": {"type": ["integer", "null"]},
    "notes": {"type": "string"}
  },
  "additionalProperties": false
}
""".trimIndent()

val response = openAi.chatCompletion {
    model = "gpt-5.4-mini"
    messages { system(PARSE_PROMPT); user(rawText) }
    responseFormat = JsonSchema(schema = schema, strict = true)
}

Что здесь происходит: модель не может вернуть лишние поля или неправильные типы — API это гарантирует. Парсинг в Kotlin становится надёжным однострочником.

Шаблон 1. Парсер заявок

Ты парсер заявок на деревянные лестницы. Извлеки данные из свободного
текста клиента.

<rules>
- Все размеры в миллиметрах. 2.8 м = 2800 мм.
- wood_type: oak, pine, ash, или unknown.
- floors: 2 или 3. Иначе null.
- Поле не упомянуто → null (или "unknown" для wood_type).
- Не выдумывай.
- Если текст бессмысленный — {"parse_error": "причина"}.
</rules>

<examples>
  ... 3-4 примера ...
</examples>

Текст клиента:
{{USER_TEXT}}

Шаблон 2. Генератор BOM (без цен)

Ты — генератор спецификации материалов для деревянной лестницы.

<order>{{PARSED_ORDER_JSON}}</order>

<rules>
- Считай количество ступеней: run_length / 200 мм, округление вверх.
- Всегда включай: ступени, подступёнки, тетива, поручень, стойки,
  крепёж (саморезы), клей, лак.
- Размеры — в метрах (для досок) или штуках (для крепежа и т.п.).
- Учитывай технологический перерасход 15% для досок.
- Цены НЕ указывай — их посчитает код.
</rules>

Верни JSON-массив позиций в теге <bom>:
[{"material_code": string, "qty": number, "unit": "m|pcs|l"}, ...]

Что здесь происходит: модель решает «что и сколько», а сумму и остаточный расчёт прибыльности Kotlin берёт на себя (дёргает get_material_price(material_code) из прайса и умножает).

Шаблон 3. Ревьюер сметы

Ты — опытный прораб по производству лестниц. Ревизуй готовую смету.

<estimate>{{ESTIMATE_JSON}}</estimate>

Думай внутри <thinking>:
1. Все ли ключевые материалы учтены?
2. Адекватны ли количества по заданным размерам?
3. Нет ли явных противоречий (например, дуб + цена сосны)?

Итог — в <review>:
{
  "issues": [
    {"severity": "low|med|high", "field": "items[3].qty", "text": "..."}
  ],
  "summary": "1-2 предложения"
}

Не переписывай смету — только находи проблемы.

Что здесь происходит: генератор создаёт, ревьюер находит дыры, человек (мастер) решает. Хороший пример evaluator-optimizer-паттерна.

Разграничение прав: что видит мастер, что админ

Это делает сервер, не LLM. Перед каждым LLM-вызовом твой код должен:

  1. Проверить, что пользователь аутентифицирован.
  2. Проверить, что у него есть право на конкретный ресурс (заказ, прайс, отчёт).
  3. Подавать в промпт только те данные, которые этот пользователь видит.

Если мастер видит только свои заказы — в <user_orders> промпта кладёшь только его заказы. Модель по определению не может «случайно показать» чужой заказ, если его не передали. Так безопаснее, чем надеяться на промпт «не показывай чужое».

Генерация UI через Claude Code

Claude Code хорошо делает черновики React-компонентов по описанию формы. Подход: описываешь поля, валидацию, поведение — получаешь TypeScript/JSX. Потом сам правишь под свой дизайн-систему. Пример промпта в Claude Code:

В файле web/src/components/OrderForm.tsx собери форму ввода нового
заказа. Поля:
- customer_name (обязательное, string)
- address (string или пусто)
- floors (выбор: 2, 3)
- wood_type (выбор: oak, pine, ash)
- run_length_mm (число, 1500-5000)
- notes (textarea, до 500 символов)

Валидацию сделай через zod. При submit — POST на /api/orders.
Стиль — как в существующем CustomerForm.tsx, чтобы визуально
совпадало. Тестов не пиши, я добавлю отдельно.

Что делать при ошибках LLM

Что это значит для твоей системы