vydrking commited on
Commit
55dabc4
·
verified ·
1 Parent(s): c204272

Upload 24 files

Browse files
Files changed (6) hide show
  1. DEPLOY.md +50 -46
  2. Dockerfile +3 -3
  3. README.md +16 -18
  4. app.py +212 -109
  5. docker-compose.yml +3 -2
  6. requirements.txt +1 -1
DEPLOY.md CHANGED
@@ -9,7 +9,7 @@
9
  3. Выберите:
10
  - **Owner**: ваш аккаунт
11
  - **Space name**: `itmo-chatbot` (или любое другое)
12
- - **Space SDK**: **Docker** (важно!)
13
  - **License**: MIT
14
  - **Visibility**: Public
15
 
@@ -23,12 +23,8 @@
23
  - `data_layer.py` → `data_layer.py`
24
  - `llm.py` → `llm.py`
25
  - `requirements.txt` → `requirements.txt`
26
- - `Dockerfile` → `Dockerfile`
27
  - `README.md` → `README.md`
28
 
29
- #### Директории:
30
- - `templates/` → `templates/` (содержит `index.html`)
31
-
32
  ### 3. Структура файлов на HF
33
 
34
  ```
@@ -38,10 +34,7 @@ your-space/
38
  ├── data_layer.py
39
  ├── llm.py
40
  ├── requirements.txt
41
- ── Dockerfile
42
- ├── README.md
43
- └── templates/
44
- └── index.html
45
  ```
46
 
47
  ## 🔧 Настройка Space
@@ -56,58 +49,54 @@ your-space/
56
  ### 2. Environment Variables (опционально)
57
 
58
  Можно добавить переменные окружения:
59
- - `FLASK_ENV=production`
60
- - `PORT=7860`
61
 
62
  ## 🚀 Запуск
63
 
64
  После загрузки всех файлов:
65
 
66
- 1. HF автоматически соберет Docker образ
67
- 2. Приложение запустится на порту 7860
68
  3. Доступ будет по адресу: `https://your-username-itmo-chatbot.hf.space`
69
 
70
  ## 📊 Мониторинг
71
 
72
- ### Логи сборки
73
- - Проверьте логи сборки в разделе "Build logs"
74
- - Убедитесь, что нет ошибок в Docker build
75
 
76
  ### Логи приложения
77
- - В разделе "App logs" можно увидеть логи Flask приложения
78
  - Проверьте, что приложение запустилось без ошибок
79
 
80
  ## 🧪 Тестирование
81
 
82
- ### 1. Проверка статуса
83
- ```bash
84
- curl https://your-username-itmo-chatbot.hf.space/api/status
85
- ```
86
 
87
  ### 2. Тест чата
88
- ```bash
89
- curl -X POST https://your-username-itmo-chatbot.hf.space/api/chat \
90
- -H "Content-Type: application/json" \
91
- -d '{"message": "Какие курсы по машинному обучению?"}'
92
- ```
93
 
94
  ### 3. Тест рекомендаций
95
- ```bash
96
- curl -X POST https://your-username-itmo-chatbot.hf.space/api/recommendations \
97
- -H "Content-Type: application/json" \
98
- -d '{"programming_exp": 3, "math_level": 2, "interests": ["ml"], "semester": "1"}'
99
- ```
100
 
101
  ## 🔍 Возможные проблемы
102
 
103
- ### 1. Ошибка сборки Docker
104
- - Проверьте синтаксис Dockerfile
105
- - Убедитесь, что все файлы загружены
106
- - Проверьте requirements.txt
107
 
108
  ### 2. Ошибка запуска приложения
109
  - Проверьте логи в разделе "App logs"
110
- - Убедитесь, что порт 7860 открыт
111
  - Проверьте импорты в app.py
112
 
113
  ### 3. Проблемы с LLM
@@ -116,24 +105,39 @@ curl -X POST https://your-username-itmo-chatbot.hf.space/api/recommendations \
116
 
117
  ## 📈 Оптимизация
118
 
