fruitpicker01 commited on
Commit
6b3c4a0
·
verified ·
1 Parent(s): 5d9ecf9

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +164 -42
app.py CHANGED
@@ -7,22 +7,43 @@ def load_dropdown_data(file_path, sheet_name, column_name):
7
  data = pd.read_excel(file_path, sheet_name=sheet_name)
8
  return data[column_name].dropna().unique().tolist()
9
 
10
- # Путь к файлу
11
  file_path = "Исходные данные.xlsx"
12
 
13
  # Загрузка данных
14
  products, data_products = load_dropdown_data(file_path, "Продукты", "Наименование продукта"), pd.read_excel(file_path, sheet_name="Продукты")
15
- genders = load_dropdown_data(file_path, "Пол", "Пол")
16
- generations = load_dropdown_data(file_path, "Поколение", "Поколение")
17
- psychotypes = load_dropdown_data(file_path, "Психотип", "Психотип")
18
- business_stages = load_dropdown_data(file_path, "Стадия бизнеса", "Стадия бизнеса")
19
- industries = load_dropdown_data(file_path, "Отрасль", "Отрасль")
20
- opfs = load_dropdown_data(file_path, "ОПФ", "ОПФ")
21
-
22
- # Загрузка данных для "Подход"
 
 
 
 
 
 
23
  approaches_data = pd.read_excel(file_path, sheet_name="Подход")
24
 
25
- # Функция для заполнения полей на основе выбранного продукта
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  def fill_product_details(selected_product, data):
27
  if selected_product:
28
  product_row = data[data["Наименование продукта"] == selected_product].iloc[0]
@@ -34,7 +55,6 @@ def fill_product_details(selected_product, data):
34
  )
35
  return "", "", "", ""
36
 
37
- # Функция для получения списка подходов
38
  def get_approaches(gender, generation, psychotype, approaches_df):
39
  if approaches_df is None or approaches_df.empty:
40
  return "Таблица 'Подход' не найдена."
@@ -65,15 +85,122 @@ def get_approaches(gender, generation, psychotype, approaches_df):
65
  selected_approaches_text_content = ', '.join(approach_list)
66
  return selected_approaches_text_content
67
 
68
- # Функция-обёртка для обновления подхода
69
  def update_approach(gender, generation, psychotype):
70
  return get_approaches(gender, generation, psychotype, approaches_data)
71
 
72
- # Создание интерфейса
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73
  with gr.Blocks(theme="default") as demo:
74
  gr.Markdown("**Процент созданных SMS по выбранному продукту**")
