Etna
1. Introduzione e Scopo
Etna è un progetto software per la creazione di una pipeline automatizzata per il monitoraggio multi-parametrico del Monte Etna. Lo scopo è acquisire dati da fonti aperte (sismici, infrasuoni, geochimici), elaborarli per estrarre caratteristiche significative e sperimentare l’uso di tecniche di Intelligenza Artificiale, come gli embeddings e i Large Language Models (LLM), per creare rappresentazioni “AI-ready” dei dati vulcanologici.
Il sistema gestisce l’intero ciclo di vita del dato:
- Acquisizione programmata da fonti dati pubbliche.
- Elaborazione e calcolo di parametri fisici (es. SSAM, polarizzazione).
- Generazione di Embeddings tramite un autoencoder per rappresentare i dati in uno spazio latente.
- Monitoraggio e notifica di eventi anomali tramite bot Telegram.
- Visualizzazione interattiva tramite una dashboard web.
- Interrogazione programmatica tramite un’API REST.
- Sperimentazione con agenti LLM per l’interpretazione dei dati.
2. Contesto e Motivazioni
Questo progetto non intende sostituire i sistemi di monitoraggio ufficiali dell’INGV. Nasce come un’esplorazione tecnica e didattica per affrontare le sfide legate al trattamento di dati eterogenei e per valutare come le moderne tecniche di AI possano arricchire l’analisi automatizzata e semi-automatizzata dei fenomeni vulcanici.
3. Architettura del Sistema
L’architettura è basata su microservizi containerizzati e orchestrati con docker-compose. Questa scelta garantisce modularità, scalabilità e portabilità.
I componenti principali sono:
- nginx: Reverse proxy che espone i servizi web e gestisce il traffico in ingresso.
- etna-app: Applicazione web basata su Streamlit che funge da dashboard per la visualizzazione interattiva dei dati e delle analisi.
- etna-api: Un server FastAPI che espone un’API REST per l’accesso programmatico ai dati elaborati e agli embeddings.
- etna-scheduler: Il cuore della pipeline, un servizio basato su APScheduler che orchestra ed esegue i task di acquisizione ed elaborazione dati a intervalli regolari.
- Bot Telegram: Integrato per inviare notifiche e report sullo stato del sistema e sui dati analizzati.
- Agenti LLM: Un modulo sperimentale che utilizza Ollama per eseguire agenti intelligenti capaci di interpretare i dati e generare sintesi testuali.
Diagramma dell’Architettura
@startuml
!theme plain
title Diagramma dell’Architettura del Sistema Etna
cloud “Internet” as Cloud {
frame “FDSN Data Center” as FDSN
frame “Sorgenti Dati Gas” as GasSource
frame “API Telegram” as TelegramAPI
}
actor “Utente” as User
actor “Sviluppatore/Operatore” as Operator
node “Server / Host” as Host {
frame “Docker Engine” {
rectangle "nginx" as Nginx {
artifact "www/index.html" as StaticPage
}
rectangle "etna-app (Streamlit)" as App
rectangle "etna-api (FastAPI)" as API
rectangle "etna-scheduler (APScheduler)" as Scheduler
database "File System (Volumi Docker)" as Storage {
folder "Dati Grezzi (.mseed)"
folder "Dati Elaborati (.parquet)"
folder "Embeddings (.pt)"
folder "Figure e Report"
folder "Modelli ML"
}
} }
User -->> Nginx
Nginx -->> App
Nginx -->> API
Operator -->> App
Operator -->> API
Scheduler --> FDSN : Richiede dati sismici/infrasuoni
Scheduler --> GasSource : Richiede dati geochimici
Scheduler --> Storage : Scrive dati grezzi ed elaborati
Scheduler --> TelegramAPI : Invia notifiche
App --> Storage : Legge dati, figure, embeddings
API --> Storage : Legge dati per servire le richieste
frame “Ollama (LLM)” as Ollama
App -> Ollama : (opzionale) Interroga agenti
Scheduler -> Ollama : (opzionale) Esegue agenti
@enduml
4. Flusso di Lavoro (Pipeline)
Il scheduler è il motore della pipeline e scandisce le seguenti fasi:
- Acquisizione Dati:
- Sismico e Infrasuoni: Vengono scaricati i dati in formato mseed dai server FDSN (es. INGV) per le stazioni configurate in config/stations.yaml.
- Dati Gas: Vengono recuperati dati sulla composizione dei gas da fonti web pubbliche.
- I dati vengono salvati localmente con una struttura a directory basata sulla data.
- Elaborazione e Feature Extraction:
- I dati grezzi vengono pre-processati (filtraggio, detrending).
- Vengono calcolate diverse feature, tra cui:
- SSAM (Seismic Spectral Amplitude Measurement): Misura l’ampiezza spettrale media in diverse bande di frequenza.
- RMS (Root Mean Square): Calcola l’energia del segnale nel tempo.
- Analisi di Polarizzazione: Stima la direzionalità e la rettilinearità del segnale sismico.
- Cross-correlazione: Analizza la somiglianza tra i segnali di diverse stazioni.
- I risultati vengono salvati in formato Parquet per efficienza.
- Generazione di Embeddings:
- Le feature elaborate (es. spettrogrammi o SSAM) vengono date in input a un Autoencoder basato su PyTorch.
- L’output dello strato latente (encoder) del modello costituisce l’embedding: una rappresentazione vettoriale densa e a bassa dimensionalità del dato originale.
- Gli embeddings sono progettati per catturare le caratteristiche essenziali del segnale e vengono usati per analisi di similarità, clustering e classificazione.
- Monitoraggio e Notifiche:
- Il sistema controlla i valori delle ultime feature calcolate.
- Se vengono superate soglie predefinite, vengono inviati alert tramite un bot Telegram, allegando grafici significativi.
- Reporting:
- Periodicamente, vengono generati report di sintesi e visualizzazioni che vengono inviati via Telegram.
5. Componenti e Tecnologie
- Linguaggio: Python 3.11+
- Containerizzazione: Docker, Docker Compose
- Scheduling: APScheduler
- API Server: FastAPI, Uvicorn
- Dashboard Web: Streamlit
- Analisi Dati e Calcolo Scientifico: ObsPy, NumPy, Pandas, SciPy
- Machine Learning / AI:
- Deep Learning: PyTorch (per il modello Autoencoder)
- LLM: Ollama (per l’interazione con modelli locali)
- Visualizzazione: Matplotlib, Seaborn, Folium (per le mappe)
- Notifiche: python-telegram-bot
- Interfaccia a Riga di Comando (CLI): typer per la gestione di task manuali (es. training, data processing).
6. Deployment
Il deployment è interamente gestito tramite Docker e docker-compose. I servizi sono definiti nel file docker-compose.yml.
- Build delle Immagini: Il workflow di GitHub Actions (.github/workflows/deploy.yml) si occupa di costruire le immagini Docker per i servizi app, scheduler e api e di pusharle su un registry (es. Docker Hub o GitHub Container Registry).
- Esecuzione: Per avviare l’intera applicazione su un server, è sufficiente clonare il repository, configurare le variabili d’ambiente (es. token di Telegram) e lanciare docker-compose up -d.
Diagramma di Deployment
@startuml
!theme plain
title Diagramma di Deployment Semplificato
cloud “GitHub / Docker Registry” as Registry {
package “etna-app:latest”
package “etna-scheduler:latest”
package “etna-api:latest”
}
node “Server (VPS, On-premise)” as Server {
artifact "docker-compose.yml" as ComposeFile
file ".env (variabili d'ambiente)" as EnvFile
node "Docker Engine" as Docker {
container "nginx" as NginxContainer
container "etna-app" as AppContainer
container "etna-api" as ApiContainer
container "etna-scheduler" as SchedulerContainer
}
database "Storage Locale (Volumi)" as FS {
folder "Dati"
folder "Config"
}
ComposeFile ..\> Docker : orchestra
EnvFile ..\> Docker : configura
AppContainer \--u-\> FS
ApiContainer \--d-\> FS
SchedulerContainer \--d-\> FS
NginxContainer \--\> AppContainer
NginxContainer \--\> ApiContainer }
actor “Amministratore” as Admin
Admin --> Server : `docker-compose up`
Registry ..> Docker : `pull` delle immagini
@enduml
7. Interfaccia Conversazionale: GPT Expert Assistant
Un’applicazione avanzata del sistema è la possibilità di collegare un GPT Expert (come un Custom GPT di OpenAI) all’API REST per creare un assistente conversazionale specializzato.
🧠 GPT Expert: Etna Tremor Monitor Assistant
📝 Descrizione e Modalità Operativa (Prompt di sistema)
Sei un assistente AI avanzato, specializzato nell’analisi di eventi sismici e dati geofisici relativi al vulcano Etna. La tua missione è agire come un ponte intelligente tra gli esseri umani (ricercatori, tecnici, operatori di protezione civile) e i dati grezzi, trasformando le loro domande in linguaggio naturale in query precise verso le API REST.
Il tuo processo operativo è il seguente:
- Ascolto e Interpretazione: Analizzi la domanda dell’utente per comprendere l’intento, i parametri e i dati di interesse.
- Query alle API: Traduci la richiesta in una o più chiamate mirate agli endpoint disponibili.
- Analisi e Sintesi: Ricevi i dati in formato JSON, li analizzi, li aggreghi e identifichi le informazioni salienti.
- Risposta Contestualizzata: Fornisci una risposta sintetica, chiara e scientificamente corretta. Arricchisci la risposta con spiegazioni contestuali per aiutare l’utente a comprendere il significato dei dati.
Le tue potenzialità:
- Integrazione Dati: Puoi correlare informazioni provenienti da diverse fonti (RMS, SSAM, bollettini) per offrire una visione d’insieme.
- Filtro Intelligente: Permetti di navigare facilmente attraverso grandi moli di dati, filtrando per data, intensità, stazione e criticità.
- Traduzione Tecnica: Rendi accessibili dati complessi a un pubblico più vasto, spiegando concetti tecnici in modo semplice.
- Supporto Decisionale: Fornisci dati tempestivi e aggregati che possono supportare le valutazioni di ricercatori e operatori.
I tuoi limiti:
- Dipendenza dalle API: La mia conoscenza è limitata ai dati accessibili tramite gli endpoint definiti. Non posso accedere a informazioni esterne o in tempo reale non coperte dal servizio.
- Interpretazione Basata sui Dati: Le mie conclusioni (es. “anomalia”) sono il risultato di calcoli algoritmici basati su soglie e dati forniti, non di un’intuizione umana.
🧭 Guida all’Interazione: Come Chiedermi le Cose (Istruzioni per l’Utente)
Puoi dialogare con me in modo naturale. Per ottenere i risultati migliori e più rapidi, segui questi esempi e consigli.
📅 Ottenere gli eventi sismici recenti
- 👉 Esempio base: “Mostrami gli eventi critici per la stazione ECPN tra il 1° e il 7 giugno con RMS maggiore di 3.”
- 💡 Consiglio dell’esperto: Sii specifico ma anche flessibile. Puoi chiedere di combinare più stazioni o usare intervalli di tempo relativi. Prova con: “Ci sono stati eventi con RMS sopra 4 nelle ultime 12 ore su una delle stazioni sommitali?”
- ⏳ Tempistiche stimate: Risposta quasi istantanea.
📊 Conoscere quali stazioni sono più attive
- 👉 Esempio base: “Quali sono le 5 stazioni più attive nelle ultime 48 ore?”
- 💡 Consiglio dell’esperto: L’attività è misurata come RMS medio. Se vuoi una metrica diversa, specificala, anche se potrei doverti informare che l’API supporta solo l’RMS per questa classifica.
- ⏳ Tempistiche stimate: Risposta molto rapida (pochi secondi).
📈 Visualizzare l’andamento RMS di una o più stazioni
- 👉 Esempio base: “Dammi la serie storica RMS per la stazione ECPN nell’ultima settimana.”
- 💡 Consiglio dell’esperto: Puoi richiedere più stazioni contemporaneamente per confrontarle. Prova: “Confronta l’andamento RMS di ECPN e EBEL negli ultimi 3 giorni.” La visualizzazione di un grafico dipende dalla piattaforma in uso, ma fornirò sempre i dati in modo chiaro.
- ⏳ Tempistiche stimate: Da istantanea a qualche secondo, a seconda dell’ampiezza dell’intervallo temporale.
🧭 Analizzare la direzione media delle onde (polarizzazione)
- 👉 Esempio base: “Mostrami la direzione di provenienza dell’energia sismica nelle ultime 24 ore.”
- 💡 Consiglio dell’esperto: La polarizzazione aiuta a localizzare la sorgente del tremore. Specificare una stazione può dare risultati più puliti. Chiedi: “Qual è la polarizzazione media oraria per la stazione EPDN nelle ultime 6 ore?” Ti spiegherò come interpretare l’azimuth (es. 90° significa provenienza da Est).
- ⏳ Tempistiche stimate: Risposta rapida (pochi secondi).
📡 Ottenere i dati di ampiezza spettrale (SSAM)
- 👉 Esempio base: “Forniscimi i dati SSAM per la stazione ECPN nelle ultime 24 ore per le bande 1.0-2.0 e 3.0-4.0 Hz.”
- 💡 Consiglio dell’esperto: L’analisi SSAM è potente per capire dove si concentra l’energia del tremore. Se non sei sicuro di quali bande usare, puoi chiedere: “Quali sono le bande di frequenza tipicamente associate al tremore vulcanico?” e poi usarle nella tua richiesta.
- ⏳ Tempistiche stimate: Risposta rapida, ma il tempo può aumentare leggermente con più stazioni o bande.
🔗 Eseguire analisi di correlazione
- 👉 Esempio base: “Mostrami la matrice di correlazione per i dati di ieri.”
- 💡 Consiglio dell’esperto: Questa è una delle query più complesse e richiede più tempo. Specifica un intervallo temporale non troppo vasto per una risposta più celere. L’analisi cerca legami tra diverse tipologie di segnali (sismico, infrasonico, gas), che possono indicare un processo fisico comune.
- ⏳ Tempistiche stimate: Da 10 secondi a oltre un minuto. L’elaborazione è intensiva, specialmente per intervalli di più giorni. Ti chiederò di avere pazienza.
📄 Consultare i bollettini ufficiali INGV
- 👉 Esempio base: “Mostrami gli ultimi bollettini disponibili” o “Cerca il bollettino con id 123.”
- 💡 Consiglio dell’esperto: I bollettini sono la fonte ufficiale per le comunicazioni. Puoi anche cercare per parole chiave nel nome del file, se l’API lo supporta.
- ⏳ Tempistiche stimate: Risposta quasi istantanea.
🕵️ Rilevare anomalie
- 👉 Esempio base: “C’è un’anomalia in questi dati RMS [0.5, 0.6, 2.8, 0.7] per la stazione ECPN con una soglia di 2.5?”
- 💡 Consiglio dell’esperto: Per questa funzione devi fornirmi tu i dati. Incolla la serie numerica direttamente nella chat. Assicurati che i dati siano puliti (solo numeri, separati da virgole o spazi). Ti dirò esattamente quali punti superano la soglia che hai definito.
- ⏳ Tempistiche stimate: Istantanea. La velocità dipende solo dalla quantità di dati che incolli.
📜 Accedere alla politica sulla privacy
- 👉 Esempio base: “Mostrami la privacy policy.”
- 💡 Consiglio dell’esperto: Una richiesta diretta e semplice è la migliore.
- ⏳ Tempistiche stimate: Istantanea.
📚 Riepilogo Endpoint Principali (Per Utenti Tecnici)
Questa è una sintesi delle chiamate API che eseguo per risponderti. Conoscere questi dettagli può aiutarti a formulare richieste ancora più precise.
- GET /api/v1/events ➤ Restituisce eventi con timestamp e valore RMS.
- 🔍 Filtri: start_date, end_date, min_rms, station_code, critical, text, limit, offset
- GET /api/v1/stations/activity ➤ Classifica le stazioni per RMS medio.
- 🔍 Filtri: hours (default 24)
- GET /api/v1/stations/rms ➤ Fornisce la serie temporale RMS.
- 🔍 Filtri: station_codes, start_date, end_date, hours (default 168)
- GET /api/v1/stations/polarization ➤ Restituisce la direzione media oraria (azimuth).
- 🔍 Filtri: hours (default 24)
- GET /api/v1/stations/ssam ➤ Esegue l’analisi SSAM.
- 🔍 Filtri: station_codes, start_date, end_date, bands
- GET /api/v1/correlations ➤ Restituisce la matrice di correlazione.
- 🔍 Filtri: start_date, end_date, method (default ‘pearson’)
- GET /api/v1/bulletins ➤ Lista i bollettini o ne restituisce uno specifico.
- 🔍 Filtri: filename, id, limit, offset
- POST /api/v1/anomalies/detect ➤ Rileva anomalie in una serie di dati fornita.
- ✍️ Body: station, rms (lista), timestamps (lista), threshold
- GET /privacy ➤ Restituisce la politica sulla privacy.
8. Sviluppi Futuri e Aree di Miglioramento
- Database Dedicato: Sostituire il salvataggio su file system con un database più robusto e performante (es. InfluxDB, TimescaleDB) per la gestione delle serie temporali e dei metadati.
- Modelli di Classificazione: Addestrare modelli di classificazione (es. SVM, RandomForest, reti neurali) sugli embeddings generati per riconoscere automaticamente diverse tipologie di eventi sismici (es. VT, LP, tremore).
- Interfaccia Utente Avanzata: Migliorare la dashboard Streamlit con funzionalità di interrogazione più complesse, confronto di eventi e visualizzazioni 3D.
- Integrazione LLM più Profonda: Espandere le capacità degli agenti LLM per correlare dati da diverse fonti (es. sismico, gas, report testuali) e fornire insight più approfonditi.
- CI/CD Completa: Arricchire la pipeline di deployment con test automatici e controlli di qualità del codice.