Gå til indholdet

Introduktion til beslutningsmodeller

Når man taler om kunstig intelligens i en applikation, tænker man ofte på en chatbot: Brugeren skriver et spørgsmål, og modellen skriver et svar. Men nogle gange har dit program ikke brug for en forklaring. Det har brug for at få vurderet, om en tekst handler om et bestemt emne, hvilken kategori en henvendelse tilhører, eller hvor tydelig en beskrivelse er.

Her kommer beslutningsmodeller - på engelsk decision models - ind i billedet. I denne artikel ser vi på AI-modeller, der er bygget til at give afgrænsede, strukturerede vurderinger, som din kode kan arbejde videre med. Vi bruger JEV fra TypeSafe AI som et konkret eksempel og kalder modellen fra C# via OpenRouter.

Hvad er en beslutningsmodel?

En beslutningsmodel bruges til at vurdere oplysninger ud fra et bestemt spørgsmål og nogle definerede svarmuligheder eller en skala. I stedet for at skrive en længere forklaring kan modellen eksempelvis foreslå kategorien “Transport” og give sandsynligheder for de mulige kategorier.

Det gør det lettere for programmet at bruge svaret direkte: Det kan foreslå en kategori, prioritere en henvendelse eller sende en usikker vurdering videre til et menneske. Modellen leverer vurderingen, mens din kode bestemmer handlingen.

Almindelige tekstgenererende modeller kan også bruges til klassifikation og strukturerede svar, eksempelvis i JSON. De særlige beslutningsmodeller er derimod målrettet denne type afgrænsede vurderinger. Hvilke svarformer og mål for usikkerhed du får, afhænger af den enkelte model og dens API.

Et marked i hurtig udvikling

JEV er blot ét eksempel, ikke den eneste mulighed. Der findes mange AI-modeller, som kan bruges til klassifikation og vurdering, og udvalget af specialiserede beslutningsmodeller udvikler sig meget hurtigt. Nye modeller kommer til, og priser, adgang og funktioner ændrer sig løbende.

I oktober 2026 har OpenRouter en særskilt oversigt over modeller med outputtypen decisions. Her finder du eksempelvis Microsoft-Decision-1:

Se beslutningsmodeller på OpenRouter, sorteret efter popularitet

Mange andre udbydere end TypeSafe AI

I Jagents modeloversigt fra oktober 2026 nævnes blandt andet disse udbydere og deres beslutningsmodeller (men der er mange flere):

  • Cloudflare: Clef og Clef Flash.
  • Perplexity: Decider V1.1 27B.
  • Liquid AI: d1.
  • Upstage: Solar Decide og Solar Decide Flash.

Listen er et øjebliksbillede fra en sammenligningsside, ikke en garanti for aktuel adgang via OpenRouter. Kontrollér modelnavne, tilgængelighed og understøttede svartyper i den aktuelle modeloversigt og hos udbyderen.

Et øjebliksbillede - ikke en fast anbefaling

Artiklen og kodeeksemplet tager udgangspunkt i oktober 2026. Linket viser OpenRouters løbende opdaterede udvalg, så listen kan se anderledes ud, når du læser dette. Sammenlign modeller på dine egne opgaver, og kontrollér deres aktuelle dokumentation og priser.

GitHub-eksemplet bruger JEV’s svarformat. Du kan derfor ikke regne med at skifte til en anden beslutningsmodel blot ved at ændre modelnavnet.

JEV som eksempel

TypeSafe AI kalder JEV en System One-model. Det er deres betegnelse for den type model, de bygger, ikke en fælles betegnelse for alle beslutningsmodeller. Ideen er, at modellen skal foretage hurtige, afgrænsede vurderinger inde i et program frem for at generere længere tekster til mennesker.

Du sender modellen to ting:

  • State: Den information, som skal vurderes. Det kan eksempelvis være teksten fra en kundehenvendelse eller et bilag.
  • Questions: Et eller flere spørgsmål, hvor du på forhånd bestemmer, hvilken type svar du ønsker.

JEV returnerer strukturerede svar og sandsynligheder. Dit program kan derefter bruge almindelig C#-kode til at beslutte, hvad der skal ske. Du behøver altså ikke lede efter ordet “ja” i en lang tekst fra en chatbot.

En model er ikke det samme som et framework

Microsoft Semantic Kernel er et framework, som hjælper med at integrere AI i en applikation. JEV er selve modellen, som foretager vurderingen. I denne artikel kalder vi JEV via HTTP uden at bruge Semantic Kernel.

Tre typer spørgsmål i JEV

JEV har tre grundlæggende svartyper:

Type Hvad bruger du den til? Eksempel
Noul Et ja/nej-spørgsmål. Svaret er modellens sandsynlighed for ja, mellem 0 og 1. Beskriver bilaget et køb af kontorartikler?
Choice At vælge mellem muligheder, du selv angiver. Svaret indeholder valget og sandsynligheden for hver mulighed. Er kategorien Kontorartikler, Transport, Forplejning eller Andet?
Score At vurdere noget på en ordnet skala, hvor du beskriver niveauerne. Er bilagets beskrivelse uklar, delvist tydelig eller tydelig og konkret?

Et Noul-svar på 0.95 betyder eksempelvis, at modellen vurderer sandsynligheden for ja til 95 %. Det er ikke i sig selv en C#-værdi af typen bool. I eksemplet nedenfor omregner vores hjælpeklasse sandsynligheden til true, hvis den er mindst 0.5.

En Score er heller ikke en procent. Med tre niveauer er skalaen 0-2, og svaret er et sandsynlighedsvægtet gennemsnit. Hvis modellen giver niveau 1 en sandsynlighed på 20 % og niveau 2 en sandsynlighed på 80 %, bliver scoren 1 * 0.2 + 2 * 0.8 = 1.8.

Choice og Score returnerer desuden confidence, som beskriver, hvor entydig modellens sandsynlighedsfordeling er. Det er et særskilt mål og skal ikke forveksles med sandsynligheden for en bestemt svarmulighed.

Et struktureret svar kan stadig være forkert

Beslutningsmodeller gør det lettere at bruge AI-svaret i kode, men en korrekt svarstruktur er ikke en garanti for en korrekt vurdering. En høj sandsynlighed er heller ikke et bevis. Afprøv modellen på relevante eksempler, og lad et menneske kontrollere usikre eller vigtige vurderinger.

Hvornår giver det mening?

Beslutningsmodeller som JEV kan eksempelvis bruges til at:

  • Foreslå kategorier til bilag eller kundehenvendelser.
  • Vurdere, om en beskrivelse indeholder tilstrækkelige oplysninger.
  • Sortere tekst efter relevans i forhold til et bestemt emne.
  • Vurdere, om en sag skal sendes videre til manuel behandling.

Hvis du derimod vil have skrevet en mail, forklaret et stykke kode eller ført en åben samtale, er en tekstgenererende model et mere oplagt valg.

Stil helst ét konkret spørgsmål ad gangen. Hvis en beslutning afhænger af flere forhold, kan du bede om separate vurderinger og kombinere dem i din egen kode. Så er det stadig dit program, som bestemmer reglerne.

Hvorfor OpenRouter?

OpenRouter er en tjeneste, som giver adgang til AI-modeller fra forskellige udbydere gennem én konto og API-nøgle. I dette eksempel bruger vi OpenRouter som mellemled mellem vores C#-program og JEV:

C#-program → OpenRouter → JEV fra TypeSafe AI

Du skal derfor have en OpenRouter API-nøgle, ikke en nøgle til TypeSafe AI’s direkte API. Kald kan koste penge, så kontrollér adgang, saldo og aktuelle priser hos OpenRouter.

JEV bruger et andet endpoint end en chatbot

GitHub-eksemplet bruger modellen typesafe/jev-1.13 og endpointet https://openrouter.ai/api/alpha/decisions. Det sender state og questions, ikke en liste af chatbeskeder til /chat/completions.

Endpointet er i alpha, så både adgang, modelnavne og API-format kan ændre sig. Hvis eksemplet ikke længere virker, bør du kontrollere de aktuelle oplysninger hos OpenRouter.

Eksempel: Vurdering af et bilag

Vi tager udgangspunkt i et fiktivt bilag:

Tekst: Køb af printerpapir og kuglepenne.
Dato: 2026-10-10
Beløb: 349.95 DKK

Programmet beder JEV om tre vurderinger:

  1. Beskriver bilaget et køb af kontorartikler til virksomheden?
  2. Hvilken udgiftskategori passer bedst?
  3. Hvor tydelig er beskrivelsen?

Det er forslag til et regnskabssystem, ikke automatisk godkendelse eller bogføring. Vi sender kun fiktive oplysninger. Send ikke rigtige bilag med personlige eller fortrolige oplysninger uden at have afklaret, om de må deles med tjenesterne.

Se koden på GitHub

Se hele eksemplet på GitHub

Projektet indeholder den kommenterede C#-kode og en README med vejledning til at komme i gang. Du skal bruge .NET 10 SDK og en OpenRouter API-nøgle med adgang til modellen og tilstrækkelig saldo. Ingen ekstra NuGet-pakker er nødvendige.

Følg vejledningen i projektet for at sætte miljøvariablen OpenRouterKey og starte programmet. Her i artiklen fokuserer vi på, hvad eksemplet gør, og hvordan resultatet skal forstås.

Warning

Skriv ikke din rigtige API-nøgle direkte i kildekoden, og læg den aldrig på GitHub. En miljøvariabel holder nøglen ude af kildekoden, men er ikke i sig selv et sikkert nøglelager.

Sådan fungerer eksemplet

Programmet læser API-nøglen fra miljøvariablen og samler bilagets tekst, dato og beløb i den information, JEV skal vurdere: State.

