Un’azienda decide di aggiungere funzionalità di intelligenza artificiale al proprio gestionale. La prima demo è spesso rapida: una casella di testo, una chiamata a un modello e una risposta generata in pochi secondi.
Il vero progetto inizia quando quella funzione deve entrare in produzione. A quel punto bisogna stabilire quali dati possa utilizzare, quali informazioni debbano restare escluse, come applicare i permessi dell’utente, come ricostruire una risposta errata e soprattutto quali azioni il modello possa proporre o avviare.
Una buona integrazione AI non sostituisce le regole del gestionale. Le utilizza come confine. Il modello può interpretare richieste, sintetizzare contenuti e proporre risultati, ma identità, autorizzazioni, validazioni e operazioni applicative devono restare responsabilità del software aziendale.
Integrare l’AI non significa aggiungere soltanto una chat
L’interfaccia conversazionale è la parte più visibile, ma rappresenta solo uno strato del sistema. Dietro una funzione AI realmente utilizzabile servono componenti distinti:
- autenticazione dell’utente;
- recupero dei dati pertinenti;
- applicazione dei permessi;
- costruzione del contesto;
- chiamata al modello;
- validazione della risposta;
- eventuale esecuzione di operazioni applicative;
- logging, audit e monitoraggio.
Ridurre tutto alla chiamata al modello crea una soluzione difficile da controllare. Il rischio è che il prompt diventi il punto in cui si accumulano regole di sicurezza, istruzioni di business e condizioni operative che dovrebbero invece essere implementate nel codice.
Il principio da mantenere
La chat è un’interfaccia. Il modello è un componente. Il gestionale continua a essere il sistema che conosce utenti, dati, permessi e regole aziendali.
Partire dal caso d’uso, non dal modello
La scelta del modello o del provider non dovrebbe essere il primo passo. Prima è necessario definire quale problema aziendale si vuole risolvere e quanto sia grave un risultato errato.
Alcune domande utili sono:
- chi utilizzerà la funzione?
- quali dati sono necessari per produrre una risposta utile?
- la risposta è soltanto informativa o produce effetti nel sistema?
- l’utente deve poter verificare le fonti?
- serve una conferma prima di eseguire un’azione?
- come misureremo qualità e utilità?
- cosa deve accadere quando le informazioni non sono sufficienti?
| Caso d’uso | Rischio | Controllo principale |
|---|---|---|
| Riassumere un testo fornito dall’utente | Basso | Limiti sull’input e verifica del risultato |
| Cercare procedure e documenti interni | Medio | Fonti autorizzate, RAG e citazioni |
| Proporre la compilazione di dati strutturati | Medio-alto | Schema, validazione e conferma |
| Modificare dati aziendali | Alto | Autorizzazione, regole applicative e audit |
| Avviare un processo operativo | Alto | Comando controllato, conferma e tracciamento |
Questa classificazione aiuta a introdurre l’AI in modo graduale. Un sistema di ricerca assistita richiede controlli diversi rispetto a una funzione capace di modificare dati o avviare processi.
L’architettura: il modello non deve accedere direttamente al gestionale
Il modello non dovrebbe ricevere credenziali, query libere o accesso indiscriminato al database. Le informazioni devono essere recuperate da servizi applicativi che già conoscono identità, tenant, ruoli e permessi.
[Utente autenticato]
|
v
[Applicazione ASP.NET Core]
- identità
- ruolo
- tenant
- autorizzazioni
|
v
[Servizio applicativo AI]
- costruzione del contesto
- policy
- scelta degli strumenti
- logging
|
+----------------------+
| |
v v
[Fonti autorizzate] [Modello AI]
- database - generazione
- documenti - classificazione
- API interne - estrazione
| |
+-----------+----------+
|
v
[Validazione output]
|
v
[Risposta o conferma]
Questo schema mantiene il modello isolato dal dominio applicativo. Il servizio AI può richiedere dati attraverso interfacce controllate, ma non decide autonomamente quali record leggere né quali operazioni eseguire.
La separazione permette inoltre di cambiare provider, modello o strategia di retrieval senza riscrivere i casi d’uso principali del gestionale.
Controllare quali dati vengono inviati al modello
Minimizzare il contesto
Inviare più dati non significa ottenere automaticamente risposte migliori. Un contesto troppo ampio aumenta costi, latenza e probabilità che il modello utilizzi informazioni irrilevanti.
È preferibile recuperare soltanto ciò che serve per la richiesta corrente, applicando filtri precisi e limitando i campi esposti.
Escludere informazioni non necessarie
Prima di costruire il prompt bisogna valutare la presenza di:
- dati personali;
- informazioni economiche o riservate;
- segreti applicativi e credenziali;
- dati appartenenti ad altri clienti o tenant;
- campi tecnici che non aggiungono valore alla risposta;
- informazioni soggette a particolari regole di conservazione.
Valutare provider e configurazione
Il trattamento dei dati dipende dal provider, dal contratto e dalla configurazione adottata. Devono essere verificati conservazione degli input, localizzazione, utilizzo per il training, logging, cifratura e requisiti del cliente.
Errore comune
Considerare il prompt come un contenitore innocuo. Il prompt può includere dati aziendali e deve essere trattato con la stessa attenzione riservata agli altri flussi informativi dell’applicazione.
Autorizzazioni: l’AI non deve vedere più dell’utente
Un assistente integrato nel gestionale non crea un nuovo modello autorizzativo. Deve utilizzare quello già definito dall’applicazione.
Il recupero dei dati deve considerare:
- utente autenticato;
- ruolo e permessi;
- azienda o tenant;
- reparto o gruppo di appartenenza;
- visibilità sulla singola risorsa;
- eventuali limiti temporali o territoriali.
Il filtro deve essere applicato prima che i contenuti vengano inseriti nel contesto del modello. Recuperare dati globali e chiedere poi al modello di ignorare quelli non autorizzati non è un controllo di sicurezza.
Regola architetturale
L’AI non deve vedere informazioni che lo stesso utente non potrebbe ottenere tramite le normali funzioni del gestionale.
RAG: collegare le risposte alle fonti aziendali
Negli scenari di ricerca documentale viene spesso utilizzato il Retrieval-Augmented Generation, o RAG. L’applicazione recupera documenti o frammenti pertinenti e li fornisce al modello come contesto per la risposta.
Questo approccio può ridurre le risposte generiche e collegare l’output a procedure, manuali, contratti, knowledge base o dati aziendali aggiornati.
Che cosa non risolve automaticamente
RAG non garantisce da solo:
- correttezza assoluta della risposta;
- rispetto dei permessi;
- aggiornamento delle fonti;
- recupero del frammento migliore;
- assenza di contenuti ostili nei documenti;
- interpretazione corretta della domanda.
La pipeline dei contenuti
La qualità dipende anche dal modo in cui i dati vengono preparati:
- estrazione del testo;
- pulizia e normalizzazione;
- suddivisione in frammenti;
- assegnazione dei metadati;
- generazione degli embedding;
- indicizzazione;
- aggiornamento e rimozione delle fonti obsolete.
Chunking e metadati non sono dettagli secondari. Un documento suddiviso male può perdere il contesto necessario oppure restituire frammenti formalmente simili ma poco utili.
Fare in modo che l’AI sappia quando non rispondere
In un software aziendale, rispondere sempre non è un obiettivo. Quando le informazioni disponibili non supportano una conclusione, il comportamento corretto può essere dichiarare che i dati non sono sufficienti.
Per ottenere questo risultato si possono combinare:
- istruzioni esplicite nel system prompt;
- risposte basate soltanto sul contesto fornito;
- soglie minime di rilevanza nel retrieval;
- citazione delle fonti utilizzate;
- messaggi standard quando non esistono evidenze adeguate;
- distinzione tra dato verificato e suggerimento;
- validazioni successive alla generazione.
La citazione delle fonti è particolarmente utile perché consente all’utente di verificare rapidamente l’origine dell’informazione e rende più semplice diagnosticare risposte incomplete.
Prompt, dati e istruzioni non sono la stessa cosa
Una pipeline affidabile distingue chiaramente tre elementi:
- system prompt, che definisce ruolo, limiti e comportamento generale;
- contesto applicativo, recuperato da fonti autorizzate;
- input utente, che deve essere trattato come contenuto non attendibile.
Un utente o un documento recuperato possono contenere istruzioni che tentano di modificare il comportamento del modello. Questo rischio, noto come prompt injection, non può essere eliminato affidandosi soltanto a un prompt più lungo.
I controlli devono essere applicativi:
- separare istruzioni e dati;
- limitare gli strumenti disponibili;
- validare parametri e output;
- non inserire segreti nel system prompt;
- trattare documenti e contenuti esterni come input non affidabile;
- mantenere autorizzazioni e regole fuori dal modello.
La sicurezza non può dipendere da una frase
Scrivere “non mostrare dati riservati” nel prompt non sostituisce un filtro autorizzativo eseguito dal backend.
Risposte testuali e azioni applicative devono restare separate
Esiste una differenza sostanziale tra generare un testo e modificare lo stato del gestionale. Per questo è utile introdurre livelli progressivi di autonomia.
| Livello | Comportamento | Responsabilità dell’applicazione |
|---|---|---|
| 1. Risposta informativa | Il modello produce testo o un riepilogo | Mostrare fonti, limiti e natura AI del contenuto |
| 2. Output strutturato | Il modello propone un DTO o JSON | Deserializzare e validare lo schema |
| 3. Preparazione del comando | Il modello individua azione e parametri | Verificare dati, permessi e regole |
| 4. Conferma | L’utente approva l’operazione proposta | Mostrare chiaramente effetti e destinatari |
| 5. Esecuzione | Il backend esegue il comando | Autorizzare, registrare e gestire l’esito |
Il modello può proporre un’azione. L’applicazione decide se quell’azione è valida, autorizzata e coerente con lo stato corrente.
Validare sempre gli output del modello
Un output strutturato facilita l’integrazione, ma non deve essere considerato automaticamente corretto. Anche un JSON formalmente valido può contenere identificativi inesistenti, valori fuori intervallo o operazioni non consentite.
public sealed record SuggestedAction(
string ActionCode,
long ResourceId,
string? Notes);
public async Task<ActionResult> ExecuteSuggestedActionAsync(
SuggestedAction suggestion,
UserContext user,
CancellationToken cancellationToken)
{
var validation = await _validator.ValidateAsync(
suggestion,
cancellationToken);
if (!validation.IsValid)
return ActionResult.Invalid(validation.Errors);
var isAuthorized = await _authorizationService
.CanExecuteAsync(
user,
suggestion.ActionCode,
suggestion.ResourceId,
cancellationToken);
if (!isAuthorized)
return ActionResult.Forbidden();
return await _applicationService.ExecuteAsync(
suggestion,
cancellationToken);
}
La pipeline dovrebbe includere:
Output del modello
|
v
Deserializzazione
|
v
Validazione sintattica
|
v
Autorizzazione
|
v
Validazione applicativa
|
v
Conferma dell’utente
|
v
Esecuzione e audit
Il modello non deve poter aggirare i controlli soltanto perché ha prodotto un oggetto nel formato previsto.
Logging, audit e osservabilità
Per comprendere il comportamento del sistema è necessario registrare più della sola eccezione tecnica.
In base al caso d’uso può essere utile tracciare:
- utente e contesto autorizzativo;
- caso d’uso invocato;
- modello e versione utilizzati;
- versione del prompt;
- fonti recuperate;
- tempi di esecuzione;
- consumo di token e costo stimato;
- esito delle validazioni;
- azione proposta ed eventuale conferma;
- feedback dell’utente.
La tracciabilità deve però rispettare il principio di minimizzazione. Registrare indiscriminatamente prompt e risposte può duplicare dati personali o riservati nei sistemi di log.
È opportuno definire quali informazioni conservare, per quanto tempo e con quali modalità di accesso.
Valutare la qualità prima della produzione
Una demo convincente non dimostra che il sistema sia affidabile. Prima del rilascio è utile costruire un dataset di valutazione basato su domande e situazioni reali.
Il dataset dovrebbe includere:
- domande con risposta nota;
- fonti corrette attese;
- casi in cui non esiste una risposta;
- richieste ambigue;
- tentativi di accesso a dati non autorizzati;
- input ostili o manipolativi;
- output strutturati incompleti;
- variazioni linguistiche della stessa richiesta.
Metriche possibili
- rilevanza dei documenti recuperati;
- aderenza della risposta alle fonti;
- completezza;
- correttezza del formato;
- tasso di rifiuto corretto;
- numero di violazioni autorizzative;
- latenza;
- costo medio per richiesta.
Le valutazioni devono essere ripetibili. Quando cambiano modello, prompt, chunking o fonti, lo stesso dataset consente di misurare se la qualità sia realmente migliorata.
Human in the loop: quando serve una conferma
Non tutte le attività richiedono un’approvazione manuale. Per un riepilogo informativo può essere sufficiente mostrare le fonti e indicare che il testo è stato generato dall’AI.
La conferma diventa invece importante per:
- aggiornamenti irreversibili;
- invio di comunicazioni;
- modifiche economiche;
- condivisione di dati sensibili;
- avvio di processi operativi;
- decisioni con impatto su clienti o utenti;
- operazioni proposte con informazioni incomplete.
La schermata di conferma deve mostrare in modo comprensibile che cosa sarà eseguito, su quali dati e con quali effetti. Non dovrebbe limitarsi a un generico pulsante “Conferma”.
Un percorso graduale per introdurre l’AI
Non è necessario partire da un agente autonomo capace di utilizzare numerosi strumenti. Un percorso graduale riduce il rischio e permette di misurare il valore reale.
| Fase | Funzione | Controllo richiesto |
|---|---|---|
| 1 | Riassunto, classificazione e generazione di bozze | Nessuna azione applicativa automatica |
| 2 | Ricerca su fonti aziendali | RAG, permessi e citazioni |
| 3 | Proposta di dati strutturati | Schema, validazione e conferma |
| 4 | Azioni applicative controllate | Autorizzazioni, audit e workflow |
Ogni fase dovrebbe avere metriche, limiti e criteri di accettazione propri. Solo dopo aver verificato qualità e utilità conviene aumentare il grado di autonomia.
Come integrare il componente AI in una soluzione .NET
In una soluzione ASP.NET Core è utile introdurre un livello applicativo dedicato, evitando che controller o pagine chiamino direttamente l’SDK del provider.
Il servizio può esporre casi d’uso come:
- riassumere un documento;
- classificare una richiesta;
- recuperare contenuti autorizzati;
- generare una bozza;
- proporre un’azione strutturata;
- valutare o verificare una risposta.
Un’astrazione comune riduce l’accoppiamento con il provider e permette di applicare trasversalmente logging, caching, retry, limiti e metriche.
public interface IBusinessAiService
{
Task<AiAnswer> AnswerAsync(
AiQuestion question,
UserContext user,
CancellationToken cancellationToken);
Task<SuggestedAction> SuggestActionAsync(
ActionRequest request,
UserContext user,
CancellationToken cancellationToken);
}
L’interfaccia descrive il caso d’uso aziendale, non il dettaglio del modello. In questo modo il resto dell’applicazione non dipende da nomi di endpoint, formati proprietari o classi specifiche di un singolo SDK.
AI, API e workflow devono avere responsabilità distinte
Il componente AI può essere esposto attraverso una API Enterprise con ASP.NET Core, ma autenticazione, autorizzazione, contratti ed errori devono restare coerenti con il resto del sistema.
Quando una proposta dell’AI avvia un’elaborazione lunga o distribuita, è preferibile delegare l’esecuzione a workflow affidabili in .NET. Retry, idempotenza e persistenza dello stato non devono essere affidati al modello.
Le stesse funzionalità possono essere introdotte durante la modernizzazione progressiva di un’applicazione .NET Framework, isolando il nuovo servizio dietro API e contratti senza riscrivere immediatamente l’intero gestionale.
Errori comuni nell’integrazione dell’AI
1. Collegare direttamente il modello al database
Il modello non dovrebbe avere accesso libero ai dati. Query e operazioni devono passare attraverso servizi controllati e autorizzati.
2. Inviare più dati del necessario
Un contesto eccessivo aumenta rischio, costo e rumore senza garantire una risposta migliore.
3. Affidare le autorizzazioni al prompt
I permessi devono essere applicati dal backend prima che il contenuto venga inviato al modello.
4. Considerare RAG sinonimo di risposta corretta
Retrieval, qualità dei documenti, chunking e istruzioni devono essere verificati e misurati.
5. Eseguire azioni senza validazione
Gli output del modello sono input non attendibili per il resto dell’applicazione e devono attraversare tutti i controlli ordinari.
6. Non versionare prompt e configurazione
Senza una versione identificabile è difficile ricostruire perché una risposta sia cambiata.
7. Valutare soltanto con test manuali occasionali
Serve un dataset ripetibile per confrontare modifiche e regressioni.
8. Non prevedere una risposta “non lo so”
In assenza di fonti sufficienti, il sistema deve poter rifiutare una risposta non supportata.
9. Rendere il dominio dipendente dal provider
SDK e modelli cambiano. I casi d’uso aziendali devono rimanere separati dalla tecnologia scelta.
10. Inseguire la demo senza una metrica
Una funzione impressionante ma non misurabile rischia di non produrre alcun vantaggio operativo.
Checklist tecnica
Dati e sicurezza
- I dati inviati sono realmente necessari?
- I segreti sono esclusi?
- I permessi vengono applicati prima del retrieval?
- La retention è definita?
- Provider e configurazione sono stati verificati?
Risposte
- Le fonti sono tracciate?
- È gestita l’assenza di informazioni?
- Gli output strutturati vengono validati?
- Il contenuto generato è riconoscibile?
- I casi critici richiedono conferma?
Architettura
- Il provider è isolato dal dominio?
- Gli strumenti disponibili sono limitati?
- I comandi applicativi sono separati?
- Timeout, retry e fallback sono definiti?
- Esiste un audit delle azioni?
Qualità
- Esiste un dataset di test?
- Le metriche sono definite?
- I prompt sono versionati?
- Il feedback viene raccolto?
- Costi e latenza sono monitorati?
FAQ
È possibile integrare l’AI in un gestionale .NET esistente?
Sì. È spesso preferibile introdurla come servizio applicativo separato, collegato ai casi d’uso e ai sistemi autorizzativi esistenti, senza riscrivere l’intero gestionale.
RAG elimina le risposte inventate?
No. RAG fornisce al modello fonti più pertinenti, ma richiede comunque controllo del retrieval, autorizzazioni, qualità dei documenti, istruzioni e valutazione delle risposte.
Il modello può interrogare direttamente SQL Server?
Tecnicamente è possibile costruire sistemi che generano query, ma in un gestionale aziendale è più sicuro esporre operazioni e query controllate tramite servizi applicativi.
Come si impedisce all’AI di mostrare dati non autorizzati?
I filtri autorizzativi devono essere applicati dal backend prima che i dati vengano inseriti nel contesto del modello. Non è sufficiente scrivere nel prompt che alcuni dati non devono essere mostrati.
L’AI può eseguire operazioni nel gestionale?
Può proporre un’azione, ma autorizzazione, validazione ed esecuzione devono restare responsabilità dell’applicazione. Per le operazioni critiche è opportuno richiedere una conferma esplicita.
È necessario usare un solo provider AI?
No. Un livello di astrazione riduce l’accoppiamento e permette di sostituire o affiancare provider differenti senza modificare i casi d’uso principali.
In sintesi
L’AI deve ampliare il gestionale, non aggirarne le regole.
Dati, autorizzazioni, fonti, validazioni e azioni devono restare sotto il controllo dell’applicazione. Il modello genera e interpreta contenuti; il software aziendale continua a decidere cosa è consentito e cosa può essere eseguito.
Guide correlate
Vuoi integrare funzionalità AI in un’applicazione .NET esistente?
Posso supportare software house e team di sviluppo nell’analisi del caso d’uso, nella progettazione dell’architettura e nell’integrazione controllata di modelli AI, RAG, API e workflow nei software aziendali.