TheoLvs commited on
Commit
c974ee5
1 Parent(s): 787d3cb

Added CSS for sources and IPBES support

Browse files
Files changed (2) hide show
  1. app.py +54 -18
  2. style.css +9 -1
app.py CHANGED
@@ -74,6 +74,23 @@ from queue import SimpleQueue
74
  # # Create a Queue
75
  # Q = Queue()
76
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
77
 
78
 
79
  Q = SimpleQueue()
@@ -119,9 +136,6 @@ llm_streaming = get_llm(max_tokens = 1024,temperature = 0.0,verbose = True,strea
119
 
120
  # Create vectorstore and retriever
121
  vectorstore = get_pinecone_vectorstore(embeddings_function)
122
- retriever = ClimateQARetriever(vectorstore=vectorstore,sources = ["IPCC"],k_summary = 3,k_total = 10)
123
- chain = load_climateqa_chain(retriever,llm_reformulation,llm_streaming)
124
-
125
 
126
  #---------------------------------------------------------------------------
127
  # ClimateQ&A Streaming
@@ -131,15 +145,25 @@ chain = load_climateqa_chain(retriever,llm_reformulation,llm_streaming)
131
 
132
  from threading import Thread
133
 
134
- def threaded_chain(query,audience):
135
- response = chain({"query":query,"audience":audience})
136
- Q.put(response)
137
- Q.put(job_done)
138
 
139
  def answer_user(message,history):
140
  return message, history + [[message, None]]
141
 
142
- def answer_bot(message,history,audience):
 
 
 
 
 
 
 
 
 
 
 
 
 
143
 
144
  if audience == "Children":
145
  audience_prompt = audience_prompts["children"]
@@ -187,7 +211,9 @@ def answer_bot(message,history,audience):
187
  break
188
 
189
  elif isinstance(next_item, str):
190
- history[-1][1] += next_item
 
 
191
  yield "", history, ""
192
 
193
  thread.join()
@@ -351,27 +377,30 @@ def log_on_azure(file, logs, share_client):
351
 
352
 
353
  init_prompt = """
354
- Hello ! I am ClimateQ&A, a conversational assistant designed to help you understand climate change and biodiversity loss. I will answer your questions by **sifting through the IPCC and IPBES scientific reports**.
355
 
356
  💡 How to use
357
  - **Language**: You can ask me your questions in any language.
358
  - **Audience**: You can specify your audience (children, general public, experts) to get a more adapted answer.
359
  - **Sources**: You can choose to search in the IPCC or IPBES reports, or both.
360
 
361
- 📚 Limitations
362
  *Please note that the AI is not perfect and may sometimes give irrelevant answers. If you are not satisfied with the answer, please ask a more specific question or report your feedback to help us improve the system.*
363
 
364
  ❓ What do you want to learn ?
365
  """
366
 
367
 
 
 
 
 
 
 
 
368
  with gr.Blocks(title="🌍 Climate Q&A", css="style.css", theme=theme) as demo:
369
  # user_id_state = gr.State([user_id])
370
 
371
- # Gradio
372
- # gr.Markdown("<h1><center>Climate Q&A 🌍</center></h1>")
373
- # gr.Markdown("<h4><center>Ask climate-related questions to the IPCC and IPBES reports using AI</center></h4>")
374
-
375
  with gr.Tab("🌍 ClimateQ&A"):
376
 
377
  with gr.Row(elem_id="chatbot-row"):
@@ -381,6 +410,8 @@ with gr.Blocks(title="🌍 Climate Q&A", css="style.css", theme=theme) as demo:
381
  value=[[None,init_prompt]],
382
  show_copy_button=True,show_label = False,elem_id="chatbot",layout = "panel",avatar_images = ("assets/logo4.png",None))
383
 
 
 
384
  with gr.Row(elem_id = "input-message"):
385
  textbox=gr.Textbox(placeholder="Ask me anything here!",show_label=False,scale=7)
386
  submit_button = gr.Button(">",scale = 1,elem_id = "submit-button")
@@ -429,6 +460,7 @@ with gr.Blocks(title="🌍 Climate Q&A", css="style.css", theme=theme) as demo:
429
  ],
