Spaces:
Sleeping
Sleeping
File size: 3,375 Bytes
fbe3ac4 c106446 2925149 692eafb fbe3ac4 2925149 6378bf1 2925149 b2bbc8f 03a5db9 2925149 6378bf1 2925149 bd2041d 2925149 03a5db9 2925149 fbe3ac4 2925149 fbe3ac4 2925149 fbe3ac4 2925149 fbe3ac4 2925149 fbe3ac4 2925149 6378bf1 2925149 bd2041d 03a5db9 692eafb c106446 03a5db9 24d5864 2925149 03a5db9 2925149 24d5864 692eafb ee9ba92 2925149 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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
import gradio as gr
import os
import pdfplumber
from langchain.vectorstores import Chroma
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
from langchain.document_loaders import TextLoader
# Funktion zum Extrahieren von Text aus einer PDF mit pdfplumber
def extract_text_from_pdf(pdf_path):
with pdfplumber.open(pdf_path) as pdf:
text_pages = []
for page_num, page in enumerate(pdf.pages):
text = page.extract_text()
if text:
text_pages.append({'page': page_num + 1, 'text': text})
return text_pages
# RAG Funktion zum Verarbeiten der PDF und Beantworten der Frage
def process_pdf_and_query(pdf_path, question):
# Extrahiere den Text aus der PDF
text_pages = extract_text_from_pdf(pdf_path)
# Alle Seiten in einem Dokument zusammenführen
documents = [doc['text'] for doc in text_pages]
# Embedding mit Hugging Face Embeddings
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
# Chroma Vektor-Datenbank erstellen
vectordb = Chroma.from_documents(documents, embeddings)
# Erstellen eines Retrievers
retriever = vectordb.as_retriever()
# Prompt Template erstellen
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 erstellen
qa_chain = RetrievalQA.from_chain_type(llm=None, retriever=retriever, chain_type_kwargs={"prompt": prompt})
# Antwort generieren
answer = qa_chain.run(input_documents=documents, question=question)
return answer, text_pages
# Funktion für den Gradio Chatbot
def chatbot_response(pdf, question):
# Gradio gibt uns die PDF als NamedString, wir extrahieren den Inhalt als Byte-Stream
pdf_path = "/tmp/uploaded_pdf.pdf"
# Speichern des Byte-Streams von der Datei
with open(pdf_path, "wb") as f:
f.write(pdf.read())
# Frage beantworten basierend auf der PDF und den extrahierten Inhalten
answer, text_pages = process_pdf_and_query(pdf_path, question)
# Ermitteln, auf welcher Seite der relevante Text gefunden wurde
# Wir können den relevanten Text aus der Antwort extrahieren und auf die Seite referenzieren
referenced_page = None
for doc in text_pages:
if doc['text'] in answer:
referenced_page = doc['page']
break
# Temporäre Datei löschen
os.remove(pdf_path)
# Antwort und Seitenreferenz zurückgeben
if referenced_page:
return f"Antwort: {answer}\n(Referenz zur Seite {referenced_page})"
else:
return f"Antwort: {answer}\n(Seitenreferenz nicht verfügbar)"
# 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()
|