75
-
76
- # Прогресс-бар
77
  progress_bar_html = """
78
  <div style="width: 100%; background-color: #e0e0e0; border-radius: 10px; overflow: hidden;">
79
  <div style="width: 0%; background-color: #4caf50; height: 20px; text-align: center; color: white;">
@@ -86,17 +213,12 @@ with gr.Blocks(theme="default") as demo:
86
  with gr.Row():
87
  with gr.Column(scale=1):
88
  gr.Markdown("**Продукт**")
89
- product_dropdown = gr.Dropdown(
90
- label="Продукт",
91
- choices=products,
92
- value=None
93
- )
94
  description = gr.Textbox(label="Описание предложения", lines=5, value="")
95
  product_name = gr.Textbox(label="Наименование продукта", lines=1, value="")
96
  benefits = gr.Textbox(label="Преимущества", lines=9, value="")
97
  key_message = gr.Textbox(label="Ключевое сообщение", lines=2, value="")
98
 
99
- # Обработчик выбора продукта
100
  product_dropdown.change(
101
  fn=lambda selected: fill_product_details(selected, data_products),
102
  inputs=[product_dropdown],
@@ -105,59 +227,59 @@ with gr.Blocks(theme="default") as demo:
105
 
106
  with gr.Column(scale=1):
107
  gr.Markdown("**Клиент**")
108
- gender_dropdown = gr.Dropdown(label="Пол", choices=genders, value=None)
109
- generation_dropdown = gr.Dropdown(label="Поколение", choices=generations, value=None)
110
- psychotype_dropdown = gr.Dropdown(label="Психотип", choices=psychotypes, value=None)
111
- business_stage_dropdown = gr.Dropdown(label="Стадия бизнеса", choices=business_stages, value=None)
112
- industry_dropdown = gr.Dropdown(label="Отрасль", choices=industries, value=None)
113
- opf_dropdown = gr.Dropdown(label="ОПФ", choices=opfs, value=None)
114
  chosen_approach = gr.Textbox(label="Выбранный подход", lines=1, value="")
115
  presence_in_db = gr.Textbox(label="Наличие в базе", lines=1, value="", interactive=False)
116
 
117
- # При изменении Пол, Поколение, Психотип вызываем update_approach
118
  gender_dropdown.change(fn=update_approach, inputs=[gender_dropdown, generation_dropdown, psychotype_dropdown], outputs=[chosen_approach])
119
  generation_dropdown.change(fn=update_approach, inputs=[gender_dropdown, generation_dropdown, psychotype_dropdown], outputs=[chosen_approach])
120
  psychotype_dropdown.change(fn=update_approach, inputs=[gender_dropdown, generation_dropdown, psychotype_dropdown], outputs=[chosen_approach])
121
 
122
- # Кнопки: Вернуть параметры, Создать персонализированное SMS
123
  with gr.Row():
124
  return_params_btn = gr.Button("Вернуть параметры предыдущего запроса")
125
  create_personal_sms_btn = gr.Button("Создать персонализированное SMS")
126
-
127
- # Блок для Модель 1, Промпт 1, SMS 1
128
  with gr.Row():
129
  with gr.Column():
130
- model_1_name = gr.Textbox(label="Модель 1", value="Скрыто для слепого тестирования", interactive=False)
131
- prompt_1 = gr.Textbox(label="Промпт 1", value="Скрыто для слепого тестирования", interactive=False)
132
  sms_1 = gr.Textbox(label="SMS 1", lines=3, value="")
133
 
134
- # Блок для Модель 2, Промпт 2, SMS 2
135
  with gr.Column():
136
- model_2_name = gr.Textbox(label="Модель 2", value="Скрыто для слепого тестирования", interactive=False)
137
- prompt_2 = gr.Textbox(label="Промпт 2", value="Скрыто для слепого тестирования", interactive=False)
138
  sms_2 = gr.Textbox(label="SMS 2", lines=3, value="")
139
 
140
- # Кнопки выбора SMS
141
  with gr.Row():
142
  prefer_sms_1_btn = gr.Button("Я предпочитаю это SMS")
143
  prefer_sms_2_btn = gr.Button("Я предпочитаю это SMS")
144
 
145
- # Кнопка "Перегенерировать SMS"
146
  regen_btn = gr.Button("Перегенерировать SMS (не нравится ни одно из SMS)")
147
 
148
- # Комментарии к SMS 1 и 2
149
  with gr.Row():
150
  comment_sms_1 = gr.Textbox(label="Комментарий к SMS 1", lines=2, value="")
151
  comment_sms_2 = gr.Textbox(label="Комментарий к SMS 2", lines=2, value="")
152
 
153
- # Откорректированные SMS
154
  with gr.Row():
155
  corrected_sms_1 = gr.Textbox(label="Откорректированное SMS 1", lines=3, value="")
156
  corrected_sms_2 = gr.Textbox(label="Откорректированное SMS 2", lines=3, value="")
157
 
158
- # Кнопки сохранения
159
  with gr.Row():
160
  save_sms_1_btn = gr.Button("Сохранить в базу")
161
  save_sms_2_btn = gr.Button("Сохранить в базу")
162
-
 
 
 
 
 
 
 
 
 
163
  demo.launch()
 
7
  data = pd.read_excel(file_path, sheet_name=sheet_name)
8
  return data[column_name].dropna().unique().tolist()
9
 
 
10
  file_path = "Исходные данные.xlsx"
11
 
12
  # Загрузка данных
13
  products, data_products = load_dropdown_data(file_path, "Продукты", "Наименование продукта"), pd.read_excel(file_path, sheet_name="Продукты")
14
+ genders_data = pd.read_excel(file_path, sheet_name="Пол")
15
+ generations_data = pd.read_excel(file_path, sheet_name="Поколение")
16
+ psychotypes_data = pd.read_excel(file_path, sheet_name="Психотип")
17
+ business_stages_data = pd.read_excel(file_path, sheet_name="Стадия бизнеса")
18
+ industries_data = pd.read_excel(file_path, sheet_name="Отрасль")
19
+ opfs_data = pd.read_excel(file_path, sheet_name="ОПФ")
20
+
21
+ genders = genders_data["Пол"].dropna().unique().tolist()
22
+ generations = generations_data["Поколение"].dropna().unique().tolist()
23
+ psychotypes = psychotypes_data["Психотип"].dropna().unique().tolist()
24
+ business_stages = business_stages_data["Стадия бизнеса"].dropna().unique().tolist()
25
+ industries = industries_data["Отрасль"].dropna().unique().tolist()
26
+ opfs = opfs_data["ОПФ"].dropna().unique().tolist()
27
+
28
  approaches_data = pd.read_excel(file_path, sheet_name="Подход")
29
 
30
+ # Словарь подходов
31
+ approach_dict = {
32
+ "Указание на пользу": {
33
+ "prefix": "Начни SMS с указания на пользу продукта. Используй глагол в побудительном наклонении. Не начинай с вопроса",
34
+ "suffix": "Убедись, что SMS начинается с указания на пользу продукта и использования глагола в побудительном наклонении и не начинается с вопроса"
35
+ },
36
+ "Вопрос": {
37
+ "prefix": "Начни сообщение с вопроса, который указывает на пользу продукта для клиента",
38
+ "suffix": "Убедись, что готовый текст начинается с вопроса, который указывает на пользу продукта для клиента"
39
+ },
40
+ "Призыв к действию": {
41
+ "prefix": "Начни SMS с призыва к действию с продуктом. Не начинай с вопроса",
42
+ "suffix": "Убедись, что готовый текст начинается с призыва к действию с продуктом и не начинается с вопроса"
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]
 
55
  )
56
  return "", "", "", ""
57
 
 
58
  def get_approaches(gender, generation, psychotype, approaches_df):
59
  if approaches_df is None or approaches_df.empty:
60
  return "Таблица 'Подход' не найдена."
 
85
  selected_approaches_text_content = ', '.join(approach_list)
86
  return selected_approaches_text_content
87
 
 
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}».
170
+ Преимущества:
171
+ «{benefits}».
172
+ ОБЯЗАТЕЛЬНО используй в SMS КАЖДЫЙ из следующих терминов:
173
+ {mandatory_terms}
174
+ Убедись, что написал не меньше трех и не больше четырех предложений.
175
+ {approach_suffix}.
176
+ Убедись, что УМЕСТНО использовал КАЖДЫЙ необходимый термин.
177
+ Убедись, что в SMS без изменений, синонимов и перестановок слов используется ��аименование продукта: «{product_name}».
178
+ Убедись, что в SMS есть следующая ключевая информация: «{key_message}»."""
179
+ else:
180
+ # Если нет выбранных параметров с инструкциями, можно вывести вариант без инструкций
181
+ prompt = f"""Напиши три или четыре предложения. {approach_prefix}. Напиши рекламное SMS для следующего продукта:
182
+ «{description}».
183
+ Не изменяй название продукта: «{product_name}».
184
+ Преимущества:
185
+ «{benefits}».
186
+ Убедись, что написал не меньше трех и не больше четырех предложений.
187
+ {approach_suffix}.
188
+ Убедись, что в SMS без изменений, синонимов и перестановок слов используется наименование продукта: «{product_name}».
189
+ Убедись, что в SMS есть следующая ключевая информация: «{key_message}»."""
190
+
191
+ return prompt, prompt
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:
203
  gr.Markdown("**Процент созданных SMS по выбранному продукту**")
 
 
