AI i udviklingsprocessen

Michell Cronberg

For udviklere, arkitekter og tekniske leads

Agenda

  • LLM'er og tre typer AI-værktøjer
  • Agenter, instruktioner, skills og MCP
  • Kontekst, embeddings og RAG
  • Prompts, kodekvalitet og evaluering
  • Risici, økonomi og lokale modeller

Hvorfor dette er relevant nu

  • AI er blevet et dagligt værktøj for mange udviklere
  • Flere opgaver flytter fra søgning til dialog
  • Tempoet stiger, men ansvar forsvinder ikke
  • Værdien flytter fra syntaks til dømmekraft
  • Bliver vi review'ere i stedet for udviklere?

LLM'er, tokens og kontekstvindue

  • En LLM genererer tekst ved at forudsige næste token
  • Tokens er tekstdele, ikke nødvendigvis hele ord
  • Kontekstvinduet begrænser, hvor meget modellen kan arbejde med ad gangen
  • Træningsviden er ikke det samme som aktuelle projektdata
  • Et overbevisende svar kan stadig være forkert

Typer af værktøjer

  • Forståelse
    • Overblik
    • Kodeforståelse
    • Dokumentation
  • Kode
    • Automatiske kodeforslag
    • Chatbaseret sparring
    • Agentbaserede arbejdsgange

De store spillere

  • Anthropic: Claude og Claude Code
  • OpenAI: ChatGPT og Codex
  • GitHub: GitHub Copilot og Copilot CLI

Hvordan bruger vi AI-værktøjerne?

  • I editoren: eksempelvis GitHub Copilot i VS Code
  • I terminalen: eksempelvis Claude Code eller Copilot CLI
  • Som desktop-app: eksempelvis ChatGPT eller Claude
  • I browseren: eksempelvis ChatGPT, Claude eller Gemini

Modellen kan køre lokalt eller i cloud, afhængigt af værktøjet.

Lokalt vs online

  • Lokalt: mere kontrol over data og mulighed for at arbejde offline
  • Online: adgang til store modeller uden selv at købe og drive hardwaren
  • Valget afhænger af fortrolighed, hardware, pris og kvalitet
  • Ollama: kør lokale modeller via terminal og API
  • LM Studio: hent og kør lokale modeller med en grafisk brugerflade
  • OpenCode: Lokal CLI
  • llama.cpp: modelkørsel på egen CPU/GPU med CLI og server
  • Hugging Face: find og hent modeller til blandt andet lokal kørsel
    Kontrollér hele dataflowet: lokale værktøjer kan stadig kalde eksterne tjenester.

Hvad er en agent egentlig?

  • Tænk på agenten som en rolle, fx udvikler eller reviewer
  • Rollen beskriver opgaven, målet og rammerne
  • Agenten bruger en AI-model og de værktøjer, den har adgang til
  • Skills giver vejledning til bestemte opgaver
  • MCP giver adgang til værktøjer og data fra tilkoblede tjenester
  • Den kan arbejde i flere trin: læse, ændre og kontrollere

Skab din egen agent

  • Beskriv rollen og det ønskede svar, fx en reviewer der kun giver feedback
  • Vælg kun de værktøjer, rollen har brug for
  • Brug oprettelseshjælp, fx /create-agent i VS Code (Local)
  • Copilot: gem rollen i fx .github/agents/reviewer.agent.md
  • Gennemgå instruktionerne og afprøv agenten på en lille opgave

Projektinstruktioner: overblik for AI

  • Giv AI overblik over projektets formål, struktur og teknologier
  • Beskriv regler, build og tests, så du ikke skal gentage dem i hver chat
  • GitHub Copilot: .github/copilot-instructions.md
  • Claude Code: CLAUDE.md
  • OpenAI Codex: AGENTS.md

Det er projektets vejledning til AI, ikke definitionen af en bestemt agent.

Skills: genbrugelige arbejdsgange

  • Samler vejledning til en bestemt type opgave
  • Kan indeholde skabeloner, scripts og andet materiale
  • Eksempler: opret en skærm, byg en konsolapp, brug et API
  • En skill er hverken en model, en MCP-server eller en tilladelse
  • Agenten bruger værktøjer til at udføre arbejdsgangen

Skab din egen skill

  • Beskriv opgaven, hvornår skillen skal bruges, og trinnene den skal følge
  • Brug en oprettelsesguide eller skill, fx /create-skill i VS Code
  • Copilot: gem den i fx .github/skills/review-api/SKILL.md
  • Tilføj eventuelt skabeloner, eksempler og scripts
  • Gennemgå indholdet og test på en opgave med et kendt resultat

Kontekst er ofte vigtigere end modelvalg

  • Hvilke filer kan modellen se?
  • Hvor meget af kodebasen er tilgængeligt?
  • Hvad huskes fra tidligere trin?
  • Hvad hentes ind igen, når det bliver nødvendigt?

MCP og hvorfor det betyder noget

  • Tool calling
  • Klienten forbinder agenten med en MCP-server
  • Serveren stiller eksempelvis værktøjer med inputskemaer til rådighed
  • Samme integration kan bruges af flere kompatible klienter
  • MCP erstatter ikke det underliggende API eller dets adgangskontrol

MCP: forskellige typer adgang

  • GitHub MCP: issues, kildekode og kommentarer
  • Context7: biblioteksdokumentation og kodeeksempler
  • Serena: symboler, definitioner og referencer via sprogservere
  • OfficeCLI MCP: læsning, ændring og validering af Office-filer
  • Et produkt kan tilbyde både CLI, skills og MCP
  • Kontrollér identitet, rettigheder og hvilken forbindelse der bruges

