File size: 2,788 Bytes
1474017
6e1c776
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1474017
6e1c776
 
 
 
 
 
 
 
1474017
6e1c776
 
 
 
1474017
6e1c776
 
 
1474017
6e1c776
 
 
 
 
 
1474017
6e1c776
1474017
6e1c776
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1474017
6e1c776
1474017
6e1c776
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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()