la04 commited on
Commit
2925149
·
verified ·
1 Parent(s): 03a5db9

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +47 -23
app.py CHANGED
@@ -1,55 +1,79 @@
1
  import gradio as gr
2
- import pdfplumber
3
  import os
 
4
  from langchain.vectorstores import Chroma
5
- from langchain_community.document_loaders import PyPDFLoader
6
  from langchain_community.embeddings import HuggingFaceEmbeddings
7
  from langchain.chains import RetrievalQA
8
  from langchain.prompts import PromptTemplate
 
9
 
 
10
  def extract_text_from_pdf(pdf_path):
11
- # Verwende pdfplumber, um den Text aus der PDF zu extrahieren
12
  with pdfplumber.open(pdf_path) as pdf:
13
- full_text = ""
14
- for page in pdf.pages:
15
- full_text += page.extract_text()
16
- return full_text
 
 
17
 
 
18
  def process_pdf_and_query(pdf_path, question):
19
- text = extract_text_from_pdf(pdf_path)
20
-
21
- # Extrahiere die Dokumente und erstelle einen Vektorstore
22
- documents = [{"text": text}]
 
23
 
 
24
  embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
 
 
25
  vectordb = Chroma.from_documents(documents, embeddings)
26
-
 
27
  retriever = vectordb.as_retriever()
 
 
28
  prompt_template = "Beantworte die folgende Frage basierend auf dem Dokument: {context}\nFrage: {question}\nAntwort:"
29
  prompt = PromptTemplate(input_variables=["context", "question"], template=prompt_template)
30
-
 
31
  qa_chain = RetrievalQA.from_chain_type(llm=None, retriever=retriever, chain_type_kwargs={"prompt": prompt})
32
- response = qa_chain.run(input_documents=documents, question=question)
33
- return response
 
 
 
34
 
 
35
  def chatbot_response(pdf, question):
36
  # Gradio gibt uns die PDF als NamedString, wir extrahieren den Inhalt als Byte-Stream
37
  pdf_path = "/tmp/uploaded_pdf.pdf"
38
 
39
- # Extrahiere den Inhalt der Datei als Bytes
40
- pdf_content = pdf.read() # Hier holen wir den Inhalt der PDF als Byte-Stream
41
-
42
  # Speichern des Byte-Streams von der Datei
43
  with open(pdf_path, "wb") as f:
44
- f.write(pdf_content)
45
 
46
- # Frage beantworten basierend auf der PDF und extrahiertem Text
47
- answer = process_pdf_and_query(pdf_path, question)
 
 
 
 
 
 
 
 
48
 
49
  # Temporäre Datei löschen
50
  os.remove(pdf_path)
51
-
52
- return answer
 
 
 
 
53
 
54
  # Gradio Interface
55
  pdf_input = gr.File(label="PDF-Datei hochladen")
 
1
  import gradio as gr
 
2
  import os
3
+ import pdfplumber
4
  from langchain.vectorstores import Chroma
 
5
  from langchain_community.embeddings import HuggingFaceEmbeddings
6
  from langchain.chains import RetrievalQA
7
  from langchain.prompts import PromptTemplate
8
+ from langchain.document_loaders import TextLoader
9
 
10
+ # Funktion zum Extrahieren von Text aus einer PDF mit pdfplumber
11
  def extract_text_from_pdf(pdf_path):
 
12
  with pdfplumber.open(pdf_path) as pdf:
13
+ text_pages = []
14
+ for page_num, page in enumerate(pdf.pages):
15
+ text = page.extract_text()
16
+ if text:
17
+ text_pages.append({'page': page_num + 1, 'text': text})
18
+ return text_pages
19
 
20
+ # RAG Funktion zum Verarbeiten der PDF und Beantworten der Frage
21
  def process_pdf_and_query(pdf_path, question):
22
+ # Extrahiere den Text aus der PDF
23
+ text_pages = extract_text_from_pdf(pdf_path)
24
+
25
+ # Alle Seiten in einem Dokument zusammenführen
26
+ documents = [doc['text'] for doc in text_pages]
27
 
28
+ # Embedding mit Hugging Face Embeddings
29
  embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
30
+
31
+ # Chroma Vektor-Datenbank erstellen
32
  vectordb = Chroma.from_documents(documents, embeddings)
33
+
34
+ # Erstellen eines Retrievers
35
  retriever = vectordb.as_retriever()
36
+
37
+ # Prompt Template erstellen
38
  prompt_template = "Beantworte die folgende Frage basierend auf dem Dokument: {context}\nFrage: {question}\nAntwort:"
39
  prompt = PromptTemplate(input_variables=["context", "question"], template=prompt_template)
40
+
41
+ # RetrievalQA Chain erstellen
42
  qa_chain = RetrievalQA.from_chain_type(llm=None, retriever=retriever, chain_type_kwargs={"prompt": prompt})
43
+
44
+ # Antwort generieren
45
+ answer = qa_chain.run(input_documents=documents, question=question)
46
+
47
+ return answer, text_pages
48
 
49
+ # Funktion für den Gradio Chatbot
50
  def chatbot_response(pdf, question):
51
  # Gradio gibt uns die PDF als NamedString, wir extrahieren den Inhalt als Byte-Stream
52
  pdf_path = "/tmp/uploaded_pdf.pdf"
53
 
 
 
 
54
  # Speichern des Byte-Streams von der Datei
55
  with open(pdf_path, "wb") as f:
56
+ f.write(pdf.read())
57
 
58
+ # Frage beantworten basierend auf der PDF und den extrahierten Inhalten
59
+ answer, text_pages = process_pdf_and_query(pdf_path, question)
60
+
61
+ # Ermitteln, auf welcher Seite der relevante Text gefunden wurde
62
+ # Wir können den relevanten Text aus der Antwort extrahieren und auf die Seite referenzieren
63
+ referenced_page = None
64
+ for doc in text_pages:
65
+ if doc['text'] in answer:
66
+ referenced_page = doc['page']
67
+ break
68
 
69
  # Temporäre Datei löschen
70
  os.remove(pdf_path)
71
+
72
+ # Antwort und Seitenreferenz zurückgeben
73
+ if referenced_page:
74
+ return f"Antwort: {answer}\n(Referenz zur Seite {referenced_page})"
75
+ else:
76
+ return f"Antwort: {answer}\n(Seitenreferenz nicht verfügbar)"
77
 
78
  # Gradio Interface
79
  pdf_input = gr.File(label="PDF-Datei hochladen")