fruitpicker01 commited on
Commit
edcf6fe
1 Parent(s): a81af46

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +80 -141
app.py CHANGED
@@ -2,6 +2,13 @@ import gradio as gr
2
  import plotly.graph_objects as go
3
  import random
4
  import pandas as pd
 
 
 
 
 
 
 
5
 
6
  # Загрузка данных из Excel-файла
7
  try:
@@ -15,7 +22,6 @@ features = {}
15
  for sheet_name, df in data.items():
16
  try:
17
  if sheet_name == "Пол Поколение Психотип":
18
- # Создаем словарь, где ключи — это кортежи (Пол, Поколение, Психотип), а значения — инструкции
19
  features[sheet_name] = df.set_index(['Пол', 'Поколение', 'Психотип'])['Инструкция'].to_dict()
20
  else:
21
  features[sheet_name] = df.set_index(df.columns[0]).to_dict()[df.columns[1]]
@@ -23,105 +29,6 @@ for sheet_name, df in data.items():
23
  print(f"Ошибка при обработке данных листа {sheet_name}: {e}")
24
  features[sheet_name] = {}
25
 
26
- # Функция для генерации стандартного промпта
27
- def generate_standard_prompt(description, advantages, key_message):
28
- prompt = (
29
- f"Сгенерируй смс-сообщение для клиента.\n"
30
- f"Описание предложения: {description}\n"
31
- f"Преимущества: {advantages}\n"
32
- "В тексте смс запрещено использование:\n"
33
- "- Запрещенные слова: № один, номер один, № 1, вкусный, дешёвый, продукт, спам, доступный, банкротство, долги, займ, срочно, сейчас, лучший, главный, номер 1, гарантия, успех, лидер;\n"
34
- "- Обращение к клиенту;\n"
35
- "- Приветствие клиента;\n"
36
- "- Обещания и гарантии;\n"
37
- "- Использовать составные конструкции из двух глаголов;\n"
38
- "- Причастия и причастные обороты;\n"
39
- "- Деепричастия и деепричастные обороты;\n"
40
- "- Превосходная степень прилагательных;\n"
41
- "- Страдательный залог;\n"
42
- "- Порядковые числительные от 10 прописью;\n"
43
- "- Цепочки с придаточными предложениями;\n"
44
- "- Разделительные повторяющиеся союзы;\n"
45
- "- Вводные конструкции;\n"
46
- "- Усилители;\n"
47
- "- Паразиты времени;\n"
48
- "- Несколько существительных подряд, в том числе отглагольных;\n"
49
- "- Производные предлоги;\n"
50
- "- Сложные предложения, в которых нет связи между частями;\n"
51
- "- Сложноподчинённые предложения;\n"
52
- "- Даты прописью;\n"
53
- "- Близкие по смыслу однородные члены предложения;\n"
54
- "- Шокирующие, экстравагантные, кликбейтные фразы;\n"
55
- "- Абстрактные заявления без поддержки фактами и отсутствие доказательства пользы для клиента;\n"
56
- "- Гарантирующие фразы;\n"
57
- "- Узкоспециализированные термины;\n"
58
- "- Фразы, способные создать двойственное ощущение, обидеть;\n"
59
- "- Речевые клише, рекламные штампы, канцеляризмы;\n"
60
- "Убедись, что в готовом тексте до 250 знаков с пробелами.\n"
61
- )
62
- if key_message.strip():
63
- prompt += f"Убедись, что в готовом тексте есть следующая ключевая информация: {key_message.strip()}"
64
- return prompt.strip()
65
-
66
-
67
- # Функция для генерации персонализированного промпта
68
- def generate_personalization_prompt(key_message, *selected_values):
69
- prompt = "Адаптируй, не превышая длину сообщения в 250 знаков с пробелами, текст с учетом следующих особенностей:\n"
70
- gender, generation, psychotype = selected_values[0], selected_values[1], selected_values[2]
71
- combined_instruction = ""
72
- additional_instructions = ""
73
-
74
- print(f"Выбранные значения: Пол={gender}, Поколение={generation}, Психотип={psychotype}")
75
-
76
- # Проверяем, выбраны ли все три параметра: Пол, Поколение, Психотип
77
- if gender and generation and psychotype:
78
- # Получаем данные с листа "Пол Поколение Психотип"
79
- sheet = features.get("Пол Поколение Психотип", {})
80
-
81
- # Ищем ключ, соответствующий комбинации "Пол", "Поколение", "Психотип"
82
- key = (gender, generation, psychotype)
83
- if key in sheet:
84
- combined_instruction = sheet[key]
85
- print(f"Найдена комбинированная инструкция: {combined_instruction}")
86
- else:
87
- print(f"Комбинированная инструкция для ключа {key} не найдена.")
88
-
89
- # Если не найдена комбинированная инструкция, добавляем индивидуальные инструкции
90
- if not combined_instruction:
91
- print("Добавляем индивидуальные инструкции для Пол, Поколение, Психотип.")
92
- for i, feature in enumerate(["Пол", "Поколение", "Психотип"]):
93
- if selected_values[i]:
94
- try:
95
- instruction = features[feature][selected_values[i]]
96
- additional_instructions += f"{instruction}\n"
97
- print(f"Добавлена инструкция из {feature}: {instruction}")
98
- except KeyError:
99
- return f"Ошибка: выбранное значение {selected_values[i]} не найдено в данных."
100
-
101
- # Добавляем инструкции для остальных параметров (например, Отрасль)
102
- for i, feature in enumerate(features.keys()):
103
- if feature not in ["Пол", "Поколение", "Психотип", "Пол Поколение Психотип"]:
104
- if i < len(selected_values) and selected_values[i]:
105
- try:
106
- instruction = features[feature][selected_values[i]]
107
- additional_instructions += f"{instruction}\n"
108
- print(f"Добавлена инструкция из {feature}: {instruction}")
109
- except KeyError:
110
- return f"Ошибка: выбранное значение {selected_values[i]} не найдено в данных."
111
-
112
- # Формируем итоговый промпт
113
- if combined_instruction:
114
- prompt += combined_instruction # Добавляем комбинированную инструкцию, если она есть
115
- if additional_instructions:
116
- prompt += additional_instructions # Добавляем остальные инструкции
117
-
118
- prompt += "Убедись, что в готовом тексте до 250 знаков с пробелами.\n"
119
-
120
- prompt += f"Убедись, что в готовом тексте есть следующая ключевая информация: {key_message.strip()}"
121
-
122
- return prompt.strip()
123
-
124
-
125
  # Функция для создания спидометра
