Wplotnikow commited on
Commit
14c44ae
·
verified ·
1 Parent(s): 8520216

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +183 -53
app.py CHANGED
@@ -1,64 +1,194 @@
1
  import gradio as gr
2
- from huggingface_hub import InferenceClient
 
 
3
 
4
- """
5
- For more information on `huggingface_hub` Inference API support, please check the docs: https://huggingface.co/docs/huggingface_hub/v0.22.2/en/guides/inference
6
- """
7
- client = InferenceClient("HuggingFaceH4/zephyr-7b-beta")
8
-
9
-
10
- def respond(
11
- message,
12
- history: list[tuple[str, str]],
13
- system_message,
14
- max_tokens,
15
- temperature,
16
- top_p,
17
- ):
18
- messages = [{"role": "system", "content": system_message}]
19
 
20
- for val in history:
21
- if val[0]:
22
- messages.append({"role": "user", "content": val[0]})
23
- if val[1]:
24
- messages.append({"role": "assistant", "content": val[1]})
 
 
 
 
 
 
25
 
26
- messages.append({"role": "user", "content": message})
 
 
 
 
 
 
 
27
 
28
- response = ""
29
-
30
- for message in client.chat_completion(
31
- messages,
32
- max_tokens=max_tokens,
33
- stream=True,
34
- temperature=temperature,
35
- top_p=top_p,
36
- ):
37
- token = message.choices[0].delta.content
38
 
39
- response += token
40
- yield response
 
 
 
 
 
 
 
 
41
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
 
43
- """
44
- For information on how to customize the ChatInterface, peruse the gradio docs: https://www.gradio.app/docs/chatinterface
45
- """
46
- demo = gr.ChatInterface(
47
- respond,
48
- additional_inputs=[
49
- gr.Textbox(value="You are a friendly Chatbot.", label="System message"),
50
- gr.Slider(minimum=1, maximum=2048, value=512, step=1, label="Max new tokens"),
51
- gr.Slider(minimum=0.1, maximum=4.0, value=0.7, step=0.1, label="Temperature"),
52
- gr.Slider(
53
- minimum=0.1,
54
- maximum=1.0,
55
- value=0.95,
56
- step=0.05,
57
- label="Top-p (nucleus sampling)",
58
- ),
59
- ],
60
- )
61
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
62
 
 
63
  if __name__ == "__main__":
64
- demo.launch()
 
 
 
 
 
1
  import gradio as gr
2
+ import os
3
+ from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM
4
+ import torch
5
 
6
+ # Инициализация модели для русского языка
7
+ model_name = "microsoft/DialoGPT-medium" # Можно заменить на sberbank-ai/rugpt3small_based_on_gpt2
 
 
 
 
 
 
 
 
 
 
 
 
 
8
 
9
+ # Загрузка модели и токенизатора
10
+ try:
11
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
12
+ model = AutoModelForCausalLM.from_pretrained(model_name)
13
+ tokenizer.pad_token = tokenizer.eos_token
14
+ except Exception as e:
15
+ print(f"Ошибка загрузки модели: {e}")
16
+ # Fallback на более простую модель
17
+ model_name = "gpt2"
18
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
19
+ model = AutoModelForCausalLM.from_pretrained(model_name)
20
 
21
+ # Системный промпт для образовательного чат-бота
22
+ SYSTEM_PROMPT = """
23
+ Ты - образовательный помощник преподавателя университета. Твоя задача:
24
+ - Помогать студентам с учебными вопросами
25
+ - Объяснять сложные концепции простым языком
26
+ - Давать конструктивные советы по обучению
27
+ - Быть терпеливым и поддерживающим
28
+ - Отвечать на русском языке
29
 
30
+ Всегда:
31
+ - Будь дружелюбным и профессиональным
32
+ - Объясняй пошагово
33
+ - Приводи примеры
34
+ - Задавай уточняющие вопросы если нужно
35
+ """
 
 
 
 
36
 
37
+ def format_prompt(message, history):
38
+ """Форматирование промпта с учетом истории"""
39
+ prompt = SYSTEM_PROMPT + "\n\n"
40
+
41
+ # Добавляем историю разговора
42
+ for user_msg, bot_msg in history:
43
+ prompt += f"Студент: {user_msg}\nПреподаватель: {bot_msg}\n\n"
44
+
45
+ prompt += f"Студент: {message}\nПреподаватель:"
46
+ return prompt
47
 