119
- ### 1. Уменьшение размера образа
120
- - Используйте `.dockerignore`
121
- - Оптимизируйте requirements.txt
122
- - Используйте многоэтапную сборку
123
-
124
- ### 2. Ускорение запуска
125
- - Кэшируйте pip зависимости
126
- - Используйте легковесный ��азовый образ
127
  - Оптимизируйте загрузку LLM
 
 
 
 
 
 
128
 
129
  ## 🎯 Готово!
130
 
131
  После успешного деплоя:
132
  - ✅ Приложение доступно по HTTPS
133
- - ✅ Все API endpoints работают
134
- - ✅ Веб-интерфейс функционирует
135
  - ✅ Парсинг данных работает
136
  - ✅ Рекомендации генерируются
137
  - ✅ LLM отвечает на вопросы
138
 
139
  **Ваш чат-бот готов к использованию!** 🎉
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  3. Выберите:
10
  - **Owner**: ваш аккаунт
11
  - **Space name**: `itmo-chatbot` (или любое другое)
12
+ - **Space SDK**: **Streamlit** (важно!)
13
  - **License**: MIT
14
  - **Visibility**: Public
15
 
 
23
  - `data_layer.py` → `data_layer.py`
24
  - `llm.py` → `llm.py`
25
  - `requirements.txt` → `requirements.txt`
 
26
  - `README.md` → `README.md`
27
 
 
 
 
28
  ### 3. Структура файлов на HF
29
 
30
  ```
 
34
  ├── data_layer.py
35
  ├── llm.py
36
  ├── requirements.txt
37
+ ── README.md
 
 
 
38
  ```
39
 
40
  ## 🔧 Настройка Space
 
49
  ### 2. Environment Variables (опционально)
50
 
51
  Можно добавить переменные окружения:
52
+ - `STREAMLIT_SERVER_PORT=8501`
53
+ - `STREAMLIT_SERVER_ADDRESS=0.0.0.0`
54
 
55
  ## 🚀 Запуск
56
 
57
  После загрузки всех файлов:
58
 
59
+ 1. HF автоматически установит зависимости из `requirements.txt`
60
+ 2. Streamlit приложение запустится на порту 8501
61
  3. Доступ будет по адресу: `https://your-username-itmo-chatbot.hf.space`
62
 
63
  ## 📊 Мониторинг
64
 
65
+ ### Логи установки
66
+ - Проверьте логи установки в разделе "Build logs"
67
+ - Убедитесь, что все зависимости установились
68
 
69
  ### Логи приложения
70
+ - В разделе "App logs" можно увидеть логи Streamlit приложения
71
  - Проверьте, что приложение запустилось без ошибок
72
 
73
  ## 🧪 Тестирование
74
 
75
+ ### 1. Проверка интерфейса
76
+ - Откройте приложение в браузере
77
+ - Проверьте, что все элементы интерфейса отображаются
78
+ - Убедитесь, что чат работает
79
 
80
  ### 2. Тест чата
81
+ - Введите вопрос: "Какие курсы по машинному обучению?"
82
+ - Проверьте, что бот отвечает корректно
 
 
 
83
 
84
  ### 3. Тест рекомендаций
85
+ - Заполните форму профиля
86
+ - Выберите семестр
87
+ - Нажмите "Получить рекомендации"
88
+ - Проверьте, что рекомендации генерируются
 
89
 
90
  ## 🔍 Возможные проблемы
91
 
92
+ ### 1. Ошибка установки зависимостей
93
+ - Проверьте синтаксис requirements.txt
94
+ - Убедитесь, что все пакеты совместимы
95
+ - Проверьте версии Python
96
 
97
  ### 2. Ошибка запуска приложения
98
  - Проверьте логи в разделе "App logs"
99
+ - Убедитесь, что app.py запускается без ошибок
100
  - Проверьте импорты в app.py
101
 
102
  ### 3. Проблемы с LLM
 
105
 
106
  ## 📈 Оптимизация
107
 
108
+ ### 1. Ускорение запуска
109
+ - Используйте кэширование Streamlit (`@st.cache_data`)
 
 
 
 
 
 
110
  - Оптимизируйте загрузку LLM
