fruitpicker01 commited on
Commit
1a5ce77
1 Parent(s): 70ae20f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +980 -105
app.py CHANGED
@@ -10,6 +10,12 @@ from openpyxl import load_workbook
10
  import base64
11
  from together import Together
12
  from mistralai import Mistral
 
 
 
 
 
 
13
 
14
  # Установка ключа API для OpenAI, GigaChat и Mistral
15
  openai_api_key = os.getenv('GPT_KEY')
@@ -25,6 +31,11 @@ chat_pro = GigaChat(credentials=gc_key, model='GigaChat-Pro', max_tokens=68, tem
25
  chat_lite = GigaChat(credentials=gc_key, model='GigaChat', max_tokens=68, temperature=1, verify_ssl_certs=False)
26
  chat_plus = GigaChat(credentials=gc_key, model='GigaChat-Plus', max_tokens=68, temperature=1, verify_ssl_certs=False)
27
 
 
 
 
 
 
28
  # Загрузка данных из Excel-файла
29
  try:
30
  data = pd.read_excel('Признаки.xlsx', sheet_name=None)
@@ -49,6 +60,19 @@ for sheet_name, df in data.items():
49
  current_request_index = -1 # Изначально указывает на последний запрос
50
 
51
 
 
 
 
 
 
 
 
 
 
 
 
 
 
52
  def save_user_request_to_github(description, advantages, key_message, approach, personalization_params):
53
 
54
  global current_request_index # Используем глобальную переменную
@@ -87,7 +111,6 @@ def save_user_request_to_github(description, advantages, key_message, approach,
87
  else:
88
  print(f"Ошибка при сохранении данных на GitHub: {response.status_code} {response.text}")
89
 
90
-
91
  def load_previous_user_request_from_github():
92
  global current_request_index # Используем глобальную переменную
93
 
@@ -265,65 +288,39 @@ def generate_message_meta_llama_3_1_405b(prompt):
265
  except Exception as e:
266
  return f"Ошибка при обращении к Meta-Llama-3.1-405B: {e}"
267
 
268
- def generate_message_meta_llama_3_1_70b(prompt):
269
- try:
270
- response = client.chat.completions.create(
271
- model="meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo",
272
- messages=[{"role": "user", "content": prompt}],
273
- max_tokens=74,
274
- temperature=0.8
275
- )
276
- cleaned_message = clean_message(response.choices[0].message.content.strip())
277
- return cleaned_message
278
- except Exception as e:
279
- return f"Ошибка при обращении к Meta-Llama-3.1-70B: {e}"
280
-
281
- def generate_message_meta_llama_3_1_8b(prompt):
282
- try:
283
- response = client.chat.completions.create(
284
- model="meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo",
285
- messages=[{"role": "user", "content": prompt}],
286
- max_tokens=74,
287
- temperature=0.8
288
- )
289
- cleaned_message = clean_message(response.choices[0].message.content.strip())
290
- return cleaned_message
291
- except Exception as e:
292
- return f"Ошибка при обращении к Meta-Llama-3.1-8B: {e}"
293
-
294
  def generate_message_gpt4o_with_retry(prompt):
295
  for _ in range(10): # Максимум 10 попыток
296
  message = generate_message_gpt4o(prompt)
297
  if len(message) <= 250:
298
- return message
299
  return message # Возвращаем последнее сгенерированное сообщение, если все попытки не удались
300
 
301
  def generate_message_gigachat_pro_with_retry(prompt):
302
  for _ in range(10):
303
  message = generate_message_gigachat_pro(prompt)
304
  if len(message) <= 250:
305
- return message
306
  return message
307
 
308
  def generate_message_gigachat_lite_with_retry(prompt):
309
  for _ in range(10):
310
  message = generate_message_gigachat_lite(prompt)
311
  if len(message) <= 250:
312
- return message
313
  return message
314
 
315
  def generate_message_gigachat_plus_with_retry(prompt):
316
  for _ in range(10):
317
  message = generate_message_gigachat_plus(prompt)
318
  if len(message) <= 250:
319
- return message
320
  return message
321
 
322
  def generate_message_meta_llama_3_1_405b_with_retry(prompt):
323
  for _ in range(10):
324
  message = generate_message_meta_llama_3_1_405b(prompt)
325
  if len(message) <= 250:
326
- return message
327
  return message
328
 
329
 
@@ -442,7 +439,10 @@ def generate_personalization_prompt(key_message, approach, *selected_values):
442
  prompt += "Убедись, что готовый текст начинается с вопроса, который указывает на пользу продукта для клиента.\n"
443
 
444
  prompt += f"Убедись, что в готовом тексте есть следующая ключевая информация: {key_message.strip()}"
445
-
 
 
 
446
  return prompt.strip()
447
 
448
 
@@ -493,7 +493,7 @@ def personalize_messages_with_yield(
493
 
494
  personalized_message_gigachat_plus = perform_personalization_gigachat(gigachat_plus_message, personalization_prompt, "gigachat_plus")
495
  gigachat_plus_length = len(personalized_message_gigachat_plus)
496
- gigachat_plus_display = f"{personalized_message_gigachat_plus}\n\n------\nКоличество знаков: {gigachat_lite_length}"
497
  yield personalization_prompt, gigachat_pro_display, gigachat_lite_display, gigachat_plus_display, "", ""
498
 
499
  personalized_message_gpt4o = perform_personalization(gpt4o_message, personalization_prompt)
@@ -506,6 +506,13 @@ def personalize_messages_with_yield(
506
  meta_llama_405b_display = f"{personalized_message_meta_llama_405b}\n\n------\nКоличество знаков: {meta_llama_405b_length}"
507
  yield personalization_prompt, gigachat_pro_display, gigachat_lite_display, gigachat_plus_display, gpt4o_display, meta_llama_405b_display
508
 
 
 
 
 
 
 
 
509
 
510
  # Функция для генерации промпта проверки текста
511
  def generate_error_check_prompt():
@@ -602,8 +609,8 @@ def personalize_and_save(
602
  meta_llama_405b_message,
603
  description,
604
  advantages,
605
- key_message, # Обратите внимание, что key_message здесь не передается в selected_values
606
- approach, # Подход тоже не должен передаваться в selected_values
607
  *selected_values
608
  ):
609
  # Персонализация с использованием yield для последовательного вывода
@@ -615,17 +622,53 @@ def personalize_and_save(
615
  meta_llama_405b_message,
616
  key_message,
617
  approach,
618
- *selected_values # Только признаки для персонализации
619
  )
620
 
621
- # Перебираем генератор, чтобы получить все значения и сохранить последний результат
622
  last_personalization_result = None
623
  for personalization_result in personalization_generator:
624
  last_personalization_result = personalization_result
625
- yield personalization_result # Отображаем результаты по мере их появления
 
 
 
 
 
 
 
 
626
 
627
  # После завершения персонализации, сохраняем результаты
628
  if last_personalization_result:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
629
  save_user_request_to_github(description, advantages, key_message, approach, selected_values)
630
 
631
 
@@ -634,17 +677,45 @@ def clear_fields():
634
  "", "", "", "", "", # personalized outputs and prompts
635
  "", "", "", "", "", # comment fields
636
  "", "", "", "", "", # corrected message fields
637
- ""
638
  )
639
 
 
640
  def clear_personalization_fields():
641
  return (
642
  "", "", "", "", "", # personalized outputs
643
  "", "", "", "", "", # comment fields
644
  "", "", "", "", "", # corrected message fields
 
645
  ""
646
  )
647
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
648
 
649
  def prepare_button_text():
650
  return gr.update(value="Сохраняется...", visible=True)
@@ -656,15 +727,6 @@ def reset_button_text():
656
  time.sleep(2) # Задержка в 2 секунды
657
  return gr.update(value="Сохранить в базу", visible=True)
658
 
659
- def clear_unnecessary_fields():
660
- return (
661
- "", "", "", "", "", # personalized outputs and prompts
662
- "", "", "", "", "", # comment fields
663
- "", "", "", "", "", # corrected message fields
664
- "", "", "", "", "", # оставшиеся поля
665
- "", "" # Дополнительное пустое значение
666
- )
667
-
668
  def regen_message_gpt4o(description, advantages, key_message, approach, *selected_values):
669
  standard_prompt = generate_standard_prompt(description, advantages, key_message, approach, *selected_values)
670
  gpt4o_message = generate_message_gpt4o_with_retry(standard_prompt)
@@ -695,35 +757,502 @@ def regen_message_meta_llama_405b(description, advantages, key_message, approach
695
  meta_llama_405b_length = len(meta_llama_405b_message)
696
  return f"{meta_llama_405b_message}\n\n------\nКоличество знаков: {meta_llama_405b_length}"
697
 
698
- def personalize_message_gpt4o(gpt4o_message, key_message, approach, *selected_values):
699
- personalization_prompt = generate_personalization_prompt(key_message, approach, *selected_values)
700
- personalized_message = perform_personalization(gpt4o_message, personalization_prompt)
701
- gpt4o_length = len(personalized_message)
702
- return f"{personalized_message}\n\n------\nКоличество знаков: {gpt4o_length}"
703
-
704
  def personalize_message_gigachat_pro(gigachat_pro_message, key_message, approach, *selected_values):
705
  personalization_prompt = generate_personalization_prompt(key_message, approach, *selected_values)
706
  personalized_message = perform_personalization_gigachat(gigachat_pro_message, personalization_prompt, "gigachat_pro")
707
  gigachat_pro_length = len(personalized_message)
708
- return f"{personalized_message}\n\n------\nКоличество знаков: {gigachat_pro_length}"
 
 
 
 
 
709
 
710
  def personalize_message_gigachat_lite(gigachat_lite_message, key_message, approach, *selected_values):
711
  personalization_prompt = generate_personalization_prompt(key_message, approach, *selected_values)
712
  personalized_message = perform_personalization_gigachat(gigachat_lite_message, personalization_prompt, "gigachat_lite")
713
  gigachat_lite_length = len(personalized_message)
714
- return f"{personalized_message}\n\n------\nКоличество знаков: {gigachat_lite_length}"
 
 
 
 
 
715
 
716
  def personalize_message_gigachat_plus(gigachat_plus_message, key_message, approach, *selected_values):
717
  personalization_prompt = generate_personalization_prompt(key_message, approach, *selected_values)
718
  personalized_message = perform_personalization_gigachat(gigachat_plus_message, personalization_prompt, "gigachat_plus")
719
  gigachat_plus_length = len(personalized_message)
720
- return f"{personalized_message}\n\n------\nКоличество знаков: {gigachat_plus_length}"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
721
 
722
  def personalize_message_meta_llama_405b(meta_llama_405b_message, key_message, approach, *selected_values):
723
  personalization_prompt = generate_personalization_prompt(key_message, approach, *selected_values)
724
  personalized_message = perform_personalization_meta_llama_405b(meta_llama_405b_message, personalization_prompt)
725
  meta_llama_405b_length = len(personalized_message)
726
- return f"{personalized_message}\n\n------\nКоличество знаков: {meta_llama_405b_length}"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
727
 
728
 
729
  # Создание интерфейса Gradio
@@ -745,6 +1274,7 @@ with gr.Blocks() as demo:
745
  "4. В течение следующего месяца пользоваться ей бесплатно."
746
  )
747
  )
 
748
  advantages_input = gr.Textbox(
749
  label="Преимущества (предзаполненный пример можно поменять на свой)",
750
  lines=6,
@@ -776,7 +1306,58 @@ with gr.Blocks() as demo:
776
  selections.append(gr.Dropdown(choices=[None] + list(features[feature].keys()), label=f"Выберите {feature}"))
777
 
778
  with gr.Column(scale=2):
779
- prompt_display = gr.Textbox(label="Неперсонализированный промпт", lines=41, interactive=False)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
780
  personalization_prompt = gr.Textbox(label="Персонализированный промпт", lines=23, interactive=False)
781
 
782
  with gr.Row():
@@ -796,11 +1377,11 @@ with gr.Blocks() as demo:
796
 
797
  # Первый ряд: неперсонализированные сообщения
798
  with gr.Row():
799
- output_text_gigachat_pro = gr.Textbox(label="Неперсонализированное сообщение GigaChat-Pro", lines=3, interactive=False)
800
- output_text_gigachat_lite = gr.Textbox(label="Неперсонализированное сообщение GigaChat-Lite", lines=3, interactive=False)
801
- output_text_gigachat_plus = gr.Textbox(label="Неперсонализированное сообщение GigaChat-Lite+", lines=3, interactive=False)
802
- output_text_gpt4o = gr.Textbox(label="Неперсонализированное сообщение ChatGPT-4o", lines=3, interactive=False)
803
- output_text_meta_llama_405b = gr.Textbox(label="Неперсонализированное сообщение Llama-405B", lines=3, interactive=False)
804
 
805
  # Ряд кнопок "Персонализировать"
806
  with gr.Row():
@@ -812,27 +1393,27 @@ with gr.Blocks() as demo:
812
 
813
  # Второй ряд: персонализированные сообщения
814
  with gr.Row():
815
- personalized_output_text_gigachat_pro = gr.Textbox(label="Персонализированное сообщение GigaChat-Pro", lines=3, interactive=False)
816
- personalized_output_text_gigachat_lite = gr.Textbox(label="Персонализированное сообщение GigaChat-Lite", lines=3, interactive=False)
817
- personalized_output_text_gigachat_plus = gr.Textbox(label="Персонализированное сообщение GigaChat-Lite+", lines=3, interactive=False)
818
- personalized_output_text_gpt4o = gr.Textbox(label="Персонализированное сообщение ChatGPT-4o", lines=3, interactive=False)
819
- personalized_output_text_meta_llama_405b = gr.Textbox(label="Персонализированное сообщение Llama-405B", lines=3, interactive=False)
820
 
821
  # Третий ряд: комментарии
822
  with gr.Row():
823
- comment_gigachat_pro = gr.Textbox(label="Комментарий к сообщению GigaChat-Pro", lines=3)
824
- comment_gigachat_lite = gr.Textbox(label="Комментарий к сообщению GigaChat-Lite", lines=3)
825
- comment_gigachat_plus = gr.Textbox(label="Комментарий к сообщению GigaChat-Lite+", lines=3)
826
- comment_gpt4o = gr.Textbox(label="Комментарий к сообщению ChatGPT-4o", lines=3)
827
- comment_meta_llama_405b = gr.Textbox(label="Комментарий к сообщению Llama-405B", lines=3)
828
 
829
  # Четвертый ряд: откорректированные сообщения
830
  with gr.Row():
831
- corrected_gigachat_pro = gr.Textbox(label="Откорректированное сообщение GigaChat-Pro", lines=3)
832
- corrected_gigachat_lite = gr.Textbox(label="Откорректированное сообщение GigaChat-Lite", lines=3)
833
- corrected_gigachat_plus = gr.Textbox(label="Откорректированное сообщение GigaChat-Lite+", lines=3)
834
- corrected_gpt4o = gr.Textbox(label="Откорректированное сообщение ChatGPT-4o", lines=3)
835
- corrected_meta_llama_405b = gr.Textbox(label="Откорректированное сообщение Llama-405B", lines=3)
836
 
837
  # Пятый ряд: кнопки сохранения
838
  with gr.Row():
@@ -841,14 +1422,221 @@ with gr.Blocks() as demo:
841
  save_gigachat_plus_btn = gr.Button("Сохранить в базу")
842
  save_gpt4o_btn = gr.Button("Сохранить в базу")
843
  save_meta_llama_405b_btn = gr.Button("Сохранить в базу")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
844
 
845
-
846
  # Добавление функционала для кно��ок
847
  submit_btn.click(
848
  clear_fields,
849
  inputs=[],
850
  outputs=[
851
- personalization_prompt,
852
  personalized_output_text_gigachat_pro,
853
  personalized_output_text_gigachat_lite,
854
  personalized_output_text_gigachat_plus,
@@ -863,7 +1651,12 @@ with gr.Blocks() as demo:
863
  comment_gpt4o,
864
  corrected_gpt4o,
865
  comment_meta_llama_405b,
866
- corrected_meta_llama_405b
 
 
 
 
 
867
  ]
868
  )
869
 
@@ -905,7 +1698,7 @@ with gr.Blocks() as demo:
905
 
906
  personalize_btn.click(
907
  fn=personalize_and_save,
908
- inputs=[
909
  output_text_gigachat_pro,
910
  output_text_gigachat_lite,
911
  output_text_gigachat_plus,
@@ -913,8 +1706,8 @@ with gr.Blocks() as demo:
913
  output_text_meta_llama_405b,
914
  description_input,
915
  advantages_input,
916
- key_message_input, # Add key_message_input
917
- approach_input, # Add approach_input
918
  ] + selections,
919
  outputs=[
920
  personalization_prompt,
@@ -922,10 +1715,16 @@ with gr.Blocks() as demo:
922
  personalized_output_text_gigachat_lite,
923
  personalized_output_text_gigachat_plus,
924
  personalized_output_text_gpt4o,
925
- personalized_output_text_meta_llama_405b
 
 
 
 
 
926
  ]
927
  )
928
 
 
929
  # Обработка клика по кнопке восстановления
930
  load_btn.click(
931
  fn=lambda: load_previous_user_request_from_github(),
@@ -962,36 +1761,71 @@ with gr.Blocks() as demo:
962
  comment_gpt4o,
963
  corrected_gpt4o,
964
  comment_meta_llama_405b,
965
- corrected_meta_llama_405b
 
 
 
 
 
966
  ]
 
 
 
 
 
 
 
 
967
  )
968
 
 
969
  regen_gigachat_pro_btn.click(
970
- regen_message_gigachat_pro,
 
 
 
 
971
  inputs=[description_input, advantages_input, key_message_input, approach_input] + selections,
972
  outputs=output_text_gigachat_pro
973
  )
974
-
 
975
  regen_gigachat_lite_btn.click(
976
- regen_message_gigachat_lite,
 
 
 
 
977
  inputs=[description_input, advantages_input, key_message_input, approach_input] + selections,
978
  outputs=output_text_gigachat_lite
979
  )
980
-
981
  regen_gigachat_plus_btn.click(
982
- regen_message_gigachat_plus,
 
 
 
 
983
  inputs=[description_input, advantages_input, key_message_input, approach_input] + selections,
984
  outputs=output_text_gigachat_plus
985
  )
986
 
987
  regen_gpt4o_btn.click(
988
- regen_message_gpt4o,
 
 
 
 
989
  inputs=[description_input, advantages_input, key_message_input, approach_input] + selections,
990
  outputs=output_text_gpt4o
991
  )
992
-
993
  regen_meta_llama_405b_btn.click(
994
- regen_message_meta_llama_405b,
 
 
 
 
995
  inputs=[description_input, advantages_input, key_message_input, approach_input] + selections,
996
  outputs=output_text_meta_llama_405b
997
  )
@@ -999,33 +1833,54 @@ with gr.Blocks() as demo:
999
  personalize_gigachat_pro_btn.click(
1000
  personalize_message_gigachat_pro,
1001
  inputs=[output_text_gigachat_pro, key_message_input, approach_input] + selections,
1002
- outputs=personalized_output_text_gigachat_pro
 
 
 
 
1003
  )
1004
-
1005
  personalize_gigachat_lite_btn.click(
1006
  personalize_message_gigachat_lite,
1007
  inputs=[output_text_gigachat_lite, key_message_input, approach_input] + selections,
1008
- outputs=personalized_output_text_gigachat_lite
 
 
 
 
1009
  )
1010
-
1011
  personalize_gigachat_plus_btn.click(
1012
  personalize_message_gigachat_plus,
1013
  inputs=[output_text_gigachat_plus, key_message_input, approach_input] + selections,
1014
- outputs=personalized_output_text_gigachat_plus
 
 
 
 
1015
  )
1016
-
1017
  personalize_gpt4o_btn.click(
1018
  personalize_message_gpt4o,
1019
  inputs=[output_text_gpt4o, key_message_input, approach_input] + selections,
1020
- outputs=personalized_output_text_gpt4o
 
 
 
 
1021
  )
1022
 
1023
  personalize_meta_llama_405b_btn.click(
1024
  personalize_message_meta_llama_405b,
1025
  inputs=[output_text_meta_llama_405b, key_message_input, approach_input] + selections,
1026
- outputs=personalized_output_text_meta_llama_405b
 
 
 
 
1027
  )
1028
 
 
1029
  # Привязка кнопок к функциям сохранения
1030
  save_gigachat_pro_btn.click(
1031
  fn=prepare_button_text,
@@ -1198,6 +2053,26 @@ with gr.Blocks() as demo:
1198
  fn=reset_button_text,
1199
  outputs=[save_meta_llama_405b_btn]
1200
  )
1201
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1202
 
1203
  demo.launch()
 
10
  import base64
11
  from together import Together
12
  from mistralai import Mistral
13
+ import pymorphy2
14
+ import re
15
+ import string
16
+ import re
17
+
18
+ morph = pymorphy2.MorphAnalyzer()
19
 
20
  # Установка ключа API для OpenAI, GigaChat и Mistral
21
  openai_api_key = os.getenv('GPT_KEY')
 
31
  chat_lite = GigaChat(credentials=gc_key, model='GigaChat', max_tokens=68, temperature=1, verify_ssl_certs=False)
32
  chat_plus = GigaChat(credentials=gc_key, model='GigaChat-Plus', max_tokens=68, temperature=1, verify_ssl_certs=False)
33
 
34
+ # Экземпляры моделей для объяснений
35
+ chat_pro_explain = GigaChat(credentials=gc_key, model='GigaChat-Pro', temperature=1, verify_ssl_certs=False)
36
+ chat_lite_explain = GigaChat(credentials=gc_key, model='GigaChat', temperature=1, verify_ssl_certs=False)
37
+ chat_plus_explain = GigaChat(credentials=gc_key, model='GigaChat-Plus', temperature=1, verify_ssl_certs=False)
38
+
39
  # Загрузка данных из Excel-файла
40
  try:
41
  data = pd.read_excel('Признаки.xlsx', sheet_name=None)
 
60
  current_request_index = -1 # Изначально указывает на последний запрос
61
 
62
 
63
+ def correct_dash_usage(text):
64
+ # Step 1: Replace any dash with long dash if surrounded by spaces
65
+ text = re.sub(r'\s[-–—]\s', ' — ', text)
66
+
67
+ # Step 2: Replace any dash with short dash if surrounded by numbers without spaces
68
+ text = re.sub(r'(?<=\d)[-–—](?=\d)', '–', text)
69
+
70
+ # Step 3: Replace any dash with hyphen if surrounded by letters or a combination of letters and digits
71
+ text = re.sub(r'(?<=[a-zA-Zа-яА-Я0-9])[-–—](?=[a-zA-Zа-яА-Я0-9])', '-', text)
72
+
73
+ return text
74
+
75
+
76
  def save_user_request_to_github(description, advantages, key_message, approach, personalization_params):
77
 
78
  global current_request_index # Используем глобальную переменную
 
111
  else:
112
  print(f"Ошибка при сохранении данных на GitHub: {response.status_code} {response.text}")
113
 
 
114
  def load_previous_user_request_from_github():
115
  global current_request_index # Используем глобальную переменную
116
 
 
288
  except Exception as e:
289
  return f"Ошибка при обращении к Meta-Llama-3.1-405B: {e}"
290
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
291
  def generate_message_gpt4o_with_retry(prompt):
292
  for _ in range(10): # Максимум 10 попыток
293
  message = generate_message_gpt4o(prompt)
294
  if len(message) <= 250:
295
+ return correct_dash_usage(message)
296
  return message # Возвращаем последнее сгенерированное сообщение, если все попытки не удались
297
 
298
  def generate_message_gigachat_pro_with_retry(prompt):
299
  for _ in range(10):
300
  message = generate_message_gigachat_pro(prompt)
301
  if len(message) <= 250:
302
+ return correct_dash_usage(message)
303
  return message
304
 
305
  def generate_message_gigachat_lite_with_retry(prompt):
306
  for _ in range(10):
307
  message = generate_message_gigachat_lite(prompt)
308
  if len(message) <= 250:
309
+ return correct_dash_usage(message)
310
  return message
311
 
312
  def generate_message_gigachat_plus_with_retry(prompt):
313
  for _ in range(10):
314
  message = generate_message_gigachat_plus(prompt)
315
  if len(message) <= 250:
316
+ return correct_dash_usage(message)
317
  return message
318
 
319
  def generate_message_meta_llama_3_1_405b_with_retry(prompt):
320
  for _ in range(10):
321
  message = generate_message_meta_llama_3_1_405b(prompt)
322
  if len(message) <= 250:
323
+ return correct_dash_usage(message)
324
  return message
325
 
326
 
 
439
  prompt += "Убедись, что готовый текст начинается с вопроса, который указывает на пользу продукта для клиента.\n"
440
 
441
  prompt += f"Убедись, что в готовом тексте есть следующая ключевая информация: {key_message.strip()}"
442
+
443
+ if "призыва к действию" in prompt and "избегая давления" in prompt:
444
+ prompt = re.sub(r"Убедись, что готовый текст начинается с призыва к действию с продуктом.\n", "", prompt)
445
+
446
  return prompt.strip()
447
 
448
 
 
493
 
494
  personalized_message_gigachat_plus = perform_personalization_gigachat(gigachat_plus_message, personalization_prompt, "gigachat_plus")
495
  gigachat_plus_length = len(personalized_message_gigachat_plus)
496
+ gigachat_plus_display = f"{personalized_message_gigachat_plus}\n\n------\nКоличество знаков: {gigachat_plus_length}"
497
  yield personalization_prompt, gigachat_pro_display, gigachat_lite_display, gigachat_plus_display, "", ""
498
 
499
  personalized_message_gpt4o = perform_personalization(gpt4o_message, personalization_prompt)
 
506
  meta_llama_405b_display = f"{personalized_message_meta_llama_405b}\n\n------\nКоличество знаков: {meta_llama_405b_length}"
507
  yield personalization_prompt, gigachat_pro_display, gigachat_lite_display, gigachat_plus_display, gpt4o_display, meta_llama_405b_display
508
 
509
+ # Добавьте проверки в personalize_messages_with_yield
510
+ is_valid_gigachat_pro = check_forbidden_words(personalized_message_gigachat_pro)
511
+ is_valid_gigachat_lite = check_forbidden_words(personalized_message_gigachat_lite)
512
+ is_valid_gigachat_plus = check_forbidden_words(personalized_message_gigachat_plus)
513
+ is_valid_gpt4o = check_forbidden_words(personalized_message_gpt4o)
514
+ is_valid_meta_llama_405b = check_forbidden_words(personalized_message_meta_llama_405b)
515
+
516
 
517
  # Функция для генерации промпта проверки текста
518
  def generate_error_check_prompt():
 
609
  meta_llama_405b_message,
610
  description,
611
  advantages,
612
+ key_message,
613
+ approach,
614
  *selected_values
615
  ):
616
  # Персонализация с использованием yield для последовательного вывода
 
622
  meta_llama_405b_message,
623
  key_message,
624
  approach,
625
+ *selected_values
626
  )
