Abobasnik commited on
Commit
98d4acd
·
verified ·
1 Parent(s): ae103c2

Update src/streamlit_app.py

Browse files
Files changed (1) hide show
  1. src/streamlit_app.py +65 -32
src/streamlit_app.py CHANGED
@@ -1,55 +1,88 @@
1
  import streamlit as st
2
- from transformers import pipeline
 
3
  import torch
4
 
5
- # Настройка страницы
6
- st.set_page_config(page_title="HiperAI Pro", page_icon="", layout="centered")
 
 
7
 
8
- # Загрузка модели
9
  @st.cache_resource
10
  def load_model():
11
- # Qwen2.5 — топ для русского языка
12
  model_id = "Qwen/Qwen2.5-1.5B-Instruct"
13
- return pipeline("text-generation", model=model_id, device_map="auto", torch_dtype="auto")
 
 
 
 
 
 
 
14
 
15
- generator = load_model()
16
 
17
- # --- БОКОВАЯ ПАНЕЛЬ (SIDEBAR) ---
 
 
 
 
18
  with st.sidebar:
19
  st.title("⚙️ Настройки")
20
  if st.button("🗑️ Очистить чат"):
21
  st.session_state.messages = []
22
  st.rerun()
23
-
24
- temp = st.slider("Креативность (Temperature)", 0.1, 1.5, 0.7)
25
- st.info("Выше = интереснее, ниже = точнее.")
26
-
27
- # --- ЛОГИКА ЧАТА ---
28
- if "messages" not in st.session_state:
29
- st.session_state.messages = []
30
 
31
- # Отображение чата
32
- for message in st.session_state.messages:
33
  with st.chat_message(message["role"]):
34
  st.markdown(message["content"])
35
 
36
- # Ввод сообщения
37
- if prompt := st.chat_input("Напиши сообщение..."):
38
  st.session_state.messages.append({"role": "user", "content": prompt})
39
  with st.chat_message("user"):
40
  st.markdown(prompt)
41
 
42
  with st.chat_message("assistant"):
43
- with st.spinner("HiperAI думает..."):
44
- # Формируем контекст с личностью
45
- chat = [
46
- {"role": "system", "content": "Ты — HiperAI, крутой и полезный ИИ-помощник. Отвечай кратко и по делу на русском языке."},
47
- {"role": "user", "content": prompt}
48
- ]
49
-
50
- output = generator(chat, max_new_tokens=512, do_sample=True, temperature=temp)
51
- response = output[0]['generated_text'][-1]['content']
52
-
53
- st.markdown(response)
54
- st.session_state.messages.append({"role": "assistant", "content": response})
55
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import streamlit as st
2
+ from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer
3
+ from threading import Thread
4
  import torch
5
 
6
+ # Настройка интерфейса
7
+ st.set_page_config(page_title="HiperAI Ultra", page_icon="🚀")
8
+ st.title("🚀 HiperAI Ultra")
9
+ st.caption("Режим: Максимальная скорость + Стриминг")
10
 
11
+ # 1. Загрузка модели с оптимизацией под CPU
12
  @st.cache_resource
13
  def load_model():
 
14
  model_id = "Qwen/Qwen2.5-1.5B-Instruct"
15
+ tokenizer = AutoTokenizer.from_pretrained(model_id)
16
+ model = AutoModelForCausalLM.from_pretrained(
17
+ model_id,
18
+ torch_dtype=torch.float32,
19
+ low_cpu_mem_usage=True,
20
+ device_map="cpu"
21
+ )
22
+ return tokenizer, model
23
 
24
+ tokenizer, model = load_model()
25
 
26
+ # 2. Инициализация памяти
27
+ if "messages" not in st.session_state:
28
+ st.session_state.messages = []
29
+
30
+ # Боковая панель
31
  with st.sidebar:
32
  st.title("⚙️ Настройки")
33
  if st.button("🗑️ Очистить чат"):
34
  st.session_state.messages = []
35
  st.rerun()
36
+ st.info("ИИ оптимизирован для работы на CPU")
 
 
 
 
 
 
37
 
38
+ # Отображение истории (последние 10 сообщений)
39
+ for message in st.session_state.messages[-10:]:
40
  with st.chat_message(message["role"]):
41
  st.markdown(message["content"])
42
 
43
+ # 3. Основная логика работы
44
+ if prompt := st.chat_input("Напиши HiperAI..."):
45
  st.session_state.messages.append({"role": "user", "content": prompt})
46
  with st.chat_message("user"):
47
  st.markdown(prompt)
48
 
49
  with st.chat_message("assistant"):
50
+ # Формируем компактный контекст для ускорения
51
+ context = [{"role": "system", "content": "Ты HiperAI, быстрый и умный помощник. Отвечай на русском."}]
52
+ context += st.session_state.messages[-5:] # Помним только последние 5 реплик
53
+
54
+ inputs = tokenizer.apply_chat_template(
55
+ context,
56
+ add_generation_prompt=True,
57
+ return_tensors="pt"
58
+ ).to(model.device)
59
+
60
+ # Настройка стримера для эффекта печати
61
+ streamer = TextIteratorStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True)
62
+
63
+ # Параметры для самой быстрой генерации
64
+ generation_kwargs = dict(
65
+ input_ids=inputs,
66
+ streamer=streamer,
67
+ max_new_tokens=512,
68
+ do_sample=True, # Оставляем немного креативности
69
+ temperature=0.7,
70
+ top_k=50,
71
+ top_p=0.95,
72
+ use_cache=True # Ускоряет повторную генерацию
73
+ )
74
+
75
+ # Запуск в отдельном потоке (Thread)
76
+ thread = Thread(target=model.generate, kwargs=generation_kwargs)
77
+ thread.start()
78
+
79
+ # Вывод текста по мере появления
80
+ def stream_output():
81
+ full_response = ""
82
+ for new_text in streamer:
83
+ full_response += new_text
84
+ yield new_text
85
+ st.session_state.messages.append({"role": "assistant", "content": full_response})
86
+
87
+ st.write_stream(stream_output)
88
+