ms-ai-architect/skills/ms-ai-engineering/references/agent-orchestration/declarative-vs-imperative-agent-design.md
Kjell Tore Guttormsen 3a73eeafdc refactor(ms-ai-architect): R13 del 1 — nøytraliser Cosmo-personaen i ref-korpusets headinger, etter å ha rettet en gate som var målt usann to ganger
Ordre 20260912T193441Z-7358817909. Steg 1 var ikke transformen, men å rette
roadmapens R13-gate og få den ratifisert. Gaten `grep -rl "Cosmo"
skills/*/references -> 0` var usann på to uavhengige måter:

1. Ordren fanget den første: 451 av forekomstene er Azure Cosmos DB, ekte
   produktinnhold. Diskriminatoren er ikke bokstaven «s» — `Cosmos <norsk
   substantiv>` er genitiv av personaen (`### Cosmos tonalitet`), mens
   `Cosmos DB`/`CosmosClient`/`cosmos_ru` er produkt.
2. Denne økten fant den andre: 132 persona-forekomster ligger i prosa,
   tabeller, dialog-replikker og proveniens-linjer. Heading-nøytralisering
   kan ikke nå dem, så «0 persona» er uoppnåelig også under den ratifiserte
   formen. Operatøren ratifiserte alternativ A: gaten speiler formen, og de
   132 bokføres til R13b/R14.

Tre korreksjoner av premisser som sto i ordren og STATE:
  «ca 320 produkt»   -> 451 (case-sensitivt nett manglet 327 lowercase
                        TOC-ankre + 99 identifikatorer; sann nevner 1 638)
  «169 headinger»    -> 401. 169 var `^## For Cosmo`-prefikset (168) og var
                        internt inkonsistent med sin egen topp-variant (204)
  «417 matcher ingen
   populasjon»       -> 417 er cosmo-headinger utenfor kodefences; briefens
                        nevner var reell hele tiden

Fence-bevissthet er målt skadelig, ikke nødvendig: begge toggle-regler er
gale på dette korpuset (naiv toggle skjuler en ekte heading i
chain-of-thought-prompting.md, CommonMark-regelen ubalanserer
service-level-documentation-dr.md). Fence-agnostisk deteksjon finner 401
heading-linjer i nøyaktig de samme 40 variantene som fence-bevisst finner
400 i — ingen kodeblokk-linje er byte-identisk til en persona-heading. Derfor
nøkles transformen på 40 enumererte heading-tekster og ignorerer fences. En
ukjent variant kaster; en slug-kollisjon kaster. Ingenting auto-fikses.

TOC-en regenereres ikke, den rettes kirurgisk: alle 327 persona-lenker hadde
lenketekst lik én av de 40 heading-tekstene og anker lik slugify av den
(327/327, 0 avvik), så heading og TOC-entry skrives i samme operasjon og
ingen mellomtilstand etterlater en død lenke.

Ratifisert målform: `For Cosmo`, `For Cosmo Skyberg` og `For arkitekten
(Cosmo)` konvergerer på `For arkitekten`. To filer kolliderte og er adjudisert
ved å lese dem, ikke ved regel.

Verifisering (alle 7 kriterier fra ordren):
  G1 persona på heading-linjer   401 -> 0
  G2 døde fragmentlenker         1 -> 1 (pre-eksisterende, unntatt)
  G3 produkt-forekomster         451 -> 451; `Cosmos DB|Azure Cosmos` 308 = 308
  de 3 kun-produkt-filene        byte-identiske
  nettet validert begge veier    injisert persona feller G1; genitiv feller G1;
                                 produkt-heading og de 3 filene passerer
  hele diffen                    802 heading-linjer + 654 TOC-linjer, ANNET = 0
  linjeantall                    728 lagt til = 728 slettet
  suite                          1120/1120 (1097 + 23 nye)
  validate-plugin                250 PASS / 0 FAIL
  stikkprøve                     10 filer, alle 5 skills, inkl. de 3 mest
                                 produkt-tunge (26/20/19) — kun heading+TOC

Utenfor scope, urørt: de 4 SKILL.md, de 23 commands, CLAUDE.md, README.md,
NOTICE.md, docs/ (alt R14).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 22:12:28 +02:00

