-----------------------------------

Acquista i software ArcGIS tramite Studio A&T srl, rivenditore autorizzato dei prodotti Esri.

I migliori software GIS, il miglior supporto tecnico!

I migliori software GIS, il miglior supporto tecnico!
Azienda operante nel settore GIS dal 2001, specializzata nell’utilizzo della tecnologia ArcGIS e aderente ai programmi Esri Italia Business Network ed Esri Partner Network

-----------------------------------



Visualizzazione post con etichetta GeoAI. Mostra tutti i post
Visualizzazione post con etichetta GeoAI. Mostra tutti i post

lunedì 12 ottobre 2026

NicoGIS Tech Weekly — .NET 11 Runtime Async, GeoAI interpretabile, Agent Skills e Decisions API

NicoGIS Tech Weekly  •  12 ottobre 2026  •  Osservatorio tecnico: 5–11 ottobre

Focus di questa edizione
.NET 11: il passaggio dello stato async dal compilatore al runtime e il costo reale delle astrazioni; GeoAI: interpretabilità dei 256 embedding geodemografici con SHAP, più il conflitto fra prossimità geografica e semantica; Experience Builder: Agent Skills come conoscenza architetturale verificabile; LLM: Decisions API e Ultrafast come nuove scelte di orchestrazione.

Una settimana, un problema architetturale: dove finisce la rappresentazione e chi prende la decisione?

Quattro tecnologie apparentemente separate descrivono lo stesso spostamento di responsabilità. In .NET 11, per alcuni metodi async, la trasformazione che gestisce la sospensione si sposta dal compilatore C# al runtime/JIT; nella GeoAI, le migliaia di variabili che descrivono un territorio vengono compresse in uno spazio latente da cui vogliamo però ricavare spiegazioni controllabili; nello sviluppo di Experience Builder, le convenzioni di un framework vengono fornite al coding agent sotto forma di skill; nella nuova Decisions API, un modello non restituisce prosa ma probabilità o scelte tipizzate.

Il tema non è semplicemente migliorare le performance o produrre codice più velocemente. È decidere quali responsabilità possano essere trasferite a un livello intelligente o ottimizzante, quali contratti devono rimanere invarianti e quali verifiche debbano restare sotto il controllo dell’applicazione. In questo numero i fatti documentati sono separati dalle mie analisi: un microbenchmark non diventa uno SLA, SHAP non diventa causalità e la confidenza di un modello non diventa autorizzazione.

Nota sulla selezione. Le notizie realmente nuove della settimana sono il post Microsoft del 6 ottobre su C# Dev Kit, l’articolo Esri del 6 ottobre su AutoML/SHAP e gli annunci OpenAI del 6 e 8 ottobre. Il grande approfondimento di Stephen Toub su .NET 11 (15 settembre) e lo skill Esri (14 settembre) sono ripresi intenzionalmente come fonti tecniche di base: sono troppo importanti per essere liquidati.

01 — .NET 11: Runtime Async cambia il confine compiler/runtime

Dal lowering C# alla generazione JIT della sospensione

Nel lowering tradizionale, Roslyn converte il metodo async in una macchina a stati: tipo generato, MoveNext, campi per gli awaiter e per le variabili ancora vive dopo la sospensione, più il builder del risultato. Il JIT vede già questa rappresentazione trasformata. Il nuovo meccanismo runtime async, descritto da Stephen Toub il 15 settembre 2026, cambia la divisione del lavoro: per i metodi compatibili il compilatore emette IL più compatto, marcato come async, e il runtime/JIT decide come materializzare continuazioni e oggetti Task. Il modello C# pubblico, inclusi await, eccezioni, cancellazione e ConfigureAwait, resta semanticamente invariato.

// Modello concettuale, non una rappresentazione IL letterale.

// Lowering classico
C# async method
    -> compiler-generated state machine
    -> MoveNext + awaiter fields + builder
    -> JIT of already-lowered IL

// Runtime async (.NET 11, opt-in per l'applicazione)
C# async method
    -> compact suspension-aware IL + async metadata
    -> JIT/runtime builds suspend/resume machinery
    -> Task materialized when required by the observable contract

Il dettaglio che merita attenzione è il doppio accesso al metodo: il runtime può gestire un entry point pubblico che restituisce Task<T> e una variante interna AsyncCall capace di passare direttamente T a un chiamante runtime-async che esegue immediatamente await. Nel caso A → await B → await C, i confini intermedi possono essere fusi: se non esiste un consumatore che osservi il Task come oggetto, non è obbligatorio materializzarne uno per ogni livello. Gli adapter preservano interoperabilità con le librerie compilate secondo il modello tradizionale.

// File .csproj: esperimento .NET 11, non feature abilitata
// automaticamente nel codice applicativo.
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net11.0</TargetFramework>
    <Features>$(Features);runtime-async=on</Features>
  </PropertyGroup>
</Project>
FATTO
Nel .NET 11 documentato da Microsoft il meccanismo è opt-in per il codice applicativo, tramite runtime-async=on. La stessa fonte segnala che non tutti i casi sono già ottimizzati e che l’obiettivo iniziale è la compatibilità semantica, non promettere una riduzione universale delle allocazioni. Non confondere quindi “runtime async disponibile” con “runtime async abilitato di default per ogni progetto”.

Quanto vale? Microbenchmark, non capacità produttiva

Nel benchmark di Toub su due livelli async, una catena che completa sincronicamente passa, sulla macchina e con il setup Microsoft, da 21,221 ns e 144 B a 6,151 ns e 0 B; il percorso con un reale Task.Yield() passa da 254,139 ns e 248 B a 116,927 ns e 168 B. In un altro esperimento un assembly con dieci livelli async passa da 10.752 a 5.632 byte. Sono risultati di workload specifici, non coefficienti da applicare a una Web API qualsiasi.

Scenario misurato da MicrosoftLowering classicoRuntime asyncLettura corretta
Catena async, completamento sincrono21,221 ns · 144 B6,151 ns · 0 BBeneficio della mancata materializzazione di task intermedi.
Catena async, sospensione reale254,139 ns · 248 B116,927 ns · 168 BAnche una sospensione può evitare parte del costo delle continuazioni.
Assembly sperimentale, 10 livelli10.752 byte5.632 byteDimensione IL/binary, non tempo di risposta HTTP.

Se un endpoint è dominato da SQL Server, chiamate ArcGIS REST, traffico di rete o latenza cloud, il beneficio globale dell’ottimizzazione di pochi nanosecondi può risultare marginale. Se, invece, il servizio crea milioni di continuazioni brevi — per esempio un middleware che attraversa molti livelli e termina spesso su cache — allora diminuzioni di allocazioni e overhead possono ridurre pressione sul GC e costo CPU. La misura corretta richiede almeno throughput, p95/p99, allocazioni per operazione, pause GC e utilizzo ThreadPool sotto carico reale.

ANALISI
Runtime async è anche un cambiamento di forma del programma. L’ottimizzatore potrà ragionare su liveness e sospensione prima che una state machine esplicita abbia cristallizzato il controllo di flusso. Questo amplia le ottimizzazioni possibili, ma rende ancora più importante disporre di test di compatibilità, tracing dei task e confronti fra runtime quando un’applicazione fa uso di reflection, diagnosi delle stack trace o librerie complesse.

JIT, GC e JSON: la prestazione è una catena di costi

Nello stesso articolo, Microsoft descrive l’escape analysis sui boxing temporanei: in un esempio Nullable<int> che viene formattato attraverso un’interfaccia, il JIT riesce a eliminare un boxing da 24 B perché l’oggetto non esce dal metodo. Per una funzione che restituisce l’oggetto boxed, quell’allocazione resta necessaria. Non è “zero boxing” in senso generale: è una prova sull’observability dell’allocazione.

Sul lato GC, l’espansione di alcune operazioni di store su array espone al JIT i controlli di covarianza e le write barrier, permettendo di eliminarli o semplificarli quando il tipo effettivo è noto. Sulla serializzazione, Utf8JsonWriter usa percorsi basati su SearchValues per identificare i caratteri da sottoporre a escaping; Utf8JsonReader sfrutta IndexOfAnyExcept per saltare sequenze di whitespace. In un microbenchmark altamente favorevole al nuovo percorso, una scrittura JSON scende da 30,83 μs a 7,875 μs: caso utile a capire il meccanismo, non una promessa “JSON 4× più veloce” per ogni payload.

Hot path di un servizio .NET

parse JSON ─► validation ─► async call chain ─► downstream I/O
    │             │               │                 │
SearchValues   JIT/PGO       runtime-async        network/DB
    │             │               │                 │
    └─────────────┴───────────────┴─────────────────┘
                        ↓
              p95 latency + CPU + GC

Un miglioramento locale conta solo rispetto al peso del suo segmento.

Il tema AOT va letto nello stesso modo: Native AOT può eliminare la compilazione JIT dal percorso di avvio e migliorare startup e ingombro operativo di determinati eseguibili; non significa automaticamente che un’app ASP.NET Core con reflection dinamica, plugin o dipendenze non compatibili possa essere pubblicata senza modifiche. Le scelte tra JIT, ReadyToRun e Native AOT richiedono un inventario delle dipendenze e una misura del cold start rispetto allo steady state.

Fonti primarie: Stephen Toub, Performance Improvements in .NET 11 — 15 settembre 2026

Aggiornamento della settimana — C# Dev Kit 11.0, il tooling ridisegnato attorno al tempo di feedback

Il 6 ottobre Microsoft presenta la prerelease di C# Dev Kit 11.0, che succede alla serie 3.3. Qui non stiamo misurando il runtime della nostra applicazione, ma l’infrastruttura che carica soluzioni, produce build incrementali e rende disponibili IntelliSense, test e navigazione del codice. Il cambiamento è concreto: sei processi managed precedenti vengono consolidati in un processo server CSDevKit compilato con Native AOT; la soluzione usa una cache del modello dei progetti, apre per primo il file attivo e carica il resto in modo progressivo.

I dati Microsoft sono rilevanti ma vanno letti con precisione: sulla soluzione Aspire di 407 progetti, active file ready passa fino a 84,1 s → 0,47 s e whole solution ready da 84,1 s → 3,0 s. Nella stessa soluzione una build senza modifiche passa da 34,4 s a 0,88 s, e una con un singolo file C# modificato da 36,1 s a 2,1 s. La memoria dei processi server C# Dev Kit su Aspire scende da 2.072 a 316 MB: Microsoft precisa esplicitamente che questi numeri escludono il processo language service Roslyn e VS Code. La prerelease aggiunge anche supporto semantico ai file MSBuild e il diagnostico C# Doctor.

ANALISI
Questa architettura ha conseguenze importanti per agenti di coding e workspace effimeri: ridurre il costo di ogni nuovo processo, riutilizzare l’analisi dei progetti e rendere rapidamente disponibile il file attivo migliora il feedback loop sia umano sia automatizzato. Attenzione però alla cache versionata: va verificato quali artefatti sono riproducibili, quali sono specifici della macchina e come vengono invalidati, invece di committare indiscriminatamente directory locali nel repository.

Fonti primarie: Microsoft .NET Blog, A faster, lighter C# Dev Kit — 6 ottobre 2026 · Microsoft, Performance Improvements in .NET 11

02 — ArcGIS GeoAI: 256 embedding, quattro segmenti e il rischio di confondere spiegazione con causalità

Il fatto nuovo: AutoML + SHAP con struttura semantica documentata

Il 6 ottobre 2026 Pamir Roy (Esri) pubblica un workflow di interpretabilità per gli USA Geodemographic Embeddings in ArcGIS Pro. Il Geodemographic Foundation Model (GDFM) comprime quattro viste di contesto territoriale in 256 dimensioni, suddivise in quattro segmenti contigui da 64. La documentazione tecnica Esri descrive un multiview autoencoder: ciascuna vista ha un encoder che produce una rappresentazione latente; i vettori vengono concatenati e un’architettura di decoder ricostruisce gli input per guidare l’apprendimento. La layer pubblicata in Living Atlas associa gli embedding a celle Uber H3 di risoluzione 7, con vettori serializzati in campi BLOB e dimensioni disponibili anche come campi numerici.

SegmentoDimensioniVista di origineCosa non è lecito dedurre
S11–64Housing & Household CharacteristicsUna dimensione non equivale a “prezzo abitazione”.
S265–128EnvironmentUna componente non equivale a “temperatura” o “NDVI”.
S3129–192American Community SurveyUn alto SHAP del segmento non dimostra causalità del reddito.
S4193–256Age & Race CensusLa rilevanza predittiva non costituisce giustificazione etica per un uso decisionale.

Le quattro viste non sono indipendenti per costruzione semantica: realtà abitative, ambientali e socioeconomiche si correlano nel mondo reale. Inoltre un autoencoder non conserva i nomi delle variabili come assi interpretabili. Esri mostra l’uso di Train Using AutoML in modalità Basic e dell’output importance table per una previsione della food insecurity basata su dati County Health Rankings 2025; nella tabella vengono riportati i campi VARIABLES e IMPORTANCE. Un embedding come embedding_137 può avere elevata attribuzione nel modello, ma non va rinominato “income” o “employment” soltanto perché appartiene alla terza vista.

La matematica minima necessaria: quale SHAP stiamo sommando?

