fruitpicker01 commited on
Commit
97aceee
·
verified ·
1 Parent(s): c9b1baa

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +130 -64
app.py CHANGED
@@ -43,7 +43,6 @@ approach_dict = {
43
  }
44
  }
45
 
46
- # Функция для заполнения полей продукта
47
  def fill_product_details(selected_product, data):
48
  if selected_product:
49
  product_row = data[data["Наименование продукта"] == selected_product].iloc[0]
@@ -57,11 +56,11 @@ def fill_product_details(selected_product, data):
57
 
58
  def get_approaches(gender, generation, psychotype, approaches_df):
59
  if approaches_df is None or approaches_df.empty:
60
- return "Таблица 'Подход' не найдена."
61
 
62
  filters = []
63
  for param_name, param_value in [('Пол', gender), ('Поколение', generation), ('Психотип', psychotype)]:
64
- # Проверяем, если значение параметра "Не выбрано" или пустое
65
  if not param_value or param_value == "Не выбрано":
66
  filters.append(approaches_df[param_name].isnull() | (approaches_df[param_name].fillna('') == ''))
67
  else:
@@ -88,82 +87,81 @@ def get_approaches(gender, generation, psychotype, approaches_df):
88
  def update_approach(gender, generation, psychotype):
89
  return get_approaches(gender, generation, psychotype, approaches_data)
90
 
91
- # Функция для извлечения инструкций из таблиц параметров
92
- def get_instructions_for_param(param_name, param_value, df, param_col_name):
93
  # Если param_value пустое или "Не выбрано" – игнорируем
94
  if not param_value or param_value == "Не выбрано":
95
- return None, None
96
- row = df[df[param_col_name] == param_value]
97
  if row.empty:
98
- return None, None
99
  instr1 = row.iloc[0].get("Инструкция 1", "")
100
- instr2 = row.iloc[0].get("Инструкция 2", "")
101
- return instr1, instr2
 
102
 
103
  def format_instruction_string(instr):
104
- # Превращаем "слово1, слово2, слово3" в "слово1 или слово2 или слово3"
105
  terms = [t.strip() for t in instr.split(',') if t.strip()]
106
  return " или ".join(terms) if terms else ""
107
 
108
- def generate_prompts(description, product_name, benefits, key_message, chosen_approach,
109
  gender, generation, psychotype, business_stage, industry, opf):
110
  # Если подход не определён
111
  if chosen_approach == "Подход не найден для выбранных параметров.":
112
  return ("Для формирования промпта выберите хотя бы один личный персональный параметр для определения подхода",
113
  "Для формирования промпта выберите хотя бы один личный персональный параметр для определения подхода")
114
 
115
- # Собираем approach_prefix и approach_suffix
116
- approach_list = [a.strip() for a in chosen_approach.split(',')]
117
  prefix_parts = []
118
  suffix_parts = []
119
  for a in approach_list:
120
  if a in approach_dict:
121
  prefix_parts.append(approach_dict[a]["prefix"])
122
  suffix_parts.append(approach_dict[a]["suffix"])
123
- approach_prefix = " ".join(prefix_parts) if prefix_parts else ""
124
- approach_suffix = " ".join(suffix_parts) if suffix_parts else ""
 
 
 
 
 
125
 
126
- # Собираем инструкции из персонализационных параметров
127
- # Порядок: Пол, Поколение, Психотип, Стадия бизнеса, Отрасль, ОПФ
128
  instructions_data = [
129
- ("Пол", gender, genders_data, "Пол"),
130
- ("Поколение", generation, generations_data, "Поколение"),
131
- ("Психотип", psychotype, psychotypes_data, "Психотип"),
132
- ("Стадия бизнеса", business_stage, business_stages_data, "Стадия бизнеса"),
133
- ("Отрасль", industry, industries_data, "Отрасль"),
134
- ("ОПФ", opf, opfs_data, "ОПФ")
135
  ]
136
 
