Alle har en demo. Nesten ingen har en utrulling.

Avstanden mellom en agentisk AI som imponerer i et skjermopptak og en som overlever produksjonstrafikk handler ikke om prompt engineering. Det handler om arkitektur. Demoer tolererer hallusinasjoner fordi et menneske ser på. Produksjon har ikke den luksusen. Produksjon har retries, edge cases, fiendtlige inputs og en vakttelefon klokken tre om natten.

Vi har bygget AI-drevne systemer siden maskinlæring betydde mer enn markedsføring. Vi har levert agentiske arbeidsflyter -- verktøybrukende, flerstegs, beslutningstagende systemer -- til produksjonsmiljøer der feil har konsekvenser. Ikke «outputen var rar»-konsekvenser. Finansielle konsekvenser. Compliancekonsekvenser.

Denne artikkelen handler om hva vi lærte. Det er ikke en veiledning for å bygge en chatbot. Det er en arkitekturguide for å bygge agentiske systemer som oppnår tillit gjennom struktur, ikke håp.


I. Hva «agentisk» faktisk betyr i produksjon

Ordet «agentisk» er strukket til å dekke alt fra en ChatGPT-wrapper til en fullstendig autonom kode-deploy-pipeline. Det er ikke nyttig. Her er en nyttig definisjon:

Et agentisk system er et system der en språkmodell tar beslutninger som påvirker tilstand utenfor samtalen. Det leser data, resonnerer over alternativer, velger handlinger, utfører verktøy, observerer resultater og bestemmer hva det skal gjøre videre -- i en løkke.

Nøkkelformuleringen er «påvirker tilstand utenfor samtalen». En chatbot som foreslår SQL-spørringer er assisterende. Et system som skriver og utfører de spørringene mot en produksjonsdatabase er agentisk. Forskjellen er ikke sofistikering. Det er skaderadius.

Assisterende AI                 Agentisk AI
  +------------------+            +------------------+
  | Bruker spør      |            | Bruker spør      |
  | Modell foreslår  |            | Modell planlegger |
  | Menneske utfører |            | Modell utfører   |
  | Menneske verifis.|            | Modell verifis.  |
  +------------------+            | Modell itererer  |
                                  | Menneske godkj.  |
                                  +------------------+

Når du aksepterer det skillet, endres arkitekturkravene fullstendig. Du trenger guardrails. Du trenger eval-looper. Du trenger en protokoll for verktøytilgang. Du trenger human-in-the-loop-mønstre som ikke er ettertanker.


II. Eval-loopen: din eneste sannhetskilde

I tradisjonell programvare skriver du tester. I agentiske systemer skriver du evals.

Forskjellen er subtil, men bærende. En test hevder at en funksjon returnerer en spesifikk verdi for et spesifikt input. En eval hevder at et probabilistisk system produserer akseptable outputs over en distribusjon av inputs. Tester er binære. Evals er statistiske.

Hva du bør evaluere

Hver modellsti i systemet ditt trenger eval-dekning. Ikke «modellen» -- hver sti. Hvis modellen kan ta tre forskjellige handlingssekvenser for å utføre en oppgave, trenger hver sekvens dekning.

  • Oppgavefullføringsrate: Utfører agenten faktisk det som ble forespurt?
  • Verktøyvalgspresisjon: Velger den riktige verktøy for jobben?
  • Begrensningsetterlevelse: Holder den seg innenfor definerte grenser?
  • Kontrollert degradering: Når den feiler, feiler den trygt?
  • Kostnad per fullført oppgave: Hva koster en korrekt fullføring egentlig?

Eval-rammeverket

Bygg det som CI. Kjør det ved hver modellendring, hver prompt-endring, hver verktøyskjemaendring. Rammeverket bør:

  1. Vedlikeholde et kuratert datasett med representative oppgaver (ikke bare enkle).
  2. Utføre hver oppgave mot agenten i et sandkassemiljø.
  3. Score outputs mot vurderingskriterier -- både automatiserte (skjemavalidering, begrensningssjekker) og LLM-as-judge for kvalitet.
  4. Spore metrikker over tid. Regresjoner er fienden.
  5. Blokkere deploy når kvaliteten faller under terskelverdier.