Esri specifica che IMPORTANCE rappresenta un’media globale del valore assoluto delle attribuzioni SHAP della singola dimensione sul campione di valutazione. La metrica aggregata per una vista viene calcolata sommando quelle importanze delle 64 dimensioni. Se φ(i,j) è la contribuzione firmata della dimensione j sull’osservazione i, si sta quindi leggendo:

S_segmento = somma_j[ (1/N) * somma_i |SHAP(i,j)| ]
              j nel segmento

NON e’ lo stesso oggetto di:

G_segmento = (1/N) * somma_i | somma_j SHAP(i,j) |
                                  j nel segmento

In generale S_segmento >= G_segmento, perche’ le
attribuzioni positive e negative possono compensarsi.

Questa differenza non è un dettaglio: due dimensioni possono avere ciascuna una forte attribuzione assoluta e annullarsi all’interno della stessa osservazione. La somma delle importanze descrive il volume delle attribuzioni individuali, non l’effetto congiunto netto del gruppo e neppure l’ipotetica perdita di accuratezza rimuovendo quel segmento. Per stimare il valore informativo incrementale occorrono esperimenti di ablation (riaddestramento senza una vista) o permutazioni di gruppo, con una validazione coerente con la struttura spaziale dei dati.

FATTO
Nell’esempio pubblicato da Esri il segmento ACS risulta quello con maggiore aggregato di SHAP assoluto per il modello specifico di food insecurity. Esri ribadisce che la graduatoria dipende da task, campione, algoritmo e configurazione: non è una gerarchia universale dei fattori socioeconomici né una conclusione causale.

Una strategia pratica per la produzione consiste nel mantenere separati predictive quality, explainability e robustness: un valore elevato di SHAP racconta come il modello ha sfruttato una rappresentazione, non se la fonte è appropriata, stabile nel tempo o idonea a una decisione amministrativa. Per contesti sensibili, in particolare quando compaiono proxy demografici, è necessario un controllo aggiuntivo di bias, finalità d’uso e possibili differenze di errore fra aree/popolazioni.

Prossimità geografica, prossimità latente e prossimità operativa

La disponibilità della ricerca Find Similar Features Using Embeddings cambia il tipo di domanda che un analista GIS può porre. Due celle H3 distanti centinaia di chilometri possono essere vicine nello spazio dei 256 valori, mentre celle contigue possono differire in condizioni socioeconomiche e ambientali. Esri descrive esplicitamente questa distinzione nei workflow per cercare aree contestualmente simili. Ma per una pianificazione di servizi, “simile” non coincide automaticamente con “raggiungibile”, “vicino” o “ammissibile”.

p = punto/cella di interesse; q = candidato

d_geo(p,q) = distanza geodesica o costo di rete

d_latent(p,q) = distanza nell’embedding
                 (metrica e scaling da validare)

score(p,q) = alpha * normalize(d_geo)
           + beta  * normalize(d_latent)
           + gamma * task_constraints(p,q)

ATTENZIONE: score e pesi sono proposta architetturale,
NON un algoritmo dichiarato da Esri.

Un motore di spatial-semantic retrieval credibile dovrebbe separare almeno tre fasi: (1) filtro spaziale o di rete per eliminare candidati impossibili; (2) ranking nello spazio latente secondo una metrica sperimentata sul dataset e sul tipo di embedding; (3) verifica su attributi espliciti e vincoli di dominio. In alternativa la priorità può essere invertita (prima semantic retrieval, poi validazione GIS), ma la scelta influisce su recall, costi e falsi positivi. Non combinerei direttamente gradi, chilometri, distanza coseno e indicatori socioeconomici senza normalizzazione e calibrazione.

Il secondo errore sistematico è il leakage spaziale. Uno split casuale del dataset può mettere nelle partizioni di training e test celle contigue e fortemente autocorrelate, ottenendo metriche eccessivamente ottimistiche. La letteratura scientifica sulle strategie di cross-validation per dati spaziali documenta il problema. Per un esperimento credibile bisogna confrontare holdout casuale e holdout per blocchi geografici, idealmente valutando anche l’effetto della dimensione del buffer rispetto alla correlazione residua. Non è un’impostazione di SHAP: è una proprietà del disegno sperimentale.

VALUTAZIONE
Gli embedding aprono una ricerca “per analogia territoriale”, ma l’analogia dipende dal modello e dalla finestra temporale dei dati che lo hanno addestrato. La documentazione GDFM riporta viste con anni di riferimento differenti (Census, ACS, dataset ambientali): usare questi vettori per una decisione corrente senza verificare l’aggiornamento delle sorgenti può trasformare un raffinato similarity search in una mappa di contesti storici.

Fonti primarie: Esri, Interpret embeddings using AutoML and SHAP — 6 ottobre 2026 · Esri, Concepts of USA Geodemographic Embeddings · Esri, Introducing USA Geodemographic Embeddings — 9 luglio 2026 · Lundberg & Lee, paper SHAP originale (NeurIPS 2017) · Roberts et al., spatial cross-validation (Ecography 2017)

03 — Experience Builder Agent Skills: il framework diventa conoscenza caricabile, ma la CI resta il giudice

La skill Esri non è un generatore magico di widget

Il 14 settembre Esri ha distribuito come open source arcgis-exb-widget-dev nel repository ufficiale delle risorse SDK di Experience Builder. Lo skill codifica struttura del progetto, convenzioni delle directory di Developer Edition, separazione fra pannello di settings e runtime, interazione con map/data source, state management, accessibility, theming, compatibilità delle configurazioni e riferimenti specifici richiamabili in modo selettivo dall’agente. Per Codex il post Esri suggerisce la cartella .agents/skills/; gli altri agent usano directory proprie. Non c’è un nuovo runtime Esri coinvolto: è contesto procedurale per un coding agent, non un’API eseguibile dal browser.

Developer Edition (esempio concettuale)
client/
  your-extensions/
    widgets/
      my-widget/
        manifest.json
        config.json
        src/   <-- runtime / setting / config, secondo template

.agents/skills/
  arcgis-exb-widget-dev/
    SKILL.md
    references/
    assets/

source code + framework skill + tests/CI
          -> 
      validazione

Esri specifica che i widget custom devono utilizzare le astrazioni di Experience Builder: in settings DataSourceSelector e altri selector di framework, con persistenza di useDataSources nell’appConfig; a runtime DataSourceComponent e, quando serve una mappa, JimuMapViewComponent. Questi contratti sono più importanti della generazione di uno scaffold che “compila”: gestiscono il lifecycle del builder, la selezione dei campi, le dipendenze da altri widget e l’interoperabilità dell’applicazione.

La frattura architetturale concreta: 2027 e web components

Esri ha comunicato che i custom widget Experience Builder dipendenti dai widget del Maps SDK for JavaScript dovranno migrare verso i web components del Maps SDK prima di adottare le release Experience Builder previste da Q1 2027 in poi che li sostituiscono. La stessa comunicazione distingue il momento in cui l’applicazione smette di funzionare: è legato all’upgrade della versione utilizzata, non al semplice scoccare della data di calendario. Non significa che ogni custom widget sarà automaticamente incompatibile: riguarda quelli che utilizzano i vecchi widget JS SDK.

Questa transizione rende particolarmente pericoloso un coding agent addestrato su esempi eterogenei: può generare codice sintatticamente coerente ma vincolato a componenti destinati alla rimozione. Lo skill vendor dovrebbe quindi essere version-aware e l’applicazione dovrebbe avere una matrice di versioni realmente testate. Il repository Esri include anche cartelle di patch specifiche per release: una convenzione attuale non è automaticamente compatibile con qualunque ArcGIS Enterprise installato.

Controlli proposti per una pull request di widget

[1] Versione Experience Builder esplicita
[2] Framework API e web components compatibili
[3] No API obsolete di Maps SDK widgets
[4] Settings/runtime separation preservata
[5] appConfig aggiornabile senza perdita di dati
[6] Lifecycle Map / DataSource gestito
[7] Keyboard, ARIA, tema e responsive layout
[8] Test di build, lint e smoke test UI
[9] Nessun segreto o token hardcoded nel client

Questa checklist e’ una proposta editoriale,
non uno script CI ufficiale Esri.
ANALISI
Tre livelli da tenere distinti. (1) Vendor skill: conoscenza del framework e delle versioni. (2) Repository skill: invarianti del progetto, convenzioni locali, procedure di packaging e release. (3) Validation gate: compilazione, test automatici, regression e review. Il terzo è indispensabile: i file di istruzioni aumentano la probabilità di codice corretto, ma non provano che il codice generato sia corretto. Inoltre lo skill è un input potenzialmente non attendibile nella supply chain dell’agente: va revisionato e versionato come qualunque dipendenza che può influenzare modifiche al repository.

Fonti primarie: Esri, Building Custom Experience Builder Widgets with an Agent Skill — 14 settembre 2026 · Repository GitHub ufficiale, SDK Resources e skill · Esri Developer, concetti dei widget · Esri Developer, Use data source in widget · Esri, retirement dei widget JS SDK — 8 aprile 2026

04 — LLM architecture: Decisions API e Ultrafast dividono il reasoning dal decision plane

6 ottobre: una API tipizzata per scegliere, non per “rispondere in JSON”

Il 6 ottobre 2026 OpenAI ha introdotto in beta pubblica la Decisions API con il modello gpt-6-luna e l’endpoint POST /v1/decisions. La superficie è deliberatamente più stretta della Responses API: riceve input testuale o immagini e valuta domande dichiarate dall’applicazione, restituendo predicate (probabilità booleana), choice (una delle alternative date) o score (punteggio su livelli ordinati). OpenAI dichiara una velocità “circa 10×” rispetto alla Responses API per questo tipo di task: è un claim del vendor su una classe di operazioni, non un benchmark indipendente su qualsiasi prompt o ambiente. Il modello attualmente previsto dalla documentazione per questa API è solo gpt-6-luna.

Il prezzo pubblicato per /v1/decisions con Luna è 0,10 USD per milione di token di input, senza addebito di token in output né letture/scritture della cache per questa specifica API. Sono previste maggiorazioni regionali e per contesti lunghi. Per testi, dati o immagini regolamentati, il supporto a ZDR, HIPAA e residenza geografica dipende dall’idoneità dell’organizzazione e dai relativi accordi: non equivale a una certificazione automatica di conformità del progetto.

La distinzione di prodotto è cruciale: se serve estrarre un oggetto arbitrario conforme a schema JSON, la documentazione rimanda agli Structured Outputs nella Responses API; se serve eseguire strumenti, usa function calling. La Decisions API, invece, formalizza un output decisionale ristretto. Questo può semplificare i confini fra classifier, policy engine e orchestratore, ma non li deve fondere.

INPUT: "Errore 500 al servizio di mappe pioggia"
            |
            v
     Decisions API (beta)
       type=choice
   gis | infrastructure | other
            |
            v
   probabilita’ + confidence
            |
            v
   Threshold + policy + audit
         /          \
        v            v
 Escalation      Workflow
   umana         autorizzato
            |
            v
       Strumenti reali
       (token limitati)

La decisione del modello NON autorizza strumenti.

Richiesta riproducibile, senza inventare SDK .NET non documentati

L’esempio seguente usa semplicemente la normale HttpClient di .NET, l’endpoint REST pubblicato e System.Net.Http.Json. È una demo di routing e non una autorizzazione ad aprire ticket o mutare dati GIS. Il valore 0.90 è una soglia illustrativa da sostituire con una soglia scelta e calibrata su un dataset reale; nessuna probabilità del modello va considerata automaticamente calibrata.

// Console .NET 10/11: OPENAI_API_KEY nell’ambiente.
using System.Net.Http.Headers;
using System.Net.Http.Json;
using System.Text.Json;

var key = Environment.GetEnvironmentVariable("OPENAI_API_KEY")
    ?? throw new InvalidOperationException("Missing OPENAI_API_KEY");

using var http = new HttpClient {
    BaseAddress = new Uri("https://api.openai.com/")
};
http.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", key);

var request = new {
    model = "gpt-6-luna",
    input = "The rain map service returns HTTP 500",
    questions = new[] { new {
        type = "choice",
        name = "triage",
        instructions = "Which team should investigate this issue?",
        choices = new[] {
            new { value = "gis", description = "Map, GIS or spatial service" },
            new { value = "infra", description = "Host, network, certificate" },
            new { value = "other", description = "Ambiguous or unrelated" }
        }
    }}
};

using var response = await http.PostAsJsonAsync("v1/decisions", request);
response.EnsureSuccessStatusCode();
using var body = await JsonDocument.ParseAsync(
    await response.Content.ReadAsStreamAsync());
var answer = body.RootElement.GetProperty("answers")[0];

if (answer.GetProperty("type").GetString() != "choice") {
    Console.WriteLine("Review required: no choice answer");
    return;
}
var team = answer.GetProperty("choice").GetString();
var confidence = answer.GetProperty("confidence").GetDouble();

// Demo only: calibrare su ground truth e costo degli errori.
Console.WriteLine(confidence >= 0.90 && team != "other"
    ? $"Proposed triage: {team} (review/policy still required)"
    : "Human review required");

