# Self-Reflective RAG — Selvevaluerende retrieval

**Last updated:** 2026-02
**Status:** GA (Azure AI Foundry evaluators), Preview (agentic retrieval)
**Category:** RAG Architecture & Semantic Search

---

## Introduksjon

Self-Reflective RAG er en arkitektur der systemet evaluerer og raffinerer sine egne retrieval-beslutninger i en iterativ loop. I tradisjonell RAG aksepteres retrieved chunks ukritisk — selv når de er irrelevante eller utilstrekkelige. Self-reflective RAG innfører en evalueringsmekanisme som scorer retrieved dokumenter og trigger re-retrieval, query-reformulering eller fallback-strategier ved lav confidence.

To fremtredende forskningsbidrag definerer feltet: **CRAG (Corrective RAG)** bruker en lightweight evaluator som returnerer confidence-grader (Correct/Incorrect/Ambiguous) for å trigge korrektive handlinger, og **Self-RAG** der modellen kritiserer og verifiserer sine egne outputs under generering.

Azure AI Foundry tilbyr innebygde evaluatorer for RAG quality assessment (groundedness, relevance, coherence — alle 1-5 skala) som kan integreres i en feedback loop. Azure AI Search agentic retrieval (preview) forbedrer retrieval-relevans med opptil 40% gjennom LLM-assistert query planning.

---

## Kjernekomponenter

### CRAG-arkitektur

| Komponent | Beskrivelse | Handling |
|-----------|-------------|---------|
| **Retrieval Evaluator** | Scorer retrieved dokumenter | Confidence: Correct / Incorrect / Ambiguous |
| **Correct (høy confidence)** | Dokumenter er relevante | Gå direkte til generering |
| **Ambiguous (middels)** | Delvis relevante | Decompose-then-recompose: filtrer irrelevant innhold |
| **Incorrect (lav confidence)** | Dokumenter er irrelevante | Re-retrieve med reformulert query eller web search fallback |

### Azure AI Foundry evaluatorer

| Evaluator | Type | Scoring | Bruksområde |
|-----------|------|---------|-------------|
| **Retrieval** | Prosess | 1-5 Likert | Query-context relevans (uten ground truth) |
| **Groundedness** | System | 1-5 Likert | Response alignment med context (precision) |
| **Groundedness Pro** | System | Binary | Strikt consistency via Azure AI Content Safety |
| **Relevance** | System | 1-5 Likert | Response adresserer query fullstendig |
| **Response Completeness** | System | 1-5 Likert | Response dekker all kritisk info (recall) |
| **Document Retrieval** | Prosess | NDCG, XDCG | Krever ground truth labels |

### Self-reflective loop

```
Query → Initial Retrieval → Evaluering
  ├─ Score ≥ threshold → Generer svar → Groundedness-check
  │   ├─ Grounded → Returner svar
  │   └─ Ikke grounded → Re-generate med justert prompt
  └─ Score < threshold → Query reformulering → Re-retrieval → Evaluering
```

---

## Arkitekturmønstre

### Mønster 1: CRAG med Azure AI Foundry evaluators

**Arkitektur:** Query → Azure AI Search → Retrieval Evaluator → [Correct: Generate] / [Ambiguous: Filter + Generate] / [Incorrect: Reformulate + Re-retrieve]

**Implementering:**

```python
from azure.ai.evaluation import RetrievalEvaluator, GroundednessEvaluator

retrieval_eval = RetrievalEvaluator(model_config=model_config, threshold=3)
groundedness_eval = GroundednessEvaluator(model_config=model_config, threshold=3)

# Steg 1: Initial retrieval
results = search_client.search(query, vector_queries=[...], top=5)
context = "\n".join([r["chunk"] for r in results])

# Steg 2: Evaluer retrieval-kvalitet
retrieval_score = retrieval_eval(query=query, context=context)

if retrieval_score["retrieval"] >= 4:  # Correct
    response = generate_response(query, context)
elif retrieval_score["retrieval"] >= 2:  # Ambiguous
    filtered = filter_relevant_passages(context, query)
    response = generate_response(query, filtered)
else:  # Incorrect
    reformulated = reformulate_query(query)
    new_results = search_client.search(reformulated, ...)
    response = generate_response(reformulated, new_results)

# Steg 3: Groundedness-check
grounded = groundedness_eval(
    query=query, context=context, response=response
)
if grounded["groundedness_result"] == "fail":
    response = regenerate_with_stricter_prompt(query, context)
```

