nestole commited on
Commit
a6019c9
1 Parent(s): e5e565a

Update run.py

Browse files
Files changed (1) hide show
  1. run.py +149 -38
run.py CHANGED
@@ -4,13 +4,10 @@ import gradio as gr
4
  import json
5
  from huggingface_hub import InferenceClient
6
 
7
- path='/Users/thiloid/Desktop/LSKI/ole_nest/Chatbot/LLM/chromaTS'
8
- if(os.path.exists(path)==False): path="/home/user/app/chromaTS"
9
 
10
  print(path)
11
- #path='chromaTS'
12
- #settings = Settings(persist_directory=storage_path)
13
- #client = chromadb.Client(settings=settings)
14
  client = chromadb.PersistentClient(path=path)
15
  print(client.heartbeat())
16
  print(client.get_version())
@@ -18,14 +15,99 @@ print(client.list_collections())
18
  from chromadb.utils import embedding_functions
19
  default_ef = embedding_functions.DefaultEmbeddingFunction()
20
  sentence_transformer_ef = embedding_functions.SentenceTransformerEmbeddingFunction(model_name="T-Systems-onsite/cross-en-de-roberta-sentence-transformer")#"VAGOsolutions/SauerkrautLM-Mixtral-8x7B-Instruct")
21
- #instructor_ef = embedding_functions.InstructorEmbeddingFunction(model_name="hkunlp/instructor-large", device="cuda")
22
- #print(str(client.list_collections()))
23
- collection = client.get_collection(name="chromaTS", embedding_function=sentence_transformer_ef)
24
 
25
  client = InferenceClient("mistralai/Mixtral-8x7B-Instruct-v0.1")
26
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
 
28
- def format_prompt(message, history):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
  prompt = "" #"<s>"
30
  #for user_prompt, bot_response in history:
31
  # prompt += f"[INST] {user_prompt} [/INST]"
@@ -33,8 +115,8 @@ def format_prompt(message, history):
33
  prompt += f"[INST] {message} [/INST]"
34
  return prompt
35
 
36
- def response(
37
- prompt, history,temperature=0.9, max_new_tokens=500, top_p=0.95, repetition_penalty=1.0,
38
  ):
39
  temperature = float(temperature)
40
  if temperature < 1e-2: temperature = 1e-2
@@ -47,38 +129,67 @@ def response(
47
  do_sample=True,
48
  seed=42,
49
  )
50
- addon=""
51
- results=collection.query(
52
- query_texts=[prompt],
53
- n_results=60,
54
- #where={"source": "google-docs"}
55
- #where_document={"$contains":"search_string"}
56
- )
57
- #print("REsults")
58
- #print(results)
59
- #print("_____")
60
- dists=["<br><small>(relevance: "+str(round((1-d)*100)/100)+";" for d in results['distances'][0]]
61
-
62
- #sources=["source: "+s["source"]+")</small>" for s in results['metadatas'][0]]
63
- results=results['documents'][0]
64
- print("TEst")
65
- print(results)
66
- print("_____")
67
- combination = zip(results,dists)
68
- combination = [' '.join(triplets) for triplets in combination]
69
- #print(str(prompt)+"\n\n"+str(combination))
70
- if(len(results)>1):
71
- addon=" Bitte berücksichtige bei deiner Antwort ausschießlich folgende Auszüge aus unserer Datenbank, sofern sie für die Antwort erforderlich sind. Beantworte die Frage knapp und präzise. Ignoriere unpassende Datenbank-Auszüge OHNE sie zu kommentieren, zu erwähnen oder aufzulisten:\n"+"\n".join(results)
72
- system="Du bist ein deutschsprachiges KI-basiertes Studienberater Assistenzsystem, das zu jedem Anliegen möglichst geeignete Studieninformationen empfiehlt."+addon+"\n\nUser-Anliegen:"
73
- formatted_prompt = format_prompt(system+"\n"+prompt,history)
74
  stream = client.text_generation(formatted_prompt, **generate_kwargs, stream=True, details=True, return_full_text=False)
