Naar de inhoud
NLEN
Illustratie: Agent-observability: zien wat je agent deed en waarom

Agent-observability: zien wat je agent deed en waarom

Door Ivo Donker — samengesteld met AI-ondersteuning (Claude & Gemini) · 15 augustus 2026

Wanneer een LLM dienstdoet als autonoom redeneersysteem dat zelfstandig API-aanroepen plant, context ophaalt en beslissingen neemt, faalt traditionele softwaremonitoring. Een eenvoudige HTTP-statuscode of responstijd vertelt niets over de interne logica, tussentijdse denkstappen of onverwachte paden die het model heeft bewandeld. Agent-observability maakt van deze ondoorzichtige besluitvormingsketen een volledig inspecteerbare boomstructuur.

Bij klassieke stateless API-aanroepen volstaat het om invoer, uitvoer, latency en tokentelling te loggen. Zodra een applicatie evolueert naar een agent met cyclische lussen, dynamische geheugenmutaties en wisselende tool-selecties, ontstaat er een niet-deterministisch systeem. Wie wil begrijpen waarom een agent na zeven iteraties vastloopt of een verkeerde database-update doorvoert, moet elk beslismoment kunnen reconstrueren. Wie het theoretische fundament achter deze verschuiving van statische prompts naar dynamische systemen wil doornemen, kan het overzichtsartikel over AI-agents lezen voor een gedegen introductie in autonome architecturen.

Het fundamentele verschil tussen LLM-logging en Agent-observability

Klassieke LLM-logging richt zich op individuele transacties: een prompt gaat naar het model, een antwoord komt terug. We meten de duur van de aanroep, registreren de gebruikte modelversie en tellen de input- en outputtokens om de factuur te controleren. Deze vorm van logging beantwoordt de vraag: wat kostte deze specifieke aanroep en hoe snel was het model klaar?

Agent-observability beantwoordt een wezenlijk andere vraag: welke redeneerstappen leidden tot deze specifieke tool-aanroep, hoe veranderde de interne status van het systeem en waar week het gedrag af van het gewenste pad? Een agent voert zelden één enkele generatie uit; hij doorloopt een keten van observaties, gedachten, acties en statusupdates. Als een tussenstap faalt, probeert een robuuste agent een alternatief pad te kiezen. Zonder diepgaande observability is het onmogelijk te achterhalen of een fout ontstond door een gebrekkige tool-beschrijving, een hallucineerde parameter, een mislukte parsing-stap of een fout in het bronsysteem.

Daarnaast vereist agent-observability inzicht in de contextdynamiek over meerdere stappen heen. Naarmate een agent meer tools aanroept, groeit de contextgeschiedenis exponentieel met payload-data, foutmeldingen en tussenresultaten. Observability moet inzichtelijk maken hoe deze accumulatie van tokens de redeneerkwaliteit beïnvloedt en op welk punt verouderde gegevens de agent op een dwaalspoor zetten.

De drie pijlers: Traces, Spans en Graph State

Om complexe agentic workflows meetbaar te maken, leunt moderne observability op concepten uit distributed tracing, aangevuld met AI-specifieke metadata. De structuur rust op drie samenhangende lagen:

Door deze lagen consistent te koppelen met unieke identifiers (zoals een trace_id, parent_span_id en session_id), kan een developer een chaotische uitvoeringsgeschiedenis visualiseren als een overzichtelijke boomstructuur of een gerichte graaf. Wanneer agents worden ontworpen als deterministische statusovergangen, helpt het om te begrijpen hoe controlemechanismen verschuiven; bekijk daarom de handleiding over graph-engineering om te zien hoe gestructureerde controlelussen de traceerbaarheid vereenvoudigen.

Tool-interacties en argumentinspectie registreren

De meest kwetsbare schakel in een agent-workflow is de interactie met externe tools. Het model genereert op basis van een functiebeschrijving een gestructureerd JSON-object dat vervolgens door de runtime-applicatie wordt uitgevoerd. Fouten manifesteren zich hier op verschillende manieren: syntactisch ongeldige JSON, ontbrekende verplichte parameters, correct geformatteerde maar logisch onmogelijke waarden (zoals een negatieve prijs), of de keuze voor een volstrekt irrelevante tool.

Observability vereist daarom dat zowel het gegenereerde JSON-payload als de ruwe uitvoer van de tool tot op bytelniveau worden vastgelegd. Als een database-zoekopdracht nul resultaten oplevert, moet in de span zichtbaar zijn of dit kwam door een foutieve SQL-where-clause van de agent of door het daadwerkelijk ontbreken van gegevens in de tabel.

