Spaces:
Sleeping
Sleeping
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() |