**Fordeler:**
- Managed evaluators — ingen custom modelltrening
- Integrert med Azure AI Foundry observability
- Støtter reasoning-modeller (o-series) med `is_reasoning_model=True`

**Anbefalt for:** Produksjonssystemer der svarkvalitet er kritisk.

### Mønster 2: Iterativ query refinement med Semantic Kernel

**Arkitektur:** Agent med OnDemandFunctionCalling → Søk → Evaluer → Reformuler → Søk igjen

**Implementering (C#):**

```csharp
var options = new TextSearchProviderOptions
{
    SearchTime = RagBehavior.OnDemandFunctionCalling,
    Top = 5,
    PluginFunctionName = "SearchKnowledge"
};

ChatCompletionAgent agent = new()
{
    Name = "ReflectiveAssistant",
    Instructions = """
    Before answering, search for relevant information.
    After retrieving results, assess if they are sufficient.
    If not, reformulate your search query and try again.
    Maximum 3 search attempts per question.
    Always cite your sources.
    """,
    Kernel = kernel,
    UseImmutableKernel = true
};
```

**Fordeler:**
- Agent styrer iterativ loop naturlig via instruksjoner
- Fleksibel — kan tilpasses domene-spesifikke evalueringskriterier
- Integrert med Semantic Kernel ecosystem

**Anbefalt for:** Code-first teams som vil ha full kontroll over refleksjon-logikken.

### Mønster 3: Parameter sweep-optimalisering

**Arkitektur:** Systematisk testing av retrieval-parametere mot golden metrics

**Prosess:**
1. Definer golden metrics (XDCG, Fidelity, NDCG)
2. Opprett ground truth labels (human eller LLM-basert)
3. Kjør parameter sweep over re-ranker thresholds, target indices, knowledge sources
4. Velg optimal konfigurasjon basert på groundedness + relevance scores

**Azure AI Foundry-støtte:**

| Metric | Formål |
|--------|--------|
| **Max Relevance N** | Maks relevans-score i top-k chunks |
| **XDCG** | Resultatkvalitet innenfor top-k dokumenter |
| **Fidelity** | Hvor nøyaktig retrieval matcher ground truth |

**Anbefalt for:** Enterprise-teams med ground truth-data og kapasitet til systematisk evaluering.

---

## Beslutningsveiledning

### Beslutningstabell

| Scenario | Anbefalt mønster | Begrunnelse |
|----------|------------------|-------------|
| Kritisk svarkvalitet (helse, jus) | Mønster 1 (CRAG + evaluators) | Systematisk kvalitetssikring |
| Code-first team | Mønster 2 (SK iterativ) | Full kontroll, fleksibelt |
| Ground truth tilgjengelig | Mønster 3 (parameter sweep) | Kvantitativ optimalisering |
| Kostnadsbevisst | Mønster 2 med max 2 iterasjoner | Begrens LLM-kall |

### Vanlige feil

| Feil | Konsekvens | Løsning |
|------|------------|---------|
| Uendelig refleksjon-loop | Høy kostnad, timeout | Sett maks iterasjoner (2-3) |
| Threshold for lav | Alle retrievals trigges som «incorrect» | Start med threshold=3, kaliber |
| Kun groundedness uten relevance | Grounded men irrelevante svar | Kombiner groundedness + relevance |
| Ingen baseline-metrics | Umulig å vite om refleksjon hjelper | Mål metrics FØR og ETTER |

### Røde flagg

- Self-reflective RAG for enkle FAQ-systemer (overkill)
- Ingen logging av evaluator-scorer over tid
- Refleksjon uten mål (ingen metrics å optimalisere mot)
- Groundedness Pro i produksjon uten fallback (avhengig av Content Safety API)

---

## Integrasjon med Microsoft-stakken

| Tjeneste | Integrasjonspunkt |
|----------|-------------------|
| **Azure AI Foundry** | Innebygde evaluatorer (Groundedness, Relevance, Retrieval) |
| **Azure AI Search** | Retrieval backend + agentic retrieval (preview) |
| **Semantic Kernel** | OnDemandFunctionCalling for iterativ retrieval |
| **Azure OpenAI** | GPT-4o for evaluering og generering |
| **Application Insights** | Logging av evaluator-scorer, iterasjoner, latency |
| **Azure AI Content Safety** | Groundedness Pro (binary consistency check) |

---

## Offentlig sektor (Norge)

### Dataplassering

- **Azure AI Foundry evaluators:** Kjøres via Azure OpenAI (Sweden Central) — data i EU/EØS
- **Azure AI Content Safety:** Sjekk regional tilgjengelighet for Groundedness Pro

### Relevante vurderinger

| Krav | Implikasjon |
|------|-------------|
| **AI Act** | Self-reflective mekanismer støtter krav om robusthet og pålitelighet |
| **Forvaltningsloven** | Evaluator-logger dokumenterer beslutningsgrunnlag |
| **GDPR** | Evaluator-kall behandler brukerdata — databehandleravtale |
| **NSM** | Grading-krav → on-premises evaluering for gradert info |

---

## Kostnad og lisensiering

### Kostnadskomponenter

| Komponent | Kostnad per query | Notat |
|-----------|-------------------|-------|
| Initial retrieval | ~0.5 NOK | Standard search + embedding |
| Retrieval evaluator (GPT-4o) | ~0.3 NOK | LLM-basert scoring |
| Groundedness evaluator | ~0.3 NOK | LLM-basert scoring |
| Re-retrieval (ved feil) | ~0.5 NOK | Trigges i ~20-30% av queries |
| **Gjennomsnittlig total** | ~1.5-2.5 NOK | vs. ~1 NOK for standard RAG |

### ROI-vurdering

Hvis self-reflective RAG reduserer feilaktige svar fra 15% til 5%:
- Kostnad: +50-150% per query
- Gevinst: 10% færre feilaktige svar → redusert manuell korreksjon, høyere tillit

---

## For arkitekten (Cosmo)

### Spørsmål å stille kunden

1. **"Hva er konsekvensen av feil svar?"** — Høy konsekvens (helse, jus) → self-reflective RAG
2. **"Har dere ground truth-data?"** — Ja → parameter sweep, nei → LLM-basert evaluering
3. **"Hva er akseptabel ekstra latency?"** — Self-reflection = 1-3 ekstra LLM-kall
4. **"Trenger dere audit trail for beslutninger?"** — Evaluator-logger dekker dette
5. **"Har dere kapasitet til å kalibrere thresholds?"** — Krever iterativ tuning

### Fallgruver

- **Evaluator som gospel:** LLM-baserte evaluatorer har selv feilrate — bruk som signal, ikke absolutthet
- **Over-refleksjon:** Mer enn 3 iterasjoner gir sjelden bedre svar, men øker kostnad drastisk
- **Glemmer menneske-i-loopen:** Self-reflective er ikke det samme som feilfri

### Anbefalinger per modenhetsnivå

| Modenhet | Anbefaling |
|----------|------------|
| **Prototyp** | Standard RAG. Mål baseline groundedness og relevance. |
| **Pilot** | Legg til Groundedness evaluator post-generation. Logg scores. |
| **Produksjon** | CRAG-mønster med retrieval + groundedness evaluering. Max 2 iterasjoner. |
| **Enterprise** | Full parameter sweep + automated threshold-kalibrering + A/B-testing. |

---

## Kilder og verifisering

| Kilde | Konfidens | URL |
|-------|-----------|-----|
| RAG Evaluators (Azure AI Foundry) | **Verified** | [learn.microsoft.com](https://learn.microsoft.com/en-us/azure/ai-foundry/concepts/evaluation-evaluators/rag-evaluators) |
| RAG LLM Evaluation Phase | **Verified** | [learn.microsoft.com](https://learn.microsoft.com/en-us/azure/architecture/ai-ml/guide/rag/rag-llm-evaluation-phase) |
| Semantic Kernel Agent RAG | **Verified** | [learn.microsoft.com](https://learn.microsoft.com/en-us/semantic-kernel/frameworks/agent/agent-rag) |
| Corrective RAG (CRAG) paper | **Verified** | [arxiv.org](https://arxiv.org/abs/2401.15884) |
| Evaluating RAG Agents (MS Tech Community) | **Verified** | [techcommunity.microsoft.com](https://techcommunity.microsoft.com/blog/azure-ai-foundry-blog/the-future-of-ai-evaluating-and-optimizing-custom-rag-agents-using-azure-ai-foun/4455215) |
| Azure AI Search agentic retrieval (40% improvement) | **Baseline** | [infoq.com](https://www.infoq.com/news/2025/05/azure-ai-search-agent-retrieval/) |
