File size: 3,838 Bytes
fbe3ac4
7bf65ec
b771d1d
 
7bf65ec
fbe3ac4
 
7bf65ec
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6378bf1
7bf65ec
 
e8a59ae
 
 
 
 
7bf65ec
 
 
 
 
 
 
e8a59ae
7bf65ec
 
42c84c3
7bf65ec
e8a59ae
7bf65ec
 
 
 
42c84c3
7bf65ec
 
42c84c3
7bf65ec
 
 
42c84c3
7bf65ec
 
 
 
 
 
6378bf1
7bf65ec
 
 
 
 
03a5db9
7bf65ec
 
 
 
 
 
e8a59ae
7bf65ec
 
 
 
24d5864
7bf65ec
 
 
 
 
 
 
ee9ba92
7bf65ec
fbe3ac4
 
 
ee9ba92
fbe3ac4
 
 
 
 
 
 
ee9ba92
fbe3ac4
692eafb
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import gradio as gr
from langchain.vectorstores import Chroma
from langchain.document_loaders import PyPDFLoader
from langchain.embeddings import HuggingFaceEmbeddings
from transformers import LayoutLMv3Processor, AutoModelForTokenClassification
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
import fitz  # PyMuPDF
import os

# Funktion zur Textextraktion mit PyMuPDF (fitz)
def extract_text_from_pdf(pdf_path):
    try:
        doc = fitz.open(pdf_path)
        text_pages = []
        for page_num in range(len(doc)):
            page = doc.load_page(page_num)
            text = page.get_text("text")  # Extrahiert Text als normalen Text
            text_pages.append(text)
        return text_pages
    except Exception as e:
        print(f"Fehler bei der Textextraktion: {e}")
        return []

# OCR-Tool mit LayoutLMv3 für strukturierte PDFs
class OCRTool:
    def __init__(self):
        self.processor = LayoutLMv3Processor.from_pretrained("microsoft/layoutlmv3-base")
        self.model = AutoModelForTokenClassification.from_pretrained("microsoft/layoutlmv3-base")

    def extract_text(self, pdf_path):
        try:
            # LayoutLMv3 für strukturierte PDFs verwenden
            text_pages = extract_text_from_pdf(pdf_path)
            return text_pages
        except Exception as e:
            print(f"Fehler bei der PDF-Verarbeitung: {e}")
            return []

# OCR-Instanz erstellen
ocr_tool = OCRTool()

# Funktion zur Verarbeitung der PDF und Antwortgenerierung
def process_pdf_and_query(pdf_path, question):
    try:
        # Dokument laden und in Vektoren umwandeln
        loader = PyPDFLoader(pdf_path)
        documents = loader.load()

        embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
        vectordb = Chroma.from_documents(documents, embeddings)

        retriever = vectordb.as_retriever()
        prompt_template = "Beantworte die folgende Frage basierend auf dem Dokument: {context}\nFrage: {question}\nAntwort:"
        prompt = PromptTemplate(input_variables=["context", "question"], template=prompt_template)

        # RetrievalQA-Chain mit Hugging Face LLM
        qa_chain = RetrievalQA.from_chain_type(
            llm="huggingface/gpt2",  # Modell von Hugging Face
            retriever=retriever,
            chain_type_kwargs={"prompt": prompt}
        )

        response = qa_chain.run(input_documents=documents, question=question)
        return response
    except Exception as e:
        print(f"Fehler bei der Fragebeantwortung: {e}")
        return "Es gab ein Problem bei der Verarbeitung der Frage."

# Funktion für die Chatbot-Antwort
def chatbot_response(pdf, question):
    try:
        # Speichern der hochgeladenen PDF
        pdf_path = "uploaded_pdf.pdf"
        pdf.save(pdf_path)

        # Textextraktion aus der PDF
        extracted_text = ocr_tool.extract_text(pdf_path)
        if not extracted_text:
            return "Es konnte kein Text aus der PDF extrahiert werden."

        # Frage beantworten basierend auf den extrahierten Daten
        answer = process_pdf_and_query(pdf_path, question)
        os.remove(pdf_path)
        return answer
    except Exception as e:
        print(f"Fehler bei der Chatbot-Verarbeitung: {e}")
        return "Es gab ein Problem bei der Verarbeitung der Anfrage."

# Gradio-Interface
pdf_input = gr.File(label="PDF-Datei hochladen")
question_input = gr.Textbox(label="Frage eingeben")
response_output = gr.Textbox(label="Antwort")

interface = gr.Interface(
    fn=chatbot_response,
    inputs=[pdf_input, question_input],
    outputs=response_output,
    title="RAG Chatbot mit PDF-Unterstützung",
    description="Lade eine PDF-Datei hoch und stelle Fragen zu ihrem Inhalt."
)

if __name__ == "__main__":
    interface.launch()