test1 / app.py
vydrking's picture
Upload 22 files
490fb9e verified
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(']]'):
# Извлекаем только текст ответа из формата [['user', 'bot_response']]
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__':
# Для Docker и HF Spaces
demo.launch(server_name='0.0.0.0', server_port=7860)