430
  [examples_hidden],
431
  examples_per_page=10,
 
432
  )
433
 
434
  with gr.Tab("📚 Citations",elem_id = "tab-citations"):
@@ -441,24 +473,28 @@ with gr.Blocks(title="🌍 Climate Q&A", css="style.css", theme=theme) as demo:
441
  dropdown_sources = gr.CheckboxGroup(
442
  ["IPCC", "IPBES"],
443
  label="Select reports",
 
 
444
  )
445
 
446
  dropdown_audience = gr.Dropdown(
447
  ["Children","General public","Experts"],
448
  label="Select audience",
 
 
449
  )
450
 
451
 
452
  # textbox.submit(predict_climateqa,[textbox,bot],[None,bot,sources_textbox])
453
 
454
  textbox.submit(answer_user, [textbox, bot], [textbox, bot], queue=False).then(
455
- answer_bot, [textbox,bot,dropdown_audience], [textbox,bot,sources_textbox]
456
  )
457
  examples_hidden.change(answer_user, [examples_hidden, bot], [textbox, bot], queue=False).then(
458
- answer_bot, [textbox,bot,dropdown_audience], [textbox,bot,sources_textbox]
459
  )
460
  submit_button.click(answer_user, [textbox, bot], [textbox, bot], queue=False).then(
461
- answer_bot, [textbox,bot,dropdown_audience], [textbox,bot,sources_textbox]
462
  )
463
 
464
 
 
74
  # # Create a Queue
75
  # Q = Queue()
76
 
77
+ import re
78
+
79
+ def parse_output_llm_with_sources(output):
80
+ # Split the content into a list of text and "[Doc X]" references
81
+ content_parts = re.split(r'\[(Doc\s?\d+(?:,\s?Doc\s?\d+)*)\]', output)
82
+ parts = []
83
+ for part in content_parts:
84
+ if part.startswith("Doc"):
85
+ subparts = part.split(",")
86
+ subparts = [subpart.lower().replace("doc","").strip() for subpart in subparts]
87
+ subparts = [f"<span class='doc-ref'><sup>{subpart}</sup></span>" for subpart in subparts]
88
+ parts.append("".join(subparts))
89
+ else:
90
+ parts.append(part)
91
+ content_parts = "".join(parts)
92
+ return content_parts
93
+
94
 
95
 
96
  Q = SimpleQueue()
 
136
 
137
  # Create vectorstore and retriever
138
  vectorstore = get_pinecone_vectorstore(embeddings_function)
 
 
 
139
 
140
  #---------------------------------------------------------------------------
141
  # ClimateQ&A Streaming
 
145
 
146
  from threading import Thread
147
 
148
+
 
 
 
149
 
150
  def answer_user(message,history):
151
  return message, history + [[message, None]]
152
 
153
+ def answer_bot(message,history,audience,sources):
154
+
155
+ # if len(message) <= 2:
156
+ # complete_response = "**⚠️ No relevant passages found in the climate science reports (IPCC and IPBES), you may want to ask a more specific question (specifying your question on climate and biodiversity issues).**"
157
+ # history[-1][1] += "\n\n" + complete_response
158
+ # return "", history, ""
159
+
160
+ retriever = ClimateQARetriever(vectorstore=vectorstore,sources = sources,k_summary = 3,k_total = 10)
161
+ chain = load_climateqa_chain(retriever,llm_reformulation,llm_streaming)
162
+
163
+ def threaded_chain(query,audience):
164
+ response = chain({"query":query,"audience":audience})
165
+ Q.put(response)
166
+ Q.put(job_done)
167
 
168
  if audience == "Children":
169
  audience_prompt = audience_prompts["children"]
 
211
  break
212
 
213
  elif isinstance(next_item, str):
214
+ new_paragraph = history[-1][1] + next_item
215
+ new_paragraph = parse_output_llm_with_sources(new_paragraph)
216
+ history[-1][1] = new_paragraph
217
  yield "", history, ""
218
 
219
  thread.join()
 
377
 
378
 
