File size: 3,086 Bytes
40a799a
 
fbe3ac4
318ff7b
 
d859c3e
 
 
 
 
7bf65ec
d93fe74
 
 
6378bf1
318ff7b
 
 
 
 
 
d93fe74
318ff7b
e8a59ae
b12560a
318ff7b
 
d859c3e
318ff7b
 
d859c3e
 
 
 
42c84c3
d93fe74
b12560a
40a799a
b12560a
d859c3e
b12560a
d859c3e
b12560a
 
 
 
 
 
 
 
 
 
42c84c3
d93fe74
adbd41e
d859c3e
 
d93fe74
d859c3e
318ff7b
 
d859c3e
318ff7b
b12560a
 
 
318ff7b
d859c3e
b12560a
318ff7b
 
 
d93fe74
318ff7b
 
ee9ba92
fbe3ac4
 
318ff7b
 
 
b12560a
fbe3ac4
ee9ba92
318ff7b
 
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
import faiss
import numpy as np
import gradio as gr
from sentence_transformers import SentenceTransformer
import fitz  # PyMuPDF für die Textextraktion aus PDFs
from transformers import pipeline
import logging

# Logging konfigurieren
logging.basicConfig(level=logging.INFO)

# Modelle laden
model = SentenceTransformer('all-mpnet-base-v2')
qa_model = pipeline("question-answering", model="deepset/roberta-base-squad2")

# FAISS-Index erstellen
def create_faiss_index(documents):
    document_embeddings = model.encode(documents)
    dimension = len(document_embeddings[0])
    index = faiss.IndexFlatL2(dimension)
    document_embeddings = np.array(document_embeddings).astype('float32')
    index.add(document_embeddings)
    return index, documents

# Text aus PDF extrahieren
def extract_text_from_pdf(pdf_path):
    doc = fitz.open(pdf_path)
    text_chunks = []
    for page_num in range(len(doc)):
        page = doc.load_page(page_num)
        text = page.get_text("text")
        chunks = text.split('\n\n')  # Unterteilen nach Absätzen
        text_chunks.extend(chunks)
    return text_chunks

# Suche nach mehreren passenden Abschnitten
def search_documents(query, index, documents, k=10):
    query_embedding = model.encode([query])[0].astype('float32')
    D, I = index.search(np.array([query_embedding]), k=k)  # Suche nach den Top k Treffern
    results = [documents[i] for i in I[0]]
    return results  # Liste von Kontexten zurückgeben

# Kombiniere mehrere Antworten
def generate_detailed_answer(contexts, question):
    detailed_answer = []
    for context in contexts:
        try:
            result = qa_model(question=question, context=context)
            detailed_answer.append(result['answer'])
        except Exception as e:
            logging.warning(f"Fehler im QA-Modell: {e}")
    return " ".join(detailed_answer)

# Gesamtprozess
def chatbot_response(pdf_path, question):
    logging.info(f"Frage: {question}")
    
    # Text extrahieren
    text_chunks = extract_text_from_pdf(pdf_path)

    # FAISS-Index erstellen
    index, documents = create_faiss_index(text_chunks)

    # Suche nach Kontexten
    contexts = search_documents(question, index, documents, k=10)
    logging.info(f"Gefundene Kontexte: {[context[:100] for context in contexts]}")  # Logge die ersten 100 Zeichen jedes Kontexts

    # Antwort generieren
    answer = generate_detailed_answer(contexts, question)
    return answer

# Gradio-Interface
pdf_input = gr.File(label="PDF-Datei hochladen", type="filepath")
question_input = gr.Textbox(label="Frage eingeben", placeholder="Stelle eine Frage zu dem PDF-Dokument")
response_output = gr.Textbox(label="Antwort")

interface = gr.Interface(
    fn=chatbot_response,
    inputs=[pdf_input, question_input],
    outputs=response_output,
    title="PDF-Fragebeantwortung mit FAISS und Transformers",
    description="Lade eine PDF-Datei hoch und stelle Fragen zu ihrem Inhalt. Das System verwendet FAISS, Transformers und ein QA-Modell, um detaillierte Antworten zu liefern."
)

if __name__ == "__main__":
    interface.launch()