feat(ultraplan-local): v1.6.0 — /ultraresearch-local deep research command

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>
This commit is contained in:
Kjell Tore Guttormsen 2026-04-08 08:58:35 +02:00
commit baa2d0220b
488 changed files with 213221 additions and 0 deletions

View file

@ -0,0 +1,413 @@
# Language Services - Text Analytics for Sentiment and Key Phrases
**Last updated:** 2026-02
**Status:** GA
**Category:** Azure AI Services (Foundry Tools)
---
## Introduksjon
Azure AI Language er en samling av forhåndsopplærte språkmodeller som gjør det mulig å utføre avansert tekstanalyse uten å bygge egne maskinlæringsmodeller. Tjenesten tilbyr flere kjernekapabiliteter for text analytics: **Sentiment Analysis** (med opinion mining), **Key Phrase Extraction**, **Named Entity Recognition (NER)**, og **Language Detection**.
Disse kapabilitetene er tilgjengelige både som cloud-baserte REST API-er, SDK-er (C#, Java, Python, JavaScript), og Docker-containere for on-premises deployment. Tjenesten integreres sømløst med Azure AI Foundry, Azure Synapse Analytics, Power BI, og Microsoft Fabric, noe som gjør den egnet for både interactive playgrounds og produksjonsworkflows.
Text analytics-funksjonene er stateless — ingen data lagres i kontoen din, og resultater returneres umiddelbart etter analyse. For batch-operasjoner er resultatene tilgjengelige i 24 timer før de slettes automatisk. Tjenesten støtter 94+ språk for key phrase extraction, med bred språkstøtte også for sentiment analysis og NER.
---
## Kjernekomponenter / Nøkkelegenskaper
### Sentiment Analysis
Analyserer tekst og returnerer sentiment labels (`positive`, `negative`, `neutral`, `mixed`) med confidence scores (0–1) på både setnings- og dokumentnivå.
| Funksjonalitet | Beskrivelse |
|----------------|-------------|
| **Sentiment labels** | Positive, negative, neutral (setningsnivå); mixed tilgjengelig på dokumentnivå |
| **Confidence scores** | 0.0–1.0 per label (summer alltid til 1.0) |
| **Opinion Mining** | Identifiserer target-aspect (substantiv/verb) og tilhørende assessment (adjektiv) |
| **Beste use case** | Små tekstblokker (høyere kvalitet enn store) |
| **Språkstøtte** | [Omfattende liste](https://learn.microsoft.com/en-us/azure/ai-services/language-service/sentiment-opinion-mining/language-support) inkl. norsk |
**Eksempel (Opinion Mining):**
```
Input: "The room was great, but the staff was unfriendly."
Output:
- Target: "room" → Assessment: "great" (positive)
- Target: "staff" → Assessment: "unfriendly" (negative)
- Document sentiment: mixed
```
### Key Phrase Extraction
Evaluerer ustrukturert tekst og returnerer en liste over viktigste key phrases.
| Funksjonalitet | Beskrivelse |
|----------------|-------------|
| **Input-optimalisering** | Fungerer best på **større tekstblokker** (motsatt av sentiment) |
| **Output** | Liste med key phrases, sortert av modellens interne ranking |
| **Språkstøtte** | 94 språk (inkl. norsk, samisk, finsk, svensk, dansk) |
| **Use case** | Rask identifikasjon av hovedpoeng i dokumentsamlinger |
**Eksempel:**
```
Input: "Dr. Smith has a very modern medical office, and she has great staff."
Output: ["modern medical office", "Dr. Smith", "great staff"]
```
### Named Entity Recognition (NER)
Identifiserer og kategoriserer entities i tekst (person, lokasjon, organisasjon, dato, etc.).
| Entity-kategori | Typer (eksempler) |
|-----------------|-------------------|
| **Person** | Person, PersonType (rolle) |
| **Organization** | Organization, OrganizationMedical, OrganizationSports, OrganizationStockExchange |
| **Location** | City, CountryRegion, State, GPE (geopolitical entity), Airport, Continent |
| **DateTime** | Date, Time, DateRange, TimeRange, Duration, Set |
| **Quantity** | Number, Percentage, Currency, Age, Temperature, Speed, Weight, Volume, Area, Length |
| **Event** | Event, NaturalEvent, CulturalEvent, SportsEvent |
| **Contact** | Email, PhoneNumber, URL, IpAddress, Address |
| **Product** | Product, ComputingProduct |
| **Other** | Skill, Information |
**Metadata-resolutionsupport:** Mange quantity-entities returnerer strukturert metadata (f.eks. Currency → ISO-kode, normalized verdi).
### Language Detection
Evaluerer tekst og returnerer språk-identifier (ISO 639-1) med confidence score (0.0–1.0).
| Funksjonalitet | Beskrivelse |
|----------------|-------------|
| **Output** | Language name, ISO 6391 code, confidence score |
| **Use case** | Automatisk språkdeteksjon for content stores med mixed-language data |
| **Default** | Engelsk hvis ikke spesifisert |
---
## Arkitekturmønstre
### Mønster 1: REST API med Fabric/Synapse (Batch Processing)
**Use case:** Prosesser store volumer av dokumenter fra data lake (f.eks. kundefeedback, supporttickets).
**Fordeler:**
- Sømløs integrasjon med Azure Storage og Azure AI Search
- SynapseML gir Spark-optimalisert batch processing
- Built-in authentication via Fabric workspace credentials
**Ulemper:**
- Krever Spark-kompetanse for SynapseML
- Batch-mode medfører latency (ikke real-time)
**Eksempel (Fabric REST API):**
```python
# Auto-authenticated via Fabric
payload = {
"kind": "SentimentAnalysis",
"parameters": {"modelVersion": "latest", "opinionMining": "True"},
"analysisInput": {"documents": [{"id": "1", "language": "en", "text": "..."}]}
}
response = requests.post(service_url, json=payload, headers=auth_headers)
```
### Mønster 2: SDK-basert integrasjon (Client Library)
**Use case:** Real-time tekstanalyse i web/mobile apps, chatbots, eller Power Apps.
**Fordeler:**
- Typed responses (C#, Java) reduserer parsing-bugs
- Async support for skalerbare apps
- Enklere feilhåndtering enn raw REST
**Ulemper:**
- SDK versioning (må holde tritt med API-versjoner)
- Større binary footprint enn REST
**Eksempel (C# SDK):**
```csharp
var client = new TextAnalyticsClient(endpoint, new AzureKeyCredential(key));
var response = await client.AnalyzeSentimentAsync("The service was excellent!");
Console.WriteLine($"Sentiment: {response.Value.Sentiment}");
```
### Mønster 3: Docker Container (On-Premises)
**Use case:** Compliance-krav som krever data residency i Norge, eller air-gapped environments.
**Fordeler:**
- Full datakontroll (ingen data sendes til cloud)
- Lav latency (lokal processing)
- Støtter Sentiment, Language Detection, Key Phrase, Custom NER, Text Analytics for Health
**Ulemper:**
- Krever egne compute-ressurser (CPU/minne)
- Ingen automatiske modelloppdateringer (må manuelt oppdatere container images)
- Free F0 tier støttes ikke (kun Standard S tier)
---
## Beslutningsveiledning
### Når bruke Sentiment Analysis vs. Opinion Mining
| Scenario | Anbefaling |
|----------|-----------|
| Trenger kun overordnet positive/negative/neutral? | **Sentiment Analysis** (uten opinion mining-flag) |
| Må identifisere *hva* kunder liker/misliker? | **Opinion Mining** (sett `opinionMining=true`) |
| Analyserer produktanmeldelser med attributter? | **Opinion Mining** (target = produkt-feature, assessment = vurdering) |
### Vanlige feil
| Feil | Løsning |
|------|---------|
| Lav kvalitet på sentiment for lange dokumenter | Del opp tekst i mindre chunks (maks 5000 tegn per record) |
| Key phrases mangler kontekst | Gi større tekstblokker (key phrase fungerer bedre på større input enn sentiment) |
| NER feiltolker domene-spesifikke entities | Vurder Custom NER (trener egen modell på dine data) |
| Mixed sentiment når både positive og negative setninger | Dette er forventet — bruk Opinion Mining for granularitet |
### Røde flagg
- **Ikke bruk** for medisinsk diagnostikk (selv om Text Analytics for Health finnes — krever spesialistkompetanse)
- **Ikke bruk** for PII-deteksjon i produksjon uten også å enable [PII Detection feature](https://learn.microsoft.com/en-us/azure/ai-services/language-service/personally-identifiable-information/overview)
- **Ikke bruk** default English language hvis du vet teksten er på andre språk (spesifiser `language` parameter)
### Beslutningstabell: SDK vs. REST vs. Container
| Krav | SDK | REST API | Container |
|------|-----|----------|-----------|
| Real-time app-integrasjon | ✅ Beste valg | ⚠️ Fungerer, mer boilerplate | ❌ Overkill |
| Batch processing (millioner dokumenter) | ⚠️ Mulig, men batch APIs bedre | ✅ Med SynapseML | ⚠️ Infrastruktur-overhead |
| Data residency krav (Norge) | ❌ Må bruke EU-regioner | ❌ Må bruke EU-regioner | ✅ Full kontroll |
| Lavest kostnads-overhead | ✅ Pay-per-call | ✅ Pay-per-call | ⚠️ Egen infrastruktur |
---
## Integrasjon med Microsoft-stakken
### Azure AI Foundry
Language Services er integrert i Foundry Playground med visuell testing av sentiment, key phrases, og NER uten kode.
**Workflow:**
1. Opprett Language resource i Foundry
2. Velg "Analyze sentiment" eller "Key phrase extraction" fra banneret
3. Lim inn tekst, velg API-versjon, språk, og kjør
4. Se resultater med confidence scores og opinion mining-targets
### Power BI
Power BI Desktop kan integrere direkte med Key Phrase Extraction via Power Query custom functions.
**Use case:** Analyser kundefeedback fra Excel/CSV, visualiser key phrases som word cloud.
**Tutorial:** [Extract key phrases from Power BI](https://learn.microsoft.com/en-us/azure/ai-services/language-service/key-phrase-extraction/tutorials/integrate-power-bi)
### Azure Synapse Analytics / Microsoft Fabric
SynapseML (tidligere MMLSpark) gir native Spark support for Language Services.
**Fordeler:**
- Batch processing av DataFrames
- Auto-authentication i Fabric notebooks (ingen API keys nødvendig)
- Sømløs integrasjon med lakehouse data
**Eksempel (SynapseML for Key Phrases):**
```python
from synapse.ml.cognitive.language import AnalyzeText
model = AnalyzeText().setTextCol("text").setKind("KeyPhraseExtraction")
result = model.transform(df).select("text", "keyPhrases")
```
### Copilot Studio
Language Services kan brukes i custom Copilot Studio skills for å analysere brukersentiment i conversations før routing til riktig agent.
**Use case:** Automatisk eskaler negative sentiment til human agent, neutral til FAQ bot.
### Azure Cognitive Search
Language Services entities kan indekseres i Azure AI Search som facets, noe som muliggjør entity-basert search filtering (f.eks. "finn dokumenter om Microsoft som organisasjon").
---
## Offentlig sektor (Norge)
### GDPR og Schrems II
| Risiko | Mitigering |
|--------|-----------|
| Data sendes til Azure EU-regioner (Vest-Europa, Nord-Europa) | ✅ Bruk EU-regioner for Language resource |
| Potensielle concerns om US Cloud Act | ✅ Bruk Docker containers on-premises for følsom data |
| PII i tekst (personnummer, navn, e-post) | ✅ Anonymiser først, eller bruk PII Detection-feature |
| Data retention i 24 timer (batch mode) | ✅ Synkron modus lagrer ikke data (stateless) |
### AI Act (EU)
Language Services klassifiseres som **lav-risiko AI** (ikke høyrisiko) så lenge det ikke brukes til:
- Biometric identification
- Critical infrastructure
- Law enforcement (uten human oversight)
**Krav:**
- Dokumenter hvordan sentiment/entity detection brukes
- Vurder bias (trent på hovedsakelig engelske datasett, kan være mindre nøyaktig for norsk)
### Forvaltningsloven og transparens
Ved bruk i saksbehandling:
- **Ikke la sentiment score alene avgjøre saker** (kun som beslutningsstøtte)
- **Logg alle analyser** (hvem, hva, når, resultat) for etterprøvbarhet
- **Informer brukere** hvis deres tekst analyseres (f.eks. feedback-forms)
### Datasuverenitet
**Azure Norway datacenters** (Oslo, Stavanger) støtter ikke Language Services per 2026-02. Nærmeste regioner:
- **West Europe** (Nederland)
- **North Europe** (Irland)
For full datasuverenitet: **Bruk Docker containers** (Sentiment, Language Detection, Key Phrase, Custom NER) hosted i Norge.
---
## Kostnad og lisensiering
### Prismodell (Azure Language)
Language Services bruker **pay-per-call** modell (per text record).
| Tier | Pris per 1000 text records | Bruksscenario |
|------|----------------------------|---------------|
| **Free F0** | 0 NOK (5000 gratis/måned) | Testing, POC, lav-volum apps |
| **Standard S** | Varierer per region (~$1–2 USD / 1000 records) | Produksjon |
**Viktige detaljer:**
- **Maks 5000 tegn per record** (større dokumenter må splittes)
- **Opinion Mining** inkludert i Standard tier (ingen ekstra kostnad)
- **Batch mode** (asynchronous) har samme pris som synchronous
- **Docker containers** krever Standard tier (Free F0 støttes ikke)
### Kostnadseksempel (norsk offentlig virksomhet)
**Scenario:** Analyserer 100 000 brukerhenvendelser/måned med sentiment + key phrases (2 API-kall per henvendelse).
| Komponent | Kostnad (estimat) |
|-----------|-------------------|
| 200 000 text records × $1.50 / 1000 | $300 USD/måned (~3200 NOK) |
| Azure Language resource (S tier) | Ingen fast månedskostnad (kun per-call) |
| Azure Storage (hvis batch mode) | ~$20 USD/måned for 1TB (~210 NOK) |
| **Total** | **~3400 NOK/måned** |
### Optimaliseringstips
1. **Batch asynkront** — Hvis du kan vente 24 timer, bruk asynchronous API (ingen prisforskjell, men enklere infrastruktur)
2. **Filtrer ut tom tekst** — Ikke send records uten innhold (koster like mye som reelle records)
3. **Kombiner features i én request** — Sentiment + Key Phrases + Entities kan kjøres i én `analyze-text` call (sparer HTTP-overhead, ikke pris)
4. **Bruk containers for høy-volum** — Hvis >1M records/måned, vurder self-hosted containers med Reserved VM Instances
---
## For arkitekten (Cosmo)
### Spørsmål å stille kunden
1. **Volum og latency:**
- Hvor mange dokumenter skal analyseres (per dag/måned)?
- Kreves real-time respons (<500ms) eller er batch OK (24t)?
2. **Språk og multispråklighet:**
- Er all tekst på norsk, eller blandet språk?
- Trenger dere automatisk språkdeteksjon?
3. **Datakompleksitet:**
- Er tekstene lange (>5000 tegn) eller korte (f.eks. tweets, SMS)?
- Inneholder teksten sensitive personopplysninger (navn, personnummer)?
4. **Detaljnivå:**
- Trenger dere kun overordnet sentiment, eller må dere vite *hva* som er positivt/negativt (opinion mining)?
- Skal entities kobles til eksterne knowledge bases (entity linking)?
5. **Infrastruktur og compliance:**
- Kan data sendes til Azure EU-regioner, eller kreves on-premises?
- Har dere eksisterende Azure Synapse / Fabric infrastructure?
6. **Integrasjoner:**
- Skal resultatene visualiseres i Power BI, eller bare lagres i database?
- Brukes det i en eksisterende app (web/mobile), eller ny løsning?
7. **Fremtidig utvidelse:**
- Vil dere senere trenge custom entities (f.eks. organisasjonsspesifikke termer)?
- Planlegges det translation workflows (Azure Translator integrasjon)?
### Fallgruver
| Fallgruve | Forklaring | Mitigering |
|-----------|------------|------------|
| **"Sentiment = sannhet"** | Sentiment score er en prediktering, ikke en fasit | Alltid ha human-in-the-loop for kritiske beslutninger |
| **Overfitting til engelsk** | Modellen er best på engelsk, kan være mindre presis på norsk | Test med representative norske datasett før produksjon |
| **Ignorere PII** | Key phrases kan inneholde personnavn eller sensitiv info | Kjør PII Detection først, eller anonymiser tekst før analyse |
| **Glemme cost caps** | Per-call pricing kan eskalere ved bugs (infinite loops) | Sett Azure Cost Management alerts på Language resource |
| **Forvente perfekt NER** | NER kan feiltolke domene-spesifikke entities | Vurder Custom NER hvis standard entities ikke er presise nok |
### Anbefalinger per modenhetsnivå
#### Nivå 1: Exploring (POC, <1000 records/måned)
- **Anbefaling:** Free F0 tier + Azure AI Foundry Playground
- **Verktøy:** REST API via Postman eller Foundry web UI
- **Fokus:** Teste om sentiment/key phrases gir verdi for use case
- **Advarsler:** Ikke bygg produksjonsapp på Free tier (5000 records/mnd cap)
#### Nivå 2: Building (Pilot, 1000–100K records/måned)
- **Anbefaling:** Standard S tier + SDK (C#/Python) + Azure App Service
- **Verktøy:** Azure Language SDK, Application Insights for monitoring
- **Fokus:** Real-time integrasjon i app, feilhåndtering, retry-logikk
- **Advarseler:** Implementer circuit breaker pattern (unngå API throttling ved 429 errors)
#### Nivå 3: Scaling (Produksjon, >100K records/måned)
- **Anbefaling:** Standard S tier + SynapseML / Fabric + Batch API
- **Verktøy:** Azure Synapse Pipelines, Azure Data Lake, Azure AI Search (for entity indexing)
- **Fokus:** Batch processing, cost optimization, data governance
- **Advarseler:** Vurder Docker containers hvis kostnad >$1000/måned
#### Nivå 4: Optimizing (Enterprise, >1M records/måned)
- **Anbefaling:** Docker containers on Azure Kubernetes Service (AKS) + Custom NER
- **Verktøy:** AKS, Azure Monitor, Custom Text Classification (Language Studio)
- **Fokus:** Self-hosted inference, custom models for domene-spesifikke entities
- **Advarsler:** Container-licensing krever Standard tier — test kostnad mot cloud API
---
## Kilder og verifisering
### Microsoft Learn-dokumentasjon (Verified via MCP)
| Kategori | URL | Konfidensnivå |
|----------|-----|---------------|
| **Sentiment Analysis Overview** | https://learn.microsoft.com/en-us/azure/ai-services/language-service/sentiment-opinion-mining/overview | ✅ Verified (2026-02) |
| **Sentiment Analysis How-To** | https://learn.microsoft.com/en-us/azure/ai-services/language-service/sentiment-opinion-mining/how-to/call-api | ✅ Verified (2026-02) |
| **Key Phrase Extraction How-To** | https://learn.microsoft.com/en-us/azure/ai-services/language-service/key-phrase-extraction/how-to/call-api | ✅ Verified (2026-02) |
| **NER Entity Categories** | https://learn.microsoft.com/en-us/azure/ai-services/language-service/named-entity-recognition/concepts/named-entity-categories | ✅ Verified (2026-02) |
| **Fabric Text Analytics** | https://learn.microsoft.com/en-us/fabric/data-science/ai-services/how-to-use-text-analytics | ✅ Verified (2026-02) |
| **Key Phrase Language Support** | https://learn.microsoft.com/en-us/azure/ai-services/language-service/key-phrase-extraction/language-support | ✅ Verified (2026-02) |
| **Sentiment Language Support** | https://learn.microsoft.com/en-us/azure/ai-services/language-service/sentiment-opinion-mining/language-support | ✅ Verified (2026-02) |
| **Custom Text Classification** | https://learn.microsoft.com/en-us/azure/ai-services/language-service/custom-text-classification/overview | ✅ Verified (2026-02) |
### Konfidensnivå per seksjon
| Seksjon | Konfidens | Kilde |
|---------|-----------|-------|
| Introduksjon | ✅ Verified | Microsoft Learn docs (MCP-fetched) |
| Kjernekomponenter | ✅ Verified | REST API examples + model outputs fra docs |
| Arkitekturmønstre | ✅ Verified | Fabric tutorial + Synapse docs + SDK samples |
| Beslutningsveiledning | ⚠️ Baseline | Best practices (modellkunnskap), ikke eksplisitt dokumentert |
| Integrasjon med MS-stakken | ✅ Verified | Power BI tutorial + SynapseML docs + Foundry quickstarts |
| Offentlig sektor (Norge) | ⚠️ Baseline | GDPR-analyse (modellkunnskap) + Azure datacenter geografi |
| Kostnad og lisensiering | ⚠️ Baseline | Generell Azure pricing structure (ikke eksakte NOK-priser hentet) |
| For arkitekten (Cosmo) | ⚠️ Baseline | Arkitekturerfaringer (modellkunnskap), ikke dokumentert av Microsoft |
**Notater:**
- Prisestimater er basert på generell Azure-prisstruktur — alltid sjekk [Azure Pricing Calculator](https://azure.microsoft.com/en-us/pricing/calculator/) for eksakte priser.
- Norge datacenter-status per 2026-02 — verifiser i Azure portal før arkitekturavgjørelser.
- Custom NER og Custom Text Classification er separate features med egne prismodeller (ikke dekket detaljert her).