fruitpicker01 commited on
Commit
4469aa0
1 Parent(s): 29f48d8

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +76 -29
app.py CHANGED
@@ -96,22 +96,63 @@ def replace_k_with_thousands(message):
96
  message = re.sub(r'(\d+)[kкКK]', r'\1 000', message, flags=re.IGNORECASE)
97
  return message
98
 
99
- # Функция для повторной генерации сообщения, пока оно не станет короче 250 знаков и не меньше 190 знаков
100
- # Добавляем проверку в функцию перегенерации
101
- # Функция для повторной генерации сообщения с выводом номера попытки через Gradio Alerts
102
- # Функция для повторной генерации сообщения с выводом номера попытки через Gradio Alerts
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
103
  def generate_message_gigachat_pro_with_retry(prompt):
104
  last_message = None # Храним последнее сообщение
105
 
106
  for attempt in range(10):
107
- # Информация о начале новой попытки
108
- if attempt > 0: # Показываем новое уведомление только после первой попытки
109
- time.sleep(1) # Ждем, чтобы старое уведомление успело исчезнуть
110
- gr.Info(f"Попытка {attempt + 1}: генерируется сообщение...")
111
 
 
112
  message = generate_message_gigachat_pro(prompt)
113
  message_length = len(message)
114
 
 
 
 
 
 
 
115
  # Выполняем замены и проверки
116
  message = replace_k_with_thousands(message)
117
  checks = perform_checks(message)
@@ -119,16 +160,17 @@ def generate_message_gigachat_pro_with_retry(prompt):
119
  # Обновляем последнее сообщение
120
  last_message = message
121
 
122
- if 190 <= message_length <= 250:
123
- # Успешная генерация сообщения
124
  return message
125
 
126
- # Предупреждение, что сообщение не прошло проверку
127
- gr.Warning(f"Попытка {attempt + 1}: сообщение не прошло проверку, пробуем снова...")
128
- time.sleep(1) # Добавляем небольшую паузу между попытками
129
 
130
- # Сообщаем, что возвращаем последнее сгенерированное сообщение после 10 попыток
131
- gr.Info("Не удалось сгенерировать сообщение, соответствующее требованиям, за 10 попыток. Возвращаем последнее сгенерированное сообщение.")
 
 
132
  return last_message
133
 
134
 
@@ -240,7 +282,6 @@ def clean_prompt_for_display(prompt, prefixes, suffixes):
240
 
241
  return cleaned_prompt.strip()
242
 
243
- # Функция для постепенной генерации всех сообщений через yield
244
  # Функция для постепенной генерации всех сообщений через yield
245
  def generate_all_messages(desc, benefits, key_message, gender, generation, psychotype, business_stage, industry, opf):
246
  # Генерация задания для копирайтера
