la04 commited on
Commit
56daa17
·
verified ·
1 Parent(s): 5802e2a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +51 -56
app.py CHANGED
@@ -1,63 +1,58 @@
1
- import gradio as gr
2
- from transformers import RagTokenizer, RagRetriever, RagSequenceForGeneration
3
- import fitz # PyMuPDF
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
 
5
- # Lade das RAG-Modell, Tokenizer und Retriever
6
- model_name = "facebook/rag-token-nq" # Funktionierendes RAG-Modell mit Encoder und Generator
7
- tokenizer = RagTokenizer.from_pretrained(model_name)
8
- model = RagSequenceForGeneration.from_pretrained(model_name)
9
- retriever = RagRetriever.from_pretrained(model_name, index_name="exact", use_dummy_dataset=True)
10
 
11
- # Funktion zur Textextraktion aus PDF
12
- def extract_text_from_pdf(file):
13
- # Öffne die PDF-Datei mit PyMuPDF
14
- doc = fitz.open(file.name)
15
 
16
- # Extrahiere Text aus jeder Seite der PDF
17
- text = ""
18
- for page_num in range(len(doc)):
19
- page = doc.load_page(page_num)
20
- text += page.get_text("text") # Extrahiert den Text der Seite
 
 
 
 
 
 
 
 
 
21
 
22
- return text
23
-
24
- # Funktion zur Beantwortung der Frage durch das Modell
25
- def get_rag_answer(input_message, uploaded_file):
26
- # Extrahiere den Text aus dem hochgeladenen PDF-Dokument
27
- document_text = extract_text_from_pdf(uploaded_file)
28
-
29
- # Hier verwenden wir den extrahierten Text für das Abrufen von Informationen
30
- inputs = tokenizer(input_message, return_tensors="pt")
31
 
32
- # Abrufen von relevanten Dokumenten mit dem RagRetriever
33
- retrieved_docs = retriever.retrieve(input_ids=inputs["input_ids"])
34
-
35
- # Kombiniere die abgerufenen Dokumente und frage das Modell zur Generierung einer Antwort
36
- input_ids = tokenizer(input_message, return_tensors="pt").input_ids
37
- generated_ids = model.generate(input_ids=input_ids,
38
- decoder_start_token_id=model.config.pad_token_id,
39
- num_beams=4,
40
- max_length=100)
41
-
42
- answer = tokenizer.decode(generated_ids[0], skip_special_tokens=True)
43
 
44
- # Hier könnten wir eine Referenz (z.B. Absatz, Seite) in die Antwort einfügen
45
- references = "Referenz: Abschnitt X, Seite Y (aus Dokument)" # Füge diese Infos hinzu, falls möglich
46
-
47
- return f"{answer} \n\n{references}"
48
-
49
- # Gradio-Oberfläche
50
- def gradio_interface():
51
- iface = gr.Interface(
52
- fn=get_rag_answer,
53
- inputs=[
54
- gr.Textbox(label="User Input", placeholder="Stellen Sie eine Frage..."),
55
- gr.File(label="Laden Sie ein PDF-Dokument hoch", type="file") # Ermöglicht das Hochladen von PDF-Dateien
56
- ],
57
- outputs=gr.Textbox(label="Antwort des Chatbots"),
58
- live=True # Sofortige Antwortgenerierung
59
- )
60
- iface.launch()
61
 
62
- # Starte die Gradio-Oberfläche
63
- gradio_interface()
 
1
+ import os
2
+ import PyPDF2
3
+ from langchain.embeddings import HuggingFaceEmbeddings
4
+ from langchain.vectorstores import FAISS
5
+ from langchain.chains import RetrievalQA
6
+ from langchain.document_loaders import TextLoader
7
+ from langchain.prompts import PromptTemplate
8
+ from langchain.llms import OpenAI
9
+ from langchain.text_splitter import RecursiveCharacterTextSplitter
10
+
11
+ # Funktion zum Extrahieren von Text aus PDF
12
+ def extract_text_from_pdf(pdf_path):
13
+ with open(pdf_path, 'rb') as file:
14
+ reader = PyPDF2.PdfReader(file)
15
+ text = ""
16
+ for page in reader.pages:
17
+ text += page.extract_text()
18
+ return text
19
 
20
+ # Funktion zum Erstellen von Embeddings und Indexierung
21
+ def create_embeddings_and_index(text):
22
+ # Text in kleinere Teile aufteilen
23
+ text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
24
+ texts = text_splitter.split_text(text)
25
 
26
+ # Embeddings erzeugen
27
+ embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
 
 
28
 
29
+ # Indexierung mit FAISS
30
+ db = FAISS.from_texts(texts, embeddings)
31
+ return db
32
+
33
+ # Funktion für die Frage-Antwort-Pipeline
34
+ def answer_question(db, question):
35
+ qa_chain = RetrievalQA.from_chain_type(llm=OpenAI(), retriever=db.as_retriever())
36
+ response = qa_chain.run(question)
37
+ return response
38
+
39
+ # Beispiel für die Nutzung
40
+ def main():
41
+ # Dokument-Pfad
42
+ pdf_path = 'path_to_your_pdf_document.pdf'
43
 
44
+ # PDF extrahieren
45
+ text = extract_text_from_pdf(pdf_path)
46
+ print(f"Text aus dem Dokument extrahiert: {text[:500]}...") # Nur ersten 500 Zeichen anzeigen
 
 
 
 
 
 
47
 
48
+ # Embeddings erstellen und Index erstellen
49
+ db = create_embeddings_and_index(text)
50
+ print("Embeddings und Index erfolgreich erstellt.")
 
 
 
 
 
 
 
 
51
 
52
+ # Frage stellen
53
+ question = "Was ist das Ziel dieses Dokuments?"
54
+ answer = answer_question(db, question)
55
+ print(f"Antwort auf die Frage '{question}': {answer}")
 
 
 
 
 
 
 
 
 
 
 
 
 
56
 
57
+ if __name__ == "__main__":
58
+ main()