La risposta alle domande choice include sia una distribuzione di probabilità sulle categorie sia un campo confidence; per predicate viene fornita una stima della probabilità della condizione. Non vanno confusi: sono grandezze emesse dall’API, non la garanzia che su 100 casi con score 0,9 se ne azzecchino esattamente 90. Servono dati etichettati, curva di calibrazione, matrice di confusione, costi asimmetrici di falsi positivi e negativi e un percorso per i rifiuti o i casi other. Per una scelta binaria con probabilità calibrata p, il classico cutoff derivato dai costi C_FP/(C_FP+C_FN) è significativo solo dopo avere esplicitato le ipotesi su perdite e distribuzione delle classi.

8 ottobre: GPT-6.1 Sol Ultrafast e la latenza di orchestrazione

L’8 ottobre il changelog OpenAI registra il supporto Ultrafast per gpt-6.1-sol nella Responses API. La configurazione è service_tier: "ultrafast"; il servizio dichiara rate limit separati e supporto alla residenza dati negli Stati Uniti e nell’area EU per Sol, secondo i requisiti applicabili. La guida raccomanda connessioni WebSocket persistenti, soprattutto per applicazioni agentiche con molte chiamate consecutive a tool: senza riuso della connessione il costo di rete può erodere il beneficio della velocità di generazione.

// Corpo JSON minimale documentato per Responses API
{
  "model": "gpt-6.1-sol",
  "service_tier": "ultrafast",
  "input": "Produce a concise incident summary."
}

// Performance engineering: non misurare solo tokens/sec.
T_task = T_network + T_inference + T_tools + T_retries
       + T_validation + T_commit

C_success = (C_model + C_tools + C_retries + C_ops)
          / P(task completed correctly)

Formule architetturali illustrative, non metriche vendor.

Per un agente che fa dieci chiamate sequenziali, il tempo totale non coincide con il tempo della singola generazione. Bisogna isolare TTFT (time to first token), intervalli fra token, p95 end-to-end, latenza delle chiamate a strumenti e tempi di validazione, controllando differenze fra processing tier e region. Ultrafast ha un costo più elevato documentato dal vendor: la decisione economica va presa sul costo per task corretto entro SLA, non sul miglior risultato isolato di streaming.

Un altro aggiornamento, del 7 ottobre, modifica il puntatore chat-latest verso lo snapshot più recente di ChatGPT. Per una pipeline riproducibile questo è un promemoria: un alias mobile facilita la sperimentazione ma non è una promessa di immutabilità delle risposte. Per test e produzione conviene registrare almeno model ID effettivo, versione del prompt, parametri, dataset eval e data dell’esperimento.

VISIONE
Si sta formando una separazione architetturale interessante: decision service economico e tipizzato per classificazioni ad alto volume, reasoning/orchestrator per task non deterministici complessi, policy engine deterministico per autorizzazione e invarianti. Non tutto ciò che chiamiamo “agente” ha bisogno di un orchestratore generale; in alcuni workflow la scelta migliore è una decisione probabilistica circoscritta seguita da un comando tradizionale verificabile.

Fonti primarie: OpenAI API Changelog — 6, 7 e 8 ottobre 2026 · OpenAI, Decisions API (beta), schema e pricing · OpenAI, Ultrafast mode, configurazione e limiti

05 — Sintesi architetturale: AI nel control plane, invarianti nel dominio

Il collegamento fra le quattro notizie è più concreto di una narrativa sull’intelligenza artificiale. Il runtime async elimina oggetti quando dimostra che il programma non li può osservare; SHAP offre una spiegazione sulla rappresentazione sfruttata dal modello, ma non sostituisce la verifica causale o spaziale; gli Agent Skills aumentano la probabilità di una corretta implementazione, ma non sostituiscono compilazione e regression; una API di decisione tipizzata produce una proposta probabilistica, ma non ha alcuna autorità sul dominio.

OSSERVAZIONI + DATI
                       |
       [normalizzazione e provenienza]
                       |
                  EMBEDDING
                       |
         [modello, versione, drift]
                       |
                INFERENZA / SHAP
                       |
               DECISION PROPOSAL
                       |
       [policy, permission, validation]
                       |
                 DOMAIN COMMAND
                       |
             AUTHORITATIVE STATE
                       |
           [audit, rollback, metrics]

Separazione architetturale proposta, non diagramma vendor.

Per un’app GIS enterprise potremmo tradurre questo schema in un servizio .NET che acquisisce dati da ArcGIS, calcola o recupera descrittori contestuali, usa un classificatore tipizzato per suggerire una categoria, impone policy e controllo dell’utente per le operazioni mutative e infine registra un comando validato. La UI, realizzata con Experience Builder o Blazor, visualizza stato e proposta ma non diventa l’autorità sulle modifiche. La tracciabilità minima include input data version, modello, prompt, score, utente approvatore, comando e risultato operativo.

VALUTAZIONE
Questo disegno evita due estremi: trattare la GenAI come un semplice widget di chat decorativo e, all’opposto, concederle accesso diretto a qualsiasi funzione applicativa. Il guadagno principale può essere una migliore divisione dei compiti: probabilistico dove serve inferire, deterministico dove serve garantire.

Technical Takeaways

  • .NET 11 runtime async: il confine fra metodi async e oggetti Task diventa più ottimizzabile; applicazioni ancora opt-in, beneficio da misurare su allocazioni e latenza reali, non solo sui nanosecondi di un esempio.
  • C# Dev Kit 11.0: Native AOT, meno processi e cache dei progetti sono scelte architetturali che accorciano il feedback loop; i benchmark Microsoft si riferiscono al server Dev Kit, non alla memoria totale dell’IDE.
  • GeoAI e SHAP: l’interpretabilità dei quattro segmenti è un buon punto di partenza, non una decomposizione causale. La domanda successiva è sempre: quanto regge su territori e tempi mai visti?
  • Experience Builder: uno skill formalizza convenzioni e conoscenza tecnica; release matrix, test, web components e review continuano a definire la compatibilità effettiva.
  • LLM systems: Decisions API e Ultrafast suggeriscono di selezionare la superficie API per il lavoro richiesto. Confidence, latenza e costo hanno senso soltanto rispetto a qualità, policy, SLA e dataset di valutazione.

Lab della settimana

Lab 1 — Runtime async: lo stesso workload, due lowering, risultati falsificabili

Setup: installare .NET 10 e una RC di .NET 11, creare un progetto di benchmark, eseguire in Release sullo stesso computer senza cambiare governor/affinità o condizioni di carico. Usare l’esperimento pubblicato da Toub con metodi RuntimeAsyncMethodGeneration(false) e le varianti runtime-async in un progetto con <Features>$(Features);runtime-async=on</Features>. Misurare metodo senza sospensione e con Task.Yield(); registrare runtime build, architettura CPU, throughput, media, deviazione e allocazioni. Poi ripetere su una catena applicativa reale: qui il risultato può essere nullo, positivo o regressivo. Documentazione e codice completo: Stephen Toub, sezione Runtime Async.

Lab 2 — SHAP a segmenti: importanza globale contro ablation e spatial holdout

Setup: in ArcGIS Pro usare la layer USA Geodemographic Embeddings di Living Atlas, una variabile target appropriata e Train Using AutoML in Basic Mode con Output Importance Table. Raggruppare i record embedding_1..256 in quattro intervalli di 64, sommare IMPORTANCE e normalizzare la quota di ogni gruppo. Addestrare un secondo modello senza il segmento dominante; confrontare il decadimento della metrica su validazione casuale e per blocchi spaziali. Non attribuire il decadimento esclusivamente a causalità: la prova valuta il valore predittivo incrementale nel disegno scelto. Fonti: workflow Esri del 6 ottobre, modello e dataset, fondamento scientifico dello spatial holdout.

Lab 3 — Experience Builder skill A/B: dalle istruzioni al contratto verificato

Setup: clonare le risorse SDK ufficiali Esri, predisporre una Developer Edition esplicitamente versionata e chiedere al medesimo coding agent di realizzare un widget che legge una FeatureLayer, risponde alla selezione della mappa e mantiene compatibile la configurazione. Eseguire tre run con prompt identico: senza skill, skill Esri, skill Esri + regole locali (solo se tali regole sono state effettivamente create). Per ogni run misurare build/test passati, riferimenti ad API obsolete, errori di runtime, accessibilità, correzioni umane, tool calls e tempo al widget funzionante. Includere test su almeno due versioni supportate se disponibili. Fonti: repository SDK/skill, contratti DataSource, migrazione 2027.

Micro-esperimento extra, già incorporato nella sezione LLM: eseguire il client HttpClient della Decisions API su un set di incident già etichettati. Confrontare accuracy, false-route rate e coverage rispetto a un router deterministico; solo in un secondo momento valutare latenza e prezzo. Documentazione: Decisions API.


NicoGIS Tech Weekly · edizione del 12 ottobre 2026. Analisi indipendente e non promozionale. Nessun benchmark dell’autore viene spacciato per misurazione svolta: i numeri citati sono quelli delle fonti primarie, con ambito e limiti esplicitati. “Analisi”, “Valutazione” e “Visione” identificano inferenze o proposte progettuali, non comunicazioni ufficiali dei vendor.

venerdì 9 ottobre 2026

Agentic Planning vs Deterministic Execution: architetture AI affidabili con Azure Durable Functions, DAG e GeoAgent

Quando l'intelligenza pianifica, ma non controlla l'esecuzione

Per molto tempo abbiamo progettato gli agenti AI secondo un modello relativamente semplice: un Large Language Model interpreta una richiesta, seleziona uno strumento, ne osserva il risultato e decide cosa fare successivamente.

Il modello funziona bene per task brevi. Diventa però progressivamente meno efficiente quando deve coordinare decine di strumenti, elaborare grandi volumi di dati, gestire retry, attendere eventi esterni e garantire che operazioni già completate non vengano ripetute accidentalmente.

Con Dynamic Workflows for Azure Functions Hosted Skills, annunciato da Microsoft l'8 ottobre 2026, emerge un'architettura differente: l'LLM genera un piano strutturato, mentre un runtime durevole e deterministico si occupa della sua esecuzione.

La distinzione è fondamentale. Il modello non diventa improvvisamente affidabile perché produce JSON anziché testo. È il sistema che interpreta quel JSON a dover imporre vincoli, autorizzazioni, dipendenze e garanzie operative.

Principio architetturale: un LLM può proporre una sequenza di azioni, ma non dovrebbe essere l'autorità finale che decide se quelle azioni sono consentite, sicure o già state eseguite.

1. Il problema del reasoning loop tradizionale

Consideriamo un agente che deve analizzare un evento meteorologico, interrogare servizi GIS, produrre una mappa di rischio e inviare una notifica.

User / Event
    |
    v
   LLM
    |
    +-- Tool: read rainfall
    |       |
    |       v
    |      LLM
    |
    +-- Tool: read terrain
    |       |
    |       v
    |      LLM
    |
    +-- Tool: run spatial analysis
    |       |
    |       v
    |      LLM
    |
    +-- Tool: generate map
    |       |
    |       v
    |      LLM
    |
    +-- Tool: publish result
            |
            v
           LLM

Ogni operazione comporta un nuovo passaggio attraverso il modello. Se gli strumenti restituiscono dati voluminosi, il contesto si riempie di risultati intermedi che il modello potrebbe non aver bisogno di interpretare direttamente.

Il problema non è soltanto economico. È anche architetturale:

  • Latenza: le chiamate al modello possono serializzare operazioni indipendenti.
  • Context pollution: risultati intermedi e log possono occupare una parte significativa della context window.
  • Recovery: un crash durante un'operazione lunga richiede meccanismi di ripresa espliciti.
  • Retry: ripetere un tool può duplicare effetti esterni.
  • Audit: ricostruire perché un'azione sia stata eseguita può diventare difficile.
  • Security: il contenuto restituito da un tool può influenzare impropriamente le decisioni successive dell'agente.

Un reasoning loop è appropriato quando ogni risultato richiede una nuova decisione semantica. Non è necessariamente la scelta migliore quando le operazioni sono note, verificabili e largamente indipendenti.

2. L'architettura emergente: Plan, Validate, Execute, Verify

La nuova separazione delle responsabilità può essere rappresentata così:

                 USER / EVENT
                      |
                      v
              +---------------+
              |  LLM PLANNER  |
              +---------------+
                      |
                 Proposed DAG
                      |
                      v
              +---------------+
              | DAG VALIDATOR |
              | Policy Engine |
              +---------------+
                      |
                Approved Plan
                      |
                      v
              +---------------+
              | DURABLE ENGINE|
              +---------------+
                /     |     \
               v      v      v
           Tool A   Tool B   Tool C
               \      |      /
                \     |     /
                 v    v    v
                AGGREGATION
                      |
                      v
                VERIFICATION
                      |
                      v
                FINAL RESULT

Il passaggio più importante è quello fra planner e runtime.

Il piano generato dal modello deve essere considerato un input non attendibile, anche quando il modello appartiene a un provider affidabile. La validazione non può essere una semplice verifica della sintassi JSON: deve includere controlli strutturali, semantici, autorizzativi e di consumo delle risorse.

Microsoft applica questo paradigma nella preview Dynamic Workflows di Azure Functions Hosted Skills. Il runtime utilizza Durable Functions per eseguire il piano senza riportare continuamente i risultati intermedi nel reasoning loop dell'LLM.

È importante distinguere la funzionalità specifica Microsoft, attualmente in preview e basata su tool Python, da un'implementazione equivalente realizzata autonomamente in C# e .NET con Durable Functions.

3. Il DAG come contratto eseguibile