137
- used_instructions = []
138
- for (param_name, param_value, df, col) in instructions_data:
139
- instr1, instr2 = get_instructions_for_param(param_name, param_value, df, col)
140
- # Добавляем инструкцию, только если есть значение
141
- if instr1 and instr1.strip():
142
- instr_str = format_instruction_string(instr1)
143
- used_instructions.append(instr_str)
144
- if instr2 and instr2.strip():
145
- instr_str = format_instruction_string(instr2)
146
- used_instructions.append(instr_str)
147
-
148
- # Формируем блок обязательных терминов
149
- # Каждый элемент used_instructions – это уже подготовленная строка с "или".
150
- # Нужно их пронумеровать:
151
- mandatory_terms = ""
152
- if used_instructions:
153
  lines = []
154
- for i, instr_line in enumerate(used_instructions, start=1):
155
- lines.append(f"{i}. {instr_line}")
 
156
  mandatory_terms = "\n".join(lines)
157
  else:
158
- # Если нет выбранных параметров или инструкции пусты,
159
- # можно по умолчанию не выводить пункты или оставить пустым
160
- # Но по условию задачи, если нет подхода, уже обработали выше.
161
- # Если есть подход, но нет инструкций, значит никаких персональных параметров не выбрано
162
- # Тогда будет без обязательных терминов. Можно просто не выводить пункты.
163
  mandatory_terms = "Нет обязательных терминов, так как не выбрано ни одного параметра"
164
 
165
  # Формируем итоговый промпт
166
- if used_instructions:
167
  prompt = f"""Напиши три или четыре предложения. {approach_prefix}. Напиши рекламное SMS для следующего продукта:
168
  «{description}».
169
  Не изменяй название продукта: «{product_name}».
@@ -177,7 +175,8 @@ def generate_prompts(description, product_name, benefits, key_message, chosen_ap
177
  Убедись, что в SMS без изменений, синонимов и перестановок слов используется наименование продукта: «{product_name}».
178
  Убедись, что в SMS есть следующая ключевая информация: «{key_message}»."""
179
  else:
180
- # Если нет выбранных параметров с инструкциями, можно вывести вариант без инструкций
 
