Vai al contenuto principale

#microsoftgraph

Grounding AI su SharePoint Embedded: come fare RAG senza creare un vector database

Il problema che tutti conosciamo: costruire un RAG è lento, non è l’app che vuoi fareChi ha provato a costruire un’applicazione AI “grounded” sui docu

Altro...

Il problema che tutti conosciamo: costruire un RAG è lento, non è l’app che vuoi fareChi ha provato a costruire un’applicazione AI “grounded” sui documenti aziendali conosce bene la lista di lavoro che precede la parte interessante: estrarre il testo dai file, suddividerlo in chunk, generare gli embedding, scegliere e gestire un vector database, sincronizzare periodicamente i contenuti e — il pezzo più trascurato e più rischioso — replicare a mano i permessi di accesso di ogni singolo utente su ogni singolo documento indicizzato. Microsoft ha pubblicato di recente una guida che affronta direttamente questo problema per chi costruisce su Embedded: niente vector database da creare, perché il retrieval passa attraverso un’API di Microsoft Graph che si appoggia al semantic index già presente nel tenant Microsoft 365.

Per chi non lo conoscesse, SharePoint Embedded è la variante “headless” di SharePoint pensata per gli sviluppatori: permette di usare lo , la sicurezza e la governance di SharePoint dentro un’applicazione personalizzata, senza l’interfaccia utente classica di SharePoint. I contenuti restano all’interno di nel tenant Microsoft 365 del cliente, e le policy di Microsoft (audit, eDiscovery, retention, DLP, sensitivity label, conditional access) si applicano automaticamente, senza bisogno di ricostruirle nell’app.

Due strade per il grounding, non una solaLa documentazione Microsoft distingue due approcci, a seconda di chi deve avere il controllo sull’orchestrazione:

Microsoft Foundry Agent Service con una knowledge source SharePoint: il retrieval è gestito interamente da Foundry come parte ’agente. Scelta naturale se l’agente è già costruito su Foundry.

Microsoft 365 Retrieval API: l’applicazione esegue da sé il passo di grounding, mantenendo il controllo completo su prompt, orchestrazione e scelta del modello generativo. È l’opzione da preferire per chi vuole costruire una pipeline RAG personalizzata senza rinunciare alla ricerca semantica gestita da Microsoft.

Come funziona la Retrieval API in praticaL’endpoint è parte di Microsoft Graph:

POST https://graph.microsoft.com/v1.0/copilot/retrieval
Content-Type: application/json
Authorization: Bearer {access_token}

{
"queryString": "Quali sono le clausole dell'accordo con Contoso?",
"dataSource": "sharePointEmbedded",
"dataSourceConfiguration": {
"sharePointEmbedded": {
"containerTypeId": "{containerTypeId}"
}
},
"maximumNumberOfResults": 10
}Alcuni dettagli tecnici rilevanti per chi deve integrarla:

Richiede un token delegato: le chiamate app-only (senza utente autenticato) non sono previste, e il permesso Graph necessario è FileStorageContainer.Selected.

I risultati restituiti sono già filtrati in base ai permessi reali dell’utente autenticato sui file in SharePoint Embedded: non serve replicare la logica di autorizzazione nell’app o nel vector store, il problema più insidioso di un RAG costruito da zero è risolto a monte.

È possibile restringere la ricerca con filterExpression, usando una sintassi KQL sulle managed property indicizzate (ad esempio ClientMatterCodeOWSTEXT="…" per una colonna di metadati personalizzata). Importante usare = per un match esatto: l’operatore : esegue un term matching più permissivo che può restituire prefissi o valori correlati non voluti.

Il parametro resourceMetadata permette di richiedere campi aggiuntivi (titolo, autore, metadati custom) per ogni risultato, a costo di un payload più pesante.

La risposta restituisce una collezione di retrievalHits, ciascuno con un webUrl opaco al file originale e uno o più extracts di testo ordinati per relevanceScore:

{
"retrievalHits": [
{
"webUrl": "https://contoso.com/spe/file",
"extracts": [
{
"text": "L'accordo si rinnova annualmente salvo preavviso di 30 giorni da una delle parti.",
"relevanceScore": 0.8421
}
]
}
]
}Da qui in poi il lavoro è quello consueto di un RAG: passare gli estratti come contesto al modello generativo scelto. Un esempio minimale in JavaScript per il passo di grounding:

const response = await fetch(
"https://graph.microsoft.com/v1.0/copilot/retrieval",
{
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: Bearer ${accessToken}
},
body: JSON.stringify({
queryString: query,
dataSource: "sharePointEmbedded",
dataSourceConfiguration: {
sharePointEmbedded: { containerTypeId }
}
})
}
);

const data = await response.json();
const grounding = (data.retrievalHits ?? []).map(hit => ({
url: hit.webUrl,
text: hit.extracts?.[0]?.text?.trim(),
score: hit.extracts?.[0]?.relevanceScore
}));
// grounding va passato come contesto al modello generativoPrerequisiti e fatturazione: cosa serve prima di iniziareUn’applicazione SharePoint Embedded con almeno un container e il relativo container type ID.

Fatturazione pay-as-you-go configurata sul container type, senza impegno minimo iniziale.

Almeno un utente del tenant con licenza Microsoft 365 Copilot: serve per inizializzare il semantic index, ma non è richiesta una licenza individuale per ogni utente che interroga poi la Retrieval API.

La proprietà discoverability deve essere abilitata sul container type: senza di essa i contenuti non sono visibili a Copilot, ed è un’impostazione governata a livello di tenant, non modificabile unilateralmente dall’app.

Le chiamate alla Retrieval API vengono fatturate tramite il Copilot Studio message meter, con due modelli possibili: standard billing (a carico del tenant che sviluppa l’app) o pass-through billing (a carico del tenant che la utilizza).

Da segnalare anche un dettaglio utile per chi vuole prototipare rapidamente: è disponibile in preview pubblica un server MCP open source (@microsoft/spe-mcp, avviabile con npx @microsoft/spe-mcp) che espone SharePoint Embedded come knowledge source a client compatibili come GitHub Copilot in VS Code, Copilot CLI, Claude e Cursor — utile per esplorare rapidamente i contenuti di un container durante lo sviluppo senza scrivere subito codice di integrazione.

Cosa cambia rispetto a un RAG “fatto in casa”Il compromesso è chiaro e va valutato con attenzione prima di adottarlo: si rinuncia al controllo diretto sulla pipeline di estrazione, chunking ed embedding — e quindi alla possibilità di personalizzarla finemente — in cambio dell’eliminazione di tre problemi che in un RAG self-hosted sono spesso sottovalutati in fase di progettazione: la gestione del ciclo di vita dell’indice, la sincronizzazione con i permessi reali dei file e i costi operativi di un vector database dedicato. Per team che lavorano già dentro l’ecosistema Microsoft 365 e che devono costruire agenti o assistenti su documentazione interna, è un’opzione che merita di essere valutata prima di investire tempo in un’infrastruttura RAG completamente custom — soprattutto quando il vincolo di conformità sui permessi è più critico della flessibilità del modello di retrieval.

Fonte: Microsoft 365 Developer Blog e documentazione Microsoft Learn.

#ai #intelligenzaartificiale #guide #howto #azure #copilot #sharepoint #microsoftgraph

0

Caricamento...

0
2

Caricamento...

EWSAllowedAppIDs obbligatorio dal 10 ottobre: come Exchange Online blocca le app EWS non autorizzate

Il 10 ottobre 2026 Online smette di fare da “buon vicino” con le applicazioni che parlano ancora Exchange Services (EWS). Da quella dat

Altro...

Il 10 ottobre 2026 Online smette di fare da “buon vicino” con le applicazioni che parlano ancora Exchange Services (EWS). Da quella data, avere EWS abilitato sul tenant non basta più: ogni app, script o integrazione che chiama EWS deve comparire in un elenco esplicito di AppID autorizzati, altrimenti viene bloccata all’istante. È la fase finale di un ritiro annunciato da anni, ma che molti amministratori hanno rimandato perché “funzionava ancora tutto”. Questo articolo spiega cosa cambia davvero, come verificare se il vostro tenant è a rischio e come costruire l’allow list senza rompere le integrazioni .NET o che dipendono da EWS.

Cos’è EWSAllowedAppIDsEWSAllowedAppIDs è un parametro della configurazione ’organizzazione Exchange Online che funziona come allow list: contiene l’elenco, separato da virgole, degli Application ID (AppID) di Microsoft ID autorizzati a usare EWS. Qualsiasi chiamata EWS proveniente da un’app il cui AppID non è in quella lista viene rifiutata, indipendentemente dal fatto che EwsEnabled sia impostato su $true.

In pratica Microsoft sta trasformando un interruttore “on/off” globale in un controllo granulare per singola applicazione, lo stesso modello già visto con le app EWS “note” (Outlook per Mac, Skype for Business, strumenti di migrazione) negli anni precedenti.

Le date che contanoLa timeline comunicata da Microsoft nel Message Center (MC1485116) è questa:

2 ottobre 2026 — Microsoft individua i tenant interessati; da questa data ogni nuova abilitazione di EWS richiede la configurazione manuale dell’AppID.

8-9 ottobre 2026 — per i tenant che avevano già EwsEnabled = $true ma nessuna lista configurata, Microsoft popola automaticamente EWSAllowedAppIDs sulla base dell’attività osservata negli ultimi 60 giorni.

10 ottobre 2026 — inizia l’enforcement: le applicazioni non presenti nella lista perdono l’accesso a EWS.

Entro luglio 2027 — completamento del rollout su tutti gli ambienti, inclusi GCC, GCC High e DoD.