111
+ - Минимизируйте количество зависимостей
112
+
113
+ ### 2. Улучшение UI
114
+ - Добавьте индикаторы загрузки
115
+ - Используйте прогресс-бары для длительных операций
116
+ - Добавьте уведомления об ошибках
117
 
118
  ## 🎯 Готово!
119
 
120
  После успешного деплоя:
121
  - ✅ Приложение доступно по HTTPS
122
+ - ✅ Streamlit интерфейс работает
123
+ - ✅ Чат функционирует
124
  - ✅ Парсинг данных работает
125
  - ✅ Рекомендации генерируются
126
  - ✅ LLM отвечает на вопросы
127
 
128
  **Ваш чат-бот готов к использованию!** 🎉
129
+
130
+ ## 🐳 Локальный запуск с Docker
131
+
132
+ Если хотите протестировать локально:
133
+
134
+ ```bash
135
+ # Сборка и запуск
136
+ docker-compose up --build
137
+
138
+ # Или вручную
139
+ docker build -t itmo-chatbot .
140
+ docker run -p 8501:8501 itmo-chatbot
141
+ ```
142
+
143
+ Приложение будет доступно по адресу: `http://localhost:8501`
Dockerfile CHANGED
@@ -22,7 +22,7 @@ COPY . .
22
  RUN mkdir -p data/processed
23
 
24
  # Открываем порт
25
- EXPOSE 7860
26
 
27
- # Запускаем приложение
28
- CMD ["python", "app.py"]
 
22
  RUN mkdir -p data/processed
23
 
24
  # Открываем порт
25
+ EXPOSE 8501
26
 
27
+ # Запускаем Streamlit приложение
28
+ CMD ["streamlit", "run", "app.py", "--server.port=8501", "--server.address=0.0.0.0"]
README.md CHANGED
@@ -9,9 +9,9 @@ app_file: app.py
9
  pinned: false
10
  ---
11
 
12
- # 🤖 ITMO Магистратура - Чат-бот (Docker)
13
 
14
- Минимально работающий прототип чат-бота для абитуриентов магистратур ITMO с парсингом данных, диалоговой системой и персонализированными рекомендациями. Теперь работает в Docker!
15
 
16
  ## 🎯 Ключевые функции
17
 
@@ -33,7 +33,7 @@ pinned: false
33
  - **Рекомендации по семестрам** с объяснением выбора
34
  - **LLM-генерация** персонализированных советов
35
 
36
- ## 🚀 Быстрый старт с Docker
37
 
38
  ### Локальный запуск
39
 
@@ -42,37 +42,35 @@ pinned: false
42
  git clone <your-repo-url>
43
  cd <your-repo-name>
44
 
45
- # Запускаем с Docker Compose
46
- docker-compose up --build
47
 
48
- # Или собираем и запускаем вручную
49
- docker build -t itmo-chatbot .
50
- docker run -p 7860:7860 itmo-chatbot
 
 
51
  ```
52
 
53
  ### Деплой на Hugging Face Spaces
54
 
55
  1. Создайте новый Space на [Hugging Face](https://huggingface.co/spaces)
56
- 2. Выберите **Docker** (не Gradio!)
57
  3. Загрузите файлы:
58
  - `app.py` → `app.py`
59
  - `parser.py` → `parser.py`
60
  - `data_layer.py` → `data_layer.py`
61
  - `llm.py` → `llm.py`
62
  - `requirements.txt` → `requirements.txt`
63
- - `Dockerfile` → `Dockerfile`
64
- - `templates/index.html` → `templates/index.html`
65
  - `README.md` → `README.md`
66
 
67
  ## 📁 Структура проекта
68
 
69
  ```
70
- ├── app.py # Flask приложение
71
  ├── parser.py # Парсинг данных с сайтов ITMO
72
  ├── data_layer.py # Работа с данными и рекомендации
73
  ├── llm.py # LLM система
74
- ├── templates/ # HTML шаблоны
75
- │ └── index.html # Веб-интерфейс
76
  ├── Dockerfile # Docker конфигурация
77
  ├── docker-compose.yml # Docker Compose
78
  ├── requirements.txt # Python зависимости
@@ -90,12 +88,12 @@ docker run -p 7860:7860 itmo-chatbot
90
  ✅ **12 fallback курсов** - полные учебные планы ИИ и AI Product
91
  ✅ **Строгая релевантность** - отвечает только на вопросы об ITMO
92
  ✅ **Fallback режим** - работает без LLM
 
93
  ✅ **Docker контейнеризация** - стабильный деплой
94
- ✅ **Веб-интерфейс** - современный UI на Flask
95
 
96
  ## 🔧 Технологии
97
 
98
- - **Flask** - веб-фреймворк
99
  - **Docker** - контейнеризация
100
  - **Transformers** - LLM модель (RuT5-base-multitask)
101
  - **BeautifulSoup** - парсинг HTML страниц
@@ -182,7 +180,7 @@ docker run -p 7860:7860 itmo-chatbot
182
  docker build -t itmo-chatbot .
183
 
184
  # Запуск контейнера
185
- docker run -p 7860:7860 itmo-chatbot
186
 
187
  # Запуск с Docker Compose
188
  docker-compose up --build
@@ -210,4 +208,4 @@ MIT License - свободное использование и модифика
210
 
211
  **Создано для абитуриентов магистратур ITMO** 🎓
212
 
213
- *Минимально работающий прототип: парсинг + диалог + рекомендации + Docker*
 
9
  pinned: false
10
  ---
11
 
12
+ # 🤖 ITMO Магистратура - Чат-бот (Streamlit)
13
 
14
+ Минимально работающий прототип чат-бота для абитуриентов магистратур ITMO с парсингом данных, диалоговой системой и персонализированными рекомендациями. Теперь работает на Streamlit!
15
 
16
  ## 🎯 Ключевые функции
17
 
 
33
  - **Рекомендации по семестрам** с объяснением выбора
34
  - **LLM-генерация** персонализированных советов
35
 
36
+ ## 🚀 Быстрый старт с Streamlit
37
 
38
  ### Локальный запуск
39
 
 
42
  git clone <your-repo-url>
43
  cd <your-repo-name>
44
 
45
+ # Устанавливаем зависимости
46
+ pip install -r requirements.txt
47
 
48
+ # Запускаем Streamlit
49
+ streamlit run app.py
50
+
51
+ # Или с Docker
52
+ docker-compose up --build
53
  ```
54
 
55
  ### Деплой на Hugging Face Spaces
56
 
57
  1. Создайте новый Space на [Hugging Face](https://huggingface.co/spaces)
58
+ 2. Выберите **Streamlit** SDK
59
  3. Загрузите файлы:
60
  - `app.py` → `app.py`
61
  - `parser.py` → `parser.py`
62
  - `data_layer.py` → `data_layer.py`
63
  - `llm.py` → `llm.py`
64
  - `requirements.txt` → `requirements.txt`
 
 
65
  - `README.md` → `README.md`
66
 
67
  ## 📁 Структура проекта
68
 
69
  ```
70
+ ├── app.py # Streamlit приложение
71
  ├── parser.py # Парсинг данных с сайтов ITMO
72
  ├── data_layer.py # Работа с данными и рекомендации
73
  ├── llm.py # LLM система
 
 
74
  ├── Dockerfile # Docker конфигурация
75
  ├── docker-compose.yml # Docker Compose
76
  ├── requirements.txt # Python зависимости
 
88
  ✅ **12 fallback курсов** - полные учебные планы ИИ и AI Product
89
  ✅ **Строгая релевантность** - отвечает только на вопросы об ITMO
90
  ✅ **Fallback режим** - работает без LLM
91
+ ✅ **Streamlit интерфейс** - современный и интуитивный UI
92
  ✅ **Docker контейнеризация** - стабильный деплой
 
93
 
94
  ## 🔧 Технологии
95
 
96
+ - **Streamlit** - веб-фреймворк для ML приложений
97
  - **Docker** - контейнеризация
98
  - **Transformers** - LLM модель (RuT5-base-multitask)
99
  - **BeautifulSoup** - парсинг HTML страниц
 
