fruitpicker01
commited on
Commit
•
6839970
1
Parent(s):
2ca7cf0
Update app.py
Browse files
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
|
6 |
-
from langchain_community.chat_models.gigachat import GigaChat
|
7 |
|
8 |
# Авторизация в GigaChat Pro
|
9 |
-
gc_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
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
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 |
-
|
|
|
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 =
|
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 =
|
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(
|
119 |
-
|
120 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
121 |
with gr.Column():
|
122 |
-
gender = gr.Dropdown(label="Пол", choices=[
|
123 |
-
generation = gr.Dropdown(label="Поколение", choices=[
|
124 |
-
psychotype = gr.
|
125 |
-
business_stage = gr.
|
126 |
-
industry = gr.
|
127 |
-
opf = gr.
|
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.
|
|
|
|
|
|
|
156 |
with gr.Column():
|
157 |
-
personalized_prompt.
|
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.
|
170 |
-
personalized_1.
|
171 |
|
172 |
-
# Второй ряд
|
173 |
with gr.Row():
|
174 |
-
non_personalized_2.
|
175 |
-
personalized_2.
|
176 |
|
177 |
-
# Третий ряд
|
178 |
with gr.Row():
|
179 |
-
non_personalized_3.
|
180 |
-
personalized_3.
|
|
|
|
|
|
|
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()
|