Анти-патерн Giant System Prompt: гігантський системний промпт

Anti-pattern, коли системний prompt стає занадто великим і складним для підтримки.
На цій сторінці
  1. Ідея за 30 секунд
  2. Приклад анти-патерну
  3. Чому виникає і що йде не так
  4. Правильний підхід
  5. Швидкий тест
  6. Чим відрізняється від інших анти-патернів
  7. Overengineering Agents vs Giant System Prompt
  8. Too Many Tools vs Giant System Prompt
  9. Agents Without Guardrails vs Giant System Prompt
  10. Самоперевірка: чи немає у вас цього анти-патерну
  11. FAQ
  12. Що далі

Ідея за 30 секунд

Giant System Prompt — це анти-патерн, коли майже всю логіку агента намагаються вкласти в один великий системний prompt.

У результаті інструкції починають конфліктувати, пріоритети стають неочевидними, а поведінка моделі — нестабільною. Це підвищує latency, вартість і ризик регресій після дрібних правок.

Просте правило: системний prompt має бути коротким і стабільним, а змінну логіку краще виносити в маршрутні блоки, policy-шари і валідацію в коді. Системний prompt має задавати роль і базові правила, але не містити всю бізнес-логіку системи.


Приклад анти-патерну

Команда будує агента підтримки і поступово додає нові правила просто в один системний prompt.

З часом цей prompt перетворюється на гігантський блок інструкцій для всіх сценаріїв одразу.

PYTHON
SYSTEM_PROMPT = """
You are support agent.
- Always be brief.
- Always provide detailed step-by-step explanation.
- Never call tools unless user asks.
- For payment issues always call get_payment_status.
- Reply only in strict JSON.
- Prefer natural text if JSON looks unnatural.
... hundreds of lines ...
"""

response = agent.run(
    system_prompt=SYSTEM_PROMPT,
    user_message=user_message,
)

У такій схемі модель бачить забагато інструкцій із різними пріоритетами:

PYTHON
always_be_brief + give_step_by_step_explanation
json_only + prefer_natural_text
never_call_tools + always_call_payment_tool

Для цього кейсу краще мати короткий базовий prompt і окремі route-specific блоки:

PYTHON
system_prompt = BASE_PROMPT + ROUTE_PROMPTS[route]

У цьому випадку giant prompt додає:

  • конфлікти між правилами
  • складну підтримку після змін
  • нестабільний формат і тон відповіді

Чому виникає і що йде не так

Цей анти-патерн часто з’являється, коли команда хоче "швидко вирішити все промптом" без чіткої межі між інструкціями, policy і runtime-логікою.

Типові причини:

  • кожен новий інцидент "лікують" ще одним рядком у system prompt
  • немає модульності: один prompt для всіх маршрутів
  • policy-правила живуть у тексті prompt, а не в коді
  • відсутні чіткі власники і версійність prompt-блоків

У результаті виникають проблеми:

  • конфлікт інструкцій — у prompt одночасно є суперечливі правила
  • нестабільна поведінка — однаковий запит може давати різний стиль і формат
  • вища latency і вартість — довгий prompt збільшує токени на кожен запуск
  • крихкість змін — невелика правка може ламати інші сценарії
  • складний дебаг — важко зрозуміти, яке саме правило спрацювало

Типові production-сигнали, що system prompt уже занадто великий:

  • одна зміна правила викликає регресію в іншому маршруті
  • cost per request росте через довгий незмінний prompt
  • команда не може швидко пояснити пріоритет між двома конфліктними інструкціями
  • після дрібної правки prompt падає success rate на частині кейсів

Вибір інструмента, формату і стилю — це частина LLM inference. Коли в prompt забагато різнорідних інструкцій, зростає кількість можливих інтерпретацій, і модель частіше обирає правило, яке формально підходить, але не є найкращим для цього маршруту.

Коли така схема розростається, без trace і візуалізації виконання важко зрозуміти, який саме prompt-блок був використаний у конкретному запуску і яке правило вплинуло на поведінку моделі.

Правильний підхід

Починайте з короткого стабільного system prompt, який задає роль і базові правила. Змінну логіку виносьте в маршрутні блоки, policy-гейти і перевірку output у коді.

Практична рамка:

  • тримайте маленький BASE_PROMPT для спільних правил
  • додавайте ROUTE_PROMPTS тільки для конкретного типу задач
  • policy і обмеження реалізуйте в коді, а не в гігантському тексті
  • перевіряйте output і міряйте ефект змін (наприклад, покращення success rate без різкого росту latency і cost per request)

Наприклад, формат відповіді краще перевіряти через schema validation перед поверненням результату.

PYTHON
BASE_PROMPT = """
You are a support agent.
Follow safety and output rules.
"""  # stable instructions shared across all routes

ROUTE_PROMPTS = {
    "payment": "Use payment policy. Return strict JSON.",
    "refund": "Use refund policy. Ask clarifying question if needed.",
}