180
  docker build -t itmo-chatbot .
181
 
182
  # Запуск контейнера
183
+ docker run -p 8501:8501 itmo-chatbot
184
 
185
  # Запуск с Docker Compose
186
  docker-compose up --build
 
208
 
209
  **Создано для абитуриентов магистратур ITMO** 🎓
210
 
211
+ *Минимально работающий прототип: парсинг + диалог + рекомендации + Streamlit*
app.py CHANGED
@@ -1,4 +1,4 @@
1
- from flask import Flask, render_template, request, jsonify
2
  import os
3
 
4
  # Импорты модулей
@@ -6,30 +6,68 @@ from parser import parse_all
6
  from data_layer import load_courses, filter_courses, recommend_courses, is_relevant
7
  from llm import answer, generate_recommendations
8
 
9
- app = Flask(__name__)
 
 
 
 
 
 
10
 
11
  # Инициализация данных
12
- courses = load_courses()
13
- print(f'Загружено курсов: {len(courses)}')
 
 
14
 
15
- @app.route('/')
16
- def index():
17
- """Главная страница"""
18
- return render_template('index.html', courses_count=len(courses))
19
 
20
- @app.route('/api/chat', methods=['POST'])
21
- def chat():
22
- """API для чата"""
23
- try:
24
- data = request.get_json()
25
- message = data.get('message', '').strip()
26
-
27
- if not message:
28
- return jsonify({'error': 'Пустое сообщение'}), 400
29
-
30
- # Проверяем релевантность
31
- if not is_relevant(message):
32
- response = '''Похоже, вопрос не относится к магистратурам ITMO и их учебным планам.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
 
34
  Попробуйте спросить, например:
35
  • "Какие дисциплины по NLP в 1 семестре программы ИИ?"
@@ -37,100 +75,165 @@ def chat():
37
  • "Какие курсы по машинному обучению есть в программе ИИ?"
38
  • "Сколько кредитов за дисциплину 'Глубокое обучение'?"
39
  • "Какие курсы подходят для моего профиля?"'''
40
- return jsonify({'response': response})
41
-
42
- # Определяем программу из сообщения
43
- program_id = None
44
- message_lower = message.lower()
45
- if any(word in message_lower for word in ['ai product', 'продукт', 'менеджмент', 'аналитика']):
46
- program_id = 'ai_product'
47
- elif any(word in message_lower for word in ['ии', 'ai', 'машинное обучение', 'глубокое обучение', 'nlp', 'cv']):
48
- program_id = 'ai'
49
-
50
- # Извлекаем семестр если указан
51
- semester = None
52
- for i in range(1, 5):
53
- if f'{i} семестр' in message_lower or f'{i} семестре' in message_lower:
54
- semester = i
55
- break
56
-
57
- # Фильтруем курсы
58
- context = filter_courses(message, program_id, semester)
59
-
60
- if not context:
61
- response = 'К сожалению, не нашел релевантной информации в учебных планах ITMO. Попробуйте переформулировать вопрос.'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
62
  else:
63
- # Генерируем ответ с помощью LLM
64
- response = answer(message, context)
65
-
66
- return jsonify({'response': response})
67
-
68
- except Exception as e:
69
- return jsonify({'error': f'Ошибка обработки: {str(e)}'}), 500
70
 
71
- @app.route('/api/recommendations', methods=['POST'])
72
- def get_recommendations():
73
- """API для рекомендаций"""
74
- try:
75
- data = request.get_json()
76
- programming_exp = data.get('programming_exp', 2)
77
- math_level = data.get('math_level', 2)
78
- interests = data.get('interests', [])
79
- semester = data.get('semester', '')
80
-
81
- if not semester:
82
- return jsonify({'error': 'Пожалуйста, укажите семестр для получения рекомендаций.'}), 400
83
 
84
- try:
85
- semester_int = int(semester)
86
- except ValueError:
87
- return jsonify({'error': 'Пожалуйста, выберите корректный семестр.'}), 400
 
88
 