13 KiB

Declarative vs Imperative Agent Design Tradeoffs

Last updated: 2026-02 Status: GA Category: Agent Orchestration & Automation Type: reference


Innhold

Introduksjon

Valget mellom deklarativ og imperativ agentdesign er en av de mest grunnleggende arkitekturbeslutningene for AI-agenter i Microsoft-økosystemet. Deklarative agenter konfigurerer atferd gjennom manifest-filer, instruksjoner og kunnskapskilder -- orkestratoren håndterer resonnering og utførelse. Imperative (code-first) agenter gir full kontroll over prompt engineering, orkestrering, verktøybruk og feilhåndtering gjennom eksplisitt kode.

Microsoft tilbyr et spektrum fra helt deklarativ (Copilot Studio declarative agents for M365) via low-code (Copilot Studio custom agents) til helt code-first (Semantic Kernel, Azure AI Agent Service, Microsoft Agent Framework). Hvert punkt på spekteret har ulike styrker, begrensninger og egnethet for forskjellige organisatoriske moduser og tekniske krav.

For mange organisasjoner er svaret ikke enten-eller, men en hybrid tilnærming der enkle scenarier håndteres deklarativt og komplekse scenarier implementeres med kode. Semantic Kernel Agent Framework støtter dette eksplisitt gjennom declarative YAML specs for agentdefinisjon kombinert med programmatisk orkestrering.

Kjernekomponenter

Komponent Deklarativ Imperativ
Definisjon JSON/YAML manifest C#/Python kode
Orkestrering Copilot orchestrator Semantic Kernel, custom
Modellvalg Platform-bestemt Utvikler-kontrollert
Verktøy Connectors, plugins Custom functions, API-kall
Deployment M365 admin center Azure-infrastruktur
Testing Copilot Studio test agent Unit tests, integration tests

Declarative Agent Benefits

Rask time-to-value

// Komplett declarative agent definisjon
{
    "name": "IT-Helpdesk",
    "description": "Hjelper ansatte med IT-problemer",
    "instructions": "Du er en IT-helpdesk-assistent for Direktoratet for digital tjenesteutvikling. Svar på spørsmål om tilganger, programvare og nettverksproblemer. Referer alltid til relevante KB-artikler. Eskalér til ServiceDesk hvis du ikke kan løse problemet.",
    "capabilities": [
        {"name": "WebSearch", "disabled": true},
        {"name": "CodeInterpreter", "disabled": false}
    ],
    "knowledge": {
        "sharepoint_sites": [
            "https://ddt.sharepoint.com/sites/IT-KB"
        ],
        "graph_connectors": ["servicenow-connector"]
    },
    "actions": [
        {
            "type": "connector",
            "connector": "ServiceNow",
            "operations": ["createIncident", "getIncidentStatus"]
        }
    ],
    "conversation_starters": [
        {"text": "Jeg trenger tilgang til..."},
        {"text": "Programmet mitt krasjer..."}
    ]
}

Fordeler med deklarativ tilnærming

Fordel Beskrivelse Konsekvens
Ingen infrastruktur Kjører på Copilots orkestrator Null hosting-kostnad, null vedlikehold
Innebygd compliance Arver M365 RAI og sikkerhet Ingen separat sikkerhetsgjennomgang
Rask iterasjon Endre instruksjoner uten kode-deploy Minutter fra endring til produksjon
Bred distribusjon Teams, Outlook, Word, Excel Tilgjengelig der brukerne er
Citizen developer Forretningsbrukere kan bygge og vedlikeholde Redusert IT-avhengighet

Begrensninger

Begrensning Implikasjon
Begrenset orkestrererskontroll Kan ikke styre resonneringslooper
Sekvensiell prosessering Grounding og tool-calling er sekvensielt
Ingen egne modeller Bundet til Copilots foundation model
Begrenset formatering Adaptive Cards har begrensninger
Ingen CI/CD Ingen native source control-støtte

Code-First Flexibility

Semantic Kernel imperative agent

from semantic_kernel import Kernel
from semantic_kernel.agents import ChatCompletionAgent
from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion
from semantic_kernel.functions import kernel_function

# Full kontroll over agentens oppførsel
kernel = Kernel()