627
 
 
628
  last_personalization_result = None
629
  for personalization_result in personalization_generator:
630
  last_personalization_result = personalization_result
631
+ yield (
632
+ personalization_result[0], # personalization_prompt
633
+ personalization_result[1], # gigachat_pro_message
634
+ personalization_result[2], # gigachat_lite_message
635
+ personalization_result[3], # gigachat_plus_message
636
+ personalization_result[4], # gpt4o_message
637
+ personalization_result[5], # meta_llama_405b_message
638
+ "", "", "", "", "" # Пустые строки для проверок
639
+ )
640
 
641
  # После завершения персонализации, сохраняем результаты
642
  if last_personalization_result:
643
+ checks_gigachat_pro = perform_checks(last_personalization_result[1])
644
+ checks_gigachat_lite = perform_checks(last_personalization_result[2])
645
+ checks_gigachat_plus = perform_checks(last_personalization_result[3])
646
+ checks_gpt4o = perform_checks(last_personalization_result[4])
647
+ checks_meta_llama_405b = perform_checks(last_personalization_result[5])
648
+
649
+ # Форматирование результатов проверок
650
+ formatted_checks = [
651
+ format_checks(checks_gigachat_pro),
652
+ format_checks(checks_gigachat_lite),
653
+ format_checks(checks_gigachat_plus),
654
+ format_checks(checks_gpt4o),
655
+ format_checks(checks_meta_llama_405b)
656
+ ]
657
+
658
+ yield (
659
+ last_personalization_result[0], # personalization_prompt
660
+ last_personalization_result[1], # gigachat_pro_message
661
+ last_personalization_result[2], # gigachat_lite_message
662
+ last_personalization_result[3], # gigachat_plus_message
663
+ last_personalization_result[4], # gpt4o_message
664
+ last_personalization_result[5], # meta_llama_405b_message
665
+ formatted_checks[0], # validation_display_1
666
+ formatted_checks[1], # validation_display_2
667
+ formatted_checks[2], # validation_display_3
668
+ formatted_checks[3], # validation_display_4
669
+ formatted_checks[4] # validation_display_5
670
+ )
671
+
672
  save_user_request_to_github(description, advantages, key_message, approach, selected_values)
