Add /ultraresearch-local for structured research combining local codebase analysis with external knowledge via parallel agent swarms. Produces research briefs with triangulation, confidence ratings, and source quality assessment. New command: /ultraresearch-local with modes --quick, --local, --external, --fg. New agents: research-orchestrator (opus), docs-researcher, community-researcher, security-researcher, contrarian-researcher, gemini-bridge (all sonnet). New template: research-brief-template.md. Integration: --research flag in /ultraplan-local accepts pre-built research briefs (up to 3), enriches the interview and exploration phases. Planning orchestrator cross-references brief findings during synthesis. Design principle: Context Engineering — right information to right agent at right time. Research briefs are structured artifacts in the pipeline: ultraresearch → brief → ultraplan --research → plan → ultraexecute. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
294 lines
12 KiB
Markdown
294 lines
12 KiB
Markdown
# Citation Tracking and Source Attribution
|
||
|
||
**Last updated:** 2026-02
|
||
**Status:** GA (classic RAG), Preview (agentic retrieval)
|
||
**Category:** RAG Architecture & Semantic Search
|
||
|
||
---
|
||
|
||
## Introduksjon
|
||
|
||
Citation tracking er en kritisk komponent i enterprise RAG-systemer. Det handler om å spore og eksponere kildene som ligger til grunn for AI-genererte svar, slik at brukere kan verifisere informasjonen. I Azure-økosystemet støttes citation tracking gjennom to hovedmønstre: **Classic RAG** (GA) med Azure AI Search og Azure OpenAI, og **Agentic Retrieval** (Preview) med strukturerte grounding data.
|
||
|
||
God citation tracking reduserer hallusinering ved å tvinge LLM-en til å basere seg på hentet kontekst, gir brukerne tillit til svarene, og oppfyller compliance-krav i offentlig sektor der sporbarhet er lovpålagt. Azure AI Search returnerer automatisk kildemetadata med søkeresultater, og Azure OpenAI "On Your Data"-mønsteret inkluderer citation annotations i responser.
|
||
|
||
Agentic Retrieval (preview 2025/2026) representerer neste evolusjon med LLM-assistert query planning, parallelle subqueries, og strukturerte citation-responser med full provenance tracking.
|
||
|
||
## Kjernekomponenter
|
||
|
||
### Citation-formater
|
||
|
||
#### URL Citation Annotations (Azure OpenAI)
|
||
|
||
```python
|
||
for event in stream_response:
|
||
if event.type == "response.output_item.done":
|
||
if event.item.type == "message":
|
||
text_content = event.item.content[-1]
|
||
for annotation in text_content.annotations:
|
||
if annotation.type == "url_citation":
|
||
print(f"URL: {annotation.url}")
|
||
print(f"Start: {annotation.start_index}")
|
||
print(f"End: {annotation.end_index}")
|
||
```
|
||
|
||
#### File Citation Annotations (Assistants API)
|
||
|
||
```python
|
||
message_content = message.content[0].text
|
||
annotations = message_content.annotations
|
||
citations = []
|
||
|
||
for index, annotation in enumerate(annotations):
|
||
message_content.value = message_content.value.replace(
|
||
annotation.text, f' [{index}]'
|
||
)
|
||
if file_citation := getattr(annotation, 'file_citation', None):
|
||
cited_file = client.files.retrieve(file_citation.file_id)
|
||
citations.append(
|
||
f'[{index}] {file_citation.quote} from {cited_file.filename}'
|
||
)
|
||
|
||
message_content.value += '\n' + '\n'.join(citations)
|
||
```
|
||
|
||
### Citation Metadata-elementer
|
||
|
||
| Element | Beskrivelse | Eksempel |
|
||
|---------|-------------|---------|
|
||
| `title` | Dokument- eller kildetittel | "Veileder for offentlige anskaffelser" |
|
||
| `url` | URL til kildedokument | `https://docs.example.com/guide` |
|
||
| `file_id` | Referanse til opplastet fil | `file-abc123` |
|
||
| `snippet` | Relevant utdrag fra kilden | "I henhold til §4..." |
|
||
| `doc_uri` | Dokumentlokasjon | `docs/mlflow/guide.md` |
|
||
| `chunk_id` | Spesifikk chunk-identifikator | `chunk_001` |
|
||
| `relevance_score` | Konfidensverdi | 0.95 |
|
||
| `start_index` / `end_index` | Tekstregion som er grounded | 142 / 287 |
|
||
|
||
### Grounding Data (Agentic Retrieval)
|
||
|
||
```json
|
||
{
|
||
"grounding_data": "Ekstraherte relevante passasjer...",
|
||
"references": [
|
||
{
|
||
"title": "Dokumenttittel",
|
||
"url": "https://...",
|
||
"chunk_id": "chunk_001",
|
||
"relevance_score": 0.95
|
||
}
|
||
],
|
||
"activity": [
|
||
{
|
||
"operation": "subquery_1",
|
||
"tokens_used": 150,
|
||
"latency_ms": 245
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
## Arkitekturmønstre
|
||
|
||
### Mønster 1: Classic RAG med automatisk citation
|
||
|
||
**Flyt:** Query → Azure AI Search → Top-k dokumenter med metadata → LLM med citation-instruks → Svar med fotnoter
|
||
|
||
**Implementering:**
|
||
```python
|
||
template = """
|
||
Answer the following question using only the context below.
|
||
Include citations [1], [2] etc. for each fact.
|
||
Only include information specifically discussed in the context.
|
||
|
||
Question: {question}
|
||
Context: {context}
|
||
"""
|
||
```
|
||
|
||
**Fordeler:**
|
||
- Enkel implementering via Azure OpenAI "On Your Data"
|
||
- Automatisk citation-generering
|
||
- GA-funksjonalitet, produksjonsklart
|
||
|
||
**Ulemper:**
|
||
- LLM kan fremdeles hallusinere citations
|
||
- Krever post-validering av citation-nøyaktighet
|
||
- Begrenset til kontekstvindu-størrelse
|
||
|
||
### Mønster 2: Agentic Retrieval med provenance
|
||
|
||
**Flyt:** Query → LLM query planning → Subqueries → Parallel retrieval → Grounding data + references → LLM → Svar med strukturerte citations
|
||
|
||
**Fordeler:**
|
||
- Full provenance tracking (hvilke subqueries hentet hvilke dokumenter)
|
||
- Strukturert output med references array
|
||
- Activity log for audit og debugging
|
||
- LLM planlegger optimale søk for bedre dekning
|
||
|
||
**Ulemper:**
|
||
- Preview-funksjon, ikke GA ennå
|
||
- Høyere kompleksitet og token-kostnad
|
||
- Ranking tokens gratis kun under initial preview-fase
|
||
|
||
### Mønster 3: Fakta-verifisering med LLM-judge
|
||
|
||
**Flyt:** RAG-svar med citations → Fakta-verifikasjon-agent → Krysssjekk mot kildedokumenter → Verifisert svar
|
||
|
||
```python
|
||
from azure.ai.evaluation import GroundednessProEvaluator
|
||
|
||
groundedness_eval = GroundednessProEvaluator(
|
||
azure_ai_project=project,
|
||
credential=credential,
|
||
threshold=2
|
||
)
|
||
|
||
result = groundedness_eval(
|
||
query="Hva er reglene for offentlige anskaffelser?",
|
||
response="I henhold til anskaffelsesloven §4...",
|
||
context="Anskaffelsesloven §4 sier at..."
|
||
)
|
||
```
|
||
|
||
**Fordeler:**
|
||
- Automatisk validering av citation-nøyaktighet
|
||
- Kan flagge hallusinerte fakta
|
||
- Skalerbar QA-pipeline
|
||
|
||
**Ulemper:**
|
||
- Ekstra LLM-kall = ekstra kostnad
|
||
- LLM-judges er ikke ufeilbarlige
|
||
- Økt latency
|
||
|
||
## Beslutningsveiledning
|
||
|
||
### Når bruke hvilket mønster
|
||
|
||
| Scenario | Anbefaling | Begrunnelse |
|
||
|----------|------------|-------------|
|
||
| Intern kunnskapsbase | Classic RAG med citations | GA, tilstrekkelig for de fleste behov |
|
||
| Publikumstjenester (høy tillit) | Agentic + fakta-verifisering | Sporbarhet og kvalitetssikring er kritisk |
|
||
| Juridisk/medisinsk rådgivning | Alle tre mønstre | Maksimal grounding og verifisering |
|
||
| Intern chatbot | Classic RAG | Enklest og billigst |
|
||
| Compliance-rapportering | Agentic med full audit log | Activity-loggen dokumenterer hele søkeprosessen |
|
||
|
||
### Vanlige feil
|
||
|
||
1. **Ikke validere citations post-generering** — LLM-er kan generere plausible men feilaktige kildereferanser
|
||
2. **Mangle chunk-til-dokument-mapping** — Brukere trenger å navigere til kilden, ikke bare se en chunk-ID
|
||
3. **Ignorere konfidensscoring** — Vis ikke citations med lav relevance_score som primærkilde
|
||
4. **Glemme tilgangskontroll** — Citations til dokumenter brukeren ikke har tilgang til er en sikkerhetsfeil
|
||
|
||
### Røde flagg
|
||
|
||
- Citations som peker til ikke-eksisterende dokumenter → Hallusinering i citation-genereringen
|
||
- Høy andel scores under 0.5 → Dårlig retrieval-kvalitet, ikke kun citation-problem
|
||
- Brukere som rapporterer at citations ikke stemmer → Trenger fakta-verifiseringslagret
|
||
|
||
## Konfidensscoring
|
||
|
||
### Tilgjengelige scoring-mekanismer
|
||
|
||
| Mekanisme | Skala | Kilde |
|
||
|-----------|-------|-------|
|
||
| Semantic Ranking | 0.0–4.0 | Azure AI Search |
|
||
| Vector Similarity (Cosine) | 0.333–1.0 | Azure AI Search |
|
||
| Groundedness Pro | Threshold-basert | Azure AI Content Safety |
|
||
| Semantic Answer Confidence | 70% terskel | Azure AI Search |
|
||
| Custom relevance_score | 0.0–1.0 | Applikasjonskode |
|
||
|
||
### Anbefalte terskelverdier for RAG
|
||
|
||
| Terskelverdi | Handling |
|
||
|-------------|---------|
|
||
| rerankerScore ≥ 3.0 | Vis citation med høy konfidensindikator |
|
||
| rerankerScore 2.0–3.0 | Vis citation med moderat konfidensindikator |
|
||
| rerankerScore < 2.0 | Utelat fra primærcitations, men behold i "Se også" |
|
||
| relevance_score < 0.5 | Ikke vis som citation |
|
||
|
||
## Integrasjon med Microsoft-stakken
|
||
|
||
| Tjeneste | Rolle i citation tracking |
|
||
|----------|--------------------------|
|
||
| **Azure AI Search** | Primær retrieval med metadata og scores |
|
||
| **Azure OpenAI** | LLM-generering med citation annotations |
|
||
| **Azure AI Foundry** | Evaluering av groundedness og citation-kvalitet |
|
||
| **MLflow** | Tracing og observerbarhet for citation pipeline |
|
||
| **Azure AI Content Safety** | Groundedness-deteksjon med korreksjonsfunksjon |
|
||
| **Copilot Studio** | Automatisk citation i Copilot-svar |
|
||
|
||
## Offentlig sektor (Norge)
|
||
|
||
### Lovmessige krav
|
||
- **Forvaltningsloven:** Vedtak skal begrunnes med referanse til relevant regelverk
|
||
- **Offentleglova:** Innsynsrett krever sporbar saksbehandling
|
||
- **AI Act:** Transparenskrav for AI-systemer i offentlig forvaltning
|
||
- **Arkivloven:** Dokumentasjon av beslutningsgrunnlag
|
||
|
||
### Praktiske implikasjoner
|
||
- Citations er ikke bare "nice to have" — de er juridisk nødvendige i mange offentlige kontekster
|
||
- Audit trail (agentic retrieval activity log) kan brukes som dokumentasjon for tilsyn
|
||
- Brukere i offentlig sektor forventer å kunne klikke seg gjennom til kildedokumentet
|
||
|
||
### Sikkerhet
|
||
- Dokumentnivå-sikkerhet (RBAC) må filtrere citations basert på brukeridentitet
|
||
- Sensitive dokumenter skal ikke siteres til brukere uten tilgang
|
||
- Implement security trimming i Azure AI Search før citations eksponeres
|
||
|
||
## Kostnad og lisensiering
|
||
|
||
### Komponenter som påvirker kostnad
|
||
|
||
| Komponent | Kostnadsdriver |
|
||
|-----------|---------------|
|
||
| Azure AI Search | Standard spørringskostnad (ingen ekstra for metadata) |
|
||
| Semantic Ranker | Per 1000 requests (1000 gratis/mnd) |
|
||
| Azure OpenAI | Token-kostnad for citation-generering i LLM-respons |
|
||
| Agentic Retrieval | Ranking tokens (gratis under preview), Azure OpenAI for query planning |
|
||
| Groundedness Pro | Per evaluerings-kall (Azure AI Content Safety) |
|
||
|
||
### Kostnadsoptimering
|
||
- Returner kun citation-relevante felt via `select` for å redusere token-bruk
|
||
- Bruk caching for gjentatte queries med samme citations
|
||
- Evaluer groundedness kun for brukervendte svar, ikke interne prosesser
|
||
- Begrens antall citations per svar (3–5 er typisk tilstrekkelig)
|
||
|
||
## For arkitekten (Cosmo)
|
||
|
||
### Spørsmål å stille kunden
|
||
1. Har dere lovmessige krav til sporbarhet og kildehenvisning?
|
||
2. Skal brukerne kunne navigere direkte til kildedokumentene?
|
||
3. Hvilken grad av konfidensindikasjon trenger brukerne?
|
||
4. Er det behov for audit trail av hele retrieval-prosessen?
|
||
5. Har dokumentene ulik sikkerhetsgraddering som påvirker citation-eksponering?
|
||
6. Hva er akseptabel feilrate for citations (hallusinerte kilder)?
|
||
7. Trengs fakta-verifisering, eller er standard citation tilstrekkelig?
|
||
8. Hvordan chunkes dokumentene — trengs chunk-til-dokument navigering?
|
||
|
||
### Fallgruver
|
||
- Å anta at LLM-genererte citations alltid er korrekte — de er ikke det
|
||
- Å eksponere chunk-IDer i brukergrensesnittet uten å mappe dem til lesbare dokumentreferanser
|
||
- Å bruke agentic retrieval i produksjon uten å forstå at det er preview
|
||
- Å ignorere tilgangskontroll i citation-laget — dette er et vanlig sikkerhetshull
|
||
|
||
### Anbefalinger per modenhetsnivå
|
||
| Nivå | Anbefaling |
|
||
|------|------------|
|
||
| **Starter** | Classic RAG med Azure OpenAI "On Your Data" citation |
|
||
| **Intermediær** | Custom citation-formatering, konfidensscoring, chunk-til-dokument mapping |
|
||
| **Avansert** | Agentic retrieval med provenance, fakta-verifisering, audit logging |
|
||
|
||
## Kilder og verifisering
|
||
|
||
### Verified (MCP-research)
|
||
- [RAG overview in Azure AI Search](https://learn.microsoft.com/en-us/azure/search/retrieval-augmented-generation-overview)
|
||
- [Agentic retrieval overview](https://learn.microsoft.com/en-us/azure/search/agentic-retrieval-overview)
|
||
- [Transparency note for Azure AI Search](https://learn.microsoft.com/en-us/azure/ai-foundry/responsible-ai/search/transparency-note)
|
||
- [Grounding data design](https://learn.microsoft.com/en-us/azure/well-architected/ai/grounding-data-design)
|
||
- [Azure AI Foundry agents - AI Search tools](https://learn.microsoft.com/en-us/azure/ai-foundry/agents/how-to/tools/ai-search)
|
||
|
||
### Baseline (modellkunnskap)
|
||
- Norsk lovgivning (Forvaltningsloven, Offentleglova, Arkivloven)
|
||
- Kostnadsoptimerings-anbefalinger
|
||
- Modenhetsnivå-tabellen
|