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()