fruitpicker01's picture
Update app.py
2ca7cf0 verified
raw
history blame
11.4 kB
import os
import gradio as gr
import random
import pandas as pd
from langchain.schema import SystemMessage
from langchain_community.chat_models.gigachat import GigaChat
# Авторизация в GigaChat Pro
gc_key = os.getenv('GPT_KEY')
chat_pro = GigaChat(credentials=gc_key, model='GigaChat-Pro', max_tokens=68, temperature=1, verify_ssl_certs=False)
# Загрузка данных из 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 add_prefix_suffix(prompt, prefix, suffix):
return f"{prefix}\n{prompt}\n{suffix}"
# Функция генерации стандартного промпта
def generate_standard_prompt(description, advantages, key_message):
prompt = (
f"Сгенерируй смс-сообщение для клиента.\n"
f"Описание предложения: {description}\n"
f"Преимущества: {advantages}\n"
"В тексте смс запрещено использование запрещенных слов, обещаний, приветствий и пр. Убедись, что текст до 250 символов.\n"
)
if key_message.strip():
prompt += f"Ключевое сообщение: {key_message.strip()}"
return prompt.strip()
# Функция генерации персонализированного промпта
def generate_personalization_prompt(standard_message, gender, generation, psychotype, business_stage, industry, opf):
personalization_prompt = (
f"Адаптируй текст с учётом особенностей клиента:\n"
f"Пол: {gender}\nПоколение: {generation}\nПсихотип: {psychotype}\nСтадия бизнеса: {business_stage}\nОтрасль: {industry}\nОПФ: {opf}\n"
f"Текст для адаптации: {standard_message}"
)
return personalization_prompt.strip()
# Функция генерации сообщений с GigaChat Pro
def generate_message_gigachat_pro(prompt):
try:
messages = [SystemMessage(content=prompt)]
res = chat_pro(messages)
return res.content.strip()
except Exception as e:
return f"Ошибка при обращении к GigaChat-Pro: {e}"
# Функция генерации всех сообщений
def generate_all_messages(non_personalized_prompt, personalized_prompt):
prefixes = [
"Начни сообщение с призыва к действию с продуктом.",
"Начни сообщение с указания на пользу продукта. Используй глагол в побудительном наклонении.",
"Начни сообщение с вопроса, который указывает на пользу продукта для клиента."
]
suffixes = [
"Убедись, что готовый текст начинается с призыва к действию с продуктом.",
"Убедись, что готовый текст начинается с указания на пользу продукта и использования глагола в побудительном наклонении.",
"Убедись, что готовый текст начинается с вопроса, который указывает на пользу продукта для клиента."
]
non_personalized_messages = []
personalized_messages = []
# Генерация трех неперсонализированных сообщений
for i in range(3):
prompt = add_prefix_suffix(non_personalized_prompt, prefixes[i], suffixes[i])
message = generate_message_gigachat_pro(prompt)
non_personalized_messages.append(message)
# Генерация трех персонализированных сообщений
for i in range(3):
full_personalized_prompt = f"{personalized_prompt}\n\nТекст для адаптации: {non_personalized_messages[i]}"
prompt = add_prefix_suffix(full_personalized_prompt, prefixes[i], suffixes[i])
message = generate_message_gigachat_pro(prompt)
personalized_messages.append(message)
return non_personalized_messages, personalized_messages
# Функция генерации стандартного и персонализированного промптов
def handle_generation(desc, benefits, key_message, gender, generation, psychotype, business_stage, industry, opf):
non_personalized_prompt = generate_standard_prompt(desc, benefits, key_message)
personalized_prompt = generate_personalization_prompt(non_personalized_prompt, gender, generation, psychotype, business_stage, industry, opf)
# Генерация сообщений
non_personalized_messages, personalized_messages = generate_all_messages(non_personalized_prompt, personalized_prompt)
# Вернем промпты и сообщения
return non_personalized_prompt, personalized_prompt, non_personalized_messages, personalized_messages
# Функция для смены вкладки
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=6)
benefits = gr.Textbox(label="Преимущества", lines=5)
key_message = gr.Textbox(label="Ключевое сообщение", lines=5)
with gr.Column():
gender = gr.Dropdown(label="Пол", choices=["Мужчина", "Женщина", "Не указан"])
generation = gr.Dropdown(label="Поколение", choices=["Поколение Z", "Миллениалы", "Поколение X", "Бэби-бумеры"])
psychotype = gr.Textbox(label="Психотип")
business_stage = gr.Textbox(label="Стадия бизнеса")
industry = gr.Textbox(label="Отрасль")
opf = gr.Textbox(label="ОПФ")
# Кнопка "Создать" для генерации промптов и сообщений
btn_to_prompts = gr.Button("Создать")
non_personalized_prompt = gr.Textbox(label="Задание для копирайтера", lines=25, interactive=False)
personalized_prompt = gr.Textbox(label="Задание для редактора", lines=25)
non_personalized_1 = gr.Textbox(label="Стандартное сообщение 1", lines=4, interactive=False)
personalized_1 = gr.Textbox(label="Персонализированное сообщение 1", lines=4, interactive=False)
non_personalized_2 = gr.Textbox(label="Стандартное сообщение 2", lines=4, interactive=False)
personalized_2 = gr.Textbox(label="Персонализированное сообщение 2", lines=4, interactive=False)
non_personalized_3 = gr.Textbox(label="Стандартное сообщение 3", lines=4, interactive=False)
personalized_3 = gr.Textbox(label="Персонализированное сообщение 3", lines=4, interactive=False)
# Привязка кнопки к функции генерации и смены вкладки
btn_to_prompts.click(fn=handle_generation,
inputs=[desc, benefits, key_message, gender, generation, psychotype, business_stage, industry, opf],
outputs=[non_personalized_prompt, personalized_prompt,
non_personalized_1, personalized_1,
non_personalized_2, personalized_2,
non_personalized_3, personalized_3])
btn_to_prompts.click(fn=change_tab, inputs=[gr.Number(value=1)], outputs=tabs)
# Вкладка 2: Промпты
with gr.TabItem("Ассистент", id=1):
with gr.Row():
with gr.Column():
non_personalized_prompt.render()
with gr.Column():
personalized_prompt.render()
# Вкладка 3: Сообщения
with gr.TabItem("Сообщения", id=2):
# Заголовки столбцов
with gr.Row():
gr.Markdown("### Копирайтер")
gr.Markdown("### Редактор")
# Первый ряд
with gr.Row():
non_personalized_1.render()
personalized_1.render()
# Второй ряд
with gr.Row():
non_personalized_2.render()
personalized_2.render()
# Третий ряд
with gr.Row():
non_personalized_3.render()
personalized_3.render()
# Вкладка 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.Row():
personalized_message_2 = gr.Textbox(label="Персонализированное сообщение 2", lines=5)
check_message_2 = gr.Textbox(label="Проверка сообщения 2", lines=5)
with gr.Row():
personalized_message_3 = gr.Textbox(label="Персонализированное сообщение 3", lines=5)
check_message_3 = gr.Textbox(label="Проверка сообщения 3", lines=5)
demo.launch()