Un Directed Acyclic Graph è un grafo diretto senza cicli. Ogni nodo rappresenta un'operazione; ogni arco rappresenta una dipendenza.

Consideriamo un piano per valutare il rischio associato a precipitazioni intense:

         ReadRainfall
              |
              +----------------+
              |                |
              v                v
        LoadTerrain      LoadAssets
              |                |
              v                |
        ComputeRunoff          |
              |                |
              +--------+-------+
                       |
                       v
                IntersectRisk
                       |
                       v
                 GenerateMap
                       |
                       v
                PublishResult

Il DAG esplicita immediatamente il parallelismo possibile: LoadTerrain e LoadAssets possono partire quando ReadRainfall è completato, se le rispettive operazioni non dipendono l'una dall'altra.

In un sistema reale conviene spingersi oltre, rendendo indipendenti tutte le acquisizioni che non richiedono il risultato delle precipitazioni.

Un contratto JSON minimale

{
  "schemaVersion": "1.0",
  "workflowId": "rainfall-risk-20261009",
  "nodes": [
    {
      "id": "rainfall",
      "tool": "gis.readRainfall",
      "dependsOn": []
    },
    {
      "id": "terrain",
      "tool": "gis.loadTerrain",
      "dependsOn": []
    },
    {
      "id": "assets",
      "tool": "gis.loadAssets",
      "dependsOn": []
    },
    {
      "id": "risk",
      "tool": "gis.computeRisk",
      "dependsOn": [
        "rainfall",
        "terrain",
        "assets"
      ]
    },
    {
      "id": "map",
      "tool": "gis.generateMap",
      "dependsOn": ["risk"]
    }
  ]
}

Questo JSON è una rappresentazione concettuale del nostro contratto applicativo, non lo schema ufficiale della preview Microsoft.

Un contratto production-grade dovrebbe inoltre includere versione del piano, input tipizzati, riferimenti agli output, classificazione dei tool, limiti di esecuzione e policy di autorizzazione. Gli argomenti non devono poter contenere endpoint arbitrari o istruzioni eseguibili non previste.

4. DAG validation: il vero confine di sicurezza

La validazione di un piano prodotto da un LLM deve essere eseguita prima che il workflow venga avviato.

I controlli minimi comprendono:

  • Identificatori univoci dei nodi.
  • Assenza di dipendenze inesistenti.
  • Assenza di cicli.
  • Limiti su numero di nodi, profondità e fan-out.
  • Tool presenti in una allowlist server-side.
  • Compatibilità tra input e output dei tool.
  • Autorizzazioni coerenti con utente, tenant e risorsa.
  • Limiti su costo, durata e concorrenza.
  • Approvazioni esplicite per operazioni con effetti esterni sensibili.

Validazione strutturale in C#

public sealed record WorkflowNode(
    string Id,
    string Tool,
    string[] DependsOn);

public sealed record WorkflowPlan(
    string SchemaVersion,
    WorkflowNode[] Nodes);

public static class DagValidator
{
    private static readonly HashSet<string> AllowedTools =
        new(StringComparer.Ordinal)
        {
            "gis.readRainfall",
            "gis.loadTerrain",
            "gis.loadAssets",
            "gis.computeRisk",
            "gis.generateMap"
        };

    public static void Validate(WorkflowPlan plan)
    {
        ArgumentNullException.ThrowIfNull(plan);

        if (plan.SchemaVersion != "1.0")
            throw new InvalidOperationException(
                "Unsupported schema version.");

        if (plan.Nodes is null ||
            plan.Nodes.Length is < 1 or > 50)
            throw new InvalidOperationException(
                "Invalid workflow size.");

        var nodes = new Dictionary<string, WorkflowNode>(
            StringComparer.Ordinal);

        foreach (var node in plan.Nodes)
        {
            if (string.IsNullOrWhiteSpace(node.Id) ||
                !nodes.TryAdd(node.Id, node))
                throw new InvalidOperationException(
                    "Invalid or duplicate node ID.");

            if (!AllowedTools.Contains(node.Tool))
                throw new InvalidOperationException(
                    $"Tool not allowed: {node.Tool}");
        }

        var indegree = nodes.Keys.ToDictionary(
            id => id,
            _ => 0,
            StringComparer.Ordinal);

        var children = nodes.Keys.ToDictionary(
            id => id,
            _ => new List<string>(),
            StringComparer.Ordinal);

        foreach (var node in nodes.Values)
        {
            var dependencies = node.DependsOn ??
                throw new InvalidOperationException(
                    "Dependencies cannot be null.");

            foreach (var dependency in dependencies.Distinct())
            {
                if (!nodes.ContainsKey(dependency))
                    throw new InvalidOperationException(
                        $"Unknown dependency: {dependency}");

                indegree[node.Id]++;
                children[dependency].Add(node.Id);
            }
        }

        var ready = new Queue<string>(
            indegree
                .Where(x => x.Value == 0)
                .Select(x => x.Key));

        var visited = 0;

        while (ready.Count > 0)
        {
            var id = ready.Dequeue();
            visited++;

            foreach (var child in children[id])
            {
                if (--indegree[child] == 0)
                    ready.Enqueue(child);
            }
        }

        if (visited != nodes.Count)
            throw new InvalidOperationException(
                "Workflow contains a cycle.");
    }
}

L'algoritmo utilizza una variante del topological sorting di Kahn. La complessità è O(V + E), dove V rappresenta i nodi ed E le dipendenze.

Questo codice valida soltanto la struttura e una allowlist di base. Non rappresenta un security validator completo. In produzione servono anche controllo degli argomenti, autorizzazione contestuale, compatibilità dei tipi, quote e validazione della provenienza del piano.

Un ulteriore accorgimento consiste nel calcolare un hash canonico del piano validato, registrando insieme ad esso identità del richiedente, versione delle policy e identificativo dell'esecuzione. Il runtime dovrebbe eseguire esattamente quel piano immutabile, evitando modifiche successive alla validazione.

5. Durable Functions: perché l'orchestrazione deve essere deterministica

Azure Durable Functions utilizza una forma di event sourcing per ricostruire lo stato delle orchestrazioni.

Quando un'orchestrazione riprende dopo un evento, il runtime può rieseguire il codice dell'orchestratore dall'inizio, recuperando dalla history i risultati delle attività già completate.

Questo meccanismo prende il nome di replay.

Execution history
       |
       +-- ActivityScheduled(A)
       +-- ActivityCompleted(A)
       +-- ActivityScheduled(B)
       +-- ActivityCompleted(B)
       |
       v
  Orchestrator Replay
       |
       +-- A: result from history
       +-- B: result from history
       +-- C: schedule new activity

Il codice dell'orchestratore deve quindi essere deterministico. Non dovrebbe effettuare direttamente chiamate HTTP, interrogazioni SQL, operazioni GIS o letture dell'orologio di sistema.

Le operazioni con effetti esterni appartengono alle Activity Functions.

Esempio di orchestrazione C# con .NET isolated worker

using Microsoft.Azure.Functions.Worker;
using Microsoft.DurableTask;

public static class GeoWorkflow
{
    [Function(nameof(RunGeoWorkflow))]
    public static async Task<string> RunGeoWorkflow(
        [OrchestrationTrigger]
        TaskOrchestrationContext context)
    {
        var rainfallTask =
            context.CallActivityAsync<string>(
                "ReadRainfall");

        var terrainTask =
            context.CallActivityAsync<string>(
                "LoadTerrain");

        var assetsTask =
            context.CallActivityAsync<string>(
                "LoadAssets");

        await Task.WhenAll(
            rainfallTask,
            terrainTask,
            assetsTask);

        var input = new RiskInput(
            rainfallTask.Result,
            terrainTask.Result,
            assetsTask.Result);

        var risk =
            await context.CallActivityAsync<string>(
                "ComputeRisk",
                input);

        return await context.CallActivityAsync<string>(
            "GenerateMap",
            risk);
    }
}

public sealed record RiskInput(
    string RainfallUri,
    string TerrainUri,
    string AssetsUri);

Questo è un esempio di orchestrazione statica. Non è ancora un interprete dinamico di DAG: serve a mostrare il modello Durable Functions e il parallelismo fan-out/fan-in.

Le tre Activity iniziali restituiscono riferimenti a dati persistenti, non interi raster o dataset serializzati nella history dell'orchestrazione.

Per interpretare DAG generati dinamicamente è preferibile utilizzare un executor generico che riceva un piano validato, identifichi i nodi pronti e li programmi attraverso un catalogo di Activity consentite.

6. Un DAG executor dinamico: la differenza fra scheduling e reasoning

Il runtime non deve chiedere all'LLM quale nodo eseguire dopo ogni completamento. Deve applicare una regola deterministica:

Ready(node) =
    AllDependenciesCompleted(node)
    AND PolicyAllows(node)
    AND ResourcesAvailable(node)

Un possibile algoritmo è:

completed = {}
pending = allNodes

while pending is not empty:

    ready = nodes where:
        every dependency is completed

    if ready is empty:
        fail invalid workflow

    execute ready nodes concurrently
    await completion

    persist outputs
    mark nodes completed
    remove nodes from pending

Questo pseudocodice illustra l'idea, ma in produzione richiede alcuni raffinamenti importanti.

Prima di tutto, i nodi devono essere ordinati stabilmente per evitare divergenze durante il replay. Inoltre la concorrenza deve essere limitata, gli errori devono essere gestiti per nodo e il risultato di ogni Activity deve essere registrato con un identificatore stabile.

Un semplice Task.WhenAll() su tutti i nodi pronti può produrre fan-out eccessivo. In un workflow geografico, cinquanta richieste simultanee a un servizio ArcGIS possono saturare il servizio, esaurire risorse o produrre throttling.

È quindi utile distinguere tre livelli di concorrenza:

  • Workflow concurrency: quante orchestrazioni possono essere attive.
  • Node concurrency: quanti nodi dello stesso DAG possono essere eseguiti contemporaneamente.
  • Resource concurrency: quante operazioni possono utilizzare uno specifico servizio, database o pool di worker.

Il terzo livello è particolarmente importante: limitare il fan-out di una singola orchestrazione non impedisce a cento orchestrazioni concorrenti di sovraccaricare lo stesso servizio.

7. Idempotenza: at-least-once non significa exactly-once

Uno dei problemi più pericolosi dei workflow distribuiti è la ripetizione delle operazioni.

Durable Functions può rieseguire un'Activity quando si verifica un errore o quando il completamento dell'attività non è stato registrato correttamente.

Supponiamo che un'Activity esegua:

POST /arcgis/rest/services/Analysis/GPServer/SubmitJob

Il servizio remoto riceve la richiesta e avvia il job. Subito dopo, il worker Azure Functions si interrompe prima di registrare il risultato.

Al riavvio, il runtime può ripetere l'Activity.

Il risultato potrebbe essere:

First attempt  --> ArcGIS Job 1001
Worker crash
Second attempt --> ArcGIS Job 1002

Il sistema ha prodotto due elaborazioni per una sola richiesta logica.

Il retry è quindi corretto dal punto di vista dell'infrastruttura, ma non necessariamente dal punto di vista del business.

La soluzione: Operation Ledger e Idempotency Key

Ogni operazione con effetti esterni dovrebbe avere una chiave stabile:

IdempotencyKey =
    WorkflowId + ":" + NodeId

Una tabella SQL può mantenere lo stato dell'operazione:

CREATE TABLE WorkflowOperations
(
    OperationKey NVARCHAR(200) NOT NULL
        PRIMARY KEY,

    State NVARCHAR(30) NOT NULL,

    ExternalJobId NVARCHAR(200) NULL,

    ResultUri NVARCHAR(2000) NULL,

    UpdatedAt DATETIMEOFFSET NOT NULL
);

Il pattern operativo diventa:

1. Reserve OperationKey atomically
2. Check previous execution state
3. Submit or reconcile external job
4. Persist ExternalJobId
5. Poll external job
6. Persist ResultUri
7. Mark operation Completed

È fondamentale riconoscere che il ledger, da solo, non garantisce exactly-once.

Esiste infatti una finestra critica fra l'invio della richiesta al sistema esterno e il salvataggio dell'ExternalJobId. Se il processo si interrompe in quel punto, il database locale non sa se l'operazione remota sia stata accettata.

Per eliminare questa ambiguità serve un meccanismo di riconciliazione: una chiave di idempotenza supportata dal servizio remoto, un identificatore applicativo ricercabile oppure un adapter che possa individuare un job già creato.

Se l'API esterna non supporta alcuna forma di deduplicazione o riconciliazione, la garanzia di exactly-once non può essere ottenuta semplicemente aggiungendo retry e una tabella SQL.

8. Retry, timeout, circuit breaker e compensazione

Un workflow distribuito affidabile deve distinguere gli errori transitori da quelli permanenti.

Un HTTP 429 o 503 può giustificare un retry con backoff. Un errore di autorizzazione, un input GIS non valido o un piano che viola una policy non dovrebbe invece essere ripetuto automaticamente.

Per gli errori transitori è possibile utilizzare le retry policy delle Activity Durable Functions.

Per operazioni che modificano sistemi esterni è inoltre utile introdurre una logica di compensazione.

Consideriamo:

CreateAnalysisJob
        |
        v
PublishFeatureLayer
        |
        v
UpdateWebMap
        |
        v
NotifyUsers

Se UpdateWebMap fallisce dopo la pubblicazione del layer, il sistema potrebbe dover eliminare il layer temporaneo o ripristinare la configurazione precedente.

