Spaces:
Sleeping
Sleeping
File size: 3,034 Bytes
fbe3ac4 c106446 7aa84d7 e8a59ae 42c84c3 fbe3ac4 e8a59ae 6378bf1 e8a59ae 42c84c3 e8a59ae 42c84c3 fbe3ac4 42c84c3 fbe3ac4 42c84c3 fbe3ac4 42c84c3 6378bf1 bd2041d 03a5db9 e8a59ae c106446 42c84c3 03a5db9 24d5864 42c84c3 03a5db9 e8a59ae 42c84c3 24d5864 42c84c3 ee9ba92 03a5db9 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 |
import gradio as gr
import os
from langchain.vectorstores import Chroma # Verwende das Standard-Chroma-Modul
from langchain.document_loaders import PyPDFLoader # Korrekt importiert
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
from pdf2image import convert_from_path
from transformers import LayoutLMv3Processor, AutoModelForTokenClassification
# OCR-Modell einrichten
class LayoutLMv3OCR:
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):
images = convert_from_path(pdf_path)
text_pages = []
for image in images:
inputs = self.processor(images=image, return_tensors="pt")
outputs = self.model(**inputs)
text = self.processor.batch_decode(outputs.logits, skip_special_tokens=True)[0]
text_pages.append(text)
return text_pages
ocr_tool = LayoutLMv3OCR()
def process_pdf_and_query(pdf_path, question):
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)
qa_chain = RetrievalQA.from_chain_type(llm=None, retriever=retriever, chain_type_kwargs={"prompt": prompt})
response = qa_chain.run(input_documents=documents, question=question)
return response
def chatbot_response(pdf, question):
# Gradio gibt uns die PDF als NamedString, wir extrahieren den Inhalt als Byte-Stream
pdf_path = "/mnt/data/uploaded_pdf.pdf" # Verwendet das persistente Verzeichnis von Hugging Face Spaces
# Extrahiere den Inhalt der Datei als Bytes
pdf_content = pdf.read() # Hier holen wir den Inhalt der PDF als Byte-Stream
# Speichern des Byte-Streams von der Datei
with open(pdf_path, "wb") as f:
f.write(pdf_content)
# OCR-Text extrahieren
extracted_text = ocr_tool.extract_text(pdf_path)
# Frage beantworten basierend auf der PDF und OCR-Inhalten
answer = process_pdf_and_query(pdf_path, question)
return answer
# 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()
|