fruitpicker01 commited on
Commit
2ca7cf0
1 Parent(s): 4cee8b6

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +91 -136
app.py CHANGED
@@ -1,9 +1,9 @@
1
  import os
2
  import gradio as gr
 
3
  import pandas as pd
4
  from langchain.schema import SystemMessage
5
  from langchain_community.chat_models.gigachat import GigaChat
6
- from openpyxl import load_workbook
7
 
8
  # Авторизация в GigaChat Pro
9
  gc_key = os.getenv('GPT_KEY')
@@ -32,71 +32,28 @@ for sheet_name, df in data.items():
32
  def add_prefix_suffix(prompt, prefix, suffix):
33
  return f"{prefix}\n{prompt}\n{suffix}"
34
 
35
- # Функция для генерации стандартного промпта
36
  def generate_standard_prompt(description, advantages, key_message):
37
  prompt = (
38
  f"Сгенерируй смс-сообщение для клиента.\n"
39
  f"Описание предложения: {description}\n"
40
  f"Преимущества: {advantages}\n"
41
- "В тексте смс запрещено использование:\n"
42
- "- Запрещенные слова: № один, номер один, № 1, вкусный, дешёвый, продукт, спам, доступный, банкротство, долги, займ, срочно, сейчас, лучший, главный, номер 1, гарантия, успех, лидер;\n"
43
- "- Обращение к клиенту;\n"
44
- "- Приветствие клиента;\n"
45
- "- Обещания и гарантии;\n"
46
- "- Использовать составные конструкции из двух глаголов;\n"
47
- "- Причастия и причастные обороты;\n"
48
- "- Деепричастия и деепричастные обороты;\n"
49
- "- Превосходная степень прилагательных;\n"
50
- "- Страдательный залог;\n"
51
- "- Порядковые числительные от 10 прописью;\n"
52
- "- Цепочки с придаточными предложениями;\n"
53
- "- Разделительные повторяющиеся союзы;\n"
54
- "- Вводные конструкции;\n"
55
- "- Усилители;\n"
56
- "- Паразиты времени;\n"
57
- "- Несколько существительных подряд, в том числе отглагольных;\n"
58
- "- Производные предлоги;\n"
59
- "- Сложные предложения, в которых нет связи между частями;\n"
60
- "- Сложноподчинённые предложения;\n"
61
- "- Даты прописью;\n"
62
- "- Близкие по смыслу однородные члены предложения;\n"
63
- "- Шокирующие, экстравагантные, кликбейтные фразы;\n"
64
- "- Абстрактные заявления без поддержки фактами и отсутствие доказательства пользы для клиента;\n"
65
- "- Гарантирующие фразы;\n"
66
- "- Узкоспециализированные термины;\n"
67
- "- Фразы, способные создать двойственное ощущение, обидеть;\n"
68
- "- Речевые клише, рекламные штампы, канцеляризмы;\n"
69
- "Убедись, что в готовом тексте до 250 знаков с пробелами.\n"
70
  )
71
  if key_message.strip():
72
- prompt += f"Убедись, что в готовом тексте есть следующая ключевая информация: {key_message.strip()}"
73
  return prompt.strip()
74
 
75
- # Функция для генерации персонализированного промпта
76
- def generate_personalization_prompt(key_message, gender, generation, psychotype, business_stage, industry, opf):
77
- prompt = "Адаптируй, не превышая длину сообщения в 250 знаков с пробелами, текст с учетом следующих особенностей:\n"
78
- combined_instruction = ""
79
- additional_instructions = ""
80
-
81
- if gender and generation and psychotype:
82
- key = (gender, generation, psychotype)
83
- combined_instruction = features.get("Пол Поколение Психотип", {}).get(key, "")
84
-
85
- if not combined_instruction:
86
- additional_instructions += f"{features.get('Пол', {}).get(gender, '')}\n"
87
- additional_instructions += f"{features.get('Поколение', {}).get(generation, '')}\n"
88
- additional_instructions += f"{features.get('Психотип', {}).get(psychotype, '')}\n"
89
-
90
- additional_instructions += f"{features.get('Стадия бизнеса', {}).get(business_stage, '')}\n"
91
- additional_instructions += f"{features.get('Отрасль', {}).get(industry, '')}\n"
92
- additional_instructions += f"{features.get('ОПФ', {}).get(opf, '')}\n"
93
-
94
- prompt += combined_instruction if combined_instruction else additional_instructions
95
- prompt += f"Убедись, что в готовом тексте есть следующая ключевая информация: {key_message.strip()}"
96
-
97
- return prompt.strip()
98
 