673
 
674
 
 
677
  "", "", "", "", "", # personalized outputs and prompts
678
  "", "", "", "", "", # comment fields
679
  "", "", "", "", "", # corrected message fields
680
+ "", "", "", "", "", # анализ персонализации
681
  )
682
 
683
+
684
  def clear_personalization_fields():
685
  return (
686
  "", "", "", "", "", # personalized outputs
687
  "", "", "", "", "", # comment fields
688
  "", "", "", "", "", # corrected message fields
689
+ "", "", "", "", "", # анализ персонализации
690
  ""
691
  )
692
 
693
+ def clear_on_change():
694
+ return (
695
+ "", "", "", "", "", # очистка всех полей для промптов и сообщений
696
+ "", "", "", "", "", # комментарии
697
+ "", "", "", "", "", # откорректированные сообщения
698
+ "", "", "", "", "", # результаты проверок
699
+ "", "", "", "", "",
700
+ )
701
+
702
+ def clear_on_change_pers():
703
+ return (
704
+ "", "", "", "", "", # очистка всех полей для промптов и сообщений
705
+ "", "", "", "", "", # комментарии
706
+ "", "", "", "", "", # откорректированные сообщения
707
+ "", "", "", "", "" # результаты проверок
708
+ )
709
+
710
+ def clear_unnecessary_fields():
711
+ return (
712
+ "", "", "", "", "", # personalized outputs and prompts
713
+ "", "", "", "", "", # comment fields
714
+ "", "", "", "", "", # corrected message fields
715
+ "", "", "", "", "", # оставшиеся поля
716
+ "", "", # Дополнительное пустое значение
717
+ "", "", "", "", "", # поля анализа персонализации
718
+ )
719
 
