CodeKing555 commited on
Commit
d0fff4c
·
verified ·
1 Parent(s): 8b298be

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +133 -0
app.py ADDED
@@ -0,0 +1,133 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import pdfplumber
3
+ import torch
4
+ from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
5
+
6
+ # ------------------------------------------------------------------------------
7
+ # 1) Modell laden (valhalla/t5-base-qg-hl)
8
+ # ------------------------------------------------------------------------------
9
+ MODEL_NAME = "valhalla/t5-base-qg-hl"
10
+ print(f"Lade Tokenizer und Modell: {MODEL_NAME}")
11
+ tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
12
+ model = AutoModelForSeq2SeqLM.from_pretrained(MODEL_NAME)
13
+
14
+ # Optional: auf CPU behalten (gratis, aber langsamer) oder GPU nutzen, wenn Hugging Face
15
+ # Community GPU verfügbar ist (dann model.to("cuda"))
16
+ device = torch.device("cpu")
17
+ model.to(device)
18
+
19
+
20
+ # ------------------------------------------------------------------------------
21
+ # 2) PDF-Text extrahieren
22
+ # ------------------------------------------------------------------------------
23
+ def extract_text_from_pdf(pdf_file):
24
+ """
25
+ Extrahiert den Text aller Seiten aus einem hochgeladenen PDF.
26
+ """
27
+ if pdf_file is None:
28
+ return ""
29
+
30
+ text = ""
31
+ with pdfplumber.open(pdf_file) as pdf:
32
+ for page in pdf.pages:
33
+ text += page.extract_text() + "\n"
34
+
35
+ # Minimales Cleaning
36
+ text = " ".join(text.split())
37
+ return text
38
+
39
+ # ------------------------------------------------------------------------------
40
+ # 3) Question Generation mit T5
41
+ # Dieses Modell ("valhalla/t5-base-qg-hl") nutzt einen 'Highlight-basierten'
42
+ # Ansatz. Am einfachsten probieren wir, den gesamten Text an das Modell zu geben.
43
+ # Für bessere Qualität könnte man (a) Text kürzen, (b) "answer highlighting" machen.
44
+ # ------------------------------------------------------------------------------
45
+ def generate_questions(text_chunk, max_length=128):
46
+ """
47
+ Fragt das T5-QG-Modell nach Fragen für den gegebenen Text.
48
+ Achtung: 'valhalla/t5-base-qg-hl' erwartet i.d.R. 'question: ... context: ...' oder
49
+ 'generate question: ...' Prompts. Wir machen ein einfaches prompt-engineering.
50
+ """
51
+ # Einfacher Prompt: wir fügen "generate question:" voran
52
+ prompt_text = f"generate question: {text_chunk}"
53
+
54
+ inputs = tokenizer.encode(prompt_text, return_tensors="pt").to(device)
55
+ output = model.generate(
56
+ inputs,
57
+ max_length=max_length,
58
+ num_beams=4,
59
+ early_stopping=True
60
+ )
61
+ question = tokenizer.decode(output[0], skip_special_tokens=True)
62
+ return question
63
+
64
+
65
+ # ------------------------------------------------------------------------------
66
+ # 4) Gradio-Workflows
67
+ # ------------------------------------------------------------------------------
68
+ def process_pdf(pdf_file, num_questions):
69
+ """
70
+ 1) PDF extrahieren
71
+ 2) Kürzen (Text chunk)
72
+ 3) Mehrere Fragen generieren
73
+ """
74
+ if pdf_file is None:
75
+ return "Keine PDF hochgeladen."
76
+
77
+ # PDF-Text holen
78
+ text = extract_text_from_pdf(pdf_file.name)
79
+ if not text:
80
+ return "Text konnte nicht extrahiert werden oder PDF ist leer."
81
+
82
+ # Ggf. nur ersten 1500 Zeichen nehmen, damit wir das Modell nicht überfüttern
83
+ text_chunk = text[:1500]
84
+
85
+ # Generiere mehrere Fragen
86
+ questions_output = []
87
+ for i in range(num_questions):
88
+ q = generate_questions(text_chunk)
89
+ questions_output.append(f"Frage {i+1}: {q}")
90
+
91
+ # Kombiniere das als Ausgabe
92
+ final_output = "\n\n".join(questions_output)
93
+ return final_output
94
+
95
+ def build_app():
96
+ with gr.Blocks() as demo:
97
+ gr.Markdown("# QG-PDF – Fragegenerierung aus PDF (ohne OpenAI)")
98
+ gr.Markdown(
99
+ "Lade ein PDF hoch und wähle, wie viele Fragen generiert werden sollen. "
100
+ "Wir verwenden das Modell **valhalla/t5-base-qg-hl**, "
101
+ "das (meist) eine offene Frage ausgibt."
102
+ )
103
+
104
+ with gr.Row():
105
+ pdf_file = gr.File(label="📄 PDF hochladen")
106
+ q_slider = gr.Slider(
107
+ minimum=1,
108
+ maximum=5,
109
+ step=1,
110
+ value=3,
111
+ label="Anzahl Fragen"
112
+ )
113
+ generate_btn = gr.Button("Fragen generieren")
114
+ output_box = gr.Textbox(
115
+ label="Generierte Fragen",
116
+ lines=10
117
+ )
118
+
119
+ def on_click_generate(pdf, q_num):
120
+ return process_pdf(pdf, q_num)
121
+
122
+ generate_btn.click(
123
+ fn=on_click_generate,
124
+ inputs=[pdf_file, q_slider],
125
+ outputs=[output_box]
126
+ )
127
+
128
+ return demo
129
+
130
+ demo = build_app()
131
+
132
+ if __name__ == "__main__":
133
+ demo.launch()