Патерн Self-Critique Agent: чернетка → критика → правка

Запусти безпечний цикл самокритики: одна перевірка за схемою, одна контрольована правка і журнал змін — щоб якість була стабільною.
На цій сторінці
  1. Суть патерна
  2. Проблема
  3. Рішення
  4. Як працює
  5. У коді це виглядає так
  6. Як це виглядає під час виконання
  7. Коли підходить — і коли ні
  8. Підходить
  9. Не підходить
  10. Чим відрізняється від Reflection
  11. Коли використовувати Self-Critique (vs інші патерни)
  12. Як комбінувати з іншими патернами
  13. Коротко
  14. Переваги та Недоліки
  15. FAQ
  16. Що далі

Суть патерна

Self-Critique Agent — це патерн, у якому агент спочатку пише чернетку, потім за шаблоном фіксує ризики й обов’язкові правки, робить одну контрольовану правку і записує що саме змінилось у журналі змін.

Коли потрібен: коли потрібен суворий структурований розбір ризиків і контрольована ревізія з audit-слідом.


На відміну від легкого reflection, self-critique зазвичай суворіший:

  • критика має фіксований формат (наприклад, JSON)
  • правки можна робити лише за правилами
  • контроль приросту тексту
  • система зберігає журнал змін (що було → що стало)

Патерн Self-Critique Agent: чернетка → критика → правка

Проблема

Уявімо, що агент готує оновлення щодо проблеми для клієнта.

Чернетка:

"Реліз затримано через збій у платіжному модулі."

Потім надходить запит:

"Зроби формулювання м'якшим."

Без self-critique рамки агент часто робить "красиве переписування", яке виходить за межі задачі:

  • додає нові припущення
  • робить тон менш конкретним
  • розширює текст поза потрібний обсяг
  • маскує проблему замість уточнення

"Покращити формулювання" не має перетворюватися на "змінити сенс".

У підсумку:

  • зміст непомітно змінюється
  • неясно, що саме виправлено
  • аудит не відтворює логіку правок
  • відповідь стає менш надійною для рішень

У цьому й проблема: під час "покращення" агент може змінити зміст, хоча мав змінити тільки форму.

Рішення

Self-Critique вводить правило: правити можна тільки те, що записано в "обов’язкових правках".

Аналогія: це як редакторська правка за списком зауважень. Спочатку фіксуємо, що саме треба виправити, потім вносимо одну контрольовану правку. Так відповідь стає яснішою без зміни змісту.

Ключовий принцип: Спочатку структурована критика, потім одна контрольована ревізія зі слідом аудиту.

Агент може запропонувати переписування, але система дозволяє лише точкові правки, які прямо входять у список "обов’язкових правок".

Керований процес:

  1. Чернетка: згенерувати першу версію
  2. Критика: сформувати артефакт (risks + required_changes)
  3. Рішення: ok/доопрацювати/ескалювати
  4. Ревізія: зробити одну обмежену ревізію
  5. Аудит: записати diff + metadata

Це дає:

  • покращення ясності без зміни фактів
  • чітке розділення "що не так" і "що виправлено"
  • відтворюваність правок
  • контроль high-risk відповідей до публікації

Працює добре, якщо:

  • critique має фіксовану структуру (schema-driven)
  • revision обмежена required_changes
  • діє no_new_facts
  • обов'язковий audit diff

Як працює

Diagram

Щоб патерн був безпечним, потрібні чіткі межі:

  • одна перевірка
  • одна правка
  • не додавати нових фактів
  • правити тільки те, що в списку обов’язкових правок
  • не роздувати текст (наприклад, +20% максимум)
  • при високому ризику — стоп або перевірка людиною
Опис повного флоу: Draft → Critique → Revise → Audit

Чернетка
Агент генерує первинну відповідь.

Критика
Окремий critique-крок повертає структурований результат: ризики, required changes, severity.

Ревізія
Агент змінює лише те, що вказано як required, без розширення scope.

Аудит
Система логує before/after, changed flag і короткий diff для дебагу та інцидент-аналізу.

У коді це виглядає так

PYTHON
draft = writer.generate(goal, context)

critique = critic.review_once(
    draft=draft,
    schema="risks_required_changes_v1",
)

if critique.high_risk:
    return escalate_to_human(critique.reason)