# Velg eksakt modell
kernel.add_service(AzureChatCompletion(
    deployment_name="gpt-4o",
    endpoint=os.environ["AZURE_OPENAI_ENDPOINT"],
    api_key=os.environ["AZURE_OPENAI_KEY"]
))

# Definer custom verktøy med full kontroll
class ITHelpDeskPlugin:
    @kernel_function(
        name="search_knowledge_base",
        description="Søk i IT-kunnskapsbasen"
    )
    async def search_kb(self, query: str) -> str:
        # Custom retrieval-logikk med re-ranking
        results = await self.search_client.search(
            query,
            filter=f"department eq 'IT'",
            semantic_configuration="kb-semantic-config",
            query_type="semantic"
        )
        # Custom re-ranking basert på brukerens rolle
        reranked = self.rerank_for_user(results, self.current_user)
        return self.format_results(reranked)

    @kernel_function(
        name="create_incident",
        description="Opprett sak i ServiceNow"
    )
    async def create_incident(
        self, title: str, description: str, priority: int
    ) -> str:
        # Custom validering og forretningslogikk
        if priority == 1 and not self._is_office_hours():
            await self._notify_on_call_team(title)

        incident = await self.servicenow_client.create(
            title=title,
            description=description,
            priority=priority,
            category="IT",
            assigned_group=self._determine_group(title)
        )
        return f"Sak {incident.number} opprettet"

kernel.add_plugin(ITHelpDeskPlugin(), "helpdesk")

# Opprett agent med full instruksjonskontroll
agent = ChatCompletionAgent(
    name="IT-HelpDesk-Agent",
    instructions="""...""",  # Detaljerte instruksjoner
    kernel=kernel,
    execution_settings=PromptExecutionSettings(
        temperature=0.1,  # Kontrollert kreativitet
        max_tokens=800,
        function_choice_behavior=FunctionChoiceBehavior.Auto()
    )
)

Fordeler med code-first

Fordel Beskrivelse Konsekvens
Full orkestreringskontroll Custom resonneringslooper Komplekse multi-step workflows
Modellfleksibilitet Velg modell per oppgave Kostnadsoptimalisering
Custom verktøy Hvilken som helst API/funksjon Ubegrenset integrasjonsevne
Testbarhet Unit tests, integration tests Høyere kvalitetssikring
CI/CD Standard DevOps-pipelines Kontrollert deployment
Ytelsestuning Token-optimalisering, caching Bedre skaleringsevne

Migration Paths

Fra deklarativ til imperativ

Steg 1: Start med declarative agent i Copilot Studio
        → Rask validering av brukerbehovet

Steg 2: Identifiser begrensninger
        → "Vi trenger custom retrieval-logikk"
        → "Vi trenger egen modell for sensitive data"
        → "Vi trenger kompleks orkestrering"

Steg 3: Migrer til code-first
        → Overfør instruksjoner til Semantic Kernel agent
        → Implementer custom verktøy som SK plugins
        → Behold Copilot Studio for enkle scenarier

Fra imperativ til deklarativ

Steg 1: Identifiser agenter som er over-engineered
        → Agenten bruker kun standard RAG + enkle verktøy
        → Ingen custom orkestrering nødvendig

Steg 2: Konverter til declarative manifest
        → Instruksjoner → declarative instructions
        → SK plugins → Copilot connectors/API plugins
        → Custom RAG → SharePoint + Graph connectors

Steg 3: Reduser operasjonell overhead
        → Fjern hosting-infrastruktur
        → Overføre vedlikehold til forretningsteam

Hybrid Approaches

Semantic Kernel Declarative Spec

# Hybrid: Deklarativ definisjon med programmatisk utførelse
type: chat_completion_agent
name: HybridHelpDesk
description: IT Helpdesk med deklarativ konfig og custom plugins
instructions: |
  Du er en IT-helpdesk-assistent.
  Bruk search_knowledge_base for å finne relevante KB-artikler.
  Opprett ServiceNow-sak ved eskalering.
model:
  id: gpt-4o
  connection:
    type: azure_openai
tools:
  - id: helpdesk.search_knowledge_base
  - id: helpdesk.create_incident
settings:
  temperature: 0.1
  max_tokens: 800