Find MCP, skills og agents

Brug samlingerne som inspiration, ikke som en sikkerhedsgaranti.
Kontrollér indhold, kompatibilitet og rettigheder før brug.

Skab din egen MCP-server

  • Start med ét værktøj, fx et opslag i et internt API
  • Brug et MCP-SDK til fx C#, Python eller TypeScript
  • Beskriv værktøjets input og skriv koden, der henter data
  • Tilslut via stdio eller Streamable HTTP, lokalt eller på en server
  • Test værktøjskald, fejl og adgangsrettigheder

Kontekst, hukommelse og genfinding

  • Kontekst er det materiale, modellen får i det aktuelle kald
  • Samtalehistorik og opsummeringer kan bære tidligere beslutninger videre
  • Genfinding henter relevant materiale fra filer eller andre datakilder
  • Lange samtaler kan miste detaljer ved opsummering
  • Ingen af delene betyder, at modellen bliver genoptrænet

Embeddings og indeksering

  • Et embedding er en numerisk repræsentation af en tekst
  • Lighedssøgning finder beslægtet indhold uden præcist ordmatch
  • Dokumenter opdeles i chunks med kildeoplysninger
  • Chunks og embeddings gemmes i et søgeindeks
  • Et indeks kan være simple filer eller en database

RAG: fra spørgsmål til forankret svar

Retrieval-Augmented Generation

  • Find relevante uddrag med semantisk søgning, nøgleord eller begge
  • Føj uddrag og kildeoplysninger til modellens kontekst
  • Lad modellen besvare spørgsmålet ud fra materialet
  • Kontrollér, at kilderne faktisk underbygger svaret

RAG: hvornår hjælper det reelt?

  • Når svar skal forankres i interne eller aktuelle data
  • Når dokumentation, runbooks og kodebase betyder mere end generel viden
  • Forkerte eller forældede uddrag kan give forkerte svar
  • En høj lighedsscore er ikke bevis på en brugbar kilde
  • Genfinding erstatter ikke dømmekraft og konsekvensvurdering

RAG og dokumentation i udviklingsarbejdet

  • Context7 kan hente dokumentation før et kodeforslag
  • Kontrollér bibliotek og version mod projektets faktiske pakker
  • Sentence Transformers kan lave embeddings lokalt
  • En tjeneste som OpenRouter kan formidle det efterfølgende LLM-kald
  • Lokale embeddings betyder ikke, at hele løsningen er lokal

Gode prompts minder om specifikationer

  • Mål
  • Begrænsninger
  • Kontekst
  • Kvalitetskrav
  • Tests og risici

GitHub Spec Kit gør arbejdet systematisk: specifikation → teknisk plan → opgaver → implementering.

Kvalitet stopper ikke ved kompilerbar kode

  • AI verificerer ikke automatisk korrekthed
  • Tests, kodegennemgang og analyzers er stadig nødvendige
  • Advarsler fra analyseværktøjer er signaler, ikke kosmetik
  • Menneskelig godkendelse skal bygge på konkrete kontroller

Test, analyzers og kontrollerede ændringer

  • Test krav og særtilfælde, ikke kun den genererede implementering
  • En regressionstest skal kunne fejle på den oprindelige fejl
  • Refaktorering skal bevare aftalt adfærd og offentlige API'er
  • Analyzers kan opdage problemer, som build og tests ellers overser
  • Brug eksempelvis .NET CLI, xUnit og IDisposableAnalyzers

Mennesket beholder ansvaret

  • Skeln mellem analyse, forslag og udførte ændringer
  • Godkend afgrænsede handlinger og kontrollér resultatet
  • Gennemgå diff, testoutput og eventuelle eksterne sideeffekter
  • En godkendelse i chatten giver ikke flere systemrettigheder
  • Stop, når forudsætninger eller opgavens omfang ændrer sig

Evals: test også AI-adfærden

  • Brug faste opgaver med kendte forventninger
  • Bedøm korrekthed, kildebrug og overholdelse af begrænsninger
  • Sammenlign ved ændringer i prompt, model eller værktøjer
  • Gentag forsøg: ét godt svar beviser ikke stabil kvalitet
  • Evals supplerer softwaretests, de erstatter dem ikke

Risici, sikkerhed og fortrolighed

  • Hallucinationer og usikker kode
  • Kode eller persondata sendt til de forkerte tjenester
  • Prompt injection: instruktioner skjult i dokumenter eller værktøjssvar
  • For brede rettigheder og uønskede ændringer
  • Kontrollér licens, datadeling og hvad der bliver logget

Økonomi og lokale modeller

  • Medregn tokenforbrug, API-priser, seat-licenser og drift
  • Ollama og LM Studio kan bruges til lokal modelkørsel
  • vLLM kan bruges til at stille modeller til rådighed på egen infrastruktur
  • Lokal kørsel kræver hardware og vedligeholdelse
  • Kontrollér hele dataflowet; lokale modeller løser ikke alle risici

Flere kilder til forståelse og kontrol

  • Kombinér kode med stacktraces, logs og dokumentation
  • Git-diffs viser ændringer; Serilog kan give strukturerede logs
  • Skærmbilleder og UI-inspektion kan afsløre visuelle fejl
  • Kodeinspektion er ikke det samme som at afprøve programmet
  • Bed om evidens, ikke blot en overbevisende forklaring

Det stabile er stadig softwarehåndværket

  • Arkitektur
  • Domæneforståelse
  • Kritisk tænkning
  • Kommunikation
  • Ansvar for kvalitet

AI gør ikke den erfarne udvikler irrelevant