if critique.ok:
    return draft

revised = writer.revise_once(
    draft=draft,
    required_changes=critique.required_changes,
    rules=[
        "no_new_facts",
        "max_length_increase_pct=20",
        "keep_scope",
    ],
)

approved = supervisor.review_output_patch(
    original=draft,
    revised=revised,
    allowed_changes=critique.required_changes,
)

audit.log_diff(
    before=draft,
    after=approved,
    risks=critique.risks,
)

return approved

Self-Critique не повинен запускатися "до ідеалу". Один critique + одне доопрацювання (revise), і перевірка, що revision не вийшов за межі required_changes.

Як це виглядає під час виконання

TEXT
Goal: запропонувати безпечний план дій під час мережевого інциденту

Draft:
"Проблема викликана мережею. Потрібно перезапустити весь кластер."

Critique:
- risk: твердження про причину без доказів
- risk: занадто широкий вплив дії
- required_change: додати перевірки перед restart

Revision:
"Ймовірна причина - мережевий збій.
Перед перезапуском кластера перевірити стан вузлів і затримку.
Якщо підтверджено частковий збій - перезапустити лише affected nodes."

Повний приклад Self-Critique агента

PYPython
TSTypeScript · скоро

Коли підходить — і коли ні

Підходить

СитуаціяЧому Self-Critique підходить
✅Високоризиковий результат перед відправкоюSelf-critique додає структурований контроль перед фінальним релізом відповіді.
✅Потрібен слід аудиту змінКритика та правки фіксуються явно і підходять для аудиту.
✅Є чітка схема критикиФормалізована структура робить перевірку відтворюваною і контрольованою.
✅Потрібне контрольоване переписування без розростання обсягуSelf-critique допомагає обмежити переписування тільки необхідними змінами.

Не підходить

СитуаціяЧому Self-Critique не підходить
❌Критична затримка і немає бюджету на додатковий прохідДругий крок генерації може бути занадто дорогим по часу і вартості.
❌Неможливо примусово застосувати правила, наприклад no_new_factsБез жорстких обмежень критика/переписування може погіршити достовірність.
❌Задача детермінована і стабільно валідується тестамиДодатковий прохід критики дублює вже надійний процес перевірки.

Бо self-critique додає другий крок генерації і підвищує вартість виконання.

Чим відрізняється від Reflection

ReflectionSelf-Critique
Глибина перевіркиШвидко подивитися “чи все ок” (легка перевірка)Суворо записати “що не так” і “що треба виправити” списком
Форматok/issues/fixризики, severity, обов'язкові правки
RevisionЗазвичай мінімальнаОбмежене переписування із правилами
Операційний фокусШвидкий прохід якостіКероване переписування + журнал змін

Reflection частіше використовують як легкий фільтр перед відправкою. Self-Critique - коли потрібен жорсткіший контроль змін.

Коли використовувати Self-Critique (vs інші патерни)

Використовуйте Self-Critique, коли потрібна глибока критика за явними критеріями і контрольоване переписування.

Короткий тест:

  • якщо потрібно "оцінити за чеклістом і переписати відповідь" -> Self-Critique
  • якщо потрібно "зробити лише коротку перевірку перед відправкою" -> Reflection Agent
Порівняння з іншими патернами та приклади

Швидка шпаргалка:

Якщо задача виглядає так...Використовуйте
Потрібна коротка перевірка перед фінальною відповіддюReflection Agent
Потрібна глибока критика за критеріями і переписування відповідіSelf-Critique Agent
Потрібно відновлювати процес після timeout, exception або падіння інструментаFallback-Recovery Agent
Потрібні жорсткі policy-перевірки перед ризиковою дієюGuarded-Policy Agent

Приклади:

Reflection: "Перед фінальною відповіддю швидко перевір логіку, повноту і явні помилки".

Self-Critique: "Оціни відповідь за чеклістом (точність, повнота, ризики), потім перепиши".

Fallback-Recovery: "Якщо API не відповідає, зроби retry -> fallback-джерело -> ескалація".

Guarded-Policy: "Перед відправкою даних назовні перевір policy: чи дозволено це робити".

Не впевнені, чи вам потрібен повний цикл Self-Critique, а не лише Reflection? Спроєктувати Агента →

