File size: 4,574 Bytes
5d61f5d
dc5c877
 
 
 
 
 
 
 
 
 
 
 
ac9e4c2
ee5073c
dc5c877
 
 
 
 
 
 
 
ac9e4c2
8009f13
ac9e4c2
 
 
ee5073c
 
ac9e4c2
dc5c877
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e949940
dc5c877
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e949940
dc5c877
 
 
 
 
ee5073c
 
 
 
 
 
 
 
 
 
ac9e4c2
dc5c877
 
67a7262
ac9e4c2
9caeaa8
ac9e4c2
 
 
dc5c877
 
 
5d61f5d
 
8a7a35c
dc5c877
ee5073c
 
 
070e207
dbb3710
e73fa11
c2dfc9e
 
ee5073c
 
 
 
 
 
 
 
c2dfc9e
dc5c877
 
c2dfc9e
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
import streamlit as st
from langchain.embeddings import HuggingFaceInstructEmbeddings
from langchain.vectorstores import FAISS
from langchain.text_splitter import CharacterTextSplitter
from langchain.document_loaders import DirectoryLoader, PyPDFLoader
import os
from PyPDF2 import PdfReader
from langchain.chains import RetrievalQAWithSourcesChain
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationalRetrievalChain
#from htmlTemplates import css, bot_template, user_template
from langchain.llms import HuggingFaceHub
from dotenv import load_dotenv
from transformers import pipeline
from sentence_transformers import SentenceTransformer, util
###########
#pip install faiss-cpu
#pip install langchain
#pip install pypdf
#pip tiktoken
#pip install InstructorEmbedding
###############

def check_question(user_question):
    
    if len(user_question) < 10:  # Beispielkriterium für minimale Länge
        return False
    return True


    
# PDF in String umwandeln
def get_pdf_text(folder_path):
    text = ""
    # Durchsuche alle Dateien im angegebenen Verzeichnis
    for filename in os.listdir(folder_path):
        filepath = os.path.join(folder_path, filename)

        # Überprüfe, ob die Datei die Erweiterung ".pdf" hat
        if os.path.isfile(filepath) and filename.lower().endswith(".pdf"):
            pdf_reader = PdfReader(filepath)
            for page in pdf_reader.pages:
                text += page.extract_text()
            #text += '\n'

    return text

#Chunks erstellen
def get_text_chunks(text):
    #Arbeitsweise Textsplitter definieren
    text_splitter = CharacterTextSplitter(
        separator="\n",
        chunk_size=1000,
        chunk_overlap=200,
        length_function=len
    )
    chunks = text_splitter.split_text(text)
    return chunks

# nur zum Anlegen des lokalen Verzeichnisses "Store" und speichern der Vektor-Datenbank
def create_vectorstore_and_store(text_chunks):
    embeddings = HuggingFaceInstructEmbeddings(model_name="hkunlp/instructor-base")
    # Initiate Faiss DB
    vectorstoreDB = FAISS.from_texts(texts=text_chunks,embedding=embeddings)#texts=text_chunks,
    ###
    ### --> danach soll das PDF-Verzeichnis gelöscht werden, bzw. Datein verschieben, weil beim nächsten Upload 
    ###
    # Verzeichnis in dem die VektorDB gespeichert werden soll
    save_directory = "Store"
    #VektorDB lokal speichern
    vectorstoreDB.save_local(save_directory)
    print(vectorstoreDB)
    return None
    
########

def get_vectorstore():
    embeddings = HuggingFaceInstructEmbeddings(model_name="hkunlp/instructor-base")
    #Abruf lokaler Vektordatenbank
    save_directory = "Store"
    vectorstoreDB = FAISS.load_local(save_directory, embeddings)
    return vectorstoreDB

def calculate_similarity(user_question, pdf_text):
    model = SentenceTransformer('paraphrase-distilroberta-base-v1')  # Verwende ein vortrainiertes Modell
    encoded_pdf = model.encode(pdf_text, convert_to_tensor=True)
    encoded_question = model.encode(user_question, convert_to_tensor=True)
    
    # Berechne die Ähnlichkeit zwischen der Frage und den PDF-Inhalten
    similarity_scores = util.pytorch_cos_sim(encoded_question, encoded_pdf)
    max_similarity = max(similarity_scores[0])
    
    return max_similarity.item()

def main():
    load_dotenv()
    user_question = st.text_area("Eingabe:")

    if not check_question(user_question):
        st.error("Die Frage ist zu ungenau. Bitte präzisiere deine Frage.")
        return
    
    folder_path = './PDFs'
    pdf_text = get_pdf_text(folder_path)
    text_chunks = get_text_chunks(pdf_text)
    create_vectorstore_and_store(text_chunks)
    
    

    similarity_score = calculate_similarity(user_question, pdf_text)
    
    # Nutze similarity_score zur Bewertung der Relevanz der Frage für die PDF-Inhalte
    relevance_threshold = 0.3  # Beispielwert, anpassen nach Bedarf

    st.write("Ähnlichkeit der Frage mit den PDF-Inhalten:", similarity_score)
    
    if similarity_score >= relevance_threshold:
        st.success("Die Frage ist relevant für die PDF-Inhalte.")
        # Führe die weitere Verarbeitung durch
        retriever = get_vectorstore().as_retriever()
        retrieved_docs = retriever.invoke(user_question)
        if user_question:
            st.text(retrieved_docs[0].page_content)
            # bei eingehendem PDF
    else:
        st.error("Die Frage ist nicht ausreichend relevant für die PDF-Inhalte. Bitte eine präzisere Frage stellen.")

if __name__ == '__main__':
    main()