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()