k96beni commited on
Commit
e01c772
·
verified ·
1 Parent(s): cd338e6

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +52 -29
app.py CHANGED
@@ -1,33 +1,41 @@
1
- #kicker
2
-
3
  import os
4
  import pandas as pd
5
  import torch
6
  import gradio as gr
7
-
8
  from huggingface_hub import login, Repository
9
  from sentence_transformers import SentenceTransformer, util
10
 
11
- # ================================
 
 
 
 
 
 
 
12
  # KONFIG & INIT
13
- # ================================
14
  HF_TOKEN = os.getenv("HUGGINGFACE_TOKEN")
15
  if not HF_TOKEN:
16
  raise ValueError("HUGGINGFACE_TOKEN miljövariabel saknas!")
17
 
 
18
  login(token=HF_TOKEN)
19
 
20
- REPO_ID = "ChargeNodeEurope/Chatbot_4o_mini" # Exempel
 
21
  REPO_LOCAL_PATH = "chatbot_faq_repo"
22
- FAQ_XLSX_PATH = "FAQ stadat.xlsx"
23
 
 
24
  repo = Repository(
25
  local_dir=REPO_LOCAL_PATH,
26
  clone_from=REPO_ID,
27
- repo_type="space", # Viktigt om det är en Space
28
  use_auth_token=HF_TOKEN
29
  )
30
 
 
31
  faq_path = os.path.join(REPO_LOCAL_PATH, FAQ_XLSX_PATH)
32
  try:
33
  df = pd.read_excel(faq_path)
@@ -35,38 +43,39 @@ try:
35
  except Exception as e:
36
  raise FileNotFoundError(f"Kunde inte ladda FAQ-filen: {str(e)}")
37
 
38
- # Ladda Sentence Transformer
39
  model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
40
 
41
- # Skapa embeddings av alla FAQ-frågor en gång
42
  faq_questions = df["Fråga"].tolist()
43
  faq_embeddings = model.encode(faq_questions, convert_to_tensor=True)
44
 
45
 
46
- # ================================
47
- # HJÄLPFUNKTIONER
48
- # ================================
49
  def uppdatera_embeddings():
50
  """
51
- Uppdatera embeddings efter att FAQ-DataFrame har ändrats.
52
  """
53
  global faq_questions, faq_embeddings, df
54
  faq_questions = df["Fråga"].tolist()
55
  faq_embeddings = model.encode(faq_questions, convert_to_tensor=True)
56
 
 
57
  def sök_faq(fråga):
58
  """
59
- Gör en enkel semantisk sökning i FAQ och returnerar topp 3 resultat.
60
  """
61
  fråga = fråga.strip()
62
  if not fråga:
63
  return pd.DataFrame(columns=["Liknande fråga", "Svar", "Kategori", "Confidence"])
64
 
65
- # Skapa embedding för query
66
  query_emb = model.encode(fråga, convert_to_tensor=True)
67
  cos_scores = util.cos_sim(query_emb, faq_embeddings)[0]
68
 
69
- # Hämta topp 3
70
  top_results = torch.topk(cos_scores, k=3)
71
  indices = top_results.indices.tolist()
72
  scores = top_results.values.tolist()
@@ -82,9 +91,10 @@ def sök_faq(fråga):
82
  })
83
  return pd.DataFrame(data)
84
 
 
85
  def lägg_till_faq(fråga, svar, kategori):
86
  """
87
- Lägger till en ny fråga i df, sparar och pushar, uppdaterar embeddings.
88
  """
89
  global df
90
  fråga = fråga.strip()
@@ -95,14 +105,15 @@ def lägg_till_faq(fråga, svar, kategori):
95
  return "Fråga, svar och kategori får inte vara tomma!"
96
 
97
  try:
98
- # Lägg till i DataFrame
99
  ny_rad = pd.DataFrame([[fråga, svar, kategori]], columns=["Fråga", "Svar", "Kategori"])
100
  df = pd.concat([df, ny_rad], ignore_index=True)