181
  prompt = f"""Напиши три или четыре предложения. {approach_prefix}. Напиши рекламное SMS для следующего продукта:
182
  «{description}».
183
  Не изменяй название продукта: «{product_name}».
@@ -192,11 +191,9 @@ def generate_prompts(description, product_name, benefits, key_message, chosen_ap
192
 
193
  def create_personalized_sms(description, product_name, benefits, key_message, chosen_approach,
194
  gender, generation, psychotype, business_stage, industry, opf):
195
- # Генерируем промпты 1 и 2 по новой логике
196
  prompt_1, prompt_2 = generate_prompts(description, product_name, benefits, key_message,
197
  chosen_approach, gender, generation, psychotype,
198
  business_stage, industry, opf)
199
- # Возвращаем промпты для отображения
200
  return prompt_1, prompt_2
201
 
202
  with gr.Blocks(theme="default") as demo:
@@ -236,22 +233,34 @@ with gr.Blocks(theme="default") as demo:
236
  chosen_approach = gr.Textbox(label="Выбранный подход", lines=1, value="")
237
  presence_in_db = gr.Textbox(label="Наличие в базе", lines=1, value="", interactive=False)
238
 
239
- gender_dropdown.change(fn=update_approach, inputs=[gender_dropdown, generation_dropdown, psychotype_dropdown], outputs=[chosen_approach])
240
- generation_dropdown.change(fn=update_approach, inputs=[gender_dropdown, generation_dropdown, psychotype_dropdown], outputs=[chosen_approach])
241
- psychotype_dropdown.change(fn=update_approach, inputs=[gender_dropdown, generation_dropdown, psychotype_dropdown], outputs=[chosen_approach])
242
-
 
 
 
 
 
 
 
 
 
 
243
  with gr.Row():
 
 
244
  return_params_btn = gr.Button("Вернуть параметры предыдущего запроса")
245
- create_personal_sms_btn = gr.Button("Создать персонализированное SMS")
246
-
247
  with gr.Row():
248
  with gr.Column():
249
- model_1_name = gr.Textbox(label="Модель 1", value="Модель 1", interactive=False)
250
  prompt_1 = gr.Textbox(label="Промпт 1", value="", interactive=False, lines=10)
251
  sms_1 = gr.Textbox(label="SMS 1", lines=3, value="")
252
 
253
  with gr.Column():
254
- model_2_name = gr.Textbox(label="Модель 2", value="Модель 2", interactive=False)
255
  prompt_2 = gr.Textbox(label="Промпт 2", value="", interactive=False, lines=10)
256
  sms_2 = gr.Textbox(label="SMS 2", lines=3, value="")
257
 
@@ -273,11 +282,68 @@ with gr.Blocks(theme="default") as demo:
273
  save_sms_1_btn = gr.Button("Сохранить в базу")
274
  save_sms_2_btn = gr.Button("Сохранить в базу")
275
 
276
- # При нажатии на "Создать персонализированное SMS" формируем промпты
277
- create_personal_sms_btn.click(
278
- fn=create_personalized_sms,
279
- inputs=[description, product_name, benefits, key_message, chosen_approach,
280
- gender_dropdown, generation_dropdown, psychotype_dropdown,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
281
  business_stage_dropdown, industry_dropdown, opf_dropdown],
282
  outputs=[prompt_1, prompt_2]
283
  )
 
43
  }
44
  }
45
 
 
46
  def fill_product_details(selected_product, data):
47
  if selected_product:
48
  product_row = data[data["Наименование продукта"] == selected_product].iloc[0]
 
56
 
57
  def get_approaches(gender, generation, psychotype, approaches_df):
58
  if approaches_df is None or approaches_df.empty:
59
+ return "Подход не найден для выбранных параметров."
60
 
61
  filters = []
62
  for param_name, param_value in [('Пол', gender), ('Поколение', generation), ('Психотип', psychotype)]:
63
+ # Если значение параметра "Не выбрано" или пустое
64
  if not param_value or param_value == "Не выбрано":
65
  filters.append(approaches_df[param_name].isnull() | (approaches_df[param_name].fillna('') == ''))
66
  else:
 
87
  def update_approach(gender, generation, psychotype):
88
  return get_approaches(gender, generation, psychotype, approaches_data)
89
 
90
+ def get_instructions_for_param(param_value, df, col):
 
91
  # Если param_value пустое или "Не выбрано" – игнорируем
92
  if not param_value or param_value == "Не выбрано":
93
+ return None
94
+ row = df[df[col] == param_value]
95
  if row.empty:
96
+ return None
97
  instr1 = row.iloc[0].get("Инструкция 1", "")
98
+ if not instr1.strip():
99
+ return None
100
+ return instr1
101
 
102
  def format_instruction_string(instr):
103
+ # "слово1, слово2, слово3" -> "слово1 или слово2 или слово3"
104
  terms = [t.strip() for t in instr.split(',') if t.strip()]
105
  return " или ".join(terms) if terms else ""
106
 
107
+ def generate_prompts(description, product_name, benefits, key_message, chosen_approach,
108
  gender, generation, psychotype, business_stage, industry, opf):
109
  # Если подход не определён
110
  if chosen_approach == "Подход не найден для выбранных параметров.":
111
  return ("Для формирования промпта выберите хотя бы один личный персональный параметр для определения подхода",
112
  "Для формирования промпта выберите хотя бы один личный персональный параметр для определения подхода")
113
 
114
+ # Собираем подходы
115
+ approach_list = [a.strip() for a in chosen_approach.split(',') if a.strip()]
116
  prefix_parts = []
117
  suffix_parts = []
118
  for a in approach_list:
119
  if a in approach_dict:
120
  prefix_parts.append(approach_dict[a]["prefix"])
121
  suffix_parts.append(approach_dict[a]["suffix"])
122
+ # Если несколько подходов, соединяем через "/"
123
+ if len(prefix_parts) > 1:
124
+ approach_prefix = " / ".join(prefix_parts)
125
+ approach_suffix = " / ".join(suffix_parts)
126
+ else:
127
+ approach_prefix = prefix_parts[0] if prefix_parts else ""
128
+ approach_suffix = suffix_parts[0] if suffix_parts else ""
129
 
130
+ # Собираем выбранные параметры
 
131
  instructions_data = [
132
+ (gender, genders_data, "Пол"),
133
+ (generation, generations_data, "Поколение"),
134
+ (psychotype, psychotypes_data, "Психотип"),
135
+ (business_stage, business_stages_data, "Стадия бизнеса"),
136
+ (industry, industries_data, "Отрасль"),
137
+ (opf, opfs_data, "ОПФ")
138
  ]
139
 
140
+ chosen_params_instructions = []
141
+ for (param_value, df, col) in instructions_data:
142
+ instr1 = get_instructions_for_param(param_value, df, col)
143
+ if instr1:
144
+ chosen_params_instructions.append(instr1)
145
+
146
+ # Теперь, согласно новой логике:
147
+ # - Если один параметр выбран -> 1 пункт
148
+ # - Если два параметра -> 2 пункта (по одному с каждого параметра)
149
+ # И так далее. Используем только Инструкция 1.
150
+ # Таким образом, количество пунктов = количество выбранных параметров
151
+ # каждый пункт это Инструкция 1 для параметра.
152
+
153
+ if chosen_params_instructions:
 
 
154
  lines = []
155
+ for i, instr_line in enumerate(chosen_params_instructions, start=1):
156
+ formatted_line = format_instruction_string(instr_line)
157
+ lines.append(f"{i}. {formatted_line}")
158
  mandatory_terms = "\n".join(lines)
159
  else:
160
+ # Если нет выбранных параметров с инструкциями
 
 
 
 
161
  mandatory_terms = "Нет обязательных терминов, так как не выбрано ни одного параметра"
162
 
163
  # Формируем итоговый промпт
164
+ if chosen_params_instructions:
165
  prompt = f"""Напиши три или четыре предложения. {approach_prefix}. Напиши рекламное SMS для следующего продукта:
