""" 📊 Generatore di Tabelle Comparative con RAG Sistema per creare tabelle comparative da materiali didattici Utilizza RAG (Retrieval-Augmented Generation) per generare tabelle basate su documenti caricati dagli utenti. Autore: Sistema IA per la Didattica Inclusiva """ import os import gradio as gr from langchain_openai import ChatOpenAI, OpenAIEmbeddings from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.vectorstores import FAISS from langchain.chains import RetrievalQA from langchain.prompts import PromptTemplate from langchain.schema import Document # ======================================== # CONFIGURAZIONE # ======================================== if "OPENAI_API_KEY" not in os.environ: raise ValueError( "⚠️ OPENAI_API_KEY non trovata! " "Imposta la variabile d'ambiente nel tuo Hugging Face Space." ) # ======================================== # TESTO DI ESEMPIO # ======================================== ESEMPIO_TESTO = """LE RIVOLUZIONI INDUSTRIALI: UN CONFRONTO STORICO PRIMA RIVOLUZIONE INDUSTRIALE (1760-1840) La Prima Rivoluzione Industriale ebbe inizio in Gran Bretagna. Fu caratterizzata dall'introduzione della macchina a vapore di James Watt (1769). Settori: industria tessile, siderurgia, trasporti. Energia: carbone per macchine a vapore. Impatto sociale: urbanizzazione, nascita classe operaia, condizioni di lavoro difficili (12-16 ore), lavoro minorile. Luoghi: fabbriche sostituiscono lavoro artigianale. SECONDA RIVOLUZIONE INDUSTRIALE (1870-1914) Si sviluppò in Germania, Stati Uniti e Francia. Caratterizzata da elettricità e petrolio. Settori: industria chimica, elettrica, automobilistica, siderurgica avanzata. Innovazioni: telefono (Bell, 1876), lampadina (Edison, 1879), automobile (Benz, 1885), aeroplano (Wright, 1903). Energia: elettricità e petrolio. Impatto sociale: crescita classe media, miglioramento condizioni lavoro, sindacati, società di massa. Organizzazione: taylorismo e fordismo, catena di montaggio. TERZA RIVOLUZIONE INDUSTRIALE (1970-2010) Rivoluzione Digitale, iniziata anni '70 con elettronica e informatica. Settori: informatica, telecomunicazioni, biotecnologie, energie rinnovabili. Tecnologie: microprocessore (1971), personal computer (anni '80), internet (1991), smartphone (2007). Energia: elettricità, nucleare, rinnovabili (solare, eolico). Impatto sociale: globalizzazione, società dell'informazione, smart working, digital divide, social media. Organizzazione: automazione, outsourcing, lavoro a distanza. QUARTA RIVOLUZIONE INDUSTRIALE (2010-oggi) Industria 4.0, fusione di tecnologie digitali, fisiche e biologiche. Settori: intelligenza artificiale, robotica avanzata, IoT, stampa 3D, blockchain. Tecnologie: big data, cloud computing, realtà aumentata, quantum computing. Energia: rinnovabili (solare, eolico, idrogeno), transizione ecologica. Impatto sociale: automazione lavoro, riqualificazione continua, etica IA, economia circolare, telemedicina. Organizzazione: smart factory, produzione personalizzata, gig economy. """ # ======================================== # CLASSE RAG # ======================================== class ComparativeTableRAG: """Sistema RAG per generare tabelle comparative da documenti.""" def __init__(self, model_name="gpt-4.1-mini", temperature=0.3): self.llm = ChatOpenAI( model=model_name, temperature=temperature, max_tokens=2000 ) self.embeddings = OpenAIEmbeddings() self.text_splitter = RecursiveCharacterTextSplitter( chunk_size=1000, chunk_overlap=200, length_function=len ) self.vectorstore = None self.table_prompt = PromptTemplate( input_variables=["context", "question"], template="""Sei un assistente educativo che aiuta gli studenti a creare tabelle comparative. Basandoti ESCLUSIVAMENTE sulle informazioni fornite nel contesto, crea una tabella comparativa dettagliata. CONTESTO: {context} RICHIESTA: {question} ISTRUZIONI: 1. Analizza attentamente il contesto fornito 2. Identifica gli elementi da confrontare 3. Crea una tabella in formato Markdown con colonne appropriate 4. Usa SOLO informazioni presenti nel contesto 5. Se un'informazione non è presente, scrivi "Non specificato nel testo" 6. Mantieni un linguaggio chiaro e adatto agli studenti FORMATO RISPOSTA: Rispondi con una tabella in formato Markdown seguita da una breve spiegazione. TABELLA COMPARATIVA: """ ) def load_text(self, text: str) -> str: """Carica un testo e crea il vector store.""" try: documents = [Document(page_content=text)] chunks = self.text_splitter.split_documents(documents) self.vectorstore = FAISS.from_documents(chunks, self.embeddings) return f"✅ Testo caricato con successo! ({len(chunks)} sezioni create)" except Exception as e: return f"❌ Errore: {str(e)}" def generate_table(self, query: str, k: int = 5) -> str: """Genera una tabella comparativa basata sulla query.""" if self.vectorstore is None: return "⚠️ Errore: Nessun documento caricato. Carica prima un testo." try: retriever = self.vectorstore.as_retriever(search_kwargs={"k": k}) qa_chain = RetrievalQA.from_chain_type( llm=self.llm, chain_type="stuff", retriever=retriever, chain_type_kwargs={"prompt": self.table_prompt} ) result = qa_chain.invoke({"query": query}) return result["result"] except Exception as e: return f"❌ Errore durante la generazione: {str(e)}" def reset(self): """Resetta il vector store.""" self.vectorstore = None return "🔄 Sistema resettato. Carica un nuovo testo." # ======================================== # INIZIALIZZAZIONE # ======================================== rag_system = ComparativeTableRAG() # ======================================== # FUNZIONI GRADIO # ======================================== def process_text_input(text): """Carica un testo inserito dall'utente.""" if not text or not text.strip(): return "⚠️ Per favore, inserisci un testo." return rag_system.load_text(text) def process_file_input(file): """Carica un file caricato dall'utente.""" if file is None: return "⚠️ Per favore, carica un file." try: with open(file.name, 'r', encoding='utf-8') as f: text = f.read() return rag_system.load_text(text) except Exception as e: return f"❌ Errore: {str(e)}" def generate_comparative_table(query): """Genera una tabella comparativa.""" if not query or not query.strip(): return "⚠️ Per favore, inserisci una richiesta." if rag_system.vectorstore is None: return "⚠️ Carica prima un testo nella sezione 'Caricamento Materiali'." return rag_system.generate_table(query) def reset_system(): """Resetta il sistema.""" return rag_system.reset() def load_example(): """Carica il testo di esempio.""" result = rag_system.load_text(ESEMPIO_TESTO) return result + "\n\n📖 Esempio: Rivoluzioni Industriali" # ======================================== # INTERFACCIA GRADIO # ======================================== with gr.Blocks(title="📊 Tabelle Comparative con RAG") as demo: gr.Markdown( """ # 📊 Generatore di Tabelle Comparative con RAG Questo strumento utilizza l'intelligenza artificiale per creare tabelle comparative basate sui materiali didattici che carichi. ### 🚀 Come funziona: 1. **Carica** un testo o file con i materiali da studiare 2. **Richiedi** una tabella comparativa specifica 3. **Verifica** le informazioni con le tue fonti """ ) with gr.Tab("📤 Caricamento Materiali"): gr.Markdown( """ ### Carica i tuoi materiali didattici Puoi caricare: - Testo copiato da appunti, libri, articoli - File di testo (.txt) - Oppure usare l'esempio precaricato sulle Rivoluzioni Industriali """ ) with gr.Row(): with gr.Column(): text_input = gr.Textbox( label="📝 Incolla il tuo testo", placeholder="Incolla qui il testo dei tuoi appunti o materiali didattici...", lines=10 ) text_btn = gr.Button("📤 Carica Testo", variant="primary") with gr.Column(): file_input = gr.File( label="📁 Oppure carica un file", file_types=[".txt"] ) file_btn = gr.Button("📤 Carica File", variant="primary") example_btn = gr.Button("📖 Usa Esempio: Rivoluzioni Industriali", variant="secondary") upload_output = gr.Textbox( label="📊 Stato Caricamento", lines=3 ) with gr.Tab("📊 Generazione Tabelle"): gr.Markdown( """ ### Richiedi una tabella comparativa Descrivi che tipo di confronto vuoi vedere. **Esempi di richieste:** - "Confronta le 4 rivoluzioni industriali per periodo, tecnologie e impatto sociale" - "Crea una tabella che mostri l'evoluzione delle fonti di energia" - "Confronta le condizioni di lavoro nelle diverse rivoluzioni" """ ) query_input = gr.Textbox( label="✍️ La tua richiesta", placeholder="Es: Confronta le 4 rivoluzioni industriali in base a periodo, tecnologie e impatto sociale", lines=3 ) generate_btn = gr.Button("🎯 Genera Tabella", variant="primary") table_output = gr.Markdown(label="📊 Tabella Generata") gr.Examples( examples=[ "Crea una tabella che confronti le 4 rivoluzioni industriali per periodo storico, principali settori e fonti di energia", "Crea una tabella che mostri l'impatto sociale di ogni rivoluzione industriale", "Confronta le innovazioni tecnologiche chiave delle 4 rivoluzioni", "Mostra l'evoluzione dell'organizzazione del lavoro attraverso le rivoluzioni" ], inputs=query_input ) with gr.Tab("ℹ️ Informazioni"): gr.Markdown( """ ## 📚 Cos'è RAG? **RAG (Retrieval-Augmented Generation)** è una tecnica avanzata che permette all'IA di: 1. **Cercare** informazioni rilevanti nei tuoi documenti 2. **Comprendere** il contesto specifico 3. **Generare** risposte basate SOLO sui tuoi materiali ### 🎯 Vantaggi per lo Studio: - ✅ Risposte basate sui TUOI materiali didattici - ✅ Sintesi e organizzazione automatica delle informazioni - ✅ Confronti strutturati tra concetti - ✅ Risparmio di tempo nella creazione di schemi ### ⚠️ Importante: - L'IA può fare errori o omettere informazioni - Verifica sempre le tabelle con i materiali originali - Usa questo strumento come supporto, non come sostituto dello studio - Discuti i risultati con i tuoi insegnanti ### 💡 Suggerimenti: - Carica testi completi e dettagliati per risultati migliori - Sii specifico nelle richieste (indica cosa vuoi confrontare) - Usa le tabelle come punto di partenza per approfondimenti - Integra con altri metodi di studio (mappe mentali, riassunti) --- ### 📖 Per gli Insegnanti: Questo strumento può essere utilizzato per: - **Sintesi**: Aiutare gli studenti a organizzare informazioni complesse - **Confronto**: Creare tabelle comparative su argomenti studiati - **Verifica**: Attività di fact-checking delle tabelle generate - **Discussione**: Analizzare cosa l'IA ha incluso/omesso **Attività suggerite:** 1. Gli studenti caricano materiali e generano tabelle 2. Verificano le informazioni con i testi originali 3. Discutono in classe accuratezza e completezza 4. Migliorano manualmente le tabelle ---
Creato con ❤️ per la didattica inclusiva | Powered by LangChain & GPT-4.1-mini
""" ) # Pulsante reset with gr.Row(): reset_btn = gr.Button("🔄 Reset Sistema", variant="stop") # Eventi text_btn.click(process_text_input, inputs=[text_input], outputs=[upload_output]) file_btn.click(process_file_input, inputs=[file_input], outputs=[upload_output]) example_btn.click(load_example, outputs=[upload_output]) generate_btn.click(generate_comparative_table, inputs=[query_input], outputs=[table_output]) reset_btn.click(reset_system, outputs=[upload_output]) # ======================================== # AVVIO APPLICAZIONE # ======================================== if __name__ == "__main__": demo.launch( server_name="0.0.0.0", server_port=7860, share=False )