101
 
102
- # Spara och pusha
103
  df.to_excel(faq_path, index=False)
104
- uppdatera_embeddings() # Skapa nya embeddings
105
 
 
106
  repo.git_add()
107
  repo.git_commit(f"Lade till FAQ: {fråga[:50]}...")
108
  repo.git_push()
@@ -111,10 +122,18 @@ def lägg_till_faq(fråga, svar, kategori):
111
  except Exception as e:
112
  return f"Fel vid uppdatering: {str(e)}"
113
 
 
114
  def visa_senaste_faq(antal=10):
 
 
 
115
  return df.tail(antal)
116
 
 
117
  def uppdatera_faq(gammal_fråga, nytt_svar, ny_kategori):
 
 
 
118
  global df
119
  gammal_fråga = gammal_fråga.strip()
120
  nytt_svar = nytt_svar.strip()
@@ -143,7 +162,11 @@ def uppdatera_faq(gammal_fråga, nytt_svar, ny_kategori):
143
  except Exception as e:
144
  return f"Fel vid uppdatering: {str(e)}"
145
 
 
146
  def ta_bort_faq(fråga_att_radera):
 
 
 
147
  global df
148
  fråga_att_radera = fråga_att_radera.strip()
149
  if not fråga_att_radera:
@@ -167,14 +190,14 @@ def ta_bort_faq(fråga_att_radera):
167
  return f"Fel vid borttagning: {str(e)}"
168
 
169
 
170
- # ================================
171
  # GRADIO-GRÄNSSNITT
172
- # ================================
173
  with gr.Blocks() as demo:
174
  gr.Markdown("# Enkel FAQ Admin")
175
- gr.Markdown("Administrera FAQ-poster, sök i befintliga frågor, lägg till, uppdatera eller ta bort.")
176
 
177
- # ---- Sök i FAQ ----
178
  gr.Markdown("## Sök i FAQ")
179
  inp_question = gr.Textbox(label="Din fråga", placeholder="Ex: Hur startar jag en laddning?")
180
  btn_search = gr.Button("Sök")
@@ -182,7 +205,7 @@ with gr.Blocks() as demo:
182
 
183
  btn_search.click(fn=sök_faq, inputs=inp_question, outputs=out_search)
184
 
185
- # ---- Lägg till FAQ ----
186
  gr.Markdown("## Lägg till FAQ")
187
  add_question = gr.Textbox(label="Ny fråga")
188
  add_answer = gr.Textbox(label="Nytt svar")
@@ -191,7 +214,7 @@ with gr.Blocks() as demo:
191
  out_add = gr.Textbox(label="Status")
192
  btn_add.click(fn=lägg_till_faq, inputs=[add_question, add_answer, add_cat], outputs=out_add)
193
 
194
- # ---- Redigera / Ta bort ----
195
  gr.Markdown("## Redigera / Ta bort FAQ")
196
  existing_quests = gr.Dropdown(choices=df["Fråga"].tolist(), label="Befintliga frågor")
197
  new_answer = gr.Textbox(label="Nytt svar (valfritt)")
@@ -205,11 +228,11 @@ with gr.Blocks() as demo:
205
  btn_update.click(fn=uppdatera_faq, inputs=[existing_quests, new_answer, new_cat], outputs=out_update)
206
  btn_delete.click(fn=ta_bort_faq, inputs=existing_quests, outputs=out_delete)
207
 
208
- # ---- Visa senaste ----
209
  gr.Markdown("## Visa senaste FAQ-poster")
210
  btn_show = gr.Button("Visa senaste 10")
211
  out_log = gr.Dataframe(label="Senaste poster")
212
  btn_show.click(fn=visa_senaste_faq, inputs=[], outputs=out_log)
213
 
214
  if __name__ == "__main__":
215
- demo.launch()
 
 
 
1
  import os
2
  import pandas as pd
3
  import torch
4
  import gradio as gr
 
5
  from huggingface_hub import login, Repository