Wanneer de agent structureel de verkeerde functie selecteert, ligt de oorzaak vaak in dubbelzinnige schema's; raadpleeg het artikel over effectieve tool-descriptions om te ontdekken hoe nauwkeurige parameterdocumentatie foutieve aanroepen voorkomt.

Implementatiemodel: Een OpenTelemetry-compatibel trace-schema

Om vendor lock-in te voorkomen en gestandaardiseerde data-uitwisseling mogelijk te maken, hanteren moderne systemen OpenTelemetry-conforme structuren met LLM-specifieke semantische conventies. Onderstaand JSON-artefact toont een representatieve span waarin een agent besluit een externe retrieval-tool aan te roepen, inclusief redeneerstap (thought), parameters, responstijd en tokendistributie.

{
  "trace_id": "tr-8f4b2c9a-20260815-9941",
  "span_id": "sp-agent-decide-003",
  "parent_span_id": "sp-root-task-001",
  "name": "agent_reasoning_and_tool_call",
  "start_time_unix_nano": 1786800000000000000,
  "end_time_unix_nano": 1786800001450000000,
  "attributes": {
    "llm.vendor": "anthropic",
    "llm.model": "claude-3-7-sonnet",
    "llm.temperature": 0.2,
    "llm.usage.prompt_tokens": 1420,
    "llm.usage.completion_tokens": 185,
    "llm.usage.total_tokens": 1605,
    "agent.cycle_index": 3,
    "agent.thought": "Gebruiker vraagt orderstatus van #4921. Ik roep order_lookup aan.",
    "agent.tool_name": "order_service_lookup",
    "agent.tool_arguments": "{\"order_id\": 4921, \"include_tracking\": true}",
    "agent.tool_call_valid": true,
    "gen_ai.system": "anthropic",
    "gen_ai.request.model": "claude-3-7-sonnet"
  },
  "events": [
    {
      "name": "tool_execution_started",
      "timestamp_unix_nano": 1786800001460000000
    },
    {
      "name": "tool_execution_completed",
      "timestamp_unix_nano": 1786800001890000000,
      "attributes": {
        "tool.status": "success",
        "tool.response_length_bytes": 412
      }
    }
  ],
  "status": {
    "code": "OK"
  }
}

Door dit schema bij elke iteratie weg te schrijven naar een centrale log-sink (zoals ClickHouse, ElasticSearch of een OpenTelemetry Collector), ontstaat een temporele audittrail. Hiermee kan achteraf worden gereproduceerd waarom het model op tijdstip T dacht dat order #4921 opgezocht moest worden en welke parameters daarbij zijn meegegeven.

Veelvoorkomende faalpatronen automatisch detecteren

Observability is pas echt waardevol wanneer het systeem afwijkende patronen in realtime kan signaleren zonder dat een engineer handmatig duizenden logregels hoeft door te spitten. In autonome loops treden specifieke faalmodi op die met deterministische regels kunnen worden afgevangen:

Faalpatroon Symptoom in Traces Observability Detectieregel Primaire Oorzaak
Oneindige Loop Herhaalde tool-aanroep met identieke argumenten count(same_tool_call) > 3 binnen één trace Foutboodschap wordt niet begrepen door model
Context Bloat Prompt-tokens verdubbelen per iteratiestap prompt_tokens > 80k bij relatief simpele taak Ongelimiteerde tool-outputs in context geschiedenis
Tool Hallucinatie Aanroep van niet-bestaande functienaam tool_name NOT IN registered_tools Zwakke systeemprompt of verwarrende tool-definities
Vroegtijdige Afkap Eindstatus 'succes' zonder verplichte acties required_tool_called == false && status == OK Model denkt taak voltooid te hebben na aanname
Redeneer-Deadlock Generatie van gedachten zonder tool-output of stop completion_tokens > max_limit zonder JSON-actie Instructieconflict in de sturende systeemprompt

Wanneer een agent vastraakt in een van deze patronen, is systematische analyse van de statusovergangen noodzakelijk; lees het diepgaande artikel over agentic loops debuggen om methoden te leren waarmee cyclische fouten en oneindige herhalingen doelgericht worden doorbroken.

Evaluatie in productie: Van traces naar kwaliteitsmetingen

