la04 commited on
Commit
7bf65ec
·
verified ·
1 Parent(s): 7aa84d7

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +70 -43
app.py CHANGED
@@ -1,66 +1,93 @@
1
  import gradio as gr
2
- import os
3
- from langchain.vectorstores import Chroma # Verwende das Standard-Chroma-Modul
4
- from langchain.document_loaders import PyPDFLoader # Korrekt importiert
5
- from langchain.embeddings import HuggingFaceEmbeddings
6
  from langchain.chains import RetrievalQA
7
  from langchain.prompts import PromptTemplate
8
- from pdf2image import convert_from_path
9
- from transformers import LayoutLMv3Processor, AutoModelForTokenClassification
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
 
11
- # OCR-Modell einrichten
12
- class LayoutLMv3OCR:
13
  def __init__(self):
14
  self.processor = LayoutLMv3Processor.from_pretrained("microsoft/layoutlmv3-base")
15
  self.model = AutoModelForTokenClassification.from_pretrained("microsoft/layoutlmv3-base")
16
 
17
  def extract_text(self, pdf_path):
18
- images = convert_from_path(pdf_path)
19
- text_pages = []
20
- for image in images:
21
- inputs = self.processor(images=image, return_tensors="pt")
22
- outputs = self.model(**inputs)
23
- text = self.processor.batch_decode(outputs.logits, skip_special_tokens=True)[0]
24
- text_pages.append(text)
25
- return text_pages
26
 
27
- ocr_tool = LayoutLMv3OCR()
 
28
 
 
29
  def process_pdf_and_query(pdf_path, question):
30
- loader = PyPDFLoader(pdf_path)
31
- documents = loader.load()
 
 
32
 
33
- embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
34
- vectordb = Chroma.from_documents(documents, embeddings)
35
 
36
- retriever = vectordb.as_retriever()
37
- prompt_template = "Beantworte die folgende Frage basierend auf dem Dokument: {context}\nFrage: {question}\nAntwort:"
38
- prompt = PromptTemplate(input_variables=["context", "question"], template=prompt_template)
39
 
40
- qa_chain = RetrievalQA.from_chain_type(llm=None, retriever=retriever, chain_type_kwargs={"prompt": prompt})
41
- response = qa_chain.run(input_documents=documents, question=question)
42
- return response
 
 
 
43
 
44
- def chatbot_response(pdf, question):
45
- # Gradio gibt uns die PDF als NamedString, wir extrahieren den Inhalt als Byte-Stream
46
- pdf_path = "/mnt/data/uploaded_pdf.pdf" # Verwendet das persistente Verzeichnis von Hugging Face Spaces
47
-
48
- # Extrahiere den Inhalt der Datei als Bytes
49
- pdf_content = pdf.read() # Hier holen wir den Inhalt der PDF als Byte-Stream
50
-
51
- # Speichern des Byte-Streams von der Datei
52
- with open(pdf_path, "wb") as f:
53
- f.write(pdf_content)
54
 
55
- # OCR-Text extrahieren
56
- extracted_text = ocr_tool.extract_text(pdf_path)
 
 
 
 
57
 
58
- # Frage beantworten basierend auf der PDF und OCR-Inhalten
59
- answer = process_pdf_and_query(pdf_path, question)
 
 
60
 
61
- return answer
 
 
 
 
 
 
62
 
63
- # Gradio Interface
64
  pdf_input = gr.File(label="PDF-Datei hochladen")
65
  question_input = gr.Textbox(label="Frage eingeben")
66
  response_output = gr.Textbox(label="Antwort")
 
1
  import gradio as gr
2
+ from langchain.vectorstores import Chroma
3
+ from langchain_community.document_loaders import PyPDFLoader
4
+ from langchain_community.embeddings import HuggingFaceEmbeddings
5
+ from transformers import LayoutLMv3Processor, AutoModelForTokenClassification
6
  from langchain.chains import RetrievalQA
7
  from langchain.prompts import PromptTemplate
8
+ import fitz # PyMuPDF
9
+ import os
10
+
11
+ # Funktion zur Textextraktion mit PyMuPDF (fitz)
12
+ def extract_text_from_pdf(pdf_path):
13
+ try:
14
+ doc = fitz.open(pdf_path)
15
+ text_pages = []
16
+ for page_num in range(len(doc)):
17
+ page = doc.load_page(page_num)
18
+ text = page.get_text("text") # Extrahiert Text als normalen Text
19
+ text_pages.append(text)
20
+ return text_pages
21
+ except Exception as e:
22
+ print(f"Fehler bei der Textextraktion: {e}")
23
+ return []
24
 
25
+ # OCR-Tool mit LayoutLMv3 für strukturierte PDFs
26
+ class OCRTool:
27
  def __init__(self):
28
  self.processor = LayoutLMv3Processor.from_pretrained("microsoft/layoutlmv3-base")
29
  self.model = AutoModelForTokenClassification.from_pretrained("microsoft/layoutlmv3-base")
30
 
31
  def extract_text(self, pdf_path):
32
+ try:
33
+ # LayoutLMv3 für strukturierte PDFs verwenden
34
+ text_pages = extract_text_from_pdf(pdf_path)
35
+ return text_pages
36
+ except Exception as e:
37
+ print(f"Fehler bei der PDF-Verarbeitung: {e}")
38
+ return []
 
39
 
40
+ # OCR-Instanz erstellen
41
+ ocr_tool = OCRTool()
42
 
43
+ # Funktion zur Verarbeitung der PDF und Antwortgenerierung
44
  def process_pdf_and_query(pdf_path, question):
45
+ try:
46
+ # Dokument laden und in Vektoren umwandeln
47
+ loader = PyPDFLoader(pdf_path)
48
+ documents = loader.load()
49
 
50
+ embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
51
+ vectordb = Chroma.from_documents(documents, embeddings)
52
 
53
+ retriever = vectordb.as_retriever()
54
+ prompt_template = "Beantworte die folgende Frage basierend auf dem Dokument: {context}\nFrage: {question}\nAntwort:"
55
+ prompt = PromptTemplate(input_variables=["context", "question"], template=prompt_template)
56
 
57
+ # RetrievalQA-Chain mit Hugging Face LLM
58
+ qa_chain = RetrievalQA.from_chain_type(
59
+ llm="huggingface/gpt2", # Modell von Hugging Face
60
+ retriever=retriever,
61
+ chain_type_kwargs={"prompt": prompt}
62
+ )
63
 
64
+ response = qa_chain.run(input_documents=documents, question=question)
65
+ return response
66
+ except Exception as e:
67
+ print(f"Fehler bei der Fragebeantwortung: {e}")
68
+ return "Es gab ein Problem bei der Verarbeitung der Frage."
 
 
 
 
 
69
 
70
+ # Funktion für die Chatbot-Antwort
71
+ def chatbot_response(pdf, question):
72
+ try:
73
+ # Speichern der hochgeladenen PDF
74
+ pdf_path = "uploaded_pdf.pdf"
75
+ pdf.save(pdf_path)
76
 
77
+ # Textextraktion aus der PDF
78
+ extracted_text = ocr_tool.extract_text(pdf_path)
79
+ if not extracted_text:
80
+ return "Es konnte kein Text aus der PDF extrahiert werden."
81
 
82
+ # Frage beantworten basierend auf den extrahierten Daten
83
+ answer = process_pdf_and_query(pdf_path, question)
84
+ os.remove(pdf_path)
85
+ return answer
86
+ except Exception as e:
87
+ print(f"Fehler bei der Chatbot-Verarbeitung: {e}")
88
+ return "Es gab ein Problem bei der Verarbeitung der Anfrage."
89
 
90
+ # Gradio-Interface
91
  pdf_input = gr.File(label="PDF-Datei hochladen")
92
  question_input = gr.Textbox(label="Frage eingeben")
93
  response_output = gr.Textbox(label="Antwort")