6
  from sentence_transformers import SentenceTransformer, util
7
 
8
+ # -------------------------------
9
+ # SÄTT GLOBAL GIT-IDENTITET
10
+ # -------------------------------
11
+ # Dessa kommandon ställer in din Git-identitet globalt.
12
+ os.system('git config --global user.email "niklas.berg@chargenode.eu"')
13
+ os.system('git config --global user.name "Niklas Berg"')
14
+
15
+ # -------------------------------
16
  # KONFIG & INIT
17
+ # -------------------------------
18
  HF_TOKEN = os.getenv("HUGGINGFACE_TOKEN")
19
  if not HF_TOKEN:
20
  raise ValueError("HUGGINGFACE_TOKEN miljövariabel saknas!")
21
 
22
+ # Logga in mot Hugging Face
23
  login(token=HF_TOKEN)
24
 
25
+ # Repo-detaljer (ändra REPO_ID om det behövs)
26
+ REPO_ID = "ChargeNodeEurope/Chatbot_4o_mini"
27
  REPO_LOCAL_PATH = "chatbot_faq_repo"
28
+ FAQ_XLSX_PATH = "FAQ stadat.xlsx" # Excel-filen som innehåller FAQ-informationen
29
 
30
+ # Klona repo:t (repo_type="space" eftersom det är en Hugging Face Space)
31
  repo = Repository(
32
  local_dir=REPO_LOCAL_PATH,
33
  clone_from=REPO_ID,
34
+ repo_type="space",
35
  use_auth_token=HF_TOKEN
36
  )
37
 
38
+ # Sökväg till FAQ Excel-filen
39
  faq_path = os.path.join(REPO_LOCAL_PATH, FAQ_XLSX_PATH)
40
  try:
41
  df = pd.read_excel(faq_path)
 
43
  except Exception as e:
44
  raise FileNotFoundError(f"Kunde inte ladda FAQ-filen: {str(e)}")
45
 
46
+ # Ladda Sentence Transformer-modellen för att skapa semantiska embeddings
47
  model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
48
 
49
+ # Skapa embeddings för alla FAQ-frågor
50
  faq_questions = df["Fråga"].tolist()
51
  faq_embeddings = model.encode(faq_questions, convert_to_tensor=True)
52
 
53
 
54
+ # -------------------------------
55
+ # HJÄLPFUNKTIONER
56
+ # -------------------------------
57
  def uppdatera_embeddings():
58
  """
59
+ Uppdaterar FAQ-frågornas embeddings efter att DataFrame har ändrats.
60
  """
61
  global faq_questions, faq_embeddings, df
62
  faq_questions = df["Fråga"].tolist()
63
  faq_embeddings = model.encode(faq_questions, convert_to_tensor=True)
64
 
65
+
66
  def sök_faq(fråga):
67
  """
68
+ Utför en semantisk sökning i FAQ och returnerar de tre bästa resultaten.
69
  """
70
  fråga = fråga.strip()
71
  if not fråga:
72
  return pd.DataFrame(columns=["Liknande fråga", "Svar", "Kategori", "Confidence"])
73
 
74
+ # Skapa embedding för användarens fråga
75
  query_emb = model.encode(fråga, convert_to_tensor=True)
76
  cos_scores = util.cos_sim(query_emb, faq_embeddings)[0]
77
 
78
+ # Hämta de tre högsta resultaten
79
  top_results = torch.topk(cos_scores, k=3)
80
  indices = top_results.indices.tolist()
81
  scores = top_results.values.tolist()
 
91
  })
92
  return pd.DataFrame(data)
93
 
94
+
95
  def lägg_till_faq(fråga, svar, kategori):
96
  """
97
+ Lägger till en ny FAQ-post, sparar ändringar, pushar till repo:t och uppdaterar embeddings.
98
  """
99
  global df
100
  fråga = fråga.strip()
 
105
  return "Fråga, svar och kategori får inte vara tomma!"
106
 
107
  try:
108
+ # Lägg till posten i DataFrame
109
  ny_rad = pd.DataFrame([[fråga, svar, kategori]], columns=["Fråga", "Svar", "Kategori"])
110
  df = pd.concat([df, ny_rad], ignore_index=True)
111
 
112
+ # Spara ändringarna till Excel-filen
113
  df.to_excel(faq_path, index=False)
114
+ uppdatera_embeddings()
115
 
116
+ # Lägg till, commit och push med Git
117
  repo.git_add()
118
  repo.git_commit(f"Lade till FAQ: {fråga[:50]}...")
119
  repo.git_push()
 
122
  except Exception as e:
123
  return f"Fel vid uppdatering: {str(e)}"
124
 
125
+
126
  def visa_senaste_faq(antal=10):
127
+ """
128
+ Returnerar de senaste 'antal' FAQ-posterna.
129
+ """
130
  return df.tail(antal)
131
 
132
+
133
  def uppdatera_faq(gammal_fråga, nytt_svar, ny_kategori):
134
+ """
135
+ Uppdaterar en befintlig FAQ-post (baserat på exakt matchning av 'Fråga').
136
+ """
137
  global df
138
  gammal_fråga = gammal_fråga.strip()
139
  nytt_svar = nytt_svar.strip()
 
162
  except Exception as e:
163
  return f"Fel vid uppdatering: {str(e)}"
164
 
165
+
166
  def ta_bort_faq(fråga_att_radera):
167
+ """
168
+ Tar bort en FAQ-post baserat på en exakt matchning av 'Fråga'.
169
+ """
170
  global df
171
  fråga_att_radera = fråga_att_radera.strip()
172
  if not fråga_att_radera:
 
190
  return f"Fel vid borttagning: {str(e)}"
191
 
192
 
193
+ # -------------------------------
194
  # GRADIO-GRÄNSSNITT
195
+ # -------------------------------
196
  with gr.Blocks() as demo:
197
  gr.Markdown("# Enkel FAQ Admin")
198
+ gr.Markdown("Administrera FAQ-poster: Sök i befintliga frågor, lägg till, uppdatera eller ta bort.")
199
 
200
+ # --- Sök i FAQ ---
201
  gr.Markdown("## Sök i FAQ")
202
  inp_question = gr.Textbox(label="Din fråga", placeholder="Ex: Hur startar jag en laddning?")
203
  btn_search = gr.Button("Sök")
 
205
 
206
  btn_search.click(fn=sök_faq, inputs=inp_question, outputs=out_search)
207
 
208
+ # --- Lägg till FAQ ---
209
  gr.Markdown("## Lägg till FAQ")
210
  add_question = gr.Textbox(label="Ny fråga")
211
  add_answer = gr.Textbox(label="Nytt svar")
 
214
  out_add = gr.Textbox(label="Status")
215
  btn_add.click(fn=lägg_till_faq, inputs=[add_question, add_answer, add_cat], outputs=out_add)
216
 
217
+ # --- Redigera / Ta bort FAQ ---
218
  gr.Markdown("## Redigera / Ta bort FAQ")
219
  existing_quests = gr.Dropdown(choices=df["Fråga"].tolist(), label="Befintliga frågor")
220
  new_answer = gr.Textbox(label="Nytt svar (valfritt)")
 
228
  btn_update.click(fn=uppdatera_faq, inputs=[existing_quests, new_answer, new_cat], outputs=out_update)
229
  btn_delete.click(fn=ta_bort_faq, inputs=existing_quests, outputs=out_delete)
230
 
231
+ # --- Visa senaste FAQ-poster ---
232
  gr.Markdown("## Visa senaste FAQ-poster")
233
  btn_show = gr.Button("Visa senaste 10")
234
  out_log = gr.Dataframe(label="Senaste poster")
235
  btn_show.click(fn=visa_senaste_faq, inputs=[], outputs=out_log)
236
 
237
  if __name__ == "__main__":
238
+ demo.launch()