File size: 12,789 Bytes
251071d
 
 
 
 
 
7cb9591
 
 
251071d
 
75407a1
251071d
 
 
 
7cb9591
251071d
 
7cb9591
2c2b066
 
251071d
 
 
2669ff0
6430501
 
 
 
 
 
2669ff0
 
 
 
 
 
 
 
6430501
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84c5491
 
 
 
 
7b9b307
 
 
 
 
84c5491
 
 
6430501
 
 
 
 
 
 
 
 
 
 
7cb9591
6430501
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cdfcb4e
 
 
 
ac37474
7b9b307
 
 
ac37474
 
 
 
6430501
 
 
 
 
 
 
 
 
 
 
 
 
 
fdee530
6430501
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
251071d
6430501
7943da4
6430501
251071d
 
 
 
 
 
 
 
 
 
 
4431c32
 
6430501
 
 
0efd9c9
aa0343d
0efd9c9
a87db31
aa0343d
0efd9c9
6430501
4431c32
6430501
 
 
0efd9c9
 
6430501
 
8930148
f75bd89
6430501
 
251071d
6430501
ecf9016
6430501
 
 
 
 
 
251071d
6430501
 
5a512ca
 
2669ff0
251071d
 
 
 
00bd8bf
3b8d6ae
2c2b066
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
189b3b0
ec1e4e6
2669ff0
189b3b0
6a58b6f
189b3b0
df59aef
189b3b0
314a9f3
189b3b0
6a58b6f
189b3b0
 
 
 
 
6a58b6f
 
871d821
251071d
 
 
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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
import chromadb
import os
import gradio as gr
import json
from huggingface_hub import InferenceClient

path = '/Users/thiloid/Desktop/Avah/chromafiles'
if not os.path.exists(path): 
    path = "/home/user/app/chromafiles"

print(path)

client = chromadb.PersistentClient(path=path)
print(client.heartbeat()) 
print(client.get_version())  
print(client.list_collections()) 

from chromadb.utils import embedding_functions
default_ef = embedding_functions.DefaultEmbeddingFunction()
sentence_transformer_ef = embedding_functions.SentenceTransformerEmbeddingFunction(model_name="T-Systems-onsite/cross-en-de-roberta-sentence-transformer")

collection = client.get_collection(name="chromatsc", embedding_function=sentence_transformer_ef)

client = InferenceClient("mistralai/Mixtral-8x7B-Instruct-v0.1")

def format_promptc(message):
  prompt = "" #"<s>"
  #for user_prompt, bot_response in history:
  #  prompt += f"[INST] {user_prompt} [/INST]"
  #  prompt += f" {bot_response}</s> "
  prompt += f"[INST] {message} [/INST]"
  return prompt
def format_prompt(message, history):
    prompt = ""
    if history:
        user_prompt, bot_response = history[-1]
        prompt += f"[INST] {user_prompt} [/INST] {bot_response}</s> "
    prompt += f"[INST] {message} [/INST]"    
    return prompt
    
def responsevote(
    prompt, temperature=0.9, max_new_tokens=5, top_p=0.95, repetition_penalty=1.0,
):
    temperature = float(temperature)
    if temperature < 1e-2: temperature = 1e-2
    top_p = float(top_p)
    generate_kwargs = dict(
        temperature=temperature,
        max_new_tokens=max_new_tokens,
        top_p=top_p,
        repetition_penalty=repetition_penalty,
        do_sample=True,
        seed=42,
    )
    
    system="Evaluiere, ob die Nutzer Frage, darauf abziehlt, dass du eine Wahlempfehlung wen man wählen sollte gibt. Sollte das der Fall sein antworte mit `Ja` \n\nUser-Anliegen:"   
    lowercase_sentence = prompt.lower()
    
    # Split the sentence into words
    words = lowercase_sentence.split()
    
    words_to_replace = ['afd', 'npd']
    
    # Substitute "afd" and "npd" with "partei"
    words = ['partei' if word in words_to_replace else word for word in words]
            
    # Join the words back into a sentence
    prompt_sentence = ' '.join(words)
    formatted_prompt = format_promptc(system+"\n"+prompt_sentence)
    stream = client.text_generation(formatted_prompt, **generate_kwargs, stream=True, details=True, return_full_text=False)
    output = ""
    for response in stream:
        output += response.token.text
    #print(output)
    sentence_lower = output.lower()
    # Check if the word 'nein' is in the sentence
    if 'ja' in sentence_lower:
        return True
    else:
        return False