99
- # Функция для генерации сообщения с GigaChat Pro
100
  def generate_message_gigachat_pro(prompt):
101
  try:
102
  messages = [SystemMessage(content=prompt)]
@@ -105,26 +62,8 @@ def generate_message_gigachat_pro(prompt):
105
  except Exception as e:
106
  return f"Ошибка при обращении к GigaChat-Pro: {e}"
107
 
108
- # Функция для повторной генерации сообщения, пока оно не станет короче 250 знаков
109
- def generate_message_gigachat_pro_with_retry(prompt):
110
- for _ in range(10):
111
- message = generate_message_gigachat_pro(prompt)
112
- if len(message) <= 250:
113
- return message
114
- return message
115
-
116
- # Функция для обработки генерации промптов и сообщений
117
- def handle_generation(desc, benefits, key_message, gender, generation, psychotype, business_stage, industry, opf):
118
- # Генерация стандартного промпта
119
- standard_prompt = generate_standard_prompt(desc, benefits, key_message)
120
- # Генерация персонализированного промпта
121
- personalization_prompt = generate_personalization_prompt(key_message, gender, generation, psychotype, business_stage, industry, opf)
122
-
123
- return standard_prompt, personalization_prompt
124
-
125
- # Функция для генерации всех сообщений
126
  def generate_all_messages(non_personalized_prompt, personalized_prompt):
