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

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +130 -91
app.py CHANGED
@@ -1,13 +1,12 @@
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')
10
- chat_pro = GigaChat(credentials=gc_key, model='GigaChat-Pro', max_tokens=68, temperature=1, verify_ssl_certs=False)
11
 
12
  # Загрузка данных из Excel-файла
13
  try:
@@ -28,42 +27,71 @@ for sheet_name, df in data.items():
28
  print(f"Ошибка при обработке данных листа {sheet_name}: {e}")
29
  features[sheet_name] = {}
30
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  # Вспомогательная функция для добавления префиксов и суффиксов
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)]
60
  res = chat_pro(messages)
61
- return res.content.strip()
 
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,33 +109,19 @@ def generate_all_messages(non_personalized_prompt, personalized_prompt):
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,69 +129,79 @@ with gr.Blocks() as demo:
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):
@@ -189,13 +213,28 @@ with gr.Blocks() as demo:
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()
 
 
1
  import gradio as gr
2
+ import plotly.graph_objects as go
3
  import random
4
  import pandas as pd
5
+ from gigachat import GigaChat, SystemMessage
 
6
 
7
  # Авторизация в GigaChat Pro
8
+ gc_key = "YOUR_GIGACHAT_KEY" # Замените на ваш ключ
9
+ chat_pro = GigaChat(credentials=gc_key, model='GigaChat-Pro-3', max_tokens=68, temperature=1, verify_ssl_certs=False)
10
 
11
  # Загрузка данных из Excel-файла
12
  try:
 
27
  print(f"Ошибка при обработке данных листа {sheet_name}: {e}")
28
  features[sheet_name] = {}
29
 
30
+ # Функция для создания спидометра
31
+ def create_gauge(value):
32
+ fig = go.Figure(go.Indicator(
33
+ mode="gauge+number",
34
+ value=value,
35
+ gauge={
36
+ 'axis': {'range': [0, 100]},
37
+ 'bar': {'color': "black"}, # Цвет стрелки
38
+ 'steps': [
39
+ {'range': [0, 40], 'color': "#55efc4"}, # Мягкий зеленый
40
+ {'range': [40, 70], 'color': "#ffeaa7"}, # Желтый
41
+ {'range': [70, 100], 'color': "#ff7675"} # Мягкий красный
42
+ ],
43
+ 'threshold': {
44
+ 'line': {'color': "black", 'width': 4},
45
+ 'thickness': 0.75,
46
+ 'value': value
47
+ }
48
+ },
49
+ number={'font': {'size': 48}} # Размер шрифта числа
50
+ ))
51
+ fig.update_layout(paper_bgcolor="#f8f9fa", font={'color': "#2d3436", 'family': "Arial"}, width=250, height=150)
52
+ return fig
53
+
54
+ # Функция для генерации случайных значений спидометров
55
+ def generate_random_gauges():
56
+ return create_gauge(random.randint(60, 90)), create_gauge(random.randint(60, 90)), create_gauge(random.randint(60, 90))
57
+
58
+ # Функция для смены вкладки
59
+ def change_tab(id):
60
+ return gr.Tabs(selected=id)
61
+
62
  # Вспомогательная функция для добавления префиксов и суффиксов
63
  def add_prefix_suffix(prompt, prefix, suffix):
64
  return f"{prefix}\n{prompt}\n{suffix}"
65
 
66
+ # Функция для обрезки сообщения до последнего знака препинания
67
+ def clean_message(message):
68
+ if not message.endswith(('.', '!', '?')):
69
+ last_period = max(message.rfind('.'), message.rfind('!'), message.rfind('?'))
70
+ if last_period != -1:
71
+ message = message[:last_period + 1]
72
+ return message
73
+
74
+ # Функция для генерации сообщения с GigaChat Pro
 
 
 
 
 
 
 
 
 
 
 
 
 
75
  def generate_message_gigachat_pro(prompt):
76
  try:
77
  messages = [SystemMessage(content=prompt)]
78
  res = chat_pro(messages)
79
+ cleaned_message = clean_message(res.content.strip())
80
+ return cleaned_message
81
  except Exception as e:
82
  return f"Ошибка при обращении к GigaChat-Pro: {e}"
83
 
84
+ # Функция для повторной генерации сообщения, пока оно не станет короче 250 знаков
85
+ def generate_message_gigachat_pro_with_retry(prompt):
86
+ for _ in range(10):
87
+ message = generate_message_gigachat_pro(prompt)
88
+ if len(message) <= 250:
89
+ return message
90
+ return message
91
+
92
+ # Функция для генерации всех сообщений
93
  def generate_all_messages(non_personalized_prompt, personalized_prompt):
94
+ # Варианты предложений для начала и конца
95
  prefixes = [
96
  "Начни сообщение с призыва к действию с продуктом.",
97
  "Начни сообщение с указания на пользу продукта. Используй глагол в побудительном наклонении.",
 
109
  # Генерация трех неперсонализированных сообщений
110
  for i in range(3):
111
  prompt = add_prefix_suffix(non_personalized_prompt, prefixes[i], suffixes[i])
112
+ message = generate_message_gigachat_pro_with_retry(prompt)
113
  non_personalized_messages.append(message)
114
 
115
  # Генерация трех персонализированных сообщений
116
  for i in range(3):
117
  full_personalized_prompt = f"{personalized_prompt}\n\nТекст для адаптации: {non_personalized_messages[i]}"
118
  prompt = add_prefix_suffix(full_personalized_prompt, prefixes[i], suffixes[i])
119
+ message = generate_message_gigachat_pro_with_retry(prompt)
120
  personalized_messages.append(message)
121
 
122
  return non_personalized_messages, personalized_messages
123
 
124
+ # Интерфейс Gradio
 
 
 
 
 
 
 
 
 
 
 
 
 
 
125
  with gr.Blocks() as demo:
126
  with gr.Tabs() as tabs:
127
 
 
129
  with gr.TabItem("Исходные данные", id=0):
130
  with gr.Row():
131
  with gr.Column():
132
+ desc = gr.Textbox(
133
+ label="Описание предложения (предзаполненный пример можно поменять на свой)",
134
+ lines=7,
135
+ value=(
136
+ "Необходимо предложить клиенту оформить дебетовую премиальную бизнес-карту Mastercard Preffered. "
137
+ "Обслуживание карты стоит 700 рублей в месяц, но клиент может пользоваться ей бесплатно. "
138
+ "Что необходимо сделать, чтобы воспользоваться предложением:\n"
139
+ "1. Оформить премиальную бизнес-карту в офисе банка или онлайн в интернет-банке СберБизнес.\n"
140
+ "2. Забрать карту.\n"
141
+ "3. В течение календарного месяца совершить по ней покупки на сумму от 100 000 рублей.\n"
142
+ "4. В течение следующего месяца пользоваться ей бесплатно."
143
+ )
144
+ )
145
+ benefits = gr.Textbox(
146
+ label="Преимущества (предзаполненный пример можно поменять на свой)",
147
+ lines=5,
148
+ value=(
149
+ "Предложение по бесплатному обслуживанию — бессрочное.\n"
150
+ "Оплата покупок без отчётов и платёжных поручений.\n"
151
+ "Платёжные документы без комиссии.\n"
152
+ "Лимиты на расходы сотрудников.\n"
153
+ "Мгновенные переводы на карты любых банков."
154
+ )
155
+ )
156
+
157
+ key_message = gr.Textbox(
158
+ label="Ключевое сообщение (предзаполненный пример можно поменять на свой)",
159
+ lines=3,
160
+ value="Бесплатное обслуживание при покупках от 100 000 рублей в месяц."
161
+ )
162
+
163
  with gr.Column():
164
+ gender = gr.Dropdown(label="Пол", choices=[None] + list(features.get('Пол', {}).keys()))
165
+ generation = gr.Dropdown(label="Поколение", choices=[None] + list(features.get('Поколение', {}).keys()))
166
+ psychotype = gr.Dropdown(label="Психотип", choices=[None] + list(features.get('Психотип', {}).keys()))
167
+ business_stage = gr.Dropdown(label="Стадия бизнеса", choices=[None] + list(features.get('Стадия бизнеса', {}).keys()))
168
+ industry = gr.Dropdown(label="Отрасль", choices=[None] + list(features.get('Отрасль', {}).keys()))
169
+ opf = gr.Dropdown(label="ОПФ", choices=[None] + list(features.get('ОПФ', {}).keys()))
170
+
 
171
  btn_to_prompts = gr.Button("Создать")
172
+ btn_to_prompts.click(fn=change_tab, inputs=[gr.Number(value=1, visible=False)], outputs=tabs)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
173
 
174
  # Вкладка 2: Промпты
175
  with gr.TabItem("Ассистент", id=1):
176
  with gr.Row():
177
  with gr.Column():
178
+ non_personalized_prompt = gr.Textbox(
179
+ label="Задание для копирайтера",
180
+ lines=25,
181
+ interactive=False)
182
  with gr.Column():
183
+ personalized_prompt = gr.Textbox(label="Задание для редактора", lines=25) # Увеличенная высота
184
 
185
  # Вкладка 3: Сообщения
186
  with gr.TabItem("Сообщения", id=2):
 
 
187
  with gr.Row():
188
  gr.Markdown("### Копирайтер")
189
  gr.Markdown("### Редактор")
190
 
 
191
  with gr.Row():
192
+ non_personalized_1 = gr.Textbox(label="Стандартное сообщение 1", lines=4, interactive=False)
193
+ personalized_1 = gr.Textbox(label="Персонализированное сообщение 1", lines=4, interactive=False)
194
 
 
195
  with gr.Row():
196
+ non_personalized_2 = gr.Textbox(label="Стандартное сообщение 2", lines=4, interactive=False)
197
+ personalized_2 = gr.Textbox(label="Персонализированное сообщение 2", lines=4, interactive=False)
198
 
 
199
  with gr.Row():
200
+ non_personalized_3 = gr.Textbox(label="Стандартное сообщение 3", lines=4, interactive=False)
201
+ personalized_3 = gr.Textbox(label="Персонализированное сообщение 3", lines=4, interactive=False)
202
+
203
+ btn_generate_messages = gr.Button("Генерировать сообщения")
204
+ 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])
205
 