379
  init_prompt = """
380
+ Hello, I am ClimateQ&A, a conversational assistant designed to help you understand climate change and biodiversity loss. I will answer your questions by **sifting through the IPCC and IPBES scientific reports**.
381
 
382
  💡 How to use
383
  - **Language**: You can ask me your questions in any language.
384
  - **Audience**: You can specify your audience (children, general public, experts) to get a more adapted answer.
385
  - **Sources**: You can choose to search in the IPCC or IPBES reports, or both.
386
 
387
+ ⚠️ Limitations
388
  *Please note that the AI is not perfect and may sometimes give irrelevant answers. If you are not satisfied with the answer, please ask a more specific question or report your feedback to help us improve the system.*
389
 
390
  ❓ What do you want to learn ?
391
  """
392
 
393
 
394
+ def vote(data: gr.LikeData):
395
+ if data.liked:
396
+ print(data.value)
397
+ else:
398
+ print(data)
399
+
400
+
401
  with gr.Blocks(title="🌍 Climate Q&A", css="style.css", theme=theme) as demo:
402
  # user_id_state = gr.State([user_id])
403
 
 
 
 
 
404
  with gr.Tab("🌍 ClimateQ&A"):
405
 
406
  with gr.Row(elem_id="chatbot-row"):
 
410
  value=[[None,init_prompt]],
411
  show_copy_button=True,show_label = False,elem_id="chatbot",layout = "panel",avatar_images = ("assets/logo4.png",None))
412
 
413
+ # bot.like(vote,None,None)
414
+
415
  with gr.Row(elem_id = "input-message"):
416
  textbox=gr.Textbox(placeholder="Ask me anything here!",show_label=False,scale=7)
417
  submit_button = gr.Button(">",scale = 1,elem_id = "submit-button")
 
460
  ],
461
  [examples_hidden],
462
  examples_per_page=10,
463
+ # cache_examples=True,
464
  )
465
 
466
  with gr.Tab("📚 Citations",elem_id = "tab-citations"):
 
473
  dropdown_sources = gr.CheckboxGroup(
474
  ["IPCC", "IPBES"],
475
  label="Select reports",
476
+ value=["IPCC"],
477
+ interactive=True,
478
  )
479
 
480
  dropdown_audience = gr.Dropdown(
481
  ["Children","General public","Experts"],
482
  label="Select audience",
483
+ value="Experts",
484
+ interactive=True,
485
  )
486
 
487
 
488
  # textbox.submit(predict_climateqa,[textbox,bot],[None,bot,sources_textbox])
489
 
490
  textbox.submit(answer_user, [textbox, bot], [textbox, bot], queue=False).then(
491
+ answer_bot, [textbox,bot,dropdown_audience,dropdown_sources], [textbox,bot,sources_textbox]
492
  )
493
  examples_hidden.change(answer_user, [examples_hidden, bot], [textbox, bot], queue=False).then(
494
+ answer_bot, [textbox,bot,dropdown_audience,dropdown_sources], [textbox,bot,sources_textbox]
495
  )
496
  submit_button.click(answer_user, [textbox, bot], [textbox, bot], queue=False).then(
497
+ answer_bot, [textbox,bot,dropdown_audience,dropdown_sources], [textbox,bot,sources_textbox]
498
  )
499
 
500
 
style.css CHANGED
@@ -84,7 +84,7 @@ a {
84
  font-weight: bold;
85
  margin-bottom: 10px;
86
  margin-top:0px !important;
87
- color:#577b9b!important;;
88
  }
89
 
90
  .card-content p {
@@ -263,3 +263,11 @@ body.dark .card-footer {
263
  body.dark .card-footer span {
264
  color:white !important;
265
  }
 
 
 
 
 
 
 
 
 
84
  font-weight: bold;
85
  margin-bottom: 10px;
86
  margin-top:0px !important;
87
+ color:#dc2626!important;;
88
  }
89
 
90
  .card-content p {
 
263
  body.dark .card-footer span {
264
  color:white !important;
265
  }
266
+
267
+
268
+ .doc-ref{
269
+ color:#dc2626!important;
270
+ margin-right:1px;
271
+ }
272
+
273
+