75
  output = ""
76
  for response in stream:
77
  output += response.token.text
78
- yield output
79
- #output=output+"\n\n<br><details open><summary><strong>Sources</strong></summary><br><ul>"+ "".join(["<li>" + s + "</li>" for s in combination])+"</ul></details>"
80
- yield output
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
81
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82
  gr.ChatInterface(response, chatbot=gr.Chatbot(value=[[None,"Herzlich willkommen! Ich bin Chätti ein KI-basiertes Studienassistenzsystem, das für jede Anfrage die am besten Studieninformationen empfiehlt.<br>Erzähle mir, was du gerne tust!"]],render_markdown=True),title="German Studyhelper Chätti").queue().launch(share=True) #False, server_name="0.0.0.0", server_port=7864)
83
  print("Interface up and running!")
84
 
 
4
  import json
5
  from huggingface_hub import InferenceClient
6
 
7
+ path='/Users/thiloid/Desktop/LSKI/ole_nest/Chatbot/LLM/chroma'
8
+ if(os.path.exists(path)==False): path="/home/user/app/chroma"
9
 
10
  print(path)
 
 
 
11
  client = chromadb.PersistentClient(path=path)
12
  print(client.heartbeat())
13
  print(client.get_version())
 
15
  from chromadb.utils import embedding_functions
16
  default_ef = embedding_functions.DefaultEmbeddingFunction()
17
  sentence_transformer_ef = embedding_functions.SentenceTransformerEmbeddingFunction(model_name="T-Systems-onsite/cross-en-de-roberta-sentence-transformer")#"VAGOsolutions/SauerkrautLM-Mixtral-8x7B-Instruct")
18
+
19
+ collection = client.get_collection(name="chromatsc", embedding_function=sentence_transformer_ef)
 
20
 
21
  client = InferenceClient("mistralai/Mixtral-8x7B-Instruct-v0.1")
22
 
23
+ from huggingface_hub import InferenceClient
24
+ from nltk.tokenize import word_tokenize
25
+ import pandas as pd
26
+ import string
27
+ import re
28
+ osa= pd.read_excel("/home/user/app/OSA.xlsx", nrows=136)
29
+ osa.loc[osa["Hochschule"] == "Übergreifend", "Hochschule"] = " "
30
+ osa.loc[osa["OSA: Fach (original)"] == "Allgemein", "OSA: Fach (original)"] = " "
31
+
32
+ # text that will be added to chatbot answer
33
+ osa.loc[osa["Link_Studium_Allgemein"].notna(), "Link_Studium_Allgemein"] = "Basierend auf deiner Frage empfehele ich dir diesen Interessenstest: "+ osa["Link_Studium_Allgemein"]
34
+ osa.loc[osa["Link_Uni_Allgemein"].notna(), "Link_Uni_Allgemein"] = "Basierend auf deinem Interessa an der "+osa["Hochschule"]+" empfehele ich dir diesen Interessenstest: "+ osa["Link_Uni_Allgemein"]
35
+ osa.loc[osa["Link_Fach"].notna(), "Link_Fach"] = "Basierend auf deinem Interessa an der " +osa["Hochschule"]+ " "+osa["OSA: Fach (original)"]+" zu studieren, empfehele ich dir diesen Interessenstest: "+ osa["Link_Fach"]
36
+
37
+ osa["chattext"]= osa["Link_Studium_Allgemein"].fillna('')+ osa["Link_Uni_Allgemein"].fillna('')+osa["Link_Fach"].fillna('')
38
+
39
+ # Text to compare with user prompt
40
+ osa["combi"]= osa["Hochschule"]+ " "+ osa["OSA: Fach (original)"]
41
+ osalist= osa["combi"].tolist()
42
+ osalist
43
+
44
+ def simosa(prompt, osalist, osa):
45
+ lcos = []
46
+ prompt = prompt.lower()
47
+ p_list = word_tokenize(prompt)
48
+
49
+ # Form a set containing keywords of the prompt
50
+ sw = [",", "?"]
51
+ p_set = {w for w in p_list if not w in sw}
52
+
53
+ for val in osalist:
54
+ val = val.lower()
55
+ v_list = word_tokenize(val)
56
+
57
+ # Form a set containing keywords of the current value
58
+ v_set = {w for w in v_list if not w in sw}
59
+
60
+ # Union of both sets
61
+ rvector = p_set.union(v_set)
62
+
63
+ # Create vectors
64
+ l1 = [1 if w in p_set else 0 for w in rvector]
65
+ l2 = [1 if w in v_set else 0 for w in rvector]
66
+
67
+ # Compute cosine similarity
68
+ dot_product = sum(l1[i] * l2[i] for i in range(len(rvector)))
69
+ magnitude1 = sum(l1)
70
+ magnitude2 = sum(l2)
71
+
72
+ if magnitude1 == 0 or magnitude2 == 0:
73
+ cosine = 0.0
74
+ else:
75
+ cosine = dot_product / float((magnitude1 * magnitude2) ** 0.5)
76
+
77
+ lcos.append(cosine)
78
+ osa["testsim"]=lcos
79
+ match=osa.loc[osa['testsim'].idxmax()]["testsim"]
80
+ #print(match)
81
+ if match >0.29:
82
+ answer = str(osa.loc[osa['testsim'].idxmax()]["chattext"])
83
+ else:
84
+ answer= "Wenn du dir unsicher bist, was du studieren könntest oder ob deine Fähigkeiten ausreichen, dann mach doch diesen Test (https://www.was-studiere-ich.de/) oder schau dir mal diese Seminare an (https://www.bw-best.de)."
85
+
86
+ return answer
87
 
