fruitpicker01's picture
Update app.py
f840ace verified
raw
history blame
19.3 kB
import gradio as gr
import plotly.graph_objects as go
import random
import pandas as pd
# Загрузка данных из Excel-файла
try:
data = pd.read_excel('Признаки.xlsx', sheet_name=None)
except Exception as e:
print(f"Ошибка при загрузке Excel-файла: {e}")
data = {}
# Создание списка признаков и их значений
features = {}
for sheet_name, df in data.items():
try:
if sheet_name == "Пол Поколение Психотип":
# Создаем словарь, где ключи — это кортежи (Пол, Поколение, Психотип), а значения — инструкции
features[sheet_name] = df.set_index(['Пол', 'Поколение', 'Психотип'])['Инструкция'].to_dict()
else:
features[sheet_name] = df.set_index(df.columns[0]).to_dict()[df.columns[1]]
except Exception as e:
print(f"Ошибка при обработке данных листа {sheet_name}: {e}")
features[sheet_name] = {}
# Функция для генерации стандартного промпта
def generate_standard_prompt(description, advantages, key_message):
prompt = (
f"Сгенерируй смс-сообщение для клиента.\n"
f"Описание предложения: {description}\n"
f"Преимущества: {advantages}\n"
"В тексте смс запрещено использование:\n"
"- Запрещенные слова: № один, номер один, № 1, вкусный, дешёвый, продукт, спам, доступный, банкротство, долги, займ, срочно, сейчас, лучший, главный, номер 1, гарантия, успех, лидер;\n"
"- Обращение к клиенту;\n"
"- Приветствие клиента;\n"
"- Обещания и гарантии;\n"
"- Использовать составные конструкции из двух глаголов;\n"
"- Причастия и причастные обороты;\n"
"- Деепричастия и деепричастные обороты;\n"
"- Превосходная степень прилагательных;\n"
"- Страдательный залог;\n"
"- Порядковые числительные от 10 прописью;\n"
"- Цепочки с придаточными предложениями;\n"
"- Разделительные повторяющиеся союзы;\n"
"- Вводные конструкции;\n"
"- Усилители;\n"
"- Паразиты времени;\n"
"- Несколько существительных подряд, в том числе отглагольных;\n"
"- Производные предлоги;\n"
"- Сложные предложения, в которых нет связи между частями;\n"
"- Сложноподчинённые предложения;\n"
"- Даты прописью;\n"
"- Близкие по смыслу однородные члены предложения;\n"
"- Шокирующие, экстравагантные, кликбейтные фразы;\n"
"- Абстрактные заявления без поддержки фактами и отсутствие доказательства пользы для клиента;\n"
"- Гарантирующие фразы;\n"
"- Узкоспециализированные термины;\n"
"- Фразы, способные создать двойственное ощущение, обидеть;\n"
"- Речевые клише, рекламные штампы, канцеляризмы;\n"
"Убедись, что в готовом тексте до 250 знаков с пробелами.\n"
)
if key_message.strip():
prompt += f"Убедись, что в готовом тексте есть следующая ключевая информация: {key_message.strip()}"
return prompt.strip()
# Функция для генерации персонализированного промпта
def generate_personalization_prompt(key_message, *selected_values):
prompt = "Адаптируй, не превышая длину сообщения в 250 знаков с пробелами, текст с учетом следующих особенностей:\n"
gender, generation, psychotype = selected_values[0], selected_values[1], selected_values[2]
combined_instruction = ""
additional_instructions = ""
print(f"Выбранные значения: Пол={gender}, Поколение={generation}, Психотип={psychotype}")
# Проверяем, выбраны ли все три параметра: Пол, Поколение, Психотип
if gender and generation and psychotype:
# Получаем данные с листа "Пол Поколение Психотип"
sheet = features.get("Пол Поколение Психотип", {})
# Ищем ключ, соответствующий комбинации "Пол", "Поколение", "Психотип"
key = (gender, generation, psychotype)
if key in sheet:
combined_instruction = sheet[key]
print(f"Найдена комбинированная инструкция: {combined_instruction}")
else:
print(f"Комбинированная инструкция для ключа {key} не найдена.")
# Если не найдена комбинированная инструкция, добавляем индивидуальные инструкции
if not combined_instruction:
print("Добавляем индивидуальные инструкции для Пол, Поколение, Психотип.")
for i, feature in enumerate(["Пол", "Поколение", "Психотип"]):
if selected_values[i]:
try:
instruction = features[feature][selected_values[i]]
additional_instructions += f"{instruction}\n"
print(f"Добавлена инструкция из {feature}: {instruction}")
except KeyError:
return f"Ошибка: выбранное значение {selected_values[i]} не найдено в данных."
# Добавляем инструкции для остальных параметров (например, Отрасль)
for i, feature in enumerate(features.keys()):
if feature not in ["Пол", "Поколение", "Психотип", "Пол Поколение Психотип"]:
if i < len(selected_values) and selected_values[i]:
try:
instruction = features[feature][selected_values[i]]
additional_instructions += f"{instruction}\n"
print(f"Добавлена инструкция из {feature}: {instruction}")
except KeyError:
return f"Ошибка: выбранное значение {selected_values[i]} не найдено в данных."
# Формируем итоговый промпт
if combined_instruction:
prompt += combined_instruction # Добавляем комбинированную инструкцию, если она есть
if additional_instructions:
prompt += additional_instructions # Добавляем остальные инструкции
prompt += "Убедись, что в готовом тексте до 250 знаков с пробелами.\n"
prompt += f"Убедись, что в готовом тексте есть следующая ключевая информация: {key_message.strip()}"
return prompt.strip()
# Функция для создания спидометра
def create_gauge(value):
fig = go.Figure(go.Indicator(
mode="gauge+number",
value=value,
gauge={
'axis': {'range': [0, 100]},
'bar': {'color': "black"}, # Цвет стрелки
'steps': [
{'range': [0, 40], 'color': "#55efc4"}, # Мягкий зеленый
{'range': [40, 70], 'color': "#ffeaa7"}, # Желтый
{'range': [70, 100], 'color': "#ff7675"} # Мягкий красный
],
'threshold': {
'line': {'color': "black", 'width': 4},
'thickness': 0.75,
'value': value
}
},
number={'font': {'size': 48}} # Размер шрифта числа
))
# Изменение размеров спидометра и центровка
fig.update_layout(paper_bgcolor="#f8f9fa", # Цвет фона
font={'color': "#2d3436", 'family': "Arial"}, # Цвет текста
width=250, # Уменьшенная ширина
height=150) # Уменьшенная высота
return fig
# Функция для генерации случайных значений спидометров
def generate_random_gauges():
return create_gauge(random.randint(60, 90)), create_gauge(random.randint(60, 90)), create_gauge(random.randint(60, 90))
# Функция для смены вкладки
def change_tab(id):
return gr.Tabs(selected=id)
with gr.Blocks() as demo:
with gr.Tabs() as tabs:
# Вкладка 1: Исходные данные
with gr.TabItem("Исходные данные", id=0):
with gr.Row():
with gr.Column():
desc = gr.Textbox(
label="Описание предложения (предзаполненный пример можно поменять на свой)",
lines=7,
value=(
"Необходимо предложить клиенту оформить дебетовую премиальную бизнес-карту Mastercard Preffered. "
"Обслуживание карты стоит 700 рублей в месяц, но клиент может пользоваться ей бесплатно. "
"Что необходимо сделать, чтобы воспользоваться предложением:\n"
"1. Оформить премиальную бизнес-карту в офисе банка или онлайн в интернет-банке СберБизнес.\n"
"2. Забрать карту.\n"
"3. В течение календарного месяца совершить по ней покупки на сумму от 100 000 рублей.\n"
"4. В течение следующего месяца пользоваться ей бесплатно."
)
)
benefits = gr.Textbox(
label="Преимущества (предзаполненный пример можно поменять на свой)",
lines=5,
value=(
"Предложение по бесплатному обслуживанию — бессрочное.\n"
"Оплата покупок без отчётов и платёжных поручений.\n"
"Платёжные документы без комиссии.\n"
"Лимиты на расходы сотрудников.\n"
"Мгновенные переводы на карты любых банков."
)
)
key_message = gr.Textbox(
label="Ключевое сообщение (предзаполненный пример можно поменять на свой)",
lines=3,
value="Бесплатное обслуживание при покупках от 100 000 рублей в месяц."
)
with gr.Column():
# Используем данные из Excel для выбора
gender = gr.Dropdown(label="Пол", choices=[None] + list(features.get('Пол', {}).keys()))
generation = gr.Dropdown(label="Поколение", choices=[None] + list(features.get('Поколение', {}).keys()))
psychotype = gr.Dropdown(label="Психотип", choices=[None] + list(features.get('Психотип', {}).keys()))
business_stage = gr.Dropdown(label="Стадия бизнеса", choices=[None] + list(features.get('Стадия бизнеса', {}).keys()))
industry = gr.Dropdown(label="Отрасль", choices=[None] + list(features.get('Отрасль', {}).keys()))
opf = gr.Dropdown(label="ОПФ", choices=[None] + list(features.get('ОПФ', {}).keys()))
btn_to_prompts = gr.Button("Создать")
btn_to_prompts.click(fn=change_tab, inputs=[gr.Number(value=1, visible=False)], outputs=tabs)
# Добавляем генерацию стандартного промпта при клике
btn_to_prompts.click(
fn=generate_standard_prompt,
inputs=[desc, benefits, key_message],
outputs=[non_personalized_prompt]
)
# Добавляем генерацию персонализированного промпта при клике
btn_to_prompts.click(
fn=generate_personalization_prompt,
inputs=[key_message, gender, generation, psychotype, business_stage, industry, opf],
outputs=[personalized_prompt]
)
# Вкладка 2: Промпты
with gr.TabItem("Ассистент", id=1):
with gr.Row():
with gr.Column():
non_personalized_prompt = gr.Textbox(
label="Задание для копирайтера",
lines=25,
interactive=False)
with gr.Column():
personalized_prompt = gr.Textbox(label="Задание для редактора", lines=25) # Увеличенная высота
# Вкладка 3: Сообщения
with gr.TabItem("Сообщения", id=2):
# Заголовки столбцов
with gr.Row():
gr.Markdown("### Копирайтер") # Название для столбца "Копирайтер"
gr.Markdown("### Редактор") # Название для столбца "Редактор"
# Первый ряд
with gr.Row():
non_personalized_1 = gr.Textbox(label="Стандартное сообщение 1", lines=4, interactive=False)
personalized_1 = gr.Textbox(label="Персонализированное сообщение 1", lines=4, interactive=False)
# Второй ряд
with gr.Row():
non_personalized_2 = gr.Textbox(label="Стандартное сообщение 2", lines=4, interactive=False)
personalized_2 = gr.Textbox(label="Персонализированное сообщение 2", lines=4, interactive=False)
# Третий ряд
with gr.Row():
non_personalized_3 = gr.Textbox(label="Стандартное сообщение 3", lines=4, interactive=False)
personalized_3 = gr.Textbox(label="Персонализированное сообщение 3", lines=4, interactive=False)
# Четвертый ряд
with gr.Row():
btn_check = gr.Button("Проверить", elem_id="check3")
btn_check.click(fn=change_tab, inputs=[gr.Number(value=3, visible=False)], outputs=tabs)
# Вкладка 4: Проверка
with gr.TabItem("Проверка", id=3):
# Заголовки столбцов
with gr.Row():
gr.Markdown("### Редактор")
gr.Markdown("### Корректор") # Название для столбца "Копирайтер"
gr.Markdown("### Аналитик") # Название для столбца "Редактор"
# Первый ряд
with gr.Row():
personalized_message_1 = gr.Textbox(label="Персонализированное сообщение 1", lines=5)
check_message_1 = gr.Textbox(label="Проверка сообщения 1", lines=5)
with gr.Column():
gr.HTML("<div style='display:flex; justify-content:center; width:100%;'>")
success_forecast_1 = gr.Plot(label="Прогноз успешности сообщения 1")
gr.HTML("</div>")
# Второй ряд
with gr.Row():
personalized_message_2 = gr.Textbox(label="Персонализированное сообщение 2", lines=5)
check_message_2 = gr.Textbox(label="Проверка сообщения 2", lines=5)
with gr.Column():
gr.HTML("<div style='display:flex; justify-content:center; width:100%;'>")
success_forecast_2 = gr.Plot(label="Прогноз успешности сообщения 2")
gr.HTML("</div>")
# Третий ряд
with gr.Row():
personalized_message_3 = gr.Textbox(label="Персонализированное сообщение 3", lines=5)
check_message_3 = gr.Textbox(label="Проверка сообщения 3", lines=5)
with gr.Column():
gr.HTML("<div style='display:flex; justify-content:center; width:100%;'>")
success_forecast_3 = gr.Plot(label="Прогноз успешности сообщения 3")
gr.HTML("</div>")
# Кнопка для обновления спидометров
btn_check.click(fn=generate_random_gauges, inputs=[], outputs=[success_forecast_1, success_forecast_2, success_forecast_3])
demo.launch()