la04 commited on
Commit
42c84c3
·
verified ·
1 Parent(s): 685a4d5

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +24 -53
app.py CHANGED
@@ -1,79 +1,50 @@
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")
 
1
  import gradio as gr
2
  import os
3
+ from langchain.vectorstores import Chroma # Verwenden des normalen Chroma Moduls
4
+ from langchain.embeddings import HuggingFaceEmbeddings
 
5
  from langchain.chains import RetrievalQA
6
  from langchain.prompts import PromptTemplate
7
+ from pdfplumber import open as open_pdf # Verwenden von pdfplumber zum Extrahieren von Text aus PDFs
8
 
 
 
 
 
 
 
 
 
 
 
 
9
  def process_pdf_and_query(pdf_path, question):
10
+ # Lade die PDF und extrahiere den Text
11
+ with open_pdf(pdf_path) as pdf:
12
+ text = ""
13
+ for page in pdf.pages:
14
+ text += page.extract_text()
15
+
16
+ # Text als Dokumente in den Chroma Vektor-Datenbank laden
17
+ documents = [{"content": text, "metadata": {"source": pdf_path}}]
18
+
19
  embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
 
 
20
  vectordb = Chroma.from_documents(documents, embeddings)
21
+
 
22
  retriever = vectordb.as_retriever()
 
 
23
  prompt_template = "Beantworte die folgende Frage basierend auf dem Dokument: {context}\nFrage: {question}\nAntwort:"
24
  prompt = PromptTemplate(input_variables=["context", "question"], template=prompt_template)
25
+
 
26
  qa_chain = RetrievalQA.from_chain_type(llm=None, retriever=retriever, chain_type_kwargs={"prompt": prompt})
27
+ response = qa_chain.run(input_documents=documents, question=question)
28
+ return response
 
 
 
29
 
 
30
  def chatbot_response(pdf, question):
31
  # Gradio gibt uns die PDF als NamedString, wir extrahieren den Inhalt als Byte-Stream
32
  pdf_path = "/tmp/uploaded_pdf.pdf"
33
 
34
+ # Extrahiere den Inhalt der Datei als Bytes
35
+ pdf_content = pdf.read() # Hier holen wir den Inhalt der PDF als Byte-Stream
36
+
37
  # Speichern des Byte-Streams von der Datei
38
  with open(pdf_path, "wb") as f:
39
+ f.write(pdf_content)
40
 
41
+ # Frage beantworten basierend auf dem Text der PDF
42
+ answer = process_pdf_and_query(pdf_path, question)
 
 
 
 
 
 
 
 
43
 
44
  # Temporäre Datei löschen
45
  os.remove(pdf_path)
46
+
47
+ return answer
 
 
 
 
48
 
49
  # Gradio Interface
50
  pdf_input = gr.File(label="PDF-Datei hochladen")