Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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 =
|
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
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
76 |
|
77 |
# Функция для генерации сообщения с GigaChat Pro
|
78 |
def generate_message_gigachat_pro(prompt):
|
79 |
try:
|
80 |
messages = [SystemMessage(content=prompt)]
|
81 |
res = chat_pro(messages)
|
82 |
-
|
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 |
-
|
175 |
-
|
|
|
|
|
|
|
|
|
|
|
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(
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
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()
|