Патерн Reflection Agent: контроль якості в один прохід

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

Суть патерна

Reflection Agent — це патерн, у якому після чернетки відповіді агент робить одну швидку перевірку якості: знаходить очевидні проблеми (нечіткі формулювання, суперечності, занадто впевнені твердження) і один раз виправляє їх перед фінальною відповіддю.

Важливо: Reflection — це легка перевірка перед відправкою. Це не повна перевірка за правилами або політиками.

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


Reflection не замінює основний робочий процес агента.

Він додає короткий етап контролю:

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

Патерн Reflection Agent: контроль якості в один прохід

Проблема

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

Чернетка загалом правильна, але має дрібні ризики:

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

Без контрольного проходу ця чернетка йде напряму користувачу.

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

Наслідки:

  • падає довіра до відповіді
  • з'являється хибна впевненість
  • зростає ризик помилкових рішень

У цьому й проблема: навіть хороша чернетка без перевірки може вийти назовні з критичними неточностями.

Рішення

Reflection додає reflection-policy перед фінальною відправкою.

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

Ключовий принцип: Одна коротка перевірка якості і одне виправлення — без нескінченного "зроби ще краще".

Агент може запропонувати зміну, але політика визначає:

  • чи потрібна ревізія
  • що саме дозволено виправити
  • коли треба зупинка/ескалація

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

  1. Чернетка: згенерувати першу версію
  2. Огляд: провести одну структуровану перевірку
  3. Рішення: ok/доопрацювати/ескалювати
  4. Ревізія: зробити одну patch-only правку за fix_plan
  5. Фіналізація: віддати фінал без нового циклу

Це дає:

  • зняття очевидних ризиків до відправки
  • помітне підвищення якості з малим оверхедом
  • контроль ревізії у межах fix_plan
  • захист від нескінченного self-edit

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

  • діє правило no_new_facts
  • зміни йдуть лише як patch-only
  • high-risk кейси ескалюються, а не переписуються безкінечно

Модель може "хотіти" редагувати відповідь знову і знову, але саме reflection-policy завершує процес у передбачуваних межах.

Як працює

Diagram

Ключове правило: reflection має бути обмеженим.

Тобто:

  • максимум 1 прохід перевірки
  • максимум 1 прохід ревізії
  • без додавання нових фактів
  • ревізія має бути patch-only і лише в межах fix_plan
  • ескалація при high-risk issues
Опис повного флоу: Draft → Review → Revise → Finalize

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

Огляд
Окремий prompt перевіряє чернетку за простими пунктами: чи зрозуміло, чи логічно, чи нема суперечностей і чи нема занадто сміливих тверджень.

Ревізія
Якщо знайдені проблеми, агент робить одну ревізію за структурованим fix_plan.

Фіналізація
Система повертає результат або зупиняє процес, якщо ризик надто високий.

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

PYTHON
draft = writer.generate(goal, context)

review = reflector.review_once(
    draft=draft,
    rubric=[
        "no_new_facts",
        "preserve_uncertainty",
        "consistency_check",
    ],
)

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

if review.ok:
    return draft

revised = writer.revise_once(
    draft=draft,
    fix_plan=review.fix_plan,
    rules=["no_new_facts", "keep_scope"],
)

# optional: перевірити, що ревізія не вийшла за рамки `fix_plan`
approved = supervisor.review_output_patch(
    original=draft,
    revised=revised,
    allowed_changes=review.fix_plan,
)

return approved

Reflection не повинен запускатися “доки не стане ідеально”. Один прохід перевірки, одне доопрацювання через revise і одна перевірка, що ревізія не вийшла за рамки fix_plan.

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

TEXT
Goal: підготувати точну відповідь із коректним формулюванням SLA

Draft:
"SLA для всіх клієнтів становить 99.99%."

Review:
- проблема: надто категоричне твердження
- проблема: не вказано рівень тарифу
- виправлення: додати умову і джерело

Revised:
"SLA залежить від тарифу. Для enterprise — 99.99% згідно з політикою підтримки."

Повний приклад Reflection агента

PYPython
TSTypeScript · скоро

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

Підходить

СитуаціяЧому Reflection підходить
✅Відповідь піде назовні і потрібна додаткова перевіркаReflection ловить очевидні проблеми перед відправкою користувачу.
✅Потрібне покращення якості без великого штрафу затримкиОдин обмежений прохід часто дає відчутне покращення якості.
✅Є чітка рубрика якості і stop rulesФормалізовані критерії роблять самоперевірку стабільною і передбачуваною.
✅Потрібна надійніша фінальна відповідь без циклу переписуванняReflection додає контрольний крок, але не розганяє нескінченні переробки.

Не підходить

СитуаціяЧому Reflection не підходить
❌Критично низька затримкаНавіть один додатковий прохід може зробити відповідь запізнілою.
❌Немає чіткої рубрики якостіБез критеріїв reflection стає хаотичним і не дає стабільного покращення.
❌Потрібна зовнішня валідація фактів через tools або людейReflection не замінює фактчекінг із зовнішніми джерелами чи ручну перевірку.

Бо reflection додає ще один прохід генерації і збільшує час та вартість відповіді.

Чим відрізняється від Self-Critique

ReflectionSelf-Critique
МетаЛовити очевидні проблеми перед відправкоюПеревірити відповідь за суворими правилами і переписати її, якщо щось не так
ГлибинаШвидка перевірка якості: чи відповідь зрозуміла, логічна і без очевидних помилокЧасто суворіша критика і ревізія
Тип результатуok/проблеми/план виправленьдетальні ризики + обов'язкові зміни + орієнтація на diff
РизикПеретворитись на 2-й цикл без лімітівНадмірне переписування і подорожчання процесу

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

Коли використовувати Reflection серед інших патернів

Використовуйте Reflection, коли потрібно швидко перевірити відповідь перед відправкою: чи вона зрозуміла, логічна і без очевидних помилок.

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

  • якщо потрібно "коротко перевірити і виправити перед фіналом" -> Reflection
  • якщо потрібно "глибоко критикувати за чеклістом і переписувати" -> Self-Critique 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: чи дозволено це робити".

Не впевнені, чи достатньо одного кроку Reflection перед відповіддю? Спроєктувати Агента →

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

  • Reflection + RAG: Reflection перевіряє, що висновки справді відповідають знайденим джерелам.
  • Reflection + Supervisor: високоризикові висновки не виправляються автоматично, а передаються на погодження людині.
  • Reflection + ReAct: після серії кроків ReAct агент робить фінальну перевірку перед відповіддю.

Коротко

Коротко

Reflection Agent:

  • Робить одну контрольну самоперевірку
  • Виправляє відповідь один раз
  • Не додає нових фактів
  • Зменшує ризик очевидних продакшн-помилок

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

Переваги

перевіряє відповідь перед відправкою

виправляє очевидні помилки

покращує ясність і структуру

допомагає тримати потрібний формат

Недоліки

додає ще один крок і затримку

витрачає більше токенів

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

FAQ

Q: Чи може рефлексія замінити фактчекінг і тести?
A: Ні. Це додатковий шар якості. Фактчекінг, валідація і контроль політик потрібні окремо.

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

Q: Що робити, якщо рефлексія знаходить проблему високого ризику?
A: Не продовжувати автоматично. Зупиняти процес або ескалювати на перевірку людиною / політику Supervisor.

Що далі

Reflection додає обмежений контроль якості перед фінальною відповіддю.

А що робити, коли потрібна ще суворіша критика і процес ревізії зі структурованими правилами змін?

⏱️ 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 перевірте надійність, безпеку й відновлення у власному середовищі.