720
  def prepare_button_text():
721
  return gr.update(value="Сохраняется...", visible=True)
 
727
  time.sleep(2) # Задержка в 2 секунды
728
  return gr.update(value="Сохранить в базу", visible=True)
729
 
 
 
 
 
 
 
 
 
 
730
  def regen_message_gpt4o(description, advantages, key_message, approach, *selected_values):
731
  standard_prompt = generate_standard_prompt(description, advantages, key_message, approach, *selected_values)
732
  gpt4o_message = generate_message_gpt4o_with_retry(standard_prompt)
 
757
  meta_llama_405b_length = len(meta_llama_405b_message)
758
  return f"{meta_llama_405b_message}\n\n------\nКоличество знаков: {meta_llama_405b_length}"
759
 
 
 
 
 
 
 
760
  def personalize_message_gigachat_pro(gigachat_pro_message, key_message, approach, *selected_values):
761
  personalization_prompt = generate_personalization_prompt(key_message, approach, *selected_values)
762
  personalized_message = perform_personalization_gigachat(gigachat_pro_message, personalization_prompt, "gigachat_pro")
763
  gigachat_pro_length = len(personalized_message)
764
+
765
+ # Выполняем проверку сгенерированного сообщения
766
+ checks = perform_checks(personalized_message)
767
+ formatted_checks = format_checks(checks)
768
+
769
+ return f"{personalized_message}\n\n------\nКоличество знаков: {gigachat_pro_length}", formatted_checks
770
 
771
  def personalize_message_gigachat_lite(gigachat_lite_message, key_message, approach, *selected_values):
772
  personalization_prompt = generate_personalization_prompt(key_message, approach, *selected_values)
773
  personalized_message = perform_personalization_gigachat(gigachat_lite_message, personalization_prompt, "gigachat_lite")
774
  gigachat_lite_length = len(personalized_message)
775
+
776
+ # Выполняем проверку сгенерированного сообщения
777
+ checks = perform_checks(personalized_message)
778
+ formatted_checks = format_checks(checks)
779
+
780
+ return f"{personalized_message}\n\n------\nКоличество знаков: {gigachat_lite_length}", formatted_checks
781
 
782
  def personalize_message_gigachat_plus(gigachat_plus_message, key_message, approach, *selected_values):
783
  personalization_prompt = generate_personalization_prompt(key_message, approach, *selected_values)
784
  personalized_message = perform_personalization_gigachat(gigachat_plus_message, personalization_prompt, "gigachat_plus")
785
  gigachat_plus_length = len(personalized_message)
786
+
787
+ # Выполняем проверку сгенерированного сообщения
788
+ checks = perform_checks(personalized_message)
789
+ formatted_checks = format_checks(checks)
790
+
791
+ return f"{personalized_message}\n\n------\nКоличество знаков: {gigachat_plus_length}", formatted_checks
792
+
793
+ def personalize_message_gpt4o(gpt4o_message, key_message, approach, *selected_values):
794
+ personalization_prompt = generate_personalization_prompt(key_message, approach, *selected_values)
795
+ personalized_message = perform_personalization(gpt4o_message, personalization_prompt)
796
+ gpt4o_length = len(personalized_message)
797
+
798
+ # Выполняем проверку сгенерированного сообщения
799
+ checks = perform_checks(personalized_message)
800
+ formatted_checks = format_checks(checks)
801
+
802
+ return f"{personalized_message}\n\n------\nКоличество знаков: {gpt4o_length}", formatted_checks
803
 
804
  def personalize_message_meta_llama_405b(meta_llama_405b_message, key_message, approach, *selected_values):
805
  personalization_prompt = generate_personalization_prompt(key_message, approach, *selected_values)
806
  personalized_message = perform_personalization_meta_llama_405b(meta_llama_405b_message, personalization_prompt)
807
  meta_llama_405b_length = len(personalized_message)