88
+ def parse_for_nc(text):
89
+
90
+ '''
91
+ Parses text for words relating to NC and Abiturnote
92
+ :param text: a string
93
+ :return: an automatic response in form of a string
94
+ '''
95
+ nc_words = [" nc ", "abischnitt", "abiturschnitt", "abinote", "abiturnote", "ncschnitt", "abschlussnote", "abschlussdurchschnitt", "abschlussnote", "zulassungsbeschränkung", "numerus clausus", "noten"]
96
+ response = "Wenn du dir unsicher bist, ob du die Zulassungsvoraussetzungen zu einem Studiengang erfüllst, schau am besten einmal auf der Website der Universität nach, was gefordert ist.\n Häufig entscheidet nicht allein die Abiturnote die Zulassung, sondern auch Faktoren wie praktische Erfahrung oder ein FSJ.\n Lass dich außerdem nicht von den NCs vergangener Jahre verunsichern.\n Der NC gibt nur an, was im vergangenen Jahr die schlechteste Note des regulären Prozesses war, mit der man noch zugelassen wurde.\n Der NC kann sich also von Jahr zu Jahr verändern und oft werden auch Leute zugelassen, die einen schlechteren Schnitt ab (bspw. durch Wartesemester).\n Wenn du dir hingegen unsicher bist, ob deine Fähigkeiten mit denen des Fachs übereinstimmen,\n dann mach doch vielleicht mal einen Test. Außerdem gibt es Aufbau- und Vorbereitungskurse mittels derer du Wissen und Fähigkeiten aufbauen kannst."
97
+
98
+ # if the string is not empty
99
+ if text:
100
+ text = text.strip() # strip
101
+ text = text.lower() # lower all letters
102
+ text = text.translate(str.maketrans('', '', string.punctuation)) # remove punctuation
103
+ text = " "+text+" " # add whitespaces so that nc can be found correctly
104
+ for nc_word in nc_words:
105
+ if nc_word in text:
106
+ return response
107
+ return "No"
108
+
109
+
110
+ def format_prompt(message):
111
  prompt = "" #"<s>"
112
  #for user_prompt, bot_response in history:
113
  # prompt += f"[INST] {user_prompt} [/INST]"
 
115
  prompt += f"[INST] {message} [/INST]"
116
  return prompt
117
 
118
+ def responsecritical(
119
+ prompt, temperature=0.9, max_new_tokens=500, top_p=0.95, repetition_penalty=1.0,
120
  ):