166
  «{description}».
167
  Не изменяй название продукта: «{product_name}».
 
175
  Убедись, что в SMS без изменений, синонимов и перестановок слов используется наименование продукта: «{product_name}».
176
  Убедись, что в SMS есть следующая ключевая информация: «{key_message}»."""
177
  else:
178
+ # Если нет ни одного параметра, но подход найден,
179
+ # просто не указываем обязательные термины.
180
  prompt = f"""Напиши три или четыре предложения. {approach_prefix}. Напиши рекламное SMS для следующего продукта:
181
  «{description}».
182
  Не изменяй название продукта: «{product_name}».
 
191
 
192
  def create_personalized_sms(description, product_name, benefits, key_message, chosen_approach,
193
  gender, generation, psychotype, business_stage, industry, opf):
 
194
  prompt_1, prompt_2 = generate_prompts(description, product_name, benefits, key_message,
195
  chosen_approach, gender, generation, psychotype,
196
  business_stage, industry, opf)
 
197
  return prompt_1, prompt_2
198
 
199
  with gr.Blocks(theme="default") as demo:
 
233
  chosen_approach = gr.Textbox(label="Выбранный подход", lines=1, value="")
234
  presence_in_db = gr.Textbox(label="Наличие в базе", lines=1, value="", interactive=False)
235
 
236
+ # При изменении Пол, Поколение, Психотип вычисляем подход
237
+ def on_personal_params_change(gender, generation, psychotype):
238
+ return update_approach(gender, generation, psychotype)
239
+
240
+ gender_dropdown.change(fn=on_personal_params_change,
241
+ inputs=[gender_dropdown, generation_dropdown, psychotype_dropdown],
242
+ outputs=[chosen_approach])
243
+ generation_dropdown.change(fn=on_personal_params_change,
244
+ inputs=[gender_dropdown, generation_dropdown, psychotype_dropdown],
245
+ outputs=[chosen_approach])
246
+ psychotype_dropdown.change(fn=on_personal_params_change,
247
+ inputs=[gender_dropdown, generation_dropdown, psychotype_dropdown],
248
+ outputs=[chosen_approach])
249
+
250
  with gr.Row():
251
+ # Убрали кнопку "Создать персонализированное SMS" для формирования промптов
252
+ # Теперь промпты формируются при изменении параметров
253
  return_params_btn = gr.Button("Вернуть параметры предыдущего запроса")
254
+ create_personal_sms_btn = gr.Button("Создать персонализированное SMS") # Можно оставить для другого функционала, но промпты будут обновляться без нее.
255
+
256
  with gr.Row():
257
  with gr.Column():
