alexkueck commited on
Commit
5c4777a
1 Parent(s): 78aab9d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +32 -2
app.py CHANGED
@@ -27,9 +27,12 @@ _ = load_dotenv(find_dotenv())
27
  #api_key=os.getenv("OPENAI_API_KEY"),
28
  #)
29
 
30
- #nur bei ersten Anfrage splitten der Dokumente
 
 
31
  splittet = False
32
 
 
33
  #Für MongoDB statt Chroma als Vektorstore
34
  #MONGODB_URI = os.environ["MONGODB_ATLAS_CLUSTER_URI"]
35
  #client = MongoClient(MONGODB_URI)
@@ -38,31 +41,44 @@ splittet = False
38
  #MONGODB_COLLECTION = client[MONGODB_DB_NAME][MONGODB_COLLECTION_NAME]
39
  #MONGODB_INDEX_NAME = "default"
40
 
 
 
41
  template = """Antworte in deutsch, wenn es nicht explizit anders gefordert wird. Wenn du die Antwort nicht kennst, antworte einfach, dass du es nicht weißt. Versuche nicht, die Antwort zu erfinden oder aufzumocken. Halte die Antwort so kurz aber exakt."""
42
 
43
  llm_template = "Beantworte die Frage am Ende. " + template + "Frage: {question} Hilfreiche Antwort: "
44
  rag_template = "Nutze die folgenden Kontext Teile, um die Frage zu beantworten am Ende. " + template + "{context} Frage: {question} Hilfreiche Antwort: "
45
 
 
 
46
  LLM_CHAIN_PROMPT = PromptTemplate(input_variables = ["question"],
47
  template = llm_template)
48
  RAG_CHAIN_PROMPT = PromptTemplate(input_variables = ["context", "question"],
49
  template = rag_template)
50
 
51
  OAI_API_KEY=os.getenv("OPENAI_API_KEY")
52
- #Pfad, wo Docs abgelegt werden können - lokal, also hier im HF Space (sonst auf eigenem Rechner)
53
  PATH_WORK = "."
54
  CHROMA_DIR = "/chroma"
55
  YOUTUBE_DIR = "/youtube"
56
 
 
 
57
  PDF_URL = "https://arxiv.org/pdf/2303.08774.pdf"
58
  WEB_URL = "https://openai.com/research/gpt-4"
59
  YOUTUBE_URL_1 = "https://www.youtube.com/watch?v=--khbXchTeE"
60
  YOUTUBE_URL_2 = "https://www.youtube.com/watch?v=hdhZwyf24mE"
61
  YOUTUBE_URL_3 = "https://www.youtube.com/watch?v=vw-KWfKwvTQ"
62
 
 
 
 
63
  #MODEL_NAME = "gpt-3.5-turbo-16k"
64
  MODEL_NAME ="gpt-4"
65
 
 
 
 
 
66
  def document_loading_splitting():
67
  global splittet
68
  # Document loading
@@ -87,17 +103,20 @@ def document_loading_splitting():
87
  splittet = True
88
  return splits
89
 
 
90
  def document_storage_chroma(splits):
91
  Chroma.from_documents(documents = splits,
92
  embedding = OpenAIEmbeddings(disallowed_special = ()),
93
  persist_directory = PATH_WORK + CHROMA_DIR)
94
 
 
95
  def document_storage_mongodb(splits):
96
  MongoDBAtlasVectorSearch.from_documents(documents = splits,
97
  embedding = OpenAIEmbeddings(disallowed_special = ()),
98
  collection = MONGODB_COLLECTION,
99
  index_name = MONGODB_INDEX_NAME)
100
 
 
101
  def document_retrieval_chroma(llm, prompt):
102
  embeddings = OpenAIEmbeddings()
103
  #Alternative Embedding - für Vektorstore, um Ähnlichkeitsvektoren zu erzeugen
@@ -107,6 +126,7 @@ def document_retrieval_chroma(llm, prompt):
107
 
108
  return db
109
 
 
110
  def document_retrieval_mongodb(llm, prompt):
111
  db = MongoDBAtlasVectorSearch.from_connection_string(MONGODB_URI,
112
  MONGODB_DB_NAME + "." + MONGODB_COLLECTION_NAME,
@@ -114,11 +134,16 @@ def document_retrieval_mongodb(llm, prompt):
114
  index_name = MONGODB_INDEX_NAME)