@@ -262,8 +303,16 @@ def generate_all_messages(desc, benefits, key_message, gender, generation, psych
262
  non_personalized_messages = []
263
  personalized_messages = []
264
 
265
- # Генерация задания для редактора отдельно перед генерацией сообщений
266
  for i in range(3):
 
 
 
 
 
 
 
 
267
  personalization_prompt = generate_personalization_prompt(
268
  key_message, gender, generation, psychotype, business_stage, industry, opf,
269
  prefix=prefixes[i], suffix=suffixes[i]
@@ -272,19 +321,17 @@ def generate_all_messages(desc, benefits, key_message, gender, generation, psych
272
  # Удаляем префиксы, суффиксы и пустые строки перед выводом на экран
273
  display_personalization_prompt = clean_prompt_for_display(personalization_prompt, prefixes, suffixes)
274
 
275
- # Сначала отображаем задание для редактора
276
  yield (
277
  standard_prompt, display_personalization_prompt, # Задание для редактора без префиксов, суффиксов и пустых строк
278
- None, None, None, None, None, None # Сообщения еще не сгенерированы
 
 
 
 
 
279
  )
280
 
281
- # Генерация неперсонализированного сообщения
282
- prompt = add_prefix_suffix(standard_prompt, prefixes[i], suffixes[i])
283
- non_personalized_message = generate_message_gigachat_pro_with_retry(prompt)
284
- non_personalized_length = len(non_personalized_message)
285
- non_personalized_display = f"{non_personalized_message}\n------\nКоличество знаков: {non_personalized_length}"
286
- non_personalized_messages.append(non_personalized_display)
287
-
288
  # Генерация персонализированного сообщения
289
  full_personalized_prompt = f"{personalization_prompt}\n\nТекст для адаптации: {non_personalized_message}"
290
  personalized_message = generate_message_gigachat_pro_with_retry(full_personalized_prompt)
@@ -295,11 +342,11 @@ def generate_all_messages(desc, benefits, key_message, gender, generation, psych
295
  # Выводим персонализированное сообщение
296
  yield (
297
  standard_prompt, display_personalization_prompt, # Задание для редактора без префиксов, суффиксов и пустых строк
298
- non_personalized_messages[0] if i >= 0 else None,
299
  personalized_messages[0] if len(personalized_messages) > 0 else None,
300
- non_personalized_messages[1] if i >= 1 else None,
301
  personalized_messages[1] if len(personalized_messages) > 1 else None,
302
- non_personalized_messages[2] if i >= 2 else None,
303
  personalized_messages[2] if len(personalized_messages) > 2 else None
304
  )
305
 
 
96
  message = re.sub(r'(\d+)[kкКK]', r'\1 000', message, flags=re.IGNORECASE)
97
  return message
98
 
99
+ # Функция для добавления ошибок в промпт для перегенерации
100
+ def append_errors_to_prompt(prompt, checks):
101
+ errors = []
102
+
103
+ if not checks["forbidden_words"]:
104
+ errors.append("Не использовать запрещённые слова.")
105
+ if not checks["client_addressing"]:
106
+ errors.append("Не обращаться к клиенту напрямую.")
107
+ if not checks["promises"]:
108
+ errors.append("Не давать обещания и гарантии.")
109
+ if not checks["double_verbs"]:
110
+ errors.append("Не использовать составные конструкции из двух глаголов.")
111
+ if not checks["participles"]:
112
+ errors.append("Не использовать причастия.")
113
+ if not checks["adverbial_participles"]:
114
+ errors.append("Не использовать деепричастия.")
115
+
116
+ # Добавляем ошибки в конец промпта
117
+ if errors:
118
+ error_instructions = "Следующие ошибки необходимо избежать:\n" + "\n".join(errors)
119
+ prompt += f"\n\n{error_instructions}"
120
+
121
+ return prompt
122
+
123
+ def notify_failed_length(message_length):
124
+ if message_length < 190:
125
+ gr.Warning(f"Сообщение слишком короткое: {message_length} знаков. Минимум 190.")
126
+ return False
127
+ elif message_length > 250:
128
+ gr.Warning(f"Сообщение слишком длинное: {message_length} знаков. Максимум 250.")
129
+ return False
130
+ return True
131
+
132
+ # Функция для уведомления о непройденных проверках
133
+ def notify_failed_checks(checks):
134
+ failed_checks = [rule for rule, passed in checks.items() if not passed]
135
+ if failed_checks:
136
+ gr.Warning(f"Сообщение не прошло следующие проверки: {', '.join(failed_checks)}")
137
+
138
+ # Модифицированная функция перегенерации сообщений с уведомлениями о номере попытки
139
  def generate_message_gigachat_pro_with_retry(prompt):
140
  last_message = None # Храним последнее сообщение
141
 
142
  for attempt in range(10):
143
+ # Уведомление о текущей попытке
144
+ gr.Info(f"Итерация {attempt + 1}: генерируется сообщение...")
 
 
145
 
146
+ # Генерация сообщения
147
  message = generate_message_gigachat_pro(prompt)
148
  message_length = len(message)
149
 
150
+ # Проверка длины сообщения. Если не проходит, сразу перегенерируем
151
+ if not notify_failed_length(message_length):
152
+ last_message = message # Обновляем последнее сообщение
153
+ time.sleep(1) # Пауза перед следующей попыткой
154
+ continue
155
+
156
  # Выполняем замены и проверки
157
  message = replace_k_with_thousands(message)
158
  checks = perform_checks(message)
 
160
  # Обновляем последнее сообщение
161
  last_message = message
162
 
163
+ # Если сообщение прошло все проверки
164
+ if all(checks.values()):
165
  return message
166
 
167
+ # Если есть ошибки, уведомляем о непройденных проверках
168
+ notify_failed_checks(checks)
 
169
 
170
+ time.sleep(1) # Пауза перед следующей попыткой
171
+
172
+ # Возвращаем последнее сообщение после 10 попыток
173
+ gr.Info("Не удалось сгенерировать сообщение, соответствующее требованиям, за 10 итераций. Возвращаем последнее сгенерированное сообщение.")
174
  return last_message
175
 
176
 
 
282
 
283
  return cleaned_prompt.strip()
284
 
 
285
  # Функция для постепенной генерации всех сообщений через yield
286
  def generate_all_messages(desc, benefits, key_message, gender, generation, psychotype, business_stage, industry, opf):
287
  # Генерация задания для копирайтера
 
303
  non_personalized_messages = []
304
  personalized_messages = []
305
 
306
+ # Генерация и постепенная подача каждого сообщения
307
  for i in range(3):
308
+ # Генерация неперсонализированного сообщения
309
+ prompt = add_prefix_suffix(standard_prompt, prefixes[i], suffixes[i])
310
+ non_personalized_message = generate_message_gigachat_pro_with_retry(prompt)
311
+ non_personalized_length = len(non_personalized_message)
312
+ non_personalized_display = f"{non_personalized_message}\n------\nКоличество знаков: {non_personalized_length}"
313
+ non_personalized_messages.append(non_personalized_display)
314
+
315
+ # Генерация задания для редактора
316
  personalization_prompt = generate_personalization_prompt(
317
  key_message, gender, generation, psychotype, business_stage, industry, opf,
318
  prefix=prefixes[i], suffix=suffixes[i]
 
321
  # Удаляем префиксы, суффиксы и пустые строки перед выводом на экран
322
  display_personalization_prompt = clean_prompt_for_display(personalization_prompt, prefixes, suffixes)
323
 
324
+ # Выводим неперсонализированное сообщение и задание для редактора
325
  yield (
326
  standard_prompt, display_personalization_prompt, # Задание для редактора без префиксов, суффиксов и пустых строк
327
+ non_personalized_messages[0] if i >= 0 else None,
328
+ personalized_messages[0] if len(personalized_messages) > 0 else None,
329
+ non_personalized_messages[1] if i >= 1 else None,
330
+ personalized_messages[1] if len(personalized_messages) > 1 else None,
331
+ non_personalized_messages[2] if i >= 2 else None,
332
+ personalized_messages[2] if len(personalized_messages) > 2 else None
333
  )
334
 
 
 
 
 
 
 
 
335
  # Генерация персонализированного сообщения
336
  full_personalized_prompt = f"{personalization_prompt}\n\nТекст для адаптации: {non_personalized_message}"
337
  personalized_message = generate_message_gigachat_pro_with_retry(full_personalized_prompt)
 
342
  # Выводим персонализированное сообщение
343
  yield (
344
  standard_prompt, display_personalization_prompt, # Задание для редактора без префиксов, суффиксов и пустых строк
345
+ non_personalized_messages[0] if len(non_personalized_messages) > 0 else None,
346
  personalized_messages[0] if len(personalized_messages) > 0 else None,
347
+ non_personalized_messages[1] if len(non_personalized_messages) > 1 else None,
348
  personalized_messages[1] if len(personalized_messages) > 1 else None,
349
+ non_personalized_messages[2] if len(non_personalized_messages) > 2 else None,
350
  personalized_messages[2] if len(personalized_messages) > 2 else None
351
  )
352