У тебя в системе, скорее всего, будет несколько разных LLM-задач: парсер заявок, генератор BOM, ревьюер сметы, ассистент мастера. У каждого своя «роль». System prompt — это то место, где ты описываешь, кто сейчас говорит, в каких рамках, какой формат ответа. Один и тот же GPT-5.4 с разными system prompts ведёт себя как разные специализированные модели.
Сообщение в API бывает одного из трёх типов:
system — инструкция для всей сессии (характер, формат, ограничения).user — что пришло от пользователя (или от твоего Kotlin-кода).assistant — ответ модели. В истории диалога накапливаются предыдущие её ответы.val response = openAi.chatCompletion {
model = "gpt-5.4-mini"
messages {
system("""
Ты парсер заявок на лестницы. Возвращай только JSON по
схеме, указанной ниже. Не добавляй пояснений.
Schema: { "floors": int|null, "wood_type": string, ... }
""".trimIndent())
user(order.rawText)
}
}
Что здесь происходит: в system — роль
парсера и формат ответа. В user — текст заявки от
клиента. Модель возвращает строку — JSON. Ты её десериализуешь в
data class.
Слабый:
Ты помощник по лестницам. Помогай.
Сильный:
Ты парсер заявок для системы управления производством деревянных лестниц.
Задача: из свободного текста клиента извлечь структурированные данные и
вернуть их одним валидным JSON-объектом.
Правила:
- Все размеры в миллиметрах. Если клиент дал в метрах — переведи.
- wood_type: oak | pine | ash | unknown.
- floors: 2 или 3, иначе null.
- Если поле не упомянуто клиентом — ставь null (для wood_type — "unknown").
- Не выдумывай данные.
- Ответ: только JSON. Без пояснений, без markdown-обёртки.
Если текст клиента совсем бессмысленный, верни:
{"parse_error": "reason"}
Что здесь происходит: чёткая роль, правила по домену, поведение на редких случаях, жёсткий контракт на выход. На такой промпт модель отвечает предсказуемо.
prompts/parser.txt, prompts/bom_generator.txt).
Не смешивай задачи в одном промпте.
oak.
parse_error.