Spaces:
Sleeping
Sleeping
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()
|