Questo modello è vicino al pattern Saga: ogni azione può avere un'azione compensativa, ma la compensazione non equivale necessariamente a un rollback transazionale perfetto.

Per un workflow geografico occorre inoltre distinguere:

  • Risultati temporanei, eliminabili automaticamente.
  • Risultati pubblicati, che richiedono autorizzazioni specifiche per la rimozione.
  • Modifiche a dati autorevoli, che possono richiedere approvazione umana.
  • Notifiche già inviate, che non possono essere semplicemente annullate.

La progettazione delle compensazioni deve essere parte del catalogo dei tool, non una decisione improvvisata dall'LLM dopo un errore.

9. Isolamento dei sub-agent: un agente specializzato non è un processo fidato

Un workflow può delegare attività a sub-agent specializzati.

Per esempio:

GeoCoordinator
      |
      +-- RainfallAgent
      |
      +-- TerrainAgent
      |
      +-- InfrastructureAgent
      |
      +-- RiskVerificationAgent

Il vantaggio è la specializzazione. Il rischio è l'ampliamento della superficie di attacco.

Un sub-agent non dovrebbe ereditare automaticamente l'intera cronologia del coordinatore, tutte le sue credenziali o la capacità di invocare qualsiasi tool.

Nella preview Microsoft Dynamic Workflows, le invocazioni dei sub-agent utilizzano sessioni isolate e stateless, con istruzioni, modelli, strumenti e timeout propri. Non ricevono automaticamente la conversation history o la sandbox del coordinatore.

Questo è un buon punto di partenza, ma non sostituisce l'isolamento infrastrutturale.

Capability-based execution

Ogni sub-agent dovrebbe ricevere soltanto le capability necessarie.

RainfallAgent
    READ rainfall observations
    READ station metadata
    NO write access
    NO publishing permissions

TerrainAgent
    READ elevation datasets
    EXECUTE terrain analysis
    NO access to notifications

PublisherAgent
    READ approved outputs
    PUBLISH to approved folders
    NO arbitrary service access

Il controllo deve essere imposto dal gateway dei tool e dalle identità utilizzate verso i servizi, non soltanto da istruzioni testuali come "non pubblicare dati".

In Azure, Managed Identity, Azure RBAC, Key Vault e isolamento di rete possono contribuire a questo modello, purché le identità siano effettivamente separate secondo i confini di autorizzazione richiesti.

10. Context engineering: la memoria dell'agente non è lo stato del workflow

Un altro errore frequente consiste nell'utilizzare la conversation history come archivio dello stato operativo.

La memoria del modello è utile per mantenere obiettivi, vincoli e informazioni semantiche. Non dovrebbe essere la fonte autorevole per determinare se un job è completato, quale output è stato pubblicato o quali autorizzazioni sono state concesse.

Propongo di separare quattro livelli:

+----------------------------------+
| Semantic Context                 |
| Goal, assumptions, constraints   |
+----------------------------------+
| Execution State                  |
| Node status, retries, timestamps |
+----------------------------------+
| Artifact Store                   |
| Raster, JSON, logs, results      |
+----------------------------------+
| Audit & Authorization            |
| Identity, approvals, provenance  |
+----------------------------------+

Il modello dovrebbe ricevere soltanto il contesto necessario per decidere il piano e, alla fine, interpretare i risultati.

Gli output voluminosi dovrebbero essere conservati in storage e rappresentati attraverso riferimenti immutabili o versionati, accompagnati da metadata come checksum, schema, sistema di riferimento e provenienza.

Questo evita che raster, grandi FeatureSet, log o migliaia di record GIS vengano inseriti nella context window senza alcun beneficio.

11. GeoAgent: un laboratorio architetturale con ArcGIS e Azure

Immaginiamo di voler realizzare un agente che risponda alla richiesta:

Analizza le precipitazioni delle ultime 24 ore, individua le aree potenzialmente critiche e produci una mappa delle infrastrutture esposte.

Il modello non dovrebbe generare direttamente una mappa di rischio basandosi soltanto sul testo. Deve selezionare strumenti GIS deterministici, ciascuno con input, output e limiti ben definiti.

Pipeline proposta

Weather / Rainfall API
          |
          v
   Observation Validation
          |
          v
   Spatial Interpolation
      IDW / Spline
          |
          v
   Rainfall Raster
          |
          +------------------+
          |                  |
          v                  v
    Terrain Data       Asset Inventory
          |                  |
          +---------+--------+
                    |
                    v
             Spatial Analysis
                    |
                    v
             Exposure Overlay
                    |
                    v
             Result Validation
                    |
                    v
             ArcGIS Publishing
                    |
                    v
               WebMap / App

Una possibile implementazione utilizza:

  • C#/.NET: API di ingresso, validazione, orchestrazione e integrazione enterprise.
  • Azure Durable Functions: scheduling durevole, retry e recovery.
  • Azure SQL: operation ledger, metadata, policy e audit applicativo.
  • Azure Blob Storage: artifact store per input e output voluminosi.
  • ArcGIS Enterprise: geoprocessing, analisi raster, feature service e pubblicazione.
  • LLM: interpretazione della richiesta, costruzione del piano e sintesi finale.

È importante non confondere l'interpolazione delle precipitazioni con una simulazione idrologica o idraulica completa.

IDW e Spline producono superfici interpolate a partire dalle osservazioni. Per modellare runoff, propagazione delle piene o dinamiche fisiche occorrono modelli e dati aggiuntivi, opportunamente calibrati e validati.

Inoltre l'eventuale esecuzione di Spatial Analyst richiede di verificare disponibilità delle capability e licenze nella versione e nell'ambiente ArcGIS effettivamente distribuiti.

12. Un adapter ArcGIS robusto deve conoscere il ciclo di vita dei job

Un adapter per un servizio ArcGIS Geoprocessing asincrono non dovrebbe limitarsi a invocare SubmitJob e attendere indefinitamente.

Deve modellare esplicitamente gli stati del job remoto:

NotSubmitted
      |
      v
  Submitted
      |
      v
   Executing
      |
      +----> Succeeded
      |
      +----> Failed
      |
      +----> Cancelled
      |
      +----> TimedOut

La gestione deve distinguere lo stato del job ArcGIS dallo stato dell'Activity Azure Functions.

Un job ArcGIS può continuare a essere eseguito anche quando il worker che lo ha avviato non è più disponibile. Per questo è preferibile salvare l'identificatore del job e utilizzare un meccanismo di polling o riconciliazione durevole.

Per processi molto lunghi, il pattern può diventare:

Submit GP Job
     |
     v
Persist Job ID
     |
     v
Durable Timer
     |
     v
Check GP Status
     |
     +-- Running --> Durable Timer
     |
     +-- Success --> Fetch Results
     |
     +-- Failure --> Error Policy

Il polling non dovrebbe occupare un thread o una Function instance per tutta la durata del job.

Per i servizi GIS occorre inoltre definire timeout, frequenza di polling, politiche di cancellazione e comportamento in caso di perdita temporanea della connettività.

13. Observability: misurare il workflow, non soltanto i token

Un sistema agentico enterprise dovrebbe essere osservabile su più livelli.

Il livello LLM deve registrare modello, versione, token, latenza, versione del prompt e identificativo del piano generato.

Il livello workflow deve registrare durata dei nodi, retry, timeout, dipendenze, errori e stato complessivo.

Il livello GIS deve registrare servizio utilizzato, identificativo del job, tempi di elaborazione, parametri analitici, dataset e riferimenti agli output.

Una struttura di correlazione può essere:

TraceId
   |
   +-- PlanningSpan
   |
   +-- ValidationSpan
   |
   +-- WorkflowInstanceId
          |
          +-- Node: rainfall
          +-- Node: terrain
          +-- Node: risk
          +-- Node: publishing
                    |
                    +-- ArcGIS JobId

OpenTelemetry e Application Insights possono contribuire a questa osservabilità, ma occorre propagare esplicitamente gli identificatori di correlazione fra sistemi.

Il replay delle orchestrazioni richiede inoltre attenzione: log prodotti ingenuamente durante il replay possono essere duplicati. Dove disponibile, conviene utilizzare il replay-safe logger fornito dal runtime Durable Functions.

Metriche che misurerei

  • Planning latency e planning token cost.
  • Percentuale di piani rifiutati dal validator.
  • Numero di nodi e profondità media del DAG.
  • Parallelismo effettivo rispetto a quello teorico.
  • Retry per tool e per servizio esterno.
  • Numero di job remoti riconciliati dopo failure.
  • Workflow completion rate.
  • Tempo medio e percentile P95/P99 per nodo.
  • Costo per workflow completato.
  • Accuratezza e validità dei risultati GIS.

Una riduzione dei token non rappresenta automaticamente un miglioramento del sistema se aumentano i workflow falliti o diminuisce la qualità del risultato.

14. Sicurezza: il piano generato dall'LLM è una superficie di attacco

Un piano apparentemente valido può essere pericoloso anche senza contenere codice eseguibile.

Consideriamo alcuni scenari:

  • Tool escalation: il modello seleziona un tool di pubblicazione quando l'utente ha richiesto soltanto un'analisi.
  • Data exfiltration: un parametro contiene un endpoint esterno non autorizzato.
  • Resource exhaustion: il piano richiede centinaia di analisi raster molto costose.
  • Cross-tenant access: un nodo tenta di utilizzare dati appartenenti a un altro tenant.
  • Prompt injection: un dataset o documento esterno influenza il planner inducendolo a inserire operazioni non richieste.
  • Approval spoofing: un output intermedio dichiara falsamente che l'utente ha autorizzato un'azione.

Le contromisure devono essere applicate fuori dal modello:

Untrusted User / Tool Data
             |
             v
        LLM Planner
             |
             v
        Schema Validator
             |
             v
        Policy Decision
             |
             v
       Approval Gateway
             |
             v
        Tool Dispatcher
             |
             v
     Authorized Execution

Un'approvazione dovrebbe essere un evento autenticato e correlato a una specifica operazione, non una proprietà booleana modificabile dal modello.

Il tool dispatcher dovrebbe risolvere le credenziali dal contesto server-side, evitando che il piano possa scegliere liberamente identità, segreti o endpoint.

15. Benchmark Microsoft: cosa dimostrano realmente i numeri

Nel proprio annuncio, Microsoft ha confrontato un normale reasoning loop con Dynamic Workflows su un benchmark sintetico di analisi di dieci servizi.

I risultati riportati sono:

MetricaReasoning loopDynamic Workflow
Token utilizzati99.0976.781
Latenza247,1 s12,7 s
Riduzione token—93,1%
Riduzione latenza—95,1%

I numeri sono notevoli, ma vanno interpretati correttamente. Il benchmark riguarda un task specifico, strutturato e adatto alla parallelizzazione. Non significa che qualsiasi workflow agentico possa ottenere automaticamente riduzioni equivalenti.

Il vantaggio dipende soprattutto da tre fattori:

  • Le attività indipendenti possono essere eseguite in parallelo.
  • Gli output intermedi non devono attraversare continuamente il modello.
  • Il numero di round-trip LLM viene drasticamente ridotto.

Un workflow che richiede decisioni semantiche dopo ogni passaggio potrebbe invece beneficiare meno di questo modello.

16. Il trade-off: meno autonomia durante l'esecuzione, più affidabilità

Separare pianificazione ed esecuzione introduce anche un limite.

Un DAG statico non può adattarsi arbitrariamente a qualsiasi informazione inattesa. Se un risultato intermedio richiede una nuova strategia, il workflow deve prevedere una decisione condizionale oppure una fase esplicita di replanning.

Per questo considero particolarmente interessante un modello ibrido:

LLM Planning
      |
      v
Validated DAG
      |
      v
Deterministic Execution
      |
      +-- Expected Result
      |       |
      |       v
      |   Continue DAG
      |
      +-- Unexpected Result
              |
              v
        Controlled Replan
              |
              v
        New Validation
              |
              v
        Resume Execution

Il replanning deve essere limitato e tracciato. Ogni nuovo piano deve essere nuovamente validato, e il sistema deve conoscere quali operazioni precedenti siano già state completate.

Non dovrebbe essere possibile aggirare un rifiuto del validator semplicemente generando ripetutamente nuovi piani.

17. Verso una nuova architettura: il GeoAgent come compilatore di workflow geografici

La prospettiva più interessante è considerare l'LLM non come il motore di esecuzione, ma come un compilatore semantico.

L'utente esprime un obiettivo in linguaggio naturale. Il modello lo traduce in una rappresentazione intermedia tipizzata. Il sistema valida questa rappresentazione, la ottimizza e la esegue utilizzando strumenti GIS affidabili.

Natural Language Goal
          |
          v
      LLM Planner
          |
          v
    GeoWorkflow IR
          |
          v
   Semantic Validation
          |
          v
   Optimization Passes
          |
          v
    Execution Plan
          |
          v
 Durable GIS Runtime
          |
          v
 Verified GeoArtifacts

Questa analogia con un compilatore è particolarmente potente.

La rappresentazione intermedia potrebbe contenere informazioni tipizzate come:

  • Sistema di riferimento spaziale.
  • Tipo geometrico.
  • Risoluzione raster.
  • Unità di misura.
  • Estensione geografica.
  • Dipendenze tra dataset.
  • Requisiti di licenza e capability GIS.
  • Classificazione dei dati.
  • Stima del costo computazionale.

Il validator potrebbe rifiutare un'operazione che combina raster con sistemi di riferimento incompatibili, utilizza unità di misura non coerenti oppure richiede capability non disponibili.

Un optimizer potrebbe invece individuare acquisizioni parallelizzabili, eliminare elaborazioni duplicate, riutilizzare risultati già presenti nello storage o selezionare differenti backend di elaborazione.

È importante distinguere ciò che è già disponibile da ciò che rappresenta una possibile evoluzione progettuale: questa GeoWorkflow IR è una proposta architetturale, non un prodotto Esri o Microsoft attualmente disponibile con tale nome.

18. Oltre il DAG: workflow gerarchici, feedback loop e sistemi autonomi

Il DAG è ideale per rappresentare dipendenze acicliche. Non descrive però naturalmente sistemi che devono reagire indefinitamente a nuovi eventi.

Un sistema di monitoraggio territoriale continuo può richiedere cicli di osservazione, analisi, verifica e aggiornamento.

La soluzione non è introdurre cicli arbitrari dentro un DAG non controllato, ma comporre workflow durevoli di durata limitata attraverso eventi, sub-orchestrazioni e nuove istanze.

Observation Event
       |
       v
Analysis Workflow
       |
       v
Verification
       |
       +-- No Change --> Archive
       |
       +-- Relevant Change
                  |
                  v
             New Event
                  |
                  v
          Follow-up Workflow

In questo modo ogni esecuzione rimane identificabile, verificabile e soggetta a quote, mentre il sistema complessivo può funzionare continuamente.

È una distinzione importante per il futuro degli agenti persistenti: persistenza della responsabilità non significa esecuzione illimitata di un singolo processo o di una singola conversazione LLM.

19. Checklist di produzione

Prima di portare in produzione un'architettura agentic workflow, verificherei almeno questi aspetti:

  • Il piano viene validato prima dell'esecuzione.
  • Ogni tool è registrato in un catalogo server-side.
  • Gli input sono tipizzati e soggetti a limiti.
  • Le autorizzazioni vengono verificate sul backend.
  • Le operazioni con effetti esterni hanno idempotency key e riconciliazione.
  • Gli orchestratori rispettano i vincoli di determinismo del replay.
  • I job remoti possono essere recuperati dopo un crash.
  • Gli output voluminosi sono esternalizzati dalla history.
  • I sub-agent hanno capability limitate.
  • Le approvazioni sono eventi autenticati.
  • Il parallelismo è limitato anche a livello di risorsa condivisa.
  • Le modifiche ai workflow già attivi sono gestite con versioning.
  • Gli audit log sono protetti da modifiche non autorizzate.
  • Le metriche misurano correttezza, costo e affidabilità, non soltanto latenza.
  • Esistono test di fault injection per crash, timeout, duplicazioni e retry.

20. Conclusione: l'LLM non deve diventare il transaction manager

Dynamic Workflows rappresenta un passaggio significativo nell'evoluzione delle architetture agentiche.

Non perché renda i modelli più intelligenti, ma perché riconosce esplicitamente che intelligenza, autorizzazione ed esecuzione affidabile sono problemi differenti.

Il modello interpreta obiettivi ambigui e propone piani. Il validator controlla che quei piani siano ammissibili. Il workflow engine esegue le attività rispettando dipendenze, retry e checkpoint. I tool applicano le operazioni reali attraverso API e identità autorizzate.

Nel mondo GIS questa separazione è ancora più importante: un LLM può scegliere quali analisi geospaziali effettuare, ma la correttezza geometrica, statistica e fisica deve rimanere responsabilità di algoritmi, dati e procedure verificabili.

La prossima generazione di GeoAgent potrebbe quindi non essere un chatbot con accesso a qualche geoprocessing tool, ma un vero sistema capace di compilare richieste territoriali in workflow geografici tipizzati, verificabili, riproducibili e osservabili.

La direzione è chiara: l'LLM definisce l'intenzione, il piano diventa un contratto e il runtime garantisce l'esecuzione. L'autonomia utile nasce quando il ragionamento probabilistico incontra un'infrastruttura deterministica.

Riferimenti tecnici

mercoledì 7 ottobre 2026

From Embedding Space to Explanation Space: capire come ragiona la GeoAI con AutoML e SHAP in ArcGIS Pro

Un embedding geospaziale può rappresentare un luogo con centinaia di numeri. Ma se quel vettore entra in un modello predittivo, come possiamo capire quali aspetti del territorio stanno realmente guidando la previsione?

È una delle domande più interessanti della GeoAI moderna, perché riguarda un punto di tensione fondamentale tra representation learning e interpretabilità: più lasciamo che sia il modello a costruire autonomamente rappresentazioni compatte e sofisticate del territorio, più perdiamo la semantica immediata delle tradizionali variabili GIS.

Un recente articolo del team Esri GeoAI, Interpret embeddings using AutoML and SHAP in ArcGIS Pro, pubblicato il 6 ottobre 2026, affronta proprio questo problema combinando quattro tecnologie:

  • USA Geodemographic Embeddings
  • Geodemographic Foundation Model (GDFM)
  • AutoML di ArcGIS Pro
  • SHAP – SHapley Additive exPlanations

Il workflow Esri utilizza come caso di studio la previsione della food insecurity negli Stati Uniti, ma il concetto è molto più generale.

Dietro l'esempio applicativo c'è infatti qualcosa di più importante: un possibile passaggio da un GIS costruito principalmente su feature progettate dall'uomo a un GIS nel quale parte della conoscenza geografica viene rappresentata attraverso latent spaces appresi da foundation model.

Ed è qui che nasce una nuova domanda:

come interpretiamo non soltanto ciò che il modello predice, ma il modo in cui utilizza una rappresentazione appresa del territorio?

1. Dal feature engineering al representation learning geografico

Nel machine learning GIS tradizionale, il processo parte normalmente da variabili esplicite:

Population density
Median household income
Age
Education
Land cover
Distance from roads
Distance from hospitals
House value
Employment rate
Slope
Elevation
...

Ogni feature ha un significato noto.

Possiamo quindi costruire una matrice:

X = [x1, x2, x3, ... xn]

e addestrare un modello:

ŷ = f(X)

Il problema è che un territorio reale può essere descritto da migliaia di variabili correlate tra loro.

La selezione manuale delle feature diventa allora costosa, fragile e fortemente dipendente dal dominio.

Il paradigma degli embedding cambia radicalmente il problema.

Thousands of geographic variables
                |
                v
       Foundation Model
                |
                v
        Latent Embedding
                |
                v
        256 dimensions

Non chiediamo più direttamente:

quali dieci variabili devo scegliere?

Chiediamo invece a un modello di apprendere una rappresentazione compatta capace di preservare strutture, correlazioni e similarità presenti nei dati.

In termini matematici:

z = E(x)

x ∈ R^n
z ∈ R^256

dove E è l'encoder e z è la rappresentazione latente del luogo.

Questo z diventa una sorta di fingerprint geografico.

2. USA Geodemographic Embeddings: circa 5.300 variabili diventano 256 numeri

Gli USA Geodemographic Embeddings di Esri rappresentano ogni area geografica attraverso un vettore denso di 256 dimensioni.

La sorgente non è un singolo dataset ma quattro differenti “view” del territorio.

View Numero di variabili Informazione principale
Housing & Household Characteristics 1.521 Housing units, occupancy, tenure, household composition
Environment 113 Climate, precipitation, land cover e contesto ambientale
American Community Survey 1.617 Income, employment, education, commuting, household structure
Age & Race Census 2.049 Population, age, race e struttura demografica

Complessivamente siamo quindi nell'ordine delle:

1,521
+ 113
+ 1,617
+ 2,049
----------------
≈ 5,300 variables

che vengono compresse in:

256 latent dimensions

È un rapporto di compressione concettualmente molto significativo.

Ma non dobbiamo interpretarlo come una semplice PCA.

Dietro gli embedding si trova il Geodemographic Foundation Model di Esri.

3. Dentro GDFM: un multiview autoencoder geografico

La caratteristica particolarmente interessante del GDFM è l'uso di una architettura multiview autoencoder.

Le quattro sorgenti non vengono semplicemente concatenate in un gigantesco vettore da dare a un singolo encoder.

Concettualmente abbiamo:

Housing & Household
       |
       v
   Encoder H
       |
       +----------> zH ∈ R^64


Environment
       |
       v
   Encoder E
       |
       +----------> zE ∈ R^64


American Community Survey
       |
       v
   Encoder A
       |
       +----------> zA ∈ R^64


Age & Race Census
       |
       v
   Encoder D
       |
       +----------> zD ∈ R^64


z = [zH | zE | zA | zD]

z ∈ R^256

Questa architettura produce una proprietà estremamente utile ai fini dell'interpretabilità:

dimensions   1 -  64 → Housing / Household
dimensions  65 - 128 → Environment
dimensions 129 - 192 → ACS / Socioeconomic
dimensions 193 - 256 → Age / Race / Demographic

Non conosciamo necessariamente il significato semantico della singola dimensione, ma conosciamo la view dalla quale quella parte dello spazio latente è stata appresa.

È una distinzione fondamentale.

4. Perché embedding_137 non significa “income”

Supponiamo che il modello identifichi:

embedding_137

come feature molto importante.

Sarebbe sbagliato concludere:

embedding_137 = income

Una dimensione latente generalmente rappresenta una combinazione non lineare di molte feature originarie.

Potrebbe catturare qualcosa che emerge dall'interazione tra:

income
education
employment
commuting
household composition
urban structure
...

La rappresentazione è distributed.

L'informazione non deve necessariamente trovarsi in una singola coordinata.

Quello che invece possiamo affermare è che la dimensione 137 appartiene al blocco:

129 - 192

e quindi deriva dalla rappresentazione latente costruita dalla view American Community Survey.

È già un'informazione molto potente.

5. Il downstream model: dall'Embedding Space al Prediction Space

Dopo aver costruito il vettore geografico:

z = [z1, z2, ..., z256]

possiamo utilizzarlo come input di un modello supervisionato:

ŷ = f(z)

Nel caso discusso da Esri:

USA Geodemographic Embedding
            |
            v
      256 predictors
            |
            v
        ArcGIS AutoML
            |
            v
     Food insecurity %

Qui avviene una separazione concettuale molto importante.

Il foundation model non sta prevedendo direttamente la food insecurity.

Sta producendo una rappresentazione generale del territorio.

Un secondo modello utilizza successivamente quella rappresentazione per un task specifico.

Abbiamo quindi:

REAL WORLD
    |
    v
Geographic data
    |
    v
GDFM
    |
    v
EMBEDDING SPACE
    |
    v
Downstream ML model
    |
    v
PREDICTION SPACE

6. ArcGIS Pro AutoML

ArcGIS Pro permette di utilizzare queste dimensioni direttamente tramite Train Using AutoML.

AutoML automatizza diverse fasi del processo di modellazione, tra cui, a seconda della modalità utilizzata:

  • exploratory data analysis;
  • model selection;
  • feature selection;
  • feature engineering;
  • cross validation;
  • hyperparameter tuning;
  • model training;
  • evaluation;
  • model packaging.

Il risultato può essere salvato come modello ArcGIS:

.dlpk

e successivamente utilizzato attraverso Predict Using AutoML.

Nel workflow illustrato da Esri viene utilizzato Basic Mode, perché è orientato soprattutto alla comprensione delle variabili e consente di produrre gli output necessari all'analisi dell'importanza.

Tra gli algoritmi utilizzabili troviamo anche modelli tree-based come LightGBM, particolarmente interessanti quando si lavora con embedding tabellari densi.

7. Perché LightGBM è interessante con un embedding

Un embedding a 256 dimensioni produce una matrice:

X ∈ R^(N × 256)

Le relazioni tra coordinate latenti e target possono essere fortemente non lineari.

Una regressione lineare assumerebbe essenzialmente:

ŷ = β0 + β1z1 + β2z2 + ... + β256z256

Un modello gradient boosting può invece apprendere:

  • threshold effects;
  • nonlinearità;
  • interazioni tra dimensioni;
  • relazioni condizionali;
  • combinazioni di feature latenti.

Per esempio:

IF z137 > thresholdA
AND z151 < thresholdB
AND z42 > thresholdC
THEN ...

può identificare configurazioni dello spazio latente difficili da rappresentare con un modello lineare.

Il prezzo da pagare è naturalmente una minore interpretabilità diretta.

Ed è qui che entra SHAP.

8. SHAP: spiegare il comportamento del modello

SHAP significa SHapley Additive exPlanations.

La teoria deriva dai valori di Shapley della teoria dei giochi cooperativi.

L'idea fondamentale consiste nell'assegnare a ogni feature un contributo alla previsione.

In forma semplificata:

f(x) = E[f(X)] + Σ φi

dove:

  • E[f(X)] rappresenta il valore di baseline del modello;
  • φi rappresenta il contributo attribuito alla feature i.

Per una specifica location potremmo avere qualcosa come:

Model baseline                       10.7

embedding_137                        +2.1
embedding_041                        +0.8
embedding_208                        -0.6
embedding_152                        +0.4
other dimensions                    +0.0

-----------------------------------------
Prediction                           13.4

Questo è il concetto di local explanation.

9. Il segno del valore SHAP conta

Un valore:

φi > 0