126
  def create_gauge(value):
127
  fig = go.Figure(go.Indicator(
@@ -143,11 +50,7 @@ def create_gauge(value):
143
  },
144
  number={'font': {'size': 48}} # Размер шрифта числа
145
  ))
146
- # Изменение размеров спидометра и центровка
147
- fig.update_layout(paper_bgcolor="#f8f9fa", # Цвет фона
148
- font={'color': "#2d3436", 'family': "Arial"}, # Цвет текста
149
- width=250, # Уменьшенная ширина
150
- height=150) # Уменьшенная высота
151
  return fig
152
 
153
  # Функция для генерации случайных значений спидометров
@@ -158,6 +61,69 @@ def generate_random_gauges():
158
  def change_tab(id):
159
  return gr.Tabs(selected=id)
160
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
161
  with gr.Blocks() as demo:
162
  with gr.Tabs() as tabs:
163
 
@@ -197,7 +163,6 @@ with gr.Blocks() as demo:
197
  )
198
 
199
  with gr.Column():
200
- # Используем данные из Excel для выбора
201
  gender = gr.Dropdown(label="Пол", choices=[None] + list(features.get('Пол', {}).keys()))
202
  generation = gr.Dropdown(label="Поколение", choices=[None] + list(features.get('Поколение', {}).keys()))
203
  psychotype = gr.Dropdown(label="Психотип", choices=[None] + list(features.get('Психотип', {}).keys()))
@@ -207,70 +172,46 @@ with gr.Blocks() as demo:
207
 
208
  btn_to_prompts = gr.Button("Создать")
209
  btn_to_prompts.click(fn=change_tab, inputs=[gr.Number(value=1, visible=False)], outputs=tabs)
210
-
211
  # Вкладка 2: Промпты
212
  with gr.TabItem("Ассистент", id=1):
213
  with gr.Row():
214
  with gr.Column():
215
  non_personalized_prompt = gr.Textbox(
216
- label="Задание для копирайтера",
217
  lines=25,
218
  interactive=False)
219
  with gr.Column():
220
  personalized_prompt = gr.Textbox(label="Задание для редактора", lines=25) # Увеличенная высота