115
  return db
116
 
 
 
 
 
117
  def llm_chain(llm, prompt):
118
  llm_chain = LLMChain(llm = llm, prompt = LLM_CHAIN_PROMPT)
119
  result = llm_chain.run({"question": prompt})
120
  return result
121
 
 
122
  def rag_chain(llm, prompt, db):
123
  rag_chain = RetrievalQA.from_chain_type(llm,
124
  chain_type_kwargs = {"prompt": RAG_CHAIN_PROMPT},
@@ -127,20 +152,25 @@ def rag_chain(llm, prompt, db):
127
  result = rag_chain({"query": prompt})
128
  return result["result"]
129
 
 
 
130
  def invoke(openai_api_key, rag_option, prompt):
131
  global splittet
132
 
133
  if (openai_api_key == "" or openai_api_key == "sk-"):
134
  #raise gr.Error("OpenAI API Key is required.")
 
135
  openai_api_key= OAI_API_KEY
136
  if (rag_option is None):
137
  raise gr.Error("Retrieval Augmented Generation ist erforderlich.")
138
  if (prompt == ""):
139
  raise gr.Error("Prompt ist erforderlich.")
140
  try:
 
141
  llm = ChatOpenAI(model_name = MODEL_NAME,
142
  openai_api_key = openai_api_key,
143
  temperature = 0)
 
144
  if (rag_option == "Chroma"):
145
  #muss nur einmal ausgeführt werden...
146
  if not splittet:
 
27
  #api_key=os.getenv("OPENAI_API_KEY"),
28
  #)
29
 
30
+ #################################################
31
+ #globale Variablen
32
+ #nur bei ersten Anfrage splitten der Dokumente - um die Vektordatenbank entsprechend zu füllen
33
  splittet = False
34
 
35
+ ##################################################
36
  #Für MongoDB statt Chroma als Vektorstore
37
  #MONGODB_URI = os.environ["MONGODB_ATLAS_CLUSTER_URI"]
38
  #client = MongoClient(MONGODB_URI)
 
41
  #MONGODB_COLLECTION = client[MONGODB_DB_NAME][MONGODB_COLLECTION_NAME]
42
  #MONGODB_INDEX_NAME = "default"
43
 
44
+ #################################################
45
+ #Prompt Zusätze
46
  template = """Antworte in deutsch, wenn es nicht explizit anders gefordert wird. Wenn du die Antwort nicht kennst, antworte einfach, dass du es nicht weißt. Versuche nicht, die Antwort zu erfinden oder aufzumocken. Halte die Antwort so kurz aber exakt."""
47
 
48
  llm_template = "Beantworte die Frage am Ende. " + template + "Frage: {question} Hilfreiche Antwort: "
49
  rag_template = "Nutze die folgenden Kontext Teile, um die Frage zu beantworten am Ende. " + template + "{context} Frage: {question} Hilfreiche Antwort: "
50
 
51
+ #################################################
52
+ #Konstanten
53
  LLM_CHAIN_PROMPT = PromptTemplate(input_variables = ["question"],
54
  template = llm_template)
55
  RAG_CHAIN_PROMPT = PromptTemplate(input_variables = ["context", "question"],
56
  template = rag_template)
57
 
58
  OAI_API_KEY=os.getenv("OPENAI_API_KEY")
59
+ #Pfad, wo Docs/Bilder/Filme abgelegt werden können - lokal, also hier im HF Space (sonst auf eigenem Rechner)
60
  PATH_WORK = "."
61
  CHROMA_DIR = "/chroma"
62
  YOUTUBE_DIR = "/youtube"
63
 
64
+ ###############################################
65
+ #URLs zu Dokumenten oder andere Inhalte, die einbezogen werden sollen
66
  PDF_URL = "https://arxiv.org/pdf/2303.08774.pdf"
67
  WEB_URL = "https://openai.com/research/gpt-4"
68
  YOUTUBE_URL_1 = "https://www.youtube.com/watch?v=--khbXchTeE"
69
  YOUTUBE_URL_2 = "https://www.youtube.com/watch?v=hdhZwyf24mE"
70
  YOUTUBE_URL_3 = "https://www.youtube.com/watch?v=vw-KWfKwvTQ"
71
 
72
+
73
+ ################################################
74
+ #LLM Model mit dem gearbeitet wird
75
  #MODEL_NAME = "gpt-3.5-turbo-16k"
76
  MODEL_NAME ="gpt-4"
77
 
78
+ #################################################
79
+ #Funktionen zur Verarbeitung
80
+ ################################################
81
+ #die Inhalte splitten, um in Vektordatenbank entsprechend zu laden als Splits
82
  def document_loading_splitting():
83
  global splittet
84
  # Document loading
 
103
  splittet = True
104
  return splits
105
 
106
+ #Chroma DB die splits ablegen - vektorisiert...
107
  def document_storage_chroma(splits):
108
  Chroma.from_documents(documents = splits,
109
  embedding = OpenAIEmbeddings(disallowed_special = ()),
110
  persist_directory = PATH_WORK + CHROMA_DIR)
111
 
112
+ #Mongo DB die splits ablegen - vektorisiert...
113
  def document_storage_mongodb(splits):
114
  MongoDBAtlasVectorSearch.from_documents(documents = splits,
115
  embedding = OpenAIEmbeddings(disallowed_special = ()),
116
  collection = MONGODB_COLLECTION,
117
  index_name = MONGODB_INDEX_NAME)
118
 
119
+ #dokumente in chroma db vektorisiert ablegen können - die Db vorbereiten daüfur
120
  def document_retrieval_chroma(llm, prompt):
121
  embeddings = OpenAIEmbeddings()
122
  #Alternative Embedding - für Vektorstore, um Ähnlichkeitsvektoren zu erzeugen
 
126
 
127
  return db
128
 
129
+ #dokumente in mongo db vektorisiert ablegen können - die Db vorbereiten daüfür
130
  def document_retrieval_mongodb(llm, prompt):
131
  db = MongoDBAtlasVectorSearch.from_connection_string(MONGODB_URI,
132
  MONGODB_DB_NAME + "." + MONGODB_COLLECTION_NAME,
 
134
  index_name = MONGODB_INDEX_NAME)
135
  return db
136
 
137
+ ###############################################
138
+ #Langchain anlegen
139
+
140
+ #langchain nutzen, um prompt an LLM zu leiten - llm und prompt sind austauschbar
141
  def llm_chain(llm, prompt):
142
  llm_chain = LLMChain(llm = llm, prompt = LLM_CHAIN_PROMPT)
143
  result = llm_chain.run({"question": prompt})
144
  return result
145
 
146
+ #langchain nutzen, um prompt an llm zu leiten, aber vorher in der VektorDB suchen, um passende splits zum Prompt hinzuzufügen
147
  def rag_chain(llm, prompt, db):
148
  rag_chain = RetrievalQA.from_chain_type(llm,
149
  chain_type_kwargs = {"prompt": RAG_CHAIN_PROMPT},
 
152
  result = rag_chain({"query": prompt})
153
  return result["result"]
154
 
155
+ ###################################################
156
+ #Funktion von Gradio aus, die den dort eingegebenen Prompt annimmt und weiterverarbeitet
157
  def invoke(openai_api_key, rag_option, prompt):
158
  global splittet
159
 
160
  if (openai_api_key == "" or openai_api_key == "sk-"):
161
  #raise gr.Error("OpenAI API Key is required.")
162
+ #eigenen OpenAI key nutzen
163
  openai_api_key= OAI_API_KEY
164
  if (rag_option is None):
165
  raise gr.Error("Retrieval Augmented Generation ist erforderlich.")
166
  if (prompt == ""):
167
  raise gr.Error("Prompt ist erforderlich.")
168
  try:
169
+ #Anfrage an OpenAI
170
  llm = ChatOpenAI(model_name = MODEL_NAME,
171
  openai_api_key = openai_api_key,
172
  temperature = 0)
173
+ #zusätzliche Dokumenten Splits aus DB zum Prompt hinzufügen (aus VektorDB - Chroma oder Mongo DB)
174
  if (rag_option == "Chroma"):
175
  #muss nur einmal ausgeführt werden...
176
  if not splittet: