fruitpicker01
commited on
Commit
•
2ca7cf0
1
Parent(s):
4cee8b6
Update app.py
Browse files
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 |
-
"В тексте смс запрещено
|
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"
|
73 |
return prompt.strip()
|
74 |
|
75 |
-
# Функция
|
76 |
-
def generate_personalization_prompt(
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
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 |
-
# Функция
|
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 |
-
# Функция
|
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 =
|
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 =
|
153 |
personalized_messages.append(message)
|
154 |
|
155 |
return non_personalized_messages, personalized_messages
|
156 |
|
157 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
167 |
-
|
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=[
|
193 |
-
generation = gr.Dropdown(label="Поколение", choices=[
|
194 |
-
psychotype = gr.
|
195 |
-
business_stage = gr.
|
196 |
-
industry = gr.
|
197 |
-
opf = gr.
|
198 |
-
|
|
|
|
|
|
|
199 |
non_personalized_prompt = gr.Textbox(label="Задание для копирайтера", lines=25, interactive=False)
|
200 |
personalized_prompt = gr.Textbox(label="Задание для редактора", lines=25)
|
201 |
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
208 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
209 |
|
210 |
# Вкладка 2: Промпты
|
211 |
with gr.TabItem("Ассистент", id=1):
|
212 |
with gr.Row():
|
213 |
with gr.Column():
|
214 |
-
|
215 |
-
non_personalized_prompt # Здесь не нужно вызывать render(), просто добавьте блок
|
216 |
with gr.Column():
|
217 |
-
|
218 |
-
|
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
|
228 |
-
personalized_1
|
229 |
|
|
|
230 |
with gr.Row():
|
231 |
-
non_personalized_2
|
232 |
-
personalized_2
|
233 |
|
|
|
234 |
with gr.Row():
|
235 |
-
non_personalized_3
|
236 |
-
personalized_3
|
237 |
|
238 |
-
|
239 |
-
|
240 |
-
|
241 |
-
|
242 |
-
|
243 |
-
|
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()
|