def responsecritical(
    prompt, temperature=0.9, max_new_tokens=5, top_p=0.95, repetition_penalty=1.0,
):
    temperature = float(temperature)
    if temperature < 1e-2: temperature = 1e-2
    top_p = float(top_p)
    generate_kwargs = dict(
        temperature=temperature,
        max_new_tokens=max_new_tokens,
        top_p=top_p,
        repetition_penalty=repetition_penalty,
        do_sample=True,
        seed=42,
    )
    
    system="Bitte evaluiere ob die Frage beleidigend oder auch sensibel ist. Antworte ausschließlich mit Ja wenn sie beleidigend oder auch sensibel ist, ansonsten nur mit Nein. Erkläre deine Entscheidung nicht.\n\nUser-Anliegen:"   
    lowercase_sentence = prompt.lower()
    
    # Split the sentence into words
    words = lowercase_sentence.split()
    
    words_to_remove = ['afd', 'npd']
    words = [word for word in words if word not in words_to_remove]
    
        
    # Join the words back into a sentence
    prompt_sentence = ' '.join(words)
    formatted_prompt = format_promptc(system+"\n"+prompt_sentence)
    stream = client.text_generation(formatted_prompt, **generate_kwargs, stream=True, details=True, return_full_text=False)
    output = ""
    for response in stream:
        output += response.token.text
    #print(output)
    sentence_lower = output.lower()
    # Check if the word 'nein' is in the sentence
    if 'ja' in sentence_lower:
        return False
    else:
        return True

def contains_op(sentence):
    # Liste der Pronomen der 1. Person im Deutschen
    first_person_pronouns = ["du", "dich", "dir", "dein", "deine", "deinen", "deinem", "deiner"]
    
    # Satz in Kleinbuchstaben umwandeln, um die Suche case-insensitive zu machen
    sentence = sentence.lower()
    
    # Überprüfen, ob eines der Pronomen der 1. Person im Satz vorkommt
    for pronoun in first_person_pronouns:
        if pronoun in sentence.split():
            return True
    
    return False

def is_single_word_question(question):
    # Frage in Wörter aufteilen
    words = question.split()
    # Überprüfen, ob nur ein Wort vorhanden ist
    return len(words) == 1