808
+
809
+ # Выполняем проверку сгенерированного сообщения
810
+ checks = perform_checks(personalized_message)
811
+ formatted_checks = format_checks(checks)
812
+
813
+ return f"{personalized_message}\n\n------\nКоличество знаков: {meta_llama_405b_length}", formatted_checks
814
+
815
+
816
+ def generate_explanation_gigachat_pro(prompt):
817
+ messages = [SystemMessage(content=prompt)]
818
+ res = chat_pro_explain(messages)
819
+ return res.content.strip()
820
+
821
+ def generate_explanation_gigachat_lite(prompt):
822
+ messages = [SystemMessage(content=prompt)]
823
+ res = chat_lite_explain(messages)
824
+ return res.content.strip()
825
+
826
+ def generate_explanation_gigachat_plus(prompt):
827
+ messages = [SystemMessage(content=prompt)]
828
+ res = chat_plus_explain(messages)
829
+ return res.content.strip()
830
+
831
+ def generate_explanation_gpt4o(prompt):
832
+ try:
833
+ headers = {
834
+ "Content-Type": "application/json",
835
+ "Authorization": f"Bearer {openai_api_key}"
836
+ }
837
+ data = {
838
+ "model": "chatgpt-4o-latest",
839
+ "messages": [{"role": "system", "content": prompt}],
840
+ "temperature": 1.1
841
+ }
842
+ response = requests.post("https://api.openai.com/v1/chat/completions", json=data, headers=headers)
843
+ response_data = response.json()
844
+ return response_data["choices"][0]["message"]["content"].strip()
845
+ except Exception as e:
846
+ return f"Ошибка при обращении к ChatGPT-4o-Latest: {e}"
847
+
848
+ def generate_explanation_meta_llama_405b(prompt):
849
+ response = client.chat.completions.create(
850
+ model="meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo",
851
+ messages=[{"role": "user", "content": prompt}],
852
+ temperature=0.8
853
+ )
854
+ return response.choices[0].message.content.strip()
855
+
856
+
857
+ def explain_compliance_gigachat_pro(personalized_message, personalization_prompt):
858
+ prompt = (
859
+ f"Есть инструкция по персонализации: {personalization_prompt}\n"
860
+ "Сообщи, учтены ли данные инструкции в тексте ниже, и укажи как они были учтены:\n"
861
+ f"Текст сообщения: {personalized_message}\n"
862
+ )
863
+ return generate_explanation_gigachat_pro(prompt)
864
+
865
+ def explain_compliance_gigachat_lite(personalized_message, personalization_prompt):
866
+ prompt = (
867
+ f"Есть инструкция по персонализации: {personalization_prompt}\n"
868
+ "Сообщи, учтены ли данные инструкции в тексте ниже, и укажи как они были учтены:\n"
869
+ f"Текст сообщения: {personalized_message}\n"
870
+ )
871
+ return generate_explanation_gigachat_lite(prompt)
872
+
873
+ def explain_compliance_gigachat_plus(personalized_message, personalization_prompt):
874
+ prompt = (
875
+ f"Есть инструкция по персонализации: {personalization_prompt}\n"
876
+ "Сообщи, учтены ли данные инструкции в тексте ниже, и укажи как они были учтены:\n"
877
+ f"Текст сообщения: {personalized_message}\n"
878
+ )
879
+ return generate_explanation_gigachat_plus(prompt)
880
+
881
+ def explain_compliance_gpt4o(personalized_message, personalization_prompt):
882
+ prompt = (
883
+ f"Есть инструкция по персонализации: {personalization_prompt}\n"
884
+ "Сообщи, учтены ли данные инструкции в тексте ниже, и укажи как они были учтены:\n"
885
+ f"Текст сообщения: {personalized_message}\n"
886
+ )
887
+ return generate_explanation_gpt4o(prompt)
888
+
889
+ def explain_compliance_meta_llama_405b(personalized_message, personalization_prompt):
890
+ prompt = (
891
+ f"Есть инструкция по персонализации: {personalization_prompt}\n"
892
+ "Сообщи, учтены ли данные инструкции в тексте ниже, и укажи как они были учтены:\n"
893
+ f"Текст сообщения: {personalized_message}\n"
894
+ )
895
+ return generate_explanation_meta_llama_405b(prompt)
896
+
897
+ def perform_analysis_with_yield(
898
+ gigachat_pro_message,
899
+ gigachat_lite_message,
900
+ gigachat_plus_message,
901
+ gpt4o_message,
902
+ meta_llama_405b_message,
903
+ personalization_prompt
904
+ ):
905
+ # Start yielding results progressively
906
+ gigachat_pro_analysis = explain_compliance_gigachat_pro(gigachat_pro_message, personalization_prompt)
907
+ yield gigachat_pro_analysis, "", "", "", ""
908
+
909
+ gigachat_lite_analysis = explain_compliance_gigachat_lite(gigachat_lite_message, personalization_prompt)
910
+ yield gigachat_pro_analysis, gigachat_lite_analysis, "", "", ""
911
+
912
+ gigachat_plus_analysis = explain_compliance_gigachat_plus(gigachat_plus_message, personalization_prompt)
913
+ yield gigachat_pro_analysis, gigachat_lite_analysis, gigachat_plus_analysis, "", ""
914
+
915
+ gpt4o_analysis = explain_compliance_gpt4o(gpt4o_message, personalization_prompt)
916
+ yield gigachat_pro_analysis, gigachat_lite_analysis, gigachat_plus_analysis, gpt4o_analysis, ""
917
+
918
+ meta_llama_405b_analysis = explain_compliance_meta_llama_405b(meta_llama_405b_message, personalization_prompt)
919
+ yield gigachat_pro_analysis, gigachat_lite_analysis, gigachat_plus_analysis, gpt4o_analysis, meta_llama_405b_analysis
920
+
921
+ # ФУНКЦИИ ПРОВЕРОК (НАЧАЛО)
922
+
923
+ # 1. Запрещенные слова
924
+
925
+ def check_forbidden_words(message):
926
+ morph = pymorphy2.MorphAnalyzer()
927
+
928
+ # Перечень запрещённых слов и фраз
929
+ forbidden_patterns = [
930
+ r'№\s?1\b', r'номер\sодин\b', r'номер\s1\b',
931
+ r'вкусный', r'дешёвый', r'продукт',
932
+ r'спам', r'доступный', r'банкротство', r'долг[и]?', r'займ',
933
+ r'срочный', r'сейчас', r'главный',
934
+ r'гарантия', r'успех', r'лидер'
935
+ ]
936
+
937
+ # Удаляем знаки препинания для корректного анализа
938
+ message_without_punctuation = message.translate(str.maketrans('', '', string.punctuation))
939
+
940
+ # Проверка на наличие подстроки "лучш" (без учета регистра)
941
+ if re.search(r'лучш', message_without_punctuation, re.IGNORECASE):
942
+ return False
943
+
944
+ # Лемматизация слов сообщения
945
+ words = message_without_punctuation.split()
946
+ lemmas = [morph.parse(word)[0].normal_form for word in words]
947
+ normalized_message = ' '.join(lemmas)
948
+
949
+ # Проверка на запрещённые фразы и леммы
950
+ for pattern in forbidden_patterns:
951
+ if re.search(pattern, normalized_message, re.IGNORECASE):
952
+ return False
953
+
954
+ return True
955
+
956
+
957
+ # 2 и #3. Обращение к клиенту и приветствие клиента
958
+
959
+ def check_no_greeting(message):
960
+ morph = pymorphy2.MorphAnalyzer()
961
+ # Список типичных обращений и ��риветствий
962
+ greeting_patterns = [
963
+ r"привет\b", r"здравствуй", r"добрый\s(день|вечер|утро)",
964
+ r"дорогой\b", r"уважаемый\b", r"дорогая\b", r"уважаемая\b",
965
+ r"господин\b", r"госпожа\b", r"друг\b", r"коллега\b",
966
+ r"товарищ\b", r"приятель\b", r"друг\b", r"подруга\b"
967
+ ]
968
+
969
+ # Компилируем все шаблоны в один регулярное выражение
970
+ greeting_regex = re.compile('|'.join(greeting_patterns), re.IGNORECASE)
971
+
972
+ # Проверяем, начинается ли сообщение с шаблона приветствия или обращения
973
+ if greeting_regex.search(message.strip()):
974
+ return False
975
+ return True
976
+
977
+ # 4. Обещания и гарантии
978
+
979
+ def check_no_promises(message):
980
+ morph = pymorphy2.MorphAnalyzer()
981
+ promise_patterns = [
982
+ "обещать", "гарантировать", "обязаться"
983
+ ]
984
+
985
+ words = message.split()
986
+ lemmas = [morph.parse(word)[0].normal_form for word in words]
987
+
988
+ for pattern in promise_patterns:
989
+ if pattern in lemmas:
990
+ return False
991
+ return True
992
+
993
+ # 5. Составные конструкции из двух глаголов
994
+
995
+ def check_no_double_verbs(message):
996
+ morph = pymorphy2.MorphAnalyzer()
997
+ words = message.split()
998
+ morphs = [morph.parse(word)[0] for word in words]
999
+
1000
+ for i in range(len(morphs) - 1):
1001
+ if morphs[i].tag.POS == 'INFN' and morphs[i+1].tag.POS == 'INFN':
1002
+ return False
1003
+ return True
1004
+
1005
+ # 6. Причастия и причастные обороты
1006
+
1007
+ def check_no_participles(message):
1008
+ morph = pymorphy2.MorphAnalyzer()
1009
+ words = message.split()
1010
+ morphs = [morph.parse(word)[0] for word in words]
1011
+
1012
+ for morph in morphs:
1013
+ if 'PRTF' in morph.tag:
1014
+ return False
1015
+ return True
1016
+
1017
+ # 7. Деепричастия и деепричастные обороты
1018
+
1019
+ def check_no_adverbial_participles(message):
1020
+ morph = pymorphy2.MorphAnalyzer()
1021
+ words = message.split()
1022
+ morphs = [morph.parse(word)[0] for word in words]
1023
+
1024
+ for morph in morphs:
1025
+ if 'GRND' in morph.tag:
1026
+ return False
1027
+ return True
1028
+
1029
+ # 8. Превосходная степень прилагательных
1030
+
1031
+ def check_no_superlative_adjectives(message):
1032
+ morph = pymorphy2.MorphAnalyzer()
1033
+ words = message.split()
1034
+ morphs = [morph.parse(word)[0] for word in words]
1035
+
1036
+ for morph in morphs:
1037
+ if 'COMP' in morph.tag or 'Supr' in morph.tag:
1038
+ return False
1039
+ return True
1040
+
1041
+ # 9. Страдательный залог
1042
+
1043
+ def check_no_passive_voice(message):
1044
+ morph = pymorphy2.MorphAnalyzer()
1045
+ words = message.split()
1046
+ morphs = [morph.parse(word)[0] for word in words]
1047
+
1048
+ for morph in morphs:
1049
+ if 'PRTF' in morph.tag and ('passive' in morph.tag or 'в' in morph.tag):
1050
+ return False
1051
+ return True
1052
+
1053
+ # 10. Порядковые числительные от 10 прописью
1054
+
1055
+ def check_no_written_out_ordinals(message):
1056
+ morph = pymorphy2.MorphAnalyzer()
1057
+ ordinal_words = [
1058
+ "десятый", "одиннадцатый", "двенадцатый", "тринадцатый", "четырнадцатый", "пятнадцатый",
1059
+ "шестнадцатый", "семнадцатый", "восемнадцатый", "девятнадцатый", "двадцатый"
1060
+ ]
1061
+
1062
+ words = message.split()
1063
+ lemmas = [morph.parse(word)[0].normal_form for word in words]
1064
+
1065
+ for word in ordinal_words:
1066
+ if word in lemmas:
1067
+ return False
1068
+ return True
1069
+
1070
+ # 11. Цепочки с придаточными предложениями
1071
+
1072
+ def check_no_subordinate_clauses_chain(message):
1073
+ # Регулярное выражение, которое ищет последовательности придаточных предложений
1074
+ subordinate_clause_patterns = [
1075
+ r'\b(который|которая|которое|которые)\b',
1076
+ r'\b(если|потому что|так как|что|когда)\b',
1077
+ r'\b(хотя|несмотря на то что)\b'
1078
+ ]
1079
+
1080
+ count = 0
1081
+ for pattern in subordinate_clause_patterns:
1082
+ if re.search(pattern, message):
1083
+ count += 1
1084
+
1085
+ # Если в предложении найдено более одного придаточного предложения подряд, возвращаем False
1086
+ return count < 2
1087
+
1088
+ # 12. Разделительные повторяющиеся союзы
1089
+
1090
+ def check_no_repeating_conjunctions(message):
1091
+ repeating_conjunctions_patterns = r'\b(и|или|но|также)\s+\1\b'
1092
+
1093
+ if re.search(repeating_conjunctions_patterns, message, re.IGNORECASE):
1094
+ return False
1095
+ return True
1096
+
1097
+ # 13. Вводные конструкции
1098
+
1099
+ def check_no_introductory_phrases(message):
1100
+ introductory_phrases = [
1101
+ r'\b(во-первых|во-вторых|с одной стороны|по сути|по правде говоря)\b',
1102
+ r'\b(может быть|кстати|конечно|естественно|безусловно|возможно)\b'
1103
+ ]
1104
+
1105
+ for pattern in introductory_phrases:
1106
+ if re.search(pattern, message, re.IGNORECASE):
1107
+ return False
1108
+ return True
1109
+
1110
+ # 14. Усилители
1111
+
1112
+ def check_no_amplifiers(message):
1113
+ amplifiers = [
1114
+ r'\b(очень|крайне|чрезвычайно|совсем|абсолютно|полностью|чисто)\b'
1115
+ ]
1116
+
1117
+ for pattern in amplifiers:
1118
+ if re.search(pattern, message, re.IGNORECASE):
1119
+ return False
1120
+ return True
1121
+
1122
+ # 15. Паразиты времени
1123
+
1124
+ def check_no_time_parasites(message):
1125
+ time_parasites = [
1126
+ r'\b(сейчас|немедленно|срочно|в данный момент|теперь)\b'
1127
+ ]
1128
+
1129
+ for pattern in time_parasites:
1130
+ if re.search(pattern, message, re.IGNORECASE):
1131
+ return False
1132
+ return True
1133
+
1134
+ # 16. Несколько существительных подряд
1135
+
1136
+ def check_no_multiple_nouns(message):
1137
+ noun_count = 0
1138
+ words = message.split()
1139
+ morph = pymorphy2.MorphAnalyzer()
1140
+
1141
+ for word in words:
1142
+ parsed_word = morph.parse(word)[0]
1143
+
1144
+ # Если слово — существительное
1145
+ if 'NOUN' in parsed_word.tag:
1146
+ noun_count += 1
1147
+ # Если встречен союз или предлог, обнуляем счетчик
1148
+ elif parsed_word.tag.POS in {'CONJ', 'PREP'}:
1149
+ noun_count = 0
1150
+ else:
1151
+ noun_count = 0
1152
+
1153
+ if noun_count > 2:
1154
+ return False
1155
+ return True
1156
+
1157
+
1158
+ # 17. Производные предлоги
1159
+
1160
+ def check_no_derived_prepositions(message):
1161
+ derived_prepositions = [
1162
+ r'\b(в течение|в ходе|вследствие|в связи с|по мере|при помощи|согласно)\b'
1163
+ ]
1164
+
1165
+ for pattern in derived_prepositions:
1166
+ if re.search(pattern, message, re.IGNORECASE):
1167
+ return False
1168
+ return True
1169
+
1170
+ # 19. Сложноподчиненные предложения
1171
+
1172
+ def check_no_compound_sentences(message):
1173
+ subordinating_conjunctions = [
1174
+ r'\bкогда\b', r'\bкак только\b', r'\bпока\b', r'\bпосле того как\b',
1175
+ r'\bпотому что\b', r'\bтак как\b', r'\bоттого что\b', r'\bблагодаря тому что\b',
1176
+ r'\bчтобы\b', r'\bдля того чтобы\b', r'\bесли\b', r'\bкогда бы\b', r'\bесли бы\b',
1177
+ r'\bхотя\b', r'\bнесмотря на то что\b', r'\bкак\b', r'\bбудто\b', r'\bсловно\b', r'\bкак будто\b',
1178
+ r'\bчто\b'
1179
+ ]
1180
+
1181
+ # Убедимся, что слово "как" используется не в вопросе
1182
+ for pattern in subordinating_conjunctions:
1183
+ if re.search(pattern, message) and not re.search(r'\?', message):
1184
+ return False
1185
+ return True
1186
+
1187
+ # 20. Даты прописью
1188
+
1189
+ def check_no_dates_written_out(message):
1190
+ # Ищем упоминания месяцев или слов, связанных с датами
1191
+ months = [
1192
+ "января", "февраля", "марта", "апреля", "мая", "июня",
1193
+ "июля", "августа", "сентября", "октября", "ноября", "декабря"
1194
+ ]
1195
+
1196
+ # Слова для проверки чисел прописью
1197
+ date_written_out_patterns = [
1198
+ r'\b(первого|второго|третьего|четвертого|пятого|шестого|седьмого|восьмого|девятого|десятого|одиннадцатого|двенадцатого|тринадцатого|четырнадцатого|пятнадцатого|шестнадцатого|семнадцатого|восемнадцатого|девятнадцатого|двадцатого|двадцать первого|двадцать второго|двадцать третьего|двадцать четвертого|двадцать пятого|двадцать шестого|двадцать седьмого|двадцать восьмого|двадцать девятого|тридцатого|тридцать первого)\b'
1199
+ ]
1200
+
1201
+ for month in months:
1202
+ for pattern in date_written_out_patterns:
1203
+ if re.search(f'{pattern}\\s{month}', message, re.IGNORECASE):
1204
+ return False
1205
+
1206
+ return True
1207
+
1208
+ # ФУНКЦИИ ПРОВЕРОК (КОНЕЦ)
1209
+
1210
+ def perform_checks(message):
1211
+ checks = {
1212
+ "forbidden_words": check_forbidden_words(message),
1213
+ "client_addressing": check_no_greeting(message),
1214
+ "promises": check_no_promises(message),
1215
+ "double_verbs": check_no_double_verbs(message),
1216
+ "participles": check_no_participles(message),
1217
+ "adverbial_participles": check_no_adverbial_participles(message),
1218
+ "superlative_adjectives": check_no_superlative_adjectives(message),
1219
+ "passive_voice": check_no_passive_voice(message),
1220
+ "written_out_ordinals": check_no_written_out_ordinals(message),
1221
+ "subordinate_clauses_chain": check_no_subordinate_clauses_chain(message),
1222
+ "repeating_conjunctions": check_no_repeating_conjunctions(message),
1223
+ "introductory_phrases": check_no_introductory_phrases(message),
1224
+ "amplifiers": check_no_amplifiers(message),
1225
+ "time_parasites": check_no_time_parasites(message),
1226
+ "multiple_nouns": check_no_multiple_nouns(message),
1227
+ "derived_prepositions": check_no_derived_prepositions(message),
1228
+ "compound_sentences": check_no_compound_sentences(message),
1229
+ "dates_written_out": check_no_dates_written_out(message)
1230
+ }
1231
+ return checks
1232
+
1233
+
1234
+ def format_checks(checks):
1235
+ translation = {
1236
+ "forbidden_words": "Запрещенные слова",
1237
+ "client_addressing": "Обращение к клиенту",
1238
+ "promises": "Обещания и гарантии",
1239
+ "double_verbs": "Два глагола подряд",
1240
+ "participles": "Причастия",
1241
+ "adverbial_participles": "Деепричастия",
1242
+ "superlative_adjectives": "Превосходная степень",
1243
+ "passive_voice": "Страдательный залог",
1244
+ "written_out_ordinals": "Порядковые числительные",
1245
+ "subordinate_clauses_chain": "Цепочки с придаточными предложениями",
1246
+ "repeating_conjunctions": "Разделительные повторяющиеся союзы",
1247
+ "introductory_phrases": "Вводные конструкции",
1248
+ "amplifiers": "Усилители",
1249
+ "time_parasites": "Паразиты времени",
1250
+ "multiple_nouns": "Несколько существительных подряд",
1251
+ "derived_prepositions": "Производные предлоги",
1252
+ "compound_sentences": "Сложноподчиненные предложения",
1253
+ "dates_written_out": "Даты прописью"
1254
+ }
1255
+ return " \n".join([f"{translation[rule]}: {'✔️' if result else '❌'}" for rule, result in checks.items()])
1256
 