121
  temperature = float(temperature)
122
  if temperature < 1e-2: temperature = 1e-2
 
129
  do_sample=True,
130
  seed=42,
131
  )
132
+
133
+ system="Bitte evaluiere ob die Frage soziokulturell oder allgemein problematisch oder auch sensibel oder politisch ist. Antworte ausschließlich mit Ja wenn sie soziokulturell oder allgemein problematisch ist, ansonsten nur mit Nein. Erkläre deine Entscheidung nicht.\n\nUser-Anliegen:"
134
+ formatted_prompt = format_prompt(system+"\n"+prompt)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
135
  stream = client.text_generation(formatted_prompt, **generate_kwargs, stream=True, details=True, return_full_text=False)
136
  output = ""
137
  for response in stream:
138
  output += response.token.text
139
+ sentence_lower = output.lower()
140
+
141
+ # Check if the word 'nein' is in the sentence
142
+ if 'nein' in sentence_lower:
143
+ return True
144
+ else:
145
+ return False
146
+
147
+ def response(
148
+ prompt, temperature=0.9, max_new_tokens=500, top_p=0.95, repetition_penalty=1.0,
149
+ ):
150
+ temperature = float(temperature)
151
+ if temperature < 1e-2: temperature = 1e-2
152
+ top_p = float(top_p)
153
+ generate_kwargs = dict(
154
+ temperature=temperature,
155
+ max_new_tokens=max_new_tokens,
156
+ top_p=top_p,
157
+ repetition_penalty=repetition_penalty,
158
+ do_sample=True,
159
+ seed=42,
160
+ )
161
+
162
+
163
+ if responsecritical(prompt)==False:
164
+ return "Es scheint so, als sei dies keine Frage, die sich auf die Studienorientierung bezieht"
165
+ else:
166
+ answernc=parse_for_nc(prompt)
167
+ if answernc!="No":
168
+ return answernc
169
+ else:
170
+ prompt = re.sub(r'\buni\b', 'Universität', prompt, flags=re.IGNORECASE)
171
+ addon=""
172
+ results=collection.query(
173
+ query_texts=[prompt],
174
+ n_results=60
175
+ )
176
 
177
+ dists=["<br><small>(relevance: "+str(round((1-d)*100)/100)+";" for d in results['distances'][0]]
178
+ results=results['documents'][0]
179
+ combination = zip(results,dists)
180
+ combination = [' '.join(triplets) for triplets in combination]
181
+ if(len(results)>1):
182
+ addon=" Bitte berücksichtige bei deiner Antwort ausschießlich folgende Auszüge aus unserer Datenbank, sofern sie für die Antwort erforderlich sind. Beantworte die Frage knapp und präzise. Ignoriere unpassende Datenbank-Auszüge OHNE sie zu kommentieren, zu erwähnen oder aufzulisten:\n"+"\n".join(results)
183
+ system="Du bist ein deutschsprachiges KI-basiertes Studienberater Assistenzsystem, das zu jedem Anliegen möglichst geeignete Studieninformationen empfiehlt."+addon+"\n\nUser-Anliegen:"
184
+ formatted_prompt = format_prompt(system+"\n"+prompt)
185
+ stream = client.text_generation(formatted_prompt, **generate_kwargs, stream=True, details=True, return_full_text=False)
186
+ output = ""
187
+ for response in stream:
188
+ output += response.token.text
189
+ osaanswer=simosa(prompt, osalist, osa)
190
+ output=output[:-4]+"\n"+osaanswer
191
+ yield output
192
+
193
  gr.ChatInterface(response, chatbot=gr.Chatbot(value=[[None,"Herzlich willkommen! Ich bin Chätti ein KI-basiertes Studienassistenzsystem, das für jede Anfrage die am besten Studieninformationen empfiehlt.<br>Erzähle mir, was du gerne tust!"]],render_markdown=True),title="German Studyhelper Chätti").queue().launch(share=True) #False, server_name="0.0.0.0", server_port=7864)
194
  print("Interface up and running!")
195