Spaces:
Sleeping
Sleeping
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()
|