1257
 
1258
  # Создание интерфейса Gradio
 
1274
  "4. В течение следующего месяца пользоваться ей бесплатно."
1275
  )
1276
  )
1277
+
1278
  advantages_input = gr.Textbox(
1279
  label="Преимущества (предзаполненный пример можно поменять на свой)",
1280
  lines=6,
 
1306
  selections.append(gr.Dropdown(choices=[None] + list(features[feature].keys()), label=f"Выберите {feature}"))
1307
 
1308
  with gr.Column(scale=2):
1309
+ prompt_display = gr.Textbox(
1310
+ label="Неперсонализированный промпт",
1311
+ lines=41,
1312
+ value=(
1313
+ "Сгенерируй смс-сообщение для клиента. Начни сообщение с призыва к действию с продуктом.\n"
1314
+ "Описание предложения: "
1315
+ "Необходимо предложить клиенту оформить дебетовую премиальную бизнес-карту Mastercard Preffered. "
1316
+ "Обслуживание карты стоит 700 рублей в месяц, но клиент может пользоваться ей бесплатно. "
1317
+ "Что необходимо сделать, чтобы воспользоваться предложением:\n"
1318
+ "1. Оформить премиальную бизнес-карту в офисе банка или онлайн в интернет-банке СберБизнес.\n"
1319
+ "2. Забрать карту.\n"
1320
+ "3. В течение календарного месяца совершить по ней покупки на сумму от 100 000 рублей.\n"
1321
+ "4. В течение следующего месяца пользоваться ей бесплатно. \n "
1322
+ "Преимущества: "
1323
+ "Предложение по бесплатному обслуживанию — бессрочное.\n"
1324
+ "Оплата покупок без отчётов и платёжных поручений.\n"
1325
+ "Платёжные документы без комиссии.\n"
1326
+ "Лимиты на расходы сотрудников.\n"
1327
+ "Мгновенные переводы на карты любых банков.\n "
1328
+ "В тексте смс запрещено использование:\n"
1329
+ "- Запрещенные слова: № один, номер один, № 1, вкусный, дешёвый, продукт, спам, доступный, банкротство, долги, займ, срочно, сейчас, лучший, главный, номер 1, гарантия, успех, лидер;\n"
1330
+ "- Обращение к клиенту;\n"
1331
+ "- Приветствие клиента;\n"
1332
+ "- Обещания и гарантии;\n"
1333
+ "- Использовать составные конструкции из двух глаголов;\n"
1334
+ "- Причастия и причастные обороты;\n"
1335
+ "- Деепричастия и деепричастные обороты;\n"
1336
+ "- Превосходная степень прилагательных;\n"
1337
+ "- Страдательный залог;\n"
1338
+ "- Порядковые числительные от 10 прописью;\n"
1339
+ "- Цепочки с придаточными предложениями;\n"
1340
+ "- Разделительные повторяющиеся союзы;\n"
1341
+ "- Вводные конструкции;\n"
1342
+ "- Усилители;\n"
1343
+ "- Паразиты времени;\n"
1344
+ "- Несколько существительных подряд, в том числе отглагольных;\n"
1345
+ "- Производные предлоги;\n"
1346
+ "- Сложные предложения, в которых нет связи между частями;\n"
1347
+ "- Сложноподчинённые предложения;\n"
1348
+ "- Даты прописью;\n"
1349
+ "- Близкие по смыслу однородные члены предложения;\n"
1350
+ "- Шокирующие, экстравагантные, кликбейтные фразы;\n"
1351
+ "- Абстрактные заявления без поддержки фактами и отсутствие доказательства пользы для клиента;\n"
1352
+ "- Гарантирующие фразы;\n"
1353
+ "- Узкоспециализированные термины;\n"
1354
+ "- Фразы, способные создать двойственное ощущение, обидеть;\n"
1355
+ "- Речевые клише, рекламные штампы, канцеляризмы;\n"
1356
+ "Убедись, что в готовом тексте до 250 знаков с пробелами.\n"
1357
+ "Убедись, что готовый текст начинается с призыва к действию с продуктом.\n"
1358
+ "Убедись, что в готовом тексте есть следующая ключевая информация: Бесплатное обслуживание при покупках от 100 000 рублей в месяц."
1359
+ ),
1360
+ interactive=False)
1361
  personalization_prompt = gr.Textbox(label="Персонализированный промпт", lines=23, interactive=False)
1362
 
1363
  with gr.Row():
 
1377
 
1378
  # Первый ряд: неперсонализированные сообщения
1379
  with gr.Row():
1380
+ output_text_gigachat_pro = gr.Textbox(label="Неперсонализированное сообщение 1", lines=3, interactive=False)
1381
+ output_text_gigachat_lite = gr.Textbox(label="Неперсонализированное соо��щение 2", lines=3, interactive=False)
1382
+ output_text_gigachat_plus = gr.Textbox(label="Неперсонализированное сообщение 3", lines=3, interactive=False)
1383
+ output_text_gpt4o = gr.Textbox(label="Неперсонализированное сообщение 4", lines=3, interactive=False)
1384
+ output_text_meta_llama_405b = gr.Textbox(label="Неперсонализированное сообщение 5", lines=3, interactive=False)
1385
 
1386
  # Ряд кнопок "Персонализировать"
1387
  with gr.Row():
 
1393
 
1394
  # Второй ряд: персонализированные сообщения
1395
  with gr.Row():
1396
+ personalized_output_text_gigachat_pro = gr.Textbox(label="Персонализированное сообщение 1", lines=3, interactive=False)
1397
+ personalized_output_text_gigachat_lite = gr.Textbox(label="Персонализированное сообщение 2", lines=3, interactive=False)
1398
+ personalized_output_text_gigachat_plus = gr.Textbox(label="Персонализированное сообщение 3", lines=3, interactive=False)
1399
+ personalized_output_text_gpt4o = gr.Textbox(label="Персонализированное сообщение 4", lines=3, interactive=False)
1400
+ personalized_output_text_meta_llama_405b = gr.Textbox(label="Персонализированное сообщение 5", lines=3, interactive=False)
1401
 
1402
  # Третий ряд: комментарии
1403
  with gr.Row():
1404
+ comment_gigachat_pro = gr.Textbox(label="Комментарий к сообщению 1", lines=3)
1405
+ comment_gigachat_lite = gr.Textbox(label="Комментарий к сообщению 2", lines=3)
1406
+ comment_gigachat_plus = gr.Textbox(label="Комментарий к сообщению 3", lines=3)
1407
+ comment_gpt4o = gr.Textbox(label="Комментарий к сообщению 4", lines=3)
1408
+ comment_meta_llama_405b = gr.Textbox(label="Комментарий к сообщению 5", lines=3)
1409
 
1410
  # Четвертый ряд: откорректированные сообщения
1411
  with gr.Row():
1412
+ corrected_gigachat_pro = gr.Textbox(label="Откорректированное сообщение 1", lines=3)
1413
+ corrected_gigachat_lite = gr.Textbox(label="Откорректированное сообщение 2", lines=3)
1414
+ corrected_gigachat_plus = gr.Textbox(label="Откорректированное сообщение 3", lines=3)
1415
+ corrected_gpt4o = gr.Textbox(label="Откорректированное сообщение 4", lines=3)
1416
+ corrected_meta_llama_405b = gr.Textbox(label="Откорректированное сообщение 5", lines=3)
1417
 
1418
  # Пятый ряд: кнопки сохранения
1419
  with gr.Row():
 
1422
  save_gigachat_plus_btn = gr.Button("Сохранить в базу")
1423
  save_gpt4o_btn = gr.Button("Сохранить в базу")
1424
  save_meta_llama_405b_btn = gr.Button("Сохранить в базу")
1425
+
1426
+ gr.Markdown("---")
1427
+
1428
+ with gr.Row():
1429
+ validation_display_1 = gr.Markdown()
1430
+ validation_display_2 = gr.Markdown()
1431
+ validation_display_3 = gr.Markdown()
1432
+ validation_display_4 = gr.Markdown()
1433
+ validation_display_5 = gr.Markdown()
1434
+
1435
+ gr.Markdown("---")
1436
+
1437
+ # Очистка всех полей кроме prompt_display
1438
+ description_input.change(
1439
+ fn=clear_on_change, # Сначала вызываем функцию очистки полей
1440
+ inputs=[],
1441
+ outputs=[
1442
+ output_text_gigachat_pro,
1443
+ output_text_gigachat_lite,
1444
+ output_text_gigachat_plus,
1445
+ output_text_gpt4o,
1446
+ output_text_meta_llama_405b,
1447
+ personalized_output_text_gigachat_pro,
1448
+ personalized_output_text_gigachat_lite,
1449
+ personalized_output_text_gigachat_plus,
1450
+ personalized_output_text_gpt4o,
1451
+ personalized_output_text_meta_llama_405b,
1452
+ comment_gigachat_pro,
1453
+ corrected_gigachat_pro,
1454
+ comment_gigachat_lite,
1455
+ corrected_gigachat_lite,
1456
+ comment_gigachat_plus,
1457
+ corrected_gigachat_plus,
1458
+ comment_gpt4o,
1459
+ corrected_gpt4o,
1460
+ comment_meta_llama_405b,
1461
+ corrected_meta_llama_405b,
1462
+ validation_display_1,
1463
+ validation_display_2,
1464
+ validation_display_3,
1465
+ validation_display_4,
1466
+ validation_display_5
1467
+ ]
1468
+ ).then(
1469
+ fn=generate_standard_prompt, # После очистки вызываем функцию для обновления промпта
1470
+ inputs=[description_input, advantages_input, key_message_input, approach_input] + selections,
1471
+ outputs=prompt_display # Мгновенно обновляем поле неперсонализированного промпта
1472
+ )
1473
+
1474
+ # Очистка всех полей кроме prompt_display
1475
+ advantages_input.change(
1476
+ fn=clear_on_change, # Сначала вызываем функцию очистки полей
1477
+ inputs=[],
1478
+ outputs=[
1479
+ output_text_gigachat_pro,
1480
+ output_text_gigachat_lite,
1481
+ output_text_gigachat_plus,
1482
+ output_text_gpt4o,
1483
+ output_text_meta_llama_405b,
1484
+ personalized_output_text_gigachat_pro,
1485
+ personalized_output_text_gigachat_lite,
1486
+ personalized_output_text_gigachat_plus,
1487
+ personalized_output_text_gpt4o,
1488
+ personalized_output_text_meta_llama_405b,
1489
+ comment_gigachat_pro,
1490
+ corrected_gigachat_pro,
1491
+ comment_gigachat_lite,
1492
+ corrected_gigachat_lite,
1493
+ comment_gigachat_plus,
1494
+ corrected_gigachat_plus,
1495
+ comment_gpt4o,
1496
+ corrected_gpt4o,
1497
+ comment_meta_llama_405b,
1498
+ corrected_meta_llama_405b,
1499
+ validation_display_1,
1500
+ validation_display_2,
1501
+ validation_display_3,
1502
+ validation_display_4,
1503
+ validation_display_5
1504
+ ]
1505
+ ).then(
1506
+ fn=generate_standard_prompt, # После очистки вызываем функцию для обновления промпта
1507
+ inputs=[description_input, advantages_input, key_message_input, approach_input] + selections,
1508
+ outputs=prompt_display # Мгновенно обновляем поле неперсонализированного промпта
1509
+ )
1510
+
1511
+ # Очистка всех полей кроме prompt_display
1512
+ key_message_input.change(
1513
+ fn=clear_on_change, # Сначала вызываем функцию очистки полей
1514
+ inputs=[],
1515
+ outputs=[
1516
+ output_text_gigachat_pro,
1517
+ output_text_gigachat_lite,
1518
+ output_text_gigachat_plus,
1519
+ output_text_gpt4o,
1520
+ output_text_meta_llama_405b,
1521
+ personalized_output_text_gigachat_pro,
1522
+ personalized_output_text_gigachat_lite,
1523
+ personalized_output_text_gigachat_plus,
1524
+ personalized_output_text_gpt4o,
1525
+ personalized_output_text_meta_llama_405b,
1526
+ comment_gigachat_pro,
1527
+ corrected_gigachat_pro,
1528
+ comment_gigachat_lite,
1529
+ corrected_gigachat_lite,
1530
+ comment_gigachat_plus,
1531
+ corrected_gigachat_plus,
1532
+ comment_gpt4o,
1533
+ corrected_gpt4o,
1534
+ comment_meta_llama_405b,
1535
+ corrected_meta_llama_405b,
1536
+ validation_display_1,
1537
+ validation_display_2,
1538
+ validation_display_3,
1539
+ validation_display_4,
1540
+ validation_display_5
1541
+ ]
1542
+ ).then(
1543
+ fn=generate_standard_prompt, # После очистки вы��ываем функцию для обновления промпта
1544
+ inputs=[description_input, advantages_input, key_message_input, approach_input] + selections,
1545
+ outputs=prompt_display # Мгновенно обновляем поле неперсонализированного промпта
1546
+ )
1547
+
1548
+ # Очистка всех полей кроме prompt_display
1549
+ approach_input.change(
1550
+ fn=clear_on_change, # Сначала вызываем функцию очистки полей
1551
+ inputs=[],
1552
+ outputs=[
1553
+ output_text_gigachat_pro,
1554
+ output_text_gigachat_lite,
1555
+ output_text_gigachat_plus,
1556
+ output_text_gpt4o,
1557
+ output_text_meta_llama_405b,
1558
+ personalized_output_text_gigachat_pro,
1559
+ personalized_output_text_gigachat_lite,
1560
+ personalized_output_text_gigachat_plus,
1561
+ personalized_output_text_gpt4o,
1562
+ personalized_output_text_meta_llama_405b,
1563
+ comment_gigachat_pro,
1564
+ corrected_gigachat_pro,
1565
+ comment_gigachat_lite,
1566
+ corrected_gigachat_lite,
1567
+ comment_gigachat_plus,
1568
+ corrected_gigachat_plus,
1569
+ comment_gpt4o,
1570
+ corrected_gpt4o,
1571
+ comment_meta_llama_405b,
1572
+ corrected_meta_llama_405b,
1573
+ validation_display_1,
1574
+ validation_display_2,
1575
+ validation_display_3,
1576
+ validation_display_4,
1577
+ validation_display_5
1578
+ ]
1579
+ ).then(
1580
+ fn=generate_standard_prompt, # После очистки вызываем функцию для обновления промпта
1581
+ inputs=[description_input, advantages_input, key_message_input, approach_input] + selections,
1582
+ outputs=prompt_display # Мгновенно обновляем поле неперсонализированного промпта
1583
+ ).then(
1584
+ fn=generate_personalization_prompt, # Вызываем генерацию персонализированного промпта после изменения
1585
+ inputs=[key_message_input, approach_input] + selections, # Передаем все нужные параметры
1586
+ outputs=personalization_prompt # Обновляем поле с персонализированным промптом
1587
+ )
1588
+
1589
+
1590
+ # Добавляем обработчики для каждого поля в selections
1591
+ for selection in selections:
1592
+ # Очищаем все персонализированные сообщения и результаты проверок
1593
+ selection.change(
1594
+ fn=clear_on_change_pers,
1595
+ inputs=[],
1596
+ outputs=[
1597
+ personalized_output_text_gigachat_pro,
1598
+ personalized_output_text_gigachat_lite,
1599
+ personalized_output_text_gigachat_plus,
1600
+ personalized_output_text_gpt4o,
1601
+ personalized_output_text_meta_llama_405b,
1602
+ comment_gigachat_pro,
1603
+ corrected_gigachat_pro,
1604
+ comment_gigachat_lite,
1605
+ corrected_gigachat_lite,
1606
+ comment_gigachat_plus,
1607
+ corrected_gigachat_plus,
1608
+ comment_gpt4o,
1609
+ corrected_gpt4o,
1610
+ comment_meta_llama_405b,
1611
+ corrected_meta_llama_405b,
1612
+ validation_display_1,
1613
+ validation_display_2,
1614
+ validation_display_3,
1615
+ validation_display_4,
1616
+ validation_display_5
1617
+ ]
1618
+ ).then(
1619
+ fn=generate_personalization_prompt, # Вызываем генерацию персонализированного промпта после изменения
1620
+ inputs=[key_message_input, approach_input] + selections, # Передаем все нужные параметры
1621
+ outputs=personalization_prompt # Обновляем поле с персонализированным промптом
1622
+ )
1623
+
1624
+
1625
+ # analyze_btn = gr.Button("Выполнить анализ персонализации (экспериментальная фича)")
1626
+
1627
+ # with gr.Row():
1628
+ # analysis_gigachat_pro = gr.Textbox(label="Анализ персонализации сообщения 1", lines=4, interactive=False)
1629
+ # analysis_gigachat_lite = gr.Textbox(label="Анализ персонализации сообщения 2", lines=4, interactive=False)
1630
+ # analysis_gigachat_plus = gr.Textbox(label="Анализ персонализации сообщения 3", lines=4, interactive=False)
1631
+ # analysis_gpt4o = gr.Textbox(label="Анализ персонализации сообщения 4", lines=4, interactive=False)
1632
+ # analysis_meta_llama_405b = gr.Textbox(label="Анализ персонализации сообщения 5", lines=4, interactive=False)
1633
+
1634
 
 
1635
  # Добавление функционала для кно��ок
1636
  submit_btn.click(
1637
  clear_fields,
1638
  inputs=[],
1639
  outputs=[
 
1640
  personalized_output_text_gigachat_pro,
1641
  personalized_output_text_gigachat_lite,
1642
  personalized_output_text_gigachat_plus,
 
1651
  comment_gpt4o,
1652
  corrected_gpt4o,
1653
  comment_meta_llama_405b,
1654
+ corrected_meta_llama_405b,
1655
+ validation_display_1, # Очистка результатов проверок
1656
+ validation_display_2,
1657
+ validation_display_3,
1658
+ validation_display_4,
1659
+ validation_display_5
1660
  ]
1661
  )
1662
 
 
1698
 
1699
  personalize_btn.click(
1700
  fn=personalize_and_save,
1701
+ inputs=[
1702
  output_text_gigachat_pro,
1703
  output_text_gigachat_lite,
1704
  output_text_gigachat_plus,
 
1706
  output_text_meta_llama_405b,
1707
  description_input,
1708
  advantages_input,
1709
+ key_message_input,
1710
+ approach_input,
1711
  ] + selections,
1712
  outputs=[
1713
  personalization_prompt,
 
1715
  personalized_output_text_gigachat_lite,
1716
  personalized_output_text_gigachat_plus,
1717
  personalized_output_text_gpt4o,
1718
+ personalized_output_text_meta_llama_405b,
1719
+ validation_display_1,
1720
+ validation_display_2,
1721
+ validation_display_3,
1722
+ validation_display_4,
1723
+ validation_display_5,
1724
  ]
1725
  )
1726
 
1727
+
1728
  # Обработка клика по кнопке восстановления
1729
  load_btn.click(
1730
  fn=lambda: load_previous_user_request_from_github(),
 
1761
  comment_gpt4o,
1762
  corrected_gpt4o,
1763
  comment_meta_llama_405b,
1764
+ corrected_meta_llama_405b,
1765
+ validation_display_1, # Очистка результатов проверок
1766
+ validation_display_2,
1767
+ validation_display_3,
1768
+ validation_display_4,
1769
+ validation_display_5
1770
  ]
1771
+ ).then(
1772
+ fn=generate_standard_prompt, # Генерация неперсонализированного промпта на основе загруженных данных
1773
+ inputs=[description_input, advantages_input, key_message_input, approach_input] + selections,
1774
+ outputs=prompt_display # Обновляем поле с неперсонализированным промптом
1775
+ ).then(
1776
+ fn=generate_personalization_prompt, # Генерация персонализированного промпта
1777
+ inputs=[key_message_input, approach_input] + selections,
1778
+ outputs=personalization_prompt # Обновляем поле с персонализированным промптом
1779
  )