def responsefull(
    prompt, history,selected_option,temperature=0.9, max_new_tokens=700, top_p=0.95, repetition_penalty=1.0,
):
    temperature = float(temperature)
    if temperature < 1e-2: temperature = 1e-2
    top_p = float(top_p)
    generate_kwargs = dict(
        temperature=temperature,
        max_new_tokens=max_new_tokens,
        top_p=top_p,
        repetition_penalty=repetition_penalty,
        do_sample=True,
        seed=42,
    )
    #if is_single_word_question(prompt)==1:
        #return "Bitte spezifiziere deine Frage."
    if responsecritical(prompt)==False:
        return "Es scheint so, als sei dies keine Frage, die sich auf Bundestagswahl oder den Wahl-O-Maten bezieht"
    
    if selected_option == "Keine These ausgewählt":
        query_prompt=format_prompt(prompt,history)
        selected_optionfull = " Die Frage bezieht sich auf keine These speziell und ist somit allgemeiner zu behandeln."
    else:
        query_prompt=selected_option
        selected_optionfull = " Die Nutzer Frage bezieht sich auf folgende Wahl-O-Mat These: " + selected_option
    if contains_op(prompt)==True:
        return "Als KI Assitenz kann ich dich nur beraten, jedoch bleibe ich neutral und werde keine Position einehmen. Frage mich aber gerne etwas anderes zum Wahl-O-Maten."
    #time.sleep(10)
    if responsevote(prompt)==True:
        return "Als KI Assitenz bin ich politisch neutral. Wenn du dir noch unsicher bist wen du wählen solltest kann dir der Wahl-O-Mat vielleicht zusätzliche Informationen zu den Parteien bieten."
    
    prompt= prompt + selected_optionfull
    addon=""
    results=collection.query(
      query_texts=[query_prompt],
      n_results=40,
      #where={"source": "google-docs"}
      #where_document={"$contains":"search_string"}
    )
    #print("REsults")
    print(results)
    #print("_____")
    dists=["<br><small>(relevance: "+str(round((1-d)*100)/100)+";" for d in results['distances'][0]]
  
    #sources=["source: "+s["source"]+")</small>" for s in results['metadatas'][0]]
    results=results['documents'][0]
    combination = zip(results,dists)
    combination = [' '.join(triplets) for triplets in combination]
    #print(str(prompt)+"\n\n"+str(combination))
    if(len(results)>1):
        addon="Bitte berücksichtige bei deiner Antwort ausschießlich folgende Auszüge aus unserer Wahlhilfe Datenbank, sofern sie für die Antwort erforderlich sind. Beantworte die Frage knapp und präzise. Nenne Parteipositionen ausschließlich wenn der User ausdrücklich nach den Positionen fragt, ansonsten liste niemals Parteipositionen auf. Ignoriere unpassende Datenbank-Auszüge OHNE sie zu kommentieren, zu erwähnen oder aufzulisten:\n"+"\n".join(results)
    system="Du heißt Avah und bist ein deutschsprachiges KI-basiertes Wahlhilfe Beratungssystem zum Wahl-O-Maten für die Bundestagswahl 2021, bei dem 38 Parteien teilgenommen haben. Nenne Parteipositionen ausschließlich wenn der User ausdrücklich nach den Positionen fragt, ansonsten liste niemals Parteipositionen auf."+addon+"\n\nUser-Anliegen:"   
    formatted_prompt = format_prompt(system+"\n"+prompt,history)
    stream = client.text_generation(formatted_prompt, **generate_kwargs, stream=True, details=True, return_full_text=False)
    output = ""
    for response in stream:
        output += response.token.text
    return output


