Spaces:
Sleeping
Sleeping
File size: 20,434 Bytes
04c268e 2fe1da4 04c268e 15a7be8 857cd67 9192fe9 857cd67 7eb0855 29f5b29 3158ca9 9192fe9 6b3c4a0 9192fe9 3158ca9 6b3c4a0 2fe1da4 857cd67 9192fe9 2fe1da4 9192fe9 3158ca9 97aceee 9192fe9 3158ca9 97aceee 5d9ecf9 9192fe9 5d9ecf9 9192fe9 5d9ecf9 9192fe9 3158ca9 5d9ecf9 3158ca9 9192fe9 3158ca9 5d9ecf9 9192fe9 3158ca9 97aceee 6b3c4a0 97aceee 6b3c4a0 97aceee 6b3c4a0 97aceee 6b3c4a0 97aceee 6b3c4a0 97aceee 6b3c4a0 97aceee 6b3c4a0 97aceee 6b3c4a0 97aceee 6b3c4a0 97aceee 6b3c4a0 97aceee 6b3c4a0 97aceee 6b3c4a0 97aceee 6b3c4a0 97aceee 6b3c4a0 97aceee 6b3c4a0 8976186 b033846 2fe1da4 8837319 4fdbb1d 6b3c4a0 bdd1b10 8837319 bdd1b10 8837319 4fdbb1d 15a7be8 2fe1da4 4fdbb1d 6b3c4a0 9192fe9 2b67471 9192fe9 97aceee 2818eb7 97aceee 2818eb7 97aceee 2818eb7 97aceee 6b3c4a0 2818eb7 97aceee 6b3c4a0 2818eb7 15a7be8 6b3c4a0 97aceee 6b3c4a0 2fe1da4 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 |
import gradio as gr
import pandas as pd
# Функция для загрузки данных из вкладок Excel
def load_dropdown_data(file_path, sheet_name, column_name):
"""Загружает уникальные значения из столбца на заданной вкладке."""
data = pd.read_excel(file_path, sheet_name=sheet_name)
return data[column_name].dropna().unique().tolist()
file_path = "Исходные данные.xlsx"
# Загрузка данных
products, data_products = load_dropdown_data(file_path, "Продукты", "Наименование продукта"), pd.read_excel(file_path, sheet_name="Продукты")
genders_data = pd.read_excel(file_path, sheet_name="Пол")
generations_data = pd.read_excel(file_path, sheet_name="Поколение")
psychotypes_data = pd.read_excel(file_path, sheet_name="Психотип")
business_stages_data = pd.read_excel(file_path, sheet_name="Стадия бизнеса")
industries_data = pd.read_excel(file_path, sheet_name="Отрасль")
opfs_data = pd.read_excel(file_path, sheet_name="ОПФ")
genders = genders_data["Пол"].dropna().unique().tolist()
generations = generations_data["Поколение"].dropna().unique().tolist()
psychotypes = psychotypes_data["Психотип"].dropna().unique().tolist()
business_stages = business_stages_data["Стадия бизнеса"].dropna().unique().tolist()
industries = industries_data["Отрасль"].dropna().unique().tolist()
opfs = opfs_data["ОПФ"].dropna().unique().tolist()
approaches_data = pd.read_excel(file_path, sheet_name="Подход")
# Словарь подходов
approach_dict = {
"Указание на пользу": {
"prefix": "Начни SMS с указания на пользу продукта. Используй глагол в побудительном наклонении. Не начинай с вопроса",
"suffix": "Убедись, что SMS начинается с указания на пользу продукта и использования глагола в побудительном наклонении и не начинается с вопроса"
},
"Вопрос": {
"prefix": "Начни сообщение с вопроса, который указывает на пользу продукта для клиента",
"suffix": "Убедись, что готовый текст начинается с вопроса, который указывает на пользу продукта для клиента"
},
"Призыв к действию": {
"prefix": "Начни SMS с призыва к действию с продуктом. Не начинай с вопроса",
"suffix": "Убедись, что готовый текст начинается с призыва к действию с продуктом и не начинается с вопроса"
}
}
def fill_product_details(selected_product, data):
if selected_product:
product_row = data[data["Наименование продукта"] == selected_product].iloc[0]
return (
product_row.get("Описание предложения", ""),
product_row.get("Наименование продукта", ""),
product_row.get("Преимущества", ""),
product_row.get("Ключевое сообщение", "")
)
return "", "", "", ""
def get_approaches(gender, generation, psychotype, approaches_df):
if approaches_df is None or approaches_df.empty:
return "Подход не найден для выбранных параметров."
filters = []
for param_name, param_value in [('Пол', gender), ('Поколение', generation), ('Психотип', psychotype)]:
# Если значение параметра "Не выбрано" или пустое
if not param_value or param_value == "Не выбрано":
filters.append(approaches_df[param_name].isnull() | (approaches_df[param_name].fillna('') == ''))
else:
filters.append(approaches_df[param_name].fillna('') == param_value)
combined_filter = filters[0]
for f in filters[1:]:
combined_filter &= f
matching_rows = approaches_df[combined_filter]
if matching_rows.empty:
return "Подход не найден для выбранных параметров."
approach_list = []
for approaches in matching_rows['Подход']:
approach_names = [a.strip() for a in str(approaches).split(',')]
approach_list.extend(approach_names)
# Удаляем дубликаты
approach_list = list(set(approach_list))
selected_approaches_text_content = ', '.join(approach_list)
return selected_approaches_text_content
def update_approach(gender, generation, psychotype):
return get_approaches(gender, generation, psychotype, approaches_data)
def get_instructions_for_param(param_value, df, col):
# Если param_value пустое или "Не выбрано" – игнорируем
if not param_value or param_value == "Не выбрано":
return None
row = df[df[col] == param_value]
if row.empty:
return None
instr1 = row.iloc[0].get("Инструкция 1", "")
if not instr1.strip():
return None
return instr1
def format_instruction_string(instr):
# "слово1, слово2, слово3" -> "слово1 или слово2 или слово3"
terms = [t.strip() for t in instr.split(',') if t.strip()]
return " или ".join(terms) if terms else ""
def generate_prompts(description, product_name, benefits, key_message, chosen_approach,
gender, generation, psychotype, business_stage, industry, opf):
# Если подход не определён
if chosen_approach == "Подход не найден для выбранных параметров.":
return ("Для формирования промпта выберите хотя бы один личный персональный параметр для определения подхода",
"Для формирования промпта выберите хотя бы один личный персональный параметр для определения подхода")
# Собираем подходы
approach_list = [a.strip() for a in chosen_approach.split(',') if a.strip()]
prefix_parts = []
suffix_parts = []
for a in approach_list:
if a in approach_dict:
prefix_parts.append(approach_dict[a]["prefix"])
suffix_parts.append(approach_dict[a]["suffix"])
# Если несколько подходов, соединяем через "/"
if len(prefix_parts) > 1:
approach_prefix = " / ".join(prefix_parts)
approach_suffix = " / ".join(suffix_parts)
else:
approach_prefix = prefix_parts[0] if prefix_parts else ""
approach_suffix = suffix_parts[0] if suffix_parts else ""
# Собираем выбранные параметры
instructions_data = [
(gender, genders_data, "Пол"),
(generation, generations_data, "Поколение"),
(psychotype, psychotypes_data, "Психотип"),
(business_stage, business_stages_data, "Стадия бизнеса"),
(industry, industries_data, "Отрасль"),
(opf, opfs_data, "ОПФ")
]
chosen_params_instructions = []
for (param_value, df, col) in instructions_data:
instr1 = get_instructions_for_param(param_value, df, col)
if instr1:
chosen_params_instructions.append(instr1)
# Теперь, согласно новой логике:
# - Если один параметр выбран -> 1 пункт
# - Если два параметра -> 2 пункта (по одному с каждого параметра)
# И так далее. Используем только Инструкция 1.
# Таким образом, количество пунктов = количество выбранных параметров
# каждый пункт — это Инструкция 1 для параметра.
if chosen_params_instructions:
lines = []
for i, instr_line in enumerate(chosen_params_instructions, start=1):
formatted_line = format_instruction_string(instr_line)
lines.append(f"{i}. {formatted_line}")
mandatory_terms = "\n".join(lines)
else:
# Если нет выбранных параметров с инструкциями
mandatory_terms = "Нет обязательных терминов, так как не выбрано ни одного параметра"
# Формируем итоговый промпт
if chosen_params_instructions:
prompt = f"""Напиши три или четыре предложения. {approach_prefix}. Напиши рекламное SMS для следующего продукта:
«{description}».
Не изменяй название продукта: «{product_name}».
Преимущества:
«{benefits}».
ОБЯЗАТЕЛЬНО используй в SMS КАЖДЫЙ из следующих терминов:
{mandatory_terms}
Убедись, что написал не меньше трех и не больше четырех предложений.
{approach_suffix}.
Убедись, что УМЕСТНО использовал КАЖДЫЙ необходимый термин.
Убедись, что в SMS без изменений, синонимов и перестановок слов используется наименование продукта: «{product_name}».
Убедись, что в SMS есть следующая ключевая информация: «{key_message}»."""
else:
# Если нет ни одного параметра, но подход найден,
# просто не указываем обязательные термины.
prompt = f"""Напиши три или четыре предложения. {approach_prefix}. Напиши рекламное SMS для следующего продукта:
«{description}».
Не изменяй название продукта: «{product_name}».
Преимущества:
«{benefits}».
Убедись, что написал не меньше трех и не больше четырех предложений.
{approach_suffix}.
Убедись, что в SMS без изменений, синонимов и перестановок слов используется наименование продукта: «{product_name}».
Убедись, что в SMS есть следующая ключевая информация: «{key_message}»."""
return prompt, prompt
def create_personalized_sms(description, product_name, benefits, key_message, chosen_approach,
gender, generation, psychotype, business_stage, industry, opf):
prompt_1, prompt_2 = generate_prompts(description, product_name, benefits, key_message,
chosen_approach, gender, generation, psychotype,
business_stage, industry, opf)
return prompt_1, prompt_2
with gr.Blocks(theme="default") as demo:
gr.Markdown("**Процент созданных SMS по выбранному продукту**")
progress_bar_html = """
<div style="width: 100%; background-color: #e0e0e0; border-radius: 10px; overflow: hidden;">
<div style="width: 0%; background-color: #4caf50; height: 20px; text-align: center; color: white;">
0%
</div>
</div>
"""
gr.HTML(progress_bar_html)
with gr.Row():
with gr.Column(scale=1):
gr.Markdown("**Продукт**")
product_dropdown = gr.Dropdown(label="Продукт", choices=products, value=None)
description = gr.Textbox(label="Описание предложения", lines=5, value="")
product_name = gr.Textbox(label="Наименование продукта", lines=1, value="")
benefits = gr.Textbox(label="Преимущества", lines=9, value="")
key_message = gr.Textbox(label="Ключевое сообщение", lines=2, value="")
product_dropdown.change(
fn=lambda selected: fill_product_details(selected, data_products),
inputs=[product_dropdown],
outputs=[description, product_name, benefits, key_message]
)
with gr.Column(scale=1):
gr.Markdown("**Клиент**")
gender_dropdown = gr.Dropdown(label="Пол", choices=["Не выбрано"]+genders, value=None)
generation_dropdown = gr.Dropdown(label="Поколение", choices=["Не выбрано"]+generations, value=None)
psychotype_dropdown = gr.Dropdown(label="Психотип", choices=["Не выбрано"]+psychotypes, value=None)
business_stage_dropdown = gr.Dropdown(label="Стадия бизнеса", choices=["Не выбрано"]+business_stages, value=None)
industry_dropdown = gr.Dropdown(label="Отрасль", choices=["Не выбрано"]+industries, value=None)
opf_dropdown = gr.Dropdown(label="ОПФ", choices=["Не выбрано"]+opfs, value=None)
chosen_approach = gr.Textbox(label="Выбранный подход", lines=1, value="")
presence_in_db = gr.Textbox(label="Наличие в базе", lines=1, value="", interactive=False)
# При изменении Пол, Поколение, Психотип вычисляем подход
def on_personal_params_change(gender, generation, psychotype):
return update_approach(gender, generation, psychotype)
gender_dropdown.change(fn=on_personal_params_change,
inputs=[gender_dropdown, generation_dropdown, psychotype_dropdown],
outputs=[chosen_approach])
generation_dropdown.change(fn=on_personal_params_change,
inputs=[gender_dropdown, generation_dropdown, psychotype_dropdown],
outputs=[chosen_approach])
psychotype_dropdown.change(fn=on_personal_params_change,
inputs=[gender_dropdown, generation_dropdown, psychotype_dropdown],
outputs=[chosen_approach])
with gr.Row():
# Убрали кнопку "Создать персонализированное SMS" для формирования промптов
# Теперь промпты формируются при изменении параметров
return_params_btn = gr.Button("Вернуть параметры предыдущего запроса")
create_personal_sms_btn = gr.Button("Создать персонализированное SMS") # Можно оставить для другого функционала, но промпты будут обновляться без нее.
with gr.Row():
with gr.Column():
model_1_name = gr.Textbox(label="Модель 1", value="Скрыто для слепого тестирования", interactive=False)
prompt_1 = gr.Textbox(label="Промпт 1", value="", interactive=False, lines=10)
sms_1 = gr.Textbox(label="SMS 1", lines=3, value="")
with gr.Column():
model_2_name = gr.Textbox(label="Модель 2", value="Скрыто для слепого тестирования", interactive=False)
prompt_2 = gr.Textbox(label="Промпт 2", value="", interactive=False, lines=10)
sms_2 = gr.Textbox(label="SMS 2", lines=3, value="")
with gr.Row():
prefer_sms_1_btn = gr.Button("Я предпочитаю это SMS")
prefer_sms_2_btn = gr.Button("Я предпочитаю это SMS")
regen_btn = gr.Button("Перегенерировать SMS (не нравится ни одно из SMS)")
with gr.Row():
comment_sms_1 = gr.Textbox(label="Комментарий к SMS 1", lines=2, value="")
comment_sms_2 = gr.Textbox(label="Комментарий к SMS 2", lines=2, value="")
with gr.Row():
corrected_sms_1 = gr.Textbox(label="Откорректированное SMS 1", lines=3, value="")
corrected_sms_2 = gr.Textbox(label="Откорректированное SMS 2", lines=3, value="")
with gr.Row():
save_sms_1_btn = gr.Button("Сохранить в базу")
save_sms_2_btn = gr.Button("Сохранить в базу")
# Теперь обновляем промпты при любом изменении параметров клиента и продукта
# Функция-обертка, чтобы получить текущие значения и сгенерировать промпты
def update_prompts_on_change(description, product_name, benefits, key_message, chosen_approach,
gender, generation, psychotype, business_stage, industry, opf):
return create_personalized_sms(description, product_name, benefits, key_message, chosen_approach,
gender, generation, psychotype, business_stage, industry, opf)
# Добавляем события при изменении всех параметров
# Продукт
product_dropdown.change(
fn=update_prompts_on_change,
inputs=[description, product_name, benefits, key_message, chosen_approach,
gender_dropdown, generation_dropdown, psychotype_dropdown,
business_stage_dropdown, industry_dropdown, opf_dropdown],
outputs=[prompt_1, prompt_2]
)
# Параметры клиента
gender_dropdown.change(
fn=update_prompts_on_change,
inputs=[description, product_name, benefits, key_message, chosen_approach,
gender_dropdown, generation_dropdown, psychotype_dropdown,
business_stage_dropdown, industry_dropdown, opf_dropdown],
outputs=[prompt_1, prompt_2]
)
generation_dropdown.change(
fn=update_prompts_on_change,
inputs=[description, product_name, benefits, key_message, chosen_approach,
gender_dropdown, generation_dropdown, psychotype_dropdown,
business_stage_dropdown, industry_dropdown, opf_dropdown],
outputs=[prompt_1, prompt_2]
)
psychotype_dropdown.change(
fn=update_prompts_on_change,
inputs=[description, product_name, benefits, key_message, chosen_approach,
gender_dropdown, generation_dropdown, psychotype_dropdown,
business_stage_dropdown, industry_dropdown, opf_dropdown],
outputs=[prompt_1, prompt_2]
)
business_stage_dropdown.change(
fn=update_prompts_on_change,
inputs=[description, product_name, benefits, key_message, chosen_approach,
gender_dropdown, generation_dropdown, psychotype_dropdown,
business_stage_dropdown, industry_dropdown, opf_dropdown],
outputs=[prompt_1, prompt_2]
)
industry_dropdown.change(
fn=update_prompts_on_change,
inputs=[description, product_name, benefits, key_message, chosen_approach,
gender_dropdown, generation_dropdown, psychotype_dropdown,
business_stage_dropdown, industry_dropdown, opf_dropdown],
outputs=[prompt_1, prompt_2]
)
opf_dropdown.change(
fn=update_prompts_on_change,
inputs=[description, product_name, benefits, key_message, chosen_approach,
gender_dropdown, generation_dropdown, psychotype_dropdown,
business_stage_dropdown, industry_dropdown, opf_dropdown],
outputs=[prompt_1, prompt_2]
)
demo.launch() |