venerdì 4 luglio 2025

#AI #Text_to_SQL #ETL #RAG #NLP #DataScience

#AI #Text_to_SQL #ETL #RAG #NLP #DataScience

POSTED BY GIULIANO PAGNINI, 04 LUG 2025

"Il Futuro dei Comuni: Chatbot Intelligenti e SQL Naturale per Dirigenti e Cittadini"

Addio burocrazia, benvenuta rivoluzione conversazionale!

Immagina un Comune che ti ascolta, ti capisce e ti risponde in tempo reale. Niente più menu infiniti, moduli da compilare o chiamate interminabili. Grazie all’innovazione dei Domain-Constrained SQL Generation Framework, l’accesso ai dati diventa una conversazione semplice, veloce e intuitiva.

Per il cittadino: un assistente personale sempre disponibile

Apri l’app o il sito del tuo Comune e chiedi:
"Qual è la mia posizione tributaria?"



In pochi secondi, il chatbot ti risponde con un riepilogo chiaro: tributi pagati, scadenze, eventuali verifiche in corso. Tutto generato al volo da query SQL sicure e precise, ma senza che tu debba sapere cosa sia SQL.

Vuoi prenotare un servizio? Basta una richiesta:
"Prenota un passaggio per la raccolta degli ingombranti per domani."
Il sistema trova il primo slot disponibile e conferma in un click.

Per il dirigente: dati in tempo reale, decisioni più veloci

Niente più attese per report complessi o dipendenza dall’ufficio IT. Ora basta una domanda:
"Mostrami l’andamento delle entrate CUP, confrontato con l’anno scorso."

Oppure:

"Quali sono le zone con il maggior numero di morosità TARI?"

Il sistema genera dashboard dinamiche e tabelle pronte all’uso, con query vincolate al database comunale. Meno errori, più sicurezza, massima efficienza.

Il cuore del cambiamento: Domain-Constrained SQL Generation Framework

Questa rivoluzione è resa possibile da un nuovo paradigma: l’SQL generativo vincolato al dominio. Non si tratta semplicemente di generare query in automatico, ma di farlo entro un contesto preciso e sicuro, guidato da un modello semantico dei dati comunali.

In pratica, il framework conosce come è fatto il database comunale, quali tabelle, colonne e relazioni sono ammesse, e genera solo interrogazioni semanticamente corrette. Il rischio di errori o di accessi non autorizzati si riduce drasticamente.

Il segreto? SQL generativo "a prova di Comune"

Non è magia, ma tecnologia avanzata:
✔ Nessun rischio di query sbagliate – il framework conosce perfettamente il database comunale e genera solo interrogazioni valide.
✔ Nessun accesso a dati sensibili – tutto avviene in un ambiente controllato e sicuro.
✔ Linguaggio naturale, risultati professionali – sia che tu sia un cittadino o un dirigente, ottieni esattamente ciò che chiedi.

I vantaggi? Eccoli:

Per i cittadini: risposte immediate, zero attese, massima trasparenza. Ottenere informazioni complesse con domande semplici.
Per i dirigenti: analisi dati in tempo reale, senza intermediari.
Per il Comune: riduzione dei costi, servizi più efficienti, soddisfazione alle stelle.

Un Comune più smart, veloce e umano: questa è la vera trasformazione digitale.





martedì 1 luglio 2025

ImpolyzerDataStudio© #AI #Text_to_SQL #ETL #RAG #NLP #DataScience

#ImpolyzerDataStudio© #AI #Text_to_SQL #ETL #RAG #NLP #DataScience

POSTED BY GIULIANO PAGNINI, 01 LUG 2025

Addestramento del Domain-constrained SQL Generation Framework di ImpolyzerDataStudio [LE VARIABILI].

Case studios

Esempi di classiche domande:
"elenco dei contribuenti  che hanno pubblicità con il messaggio che contiene AGIP""elenco degli utenti che hanno pubblicità con inciso la parola AGIP", "elenco degli utenti che hanno pubblicità con la scritta AGIP".
Nei DB di esempio ho due comuni H231 e G911 con le tabelle interessate:
<COMUNE>UTENTI con le anagrafiche dei contribuenti 
<COMUNE>(E)REGISTRO<ANNO> con tutte le tipologie di tributo (occupazioni e pubblicità) per ogni contribuente 


Usare la funzione duplica per replicare le KEY con la stessa configurazione