indica che quella feature spinge la previsione rispetto alla baseline in una direzione positiva.

Viceversa:

φi < 0

la spinge nella direzione opposta.

Questa informazione diventa però importante quando passiamo dall'explainability locale alla feature importance globale utilizzata nel workflow Esri.

10. Mean Absolute SHAP: cosa misura davvero ArcGIS

L'importance table prodotta da AutoML contiene sostanzialmente:

VARIABLE
IMPORTANCE

L'IMPORTANCE è una misura globale basata sul mean absolute SHAP.

Concettualmente:

Ii = E(|φi|)

Ovvero:

quanto, mediamente, quella feature modifica le previsioni del modello in termini di magnitudine.

Supponiamo di ottenere:

embedding_137   0.32
embedding_144   0.27
embedding_201   0.18
embedding_041   0.14

Possiamo concludere che embedding_137 riceve una forte attribuzione dal modello.

Ma attenzione:

|+0.32| = |-0.32|

L'importance globale non ci dice se quella dimensione tende ad aumentare o diminuire il target.

La direzione è stata eliminata dal valore assoluto.

11. Il trucco elegante di Esri: aggregare SHAP per segmento

A questo punto entra in gioco la struttura 4 × 64 dell'embedding.

Possiamo calcolare:

Housing importance
    = Σ IMPORTANCE dimensions 1..64

Environment importance
    = Σ IMPORTANCE dimensions 65..128

ACS importance
    = Σ IMPORTANCE dimensions 129..192

Demographic importance
    = Σ IMPORTANCE dimensions 193..256

Formalmente:

S1 = Σ Ii       i = 1...64
S2 = Σ Ii       i = 65...128
S3 = Σ Ii       i = 129...192
S4 = Σ Ii       i = 193...256

Trasformiamo quindi:

256 opaque latent dimensions

in quattro macro-dimensioni interpretabili:

Housing
Environment
Socioeconomic
Demographic

Nel caso food insecurity discusso da Esri, è il Segment 3, derivato dall'American Community Survey, a mostrare la maggiore aggregate mean absolute SHAP importance.

Il modello sta quindi facendo largo uso delle strutture socioeconomiche apprese dal GDFM.

Ma questa frase deve essere letta con molta precisione.

12. La sottigliezza matematica: non è Group SHAP

Questo è probabilmente uno dei punti tecnicamente più importanti dell'intero workflow.

Esri precisa correttamente che sommare le mean absolute SHAP importance delle singole dimensioni:

Σ E(|φi|)

non equivale a calcolare:

E(|Σ φi|)

Le due quantità sono matematicamente differenti.

Consideriamo due feature appartenenti allo stesso segmento:

φ129 = +0.8
φ130 = -0.7

Sommando le magnitudini otteniamo:

|0.8| + |-0.7| = 1.5

Ma il contributo netto combinato è:

|0.8 - 0.7| = 0.1

Quindi la segment importance utilizzata in questo workflow misura meglio:

la quantità complessiva di attività attributiva presente nelle dimensioni del segmento

che non:

il contributo netto del segmento alla previsione.

Non è una distinzione accademica: cambia radicalmente il significato del risultato.

13. Feature importance non significa predictive value

C'è un secondo errore interpretativo molto comune.

Supponiamo di ottenere:

Housing          20%
Environment      11%
ACS              47%
Demographics     22%

Non possiamo concludere:

senza ACS il modello perderebbe il 47% della propria accuratezza.

SHAP non misura questo.

Misura come il modello già addestrato distribuisce le proprie attribuzioni.

Per misurare il predictive value incrementale di un segmento servirebbe invece una vera ablation study.

14. Ablation study: il test che farei in un progetto reale

Addestriamo inizialmente il modello completo:

Model FULL

Housing
Environment
ACS
Demographic

R² = 0.82

Poi rimuoviamo sistematicamente interi segmenti.

FULL                         R² = 0.82

without Housing              R² = 0.80
without Environment          R² = 0.81
without ACS                  R² = 0.67
without Demographics         R² = 0.78

Ora possiamo osservare:

ΔR² ACS = 0.82 - 0.67
        = 0.15

Questa misura risponde a una domanda differente:

quanto valore predittivo perde il modello quando elimino l'informazione contenuta in quella rappresentazione?

Esiste poi un'altra possibilità: effettuare una joint permutation di tutte le 64 dimensioni del segmento e misurare la degradazione delle performance.

SHAP, ablation e permutation importance diventano quindi strumenti complementari.

SHAP
    → attribution

Ablation
    → incremental predictive value

Permutation
    → dependence of performance on information

Causal analysis
    → entirely different question

15. Il problema nascosto: le latent feature sono correlate

Gli aspetti che descrivono un territorio non sono indipendenti.

Consideriamo:

income
   ↕
education
   ↕
employment
   ↕
house value
   ↕
urban form
   ↕
mobility
   ↕
accessibility

Queste strutture sono fortemente correlate nel mondo reale.

Il representation learning trasferisce parte di queste dipendenze anche nello spazio latente.

Quindi le dimensioni:

z1 ... z256

non devono essere considerate automaticamente indipendenti.

Questo crea una delle classiche difficoltà dei metodi di feature attribution.

Se due variabili contengono informazione ridondante, il modello può distribuirne il “credito” in modi differenti.

Perciò:

SHAP importance of latent dimension

non deve essere trasformata impropriamente in:

importance of a real-world phenomenon

Il secondo concetto è molto più forte del primo.

16. SHAP non decodifica l'embedding

Questa distinzione merita di essere evidenziata.

SHAP non sta facendo:

embedding_137
      |
      v
"this dimension means income"

Sta facendo:

embedding_137
      |
      v
downstream model
      |
      v
"the fitted predictor relies strongly
 on this latent coordinate"

In altre parole:

SHAP non spiega necessariamente ciò che il foundation model ha imparato. Spiega come il downstream model utilizza ciò che il foundation model ha rappresentato.

È probabilmente la distinzione concettuale più importante da portarsi a casa.

17. Tre differenti livelli di interpretabilità

Possiamo formalizzare il problema distinguendo tre livelli.

LEVEL 1
REPRESENTATION INTERPRETATION

What information is encoded in z?


LEVEL 2
MODEL ATTRIBUTION

Which parts of z does f(z) use?


LEVEL 3
CAUSAL INTERPRETATION

Which real-world mechanisms cause Y?

Il workflow AutoML + SHAP opera principalmente al livello 2.

La conoscenza della struttura 4 × 64 consente parzialmente di risalire verso il livello 1.

Ma non arriviamo automaticamente al livello 3.

18. SHAP non implica causalità

Se il segmento ACS ha la maggiore importance nella previsione della food insecurity, possiamo affermare:

il modello utilizza fortemente pattern latenti appresi dal contesto socioeconomico.

Non possiamo automaticamente affermare:

il contesto socioeconomico causa la food insecurity nella misura indicata da SHAP.

Il modello rappresenta una relazione:

P(Y | X)

non necessariamente un intervento causale:

P(Y | do(X))

Questa distinzione tra predictive ML e causal inference diventa ancora più importante con gli embedding, perché la semantica delle feature non è esplicita.

19. Nel GIS compare un problema ancora più serio: spatial autocorrelation

Finora abbiamo ragionato come se le osservazioni fossero indipendenti.

Ma nel mondo geografico questo spesso non è vero.

La prima legge della geografia di Tobler rimane estremamente pertinente:

Everything is related to everything else, but near things are more related than distant things.

Due aree vicine possono condividere:

  • struttura demografica;
  • mercato immobiliare;
  • infrastrutture;
  • clima;
  • mobilità;
  • servizi;
  • accessibilità;
  • politiche locali;
  • storia economica.

Di conseguenza possono avere embedding molto simili.

20. Random train/test split e spatial leakage

Consideriamo un classico split casuale:

TRAIN

County A
County B
County C


TEST

County D

Se D confina con A, B e C e appartiene allo stesso regime geografico, il test potrebbe essere meno indipendente di quanto sembri.

Il modello potrebbe ottenere ottime performance semplicemente interpolando nello stesso contesto spaziale.

Non abbiamo necessariamente dimostrato:

generalization to unseen geography

ma magari soltanto:

interpolation inside a known spatial regime

Per un workflow GeoAI rigoroso affiancherei quindi al normale test una spatial cross-validation.

21. Spatial cross-validation

Una strategia migliore può essere:

Geography
    |
    v
Spatial blocks
    |
    +---- Fold A
    +---- Fold B
    +---- Fold C
    +---- Fold D
    +---- Fold E

I blocchi possono essere costruiti utilizzando:

  • H3;
  • grid regolari;
  • macroregioni amministrative;
  • clustering spaziale;
  • buffered holdout;
  • spatial blocking.

L'obiettivo è verificare se:

Model trained here
        |
        | geographic separation
        v
Predicts there

mantiene davvero performance elevate.

È una distinzione fondamentale quando vogliamo utilizzare foundation model geospaziali in produzione.

22. Performance globale e performance geografica non sono la stessa cosa

In un problema spaziale non mi fermerei quindi a:

R²
RMSE
MAE
F1
Accuracy

Analizzerei anche:

metric by region
metric by urban/rural context
metric by density
metric by embedding cluster
metric by distance from training data
metric by spatial regime

Per esempio un modello può avere:

Overall R² = 0.84

ma:

Urban areas      R² = 0.90
Suburban areas   R² = 0.87
Rural areas      R² = 0.58

Il singolo valore aggregato nasconde completamente il problema.

23. H3 Resolution 7 e il problema della scala

Gli USA Geodemographic Embeddings vengono distribuiti a livello di Uber H3 resolution 7.

Questa scelta crea una tessellazione geografica regolare e molto utile per la costruzione di rappresentazioni spatially consistent.

Ma spesso il nostro problema lavora a un'altra scala:

H3 cells
   |
   v
County

oppure

H3 cells
   |
   v
Municipality

oppure

H3 cells
   |
   v
Custom catchment area

Serve quindi aggregare gli embedding.

24. Non basta necessariamente fare la media dei 256 numeri

Qui incontriamo un punto matematicamente sottile.

Per un encoder non lineare E, generalmente:

Aggregate(E(x))
        ≠
E(Aggregate(x))

Il significato è importante.

L'embedding medio di dieci territori non equivale necessariamente all'embedding che avremmo ottenuto addestrando o applicando l'encoder sulla descrizione aggregata di quei territori.

Per questo ArcGIS introduce strumenti embedding-aware come:

Merge Embeddings

anziché ridurre il problema a una semplice operazione arbitraria sulle colonne.

25. MAUP non scompare con gli embedding

Il Modifiable Areal Unit Problem, uno dei problemi classici della spatial analysis, continua quindi ad esistere.

Gli embedding non lo eliminano.

Cambiando:

  • scala;
  • aggregazione;
  • confini;
  • unità geografica;

possono cambiare le strutture statistiche osservate.

In futuro dovremo probabilmente parlare molto di più di:

representation stability across geographic scales.

È un problema molto interessante per la ricerca GeoAI.

26. Il workflow concreto in ArcGIS Pro

La pipeline pratica diventa approssimativamente:

USA Geodemographic Embeddings
            |
            | H3 resolution 7
            v
      Merge Embeddings
            |
            v
        BLOB field
            |
            v
Extract Embedding To Fields
            |
            +--- emb_1
            +--- emb_2
            +--- ...
            +--- emb_256
            |
            v
      Train Using AutoML
            |
            +--- model selection
            +--- training
            +--- evaluation
            +--- importance
            |
            v
           DLPK
            |
            v
      Predict Using AutoML

ArcGIS può memorizzare gli embedding in un campo BLOB, mantenendoli come singolo oggetto vettoriale per gli strumenti embedding-aware.

Quando occorre utilizzare algoritmi tabellari tradizionali, Extract Embedding To Fields deserializza il vettore nelle singole colonne.

27. Embedding come predictor oppure come augmentation?

Ci sono due strategie differenti.

Prima strategia:

Embeddings
    |
    v
Model
    |
    v
Prediction

Gli embedding costituiscono l'intero set di predictor.

Seconda strategia:

Domain variables
       +
Geodemographic embeddings
       |
       v
      Model
       |
       v
   Prediction

La seconda è probabilmente quella più interessante per molti problemi reali.

28. Un esempio: flood vulnerability

Immaginiamo di voler prevedere vulnerabilità o impatto potenziale di un evento alluvionale.

Potremmo costruire feature fisiche:

DEM
Slope
Flow accumulation
Distance from river
Terrain roughness
Soil permeability
Building elevation
Rainfall
Hydraulic variables

e aggiungere:

Geodemographic Embedding

Housing context
Environmental context
Socioeconomic context
Demographic context

Otteniamo:

PHYSICAL SYSTEM
      +
HUMAN CONTEXT
      |
      v
 GeoAI MODEL

Questa combinazione può essere estremamente potente perché distingue due categorie di informazione.

Explicit domain features

        +

Learned contextual representation

Il modello può così utilizzare contemporaneamente conoscenza fisica progettata dall'esperto e rappresentazioni apprese dal foundation model.

29. SHAP può dirci se l'embedding aggiunge contesto realmente usato dal modello

Supponiamo che il modello abbia:

Elevation
Slope
DistanceRiver
FlowAccumulation

+

emb_1 ... emb_256

SHAP può mostrarci che:

physical variables               62%

