Spaces:
Sleeping
Sleeping
fruitpicker01
commited on
Commit
•
7aee395
1
Parent(s):
c2fba02
Update app.py
Browse files
app.py
CHANGED
@@ -1,3 +1,4 @@
|
|
|
|
1 |
import gradio as gr
|
2 |
import os
|
3 |
import pandas as pd
|
@@ -31,70 +32,124 @@ for sheet_name, df in data.items():
|
|
31 |
print(f"Ошибка при обработке данных листа {sheet_name}: {e}")
|
32 |
features[sheet_name] = {}
|
33 |
|
34 |
-
# Функция для создания
|
35 |
-
def
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
57 |
|
58 |
-
# Функция для
|
59 |
-
def
|
60 |
-
|
|
|
|
|
|
|
61 |
|
62 |
-
|
63 |
-
def change_tab(id):
|
64 |
-
return gr.Tabs(selected=id)
|
65 |
|
66 |
-
#
|
67 |
-
|
68 |
-
|
|
|
69 |
|
70 |
-
#
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
|
78 |
-
#
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
87 |
|
88 |
-
# Функция для повторной генерации сообщения, пока оно не станет короче 250 знаков
|
89 |
-
def generate_message_gigachat_pro_with_retry(prompt):
|
90 |
-
for _ in range(10):
|
91 |
-
message = generate_message_gigachat_pro(prompt)
|
92 |
-
if len(message) <= 250:
|
93 |
-
return message
|
94 |
-
return message
|
95 |
|
96 |
# Функция для постепенной генерации всех сообщений через yield
|
97 |
-
def generate_all_messages(desc, benefits, key_message):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
98 |
# Варианты предложений для начала и конца
|
99 |
prefixes = [
|
100 |
"Начни сообщение с призыва к действию с продуктом.",
|
@@ -110,32 +165,16 @@ def generate_all_messages(desc, benefits, key_message):
|
|
110 |
non_personalized_messages = []
|
111 |
personalized_messages = []
|
112 |
|
113 |
-
# Формируем общий неперсонализированный текст для использования в сообщениях
|
114 |
-
non_personalized_prompt = f"{desc}\n\nПреимущества:\n{benefits}\n\nКлючевое сообщение: {key_message}"
|
115 |
-
personalized_prompt = f"Персонализированное сообщение для клиента: {desc}\n\n{benefits}\n\nКлючевое сообщение: {key_message}"
|
116 |
-
|
117 |
-
# Выводим задание для копирайтера
|
118 |
-
yield non_personalized_prompt, None, None, None, None, None, None, None
|
119 |
-
|
120 |
-
# Небольшая пауза для демонстрации постепенной генерации
|
121 |
-
time.sleep(1)
|
122 |
-
|
123 |
-
# Выводим задание для редактора
|
124 |
-
yield non_personalized_prompt, personalized_prompt, None, None, None, None, None, None
|
125 |
-
|
126 |
-
# Небольшая пауза для демонстрации постепенной генерации
|
127 |
-
time.sleep(1)
|
128 |
-
|
129 |
# Генерация и постепенная подача каждого сообщения
|
130 |
for i in range(3):
|
131 |
# Генерация неперсонализированного сообщения
|
132 |
-
prompt = add_prefix_suffix(
|
133 |
non_personalized_message = generate_message_gigachat_pro_with_retry(prompt)
|
134 |
non_personalized_messages.append(non_personalized_message)
|
135 |
|
136 |
# Выводим неперсонализированное сообщение
|
137 |
yield (
|
138 |
-
|
139 |
non_personalized_messages[0] if i >= 0 else None, # Первое неперсонализированное сообщение
|
140 |
personalized_messages[0] if len(personalized_messages) > 0 else None, # Первое персонализированное сообщение, если оно уже есть
|
141 |
non_personalized_messages[1] if i >= 1 else None, # Второе неперсонализированное сообщение
|
@@ -145,13 +184,13 @@ def generate_all_messages(desc, benefits, key_message):
|
|
145 |
)
|
146 |
|
147 |
# Генерация персонализированного сообщения
|
148 |
-
full_personalized_prompt = f"{
|
149 |
personalized_message = generate_message_gigachat_pro_with_retry(full_personalized_prompt)
|
150 |
personalized_messages.append(personalized_message)
|
151 |
|
152 |
# Выводим персонализированное сообщение
|
153 |
yield (
|
154 |
-
|
155 |
non_personalized_messages[0] if len(non_personalized_messages) > 0 else None, # Первое неперсонализированное сообщение
|
156 |
personalized_messages[0] if len(personalized_messages) > 0 else None, # Первое персонализированное сообщение
|
157 |
non_personalized_messages[1] if len(non_personalized_messages) > 1 else None, # Второе неперсонализированное сообщение
|
@@ -249,11 +288,11 @@ with gr.Blocks() as demo:
|
|
249 |
# Сначала переключаем вкладку, потом запускаем генерацию сообщений
|
250 |
btn_to_prompts.click(
|
251 |
fn=change_tab,
|
252 |
-
inputs=[gr.Number(value=1, visible=False)], # Переключение на вкладку "
|
253 |
outputs=tabs # Обновляем вкладку
|
254 |
).then(
|
255 |
fn=generate_all_messages,
|
256 |
-
inputs=[desc, benefits, key_message], # Входные текстовые поля
|
257 |
outputs=[
|
258 |
non_personalized_prompt, personalized_prompt, # Поля для задания копирайтера и редактора (на вкладке "Ассистент")
|
259 |
non_personalized_1, personalized_1, # Сообщения на вкладке "Сообщения"
|
|
|
1 |
+
import re # Добавляем импорт re для возможного редактирования текста
|
2 |
import gradio as gr
|
3 |
import os
|
4 |
import pandas as pd
|
|
|
32 |
print(f"Ошибка при обработке данных листа {sheet_name}: {e}")
|
33 |
features[sheet_name] = {}
|
34 |
|
35 |
+
# Функция для создания задания для копирайтера
|
36 |
+
def generate_standard_prompt(description, advantages, key_message, *selected_values):
|
37 |
+
prompt = (
|
38 |
+
f"Сгенерируй смс-сообщение для клиента.\n"
|
39 |
+
f"Описание предложения: {description}\n"
|
40 |
+
f"Преимущества: {advantages}\n"
|
41 |
+
"В тексте смс запрещено использование:\n"
|
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"Убедись, что в готовом тексте есть следующая ключевая информация: {key_message.strip()}"
|
73 |
+
|
74 |
+
return prompt
|
75 |
|
76 |
+
# Функция для создания задания для редактора
|
77 |
+
def generate_personalization_prompt(key_message, *selected_values):
|
78 |
+
prompt = "Адаптируй, не прев��шая длину сообщения в 250 знаков с пробелами, текст с учетом следующих особенностей:\n"
|
79 |
+
gender, generation, psychotype = selected_values[0], selected_values[1], selected_values[2]
|
80 |
+
combined_instruction = ""
|
81 |
+
additional_instructions = ""
|
82 |
|
83 |
+
print(f"Выбранные значения: Пол={gender}, Поколение={generation}, Психотип={psychotype}")
|
|
|
|
|
84 |
|
85 |
+
# Проверяем, выбраны ли все три параметра: Пол, Поколение, Психотип
|
86 |
+
if gender and generation and psychotype:
|
87 |
+
# Получаем данные с листа "Пол Поколение Психотип"
|
88 |
+
sheet = features.get("Пол Поколение Психотип", {})
|
89 |
|
90 |
+
# Ищем ключ, соответствующий комбинации "Пол", "Поколение", "Психотип"
|
91 |
+
key = (gender, generation, psychotype)
|
92 |
+
if key in sheet:
|
93 |
+
combined_instruction = sheet[key]
|
94 |
+
print(f"Найдена комбинированная инструкция: {combined_instruction}")
|
95 |
+
else:
|
96 |
+
print(f"Комбинированная инструкция для ключа {key} не найдена.")
|
97 |
|
98 |
+
# Если не найдена комбинированная инструкция, добавляем индивидуальные инструкции
|
99 |
+
if not combined_instruction:
|
100 |
+
print("Добавляем индивидуальные инструкции для Пол, Поколение, Психотип.")
|
101 |
+
for i, feature in enumerate(["Пол", "Поколение", "Психотип"]):
|
102 |
+
if selected_values[i]:
|
103 |
+
try:
|
104 |
+
instruction = features[feature][selected_values[i]]
|
105 |
+
additional_instructions += f"{instruction}\n"
|
106 |
+
print(f"Добавлена инструкция из {feature}: {instruction}")
|
107 |
+
except KeyError:
|
108 |
+
return f"Ошибка: выбранное значение {selected_values[i]} не найдено в данных."
|
109 |
+
|
110 |
+
# Добавляем инструкции для остальных параметров (например, Отрасль)
|
111 |
+
for i, feature in enumerate(features.keys()):
|
112 |
+
if feature not in ["Пол", "Поколение", "Психотип", "Пол Поколение Психотип"]:
|
113 |
+
if i < len(selected_values) and selected_values[i]:
|
114 |
+
try:
|
115 |
+
instruction = features[feature][selected_values[i]]
|
116 |
+
additional_instructions += f"{instruction}\n"
|
117 |
+
print(f"Добавлена инструкция из {feature}: {instruction}")
|
118 |
+
except KeyError:
|
119 |
+
return f"Ошибка: выбранное значение {selected_values[i]} не найдено в данных."
|
120 |
+
|
121 |
+
# Формируем итоговый промпт
|
122 |
+
if combined_instruction:
|
123 |
+
prompt += combined_instruction # Добавляем комбинированную инструкцию, если она есть
|
124 |
+
if additional_instructions:
|
125 |
+
prompt += additional_instructions # Добавляем остальные инструкции
|
126 |
+
|
127 |
+
prompt += "Убедись, что в готовом тексте до 250 знаков с пробелами.\n"
|
128 |
+
|
129 |
+
prompt += f"Убедись, что в готовом тексте есть следующая ключевая информация: {key_message.strip()}"
|
130 |
+
|
131 |
+
if "призыва к действию" в prompt and "минимум прямых призывов к действию" в prompt:
|
132 |
+
prompt = re.sub(r"Убедись, что готовый текст начинается с призыва к действию с продуктом.\n", "", prompt)
|
133 |
+
|
134 |
+
return prompt.strip()
|
135 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
136 |
|
137 |
# Функция для постепенной генерации всех сообщений через yield
|
138 |
+
def generate_all_messages(desc, benefits, key_message, gender, generation, psychotype, business_stage, industry, opf):
|
139 |
+
# Генерация задания для копирайтера
|
140 |
+
standard_prompt = generate_standard_prompt(desc, benefits, key_message)
|
141 |
+
yield standard_prompt, None, None, None, None, None, None, None
|
142 |
+
|
143 |
+
# Небольшая пауза для демонстрации постепенной генерации
|
144 |
+
time.sleep(1)
|
145 |
+
|
146 |
+
# Генерация задания для редактора
|
147 |
+
personalization_prompt = generate_personalization_prompt(key_message, gender, generation, psychotype, business_stage, industry, opf)
|
148 |
+
yield standard_prompt, personalization_prompt, None, None, None, None, None, None
|
149 |
+
|
150 |
+
# Небольшая пауза для демонстрации постепенной генерации
|
151 |
+
time.sleep(1)
|
152 |
+
|
153 |
# Варианты предложений для начала и конца
|
154 |
prefixes = [
|
155 |
"Начни сообщение с призыва к действию с продуктом.",
|
|
|
165 |
non_personalized_messages = []
|
166 |
personalized_messages = []
|
167 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
168 |
# Генерация и постепенная подача каждого сообщения
|
169 |
for i in range(3):
|
170 |
# Генерация неперсонализированного сообщения
|
171 |
+
prompt = add_prefix_suffix(standard_prompt, prefixes[i], suffixes[i])
|
172 |
non_personalized_message = generate_message_gigachat_pro_with_retry(prompt)
|
173 |
non_personalized_messages.append(non_personalized_message)
|
174 |
|
175 |
# Выводим неперсонализированное сообщение
|
176 |
yield (
|
177 |
+
standard_prompt, personalization_prompt, # Задания для копирайтера и редактора
|
178 |
non_personalized_messages[0] if i >= 0 else None, # Первое неперсонализированное сообщение
|
179 |
personalized_messages[0] if len(personalized_messages) > 0 else None, # Первое персонализированное сообщение, если оно уже есть
|
180 |
non_personalized_messages[1] if i >= 1 else None, # Второе неперсонализированное сообщение
|
|
|
184 |
)
|
185 |
|
186 |
# Генерация персонализированного сообщения
|
187 |
+
full_personalized_prompt = f"{personalization_prompt}\n\nТекст для адаптации: {non_personalized_message}"
|
188 |
personalized_message = generate_message_gigachat_pro_with_retry(full_personalized_prompt)
|
189 |
personalized_messages.append(personalized_message)
|
190 |
|
191 |
# Выводим персонализированное сообщение
|
192 |
yield (
|
193 |
+
standard_prompt, personalization_prompt, # Задания для копирайтера и редактора
|
194 |
non_personalized_messages[0] if len(non_personalized_messages) > 0 else None, # Первое неперсонализированное сообщение
|
195 |
personalized_messages[0] if len(personalized_messages) > 0 else None, # Первое персонализированное сообщение
|
196 |
non_personalized_messages[1] if len(non_personalized_messages) > 1 else None, # Второе неперсонализированное сообщение
|
|
|
288 |
# Сначала переключаем вкладку, потом запускаем генерацию сообщений
|
289 |
btn_to_prompts.click(
|
290 |
fn=change_tab,
|
291 |
+
inputs=[gr.Number(value=1, visible=False)], # Переключение на вкладку "Ассистент" (id=1)
|
292 |
outputs=tabs # Обновляем вкладку
|
293 |
).then(
|
294 |
fn=generate_all_messages,
|
295 |
+
inputs=[desc, benefits, key_message, gender, generation, psychotype, business_stage, industry, opf], # Входные текстовые поля
|
296 |
outputs=[
|
297 |
non_personalized_prompt, personalized_prompt, # Поля для задания копирайтера и редактора (на вкладке "Ассистент")
|
298 |
non_personalized_1, personalized_1, # Сообщения на вкладке "Сообщения"
|