.. "semantic_mapping": { "messaggio": "[[COMUNE]]REGISTRO{{ANNO}}.DESCRIZIONE_PUBBLICITA LIKE '%{inciso}%'", "pubblicità": { "registro": "[[COMUNE]]REGISTRO{{ANNO}}.IDCODIFICA IN (SELECT COD FROM dynamic_codifica WHERE TIPOCOD = 0)" }, "utenti": "[[COMUNE]]UTENTI" }, "placeholders": { "dynamic_codifica": "[[COMUNE]]CODIFICA{{ANNO}}", "inciso": null }, "variable_parameters": { "inciso": { "type": "string", "source": "[[COMUNE]]REGISTROdZ{{ANNO}}.DESCRIZIONE_PUBBLICITA", "required": true, "validation": "EXISTS" } }

Domanda: utenti che hanno la pubblicità con messaggio che contiene AGIP nel comune G911


Con Cloude.AI
utenti che hanno pubblicità con messaggio uguale AGIP nel comune G911  

"Il progetto prevede lo sviluppo di un chatbot per la dirigenza di una società di gestione tributi. Il sistema interroga il database e restituisce report e analisi grafiche dettagliate sulla gestione degli enti amministrati. Il backend è realizzato come server REST in C++Builder, mentre l'interfaccia grafica utilizza Dashdot in Vue.js."

.....


venerdì 27 giugno 2025

#ImpolyzerDataStudio© #AI #Text_to_SQL #ETL #RAG #NLP #DataScience

 #ImpolyzerDataStudio© #AI #Text_to_SQL #ETL #RAG #NLP #DataScience

POSTED BY GIULIANO PAGNINI, 27GIU 2025

Addestramento del Domain-constrained SQL Generation Framework di ImpolyzerDataStudio.

Case studios

Esempi di classiche domande:
"elenco dei contribuenti morosi", "elenco dei contribuenti che non hanno pagato", "utenti che non hanno pagato", "anagrafiche in mora", "elenco dei contribuenti che hanno pagato in ritardo", "elenco dei contribuenti con pagamenti tardivi", "utenti che hanno pagato in ritardo","per ogni contribuente il dovuto di occupazione","per ogni contribuente il dovuto di pubblicità"
Nei DB di esempio ho due comuni H231 e G911 con le tabelle interessate:
<COMUNE>UTENTI con le anagrafiche dei contribuenti 
<COMUNE>(E)REGISTRO<ANNO> con tutte le tipologie di tributo (occupazioni e pubblicità) per ogni contribuente
<COMUNE>(E)_PUB<ANNO> elenco dei bollettini emessi nell'esercizio 
<COMUNE>(E)CODIFICA<ANNO> le tipologie di tributo (variabili ogni anno) (TIPOCOD = 0 pubblicitò TIPOCOD = 1 occupazione )

Dalle domande si estraggono le chiavi semantiche e si creano le associazioni (Es. utente, contribuente, ect fanno riferimento sempre alla tabella UTENTI, Dovuto ad esempio fa riferimento sia al campo IMPORTO che alla tabella REGISTRO) 



 non hanno pagato, morosi ,in mora, hanno pagato in ritardo



pagamenti in ritardo


per ogni contribuente il dovuto di occupazione


per ogni contribuente il dovuto di pubblicità"


mappato dovuto su campo IMPORTO



Come risponde alle domande? 
Es. per ogni contribuente il dovuto di occupazione nel comune G911 anno 2025.
Per comodità escludo i campi delle tabelle

{ "tags": [ "SQL", "FIREDAC", "FIREBIRD 3.0+" ], "question": "per ogni contribuente il dovuto di occupazione nel comune G911 anno 2025", "constraints": [ "Usa solo SQL compatibile con FIREBIRD 3.0+", "Non usare alias o funzioni non supportate da FIREBIRD 3.0+", "Utilizza solo i nomi dei campi effettivamente presenti nelle tabelle indicate", "ignora il campo ENTE in tutte le tabelle" ], "tables": { "G911ECODIFICA2025": { }, "G911EREGISTRO2025": { }, "G911UTENTI": { } }, "semantic_mapping": { "CONTRIBUENTE": "UTENTI", "DOVUTO": "IMPORTO", "OCCUPAZIONE": { "REGISTRO": "REGISTRO.IDCODIFICA IN (SELECT COD FROM dynamic_codifica WHERE TIPOCOD = 1)" } }, "placeholders": { "dynamic_codifica": "[[COMUNE]]CODIFICA{{ANNO}}" } }
Es. per ogni contribuente il dovuto di occupazione nel comune G911 anno 2025.
    