geodemographic embedding         38%

e all'interno dell'embedding:

Housing            8%
Environment        13%
Socioeconomic      12%
Demographics        5%

Questo crea una sorta di osservabilità del modello che sarebbe impossibile limitandosi alle sole metriche predittive.

30. Global SHAP è solo l'inizio: il GIS vuole Local SHAP

Il vero salto concettuale arriva quando smettiamo di pensare a SHAP soltanto come a un grafico.

Nel GIS ogni osservazione possiede una geometria.

Questo significa che le spiegazioni possono essere riportate nello spazio.

Per ogni feature geografica possiamo immaginare:

ID = 10382

Prediction            0.74

Housing SHAP          +0.08
Environment SHAP      +0.05
Socioeconomic SHAP    +0.21
Demographic SHAP      -0.03

Ora questi valori possono diventare attributi geografici.

31. Da Explainable AI a Spatial Explainable AI

Possiamo costruire quattro mappe:

Housing Attribution Map

Environment Attribution Map

Socioeconomic Attribution Map

Demographic Attribution Map

A questo punto non stiamo più chiedendo soltanto:

quali feature sono importanti?

Possiamo chiedere:

dove determinate famiglie di feature sono importanti?

Questo piccolo cambiamento introduce una dimensione analitica completamente nuova.

Feature attribution
       +
Geography
       =
Spatial attribution

32. Cercare autocorrelazione nelle spiegazioni

Una volta ottenuto uno SHAP value geografico, possiamo addirittura applicare strumenti spatial statistics alle spiegazioni del modello.

Per esempio:

Local Moran's I(SHAP_ACS)

Getis-Ord Gi*(SHAP_ENV)

Spatial clustering(SHAP_HOUSING)

La domanda diventa:

esistono cluster geografici nei quali il modello utilizza sistematicamente lo stesso tipo di informazione?

Questo è molto più interessante della tradizionale feature importance globale.

33. Possiamo costruire un vero Explanation Space

Facciamo un ulteriore passo.

Per ogni location definiamo:

S(x) = [

  SHAP_Housing,
  SHAP_Environment,
  SHAP_Socioeconomic,
  SHAP_Demographics

]

Ora ogni luogo non è descritto da ciò che è, ma da come il modello ragiona su quel luogo.

Abbiamo creato un nuovo spazio vettoriale:

Explanation Space.

34. Clusterizzare il modo in cui il modello ragiona

Possiamo applicare clustering agli explanation vector.

                    EXPLANATION SPACE

                          |
          +---------------+---------------+
          |               |               |
          v               v               v

      Cluster A        Cluster B       Cluster C

 socioeconomic         environmental      housing
    driven                driven          driven

Questi cluster non significano:

questi territori sono geograficamente simili.

Significano qualcosa di diverso:

il modello utilizza pattern simili per formulare una previsione su questi territori.

È una distinzione sottile ma potentissima.

35. Embedding Space, Prediction Space, Explanation Space

Possiamo quindi descrivere l'intero sistema attraverso tre spazi.

                 REAL WORLD
                     |
                     v
            Raw geographic data
                     |
                     v
             Foundation Model
                     |
                     v

             EMBEDDING SPACE
        "What is this place like?"
                     |
                     v
            Downstream model
                     |
                     v

             PREDICTION SPACE
       "What may happen here?"
                     |
                     v
                   SHAP
                     |
                     v

             EXPLANATION SPACE
       "Why did the model think so?"

Questa, a mio avviso, è una delle chiavi concettuali più interessanti dell'evoluzione futura della GeoAI.

36. E potremmo aggiungere un quarto spazio: Uncertainty Space

Per un sistema realmente maturo manca però ancora qualcosa.

Embedding
    |
    v
Prediction
    |
    v
Explanation
    |
    v
Uncertainty

Non basta sapere:

Prediction = 0.83

Vorremmo sapere anche:

How uncertain is 0.83?

How far is this location
from training distribution?

Is this geography represented
inside the training set?

How stable is the SHAP explanation?

Questo porta verso temi come:

  • out-of-distribution detection;
  • epistemic uncertainty;
  • prediction intervals;
  • embedding distance;
  • explanation stability;
  • model calibration.

37. Embedding distance come possibile segnale di OOD

Consideriamo una nuova location x*.

Otteniamo:

z* = E(x*)

Possiamo misurare la distanza da regioni note del training embedding space.

d(z*, TrainingEmbeddingSpace)

Se la distanza è molto elevata, potremmo trovarci davanti a una geografia che il downstream model non ha mai realmente incontrato.

A quel punto un valore:

Prediction = 0.91

non dovrebbe avere lo stesso significato operativo di un'altra previsione 0.91 effettuata nel cuore della distribuzione di training.

Un GIS realmente AI-native dovrebbe probabilmente mostrare entrambe.

Prediction     0.91
Confidence     LOW
OOD distance   HIGH

38. Explainability stability: un altro problema poco discusso

Anche la spiegazione dovrebbe essere sottoposta a test di stabilità.

Se piccolissime variazioni dell'input producono:

Location A

ACS importance = 60%


Almost identical Location A'

ACS importance = 12%
Environment    = 55%

potremmo avere una spiegazione fragile.

In futuro potrebbe quindi essere utile introdurre metriche del tipo:

Explanation Stability Score

ottenute perturbando ragionevolmente gli input e osservando la varianza delle attribuzioni.

39. Foundation models stanno cambiando il concetto stesso di GIS feature

Storicamente una GIS feature è stata qualcosa come:

Geometry
+
Attributes

Per esempio:

Polygon

POPULATION = 12450
INCOME     = 38200
AREA       = 18.3
...

Con i foundation model possiamo iniziare a immaginare:

Geometry

+

Explicit Attributes

+

Embedding

+

Prediction

+

Explanation

+

Uncertainty

Questa potrebbe diventare una forma molto più ricca di AI-enabled geographic feature.

40. Dal Semantic GIS al Latent GIS

Tradizionalmente attribuiamo significato al territorio mediante uno schema progettato dall'uomo.

FIELD_NAME
FIELD_TYPE
DOMAIN
VALUE

Gli embedding introducono invece una seconda forma di conoscenza:

human-defined semantic attributes

             +

machine-learned latent attributes

Potremmo pensare a questo come a un passaggio da:

Semantic GIS

verso un sistema ibrido:

Semantic + Latent GIS.

Il primo rimane interpretabile dall'uomo.

Il secondo può catturare strutture troppo complesse per essere progettate manualmente.

41. E qui arriva il collegamento con GeoAI e GeoAgents

Questo tipo di rappresentazione diventa ancora più interessante se pensiamo ai futuri agenti geospaziali.

Un GeoAgent potrebbe interrogare contemporaneamente:

Feature attributes
Spatial relationships
Raster data
Vector embeddings
Geodemographic embeddings
Satellite embeddings
Document embeddings
Model predictions
SHAP explanations

La query:

trova aree simili a questa, ma nelle quali il rischio previsto è più elevato e spiegami quale differenza socioeconomica sta guidando il modello

potrebbe essere trasformata in una pipeline:

User question
      |
      v
GeoAgent
      |
      +------ Spatial Query
      |
      +------ Embedding Similarity
      |
      +------ ML Prediction
      |
      +------ SHAP Explanation
      |
      +------ Spatial Statistics
      |
      v
Natural-language answer
+
Map
+
Evidence

Questa è una prospettiva decisamente più interessante del semplice chatbot sopra una mappa.

42. Non soltanto geodemographic embeddings

Lo stesso paradigma può essere esteso ad altri foundation model geospaziali.

Satellite imagery
      |
      v
Vision Foundation Model
      |
      v
Image embedding


Demographic/environmental data
      |
      v
GDFM
      |
      v
Geodemographic embedding


Documents / reports
      |
      v
Language model
      |
      v
Text embedding


Mobility graph
      |
      v
Graph model
      |
      v
Network embedding

Una location potrebbe quindi essere descritta attraverso una rappresentazione multimodale:

Zlocation = [

  Zgeo,
  Zsatellite,
  Ztext,
  Znetwork,
  Ztemporal

]

A quel punto l'explainability non dovrà più rispondere solamente:

quale feature è importante?

ma anche:

quale modalità informativa sta guidando la decisione?

43. Una possibile architettura GeoAI di nuova generazione

                 ┌─────────────────────┐
                 │   GEOGRAPHIC WORLD  │
                 └──────────┬──────────┘
                            │
           ┌────────────────┼────────────────┐
           │                │                │
           v                v                v
      Tabular Data      Imagery          Documents
           │                │                │
           v                v                v
         GDFM          Vision FM            LLM
           │                │                │
           v                v                v
      Geo Embedding    Image Embedding   Text Embedding
           │                │                │
           └────────────────┼────────────────┘
                            │
                            v
                    MULTIMODAL SPACE
                            │
                            v
                    Downstream Model
                            │
                 ┌──────────┴──────────┐
                 │                     │
                 v                     v
             Prediction            Retrieval
                 │                     │
                 └──────────┬──────────┘
                            │
                            v
                       Explainability
                            │
                            v
                  Spatial Explainability
                            │
                            v
                         GeoAgent

Se questa direzione continuerà, la GeoAI non sarà semplicemente “AI applicata ai dati GIS”.

Diventerà un sistema nel quale il territorio stesso possiede rappresentazioni vettoriali riutilizzabili da molteplici modelli e task.

44. Il punto più importante: prediction non basta più

Per anni abbiamo valutato un modello quasi esclusivamente attraverso metriche come:

Accuracy
Precision
Recall
F1
RMSE
MAE
R²

Nella GeoAI moderna questo non è sufficiente.

Dovremmo iniziare a valutare contemporaneamente:

Predictive performance

Spatial generalization

Representation quality

Explanation quality

Explanation stability

Out-of-distribution behavior

Uncertainty calibration

Geographic fairness

Scale sensitivity

Il modello migliore non è necessariamente quello che guadagna l'ultimo 0,01 di R².

Potrebbe essere quello che mantiene:

  • buone performance;
  • buona generalizzazione geografica;
  • spiegazioni stabili;
  • incertezza calibrata;
  • comportamento prevedibile fuori distribuzione.

45. La vera rivoluzione: rappresentazioni geografiche riutilizzabili

Il passaggio fondamentale introdotto dai geodemographic embeddings non è quindi semplicemente:

5300 variables
      ↓
256 variables

È qualcosa di più profondo:

task-specific geographic variables

              ↓

reusable geographic representation

Una volta costruita la rappresentazione, possiamo riutilizzarla per:

  • regression;
  • classification;
  • clustering;
  • segmentation;
  • similarity search;
  • feature enrichment;
  • anomaly detection;
  • retrieval;
  • spatial reasoning.

Questo è esattamente ciò che i foundation model hanno fatto in altri domini.

Ora stiamo iniziando a vedere lo stesso paradigma entrare seriamente nel GIS.

46. From Embedding Space to Explanation Space

Il workflow mostrato da Esri sembra inizialmente molto semplice:

Embeddings
    +
AutoML
    +
SHAP

ma dietro questi tre elementi c'è un cambiamento architetturale importante.

RAW GEOGRAPHY
      |
      v
REPRESENTATION LEARNING
      |
      v
EMBEDDING SPACE
      |
      v
MACHINE LEARNING
      |
      v
PREDICTION SPACE
      |
      v
EXPLAINABLE AI
      |
      v
EXPLANATION SPACE
      |
      v
SPATIAL ANALYSIS
      |
      v
GEOGRAPHIC UNDERSTANDING

Il passaggio veramente interessante è l'ultimo.

Non vogliamo soltanto modelli capaci di fare previsioni sul territorio.

Vogliamo poter analizzare geograficamente come e perché quei modelli arrivano alle proprie conclusioni.

Conclusioni

L'approccio mostrato da Esri rappresenta un passo importante verso una GeoAI più interpretabile.

La struttura del Geodemographic Foundation Model permette di trasformare 256 dimensioni latenti apparentemente opache in quattro grandi domini semantici:

Housing
Environment
Socioeconomic
Demographic

SHAP permette poi di osservare come un downstream model utilizza quelle rappresentazioni.

Ma bisogna evitare scorciatoie interpretative.

Mean absolute SHAP non rappresenta causalità.

Segment SHAP non equivale a Group SHAP.

Feature attribution non equivale a predictive value.

Una latent dimension non corrisponde automaticamente a una variabile originaria.

Un'ottima cross-validation casuale non garantisce generalizzazione geografica.

Gli embedding non eliminano problemi classici del GIS come autocorrelazione spaziale e MAUP.

Ma, utilizzati correttamente, introducono qualcosa di estremamente potente: la possibilità di lavorare con rappresentazioni geografiche apprese, riutilizzabili e interrogabili.

Il prossimo salto potrebbe essere quello di trasformare SHAP da semplice strumento di interpretazione ML in un vero oggetto geografico:

Prediction Map
      +
Explanation Map
      +
Uncertainty Map

e quindi passare definitivamente:

from Embedding Space to Explanation Space.

Quando arriveremo a questo punto, explainability e spatial analysis non saranno più due discipline separate.

Potremo utilizzare gli strumenti GIS non soltanto per studiare il fenomeno geografico, ma anche per studiare geograficamente il comportamento dell'intelligenza artificiale che lo sta interpretando.

E questa potrebbe diventare una delle aree più interessanti della prossima generazione di GeoAI.


Riferimenti