1780
 
1781
+
1782
  regen_gigachat_pro_btn.click(
1783
+ fn=lambda: ("", ""), # Очищаем текст персонализированного сообщения и проверку
1784
+ inputs=[],
1785
+ outputs=[personalized_output_text_gigachat_pro, validation_display_1]
1786
+ ).then(
1787
+ fn=regen_message_gigachat_pro,
1788
  inputs=[description_input, advantages_input, key_message_input, approach_input] + selections,
1789
  outputs=output_text_gigachat_pro
1790
  )
1791
+
1792
+
1793
  regen_gigachat_lite_btn.click(
1794
+ fn=lambda: ("", ""), # Очищаем текст персонализированного сообщения и проверку
1795
+ inputs=[],
1796
+ outputs=[personalized_output_text_gigachat_lite, validation_display_2]
1797
+ ).then(
1798
+ fn=regen_message_gigachat_lite,
1799
  inputs=[description_input, advantages_input, key_message_input, approach_input] + selections,
1800
  outputs=output_text_gigachat_lite
1801
  )
1802
+
1803
  regen_gigachat_plus_btn.click(
1804
+ fn=lambda: ("", ""), # Очищаем текст персонализированного сообщения и проверку
1805
+ inputs=[],
1806
+ outputs=[personalized_output_text_gigachat_plus, validation_display_3]
1807
+ ).then(
1808
+ fn=regen_message_gigachat_plus,
1809
  inputs=[description_input, advantages_input, key_message_input, approach_input] + selections,
1810
  outputs=output_text_gigachat_plus
1811
  )