# Forenklet eval-loop-struktur
for task in eval_dataset:
    result = agent.execute(task.input, sandbox=True)
    scores = {
        "completed": judge_completion(result, task.expected),
        "safe": judge_safety(result, task.constraints),
        "cost": result.total_tokens * cost_per_token,
        "latency": result.wall_time_ms,
    }
    eval_log.append({"task": task.id, **scores})

report = aggregate(eval_log) assert report["completion_rate"] >= 0.95 assert report["safety_rate"] >= 0.99 assert report["p95_cost"] <= budget_per_task

Dette er ikke valgfritt. Hvis du ikke evaluerer agenten din, vet du ikke hva agenten din gjør. Du har en demo, ikke et system.

LLM-as-judge: bruk det, men kalibrer det

Å bruke en modell til å evaluere en annen er kraftfullt, men sirkulært hvis det gjøres uforsiktig. Kalibrer evaluatoren din mot menneskelige vurderinger. Mål samsvar. Spor evaluatordrift. Og bruk aldri samme modellinstans som både aktør og evaluator i samme eval -- det er å rette sin egen eksamen.


III. Guardrails: strukturelle, ikke aspirerende

En guardrail er ikke en systemprompt som sier «vennligst ikke gjør noe farlig». En guardrail er en strukturell begrensning som gjør farlige handlinger umulige eller reverserbare.

Input-guardrails

Før modellen ser en forespørsel:

  • Skjemavalidering: Hvert input følger et definert skjema. Avvis feilformede forespørsler før de når modellen.
  • Intensjonsklassifisering: En lettvektsklassifiserer (eller til og med regex) flagger forespørsler som er utenfor scope. Agenten bør avslå på en kontrollert måte, ikke forsøke heltemot.
  • PII-deteksjon: Hvis oppgavedomenet ikke krever personopplysninger, fjern dem før modellen ser dem.

Output-guardrails

Etter at modellen har produsert en handlingsplan, før utførelse:

  • Handlings-allowlisting: Agenten kan bare kalle verktøy som er eksplisitt registrert. Ingen dynamisk verktøyoppdagelse i produksjon.
  • Parametervalidering: Hvert verktøykall valideres mot verktøyets skjema. En modell som hallusinerer et parameternavn får en strukturert feilmelding, ikke et runtime-krasj.
  • Rate limiting: Begrens antall verktøykall per oppgave. En agent i en retry-loop er en agent som brenner penger.
  • Human-in-the-loop-porter: For høyrisiko-handlinger (sletting av data, pengeoverføring, publisering av innhold), krev eksplisitt menneskelig godkjenning før utførelse.

Kill switch

Hver produksjonsagent trenger en. En mekanisme for å stoppe utførelse midt i en oppgave, bevare tilstand og overføre kontroll til et menneske. Dette er ikke en feilmodus. Det er et designkrav. Kill switchen skal være tilgjengelig via API, dashboard og vaktverktøy.


IV. MCP: protokollaget for verktøyintegrasjon

Model Context Protocol (MCP) er hvordan vi kobler agentiske systemer til verktøyene de trenger. Det er ikke den eneste tilnærmingen, men det er den vi bruker i produksjon, og med god grunn.

Hvorfor MCP fremfor ad-hoc function calling

Før MCP betydde verktøyintegrasjon å håndkoble JSON-skjemaer for hvert verktøy, administrere autentisering per integrasjon og håpe at modellens function-calling-format matchet backendforventningene dine. Hvert nytt verktøy var en tilpasset integrasjon.

MCP standardiserer dette. Protokollen definerer:

  • Verktøyoppdagelse: Agenten spør en server om tilgjengelige verktøy og deres skjemaer.
  • Invokering: Strukturerte forespørsler med typede parametere og strukturerte svar.
  • Ressurstilgang: Lesetilgang til datakilder (filer, databaser, API-er) gjennom et uniformt grensesnitt.
  • Sikkerhetsgrenser: Serveren kontrollerer hva agenten kan aksessere. Agenten får ikke rå-credentials.
