File size: 6,522 Bytes
a38881b 0f199af a38881b 0f199af fc94519 f1715d8 0f199af f1715d8 0f199af f1715d8 0f199af f1715d8 0f199af f1715d8 0f199af f1715d8 8b0f09e a9aff25 8b0f09e dc84791 8b0f09e dc84791 8b0f09e dc84791 8b0f09e 0f199af 8b0f09e 0f199af 8b0f09e 0f199af 8b0f09e d64f54b 8b0f09e 0f199af 8b0f09e 1e8fcfa 8b0f09e bce755b e455e2a df99925 e455e2a |
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 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 |
################################################
#Pfad, wo Docs/Bilder/Filme abgelegt werden können - lokal, also hier im HF Space (sonst auf eigenem Rechner)
PATH_WORK = "."
CHROMA_DIR = "/chroma/kkg"
CHROMA_PDF = './chroma/kkg/pdf'
CHROMA_WORD = './chroma/kkg/word'
CHROMA_EXCEL = './chroma/kkg/excel'
YOUTUBE_DIR = "/youtube"
HISTORY_PFAD = "/data/history"
###############################################
#URLs zu Dokumenten oder andere Inhalte, die einbezogen werden sollen
PDF_URL = "https://arxiv.org/pdf/2303.08774.pdf"
WEB_URL = "https://openai.com/research/gpt-4"
YOUTUBE_URL_1 = "https://www.youtube.com/watch?v=--khbXchTeE"
YOUTUBE_URL_2 = "https://www.youtube.com/watch?v=hdhZwyf24mE"
#YOUTUBE_URL_3 = "https://www.youtube.com/watch?v=vw-KWfKwvTQ"
#spezielle Webseiten als Datenbasis laden
urls = [
"https://kkg.hamburg.de/unser-leitbild/"
"https://kkg.hamburg.de/unsere-schulcharta/",
"https://kkg.hamburg.de/koordination-unterrichtsentwicklung/",
"https://kkg.hamburg.de/konzept-medien-und-it-am-kkg/",
]
##################################################
#Normalisierung eines Prompts
##################################################
def normalise_prompt (prompt):
#alles Kleinbuchstaben
prompt_klein =prompt.lower()
#Word Tokenisation
tokens = word_tokenize(prompt_klein)
#Punktuierung entfernen
tokens = [word for word in tokens if word.isalnum()]
# Stop Word Entfernung
nltk.download('stopwords')
stop_words = set(stopwords.words('deutsch'))
tokens = [word for word in tokens if not word in stop_words]
# 5. Lemmatisierung: Worte in Grundform bringen, um Text besser vergleichen zu können
nltk.download('wordnet')
lemmatizer = WordNetLemmatizer()
tokens = [lemmatizer.lemmatize(word) for word in tokens]
# 6. Handling Special Characters (Remove non-alphanumeric characters)
tokens = [re.sub(r'\W+', '', word) for word in tokens]
# 7. Spell Check (optional, using a library like pyspellchecker)
from spellchecker import SpellChecker
spell = SpellChecker()
tokens = [spell.correction(word) for word in tokens]
# Join tokens back to sentence
normalized_prompt = ' '.join(tokens)
print("normaiserd prompt..................................")
print(normalized_prompt)
return normalized_prompt
##################################################
#RAG Hilfsfunktionen - Dokumenten bearbeiten für Vektorstore
##################################################
##################################################
# Funktion, um für einen best. File-typ ein directory-loader zu definieren
def create_directory_loader(file_type, directory_path):
#verscheidene Dokument loaders:
loaders = {
'.pdf': PyPDFLoader,
'.word': UnstructuredWordDocumentLoader,
}
return DirectoryLoader(
path=directory_path,
glob=f"**/*{file_type}",
loader_cls=loaders[file_type],
)
################################################
#die Inhalte splitten, um in Vektordatenbank entsprechend zu laden als Splits
def document_loading_splitting():
##############################
# Document loading
docs = []
# kreiere einen DirectoryLoader für jeden file type
pdf_loader = create_directory_loader('.pdf', CHROMA_PDF)
word_loader = create_directory_loader('.word', CHROMA_WORD)
print("PDF Loader done............................")
# Load the files
pdf_documents = pdf_loader.load()
word_documents = word_loader.load()
#alle zusammen in docs...
docs.extend(pdf_documents)
docs.extend(word_documents)
#andere loader...
# Load PDF
#loader = PyPDFLoader(PDF_URL)
#docs.extend(loader.load())
# Load Web
#loader = WebBaseLoader(WEB_URL)
#docs.extend(loader.load())
# Load YouTube
#loader = GenericLoader(YoutubeAudioLoader([YOUTUBE_URL_1,YOUTUBE_URL_2], PATH_WORK + YOUTUBE_DIR), OpenAIWhisperParser())
#docs.extend(loader.load())
################################
# Document splitting
text_splitter = RecursiveCharacterTextSplitter(chunk_overlap = 150, chunk_size = 1500)
splits = text_splitter.split_documents(docs)
return splits
###########################################
#Chroma DB die splits ablegen - vektorisiert...
def document_storage_chroma(splits):
#OpenAi embeddings----------------------------------
Chroma.from_documents(documents = splits, embedding = OpenAIEmbeddings(disallowed_special = ()), persist_directory = PATH_WORK + CHROMA_DIR)
#HF embeddings--------------------------------------
#Chroma.from_documents(documents = splits, embedding = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2", model_kwargs={"device": "cpu"}, encode_kwargs={'normalize_embeddings': False}), persist_directory = PATH_WORK + CHROMA_DIR)
############################################
#dokumente in chroma db vektorisiert ablegen können - die Db vorbereiten daüfur
def document_retrieval_chroma(llm, prompt):
#HF embeddings -----------------------------------
#Alternative Embedding - für Vektorstore, um Ähnlichkeitsvektoren zu erzeugen - die ...InstructEmbedding ist sehr rechenaufwendig
embeddings = HuggingFaceInstructEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2", model_kwargs={"device": "cpu"})
#etwas weniger rechenaufwendig:
#embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2", model_kwargs={"device": "cpu"}, encode_kwargs={'normalize_embeddings': False})
#ChromaDb um die embedings zu speichern
db = Chroma(embedding_function = embeddings, persist_directory = PATH_WORK + CHROMA_DIR)
return db
############################################
# rag_chain Alternative für RAg mit Bild-Upload, da hier das llm so nicht genutzt werden kann und der prompt mit den RAG Erweiterungen anders übergeben wird
#langchain nutzen, um prompt an llm zu leiten, aber vorher in der VektorDB suchen, um passende splits zum Prompt hinzuzufügen
#prompt mit RAG!!!
def rag_chain(prompt, db, k=3):
rag_template = "Nutze ausschließlich die folgenden Kontext Teile am Ende, um die Frage zu beantworten . " + template + "Frage: " + prompt + "Kontext Teile: "
retrieved_chunks = db.similarity_search(prompt, k)
neu_prompt = rag_template
for i, chunk in enumerate(retrieved_chunks):
neu_prompt += f"{i+1}. {chunk}\n"
return neu_prompt
|