204
  progress_bar_html = """
205
  <div style="width: 100%; background-color: #e0e0e0; border-radius: 10px; overflow: hidden;">
206
  <div style="width: 0%; background-color: #4caf50; height: 20px; text-align: center; color: white;">
 
213
  with gr.Row():
214
  with gr.Column(scale=1):
215
  gr.Markdown("**Продукт**")
216
+ product_dropdown = gr.Dropdown(label="Продукт", choices=products, value=None)
 
 
 
 
217
  description = gr.Textbox(label="Описание предложения", lines=5, value="")
218
  product_name = gr.Textbox(label="Наименование продукта", lines=1, value="")
219
  benefits = gr.Textbox(label="Преимущества", lines=9, value="")
220
  key_message = gr.Textbox(label="Ключевое сообщение", lines=2, value="")
221
 
 
222
  product_dropdown.change(
223
  fn=lambda selected: fill_product_details(selected, data_products),
224
  inputs=[product_dropdown],
 
227
 
228
  with gr.Column(scale=1):
229
  gr.Markdown("**Клиент**")
230
+ gender_dropdown = gr.Dropdown(label="Пол", choices=["Не выбрано"]+genders, value=None)
231
+ generation_dropdown = gr.Dropdown(label="Поколение", choices=["Не выбрано"]+generations, value=None)
232
+ psychotype_dropdown = gr.Dropdown(label="Психотип", choices=["Не выбрано"]+psychotypes, value=None)
233
+ business_stage_dropdown = gr.Dropdown(label="Стадия бизнеса", choices=["Не выбрано"]+business_stages, value=None)
234
+ industry_dropdown = gr.Dropdown(label="Отрасль", choices=["Не выбрано"]+industries, value=None)
235
+ opf_dropdown = gr.Dropdown(label="ОПФ", choices=["Не выбрано"]+opfs, value=None)
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
 
 
258
  with gr.Row():
259
  prefer_sms_1_btn = gr.Button("Я предпочитаю это SMS")
260
  prefer_sms_2_btn = gr.Button("Я предпочитаю это SMS")
261
 
 
262
  regen_btn = gr.Button("Перегенерировать SMS (не нравится ни одно из SMS)")
263
 
 
264
  with gr.Row():
265
  comment_sms_1 = gr.Textbox(label="Комментарий к SMS 1", lines=2, value="")
266
  comment_sms_2 = gr.Textbox(label="Комментарий к SMS 2", lines=2, value="")
267
 
 
268
  with gr.Row():
269
  corrected_sms_1 = gr.Textbox(label="Откорректированное SMS 1", lines=3, value="")
270
  corrected_sms_2 = gr.Textbox(label="Откорректированное SMS 2", lines=3, value="")
271
 
 
272
  with gr.Row():
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
+ )
284
+
285
  demo.launch()