la04 commited on
Commit
40a799a
·
verified ·
1 Parent(s): b771d1d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +31 -92
app.py CHANGED
@@ -1,104 +1,43 @@
 
 
 
1
  import gradio as gr
2
- from langchain.vectorstores import Chroma
3
- from langchain.document_loaders import PyPDFLoader
4
- from langchain.embeddings import HuggingFaceEmbeddings
5
- from transformers import LayoutLMv3Processor, AutoModelForTokenClassification
6
- from langchain.chains import RetrievalQA
7
- from langchain.prompts import PromptTemplate
8
- import fitz # PyMuPDF
9
- import os
10
 
11
- # Funktion zur Textextraktion mit PyMuPDF (fitz)
12
- def extract_text_from_pdf(pdf_path):
13
- try:
14
- doc = fitz.open(pdf_path)
15
- text_pages = []
16
- for page_num in range(len(doc)):
17
- page = doc.load_page(page_num)
18
- text = page.get_text("text") # Extrahiert Text als normalen Text
19
- text_pages.append(text)
20
- return text_pages
21
- except Exception as e:
22
- print(f"Fehler bei der Textextraktion: {e}")
23
- return []
24
 
25
- # OCR-Tool mit LayoutLMv3 für strukturierte PDFs
26
- class OCRTool:
27
- def __init__(self):
28
- self.processor = LayoutLMv3Processor.from_pretrained("microsoft/layoutlmv3-base")
29
- self.model = AutoModelForTokenClassification.from_pretrained("microsoft/layoutlmv3-base")
 
30
 
31
- def extract_text(self, pdf_path):
32
- try:
33
- # LayoutLMv3 für strukturierte PDFs verwenden
34
- text_pages = extract_text_from_pdf(pdf_path)
35
- return text_pages
36
- except Exception as e:
37
- print(f"Fehler bei der PDF-Verarbeitung: {e}")
38
- return []
39
 
40
- # OCR-Instanz erstellen
41
- ocr_tool = OCRTool()
 
 
 
42
 
43
- # Funktion zur Verarbeitung der PDF und Antwortgenerierung
44
- def process_pdf_and_query(pdf_path, question):
45
- try:
46
- # Dokument laden und in Vektoren umwandeln
47
- loader = PyPDFLoader(pdf_path)
48
- documents = loader.load()
49
 
50
- embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
51
- vectordb = Chroma.from_documents(documents, embeddings)
52
-
53
- retriever = vectordb.as_retriever()
54
- prompt_template = "Beantworte die folgende Frage basierend auf dem Dokument: {context}\nFrage: {question}\nAntwort:"
55
- prompt = PromptTemplate(input_variables=["context", "question"], template=prompt_template)
56
-
57
- # RetrievalQA-Chain mit Hugging Face LLM
58
- qa_chain = RetrievalQA.from_chain_type(
59
- llm="huggingface/gpt2", # Modell von Hugging Face
60
- retriever=retriever,
61
- chain_type_kwargs={"prompt": prompt}
62
- )
63
-
64
- response = qa_chain.run(input_documents=documents, question=question)
65
- return response
66
- except Exception as e:
67
- print(f"Fehler bei der Fragebeantwortung: {e}")
68
- return "Es gab ein Problem bei der Verarbeitung der Frage."
69
-
70
- # Funktion für die Chatbot-Antwort
71
- def chatbot_response(pdf, question):
72
- try:
73
- # Speichern der hochgeladenen PDF
74
- pdf_path = "uploaded_pdf.pdf"
75
- pdf.save(pdf_path)
76
-
77
- # Textextraktion aus der PDF
78
- extracted_text = ocr_tool.extract_text(pdf_path)
79
- if not extracted_text:
80
- return "Es konnte kein Text aus der PDF extrahiert werden."
81
-
82
- # Frage beantworten basierend auf den extrahierten Daten
83
- answer = process_pdf_and_query(pdf_path, question)
84
- os.remove(pdf_path)
85
- return answer
86
- except Exception as e:
87
- print(f"Fehler bei der Chatbot-Verarbeitung: {e}")
88
- return "Es gab ein Problem bei der Verarbeitung der Anfrage."
89
-
90
- # Gradio-Interface
91
- pdf_input = gr.File(label="PDF-Datei hochladen")
92
- question_input = gr.Textbox(label="Frage eingeben")
93
- response_output = gr.Textbox(label="Antwort")
94
 
95
  interface = gr.Interface(
96
  fn=chatbot_response,
97
- inputs=[pdf_input, question_input],
98
- outputs=response_output,
99
- title="RAG Chatbot mit PDF-Unterstützung",
100
- description="Lade eine PDF-Datei hoch und stelle Fragen zu ihrem Inhalt."
101
  )
102
 
103
- if __name__ == "__main__":
104
- interface.launch()
 
1
+ import faiss
2
+ import numpy as np
3
+ from sentence_transformers import SentenceTransformer
4
  import gradio as gr
 
 
 
 
 
 
 
 
5
 
6
+ # Schritt 1: Lade das Modell für die Embeddings
7
+ model = SentenceTransformer('all-MiniLM-L6-v2')
 
 
 
 
 
 
 
 
 
 
 
8
 
9
+ # Beispiel-Dokumente (könnten auch aus PDFs oder anderen Quellen stammen)
10
+ documents = [
11
+ "LangChain ist eine Bibliothek für die Verarbeitung von Text mit LLMs.",
12
+ "FAISS wird verwendet, um Vektoren effizient zu durchsuchen.",
13
+ "Hugging Face bietet eine Vielzahl von vortrainierten Modellen."
14
+ ]
15
 
16
+ # Schritt 2: Erzeuge Embeddings für die Dokumente
17
+ document_embeddings = model.encode(documents)
 
 
 
 
 
 
18
 
19
+ # FAISS-Index für die Vektoren erstellen
20
+ dimension = len(document_embeddings[0])
21
+ index = faiss.IndexFlatL2(dimension)
22
+ document_embeddings = np.array(document_embeddings).astype('float32')
23
+ index.add(document_embeddings) # Füge Dokumente zum Index hinzu
24
 
25
+ # Schritt 3: Suche nach einer ähnlichen Antwort auf eine Eingabeabfrage
26
+ def search_documents(query):
27
+ query_embedding = model.encode([query])[0].astype('float32')
28
+ D, I = index.search(np.array([query_embedding]), k=1) # Suche nach den Top 1 Treffern
29
+ return documents[I[0][0]] # Gibt das am besten passende Dokument zurück
 
30
 
31
+ # Gradio Interface
32
+ def chatbot_response(query):
33
+ return search_documents(query)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
34
 
35
  interface = gr.Interface(
36
  fn=chatbot_response,
37
+ inputs="text",
38
+ outputs="text",
39
+ title="FAISS-basierter Chatbot",
40
+ description="Gib eine Frage ein, und erhalte eine Antwort basierend auf den Dokumenten."
41
  )
42
 
43
+ interface.launch()