48
+ def generate_response(message, history, temperature=0.7, max_length=200):
49
+ """Генерация ответа от модели"""
50
+ try:
51
+ # Форматируем промпт
52
+ prompt = format_prompt(message, history)
53
+
54
+ # Токенизируем
55
+ inputs = tokenizer.encode(prompt, return_tensors="pt", max_length=1024, truncation=True)
56
+
57
+ # Генерируем ответ
58
+ with torch.no_grad():
59
+ outputs = model.generate(
60
+ inputs,
61
+ max_length=inputs.shape[1] + max_length,
62
+ temperature=temperature,
63
+ do_sample=True,
64
+ pad_token_id=tokenizer.eos_token_id,
65
+ no_repeat_ngram_size=2,
66
+ top_p=0.9
67
+ )
68
+
69
+ # Декодируем ответ
70
+ response = tokenizer.decode(outputs[0], skip_special_tokens=True)
71
+
72
+ # Извлекаем только новую часть ответа
73
+ response = response[len(prompt):].strip()
74
+
75
+ # Очищаем ответ от лишних символов
76
+ response = response.split("Студент:")[0].strip()
77
+
78
+ if not response:
79
+ response = "Извините, не могу сформулировать ответ. Попробуйте переформулировать вопрос."
80
+
81
+ return response
82
+
83
+ except Exception as e:
84
+ return f"Произошла ошибка: {str(e)}. Попробуйте еще раз."
85
 
86
+ def chat_function(message, history, temperature, max_length):
87
+ """Основная функция чата"""
88
+ if not message.strip():
89
+ return history, ""
90
+
91
+ # Генерируем ответ
92
+ response = generate_response(message, history, temperature, max_length)
93
+
94
+ # Добавляем в историю
95
+ history.append((message, response))
96
+
97
+ return history, ""
 
 
 
 
 
 
98
 
99
+ # Создание интерфейса Gradio
100
+ with gr.Blocks(
101
+ title="Образовательный чат-бот",
102
+ theme=gr.themes.Soft(primary_hue="blue"),
103
+ css="""
104
+ .gradio-container {
105
+ max-width: 800px !important;
106
+ margin: auto !important;
107
+ }
108
+ """
109
+ ) as demo:
110
+
111
+ gr.HTML("""
112
+ <div style="text-align: center; margin-bottom: 20px;">
113
+ <h1>📚 Образовательный чат-бот</h1>
114
+ <p>Ваш персональный помощник для обучения</p>
115
+ </div>
116
+ """)
117
+
118
+ with gr.Row():
119
+ with gr.Column(scale=3):
120
+ chatbot = gr.Chatbot(
121
+ height=500,
122
+ placeholder="Привет! Я ваш образовательный помощник. Задайте мне любой вопрос по учебе!",
123
+ show_label=False
124
+ )
125
+
126
+ with gr.Row():
127
+ message = gr.Textbox(
128
+ placeholder="Введите ваш вопрос...",
129
+ show_label=False,
130
+ lines=2,
131
+ scale=4
132
+ )
133
+ send_btn = gr.Button("Отправить", variant="primary", scale=1)
134
+
135
+ with gr.Column(scale=1):
136
+ gr.HTML("<h3>⚙️ Настройки</h3>")
137
+
138
+ temperature = gr.Slider(
139
+ minimum=0.1,
140
+ maximum=1.0,
141
+ value=0.7,
142
+ step=0.1,
143
+ label="Креативность",
144
+ info="Выше = более креативные ответы"
145
+ )
146
+
147
+ max_length = gr.Slider(
148
+ minimum=50,
149
+ maximum=300,
150
+ value=200,
151
+ step=50,
152
+ label="Длина ответа",
153
+ info="Максимальная длина ответа"
154
+ )
155
+
156
+ clear_btn = gr.Button("🗑️ Очистить чат", variant="secondary")
157
+
158
+ gr.HTML("""
159
+ <div style="margin-top: 20px; padding: 10px; background-color: #f0f0f0; border-radius: 5px;">
160
+ <h4>💡 Примеры вопросов:</h4>
161
+ <ul>
162
+ <li>Объясни теорему Пифагора</li>
163
+ <li>Как решать квадратные уравнения?</li>
164
+ <li>Что такое фотосинтез?</li>
165
+ <li>Помоги с написанием эссе</li>
166
+ </ul>
167
+ </div>
168
+ """)
169
+
170
+ # Обработчики событий
171
+ send_btn.click(
172
+ chat_function,
173
+ inputs=[message, chatbot, temperature, max_length],
174
+ outputs=[chatbot, message]
175
+ )
176
+
177
+ message.submit(
178
+ chat_function,
179
+ inputs=[message, chatbot, temperature, max_length],
180
+ outputs=[chatbot, message]
181
+ )
182
+
183
+ clear_btn.click(
184
+ lambda: ([], ""),
185
+ outputs=[chatbot, message]
186
+ )
187
 
188
+ # Запуск приложения
189
  if __name__ == "__main__":
190
+ demo.launch(
191
+ share=False,
192
+ server_name="0.0.0.0",
193
+ server_port=7860
194
+ )