89
- # Формируем профиль
90
- profile = {
91
- 'programming_experience': programming_exp,
92
- 'math_level': math_level,
93
- 'interests': interests,
94
- 'semester': semester_int
95
- }
96
 
97
- # Получаем рекомендации
98
- recommended_courses = recommend_courses(profile)
 
 
 
99
 
100
- if not recommended_courses:
101
- response = f'К сожалению, не найдено подходящих курсов для {semester} семестра.'
102
- else:
103
- # Генерируем ответ с помощью LLM
104
- response = generate_recommendations(recommended_courses, profile)
105
-
106
- return jsonify({'response': response})
107
-
108
- except Exception as e:
109
- return jsonify({'error': f'Ошибка получения рекомендаций: {str(e)}'}), 500
110
-
111
- @app.route('/api/update_data', methods=['POST'])
112
- def update_data():
113
- """API для обновления данных"""
114
- try:
115
- success = parse_all()
116
- if success:
117
- # Перезагружаем курсы
118
- global courses
119
- courses = load_courses()
120
- return jsonify({'message': f'Данные успешно обновлены! Загружено {len(courses)} курсов.'})
121
  else:
122
- return jsonify({'error': 'Ошибка при обновлении данных. Используются базовые курсы.'}), 500
123
- except Exception as e:
124
- return jsonify({'error': f'Ошибка обновления данных: {str(e)}'}), 500
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
125
 
126
- @app.route('/api/status')
127
- def status():
128
- """API для проверки статуса"""
129
- return jsonify({
130
- 'status': 'ok',
131
- 'courses_count': len(courses),
132
- 'llm_available': True
133
- })
134
 
135
- if __name__ == '__main__':
136
- app.run(host='0.0.0.0', port=7860, debug=False)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
  import os
3
 
4
  # Импорты модулей
 
6
  from data_layer import load_courses, filter_courses, recommend_courses, is_relevant
7
  from llm import answer, generate_recommendations
8
 
9
+ # Настройка страницы
10
+ st.set_page_config(
11
+ page_title='ITMO Магистратура - Чат-бот',
12
+ page_icon='🤖',
13
+ layout='wide',
14
+ initial_sidebar_state='expanded'
15
+ )
16
 
17
  # Инициализация данных
18
+ @st.cache_data
19
+ def load_courses_data():
20
+ """Загружаем курсы с кэшированием"""
21
+ return load_courses()
22
 
23
+ courses = load_courses_data()
 
 
 
24
 
25
+ # Инициализация сессии
26
+ if 'chat_history' not in st.session_state:
27
+ st.session_state.chat_history = []
28
+
29
+ if 'courses_count' not in st.session_state:
30
+ st.session_state.courses_count = len(courses)
31
+
32
+ # Заголовок
33
+ st.title('🤖 ITMO Магистратура - Чат-бот')
34
+ st.markdown('Задавайте вопросы о программах ИИ и AI Product, получайте персональные рекомендации по курсам')
35
+
36
+ # Статистика
37
+ col1, col2, col3 = st.columns(3)
38
+ with col1:
39
+ st.metric('📊 Загружено курсов', st.session_state.courses_count)
40
+ with col2:
41
+ st.metric('🎯 Программ', 2)
42
+ with col3:
43
+ st.metric('📚 Семестров', 4)
44
+
45
+ st.divider()
46
+
47
+ # Основной контент
48
+ col1, col2 = st.columns([2, 1])
49
+
50
+ with col1:
51
+ st.subheader('💬 Чат с ботом')
52
+
53
+ # Поле ввода сообщения
54
+ user_message = st.text_input(
55
+ 'Введите сообщение',
56
+ placeholder='Спрашивайте о дисциплинах, программах, учебных планах...',
57
+ key='user_input'
58
+ )
59
+
60
+ # Кнопки
61
+ col_btn1, col_btn2 = st.columns(2)
62
+ with col_btn1:
63
+ if st.button('Отправить', type='primary'):
64
+ if user_message.strip():
65
+ # Добавляем сообщение пользователя
66
+ st.session_state.chat_history.append(('user', user_message))
67
+
68
+ # Проверяем релевантность
69
+ if not is_relevant(user_message):
70
+ response = '''Похоже, вопрос не относится к магистратурам ITMO и их учебным планам.
71
 
72
  Попробуйте спросить, например:
73
  • "Какие дисциплины по NLP в 1 семестре программы ИИ?"
 
75
  • "Какие курсы по машинному обучению есть в программе ИИ?"
76
  • "Сколько кредитов за дисциплину 'Глубокое обучение'?"
77
  • "Какие курсы подходят для моего профиля?"'''
78
+ else:
79
+ # Определяем программу из сообщения
80
+ program_id = None
81
+ message_lower = user_message.lower()
82
+ if any(word in message_lower for word in ['ai product', 'продукт', 'менеджмент', 'аналитика']):
83
+ program_id = 'ai_product'
84
+ elif any(word in message_lower for word in ['ии', 'ai', 'машинное обучение', 'глубокое обучение', 'nlp', 'cv']):
85
+ program_id = 'ai'
86
+
87
+ # Извлекаем семестр если указан
88
+ semester = None
89
+ for i in range(1, 5):
90
+ if f'{i} семестр' in message_lower or f'{i} семестре' in message_lower:
91
+ semester = i
92
+ break
93
+
94
+ # Фильтруем курсы
95
+ context = filter_courses(user_message, program_id, semester)
96
+
97
+ if not context:
98
+ response = 'К сожалению, не нашел релевантной информации в учебных планах ITMO. Попробуйте переформулировать вопрос.'
99
+ else:
100
+ # Генерируем ответ с помощью LLM
101
+ response = answer(user_message, context)
102
+
103
+ # Добавляем ответ бота
104
+ st.session_state.chat_history.append(('bot', response))
105
+
106
+ # Ограничиваем историю до 6 сообщений (3 пары)
107
+ if len(st.session_state.chat_history) > 6:
108
+ st.session_state.chat_history = st.session_state.chat_history[-6:]
109
+
110
+ # Очищаем поле ввода
111
+ st.rerun()
112
+
113
+ with col_btn2:
114
+ if st.button('Очистить чат'):
115
+ st.session_state.chat_history = []
116
+ st.rerun()
117
+
118
+ # Отображение истории чата
119
+ chat_container = st.container()
120
+ with chat_container:
121
+ if not st.session_state.chat_history:
122
+ st.info('Привет! Я помогу тебе узнать больше о магистерских программах ITMO. Задавай вопросы о курсах, программах и получай персональные рекомендации!')
123
  else:
124
+ for role, message in st.session_state.chat_history:
125
+ if role == 'user':
126
+ with st.chat_message('user'):
127
+ st.write(message)
128
+ else:
129
+ with st.chat_message('assistant'):
130
+ st.write(message)
131
 
132
+ with col2:
133
+ st.subheader('👤 Профиль для рекомендаций')
134
+
135
+ # Форма профиля
136
+ with st.form('profile_form'):
137
+ programming_exp = st.slider(
138
+ 'Опыт программирования (0-5)',
139
+ min_value=0, max_value=5, value=2,
140
+ help='0 - нет опыта, 5 - эксперт'
141
+ )
 
 
142
 
143
+ math_level = st.slider(
144
+ 'Уровень математики (0-4)',
145
+ min_value=0, max_value=4, value=2,
146
+ help='0 - базовый, 4 - продвинутый'
147
+ )
148
 
149
+ interests = st.multiselect(
150
+ 'Интересы',
151
+ options=['ml', 'dl', 'nlp', 'cv', 'product', 'business', 'research', 'data', 'systems', 'python', 'math'],
152
+ default=['ml'],
153
+ help='Выберите интересующие направления'
154
+ )
 
155
 
156
+ semester = st.selectbox(
157
+ 'Целевой семестр',
158
+ options=['', '1', '2', '3', '4'],
159
+ help='Для получения рекомендаций'
160
+ )
161
 
