test1 / app_simple_fixed.py
vydrking's picture
Upload 22 files
490fb9e verified
import gradio as gr
from knowledge_base import KnowledgeBase
# Инициализация базы знаний
kb = KnowledgeBase()
def is_itmo_query(message):
itmo_keywords = [
'итмо', 'магистратура', 'учебный план', 'дисциплина', 'курс',
'ии', 'ai', 'ai product', 'институт ии', 'программа',
'машинное обучение', 'глубокое обучение', 'nlp', 'компьютерное зрение'
]
message_lower = message.lower()
return any(keyword in message_lower for keyword in itmo_keywords)
def simple_search(query, courses):
query_lower = query.lower()
results = []
for course in courses:
course_text = f"{course['name']} {course.get('short_desc', '')}".lower()
if any(word in course_text for word in query_lower.split()):
results.append(course)
return results[:3] # Возвращаем топ-3 результата
def chat_with_bot(message, history):
if not message.strip():
return history, ''
if not is_itmo_query(message):
return history + [[message, '''Похоже, вопрос не относится к магистратурам ITMO и их учебным планам.
Попробуйте спросить, например:
• "Какие дисциплины по NLP в 1 семестре программы ИИ?"
• "Расскажи о программе AI Product"
• "Какие курсы по машинному обучению есть в программе ИИ?"
• "Сколько кредитов за дисциплину 'Глубокое обучение'?"''']], ''
results = simple_search(message, kb.courses)
if not results:
response = 'К сожалению, не нашел релевантной информации в учебных планах ITMO. Попробуйте переформулировать вопрос.'
else:
response = 'Найденные курсы:\n\n'
for i, course in enumerate(results, 1):
response += f'{i}. {course["name"]} ({course["semester"]} семестр, {course["credits"]} кредитов)\n'
if course.get('short_desc'):
response += f' {course["short_desc"]}\n'
response += '\n'
return history + [[message, response]], ''
def get_recommendations(programming_exp, math_level, interests, semester, skills):
if not semester:
return 'Пожалуйста, укажите семестр для получения рекомендаций.'
try:
semester = int(semester)
except ValueError:
return 'Пожалуйста, выберите корректный семестр.'
filtered_courses = kb.get_courses_by_semester(semester)
if not filtered_courses:
return f'К сожалению, не найдено курсов для {semester} семестра.'
# Простая логика рекомендаций
recommendations = []
for course in filtered_courses[:5]: # Топ-5 курсов
score = 0
why_reasons = []
# Оценка по интересам
all_interests = interests + skills
matching_tags = [tag for tag in all_interests if tag in course.get('tags', [])]
if matching_tags:
score += 2
why_reasons.append(f'соответствует вашим интересам: {", ".join(matching_tags)}')
# Оценка по опыту программирования
if programming_exp >= 3 and any(tag in course.get('tags', []) for tag in ['ml', 'dl', 'systems']):
score += 1
why_reasons.append('подходит для вашего уровня программирования')
# Оценка по математике
if math_level >= 3 and any(tag in course.get('tags', []) for tag in ['math', 'stats', 'dl']):
score += 1
why_reasons.append('соответствует вашему уровню математики')
if score > 0:
recommendations.append({
'name': course['name'],
'credits': course['credits'],
'why': '; '.join(why_reasons) if why_reasons else 'курс из учебного плана программы'
})
if not recommendations:
# Если нет подходящих, показываем все курсы
for course in filtered_courses[:3]:
recommendations.append({
'name': course['name'],
'credits': course['credits'],
'why': 'курс из учебного плана программы'
})
result = f'🎯 Рекомендуемые курсы для {semester} семестра:\n\n'
for i, rec in enumerate(recommendations, 1):
result += f'{i}. {rec["name"]} ({rec["credits"]} кредитов)\n'
result += f' {rec["why"]}\n\n'
return result
def update_data_ui():
return 'Данные успешно обновлены! (Используются данные из базы знаний)'
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)