Spaces:
Sleeping
Sleeping
import gradio as gr | |
import easyocr | |
from pdf2image import convert_from_path | |
from transformers import RagTokenizer, RagRetriever, RagSequenceForGeneration | |
import os | |
# Initialisiere EasyOCR für Deutsch | |
reader = easyocr.Reader(['de']) # für die deutsche Sprache | |
# Initialisiere das deutsche Modell und den Tokenizer für RAG | |
model_name = "deepset/gbert-base" # Beispiel für ein deutsches Modell | |
tokenizer = RagTokenizer.from_pretrained(model_name) | |
model = RagSequenceForGeneration.from_pretrained(model_name) | |
retriever = RagRetriever.from_pretrained(model_name, index_name="exact", use_dummy_dataset=True) | |
# OCR-Funktion: Konvertiert PDF zu Bildern und extrahiert Text mit EasyOCR | |
def extract_text_from_pdf(file): | |
# Konvertiere PDF-Seiten in Bilder | |
images = convert_from_path(file.name, 300) # 300 DPI für bessere Qualität | |
text = "" | |
# Extrahiere Text aus jedem Bild mit EasyOCR | |
for image in images: | |
ocr_result = reader.readtext(image) | |
for detection in ocr_result: | |
text += detection[1] + "\n" | |
return text | |
# Funktion zur Generierung einer Antwort basierend auf dem hochgeladenen Dokument | |
def get_rag_answer(input_message, uploaded_file): | |
# Extrahiere den Text aus dem hochgeladenen PDF-Dokument mit OCR | |
document_text = extract_text_from_pdf(uploaded_file) | |
# Simuliere den Retrieval-Mechanismus, indem wir den extrahierten Text verwenden | |
inputs = tokenizer(input_message, return_tensors="pt") | |
retrieved_docs = retriever.retrieve(input_ids=inputs["input_ids"]) | |
# Kombiniere die extrahierten Dokumente und frage das Modell zur Generierung einer Antwort | |
input_ids = tokenizer(input_message, return_tensors="pt").input_ids | |
generated_ids = model.generate(input_ids=input_ids, | |
decoder_start_token_id=model.config.pad_token_id, | |
num_beams=4, | |
max_length=100) | |
answer = tokenizer.decode(generated_ids[0], skip_special_tokens=True) | |
# Hier könnten wir eine Referenz (z.B. Absatz, Seite) in die Antwort einfügen | |
references = "Referenz: Abschnitt X, Seite Y (aus Dokument)" # Füge diese Infos hinzu, falls möglich | |
return f"{answer} \n\n{references}" | |
# Gradio-Oberfläche | |
def gradio_interface(): | |
iface = gr.Interface( | |
fn=get_rag_answer, | |
inputs=[ | |
gr.Textbox(label="User Input", placeholder="Stellen Sie eine Frage..."), | |
gr.File(label="Laden Sie ein PDF-Dokument hoch", type="file") # Ermöglicht das Hochladen von PDF-Dateien | |
], | |
outputs=gr.Textbox(label="Antwort des Chatbots"), | |
live=True # Sofortige Antwortgenerierung | |
) | |
iface.launch() | |
# Starte die Gradio-Oberfläche | |
gradio_interface() | |