258
+ model_1_name = gr.Textbox(label="Модель 1", value="Скрыто для слепого тестирования", interactive=False)
259
  prompt_1 = gr.Textbox(label="Промпт 1", value="", interactive=False, lines=10)
260
  sms_1 = gr.Textbox(label="SMS 1", lines=3, value="")
261
 
262
  with gr.Column():
263
+ model_2_name = gr.Textbox(label="Модель 2", value="Скрыто для слепого тестирования", interactive=False)
264
  prompt_2 = gr.Textbox(label="Промпт 2", value="", interactive=False, lines=10)
265
  sms_2 = gr.Textbox(label="SMS 2", lines=3, value="")
266
 
 
282
  save_sms_1_btn = gr.Button("Сохранить в базу")
283
  save_sms_2_btn = gr.Button("Сохранить в базу")
284
 
285
+ # Теперь обновляем промпты при любом изменении параметров клиента и продукта
286
+ # Функция-обертка, чтобы получить текущие значения и сгенерировать промпты
287
+ def update_prompts_on_change(description, product_name, benefits, key_message, chosen_approach,
288
+ gender, generation, psychotype, business_stage, industry, opf):
289
+ return create_personalized_sms(description, product_name, benefits, key_message, chosen_approach,
290
+ gender, generation, psychotype, business_stage, industry, opf)
291
+
292
+ # Добавляем события при изменении всех параметров
293
+ # Продукт
294
+ product_dropdown.change(
295
+ fn=update_prompts_on_change,
296
+ inputs=[description, product_name, benefits, key_message, chosen_approach,
297
+ gender_dropdown, generation_dropdown, psychotype_dropdown,
298
+ business_stage_dropdown, industry_dropdown, opf_dropdown],
299
+ outputs=[prompt_1, prompt_2]
300
+ )
301
+
302
+ # Параметры клиента
303
+ gender_dropdown.change(
304
+ fn=update_prompts_on_change,
305
+ inputs=[description, product_name, benefits, key_message, chosen_approach,
306
+ gender_dropdown, generation_dropdown, psychotype_dropdown,
307
+ business_stage_dropdown, industry_dropdown, opf_dropdown],
308
+ outputs=[prompt_1, prompt_2]
309
+ )
310
+
311
+ generation_dropdown.change(
312
+ fn=update_prompts_on_change,
313
+ inputs=[description, product_name, benefits, key_message, chosen_approach,
314
+ gender_dropdown, generation_dropdown, psychotype_dropdown,
315
+ business_stage_dropdown, industry_dropdown, opf_dropdown],
316
+ outputs=[prompt_1, prompt_2]
317
+ )
318
+
319
+ psychotype_dropdown.change(
320
+ fn=update_prompts_on_change,
321
+ inputs=[description, product_name, benefits, key_message, chosen_approach,
322
+ gender_dropdown, generation_dropdown, psychotype_dropdown,
323
+ business_stage_dropdown, industry_dropdown, opf_dropdown],
324
+ outputs=[prompt_1, prompt_2]
325
+ )
326
+
327
+ business_stage_dropdown.change(
328
+ fn=update_prompts_on_change,
329
+ inputs=[description, product_name, benefits, key_message, chosen_approach,
330
+ gender_dropdown, generation_dropdown, psychotype_dropdown,
331
+ business_stage_dropdown, industry_dropdown, opf_dropdown],
332
+ outputs=[prompt_1, prompt_2]
333
+ )
334
+
335
+ industry_dropdown.change(
336
+ fn=update_prompts_on_change,
337
+ inputs=[description, product_name, benefits, key_message, chosen_approach,
338
+ gender_dropdown, generation_dropdown, psychotype_dropdown,
339
+ business_stage_dropdown, industry_dropdown, opf_dropdown],
340
+ outputs=[prompt_1, prompt_2]
341
+ )
342
+
343
+ opf_dropdown.change(
344
+ fn=update_prompts_on_change,
345
+ inputs=[description, product_name, benefits, key_message, chosen_approach,
346
+ gender_dropdown, generation_dropdown, psychotype_dropdown,
347
  business_stage_dropdown, industry_dropdown, opf_dropdown],
348
  outputs=[prompt_1, prompt_2]
349
  )