162
+ col_rec1, col_rec2 = st.columns(2)
163
+ with col_rec1:
164
+ get_recommendations = st.form_submit_button('🎯 Получить рекомендации', type='primary')
165
+ with col_rec2:
166
+ update_data = st.form_submit_button('🔄 Обновить данные')
167
+
168
+ # Обработка рекомендаций
169
+ if get_recommendations:
170
+ if not semester:
171
+ st.error('Пожалуйста, выберите семестр для получения рекомендаций.')
 
 
 
 
 
 
 
 
 
 
 
172
  else:
173
+ with st.spinner('Генерируем рекомендации...'):
174
+ try:
175
+ # Формируем профиль
176
+ profile = {
177
+ 'programming_experience': programming_exp,
178
+ 'math_level': math_level,
179
+ 'interests': interests,
180
+ 'semester': int(semester)
181
+ }
182
+
183
+ # Получаем рекомендации
184
+ recommended_courses = recommend_courses(profile)
185
+
186
+ if not recommended_courses:
187
+ st.warning(f'К сожалению, не найдено подходящих курсов для {semester} семестра.')
188
+ else:
189
+ # Генерируем ответ с помощью LLM
190
+ response = generate_recommendations(recommended_courses, profile)
191
+
192
+ st.success('Рекомендации готовы!')
193
+ st.text_area('Рекомендации:', response, height=300, disabled=True)
194
+
195
+ except Exception as e:
196
+ st.error(f'Ошибка получения рекомендаций: {str(e)}')
197
+
198
+ # Обработка обновления данных
199
+ if update_data:
200
+ with st.spinner('Обновляем данные...'):
201
+ try:
202
+ success = parse_all()
203
+ if success:
204
+ # Перезагружаем курсы
205
+ st.session_state.courses_count = len(load_courses())
206
+ st.success(f'Данные успешно обновлены! Загружено {st.session_state.courses_count} курсов.')
207
+ st.rerun()
208
+ else:
209
+ st.error('Ошибка при обновлении данных. Используются базовые курсы.')
210
+ except Exception as e:
211
+ st.error(f'Ошибка обновления данных: {str(e)}')
212
 
213
+ # Футер
214
+ st.divider()
215
+ st.markdown('---')
216
+ st.markdown('**Создано для абитуриентов магистратур ITMO** 🎓')
 
 
 
 
217
 
218
+ # Боковая панель с информацией
219
+ with st.sidebar:
220
+ st.header('ℹ️ И��формация')
221
+
222
+ st.subheader('📚 Программы')
223
+ st.markdown("""
224
+ - **Искусственный интеллект** - ML, DL, NLP, CV
225
+ - **AI Product Management** - продуктовая аналитика, управление
226
+ """)
227
+
228
+ st.subheader('🎯 Примеры вопросов')
229
+ st.markdown("""
230
+ - "Какие курсы по машинному обучению?"
231
+ - "Сколько кредитов за глубокое обучение?"
232
+ - "Расскажи о программе AI Product"
233
+ - "Какие дисциплины в 1 семестре?"
234
+ """)
235
+
236
+ st.subheader('🔧 Статус системы')
237
+ st.success('✅ Система работает')
238
+ st.info(f'📊 Курсов: {st.session_state.courses_count}')
239
+ st.info('🤖 LLM: Доступен')
docker-compose.yml CHANGED
@@ -4,9 +4,10 @@ services:
4
  itmo-chatbot:
5
  build: .
6
  ports:
7
- - "7860:7860"
8
  volumes:
9
  - ./data:/app/data
10
  environment:
11
- - FLASK_ENV=production
 
12
  restart: unless-stopped
 
4
  itmo-chatbot:
5
  build: .
6
  ports:
7
+ - "8501:8501"
8
  volumes:
9
  - ./data:/app/data
10
  environment:
11
+ - STREAMLIT_SERVER_PORT=8501
12
+ - STREAMLIT_SERVER_ADDRESS=0.0.0.0
13
  restart: unless-stopped
requirements.txt CHANGED
@@ -1,4 +1,4 @@
1
- flask==2.3.3
2
  transformers==4.36.2
3
  torch==2.1.0
4
  requests==2.31.0
 
1
+ streamlit==1.28.1
2
  transformers==4.36.2
3
  torch==2.1.0
4
  requests==2.31.0