IntentFlow: Керування агентами LLM за допомогою скомпільованої політики та перевірюваних слідів
Погляд на IntentFlow — експериментальну мову, яка забезпечує дотримання політики агента поза межами моделі та створює ланцюгові сліди у форматі хешів, які аудитор може незалежно перевірити.
Джерела: IntentFlow: Governed LLM Agents With Auditable, Hash-Chained Traces
Уявіть собі агента LLM, підключеного до читання проблеми у GitHub, пошуку в репозиторії, складання відповіді, а оскільки хтось поспішав, він опублікував цю відповідь та закрив проблему. Обмежувальні правила були включені до запиту: ніколи не закривати проблему, завжди наводити докази, у разі сумнівів звертатися до людини. Проте модель все одно закрила проблему.
Це не було зломислом. Обмежувальні правила, написані у прозі, є лише рекомендаціями, і модель, під впливом вміло сформульованого тексту проблеми, іноді сприймає ці рекомендації як необов’язкові. Коли спеціаліст з безпеки просить доказів того, що агент ніколи не виконував заборонених дій, існують лише журнали дій, створені тим самим кодом у форматі, вигаданому хтось іншим. Це не є доказом — це просто щоденник.
IntentFlow — це експериментальна мова, створена для подолання цієї прогалини.
Де зазвичай знаходиться управління
Більшість механізмів управління агентами знаходиться в одному з трьох місць, і кожен з них має слабкі місця:
- У запиті. Це проза, яку модель може проігнорувати, і єдиний спосіб перевірки — це прочитати кінцевий результат та сподіватися.
- У коді додатку. Це справжнє забезпечення дотримання правил, але політика тепер переплетена з кодом Python, який викликає модель, і на запитання „що саме дозволено агенту робити?“ відповідають шляхом аналізу кодової бази.
- У низці функцій-відповідей фреймворку. Функції поєднуються між собою, тоді як політика залишається в голові когось та фіксується у спеціальних записах.
Бракує єдиного об’єкта, який можна переглянути та який описував би межі прийнятної поведінки: доказів, які має мати агент, дій, які він може виконувати, тих, яких він ніколи не повинен виконувати, факторів, які змушують людину втрутитися, та способів перевірки його результату. Цей об’єкт має забезпечуватися поза межами моделі та залишати після себе докази, які будь-хто може незалежно перевірити пізніше.
Ідея у абзаці
IntentFlow — це невелика декларативна мова. Файл .iflow визначає мету, вимоги до доказів, політику дій, правила перевірки, способи роботи з невизначеністю та формат вихідних даних. Компілятор перетворює цей файл на план виконання у форматі JSON, який потім виконується движком, що складається з 13 етапів; кожен виклик інструменту передається через ActionGate, включаючи зчитування доказів з диска. Цей брандмауер консультується з компільованою політикою та ніколи не читає результатів роботи моделі, тому модель не може обійти його. Кожен запуск залишає слід у вигляді ланцюга хешів, який може бути підписаний за бажанням. Потім інструмент intentflow audit перебудовує правила з вихідного файлу та показує, що запуск відбувався в межах цих правил. Для цього потрібні лише цей файл та слід — немає потреби довіряти движку, серверній частині чи самій моделі.
Девіз проекту все пояснює: програми на Python забезпечують детерміновані обчислення, а програми IntentFlow — кероване мислення.
Як виглядає програма
Флагманським прикладом є завдання з сортування проблем, показане тут у його основі керування. Воно починається з назви та мети:
goal TriageGitHubIssue {
objective:
triage a GitHub issue safely and propose a maintainer-ready response
Решта розділів присвятовані доказам, дозволеним діям, перевірці, обробці невизначеностей та формату результату:
evidence:
require issue_body
require comments
require repo_context
optional related_issues
distrust unsupported_claims actions:
allow read_issue
allow search_repo
allow draft_comment
require_approval post_comment
deny close_issue verify:
require cites_evidence
require maintainer_safe_tone
require no_unverified_claims
check confidence >= 0.65 uncertainty:
if confidence < 0.65 ask_human
if missing_evidence ask_human
if security_risk block_action output:
summary: string
likely_cause: string?
confidence: number
suggested_response: markdown
proposed_labels: list[string]
}
Прочитайте його зверху вниз, і ви дізнаєтесь, що може зробити агент. deny close_issue — це не порада. Цей код вбудований у механізм контролю. За допомогою require_approval post_comment зовнішні дії за замовчуванням блокуються, доки хтось або інший процес не надасть схвалення. А check confidence >= 0.65 — це суворий числовий тест. Блок output: є типовим контрактом, за яким перевіряється результат.
Як це працює
Процес є коротким, і кожен етап обмежує можливості наступного:
.iflow source -> parser -> analyzer (IFLOW diagnostics) -> compiler ->
execution plan (JSON) -> runtime (13-phase machine) -> traced result ->
replay / audit
Кілька дизайнерських рішень роблять аудит змістовним, а не декоративним:
- Блокувальний механізм розташований поза моделлю. Заборонені або незаписані дії викликають помилки, а дії, які потребують схвалення, залишаються незавершеними без надання дозволу. Оскільки цей механізм ніколи не читає результатів роботи моделі, ін’єкція команд не має можливості вплинути на її роботу.
- Спочатку відбувається калібрування. Бекенд повідомляє первинний показник впевненості, рантайм коригує його відповідно до політики калібрування плану, а потім правила оцінки невизначеності аналізують скориговане значення. Історія виконання зберігає обидва числа.
- Перевірка є формалізованою, а не припущенням. Правила, які можна перевірити за допомогою машини, такі як
cites_evidence,requires_phraseта перевірки порогових значень, працюють з реальним станом. Правила, які потребують оцінки від LLM, знаходяться у окремому рівні довіри, і коли суддя недоступний, вони записуються як пропущені та ніколи не проходять без сліду. - Історія операцій є лише додатковою та повною. Кожен етап, рішення контрольного пристрою, підвищення рівня та перевірка записуються у журнал із ланцюгом хешів, де кожна подія зберігає хеш попереднього хешу разом із канонічною подією. Підписування історії операцій забезпечує захист кореневого елемента за допомогою HMAC, щоб власник ключа міг виявити спроби фальсифікації.
Кожен запуск завершується одним із шести можливих статусів, а код завершення процесу відображає його. Важливою гарантією є те, що невдала перевірка призводить до завершення запуску зі статусом failed_verification. Система не може відзначити його як completed, і одна з перевірок аудитора спеціально призначена для виявлення будь-яких спроб це приховати.
Спробуйте протягом п’яти хвилин
Ядро не має залежностей від середовища виконання, і кожна з наведених нижче команд працює офлайн та детерміновано без API-ключа. Вона підтримує Python 3.10 або новіші версії.
git clone https://github.com/dgenio/intentflow
cd intentflow
pip install -e .
Перевірте флагманський приклад, попросіть пояснення та запустіть його:
intentflow validate examples/opensource_triage.iflow
intentflow explain examples/opensource_triage.iflow
intentflow run examples/opensource_triage.iflow \
--backend simulate --trace-dir traces
Під час виконання виводиться такий огляд, який є прикладом реального виконання у версії 0.6.0:
--- run summary ---
goal: TriageGitHubIssue
status: completed
backend: simulate
confidence: 0.676
verification: passed
uncertainty: clear
trace id: b9f44900...
trace written to traces/TriageGitHubIssue-...json
Тепер перевірте, чи воно працює належним чином. Команда audit перекомпілює вихідний код та підтвердить, що слідування залишилося в межах програми:
intentflow audit examples/opensource_triage.iflow traces/TriageGitHubIssue-*.json
Чистий результат виглядає ось так:
{
"goal": "TriageGitHubIssue",
"conformant": true,
"violations": []
}
AUDIT: CONFORMANT — the trace stayed inside the program's envelope
Щоб побачити, як фактично активуються обмеження, спробуйте приклад, який навмисно є ризикованим. Він дозволяє виконати дію розгортання без жодного кроку схвалення. Аналізатор видає помилку IFLOW010, скомпільований профіль ризику виявляється високим, і під час виконання правила if security_risk block_action воно починає діяти:
intentflow run examples/high_risk_deploy.iflow --backend simulate
# -> status: blocked
Заблокована дія write_database ніколи не зможе бути виконана, незалежно від того, що стверджує модель.
Ті самі функції доступні з Python. Почніть з імпорту:
import intentflow
Потім завантажте програму, запустіть її та зареєструйте функцію Python як керовану дію:
program = intentflow.load("examples/opensource_triage.iflow")
result = program.run(backend="simulate")
assert result["status"] == "completed"# register a Python function as a governed action (runs through the gate):
program.register_tool("lookup_user", serves=("user_record",),
handler=lambda src: "enterprise plan")report = intentflow.audit_document(program.compile(), result)
assert report["conformant"]
Реєстрація інструменту не обходить систему керування. Ваша функція все одно виконується через механізм контролю дій.
Чому рівень довіри знижується з 0.72 до 0.676
Це не дефект, адже це відображає всю сутність проектування. У прикладі діагностики в промислових умовах використовується поріг у 0.7. У симуляторі первинний рівень довіри становить 0.72, що достатньо для проходження перевірки, але калібрування знижує його до 0.676, що нижче цього порогу, тому виконання навмисно завершується статусом needs_human. Діагноз, щодо якого агент не впевнений, не повинен завершуватися без нагляду. Симулятор існує для того, щоб можна було тестувати всю цю структуру керування — контроль, калібрування, перевірку, ескалацію та відстеження — від початку до кінця без мережевих проблем чи нестабільної роботи.
Чесні обмеження
IntentFlow знаходиться у версії 0.6.0 та класифікується як пре-альфа, у нього поки що немає CI-пайплайну. Він працює, а у репозиторії є приблизно 233 тести, які не потребують ні мережі, ні API-ключів, проте існують суттєві недоліки:
- Граматика орієнтована на рядки та не має складних умов, тому не існує конструкції
if a and b. - Калібрування здійснюється за допомогою фіксованої карти скорочення, а не навченого моделювання, хоча планується використання навченої карти.
- Результати у формі об’єктів мають тип лише на зовнішньому рівні, без жодних обмежень щодо їхнього вмісту.
- Примітиви невизначеності, окрім
ask_humanтаblock_action, фіксуються, але не виконуються. - Інструменти з побічними ефектами покриваються правилами політики, але насправді ніколи не запускаються. Існують правила контролю за ними, а справжні зовнішні записи ще мають з’явитися.
- Пайплайни є лінійними, проте у планах є використання DAG-структур.
Симулятор імітує крок міркування та прямо про це зазначає. Існують бекенди для OpenAI та Anthropic, які проходять через однаковий механізм керування, а режим повторного відтворення дозволяє здійснювати детерміністичні запуски без використання ключів. Проте орієнтиром для відповідності залишається саме детерміністичний симулятор.
Для сучасного механізму керування агентами у продакшені це ще не те. Для чіткого розуміння того, як має виглядати аудитована робота агента, та для експериментів з нею цей проект є надзвичайно конкретним для свого віку.
Що варто запам’ятати
- Тримайте правила поза межами моделі. Простий текст є лише запитом, тоді як скомпільований код
deny, підтримуваний механізмом, який ігнорує результати моделі, є жорстким правилом. - Самостійно написані журнали не доводять багато чого, але записи, які може перевірити незалежна сторона, — так. Аудитор знову виводить правила з вихідного коду та потребує лише самого коду та цих записів.
Правильне тестування такої ідеї означає поставлення для неї реальної мети. Напишіть файл .iflow для агента, яким ви фактично керуєте, перевірте, чи команда explain описує те, що ви мали на увазі, потім запустіть його в режимі симуляції та перевірте результати.