221
-
222
- # Добавляем генерацию стандартного промпта при клике
223
- btn_to_prompts.click(
224
- fn=generate_standard_prompt,
225
- inputs=[desc, benefits, key_message],
226
- outputs=[non_personalized_prompt]
227
- )
228
-
229
- # Добавляем генерацию персонализированного промпта при клике
230
- btn_to_prompts.click(
231
- fn=generate_personalization_prompt,
232
- inputs=[key_message, gender, generation, psychotype, business_stage, industry, opf],
233
- outputs=[personalized_prompt]
234
- )
235
 
236
  # Вкладка 3: Сообщения
237
  with gr.TabItem("Сообщения", id=2):
238
-
239
- # Заголовки столбцов
240
  with gr.Row():
241
- gr.Markdown("### Копирайтер") # Название для столбца "Копирайтер"
242
- gr.Markdown("### Редактор") # Название для столбца "Редактор"
243
 
244
- # Первый ряд
245
  with gr.Row():
246
  non_personalized_1 = gr.Textbox(label="Стандартное сообщение 1", lines=4, interactive=False)
247
  personalized_1 = gr.Textbox(label="Персонализированное сообщение 1", lines=4, interactive=False)
248
 
249
- # Второй ряд
250
  with gr.Row():
251
  non_personalized_2 = gr.Textbox(label="Стандартное сообщение 2", lines=4, interactive=False)
252
  personalized_2 = gr.Textbox(label="Персонализированное сообщение 2", lines=4, interactive=False)
253
 
254
- # Третий ряд
255
  with gr.Row():
256
  non_personalized_3 = gr.Textbox(label="Стандартное сообщение 3", lines=4, interactive=False)
257
  personalized_3 = gr.Textbox(label="Персонализированное сообщение 3", lines=4, interactive=False)
258
 
259
- # Четвертый ряд
260
- with gr.Row():
261
- btn_check = gr.Button("Проверить", elem_id="check3")
262
- btn_check.click(fn=change_tab, inputs=[gr.Number(value=3, visible=False)], outputs=tabs)
263
 
264
  # Вкладка 4: Проверка
265
  with gr.TabItem("Проверка", id=3):
266
-
267
- # Заголовки столбцов
268
  with gr.Row():
269
  gr.Markdown("### Редактор")
270
- gr.Markdown("### Корректор") # Название для столбца "Копирайтер"
271
- gr.Markdown("### Аналитик") # Название для столбца "Редактор"
272
 
273
- # Первый ряд
274
  with gr.Row():
275
  personalized_message_1 = gr.Textbox(label="Персонализированное сообщение 1", lines=5)
276
  check_message_1 = gr.Textbox(label="Проверка сообщения 1", lines=5)
@@ -279,7 +220,6 @@ with gr.Blocks() as demo:
279
  success_forecast_1 = gr.Plot(label="Прогноз успешности сообщения 1")
280
  gr.HTML("</div>")
281
 
282
- # Второй ряд
283
  with gr.Row():
284
  personalized_message_2 = gr.Textbox(label="Персонализированное сообщение 2", lines=5)
285
  check_message_2 = gr.Textbox(label="Проверка сообщения 2", lines=5)
@@ -288,7 +228,6 @@ with gr.Blocks() as demo:
288
  success_forecast_2 = gr.Plot(label="Прогноз успешности сообщения 2")
289
  gr.HTML("</div>")
290
 
291
- # Третий ряд
292
  with gr.Row():
293
  personalized_message_3 = gr.Textbox(label="Персонализированное сообщение 3", lines=5)
294
  check_message_3 = gr.Textbox(label="Проверка сообщения 3", lines=5)
@@ -297,7 +236,7 @@ with gr.Blocks() as demo:
297
  success_forecast_3 = gr.Plot(label="Прогноз успешности сообщения 3")
298
  gr.HTML("</div>")
299
 
300
- # Кнопка для обновления спидометров
301
  btn_check.click(fn=generate_random_gauges, inputs=[], outputs=[success_forecast_1, success_forecast_2, success_forecast_3])
302
 
303
  demo.launch()
 
2
  import plotly.graph_objects as go
3
  import random
4
  import pandas as pd
5
+ from langchain.schema import SystemMessage
6
+ from langchain_community.chat_models.gigachat import GigaChat
7
+ from openpyxl import load_workbook
8
+
9
+ # Авторизация в GigaChat Pro
10
+ gc_key = os.getenv('GC_KEY')
11
+ chat_pro = GigaChat(credentials=gc_key, model='GigaChat-Pro', max_tokens=68, temperature=1, verify_ssl_certs=False)
12
 
13
  # Загрузка данных из Excel-файла
14
  try:
 
22
  for sheet_name, df in data.items():
23
  try:
24
  if sheet_name == "Пол Поколение Психотип":
 
25
  features[sheet_name] = df.set_index(['Пол', 'Поколение', 'Психотип'])['Инструкция'].to_dict()
26
  else:
27
  features[sheet_name] = df.set_index(df.columns[0]).to_dict()[df.columns[1]]
 
29
  print(f"Ошибка при обработке данных листа {sheet_name}: {e}")
30
  features[sheet_name] = {}
31
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
  # Функция для создания спидометра
33
  def create_gauge(value):
34
  fig = go.Figure(go.Indicator(
 
50
  },
51
  number={'font': {'size': 48}} # Размер шрифта числа
52
  ))
53
+ fig.update_layout(paper_bgcolor="#f8f9fa", font={'color': "#2d3436", 'family': "Arial"}, width=250, height=150)
 
 
 
 
54
  return fig
55
 
56
  # Функция для генерации случайных значений спидометров
 
61
  def change_tab(id):
62
  return gr.Tabs(selected=id)
63
 
64
+ # Вспомогательная функция для добавления префиксов и суффиксов
65
+ def add_prefix_suffix(prompt, prefix, suffix):
66
+ return f"{prefix}\n{prompt}\n{suffix}"
67
+
68
+ # Функция для обрезки сообщения до последнего знака препинания
69
+ def clean_message(message):
70
+ if not message.endswith(('.', '!', '?')):
71
+ last_period = max(message.rfind('.'), message.rfind('!'), message.rfind('?'))
72
+ if last_period != -1:
73
+ message = message[:last_period + 1]
74
+ return message
75
+
76
+ # Функция для генерации сообщения с GigaChat Pro
77
+ def generate_message_gigachat_pro(prompt):
78
+ try:
79
+ messages = [SystemMessage(content=prompt)]
80
+ res = chat_pro(messages)
81
+ cleaned_message = clean_message(res.content.strip())
82
+ return cleaned_message
83
+ except Exception as e:
84
+ return f"Ошибка при обращении к GigaChat-Pro: {e}"
85
+
86
+ # Функция для повторной генерации сообщения, пока оно не станет короче 250 знаков
87
+ def generate_message_gigachat_pro_with_retry(prompt):
88
+ for _ in range(10):
89
+ message = generate_message_gigachat_pro(prompt)
90
+ if len(message) <= 250:
91
+ return message
92
+ return message
93
+
94
+ # Функция для генерации всех сообщений
95
+ def generate_all_messages(non_personalized_prompt, personalized_prompt):
96
+ # Варианты предложений для начала и конца
97
+ prefixes = [
98
+ "Начни сообщение с призыва к действию с продуктом.",
99
+ "Начни сообщение с указания на пользу продукта. Используй глагол в побудительном наклонении.",
100
+ "Начни сообщение с вопроса, который указывает на пользу продукта для клиента."
101
+ ]
102
+ suffixes = [
103
+ "Убедись, что готовый текст начинается с призыва к действию с продуктом.",
104
+ "Убедись, что готовый текст начинается с указания на пользу продукта и использования глагола в побудительном наклонении.",
105
+ "Убедись, что готовый текст начинается с вопроса, который указывает на пользу продукта для клиента."
106
+ ]
107
+
108
+ non_personalized_messages = []
109
+ personalized_messages = []
110
+
111
+ # Генерация трех неперсонализированных сообщений
112
+ for i in range(3):
113
+ prompt = add_prefix_suffix(non_personalized_prompt, prefixes[i], suffixes[i])
114
+ message = generate_message_gigachat_pro_with_retry(prompt)
115
+ non_personalized_messages.append(message)
116
+
117
+ # Генерация трех персонализированных сообщений
118
+ for i in range(3):
119
+ full_personalized_prompt = f"{personalized_prompt}\n\nТекст для адаптации: {non_personalized_messages[i]}"
120
+ prompt = add_prefix_suffix(full_personalized_prompt, prefixes[i], suffixes[i])
121
+ message = generate_message_gigachat_pro_with_retry(prompt)
122
+ personalized_messages.append(message)
123
+
124
+ return non_personalized_messages, personalized_messages
125
+
126
+ # Интерфейс Gradio
127
  with gr.Blocks() as demo:
128
  with gr.Tabs() as tabs:
129
 
 
163
  )
164
 
165
  with gr.Column():
 
166
  gender = gr.Dropdown(label="Пол", choices=[None] + list(features.get('Пол', {}).keys()))
167
  generation = gr.Dropdown(label="Поколение", choices=[None] + list(features.get('Поколение', {}).keys()))
168
  psychotype = gr.Dropdown(label="Психотип", choices=[None] + list(features.get('Психотип', {}).keys()))
 
172
 
173
  btn_to_prompts = gr.Button("Создать")
174
  btn_to_prompts.click(fn=change_tab, inputs=[gr.Number(value=1, visible=False)], outputs=tabs)
175
+
176
  # Вкладка 2: Промпты
177
  with gr.TabItem("Ассистент", id=1):
178
  with gr.Row():
179
  with gr.Column():
180
  non_personalized_prompt = gr.Textbox(
181
+ label="Неперсонализированный промпт",
182
  lines=25,
183
  interactive=False)
184
  with gr.Column():
185
  personalized_prompt = gr.Textbox(label="Задание для редактора", lines=25) # Увеличенная высота
 
 
 
 
 
 
 
 
 
 
 
 
 
 
186
 
187
  # Вкладка 3: Сообщения
188
  with gr.TabItem("Сообщения", id=2):
 
 
189
  with gr.Row():
190
+ gr.Markdown("### Копирайтер")
191
+ gr.Markdown("### Редактор")
192
 
 
193
  with gr.Row():
194
  non_personalized_1 = gr.Textbox(label="Стандартное сообщение 1", lines=4, interactive=False)
195
  personalized_1 = gr.Textbox(label="Персонализированное сообщение 1", lines=4, interactive=False)
196
 
 
197
  with gr.Row():
198
  non_personalized_2 = gr.Textbox(label="Стандартное сообщение 2", lines=4, interactive=False)
199
  personalized_2 = gr.Textbox(label="Персонализированное сообщение 2", lines=4, interactive=False)
200
 
 
201
  with gr.Row():
202
  non_personalized_3 = gr.Textbox(label="Стандартное сообщение 3", lines=4, interactive=False)
203
  personalized_3 = gr.Textbox(label="Персонализированное сообщение 3", lines=4, interactive=False)
204
 
205
+ btn_generate_messages = gr.Button("Генерировать сообщения")
206
+ btn_generate_messages.click(fn=generate_all_messages, inputs=[non_personalized_prompt, personalized_prompt], outputs=[non_personalized_1, personalized_1, non_personalized_2, personalized_2, non_personalized_3, personalized_3])
 
 
207
 
208
  # Вкладка 4: Проверка
209
  with gr.TabItem("Проверка", id=3):
 
 
210
  with gr.Row():
211
  gr.Markdown("### Редактор")
212
+ gr.Markdown("### Корректор")
213
+ gr.Markdown("### Аналитик")
214
 
 
215
  with gr.Row():
216
  personalized_message_1 = gr.Textbox(label="Персонализированное сообщение 1", lines=5)
217
  check_message_1 = gr.Textbox(label="Проверка сообщения 1", lines=5)
 
220
  success_forecast_1 = gr.Plot(label="Прогноз успешности сообщения 1")
221
  gr.HTML("</div>")
222
 
 
223
  with gr.Row():
224
  personalized_message_2 = gr.Textbox(label="Персонализированное сообщение 2", lines=5)
225
  check_message_2 = gr.Textbox(label="Проверка сообщения 2", lines=5)
 
228
  success_forecast_2 = gr.Plot(label="Прогноз успешности сообщения 2")
229
  gr.HTML("</div>")
230
 
 
231
  with gr.Row():
232
  personalized_message_3 = gr.Textbox(label="Персонализированное сообщение 3", lines=5)
233
  check_message_3 = gr.Textbox(label="Проверка сообщения 3", lines=5)
 
236
  success_forecast_3 = gr.Plot(label="Прогноз успешности сообщения 3")
237
  gr.HTML("</div>")
238
 
239
+ btn_check = gr.Button("Проверить")
240
  btn_check.click(fn=generate_random_gauges, inputs=[], outputs=[success_forecast_1, success_forecast_2, success_forecast_3])
241
 
242
  demo.launch()