Et åbent referenceimplementeret mønster for self-improving agents på dansk B2B-domæne, oversat 1:1 fra OpenAI/Thrive's Tax AI cookbook.
Domænet i POC'en er fradragsklassificering af bilag (driftsomkostning, repræsentation, personalegode, etc.) — men selve loopet er domæne-agnostisk. Pointen er ikke at klassificere fradrag rigtigt, men at vise hvordan et trace → eval → handoff → review → deploy-loop bygges, så agenten beviseligt bliver bedre over tid.
Disclaimer: Dette er en POC til at demonstrere et arkitekturmønster. Den er ikke godkendt skatterådgivning, og må ikke bruges som beslutningsgrundlag i reelle skattesager.
OpenAI's case med Thrive Holdings viste 97 % nøjagtighed på 7.000 amerikanske selvangivelser. Tallet er imponerende, men det interessante er mønstret bag: et loop hvor revisorernes rettelser systematisk bliver til evals og kodeforbedringer. Det mønster er bærbart til mange danske B2B-domæner — revision, jura, bogføring, forsikring, lønadministration — og kan bygges af et mindre team i dag.
Læs den underliggende analyse på consile.dk/ai.
| Søjle | Hvad | Hvor i repo |
|---|---|---|
| 1. Production traces | OpenTelemetry JSONL pr. agent-run | src/traces/ |
| 2. Practitioner feedback → evals | Reviewer-UI promoverer gentagne rettelser | src/reviewer/, evals/ |
| 3. Agent-agnostisk handoff | Codex / Claude Code / Cursor kan læse samme handoff | agent_handoff/ |
Se ARCHITECTURE.md for det fulde billede.
python -m venv .venv
.venv/Scripts/python.exe -m pip install -e . # eller `uv sync`
LLM_PROVIDER=mock PYTHONPATH=. bash scripts/demo_full_loop.shForventet output: Baseline 82.5 % → Post-handoff 97.5 % (+15 pp).
# 1. Start postgres+pgvector og ollama
docker compose up -d
docker exec -it $(docker ps -qf name=ollama) ollama pull nomic-embed-text
# 2. Installer
uv sync
cp .env.example .env # tilføj ANTHROPIC_API_KEY (default) eller OPENAI_API_KEY
# 3. Kør hele loopet manuelt
./scripts/01_ingest_rules.sh # indekser DJV + LL § 8 i pgvector
./scripts/02_run_pilot.sh # klassificer bilag → runs/pilot.jsonl
./scripts/03_collect_corrections.sh # promovér ≥1 fejl-mønster til eval
./scripts/04_generate_handoff.sh # producér agent_handoff/handoff_v001.md
./scripts/05_run_evals.sh # kør promptfoo eval suite
# 4. Reviewer-UI (i stedet for auto_review)
uv run python -m src.reviewer.app --run pilot # åbn http://localhost:8000Baseline (v001 prompt): 82.5 % accuracy (33/40)
Efter handoff (v002 prompt): 97.5 % accuracy (39/40)
Delta: +15.0 percentpoint
Auto-promoverede eval-cases: 1
Citation-coverage: 100 %
Output-contract violations: 0
Tallene falder fordi mock-provideren i LLM_PROVIDER=mock har et indbygget fejlmønster — den klassificerer forretningsmiddage med kunder som DRIFT_FULDT i stedet for REPRAESENTATION_25. Loopet finder mønstret, promoterer det til en eval, og v002-prompten (foreslået af handoff'et) lukker hullet. Det er det samme mønster som beskrevet i OpenAI's case med Thrive Holdings.
Loopet producerer en agent-agnostisk agent_handoff/handoff_v{n}.md. Se eksempler:
Filformatet er en simpel markdown-kontrakt med mål, ikke-mål, eval-pass-betingelser og evidens fra traces. Enhver kodningsagent med repo-adgang kan læse den.
POC'en er bygget sådan at domæne-laget kan udskiftes. For at adde et nyt domæne (fx momsklassificering):
- Tilføj regler under
data/rules/ - Tilføj syntetiske cases i
data/synthetic_expenses.csv(eller en søster-fil) - Tilføj eval-cases i
evals/cases/ - Trace-skemaet og loopet ændres ikke
Apache 2.0. Se LICENSE.