File size: 7,907 Bytes
5071500
 
 
 
 
172ee17
5071500
 
 
 
 
 
 
172ee17
5071500
 
 
 
 
 
 
172ee17
5071500
53fe915
 
 
 
 
490fb9e
 
 
 
 
 
 
 
 
 
 
 
5071500
172ee17
53fe915
 
5071500
172ee17
5071500
 
 
 
 
 
 
172ee17
5071500
 
172ee17
 
 
 
5071500
 
172ee17
53fe915
5071500
53fe915
 
 
 
 
5071500
172ee17
53fe915
5071500
172ee17
5071500
172ee17
5071500
 
172ee17
5071500
 
 
 
172ee17
5071500
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
172ee17
 
5071500
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
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)