il JSON estratto

{ "tags": [ "SQL", "FIREDAC", "FIREBIRD 3.0+" ], "question": "elenco dei contribuenti che non hanno pagato nel comune G911 anno 2025", "constraints": [ "Usa solo SQL compatibile con FIREBIRD 3.0+", "Non usare alias o funzioni non supportate da FIREBIRD 3.0+", "Utilizza solo i nomi dei campi effettivamente presenti nelle tabelle indicate", "ignora il campo ENTE in tutte le tabelle" ], "tables": { "G911E_PUB2025": { }, "G911E_PUBD2025": { }, "G911UTENTI": { } }, "semantic_mapping": { "CONTRIBUENTI": "UTENTI", "NON HANNO PAGATO": "IDUTENTE IN (SELECT dynamic_bollettini WHERE Pagato IS NULL or Pagato = 0)" }, "placeholders": { "dynamic_bollettini ": "[COMUNE]]_PUB{{ANNO}}" } }

Con questo risultato:

sql
SELECT 
    u.IDUTENTE,
    u.RAGIONE_SOCIALE,
    u.RAGIONE_SOCIALE1,
    u.INDIRIZZO,
    u.NUMERO,
    u.CAP,
    u.P_IVA,
    u.COD_F,
    u.TEL,
    u.EMAIL,
    u.PEC,
    u.CATEGORIA
FROM G911UTENTI u
WHERE EXISTS (
    SELECT 1
    FROM G911E_PUB2025 p
    WHERE p.IDUTENTE = u.IDUTENTE
      AND (p.PAGATO IS NULL OR p.PAGATO = 0)
      AND p.ANNO = 2025
)
ORDER BY u.RAGIONE_SOCIALE

Buon lavoro!!

ImpolyzerDataStudio© #AI #Text_to_SQL #ETL #RAG #NLP #DataScience

#ImpolyzerDataStudio© #AI #Text_to_SQL #ETL #RAG #NLP #DataScience

POSTED BY GIULIANO PAGNINI, 27 GIU 2025

Addestrare un Domain-constrained SQL Generation Framework è Facilissimo! Basta un File e ImpolyzerDataStudio

Introduzione

Hai mai pensato a quanto sarebbe bello generare query SQL complesse in modo automatico, senza dover scrivere manualmente ogni condizione? Con un Domain-constrained SQL generation framework (o un Prompt-guided structured generation system), è possibile!

E la parte migliore? Non serve essere un mago del machine learning o un esperto di NLP. Basta salvare le regole semantiche in un file e condividerlo con altri utenti, che potranno riutilizzarle semplicemente caricando il progetto su ImpolyzerDataStudio.

Come Funziona?

  1. Definisci le Regole Semantiche. Il placeholders viene creato in automatico se nelle regole sono definite delle dynamic_table.


  2. Addestri il Modello (Facilmente!)

    • Usi un framework come ImpolyzerDataStudio per "insegnare" al sistema come tradurre richieste in linguaggio naturale (es.: "Mostrami i clienti con ordini superiori a 100€") in SQL.

    • Il modello impara dalle tue regole semantiche e le applica automaticamente

    • genera un context JSON compatto da inviare al modello AI configurato

      il risultato

      sql
      SELECT 
          u.RAGIONE_SOCIALE,
          SUM(r.IMPORTO) AS TOTALE_OCCUPAZIONE
      FROM 
          H231UTENTI u
          INNER JOIN H231EREGISTRO2025 r ON u.IDUTENTE = r.IDUTENTE
          INNER JOIN H231ECODIFICA2025 c ON r.IDCODIFICA = c.COD AND c.TIPOCOD = 1
      GROUP BY 
          u.RAGIONE_SOCIALE
      ORDER BY 
          u.RAGIONE_SOCIALE;


  3. Condividi il File e Riusalo

    • Altri utenti possono importare il tuo file di regole nel loro progetto e generare query senza dover riaddestrare nulla!


Perché è una Bomba?

✅ Niente codice complesso: Basta un file di configurazione.
✅ Condivisione immediata: Altri utenti possono usare le tue regole in pochi click.
✅ Adattabile: Puoi aggiornare le regole e migliorare il modello nel tempo.

Conclusione

Se vuoi un sistema che generi SQL in modo intelligente senza perdere mesi in sviluppo, un Domain-constrained SQL generation framework con regole semantiche salvate in un file è la soluzione perfetta.

E con ImpolyzerDataStudio, il gioco è fatto!