Il punto debole dell’auto-popolamento è evidente: un job pianificato che chiama EWS una volta al mese, o un’integrazione usata solo a fine trimestre, può restare fuori dalla finestra di osservazione dei 60 giorni e quindi fuori dall’allow list automatica.

Come verificare lo stato del tenantIl primo comando da eseguire, con il modulo Exchange Online PowerShell connesso, è:

Get-OrganizationConfig -RetrieveEwsOperationAccessPolicy | Format-List EwsEnabled, EwsAllowedAppIDsAttenzione a un dettaglio poco intuitivo: lo switch -RetrieveEwsOperationAccessPolicy è obbligatorio. Senza di esso, EwsAllowedAppIDs viene restituito vuoto anche se in realtà è configurato, inducendo falsi allarmi (o false sicurezze).

Trovare le applicazioni che usano ancora EWSPrima di scrivere la lista, bisogna sapere cosa c’è davvero in circolazione. L’approccio consigliato combina due fonti:

La lista attuale (se esiste) restituita dal comando sopra.

Le service principal di Microsoft Entra ID che possiedono il ruolo applicativo full_access_as_app su Exchange Online, il cui Role ID è dc890d15-9560-4a4c-9b7f-a736ec74ec40.

Con il modulo Microsoft Graph PowerShell è possibile incrociare le due liste:

Connect-MgGraph -Scopes "Application.Read.All"

$ewsRoleId = "dc890d15-9560-4a4c-9b7f-a736ec74ec40"
$exchangeSpn = Get-MgServicePrincipal -Filter "AppId eq '00000002-0000-0ff1-ce00-000000000000'"

Get-MgServicePrincipal -All | ForEach-Object {
$assignments = Get-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $.Id
if ($assignments.AppRoleId -contains $ewsRoleId) {
[PSCustomObject]@{ DisplayName = $
.DisplayName; AppId = $_.AppId }
}
}Il risultato è l’elenco delle app che potrebbero ancora dover parlare con EWS. Confrontandolo con la lista già approvata si individuano sia le app dimenticate (permesso presente, ma assenti dall’allow list) sia gli AppID “fantasma” già presenti nella lista ma di origine incerta, probabilmente da ripulire.

Configurare l’allow list senza sorpreseIl comando per impostare la lista è semplice, ma nasconde un comportamento critico: la lista viene sovrascritta interamente, non esiste un’operazione di append.

Set-OrganizationConfig -EwsEnabled $true -EwsAllowedAppIDs "f8d98a96-0999-43f5-8af3-69971c7bb423,,"Questo significa che ogni modifica deve includere tutti gli AppID necessari in un unico comando, Outlook e gli strumenti Microsoft compresi se risultano nei log di utilizzo (Outlook classico, Power Query in Excel, alcuni connettori Power BI possono ancora passare da EWS in scenari legacy). Dimenticare un solo AppID equivale a disattivare quell’integrazione dal giorno alla notte.

Un altro dettaglio operativo da non sottovalutare: le modifiche alla allow list richiedono fino a 24 ore per propagarsi su tutto il servizio. Chi arriva al 9 o 10 ottobre a correggere la lista rischia una finestra di downtime non banale.

La vera via d’uscita: migrare a Microsoft GraphEWSAllowedAppIDs è un cerotto, non una cura. La direzione strategica di Microsoft resta la stessa da anni: migrare da EWS alle API di Microsoft Graph per Mail, Calendar e Contacts. Per chi mantiene integrazioni .NET basate sulla EWS Managed API, il percorso tipico è sostituire le chiamate SOAP con il Microsoft Graph SDK per .NET:

var graphClient = new GraphServiceClient(credential, scopes);

var messages = await graphClient.Users["user@contoso.com"]
.Messages
.GetAsync(config =>
{
config.QueryParameters.Top = 25;
config.QueryParameters.Select = new[] { "subject", "from", "receivedDateTime" };
});Il vantaggio non è solo la sopravvivenza alla scadenza del 10 ottobre: le API Graph supportano permessi granulari con Microsoft Entra ID, throttling più predicibile e webhook nativi, assenti nel mondo EWS.

Checklist operativa prima del 10 ottobreEseguire Get-OrganizationConfig -RetrieveEwsOperationAccessPolicy su ogni tenant gestito.

Incrociare la lista con le service principal che hanno il ruolo full_access_as_app.

Includere esplicitamente le app Microsoft first-party se emergono dai log di utilizzo.

Pianificare la modifica con almeno 24-48 ore di margine, non il 9 ottobre pomeriggio.

Avviare (o completare) la migrazione delle integrazioni critiche verso Microsoft Graph, trattando EWSAllowedAppIDs come misura ponte.

Fonte: 4sysops e Microsoft Tech Community.

#powershell #tutorial #net #exchange #microsoftgraph

0

Caricamento...

0
1

Caricamento...