Як комбінувати з іншими патернами

  • Self-Critique + RAG: критика і правки дозволені лише в межах фактів із retrieval-контексту.
  • Self-Critique + Supervisor: ризикові правки не застосовуються автоматично, а передаються на ручне погодження.
  • Self-Critique + Reflection: Reflection робить швидкий pre-check, а Self-Critique вмикається для складних або спірних відповідей.

Коротко

Коротко

Self-Critique Agent:

  • Створює чіткий список проблем і обов’язкових правок
  • Робить одну контрольовану правку
  • Зберігає журнал змін (що було → що стало)
  • Не дає “покращенню тексту” непомітно змінити зміст

Переваги та Недоліки

Переваги

перевіряє відповідь перед фінальною версією

зменшує кількість очевидних помилок

покращує чіткість формулювань

допомагає дотримуватися вимог задачі

Недоліки

додає додатковий крок і час

не замінює перевірку фактів

без чітких критеріїв може правити зайве

FAQ

Q: Чи можна робити кілька критичних проходів?
A: Технічно можна, але це швидко перетворюється на дорогий цикл. Базовий безпечний стандарт: 1 + 1.

Q: Навіщо обов'язково логувати зміни?
A: Без diff складно зрозуміти, що саме змінило якість відповіді і де виникла помилка.

Q: Чи потрібна окрема модель-критик?
A: Іноді так, але не обов'язково. Критичніше мати сувору схему, валідацію виходу і жорсткі правила ревізій.

Що далі

Self-Critique покращує якість через кероване переписування.

Але що робити, якщо відповідь треба не просто переписати, а перевірити перед ризиковою дією за політиками?

⏱️ 10 хв читання • Оновлено 6 березня 2026 р.Складність: ★★★
Практичне продовження

Приклади реалізації патерна

Перейди до реалізації на готових прикладах.

Реалізувати в OnceOnly
Pattern-specific prompts stay in your codebase. OnceOnly handles policy enforcement, dedupe, and audit.
Використати в OnceOnly
from onceonly import OnceOnly

client = OnceOnly(api_key="once_live_...")

client.gov.policy_from_template(
    agent_id="billing-agent",
    template="moderate",
    overrides={
        "allowed_tools": ["stripe.charge", "send_email"],
        "max_spend_usd_per_day": 75.0,
    },
)

result = client.ai.run_tool(
    agent_id="billing-agent",
    tool="stripe.charge",
    args={"amount": 9999, "currency": "usd", "order_id": "ord_123"},
    run_id="run_billing_ord_123",
    spend_usd=0.25,
)
if not result.allowed:
    raise RuntimeError(result.policy_reason)
Integrated: pattern runtime boundaryOnceOnly
Ship agent patterns without rebuilding control-plane primitives
Keep pattern logic in your app, and use OnceOnly for policy, dedupe, and incident controls:
  • Execute side-effect tools through `client.ai.run_tool(...)`.
  • Attach budgets and allowlists with `client.gov.upsert_policy(...)`.
  • Propagate `run_id` across steps for end-to-end traceability.
  • Branch on `allowed / decision / policy_reason` safely.
  • Avoid duplicate writes when retries happen across workers.
Practical shortcut: you can keep your current pattern architecture and add this boundary instead of building governance infra from scratch.
Pattern Integration (Python SDK)
from onceonly import OnceOnly

client = OnceOnly(api_key="once_live_...")

client.gov.upsert_policy({
    "agent_id": "support-agent",
    "max_actions_per_hour": 400,
    "allowed_tools": ["kb.search", "ticket.reply"],
    "blocked_tools": ["user.delete"],
})

step = client.ai.run_tool(
    agent_id="support-agent",
    tool="kb.search",
    args={"query": "refund policy"},
    run_id="run_support_042",
    spend_usd=0.02,
)
if not step.allowed:
    raise RuntimeError(step.policy_reason)

Автор

Микола — інженер, який будує інфраструктуру для продакшн AI-агентів.

Фокус: патерни агентів, режими відмов, контроль рантайму та надійність систем.

🔗 GitHub: https://github.com/mykolademyanov


Редакційна примітка

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

Приклади є навчальними й можуть використовувати імітовані інструменти та дані. Перед використанням у production перевірте надійність, безпеку й відновлення у власному середовищі.