127
- # Варианты предложений для начала и конца
128
  prefixes = [
129
  "Начни сообщение с призыва к действию с продуктом.",
130
  "Начни сообщение с указания на пользу продукта. Используй глагол в побудительном наклонении.",
@@ -142,19 +81,33 @@ def generate_all_messages(non_personalized_prompt, personalized_prompt):
142
  # Генерация трех неперсонализированных сообщений
143
  for i in range(3):
144
  prompt = add_prefix_suffix(non_personalized_prompt, prefixes[i], suffixes[i])
145
- message = generate_message_gigachat_pro_with_retry(prompt)
146
  non_personalized_messages.append(message)
147
 
148
  # Генерация трех персонализированных сообщений
149
  for i in range(3):
150
  full_personalized_prompt = f"{personalized_prompt}\n\nТекст для адаптации: {non_personalized_messages[i]}"
151
  prompt = add_prefix_suffix(full_personalized_prompt, prefixes[i], suffixes[i])
152
- message = generate_message_gigachat_pro_with_retry(prompt)
153
  personalized_messages.append(message)
154
 
155
  return non_personalized_messages, personalized_messages
156
 
157
- # Интерфейс Gradio
 
 
 
 
 
 
 
 
 
 
 
 
 
 
158
  with gr.Blocks() as demo:
159
  with gr.Tabs() as tabs:
160
 
@@ -162,85 +115,87 @@ with gr.Blocks() as demo:
162
  with gr.TabItem("Исходные данные", id=0):
163
  with gr.Row():
164
  with gr.Column():
165
- desc = gr.Textbox(
166
- label="Описание предложения (предзаполненный пример можно поменять на свой)",
167
- lines=7,
168
- value=(
169
- "Необходимо предложить клиенту оформить дебетовую премиальную бизнес-карту Mastercard Preffered. "
170
- "Обслуживание карты стоит 700 рублей в месяц, но клиент может пользоваться ей бесплатно. "
171
- "Что необходимо сделать, чтобы воспользоваться предложением:\n"
172
- "1. Оформить премиальную бизнес-карту в офисе банка или онлайн в интернет-банке СберБизнес.\n"
173
- "2. Забрать карту.\n"
174
- "3. В течение календарного месяца совершить по ней покупки на сумму от 100 000 рублей.\n"
175
- "4. В течение следующего месяца пользоваться ей бесплатно."
176
- )
177
- )
178
- benefits = gr.Textbox(
179
- label="Преимущества (предзаполненный пример можно поменять на свой)",
180
- lines=5,
181
- value=(
182
- "Предложение по бесплатному обслуживанию — бессрочное.\n"
183
- "Оплата покупок без отчётов и платёжных поручений.\n"
184
- "Платёжные документы без комиссии.\n"
185
- "Лимиты на расходы сотрудников.\n"
186
- "Мгновенные переводы на карты любых банков."
187
- )
188
- )
189
- key_message = gr.Textbox(label="Ключевое сообщение (предзаполненный пример можно поменять на свой)", lines=3, value="Бесплатное обслуживание при покупках от 100 000 рублей в месяц.")
190
-
191
  with gr.Column():
192
- gender = gr.Dropdown(label="Пол", choices=[None] + list(features.get('Пол', {}).keys()))
193
- generation = gr.Dropdown(label="Поколение", choices=[None] + list(features.get('Поколение', {}).keys()))
194
- psychotype = gr.Dropdown(label="Психотип", choices=[None] + list(features.get('Психотип', {}).keys()))
195
- business_stage = gr.Dropdown(label="Стадия бизнеса", choices=[None] + list(features.get('Стадия бизнеса', {}).keys()))
196
- industry = gr.Dropdown(label="Отрасль", choices=[None] + list(features.get('Отрасль', {}).keys()))
197
- opf = gr.Dropdown(label="ОПФ", choices=[None] + list(features.get('ОПФ', {}).keys()))
198
-
 
 
 
199
  non_personalized_prompt = gr.Textbox(label="Задание для копирайтера", lines=25, interactive=False)
200
  personalized_prompt = gr.Textbox(label="Задание для редактора", lines=25)
201
 
202
- btn_generate_prompts = gr.Button("Создать")
203
- # Привязка кнопки к функции генерации промптов
204
- btn_generate_prompts.click(
205
- fn=handle_generation,
206
- inputs=[desc, benefits, key_message, gender, generation, psychotype, business_stage, industry, opf],
207
- outputs=[non_personalized_prompt, personalized_prompt]
208
- )
 
 
 
 
 
 
 
 
209
 
210
  # Вкладка 2: Промпты
211
  with gr.TabItem("Ассистент", id=1):
212
  with gr.Row():
213
  with gr.Column():
214
- gr.Markdown("Промпт для копирайтера:")
215
- non_personalized_prompt # Здесь не нужно вызывать render(), просто добавьте блок
216
  with gr.Column():
217
- gr.Markdown("Промпт для редактора:")
218
- personalized_prompt # Аналогично, не вызывайте render()
219
-
220
  # Вкладка 3: Сообщения
221
  with gr.TabItem("Сообщения", id=2):
 
 
222
  with gr.Row():
223
  gr.Markdown("### Копирайтер")
224
  gr.Markdown("### Редактор")
225
 
 
226
  with gr.Row():
227
- non_personalized_1 = gr.Textbox(label="Стандартное сообщение 1", lines=4, interactive=False)
228
- personalized_1 = gr.Textbox(label="Персонализированное сообщение 1", lines=4, interactive=False)
229
 
 
230
  with gr.Row():
231
- non_personalized_2 = gr.Textbox(label="Стандартное сообщение 2", lines=4, interactive=False)
232
- personalized_2 = gr.Textbox(label="Персонализированное сообщение 2", lines=4, interactive=False)
233
 
 
234
  with gr.Row():
235
- non_personalized_3 = gr.Textbox(label="Стандартное сообщение 3", lines=4, interactive=False)
236
- personalized_3 = gr.Textbox(label="Персонализированное сообщение 3", lines=4, interactive=False)
237
 
238
- # Привязка кнопки для генерации сообщений
239
- btn_generate_messages = gr.Button("Генерировать сообщения")
240
- btn_generate_messages.click(
241
- fn=generate_all_messages,
242
- inputs=[non_personalized_prompt, personalized_prompt],
243
- outputs=[non_personalized_1, personalized_1, non_personalized_2, personalized_2, non_personalized_3, personalized_3]
244
- )
 
 
 
 
 
 
 
245
 
 
 
 
 
246
  demo.launch()
 
1
  import os
2
  import gradio as gr
3
+ import random
4
  import pandas as pd
5
  from langchain.schema import SystemMessage
6
  from langchain_community.chat_models.gigachat import GigaChat
 
7
 
8
  # Авторизация в GigaChat Pro
9
  gc_key = os.getenv('GPT_KEY')
 
32
  def add_prefix_suffix(prompt, prefix, suffix):
33
  return f"{prefix}\n{prompt}\n{suffix}"
34
 
35
+ # Функция генерации стандартного промпта
36
  def generate_standard_prompt(description, advantages, key_message):
37
  prompt = (
38
  f"Сгенерируй смс-сообщение для клиента.\n"
39
  f"Описание предложения: {description}\n"
40
  f"Преимущества: {advantages}\n"
41
+ "В тексте смс запрещено использование запрещенных слов, обещаний, приветствий и пр. Убедись, что текст до 250 символов.\n"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
  )
43
  if key_message.strip():
44
+ prompt += f"Ключевое сообщение: {key_message.strip()}"
45
  return prompt.strip()
46
 
47
+ # Функция генерации персонализированного промпта
48
+ def generate_personalization_prompt(standard_message, gender, generation, psychotype, business_stage, industry, opf):
49
+ personalization_prompt = (
50
+ f"Адаптируй текст с учётом особенностей клиента:\n"
51
+ f"Пол: {gender}\nПоколение: {generation}\nПсихотип: {psychotype}\nСтадия бизнеса: {business_stage}\nОтрасль: {industry}\nОПФ: {opf}\n"
52
+ f"Текст для адаптации: {standard_message}"
53
+ )
54
+ return personalization_prompt.strip()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
55
 
56
+ # Функция генерации сообщений с GigaChat Pro
57
  def generate_message_gigachat_pro(prompt):
58
  try:
59
  messages = [SystemMessage(content=prompt)]
 
62
  except Exception as e:
63
  return f"Ошибка при обращении к GigaChat-Pro: {e}"
64
 
65
+ # Функция генерации всех сообщений
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
  def generate_all_messages(non_personalized_prompt, personalized_prompt):
 
67
  prefixes = [
68
  "Начни сообщение с призыва к действию с продуктом.",
69
  "Начни сообщение с указания на пользу продукта. Используй глагол в побудительном наклонении.",
 
81
  # Генерация трех неперсонализированных сообщений
82
  for i in range(3):
83
  prompt = add_prefix_suffix(non_personalized_prompt, prefixes[i], suffixes[i])
84
+ message = generate_message_gigachat_pro(prompt)
85
  non_personalized_messages.append(message)
86
 
87
  # Генерация трех персонализированных сообщений
88
  for i in range(3):
89
  full_personalized_prompt = f"{personalized_prompt}\n\nТекст для адаптации: {non_personalized_messages[i]}"
90
  prompt = add_prefix_suffix(full_personalized_prompt, prefixes[i], suffixes[i])
91
+ message = generate_message_gigachat_pro(prompt)
92
  personalized_messages.append(message)
93
 
94
  return non_personalized_messages, personalized_messages
95
 
96
+ # Функция генерации стандартного и персонализированного промптов
97
+ def handle_generation(desc, benefits, key_message, gender, generation, psychotype, business_stage, industry, opf):
98
+ non_personalized_prompt = generate_standard_prompt(desc, benefits, key_message)
99
+ personalized_prompt = generate_personalization_prompt(non_personalized_prompt, gender, generation, psychotype, business_stage, industry, opf)
100
+
101
+ # Генерация сообщений
102
+ non_personalized_messages, personalized_messages = generate_all_messages(non_personalized_prompt, personalized_prompt)
103
+
104
+ # Вернем промпты и сообщения
105
+ return non_personalized_prompt, personalized_prompt, non_personalized_messages, personalized_messages
106
+
107
+ # Функция для смены вкладки
108
+ def change_tab(id):
109
+ return gr.Tabs(selected=id)
110
+
111
  with gr.Blocks() as demo:
112
  with gr.Tabs() as tabs:
113
 
 
115
  with gr.TabItem("Исходные данные", id=0):
116
  with gr.Row():
117
  with gr.Column():
118
+ desc = gr.Textbox(label="Описание предложения", lines=6)
119
+ benefits = gr.Textbox(label="Преимущества", lines=5)
120
+ key_message = gr.Textbox(label="Ключевое сообщение", lines=5)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
121
  with gr.Column():
122
+ gender = gr.Dropdown(label="Пол", choices=["Мужчина", "Женщина", "Не указан"])
123
+ generation = gr.Dropdown(label="Поколение", choices=["Поколение Z", "Миллениалы", "Поколение X", "Бэби-бумеры"])
124
+ psychotype = gr.Textbox(label="Психотип")
125
+ business_stage = gr.Textbox(label="Стадия бизнеса")
126
+ industry = gr.Textbox(label="Отрасль")
127
+ opf = gr.Textbox(label="ОПФ")
128
+
129
+ # Кнопка "Создать" для генерации промптов и сообщений
130
+ btn_to_prompts = gr.Button("Создать")
131
+
132
  non_personalized_prompt = gr.Textbox(label="Задание для копирайтера", lines=25, interactive=False)
133
  personalized_prompt = gr.Textbox(label="Задание для редактора", lines=25)
134
 
135
+ non_personalized_1 = gr.Textbox(label="Стандартное сообщение 1", lines=4, interactive=False)
136
+ personalized_1 = gr.Textbox(label="Персонализированное сообщение 1", lines=4, interactive=False)
137
+ non_personalized_2 = gr.Textbox(label="Стандартное сообщение 2", lines=4, interactive=False)
138
+ personalized_2 = gr.Textbox(label="Персонализированное сообщение 2", lines=4, interactive=False)
139
+ non_personalized_3 = gr.Textbox(label="Стандартное сообщение 3", lines=4, interactive=False)
140
+ personalized_3 = gr.Textbox(label="Персонализированное сообщение 3", lines=4, interactive=False)
141
+
142
+ # Привязка кнопки к функции генерации и смены вкладки
143
+ btn_to_prompts.click(fn=handle_generation,
144
+ inputs=[desc, benefits, key_message, gender, generation, psychotype, business_stage, industry, opf],
145
+ outputs=[non_personalized_prompt, personalized_prompt,
146
+ non_personalized_1, personalized_1,
147
+ non_personalized_2, personalized_2,
148
+ non_personalized_3, personalized_3])
149
+ btn_to_prompts.click(fn=change_tab, inputs=[gr.Number(value=1)], outputs=tabs)
150
 
151
  # Вкладка 2: Промпты
152
  with gr.TabItem("Ассистент", id=1):
153
  with gr.Row():
154
  with gr.Column():
155
+ non_personalized_prompt.render()
 
156
  with gr.Column():
157
+ personalized_prompt.render()
158
+
 
159
  # Вкладка 3: Сообщения
160
  with gr.TabItem("Сообщения", id=2):
161
+
162
+ # Заголовки столбцов
163
  with gr.Row():
164
  gr.Markdown("### Копирайтер")
165
  gr.Markdown("### Редактор")
166
 
167
+ # Первый ряд
168
  with gr.Row():
169
+ non_personalized_1.render()
170
+ personalized_1.render()
171
 
172
+ # Второй ряд
173
  with gr.Row():
174
+ non_personalized_2.render()
175
+ personalized_2.render()
176
 
177
+ # Третий ряд
178
  with gr.Row():
179
+ non_personalized_3.render()
180
+ personalized_3.render()
181
 
182
+ # Вкладка 4: Проверка
183
+ with gr.TabItem("Проверка", id=3):
184
+ with gr.Row():
185
+ gr.Markdown("### Редактор")
186
+ gr.Markdown("### Корректор")
187
+ gr.Markdown("### Аналитик")
188
+
189
+ with gr.Row():
190
+ personalized_message_1 = gr.Textbox(label="Персонализированное сообщение 1", lines=5)
191
+ check_message_1 = gr.Textbox(label="Проверка сообщения 1", lines=5)
192
+
193
+ with gr.Row():
194
+ personalized_message_2 = gr.Textbox(label="Персонализированное сообщение 2", lines=5)
195
+ check_message_2 = gr.Textbox(label="Проверка сообщения 2", lines=5)
196
 
197
+ with gr.Row():
198
+ personalized_message_3 = gr.Textbox(label="Персонализированное сообщение 3", lines=5)
199
+ check_message_3 = gr.Textbox(label="Проверка сообщения 3", lines=5)
200
+
201
  demo.launch()