fruitpicker01 commited on
Commit
e15b2e4
·
verified ·
1 Parent(s): d05f205

Update app.py

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