# Last agent fra YAML
from semantic_kernel.agents import AgentRegistry

agent = await AgentRegistry.create_from_yaml(
    kernel=kernel,
    yaml_str=open("agent-spec.yaml").read()
)

# Kombinerer deklarativ konfigurasjon med programmatiske plugins

Multi-tier arkitektur

┌─────────────────────────────────────────────────┐
│                Hybrid Architecture               │
│                                                  │
│  Tier 1: Declarative (Copilot Studio)           │
│  ├── FAQ-bots                                    │
│  ├── Informasjonsagenter                         │
│  └── Enkle workflow-agenter                      │
│                                                  │
│  Tier 2: Low-code (Copilot Studio + Power Auto) │
│  ├── Agenter med connector-integrasjoner         │
│  ├── Approval workflows                          │
│  └── Agenter med moderate krav                   │
│                                                  │
│  Tier 3: Code-first (Semantic Kernel / Foundry) │
│  ├── Multi-agent orkestrering                    │
│  ├── Custom modeller og RAG-pipelines            │
│  └── Høy-sikkerhets agenter                      │
└─────────────────────────────────────────────────┘

Skill Abstraction Levels

Abstraksjonsnivå Verktøy Målgruppe Kontroll
L0: No-code Agent Builder i M365 Copilot Sluttbrukere Minimal
L1: Low-code Copilot Studio Citizen developers Begrenset
L2: Low-code+ Copilot Studio + connectors Power users Moderat
L3: Pro-code (deklarativ) Agents Toolkit + YAML specs Utviklere Høy
L4: Pro-code (imperativ) Semantic Kernel + custom code Senior utviklere Full

Norsk offentlig sektor

Aspekt Deklarativ Imperativ
Anskaffelse Copilot-lisens Azure-abonnement + utvikling
Kompetansekrav Lav (forretningsbrukere) Høy (utviklere)
Time-to-value Dager Uker
Compliance Arvet fra M365 Eget ansvar
Datalokalitet EU Data Boundary Azure Norway East
Vedlikehold Forretningsteam IT-avdeling

Anbefaling for offentlig sektor

Beslutningstre:

1. Er det et M365-sentrert scenario?
   → JA: Start med declarative agent
   → NEI: Gå til 2

2. Kreves custom modeller eller orkestrering?
   → JA: Code-first med Semantic Kernel
   → NEI: Gå til 3

3. Kreves integrasjon med virksomhetssystemer?
   → Enkel integrasjon: Copilot Studio + connectors
   → Kompleks integrasjon: Code-first

4. Hvem skal vedlikeholde?
   → Forretningsteam: Deklarativ
   → IT-avdeling: Code-first

Beslutningsrammeverk

Scenario Anbefaling Begrunnelse
FAQ-bot med M365-data Declarative agent Raskest, billigst, lavest risiko
Kundestøtte med CRM-integrasjon Copilot Studio custom agent Connectors + moderate tilpasninger
Multi-agent analyse-pipeline Code-first Semantic Kernel Krever full orkestreringskontroll
Intern IT-helpdesk Hybrid: Declarative + code-first eskalering Enkel start, eskalér ved behov
Regulatorisk rapportering Code-first Custom validering og compliance-krav
Pilot/POC Declarative Valider behov før investering i kode

For arkitekten

  • Start alltid deklarativt med mindre kravene eksplisitt tilsier noe annet -- det er raskere, billigere og lettere å iterere. Konverter til code-first kun ved reelle begrensninger.
  • Hybrid er normalstilstanden for enterprise -- enkle agenter i Copilot Studio, komplekse i Semantic Kernel. Design arkitekturen for at begge kan sameksistere.
  • Semantic Kernel YAML specs er broen mellom deklarativ og imperativ -- definér agenten deklarativt, men utfør med programmatiske plugins. Gir det beste fra begge verdener.
  • Vurder vedlikeholdsmodell like mye som teknisk kapabilitet -- hvem skal endre agentens oppførsel over tid? Forretningsbrukere trenger deklarativ, utviklere kan håndtere kode.
  • For norsk offentlig sektor: Declarative agents med Copilot-lisens er kostnadseffektivt for informasjonsagenter. Code-first for saksbehandling og sensitive prosesser der kontroll og compliance er kritisk.