Галоўная / Артыкулы

IntentFlow: кіраванне LLM-агентамі праз скампіляваныя палітыкі і правяральныя трасы

Агляд IntentFlow, эксперыментальнай мовы, якая прымяняе палітыкі агентаў па-за мадэллю і піша трасы з ланцугом хэшаў, якія аўдытар можа праверыць незалежна.

Выдавец: REACTAPP.TOP8 хв чытання1780 слоў

Крыніцы: 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

Калькіляванняя кантэксту і выконанне правіл дапамагаюць зробіць аўдыт значымым, а не толькі дэкоратыўным:

  1. Контрольны механізм располагаецца за межамі модэлі. Акцыі, якія заблокаваны або не занесены, вызываюць памылкі, а акцыі, якія выконваюцца пасля затверджэння, не выконваюцца без яго. Паколькі контрольны механізм ніколі не чытае выходныя даны модэлі, інжэкцыя даных не можа яго парадураць.
  2. Спачатку выконваецца калькіляванняя кантэксту. Бэкэнд адмаўляе первісны рэйтынг доверы, сістэма выканання налаштоввае яго па правілах калькіляванняя кантэксту плану, а пасля правіла нявярнасці аналізуюць налаштаваны показнік. Хроніка зберагае оба ці фігуры.
  3. Перакананне выканаецца па правілах, а не проста прыпускаецца. Правіла, якія можна пераканаць машынай, такія як cites_evidence, requires_phrase і перакананняя крытэрыя, працуюць з рэальным станом. Правіла, якія патрабуюць адгукі LLM, знаходзяцца ў адзінам узле доверы, і калі суддзі няма, яны фіксуюцца як праўільна працаваныя і ніколі не працаваюць без адгукі.
  4. Жылёк ўтвараецца толькі па прыўнесенні новых дадзеных і ён ўжо цэлы. Кожны этап, рашэнне на выходзе з ворат, падышча рангу і перакананне заносяцца ў журнал у віглядзе ланцоўкі хэшаў, дзе кожная падзея зберагае хэш пярэйшнага хэша, спаўненага з канэнічным апісам падзеі. Падпіс жылка замыкае коранавы хэш за дапамогою 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 і класіфікуецца як прэ-альфа, пры чым паказальніяя лініі ўжо ня існуе. Ён працуе, а у рэпазітарыі ёсць апошней 233 тэсты, якім не патрэбны ні сетка, ні клучы API, але ўсё ж існуюць сутэчкі:

  • Граматыка ўсмотржана ў лініі і не мае складзеных умов, таму ня існуе if a and b.
  • Калібрацыя — гэта фіксаваныя карты скарычэння, а не навучаны модэль, хоць плануецца вікорыстоўвання навучаных карт.
  • Рэзультаты у форме об’ектаў маюць тып толькі на зовнішнім роўні, пры чым нічога не контролюецца ў ўсём іхнім содэржым.
  • Прымітывы неяснасці, кроме ask_human і block_action, фіксуюцца, але не выкананыя.
  • Інструменты з парадуктамі дзейства пакрываюцца правіламі, але ніколі насправды не запускаюцца. Існуюць правіла для іх кантролю, а адбыцце рэальных зовнішніх запісаў яшчэ не адбылася.
  • Лінійныя паказальніяя лініі, пры чым на планах — DAG-ы.

Сімулятор выманюеэт крок разумавання і працуе так. Існуюць бэкенды для OpenAI і Anthropic, якія праходзяць па той самым падчынным прынцыпам, а рэжым перацавання па дапісах дазваляе адбывацца дэтэрміністычным запускам без ключоў. Тым не менш, стандартам для адпаведнасці являецца дэтэрміністычны сімулятор.

Для сучаснага керавальніка агента ў працэсе вырабоцтва гэта яшчэ не тое. Чыракліва ўсвядомленасць таго, якія правілы дзейнуюць, і як павінна выглядаць аўдытаваемая рэалізацыя агента, а таксама можлівасць експерыментаў з імі — усё гэта робіць праект нечыста конкрэтным для свайго віку.

Што варта запамятаць

  • Зберагаюце правілы парадульна ад модэлю. Тэкст ёсць толькі запросам, тады калі скомпіляваны deny, падтрымваны клапанам, які ігнаруе выход модэлю, ёсць строгім правілам.
  • Самапісаныя логі не дазваляюць багато даказаць, але трэс, які можа пераканаць незалежная сторона, — так. Аўдытар знову выводзіць правілы з адпаведных джэрэл і ў яго ўсё, што трэба, — толькі джэрэла і трэс.
  • Корэктаваная нявяснасць должна быць спроможная зупініць прагненне. Калі значэнне 0.72 зменшаецца да 0.676 і не досягае рубежа 0.7 бар, гэта ўскладненая працэзная мадэль: агент, які не ўпевнены, перадае задачу чалавеку замест таго, каб прыкрывацца блефам.
  • Весь цыкл кантролю можна працаваць офлайн: няма залежнасцей, ёсць дэтэрміністычны двурэжымні модуль для сімуляцыі і няма ключа API.
  • Задаюцься прагненні да прыкладнага програмнага забезпечэння прэ-альфа версіі: яно працуе і добра працавало пад час тэставання, але ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўс