|
|
import gradio as gr |
|
|
import threading |
|
|
import time |
|
|
from chatbot import ITMOChatbot |
|
|
from update_data import update_data_async |
|
|
|
|
|
|
|
|
try: |
|
|
chatbot = ITMOChatbot() |
|
|
print('Чат-бот инициализирован успешно') |
|
|
except Exception as e: |
|
|
print(f'Ошибка инициализации чат-бота: {e}') |
|
|
chatbot = None |
|
|
|
|
|
def chat_with_bot(message, history): |
|
|
if not message.strip(): |
|
|
return history, '' |
|
|
|
|
|
if not chatbot: |
|
|
return history + [[message, 'Чат-бот не инициализирован. Попробуйте обновить страницу.']], '' |
|
|
|
|
|
try: |
|
|
response, relevance_score = chatbot.chat(message, history) |
|
|
|
|
|
|
|
|
if not response or response.startswith('[') or len(response.strip()) < 5: |
|
|
response = 'К сожалению, не смог сгенерировать ответ. Попробуйте переформулировать вопрос.' |
|
|
|
|
|
|
|
|
if response.startswith('[[') and response.endswith(']]'): |
|
|
|
|
|
try: |
|
|
import ast |
|
|
parsed = ast.literal_eval(response) |
|
|
if isinstance(parsed, list) and len(parsed) > 0 and isinstance(parsed[0], list) and len(parsed[0]) > 1: |
|
|
response = parsed[0][1] |
|
|
except: |
|
|
|
|
|
pass |
|
|
|
|
|
return history + [[message, response]], '' |
|
|
except Exception as e: |
|
|
print(f'Ошибка в чате: {e}') |
|
|
error_msg = 'Произошла ошибка при обработке запроса. Попробуйте еще раз.' |
|
|
return history + [[message, error_msg]], '' |
|
|
|
|
|
def get_recommendations(programming_exp, math_level, interests, semester, skills): |
|
|
if not semester: |
|
|
return 'Пожалуйста, укажите семестр для получения рекомендаций.' |
|
|
|
|
|
if not chatbot: |
|
|
return 'Чат-бот не инициализирован. Попробуйте обновить страницу.' |
|
|
|
|
|
try: |
|
|
|
|
|
all_interests = list(set(interests + skills)) |
|
|
|
|
|
profile = { |
|
|
'programming_experience': programming_exp, |
|
|
'math_level': math_level, |
|
|
'interests': all_interests, |
|
|
'semester': semester |
|
|
} |
|
|
|
|
|
recommendations = chatbot.recommend_courses(profile) |
|
|
|
|
|
|
|
|
if not recommendations or recommendations.startswith('[') or len(recommendations.strip()) < 10: |
|
|
recommendations = 'К сожалению, не удалось сгенерировать рекомендации. Попробуйте изменить параметры профиля.' |
|
|
|
|
|
return recommendations |
|
|
except Exception as e: |
|
|
print(f'Ошибка в рекомендациях: {e}') |
|
|
return f'Ошибка при получении рекомендаций: {str(e)}' |
|
|
|
|
|
def update_data_ui(): |
|
|
try: |
|
|
update_data_async() |
|
|
return 'Данные успешно обновлены!' |
|
|
except Exception as e: |
|
|
return f'Ошибка при обновлении данных: {str(e)}' |
|
|
|
|
|
def update_data_thread(): |
|
|
return gr.update(value='Обновление данных...', interactive=False) |
|
|
|
|
|
with gr.Blocks(title='ITMO Магистратура - Чат-бот', theme=gr.themes.Soft()) as demo: |
|
|
gr.Markdown('# 🤖 Чат-бот для абитуриентов магистратур ITMO') |
|
|
gr.Markdown('Задавайте вопросы о программах ИИ и AI Product, получайте персональные рекомендации по курсам.') |
|
|
|
|
|
with gr.Row(): |
|
|
with gr.Column(scale=2): |
|
|
chatbot_interface = gr.ChatInterface( |
|
|
chat_with_bot, |
|
|
title='💬 Чат с ботом', |
|
|
description='Спрашивайте о дисциплинах, программах, учебных планах', |
|
|
examples=[ |
|
|
'Какие дисциплины по NLP в 1 семестре программы ИИ?', |
|
|
'Расскажи о программе AI Product', |
|
|
'Какие курсы по машинному обучению есть в программе ИИ?', |
|
|
'Сколько кредитов за дисциплину "Глубокое обучение"?' |
|
|
] |
|
|
) |
|
|
|
|
|
with gr.Column(scale=1): |
|
|
gr.Markdown('### 👤 Профиль для рекомендаций') |
|
|
|
|
|
with gr.Row(): |
|
|
programming_exp = gr.Slider( |
|
|
minimum=0, maximum=5, value=2, step=1, |
|
|
label='Опыт программирования (0-5)', |
|
|
info='0 - нет опыта, 5 - эксперт' |
|
|
) |
|
|
|
|
|
math_level = gr.Slider( |
|
|
minimum=0, maximum=4, value=2, step=1, |
|
|
label='Уровень математики (0-4)', |
|
|
info='0 - базовый, 4 - продвинутый' |
|
|
) |
|
|
|
|
|
gr.Markdown('**Интересы:**') |
|
|
interests = gr.CheckboxGroup( |
|
|
choices=['ml', 'dl', 'nlp', 'cv', 'product', 'business', 'research', 'data', 'systems'], |
|
|
value=['ml'], |
|
|
label='Области интересов', |
|
|
info='Выберите интересующие направления' |
|
|
) |
|
|
|
|
|
gr.Markdown('**Навыки:**') |
|
|
skills = gr.CheckboxGroup( |
|
|
choices=['python', 'java', 'sql', 'git', 'docker', 'aws', 'tensorflow', 'pytorch', 'scikit-learn'], |
|
|
value=['python'], |
|
|
label='Технические навыки', |
|
|
info='Выберите имеющиеся навыки' |
|
|
) |
|
|
|
|
|
semester = gr.Dropdown( |
|
|
choices=['1', '2', '3', '4'], |
|
|
label='Целевой семестр', |
|
|
info='Для получения рекомендаций' |
|
|
) |
|
|
|
|
|
recommend_btn = gr.Button('🎯 Получить рекомендации', variant='primary') |
|
|
recommendations_output = gr.Textbox( |
|
|
label='Рекомендации', |
|
|
lines=12, |
|
|
interactive=False |
|
|
) |
|
|
|
|
|
recommend_btn.click( |
|
|
get_recommendations, |
|
|
inputs=[programming_exp, math_level, interests, semester, skills], |
|
|
outputs=recommendations_output |
|
|
) |
|
|
|
|
|
with gr.Row(): |
|
|
update_btn = gr.Button('🔄 Обновить данные', variant='secondary') |
|
|
update_status = gr.Textbox( |
|
|
label='Статус обновления', |
|
|
interactive=False, |
|
|
visible=False |
|
|
) |
|
|
|
|
|
update_btn.click( |
|
|
update_data_thread, |
|
|
outputs=update_status |
|
|
).then( |
|
|
update_data_ui, |
|
|
outputs=update_status |
|
|
) |
|
|
|
|
|
if __name__ == '__main__': |
|
|
|
|
|
demo.launch(server_name='0.0.0.0', server_port=7860) |
|
|
|