DeryFerd's picture
Update app.py
930e1b5 verified
Raw History Blame Contribute Delete
3.25 kB
# 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()