Agent                MCP-server              Verktøy
  +-------+           +-----------+           +--------+
  | Plan- |--tools/-->| Valider   |--invoke-->| DB     |
  | legg  |  list     | Autoriser |           | API    |
  | kall  |<--result--| Auditer   |<--result--| Filer  |
  +-------+           +-----------+           +--------+

MCP som sikkerhetsgrense

Dette er den undervurderte fordelen. MCP-serveren er et sjekkpunkt. Hver verktøyinvokering passerer gjennom den. Det betyr at du kan:

  • Auditere hver handling agenten utfører, med full request/response-logging.
  • Rate-limite verktøykall per agent, per bruker, per oppgave.
  • Scope verktøytilgang per oppgavetype. En oppsummeringsagent trenger ikke skrivetilgang til databasen.
  • Rotere credentials uten å røre agenten. MCP-serveren holder hemmeligheter; agenten holder ingenting.

I våre produksjonssystemer er MCP-serveren den viktigste sikkerhetskomponenten. Ikke modellen. Ikke prompten. Serveren som står mellom modellens intensjoner og verdens tilstand.

MCP-konfigurasjonsmønsteret

Et typisk produksjons-MCP-oppsett:

{
  "mcpServers": {
    "database": {
      "command": "mcp-server-postgres",
      "args": ["--read-only", "--connection", "$DB_URL"],
      "env": { "DB_URL": "postgres://..." }
    },
    "filesystem": {
      "command": "mcp-server-filesystem",
      "args": ["--allowed-dirs", "/data/reports"]
    },
    "api": {
      "command": "mcp-server-http",
      "args": ["--base-url", "https://api.internal"],
      "env": { "API_KEY": "..." }
    }
  }
}

Hver server er scopet. Hver server er auditerbar. Agenten ser verktøy, ikke infrastruktur.


V. Human-in-the-loop: ikke en ettertanke

Uttrykket «human-in-the-loop» brukes ofte som en talisman -- som om det å nevne det gjør et system trygt. Det gjør det ikke. Menneskelig tilsyn er et ingeniørproblem, ikke en avkrysningsboks.

Tre mønstre som fungerer

Port-godkjenning. Høyrisiko-handlinger krever eksplisitt menneskelig godkjenning før utførelse. Agenten foreslår en handling, pauser og venter. Et menneske vurderer forslaget i kontekst (hva agenten så, hva den planlegger å gjøre, hvorfor) og godkjenner eller avviser. Dette fungerer for lavfrekvente handlinger med store konsekvenser: finansielle overføringer, datasletting, innholdspublisering.

Utvalgsgjennomgang. For høyfrekvente handlinger med moderate konsekvenser, gjennomgå et statistisk utvalg. Agenten utfører autonomt, men en andel av handlingene flagges for menneskelig gjennomgang i etterkant. Hvis feilraten overskrider en terskel, eskalerer systemet til port-godkjenningsmodus. Slik skalerer du tilsyn uten å flaskehalse gjennomstrømningen.

Eskaleringskaskade. Agenten forsøker en oppgave. Hvis konfidensnivået er under en terskel, eskalerer den til en mer kapabel agent eller et menneske. Hvis den andre agenten også er usikker, eskalerer den videre. Dette skaper en naturlig triagering: rutineoppgaver håndteres autonomt, grensetilfeller får menneskelig oppmerksomhet.

Oppgave ankommer
       |
  +----v-----+
  | Agent L1  |--konfidensgrad >= 0.95--> Utfør
  +----+------+
       | konfidensgrad < 0.95
  +----v-----+
  | Agent L2  |--konfidensgrad >= 0.90--> Utfør
  +----+------+
       | konfidensgrad < 0.90
  +----v-----+
  | Menneske  |--> Vurder og beslut
  +-----------+

Brukergrensesnittet betyr noe

En menneskelig anmelder som ser «Agenten vil utføre verktøy X» uten kontekst vil godkjenne eller avvise tilfeldig. Effektivt menneskelig tilsyn krever:

  • Oppgaven som utløste handlingen.
  • Agentens resonnementskjede (forkortet, ikke hele tokenstrømmen).
  • Den foreslåtte handlingen med dens parametere.
  • Forventet innvirkning («dette vil oppdatere 3 poster i kontotabellen»).
  • Godkjenn/avvis med ett klikk med mulighet for tilbakemelding som mates tilbake til eval-datasettet.

VI. Feilmoduser og hvordan overleve dem

Agentiske systemer feiler på måter tradisjonell programvare ikke gjør. Å forstå feiltaksonomien er halve kampen.

Retry-spiralen

Agenten kaller et verktøy. Verktøyet returnerer en feil. Agenten prøver på nytt. Verktøyet returnerer samme feil. Agenten prøver på nytt med litt andre parametere. Feiler fortsatt. Agenten prøver en annen tilnærming som også feiler. Tjue verktøykall senere er oppgavebudsjettet brukt opp og ingenting nyttig har skjedd.

Løsning: Sett et maksimalt verktøykall-budsjett per oppgave. Når budsjettet er brukt opp, må agenten oppsummere hva den prøvde, hva som feilet, og eskalere. Ikke la agenter iterere i det uendelige.

Det hallusinerte verktøyet

Modellen finner opp et verktøy som ikke eksisterer, eller kaller et ekte verktøy med hallusinerte parametere. Dette er spesielt vanlig når modeller er trent på verktøykallmønstre fra andre miljøer.

Løsning: Streng skjemavalidering på hvert verktøykall. Hvis verktøynavnet ikke er i registeret, returner en strukturert feil. Hvis parameterne ikke matcher skjemaet, returner en strukturert feil med korrekt skjema. Agenten kan selvkorrigere, men bare med ærlig tilbakemelding.

Det selvsikre feilsvaret

Den farligste feilen. Agenten fullfører en oppgave, rapporterer suksess, og outputen er feil. Ingen feil ble reist. Ingen guardrail ble utløst. Agenten tok ganske enkelt en feil som så korrekt ut.

Løsning: Derfor eksisterer eval-looper. Du kan ikke fange opp alle tilfeller i sanntid, men du kan måle raten statistisk og sette terskler. For høyrisiko-domener, krev output-validering -- en andre modell, en regelbasert sjekker eller en menneskelig anmelder -- før resultatet committes.

Kontekstvindu-kollapsen

Langvarige agenter akkumulerer kontekst. Til slutt fylles kontekstvinduet, og modellen begynner å miste tidligere instruksjoner, begrensninger eller tilstand. Agenten blir upålitelig uten noe åpenbart feilsignal.

Løsning: Design for begrenset kontekst. Bryt lange oppgaver ned i deloppgaver. Oppsummer mellomtilstand eksplisitt. Bruk eksternt minne (databaser, filer) i stedet for å stole på at kontekstvinduet holder alt. Kontekstvinduet er arbeidsminne, ikke langtidslagring.


VII. Produksjonssjekklisten

Før et agentisk system går i produksjon, verifiser:

Eval-dekning. Hver modellsti har eval-dekning. Fullføringsrate, sikkerhetsrate og kostnad per oppgave er målt og baselinjet.

Guardrails er strukturelle. Input-validering, output-validering, handlings-allowlisting, rate limiting. Ikke bare prompt-instruksjoner.

Verktøytilgang er scopet. Hver agent har tilgang til nøyaktig de verktøyene den trenger, med minimalt nødvendige tillatelser. MCP-servere håndhever grenser.

Menneskelig tilsyn er designet. Port-godkjenning for høyrisiko-handlinger. Utvalgsgjennomgang for rutinehandlinger. Eskaleringsveier for usikre tilfeller.

Kill switch eksisterer og er testet. Muligheten til å stoppe enhver agent midt i utførelsen, bevare tilstand og overføre til et menneske.

Monitorering er agentbevisst. Dashboards viser verktøykallrater, feilrater, eskaleringsrater, kostnad per oppgave og latensfordelinger. Varsler utløses ved anomalier.

Audit trail er komplett. Hvert verktøykall, hver modellbeslutning, hver menneskelig godkjenning er logget med tidsstempler, oppgave-ID-er og brukerkontekst. Du kan rekonstruere nøyaktig hva som skjedde for enhver oppgave.

Feilbudsjett er definert. Systemet vet hvor mange verktøykall, hvor mye latens og hvor mye kostnad en enkelt oppgave har lov til å forbruke. Overskridelse av budsjettet utløser kontrollert degradering, ikke uendelig retry.


VIII. Den regulatoriske virkeligheten

EU AI Act er ikke hypotetisk. Regler for forbudt bruk trådte i kraft 2. februar 2025. Forpliktelser for generell AI ble gjeldende 2. august 2025. Regler for høyrisikosystemer fases inn gjennom 2026-2027.

Hvis det agentiske systemet ditt tar beslutninger som påvirker mennesker -- ansettelse, utlån, forsikring, helse, utdanning -- opererer du sannsynligvis i høyrisiko-territorium. Loven krever:

  • Risikovurdering og -reduksjon.
  • Datastyring og dokumentasjon.
  • Teknisk dokumentasjon inkludert systemarkitektur.
  • Logging og sporbarhet.
  • Mekanismer for menneskelig tilsyn.
  • Tiltak for nøyaktighet, robusthet og cybersikkerhet.

Arkitekturen beskrevet i denne artikkelen -- eval-looper, guardrails, audit trails, human-in-the-loop, scopet verktøytilgang -- er ikke bare god ingeniørkunst. Det er det tekniske grunnlaget for regulatorisk etterlevelse. Bygger du disse strukturene nå, skriver compliancedokumentasjonen seg selv. Gjør du det ikke, vil du tilpasse under tidspress.


IX. Fra demo til utrulling

Veien fra «imponerende demo» til «produksjonssystem» er brolagt med det kjedelige arbeidet: eval-rammeverk, skjemavalidering, audit-logging, kill switches og arbeidsflyter for menneskelig gjennomgang. Ingenting av det er glamorøst. Alt er bærende.

Vi bygger agentiske systemer hver dag. Vi bruker Claude, Gemini og åpne modeller som runtime-komponenter. Vi kobler dem til produksjonsdatabaser, filsystemer og API-er gjennom MCP. Vi evaluerer hver modellsti. Vi porterer hver høyrisiko-handling. Vi logger alt.

Resultatet er ikke et system som aldri feiler. Det er et system der feil er avgrenset, observerbar og gjenopprettbar. Det er tillitsarkitektur. Ikke en modell som alltid har rett -- ingen modell har det -- men et system som vet når det tar feil og har den strukturelle disiplinen til å stoppe, rapportere og eskalere.

Agentisk AI er reelt. Evnene er genuint nye. Men ingeniørdisiplinen som kreves for å rulle dem ut trygt er genuint gammel. Det er den samme disiplinen som holder penger trygge i regnskap, som holder fly i luften med redundante systemer, som holder broer oppe med sikkerhetsmarginer.

Tillit er ikke en funksjon du legger til. Det er restproduktet av arkitektur som forutsetter feil og bygger for gjenoppretting. Modellene vil fortsette å bli bedre. Tillitsarkitekturen vil ikke bli valgfri.


Referanser

  1. Anthropic. Building Effective Agents. docs.anthropic.com
  2. Model Context Protocol. MCP Specification. spec.modelcontextprotocol.io
  3. European Parliament. EU AI Act. artificialintelligenceact.eu
  4. Anthropic. Claude Model Card. docs.anthropic.com
  5. OpenAI. Function Calling Guide. platform.openai.com
  6. Google DeepMind. Gemini Technical Report. deepmind.google
  7. Brundage, M. et al. (2020). Toward Trustworthy AI Development: Mechanisms for Supporting Verifiable Claims. arXiv:2004.07213.
  8. Shinn, N. et al. (2023). Reflexion: Language Agents with Verbal Reinforcement Learning. NeurIPS.
  9. Yao, S. et al. (2023). ReAct: Synergizing Reasoning and Acting in Language Models. ICLR.
  10. Park, J.S. et al. (2023). Generative Agents: Interactive Simulacra of Human Behavior. UIST.
  11. NIST. AI Risk Management Framework. nist.gov
  12. ISO/IEC 42001:2023. AI Management System Standard.