File size: 2,850 Bytes
fbe3ac4
c106446
692eafb
fbe3ac4
 
 
 
b2bbc8f
6378bf1
b2bbc8f
 
 
 
 
 
 
 
 
 
 
 
6378bf1
b2bbc8f
bd2041d
b2bbc8f
 
 
 
 
fbe3ac4
b2bbc8f
fbe3ac4
 
 
 
 
 
 
b2bbc8f
fbe3ac4
 
b2bbc8f
fbe3ac4
6378bf1
b2bbc8f
bd2041d
b2bbc8f
692eafb
b2bbc8f
c106446
b2bbc8f
24d5864
b62f55c
b2bbc8f
 
ee9ba92
24d5864
692eafb
ee9ba92
692eafb
ee9ba92
 
b2bbc8f
fbe3ac4
 
 
ee9ba92
b2bbc8f
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
import gradio as gr
import os
from langchain.vectorstores import Chroma
from langchain_community.document_loaders import PyPDFLoader
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
import fitz  # PyMuPDF für das Extrahieren von Text aus PDFs

# Funktion zum Extrahieren von Text aus einer PDF
def extract_text_from_pdf(pdf_path):
    doc = fitz.open(pdf_path)  # Öffnen der PDF-Datei
    text_pages = []
    
    # Durch alle Seiten der PDF iterieren und Text extrahieren
    for page_num in range(doc.page_count):
        page = doc.load_page(page_num)
        text = page.get_text("text")  # Extrahiert den Text als "plain text"
        text_pages.append(text)
    
    return text_pages

# Frage-Antwort-Funktion mit Langchain und Chroma
def process_pdf_and_query(pdf_path, question):
    # Extrahiere Text aus der PDF
    extracted_text = extract_text_from_pdf(pdf_path)
    
    # Dokumente für Langchain laden
    documents = [{"text": page_text} for page_text in extracted_text]

    # Embedding und Vektorstore vorbereiten
    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)

    # Erstellung der RetrievalQA-Kette
    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

# Gradio Antwortfunktion
def chatbot_response(pdf, question):
    # Speichern der hochgeladenen PDF-Datei
    pdf_path = "/tmp/uploaded_pdf.pdf"
    pdf_content = pdf.read()  # Hole den Inhalt der PDF als Byte-Stream
    
    # Speichern des Byte-Streams in einer Datei
    with open(pdf_path, "wb") as f:
        f.write(pdf_content)
    
    # Frage beantworten basierend auf der extrahierten PDF und der Frage
    answer = process_pdf_and_query(pdf_path, question)

    # Temporäre Datei löschen
    os.remove(pdf_path)
    
    return answer

# Gradio Interface erstellen
pdf_input = gr.File(label="PDF-Datei hochladen")
question_input = gr.Textbox(label="Frage eingeben")
response_output = gr.Textbox(label="Antwort")

# Gradio Interface starten
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()