Derefter sender det tre separate spørgsmål om det samme bilag:

  • Noul vurderer, om købet er kontorartikler. Programmet viser både sandsynligheden for ja og en beregnet true/false-værdi.
  • Choice vælger mellem Kontorartikler, Transport, Forplejning og Andet. Programmet viser også sandsynligheden for hver kategori.
  • Score vurderer beskrivelsen på tre niveauer: Uklar, delvist tydelig og tydelig og konkret. Det giver en score på skalaen 0-2.

Programmet bruger async og await til at vente på hvert API-svar. Der er ingen chathistorik: Hvert kald sender bilagets oplysninger og det aktuelle spørgsmål på ny. JEV’s API kan også behandle flere spørgsmål i samme request, men eksemplet adskiller dem for at gøre svartyperne nemme at følge.

Eksempel på resultat

Her er et illustrativt, forkortet output. Tallene er valgt for at vise, hvordan svarene skal læses; de er ikke resultatet af en konkret API-kørsel:

1. True/false (noul)
Svar: True
Sandsynlighed for ja: 98,0 %

2. Valg fra en liste (choice)
Svar: Kontorartikler
  Kontorartikler: 97,0 %
  Transport: 1,0 %
  Forplejning: 0,0 %
  Andet: 2,0 %

3. Vurdering på en skala (score)
Score: 1,80 på skalaen 0-2
  0: Uklar beskrivelse: 0,0 %
  1: Delvist tydelig beskrivelse: 20,0 %
  2: Tydelig og konkret beskrivelse: 80,0 %

I dette eksempel peger vurderingen tydeligt mod kontorartikler. Scoren på 1,80 fortæller, at beskrivelsen ligger tæt på det højeste niveau på vores skala. Det er stadig modellens vurdering, ikke en godkendelse af købet.

Programmet viser desuden svartid, tokenforbrug og API-pris efter hvert kald. Tokens er de enheder, som tjenesten bruger til at opgøre tekstforbruget. Prisen kommer fra OpenRouters svar.

Ifølge projektets README tog hvert kald i en eksempelkørsel 401-819 ms og kostede omkring 0,0001 DKK, svarende til cirka 10.000 tilsvarende kald pr. krone. Det er målinger fra den kørsel, ikke faste priser eller lovede svartider.

Hvad skal du lægge mærke til?

Når du kører programmet, får du først bilagets oplysninger og derefter de tre vurderinger. Kig især på:

  • Ja/nej-svaret: Programmet viser true allerede ved 50 %. Det er en praktisk omregning i eksemplet, ikke en anbefalet grænse for automatisk godkendelse.
  • Kategorien: Du får sandsynligheden for alle muligheder, så du kan se, om én kategori skiller sig tydeligt ud.
  • Scoren: Et tal tæt på 2 peger mod en tydelig beskrivelse på netop den skala, vi har defineret. Det siger ikke, om købet er korrekt eller fradragsberettiget.
  • Confidence: JEV returnerer også dette mål for Choice og Score, selv om eksemplet kun udskriver sandsynlighederne.
  • Tid og pris: Svartiden inkluderer netværkstiden. DKK-prisen bygger på en fast kurs på 6,5 DKK pr. USD, og antal kald for 1 DKK er kun et estimat ved samme pris pr. kald.

Resultater, svartider og priser kan variere. Hvis der opstår en fejl, skriver programmet en fejlbesked og stopper med exitkode 1. Det kan eksempelvis skyldes en manglende API-nøgle, manglende adgang til modellen eller et ændret API-format.

Prøv selv

  • Skift bilagets tekst til "Togbillet til kundemøde.", og se, hvordan kategorien ændrer sig.
  • Prøv en vag beskrivelse som "Diverse indkøb.", og sammenlign scoren med det oprindelige bilag.
  • Tilføj en kategori i Choices. Ændrer det fordelingen af sandsynligheder?
  • Tilpas beskrivelserne i Levels, så skalaen måler noget andet, eksempelvis hvor tydeligt formålet med købet er beskrevet.

Hold spørgsmålene afgrænsede, og brug sandsynlighederne som information til dit program frem for at behandle alle svar som sikre fakta.

Læs mere

Spørgsmål til AI

For at få mest muligt ud af AI-værktøjer som ChatGPT, er det vigtigt at stille klare og præcise spørgsmål og give den nødvendige kontekst. Her er nogle spørgsmål til denne side:

  • Hvad er en beslutningsmodel, og hvordan adskiller den sig fra en tekstgenererende model?
  • Hvad er forskellen på JEV, OpenRouter og Semantic Kernel?
  • Hvad skal jeg undersøge, før jeg skifter fra JEV til en anden beslutningsmodel?
  • Hvornår skal jeg bruge Noul, Choice eller Score?
  • Hvorfor er en sandsynlighed på 95 % ikke en garanti for et korrekt svar?
  • Hvad er forskellen på en svarmuligheds sandsynlighed og confidence?
  • Hvordan bruger eksemplet async og await til at vente på et API-svar?
  • Hvorfor er grænsen på 50 % ikke nødvendigvis passende til en vigtig beslutning?