AI-systemen Onderzoeksartikel

Agent-audittrail: reconstrueer de handeling, goedkeuring en uitkomst

Is de agent de enige getuige, dan heb je geen audittrail. Dan heb je een verklaring.

Drie afgestempelde papieren strookjes aan elkaar geklemd op een stalen archieftafel onder één werklamp, met ernaast een kartonnen pakket met een bijpassend gescheurd etiket
De handeling, de goedkeuring, de uitkomst. Aan elkaar geklemd, of het is niet gebeurd.

Direct antwoord

Een agent-audittrail is de verzameling vastleggingen waarmee iemand die er niet bij was één handeling van een AI-agent kan reconstrueren: wat de agent deed, met welke invoer en instructies, wie of wat het goedkeurde, en wat er werkelijk gebeurde in het systeem dat hij raakte. De software rond de agent schrijft die vastleggingen, niet de agent zelf. Ze delen één ID en staan op een plek die de agent niet kan wijzigen. Een chattranscript volstaat niet: dat laat zien wat het model zei, niet wat de tools deden.

Een agent-audittrail is de verzameling vastleggingen waarmee iemand die er niet bij was één handeling van een AI-agent kan reconstrueren: wat de agent deed, wie of wat het goedkeurde, en wat er werkelijk gebeurde in het systeem dat hij raakte. De software rond de agent schrijft die vastleggingen, niet de agent zelf. Ze delen één ID. En ze staan op een plek die de agent niet kan wijzigen.

De toets is eenvoudig. Over zes weken betwist een klant iets wat de agent gedaan heeft. Kan een collega dan antwoord geven met alleen de vastleggingen, zonder het de agent te vragen en zonder het jou te vragen? Zo niet, dan heb je een herinnering, geen trail.

Met een AI-agent bedoel ik hier software die een doel krijgt en in meerdere stappen tools gebruikt, zoals e-mail, een database of een betaalsysteem. Een audittrail is een reeks vastleggingen in tijdsvolgorde die laat zien wat er gebeurde, wie het deed en met wiens toestemming.

Waarom is een chattranscript geen audittrail?

Het transcript is het gesprek dat je in het chatvenster ziet. Het voelt als een vastlegging. Maar het legt het verkeerde vast.

Het laat zien wat het model zei, niet wat de tools deden. Een agent kan “ik heb de bestelling terugbetaald” schrijven, of de terugbetaling nu gelukt is of niet. De woorden en de handeling zijn twee losse gebeurtenissen.

Achteraf navragen lost dat niet op. Een whitepaper van OpenAI uit 2023 over toezicht op agents zegt het zonder omhaal: “It is unfortunately not possible to simply ‘ask’ the agent to retroactively justify its behavior, as this is likely to produce confabulated reasoning.” Vraag je de agent achteraf om uitleg, dan krijg je waarschijnlijk een geloofwaardig verhaal dat hij ter plekke verzint. Dezelfde whitepaper raadt aan om gebruikers een overzicht te geven van de handelingen die de agent heeft uitgevoerd.

Het mist de goedkeuring. Wie klikte op akkoord, wanneer, en wat stond er precies op dat scherm? Dat weet de chat zelden.

Het mist de uitkomst. Het eigen verslag van de betaalprovider over de terugbetaling, met een eigen ID en status, staat in het betaalsysteem, niet in de chat.

Het raakt makkelijk kwijt. Chats kunnen worden bewerkt, ingekort of gewist als de bewaartermijn van de leverancier afloopt. En ze hebben geen gedeeld ID waarmee je ze aan de andere systemen kunt koppelen.

Wat moet je minimaal vastleggen?

Drie delen, verbonden door één correlatie-ID: één kenmerk dat op elke vastlegging van dezelfde handeling staat. Hieronder het minimum, met een hypothetische terugbetaling als voorbeeld.