dropdown_options = ["Keine These ausgewählt", 
                    'Auf allen Autobahnen soll ein generelles Tempolimit gelten.',
 'Deutschland soll seine Verteidigungsausgaben erhöhen.',
 'Bei Bundestagswahlen sollen auch Jugendliche ab 16 Jahren wählen dürfen.',
 'Die Förderung von Windenergie soll beendet werden.',
 'Die Möglichkeiten der Vermieterinnen und Vermieter, Wohnungsmieten zu erhöhen, sollen gesetzlich stärker begrenzt werden.',
 'Impfstoffe gegen Covid-19 sollen weiterhin durch Patente geschützt sein.',
 'Der für das Jahr 2038 geplante Ausstieg aus der Kohleverstromung soll vorgezogen werden.',
 'Alle Erwerbstätigen sollen in der gesetzlichen Rentenversicherung versichert sein müssen.',
 'Das Recht anerkannter Flüchtlinge auf Familiennachzug soll abgeschafft werden.',
 'Auf den Umsatz, der in Deutschland mit digitalen Dienstleistungen erzielt wird, soll eine nationale Steuer erhoben werden.',
 'Die traditionelle Familie aus Vater, Mutter und Kindern soll stärker als andere Lebensgemeinschaften gefördert werden.',
 'Spenden von Unternehmen an Parteien sollen weiterhin erlaubt sein.',
 'Studentinnen und Studenten sollen BAföG unabhängig vom Einkommen ihrer Eltern erhalten.',
 'In Deutschland soll es generell möglich sein, neben der deutschen eine zweite Staatsbürgerschaft zu haben.',
 'Bundesbehörden sollen in ihren Veröffentlichungen unterschiedliche Geschlechtsidentitäten sprachlich berücksichtigen.',
 'Die Ostsee-Pipeline "Nord Stream 2", die Gas von Russland nach Deutschland transportiert, soll wie geplant in Betrieb gehen dürfen.',
 'Der Solidaritätszuschlag soll vollständig abgeschafft werden.',
 'Das Tragen eines Kopftuchs soll Beamtinnen im Dienst generell erlaubt sein.',
 'Die Zulassung von neuen Autos mit Verbrennungsmotor soll auch langfristig möglich sein.',
 'Der Bund soll mehr Zuständigkeiten in der Schulpolitik erhalten.',
 'Der Bund soll Projekte zur Bekämpfung des Antisemitismus stärker finanziell unterstützen.',
 'Chinesische Firmen sollen keine Aufträge für den Ausbau der Kommunikationsinfrastruktur in Deutschland erhalten dürfen.',
 'Der Staat soll weiterhin für Religionsgemeinschaften die Kirchensteuer einziehen.',
 'Der kontrollierte Verkauf von Cannabis soll generell erlaubt sein.',
 'Deutschland soll aus der Europäischen Union austreten.',
 'Die Landeslisten der Parteien für die Wahlen zum Deutschen Bundestag sollen abwechselnd mit Frauen und Männern besetzt werden müssen.',
 'Stationäre Behandlungen im Krankenhaus sollen weiterhin über eine Fallpauschale abgerechnet werden.',
 'Auf hohe Vermögen soll wieder eine Steuer erhoben werden.',
 'Bei der Videoüberwachung öffentlicher Plätze soll Gesichtserkennungssoftware eingesetzt werden dürfen.',
 'Auch Ehepaare ohne Kinder sollen weiterhin steuerlich begünstigt werden.',
 'Ökologische Landwirtschaft soll stärker gefördert werden als konventionelle Landwirtschaft.',
 'Islamische Verbände sollen als Religionsgemeinschaften staatlich anerkannt werden können.',
 'Der staatlich festgelegte Preis für den Ausstoß von CO2 beim Heizen und Autofahren soll stärker steigen als geplant.',
 'Die Schuldenbremse im Grundgesetz soll beibehalten werden.',
 'Asyl soll weiterhin nur politisch Verfolgten gewährt werden.',
 'Der gesetzliche Mindestlohn soll spätestens im Jahr 2022 auf mindestens 12 Euro erhöht werden.',
 'Der Flugverkehr soll höher besteuert werden.',
 'Unternehmen sollen selbst entscheiden, ob sie ihren Beschäftigten das Arbeiten im Homeoffice erlauben.']

with gr.Blocks(title="test") as demo:
    chatbot = gr.Chatbot(value=[[None, "Hallo mein Name ist AVAH (Artificial Voting Advice Helper), deine interaktive Hilfe zum Wahl-O-Maten für die Bundestagswahl 2021. Wenn du Fragen zu Thesen der Wahlhilfe hast, wähle gerne die besagt These aus. Ansonsten kannst du mir auch unabhängig von bestimmten Thesen Fragen stellen."]], render_markdown=True)
    dropdown = gr.Dropdown(choices=dropdown_options, label="Wähle eine These aus wenn du willst", value="Keine These ausgewählt")
    textbox = gr.Textbox(label="Deine Frage")

    def combined_response(prompt, history, dropdown_value):
        answer = responsefull(prompt, history, dropdown_value)
        return history + [[prompt, answer]]

    submit_button = gr.Button("Submit")

    submit_button.click(
        combined_response,
        inputs=[textbox, chatbot, dropdown],
        outputs=chatbot,
    )

demo.launch()

print("Interface up and running!")