Het verzamelen van traces is de basis; de volgende stap is het kwantificeren van de effectiviteit van de agent over duizenden sessies. Dit vraagt om specifieke kwaliteitsindicatoren (KPI's) die afwijken van traditionele softwaremetrics:

  1. Task Success Rate (TSR): Het percentage traces waarin de agent de doelstelling van de gebruiker volledig zelfstandig heeft behaald zonder menselijke tussenkomst of runtime-crashes.
  2. Step Efficiency Ratio: Het aantal benodigde iteraties ten opzichte van het theoretisch minimale aantal stappen voor een specifieke taakklasse. Een stijgende ratio duidt op inefficiënte redeneerpaden of overbodige zoekopdrachten.
  3. Tool Error Rate: De verhouding tussen mislukte tool-aanroepen (validatiefouten, HTTP 500's, timeouts) en succesvolle executies.
  4. Cost per Resolved Task: De totale token- en rekenkosten uitgedrukt per succesvol afgeronde taak, inclusief alle tussenliggende redeneersessies.

Naast automatische metrieken kunnen verzamelde productietraces dienen als representatieve testdataset voor systematische optimalisatie. Om te verifiëren of een aangepaste prompt of instructieset de faalratio verlaagt, is het verstandig om de handleiding over A/B-testen van prompts te raadplegen om wijzigingen gecontroleerd te valideren tegen historische praktijkdata.

Voor geavanceerdere metrieken, zoals het automatisch beoordelen van tussenstappen met een onafhankelijk beoordelingsmodel, biedt het specialistische artikel over agent-evaluatie richtlijnen voor het berekenen van trajectory accuracy en sub-goal success rates.

Data Redaction en Privacy in Agent Traces

Omdat agent-observability alle invoer, interne gedachten en tool-outputs integraal vastlegt, ontstaat er een significant privacy- en securityrisico. Traces bevatten regelmatig persoonsgegevens (PII), sessietokens, wachtwoorden of vertrouwelijke bedrijfsdata die door tools zijn opgehaald.

Een robuuste observability-pipeline implementeert daarom data masking vóórdat spans naar de permanente opslag worden weggeschreven. Dit gebeurt op twee niveaus:

Het maskeren van data mag de debug-waarde van de trace niet volledig vernietigen. Door consistente deterministische pseudonimisering toe te passen, blijft het mogelijk om te controleren of de agent dezelfde entiteit in stap 1 en stap 4 heeft gebruikt, zonder dat de daadwerkelijke persoonsgegevens leesbaar zijn voor developers die de logs analyseren.

Architectuuroverwegingen: Zelf bouwen of gespecialiseerde backends

Bij het inrichten van observability staan engineeringteams voor de keuze: bouwen we een eigen logginglaag bovenop bestaande infrastructuur (zoals OpenSearch of Grafana Tempo), of integreren we een gespecialiseerd AI-observability platform (zoals Langfuse, Arize Phoenix of Helicone)?

Aspect Zelfbouw (OpenTelemetry + Generic APM) Gespecialiseerd AI Platform
Integratiecomplexiteit Hoog: custom dashboards en parsers bouwen Laag: kant-en-klare SDK's en visualisaties
Data Governance & Hosting Volledig in eigen beheer (on-premise / VPC) Afhankelijk van vendor (SaaS of self-hosted)
AI-specifieke features Beperkt (geen native LLM-as-a-judge UI) Rijk: trace-visualisatie, cost-tracking per model
Kosten op schaal Lineair met algemene opslagkosten Vaak prijs per duizend getrackte spans/tokens
Standaardisatie 100% vendor-neutraal OpenTelemetry Soms lichte afhankelijkheid van vendor SDK's

Voor organisaties met strenge compliance-eisen is een OpenTelemetry-pipeline die gegevens routeert naar een interne backend vaak verplicht. Voor snelle productontwikkeling biedt een gespecialiseerd open-source platform dat self-hosted kan draaien het beste compromis tussen functionaliteit en datasoevereiniteit.

Checklist voor Productiewaardige Agent-observability

Controleer vóór de uitrol van een autonoom agentsysteem of de monitoringomgeving voldoet aan onderstaande technische minimumeisen:

Met een gedegen observability-fundament verandert een onvoorspelbare AI-agent in een beheersbaar, auditeerbaar en continu optimaliseerbaar softwarecomponent. Developers hoeven niet langer te gissen naar de interne logica van het model, maar kunnen elke beslissing, tool-keuze en state-mutatie met wiskundige precisie verifiëren en verbeteren.