File size: 3,208 Bytes
40a799a
 
fbe3ac4
318ff7b
 
d859c3e
 
 
 
 
7bf65ec
40a799a
d859c3e
 
6378bf1
318ff7b
 
 
 
 
 
 
 
e8a59ae
d859c3e
318ff7b
 
d859c3e
318ff7b
 
d859c3e
 
 
 
 
42c84c3
d859c3e
 
40a799a
d859c3e
 
 
 
 
 
 
 
42c84c3
d859c3e
adbd41e
d859c3e
 
318ff7b
d859c3e
318ff7b
 
d859c3e
318ff7b
d859c3e
 
 
318ff7b
d859c3e
 
318ff7b
 
 
adbd41e
318ff7b
 
ee9ba92
318ff7b
fbe3ac4
 
318ff7b
 
 
d859c3e
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
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)

# Schritt 1: Lade das Modell für die Embeddings
model = SentenceTransformer('all-mpnet-base-v2')  # Besser geeignet für längere Texte
qa_model = pipeline("question-answering", model="distilbert-base-cased-distilled-squad")

# 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)  # Füge Dokumente zum Index hinzu
    return index, documents

# Schritt 2: Extrahiere Text aus einem PDF (kleinere Abschnitte, z. B. Absätze)
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")
        # Text in kleinere Abschnitte (z. B. Absätze) unterteilen
        chunks = text.split('\n\n')  # Unterteilen nach Absätzen
        text_chunks.extend(chunks)
    return text_chunks

# Schritt 3: Suche nach mehreren passenden Abschnitten
def search_documents(query, index, documents, k=5):
    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 " ".join(results)  # Kombiniere die Top-Ergebnisse

# Schritt 4: Nutze das QA-Modell, um eine präzise Antwort zu generieren
def generate_answer(context, question):
    result = qa_model(question=question, context=context)
    return result['answer']

# Schritt 5: Gesamtprozess (Fragebeantwortung)
def chatbot_response(pdf_path, question):
    logging.info(f"Frage: {question}")
    
    # Textextraktion aus der PDF
    text_chunks = extract_text_from_pdf(pdf_path)

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

    # Suche nach Kontext
    context = search_documents(question, index, documents, k=5)
    logging.info(f"Gefundener Kontext: {context[:500]}")  # Nur die ersten 500 Zeichen anzeigen

    # Antwort generieren
    answer = generate_answer(context, question)
    return answer

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

# Gradio-Interface erstellen
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 präzise Antworten zu liefern."
)

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