206
  # Вкладка 4: Проверка
207
  with gr.TabItem("Проверка", id=3):
 
213
  with gr.Row():
214
  personalized_message_1 = gr.Textbox(label="Персонализированное сообщение 1", lines=5)
215
  check_message_1 = gr.Textbox(label="Проверка сообщения 1", lines=5)
216
+ with gr.Column():
217
+ gr.HTML("<div style='display:flex; justify-content:center; width:100%;'>")
218
+ success_forecast_1 = gr.Plot(label="Прогноз успешности сообщения 1")
219
+ gr.HTML("</div>")
220
 
221
  with gr.Row():
222
  personalized_message_2 = gr.Textbox(label="Персонализированное сообщение 2", lines=5)
223
  check_message_2 = gr.Textbox(label="Проверка сообщения 2", lines=5)
224
+ with gr.Column():
225
+ gr.HTML("<div style='display:flex; justify-content:center; width:100%;'>")
226
+ success_forecast_2 = gr.Plot(label="Прогноз успешности сообщения 2")
227
+ gr.HTML("</div>")
228
+
229
  with gr.Row():
230
  personalized_message_3 = gr.Textbox(label="Персонализированное сообщение 3", lines=5)
231
+ check_message_3 = gr.Textbox(label="Проверка сообщения 3", lines=5)
232
+ with gr.Column():
233
+ gr.HTML("<div style='display:flex; justify-content:center; width:100%;'>")
234
+ success_forecast_3 = gr.Plot(label="Прогноз успешности сообщения 3")
235
+ gr.HTML("</div>")
236
 
237
+ btn_check = gr.Button("Проверить")
238
+ btn_check.click(fn=generate_random_gauges, inputs=[], outputs=[success_forecast_1, success_forecast_2, success_forecast_3])
239
+
240
  demo.launch()