Impulse AI Docs
Intern dokumentasjon
Hopp til innhold

AI Quality Measurement

System for a male om AI-outputen er variert (ikke-repeterende) og relevant (forankret i brukerens faktiske innhold). Bygger pa eksisterende Voyage-embeddings og dekker alle 8 brukervendte AI-workloads.

For prompt-arkitektur, se AI Prompt DSL. For workload-oversikt, se AI Pipeline.

To uavhengige kvalitetsdimensjoner:

DimensjonSporsmalMetodeBra score
VariasjonGjentar AI-en seg for samme bruker?Cosine similarity mellom navaerende og forrige outputLav (< 0.65)
RelevansEr outputen forankret i brukerens input?Cosine similarity mellom output og brukerens tekstHoy (> 0.55)
executeWorkload() → AI output
measureOutputQuality() ← fire-and-forget, blokkerer aldri
1. Embed output (Voyage)
2. Hent forrige embedding (same user + workload + key)
3. Beregn variation score
4. Beregn relevance score
5. Lagre i ai_quality_scores

Integrasjonspunkt: En hook i executeWorkload() (apps/api/src/ai/infrastructure/ai-sdk.ts). Workloads legger til quality: { userId, inputText } i options.

Kostnad: ~$0.000003 per maling. Neglisjerbart — dekkes av Voyage gratis-kvote opp til ~5000 brukere.

Database: ai_quality_scores

heading.anchorLabel
KolonneTypeBeskrivelse
workload_typetextHvilken AI-workload (check_in_assess, pulse, batch_step_guidance_contraction, etc.)
workload_keytextSub-nokkel for batch-workloads (step_1..step_5). Null for single-output
variation_scorefloatCosine similarity til forrige output for samme bruker+workload. 0.0 = helt ulik, 1.0 = identisk. Lavere = bedre. Null = forste gang
variation_buckettextexcellent / good / acceptable / low / repetitive
relevance_scorefloatCosine similarity mellom output og brukerens input. 0.0 = ingen sammenheng, 1.0 = perfekt. Hoyere = bedre. Null = ingen input
relevance_buckettextexcellent / good / weak / generic
prompt_fingerprinttextHash som kobler til ai_workload_versions for prompt-versjon
output_embeddingvector(512)Voyage-embedding av AI-outputen
input_embeddingvector(512)Voyage-embedding av brukerens input
session_iduuidKobling til sesjon (nullable)
impulse_iduuidKobling til impuls (nullable)
check_in_iduuidKobling til sjekk-inn (nullable)

Bucket-terskler

heading.anchorLabel

Variasjon (lavere = bedre):

ScoreBucketTolkning
0.00 - 0.50excellentSvart ulik forrige — sterk variasjon
0.50 - 0.65goodMerkbart ulik — sunt
0.65 - 0.75acceptableNoe likhet, innenfor toleranse
0.75 - 0.85lowBekymringsverdig — dedup kan svikte
0.85 - 1.00repetitiveNar-identisk — undersok

Relevans (hoyere = bedre):

ScoreBucketTolkning
0.70 - 1.00excellentDypt forankret i brukerens innhold
0.55 - 0.70goodTydelig relatert til brukerens input
0.40 - 0.55weakLest tilknytning — kan kjennes generisk
0.00 - 0.40genericUforankret — undersok prompten

Alle 8 brukervendte workloads har quality measurement:

WorkloadTriggerInput for relevans
classify_enrichmentImpuls opprettetImpulstekst
batch_step_guidance_*Sesjon startetImpulstekst (5 per-step scores)
session_summary_*Sesjon fullfortImpulstekst
check_in_assessSjekk-inn opprettetSjekk-inn-tekst
pulseBakgrunns-regenNyeste moment-tekst
insight_narrativeBakgrunns-regenNylige impulstekster
transformation_distillationBakgrunns-regenCluster-breakthroughs

Anti-repetisjonsmekanismer

heading.anchorLabel

Quality-systemet maler effekten av 6 eksisterende mekanismer i prompt-arkitekturen:

  1. Variation-lag (concept-types.ts): openingApproaches + deduplicationInstruction pa hvert session-steg
  2. previousGuidanceOpening dedup: Forrige sesjon sin apningssetning sendes som negativ eksempel
  3. Produktgrense-separasjon: Pulse, Narrative og Transformations har gjensidig forbiddenDrift
  4. ACKNOWLEDGMENT.variety: Variasjonskrav i alle workloads via conventions
  5. WRITING_STYLE bans: 22 forbudte AI-ord + forbudte strukturer
  6. Temperature 0.8: Statistisk variasjon for sessions og pulse

Nyttige sporringer

heading.anchorLabel

Siste 20 scores

heading.anchorLabel
SELECT workload_type, workload_key,
round(variation_score::numeric, 3) as variation,
variation_bucket,
round(relevance_score::numeric, 3) as relevance,
relevance_bucket,
created_at
FROM ai_quality_scores ORDER BY created_at DESC LIMIT 20;

Gjennomsnitt per workload (siste 30 dager)

heading.anchorLabel
SELECT workload_type,
count(*) as scores,
round(avg(variation_score)::numeric, 3) as avg_variation,
round(avg(relevance_score)::numeric, 3) as avg_relevance
FROM ai_quality_scores
WHERE created_at > now() - interval '30 days'
GROUP BY workload_type
ORDER BY avg_variation DESC;

Brukere med lav variasjon (siste 7 dager)

heading.anchorLabel
SELECT user_id, workload_type,
count(*) as repetitive_count
FROM ai_quality_scores
WHERE variation_bucket IN ('low', 'repetitive')
AND created_at > now() - interval '7 days'
GROUP BY user_id, workload_type
HAVING count(*) >= 3
ORDER BY repetitive_count DESC;

Prompt-versjon-sammenligning

heading.anchorLabel
SELECT prompt_fingerprint,
count(*) as scores,
round(avg(variation_score)::numeric, 3) as avg_variation,
round(avg(relevance_score)::numeric, 3) as avg_relevance
FROM ai_quality_scores
WHERE workload_type = 'check_in_assess'
GROUP BY prompt_fingerprint
ORDER BY avg_relevance DESC;
apps/api/src/ai/quality/
├── buckets.ts # Score → bucket klassifisering
├── extract.ts # Tekst-ekstraksjon fra strukturerte AI-outputs
├── measure.ts # Kjernelogikk: embed → sammenlign → lagre
└── index.ts # Public API + QualityConfig type

Designdokument

heading.anchorLabel

Komplett designdokument med kostnadsanalyse, rollout-plan, og fremtidige dashboards: docs/design/ai-quality-measurement-system.md