def run_support_agent(user_message: str):
    route = classify_intent(user_message)  # simple classifier or rules
    system_prompt = BASE_PROMPT + "\n\n" + ROUTE_PROMPTS[route]

    response = agent.run(
        system_prompt=system_prompt,
        user_message=user_message,
    )

    if not validate_output(response):  # schema / required fields / safety checks
        return stop("invalid_output")

    return response

У такій схемі правила стають прозорішими: легше оновлювати конкретний маршрут і менше шансів зламати сусідні сценарії.

Швидкий тест

Якщо на ці питання відповідь "так", у вас є ризик giant-system-prompt:

  • Чи один system prompt намагається покрити майже всі сценарії одразу?
  • Чи дрібна правка в prompt часто дає побічні регресії в інших кейсах?
  • Чи важко визначити, яке саме правило має вищий пріоритет у конфлікті?

Чим відрізняється від інших анти-патернів

Overengineering Agents vs Giant System Prompt

Overengineering AgentsGiant System Prompt
Основна проблема: зайві архітектурні шари і компоненти без вимірюваної користі.Основна проблема: один великий системний prompt накопичує конфліктні інструкції.
Коли виникає: коли для простих кейсів додають нові шари оркестрації про запас.Коли виникає: коли нові правила й винятки постійно дописують у той самий prompt.

Too Many Tools vs Giant System Prompt

Too Many ToolsGiant System Prompt
Основна проблема: агент бачить забагато інструментів і нестабільно обирає дію.Основна проблема: інструкцій у системному prompt забагато, і вони конфліктують.
Коли виникає: коли в одному маршруті накопичується надмірний набір інструментів без чіткого allowlist.Коли виникає: коли один prompt намагаються використати для всіх маршрутів і сценаріїв.

Agents Without Guardrails vs Giant System Prompt

Agents Without GuardrailsGiant System Prompt
Основна проблема: агент працює без policy boundaries і системних обмежень.Основна проблема: policy-логіку і runtime-правила намагаються утримати в тексті prompt.
Коли виникає: коли немає allowlist, deny-by-default, бюджетних і safety-обмежень у коді.Коли виникає: коли критичні обмеження залишають лише як текстові інструкції без жорстких перевірок.

Самоперевірка: чи немає у вас цього анти-патерну

Швидка перевірка на anti-pattern Giant System Prompt.
Відмічайте пункти під вашу систему і дивіться статус нижче.

Перевірте свою систему:

Прогрес: 0/8

⚠ Є ознаки цього anti-pattern

Спробуйте винести прості кроки у workflow і залишити агента лише для складних рішень.

FAQ

Q: Довгий system prompt — це завжди погано?
A: Ні. Проблема не в довжині сама по собі, а в монолітності й конфліктах. Якщо prompt росте, але залишається модульним і зрозумілим за пріоритетами, ризики значно нижчі.

Q: Коли варто виносити правило з prompt у код?
A: Коли правило критичне для безпеки, витрат або стабільності формату. Такі обмеження краще реалізовувати як явні runtime-перевірки, а не як текстову інструкцію.

Q: Як перейти від giant prompt до модульної схеми без великого рефакторингу?
A: Почніть із малого: виділіть BASE_PROMPT, додайте 1-2 route-specific блоки для найчастіших кейсів і поступово переносіть policy-правила з prompt у кодові гейти.


Що далі

Схожі anti-patterns:

  • Overengineering Agents — коли складність росте швидше, ніж користь.
  • Too Many Tools — коли шум у виборі інструментів робить поведінку нестабільною.
  • Agent Everywhere Problem — коли агент застосовується навіть для детермінованих задач.

Що будувати замість цього:

  • Allowed Actions — як фіксувати межі дій агента в коді.
  • Routing Agent — як розділяти маршрути й давати релевантні інструкції.
  • Policy Boundaries in Architecture — як винести policy з prompt у явні архітектурні межі.
⏱️ 7 хв читанняОновлено 16 березня 2026 р.Складність: ★★★
Реалізувати в OnceOnly
Safe defaults for tool permissions + write gating.
Використати в OnceOnly
# onceonly guardrails (concept)
version: 1
tools:
  default_mode: read_only
  allowlist:
    - search.read
    - kb.read
    - http.get
writes:
  enabled: false
  require_approval: true
  idempotency: true
controls:
  kill_switch: { enabled: true, mode: disable_writes }
audit:
  enabled: true
Інтегровано: продакшен-контрольOnceOnly
Додай guardrails до агентів з tool-calling
Зашип цей патерн з governance:
  • Бюджетами (кроки / ліміти витрат)
  • Дозволами на інструменти (allowlist / blocklist)
  • Kill switch та аварійна зупинка
  • Ідемпотентність і dedupe
  • Audit logs та трасування
Інтегрована згадка: OnceOnly — контрольний шар для продакшен агент-систем.
Автор

Цю документацію курують і підтримують інженери, які запускають AI-агентів у продакшені.

Контент створено з допомогою AI, із людською редакторською відповідальністю за точність, ясність і продакшн-релевантність.

Патерни та рекомендації базуються на постмортемах, режимах відмов і операційних інцидентах у розгорнутих системах, зокрема під час розробки та експлуатації governance-інфраструктури для агентів у OnceOnly.