DeelVeldWelke vraag het beantwoordtVoorbeeld (hypothetisch)
HandelingCorrelatie-IDWelke vastleggingen bij elkaar horenact-0917-0142
HandelingTijdstip (UTC)Wanneer de tool werd aangeroepen17 sep., 14:03:22
HandelingAgent en versiesWelke agent, welk model, welk instructiebestand, welke toolversierefund-agent, instructies op commit 4f2a
HandelingAanleiding en invoerWat de handeling startte en wat de agent lasTicket 4471; orderopzoeking gaf 88213 terug
HandelingToolaanroep zoals verstuurdDe precieze tool en argumenten, of een veilige samenvatting als er geheimen in staanrefund(order 88213, € 64,90)
GoedkeuringToegepaste regelWelke regel het toestond, of een mens verplicht steldeTerugbetalingen boven € 50 vragen goedkeuring
GoedkeuringGoedkeurder en tijdstipDe benoemde persoon en het momentTeamleider support, 14:05:10
GoedkeuringWat de goedkeurder zagDe precieze versie van de aanvraag op het schermOrder 88213, € 64,90, naam klant
UitkomstResultaat in het doelsysteemHet eigen ID en de status van het andere systeemTerugbetaling re_71x bij de provider, geslaagd
UitkomstControle van het effectWat er veranderde, gecontroleerd in het systeem zelfOrder 88213 staat op terugbetaald
UitkomstVervolgHerhaalpogingen, terugboekingen, klachten, gekoppeld via hetzelfde IDMail van de klant, 29 okt.

Elf velden. Je hebt er geen platform voor nodig. Voor een klein team is een tabel met deze kolommen, automatisch gevuld, al een werkende trail.

Het HITL-artikel op deze site noemt de log als een van de vier objecten die een menselijke controle nodig heeft. Deze tabel laat zien wat die log moet bevatten om een geschil te doorstaan.

Wie schrijft de vastlegging? STACK

STACK is een kaart van vijf lagen voor coderepositories waarin mensen en AI-agents samen het werk doen. Het komt uit De agentische codebase, dat nu verkrijgbaar is. De laagnamen blijven Engels:

  1. Structure. De indeling, de ingangen en de grenzen waarin een agent in zijn eerste minuut in de repository de weg vindt.
  2. Toolchain. De shells, commando’s en afspraken over de commandoregel die een agent mag gebruiken, opgeschreven in plaats van onthouden.
  3. Agent configuration. De vaste instructies (AGENTS.md, CLAUDE.md, regels, skills, rolbeschrijvingen), onder versiebeheer zoals code.
  4. Connection. De toolservers, toolcontracten, hooks en vangrails waarmee de agent de buitenwereld raakt, met niet meer toegang dan de taak vraagt.
  5. Knowledge and quality. Geheugen, contextgrenzen, tests van het werk van de agent (evals) en geautomatiseerde controles (CI), zodat een modelupgrade de lat niet stilletjes verlaagt.

Je hebt het boek niet nodig om dit te gebruiken. De audittrail zit in de laatste twee lagen.

Connection: schrijf de vastlegging waar de aanroep langskomt. Elke toolaanroep passeert een punt dat jij beheert: een toolserver, een gateway of een hook (een klein programma dat automatisch vlak voor of vlak na een toolaanroep draait). Het boek benadrukt dat hooks gelden, wat het model ook besluit. Daarom zijn ze de juiste plek om de handeling en de goedkeuring vast te leggen, met hetzelfde ID. Het boek rekent “geen geheimen in een log” ook tot de regels die een hook moet afdwingen, dus haal sleutels en wachtwoorden eruit voordat er iets wordt opgeslagen. Het antwoord van de betaalprovider moet door de tool worden vastgelegd, niet door het model worden samengevat. Lopen je tools via MCP (Model Context Protocol, een standaardmanier waarop AI-apps tools bereiken), dan is de MCP-server daar een logische plek voor.

Knowledge and quality: leg de versies vast en lees de trace. Een vastlegging die zegt “de terugbetalingsagent deed het” is niets waard als de instructies van die agent in die week twee keer veranderden. Bewaar bij elke handeling de modelnaam, de commit van de instructiebestanden en de versie van het toolcontract.

Het boek raadt ook aan runs te tracen met OpenTelemetry, een open standaard die vastlegt wat software doet als een boom van getimede stappen, spans genoemd. De GenAI-conventies daarvan beschrijven een execute_tool-span met de naam van de tool en een aanroep-ID. Argumenten en resultaten zijn optioneel en gemarkeerd als mogelijk gevoelig, en de hele set heeft nog de status Development. Leg dus vast welke versie je gebruikt. Bij de raadpleging voor deze pagina kende het attributenregister geen veld voor een menselijke goedkeuring. Dat voeg je zelf toe.

Een uitgewerkt voorbeeld: “Jullie hebben de verkeerde order terugbetaald”

Stel je een hypothetische webwinkel voor. De terugbetalingsagent leest supporttickets, zoekt de order op en roept de betaaltool aan. Terugbetalingen boven € 50 vragen goedkeuring van de teamleider support.