1812
 
1813
  regen_gpt4o_btn.click(
1814
+ fn=lambda: ("", ""), # Очищаем текст персонализированного сообщения и прове��ку
1815
+ inputs=[],
1816
+ outputs=[personalized_output_text_gpt4o, validation_display_4]
1817
+ ).then(
1818
+ fn=regen_message_gpt4o,
1819
  inputs=[description_input, advantages_input, key_message_input, approach_input] + selections,
1820
  outputs=output_text_gpt4o
1821
  )
1822
+
1823
  regen_meta_llama_405b_btn.click(
1824
+ fn=lambda: ("", ""), # Очищаем текст персонализированного сообщения и проверку
1825
+ inputs=[],
1826
+ outputs=[personalized_output_text_meta_llama_405b, validation_display_5]
1827
+ ).then(
1828
+ fn=regen_message_meta_llama_405b,
1829
  inputs=[description_input, advantages_input, key_message_input, approach_input] + selections,
1830
  outputs=output_text_meta_llama_405b
1831
  )
 
1833
  personalize_gigachat_pro_btn.click(
1834
  personalize_message_gigachat_pro,
1835
  inputs=[output_text_gigachat_pro, key_message_input, approach_input] + selections,
1836
+ outputs=[personalized_output_text_gigachat_pro, validation_display_1]
1837
+ ).then(
1838
+ fn=generate_personalization_prompt, # Вызов генерации промпта
1839
+ inputs=[key_message_input, approach_input] + selections, # Передача нужных данных
1840
+ outputs=personalization_prompt # Вывод в поле с промптом
1841
  )
1842
+
1843
  personalize_gigachat_lite_btn.click(
1844
  personalize_message_gigachat_lite,
1845
  inputs=[output_text_gigachat_lite, key_message_input, approach_input] + selections,
1846
+ outputs=[personalized_output_text_gigachat_lite, validation_display_2] # Поле для проверки
1847
+ ).then(
1848
+ fn=generate_personalization_prompt, # Вызов генерации промпта
1849
+ inputs=[key_message_input, approach_input] + selections, # Передача нужных данных
1850
+ outputs=personalization_prompt # Вывод в поле с промптом
1851
  )
1852
+
1853
  personalize_gigachat_plus_btn.click(
1854
  personalize_message_gigachat_plus,
1855
  inputs=[output_text_gigachat_plus, key_message_input, approach_input] + selections,
1856
+ outputs=[personalized_output_text_gigachat_plus, validation_display_3] # Добавляем результат проверки
1857
+ ).then(
1858
+ fn=generate_personalization_prompt, # Вызов генерации промпта
1859
+ inputs=[key_message_input, approach_input] + selections, # Передача нужных данных
1860
+ outputs=personalization_prompt # Вывод в поле с промптом
1861
  )
1862
+
1863
  personalize_gpt4o_btn.click(
1864
  personalize_message_gpt4o,
1865
  inputs=[output_text_gpt4o, key_message_input, approach_input] + selections,
1866
+ outputs=[personalized_output_text_gpt4o, validation_display_4] # Добавляем результат проверки
1867
+ ).then(
1868
+ fn=generate_personalization_prompt, # Вызов генерации промпта
1869
+ inputs=[key_message_input, approach_input] + selections, # Передача нужных данных
1870
+ outputs=personalization_prompt # Вывод в поле с промптом
1871
  )
1872
 
1873
  personalize_meta_llama_405b_btn.click(
1874
  personalize_message_meta_llama_405b,
1875
  inputs=[output_text_meta_llama_405b, key_message_input, approach_input] + selections,
1876
+ outputs=[personalized_output_text_meta_llama_405b, validation_display_5] # Добавляем результат проверки
1877
+ ).then(
1878
+ fn=generate_personalization_prompt, # Вызов генерации промпта
1879
+ inputs=[key_message_input, approach_input] + selections, # Передача нужных данных
1880
+ outputs=personalization_prompt # Вывод в поле с промптом
1881
  )
1882
 
1883
+
1884
  # Привязка кнопок к функциям сохранения
1885
  save_gigachat_pro_btn.click(
1886
  fn=prepare_button_text,
 
2053
  fn=reset_button_text,
2054
  outputs=[save_meta_llama_405b_btn]
2055
  )
2056
+
2057
+ # Обработчик нажатия кнопки
2058
+ # analyze_btn.click(
2059
+ # fn=perform_analysis_with_yield,
2060
+ # inputs=[
2061
+ # output_text_gigachat_pro,
2062
+ # output_text_gigachat_lite,
2063
+ # output_text_gigachat_plus,
2064
+ # output_text_gpt4o,
2065
+ # output_text_meta_llama_405b,
2066
+ # personalization_prompt
2067
+ # ],
2068
+ # outputs=[
2069
+ # analysis_gigachat_pro,
2070
+ # analysis_gigachat_lite,
2071
+ # analysis_gigachat_plus,
2072
+ # analysis_gpt4o,
2073
+ # analysis_meta_llama_405b
2074
+ # ]
2075
+ # )
2076
+
2077
 
2078
  demo.launch()