# app.py # ========================================================= # PDF Summarizer dengan Flan-T5 & Gradio # Rangkuman Final dari Semua Sesi Debugging # ========================================================= import gradio as gr import fitz # Library PyMuPDF from transformers import T5Tokenizer, T5ForConditionalGeneration import torch # --- Langkah 1: Muat Model dan Tokenizer (Hanya sekali saat aplikasi start) --- # Kita muat langsung dari Hugging Face Hub, ini cara standar untuk deployment. print("Memulai aplikasi, memuat model...") model_name = "google/flan-t5-base" tokenizer = T5Tokenizer.from_pretrained(model_name) model = T5ForConditionalGeneration.from_pretrained(model_name) print("Model berhasil dimuat!") # --- Langkah 2: Definisikan Fungsi Inti untuk Meringkas --- def summarize_pdf(pdf_file_object): """ Fungsi utama yang menerima file dari Gradio, membaca isinya, dan menghasilkan ringkasan menggunakan model Flan-T5. """ if pdf_file_object is None: return "Mohon unggah file PDF terlebih dahulu." try: # Membaca file PDF dari path temporer yang diberikan Gradio # Ini adalah perbaikan untuk error "'NamedString' object has no attribute 'read'" doc = fitz.open(pdf_file_object.name) # Ekstrak semua teks dari setiap halaman full_text = "".join(page.get_text() for page in doc) doc.close() # Prompt Engineering "Level 3" untuk meminta output bullet points prompt = f"""Summarize the following text into key bullet points. Text: "{full_text}" Summary: - """ # Proses teks dengan model inputs = tokenizer(prompt, return_tensors="pt", max_length=1024, truncation=True) summary_ids = model.generate( inputs.input_ids, max_length=600, # Batas atas panjang ringkasan min_length=100, # Batas bawah panjang ringkasan length_penalty=1.0, # Netral, tidak menghukum/mendorong kalimat panjang num_beams=4, # Teknik pencarian untuk hasil yang lebih baik early_stopping=True ) summary = tokenizer.decode(summary_ids[0], skip_special_tokens=True) # Tambahkan kembali bullet point di awal jika hilang saat decoding return "- " + summary except Exception as e: # Menampilkan pesan error jika terjadi masalah return f"Terjadi kesalahan: {str(e)}" # --- Langkah 3: Bangun Antarmuka Pengguna dengan Gradio --- with gr.Blocks(theme=gr.themes.Soft()) as demo: gr.Markdown( """ # 🤖 AI PDF Summarizer (Flan-T5 Edition) Upload your PDF here and get your summary! """ ) with gr.Row(): pdf_input = gr.File(label="Upload your document (PDF)", file_types=[".pdf"]) summary_output = gr.Textbox(label="Summarize", lines=20, interactive=False) summarize_button = gr.Button("Summary", variant="primary") summarize_button.click( fn=summarize_pdf, inputs=pdf_input, outputs=summary_output ) # --- Langkah 4: Jalankan Aplikasi (Hanya jika file ini dieksekusi langsung) --- if __name__ == "__main__": demo.launch()