Spaces:
Sleeping
Sleeping
Download app.py from borgo9/tabelle_comparative: direct link, hf CLI and curl.
- Browser
- Download file 14 kB
-
https://huggingface.co/spaces/borgo9/tabelle_comparative/resolve/main/app.py
- Command line
-
hf download hf://spaces/borgo9/tabelle_comparative/app.py
-
curl -L -o app.py https://huggingface.co/spaces/borgo9/tabelle_comparative/resolve/main/app.py
14 kB
| """ | |
| 📊 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 | |
| --- | |
| <center> | |
| <small> | |
| Creato con ❤️ per la didattica inclusiva | Powered by LangChain & GPT-4.1-mini | |
| </small> | |
| </center> | |
| """ | |
| ) | |
| # 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 | |
| ) | |