Zes weken later mailt een klant: ze heeft order 88231 teruggestuurd, maar de terugbetaling ging naar 88213, een order die ze heeft gehouden.

Met alleen een transcript vind je het bericht van de agent, “ik heb je bestelling terugbetaald”, en verder niets. De teamleider herinnert zich dat ze “zoiets” heeft goedgekeurd.

Met de trail zoekt een collega die er niet bij was op ordernummer en is na een minuut of tien klaar:

  1. Handeling. Om 14:03 riep de agent de terugbetaaltool aan voor order 88213. De invoer laat zien dat in het ticket 88231 stond en dat de opzoektool 88213 teruggaf: een bijna-treffer, met twee cijfers omgewisseld, die toch als treffer gold.
  2. Goedkeuring. De teamleider keurde om 14:05 goed. De vastlegging van haar scherm toont het ordernummer uit de aanroep, het bedrag en de naam van de klant. Het nummer dat de klant zelf typte, stond er niet op.
  3. Uitkomst. De vastlegging van de betaalprovider bevestigt terugbetaling re_71x op 88213. Order 88231 is nooit terugbetaald.

Er volgen twee verbeteringen, en geen van beide is “wees voortaan voorzichtiger”. Het goedkeuringsscherm moet het ordernummer van de klant tonen naast het nummer in de aanroep. En de opzoektool moet bijna-treffers op ordernummers weigeren. Beide zijn wijzigingen in de Connection-laag, en de trail wees er rechtstreeks naar.

Wat zegt de wet?

Dit is geen juridisch advies. Voor systemen die de Europese AI-verordening als hoog risico aanmerkt, bepaalt artikel 12, lid 1, dat zulke systemen het technisch mogelijk moeten maken om gebeurtenissen gedurende hun hele levensduur automatisch vast te leggen in logs. Artikel 26, lid 6, vraagt gebruiksverantwoordelijken (de organisaties die zo’n systeem inzetten) om de logs waarover zij beschikken minstens zes maanden te bewaren, tenzij andere wetgeving iets anders bepaalt.

Veel interne agents vallen onder de verordening niet in de categorie hoog risico. De geschillen, terugbetalingen en klachten komen toch.

Probeer dit vandaag: de reconstructieoefening (20 minuten)

Kies willekeurig één handeling van één agent uit de afgelopen maand, dus niet een die je je herinnert. Geef een collega die er niet bij was, leestoegang tot de vastleggingen, maar geen gelegenheid om de betrokkenen te raadplegen. Laat die collega binnen 20 minuten zeven vragen beantwoorden:

  1. Wat deed de agent precies: welke tool, welke argumenten?
  2. Met welke invoer en welke versie van de instructies werkte hij?
  3. Welke regel stond de handeling toe, of wie keurde haar goed?
  4. Wat zag de goedkeurder?
  5. Wat meldde het doelsysteem terug?
  6. Wat veranderde er daardoor, en is dat nog steeds zo?
  7. Volgde er nog iets: een herhaalpoging, een terugboeking, een klacht?

Elk “dat zou ik moeten navragen” is een ontbrekend veld. Elk antwoord dat uit de eigen woorden van de agent komt, is een bewering, geen vastlegging. Dicht het eerste gat voordat de volgende handeling draait.

Een audittrail vertelt je wat er gebeurde. Hij legt niets stil, en hij beslist niet of de agent die handeling eigenlijk wel had mogen uitvoeren. Dat zijn aparte toetsen, en elk vraagt een eigen bewijs. Voor beweringen in plaats van handelingen heet hetzelfde idee een bewijsregister.

Citeer deze pagina:Agent-audittrail: reconstrueer de handeling, goedkeuring en uitkomst.Len P. van der Hof. https://lenvanderhof.com/nl/blog/agent-audittrail/ ·

Begrippen

Bronnen

  1. Practices for Governing Agentic AI Systems (Shavit et al.) · OpenAI
  2. Semantic conventions for generative client AI spans · OpenTelemetry
  3. Gen AI attribute registry · OpenTelemetry
  4. Verordening (EU) 2024/1689 (AI-verordening), geconsolideerde tekst · EUR-Lex, Publicatiebureau van de Europese Unie
  5. STACK (framework)
  6. De agentische codebase
  7. HITL in AI-workflows: zet de benoemde persoon op de onomkeerbare stap

Verder lezen

Markdown voor LLMs