DINGDINGBELLS commited on
Commit
da0f0d3
·
verified ·
1 Parent(s): 2b6f383

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +45 -84
app.py CHANGED
@@ -3,64 +3,48 @@ import torch
3
  import re
4
  import random
5
  from transformers import AutoModelForCausalLM, AutoTokenizer
6
- import os
7
 
8
  # ==========================================
9
- # 1. ЗАГРУЗКА МОДЕЛИ И ТОКЕНАЙЗЕРА
10
  # ==========================================
11
- # Используем ".", так как файлы модели лежат прямо в Space
12
- MODEL_PATH = "./"
13
 
14
- print("--- [1/2] Загрузка BananaGPT ---")
15
  tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH)
16
  model = AutoModelForCausalLM.from_pretrained(
17
  MODEL_PATH,
18
- torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32,
19
- device_map="auto"
20
  )
21
 
22
- # Жесткие лимиты под твои 128 токенов
23
  model.config.max_position_embeddings = 128
24
  model.config.use_cache = False
25
  tokenizer.pad_token = tokenizer.eos_token
26
- model.config.pad_token_id = tokenizer.pad_token_id
27
-
28
- print("--- [2/2] Модель загружена. Запуск интерфейса ---")
29
 
30
  # СПИСОК МУСОРА (Шиза)
31
- SHIZA_WASTE = [
32
- "лучшая подруга", "решением знаний", "систему cn", "обновления системы",
33
- "мои знания", "тестового ключа", "python_dict", "максимизировать их ошибки",
34
- "в густом тумане войны", "сегодня ты меня боишься", "CROME_", "RESMALA"
35
- ]
36
 
37
  # ==========================================
38
- # 2. ЛОГИКА ГЕНЕРАЦИИ С ПАМЯТЬЮ
39
  # ==========================================
40
  def predict(message, history):
41
- # message - текущий вопрос пользователя
42
- # history - список прошлых сообщений [[user, bot], [user, bot]]
43
-
44
- # 1. Формируем контекст из истории (последние 2 сообщения, чтобы влезть в 128)
45
  history_str = ""
46
- for h in history[-2:]: # Берем только последние 2 пары
47
- history_str += f"User: {h[0][:40]} AI: {h[1][:40]}\n"
 
48
 
49
- # Полный промпт (максимум 70 токенов, чтобы оставить место на ответ)
50
- current_input = f"User: {message[:60]}"
51
- full_prompt = f"{history_str}{current_input}\nAI:"
52
 
53
- # Токенизируем
54
- inputs = tokenizer(full_prompt, return_tensors="pt").to(model.device)
55
  curr_len = inputs.input_ids.shape[1]
56
-
57
- # Рассчитываем свободное место до физического лимита в 128
58
  max_to_gen = 128 - curr_len - 1
59
-
60
- if max_to_gen <= 1:
61
- # Если контекст забит, обнуляем историю и пробуем снова
62
  full_prompt = f"User: {message[:60]}\nAI:"
63
- inputs = tokenizer(full_prompt, return_tensors="pt").to(model.device)
64
  curr_len = inputs.input_ids.shape[1]
65
  max_to_gen = 128 - curr_len - 1
66
 
@@ -70,72 +54,49 @@ def predict(message, history):
70
  **inputs,
71
  max_new_tokens=max_to_gen,
72
  do_sample=True,
73
- temperature=0.35, # Твоя температура!
74
- repetition_penalty=1.8, # Усиливаем защиту от повторов
75
  top_k=20,
76
  top_p=0.8,
77
  pad_token_id=tokenizer.pad_token_id
78
  )
79
 
80
- # Декодируем только ответ
81
  answer = tokenizer.decode(output_tokens[0][curr_len:], skip_special_tokens=True).strip()
82
 
83
- # 2. Срезаем лишние диалоги
84
  answer = re.split(r'User:|AI:|\n', answer)[0].strip()
85
 
86
- # 3. ЛЮТЫЙ ДЕТЕКТОР ШИЗЫ (новое)
87
- low_answer = answer.lower()
88
-
89
- # Если она опять начнет про "токены" или "обновление знаний"
90
- for waste in SHIZA_WASTE:
91
- if waste in low_answer:
92
- # Режем всё сообщение, если там началась эта ересь
93
- answer = answer.split(waste)[0].strip()
94
-
95
- # Дополнительная защита: если она пишет капсом или ставит коды
96
- if re.search(r'[A-Z_]{7,}', answer) or "(" in answer and ")" in answer:
97
- import random
98
- answer = random.choice(["Завязывай с кодами.", "Чё?", "Ясно."])
99
 
100
- # Финальная проверка на пустоту
101
- if not answer or len(answer) < 2:
102
- answer = random.choice(["Мда...", "Проехали.", "Ясно."])
 
103
 
104
- return answer
105
 
106
  except Exception as e:
107
- print(f"Error: {e}")
108
- return "У меня мозг в тумане войны потерялся."
109
 
110
  # ==========================================
111
- # 3. КРАСИВЫЙ ИНТЕРФЕЙС GRADIO
112
  # ==========================================
113
- # Тема "soft" выглядит современно и чисто
114
- with gr.Blocks(theme=gr.themes.Soft()) as demo:
115
- gr.Markdown("# 🍌 ClicklezGPT: Режим «Адекватный Хам»")
116
- gr.Markdown("Твоя нейронка с температурой **0.35** и защитой от технического бреда.")
117
-
118
- chatbot = gr.Chatbot(
119
- label="Чат с BananaGPT",
120
- avatar_images=(None, "https://api.iconify.design/emojione:banana.svg")
121
- )
122
 
123
- with gr.Row():
124
- txt = gr.Textbox(
125
- show_label=False,
126
- placeholder="Напиши что-нибудь...",
127
- scale=10
128
- )
129
- submit_btn = gr.Button("Оправить", scale=2)
130
-
131
- clear = gr.Button("Очистить историю")
132
 
133
- # Связываем элементы
134
- # predict - функция генерации, inputs - ввод пользователя, outputs - чат
135
- txt.submit(predict, [txt, chatbot], [chatbot])
136
- submit_btn.click(predict, [txt, chatbot], [chatbot])
137
-
138
- # Очистка истории
139
- clear.click(lambda: None, None, chatbot, queue=False)
140
 
141
- demo.launch(server_name="0.0.0.0", server_port=7860)
 
3
  import re
4
  import random
5
  from transformers import AutoModelForCausalLM, AutoTokenizer
 
6
 
7
  # ==========================================
8
+ # 1. ЗАГРУЗКА МОДЕЛИ (CPU MODE)
9
  # ==========================================
10
+ MODEL_PATH = "./" # Файлы лежат в корне Спейса
 
11
 
12
+ print("--- [1/2] Загрузка модели на CPU ---")
13
  tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH)
14
  model = AutoModelForCausalLM.from_pretrained(
15
  MODEL_PATH,
16
+ torch_dtype=torch.float32, # На CPU используем стандартный float32
17
+ device_map="cpu" # Принудительно на процессор
18
  )
19
 
20
+ # Твои настройки контекста
21
  model.config.max_position_embeddings = 128
22
  model.config.use_cache = False
23
  tokenizer.pad_token = tokenizer.eos_token
 
 
 
24
 
25
  # СПИСОК МУСОРА (Шиза)
26
+ SHIZA_WASTE = ["лучшая подруга", "решением знаний", "систему cn", "обновления системы", "CROME_", "RESMALA"]
 
 
 
 
27
 
28
  # ==========================================
29
+ # 2. ЛОГИКА ГЕНЕРАЦИИ (Температура 0.35)
30
  # ==========================================
31
  def predict(message, history):
32
+ # Ограничиваем историю до 1 сообщения, чтобы CPU не думал вечно
 
 
 
33
  history_str = ""
34
+ if history:
35
+ last_user, last_bot = history[-1]
36
+ history_str = f"User: {last_user[:30]} AI: {last_bot[:30]}\n"
37
 
38
+ full_prompt = f"{history_str}User: {message[:60]}\nAI:"
 
 
39
 
40
+ inputs = tokenizer(full_prompt, return_tensors="pt") # Без .to(device), так как мы на CPU
 
41
  curr_len = inputs.input_ids.shape[1]
 
 
42
  max_to_gen = 128 - curr_len - 1
43
+
44
+ # Если места нет — чистим промпт
45
+ if max_to_gen <= 5:
46
  full_prompt = f"User: {message[:60]}\nAI:"
47
+ inputs = tokenizer(full_prompt, return_tensors="pt")
48
  curr_len = inputs.input_ids.shape[1]
49
  max_to_gen = 128 - curr_len - 1
50
 
 
54
  **inputs,
55
  max_new_tokens=max_to_gen,
56
  do_sample=True,
57
+ temperature=0.35, # Твоя "золотая середина"
58
+ repetition_penalty=1.8, # Чтобы не зацикливался
59
  top_k=20,
60
  top_p=0.8,
61
  pad_token_id=tokenizer.pad_token_id
62
  )
63
 
 
64
  answer = tokenizer.decode(output_tokens[0][curr_len:], skip_special_tokens=True).strip()
65
 
66
+ # Чистим структуру
67
  answer = re.split(r'User:|AI:|\n', answer)[0].strip()
68
 
69
+ # Фильтр техно-шизы
70
+ if re.search(r'[A-Z_]{7,}', answer) or "(" in answer:
71
+ answer = random.choice(["Чё ты несешь?", "Забудь про коды.", "Ясно."])
 
 
 
 
 
 
 
 
 
 
72
 
73
+ for waste in SHIZA_WASTE:
74
+ if waste in answer.lower():
75
+ answer = "Опять шиза началась..."
76
+ break
77
 
78
+ return answer if len(answer) > 1 else "Мда..."
79
 
80
  except Exception as e:
81
+ return f"CPU Error: {str(e)}"
 
82
 
83
  # ==========================================
84
+ # 3. ИНТЕРФЕЙС (GRADIO)
85
  # ==========================================
86
+ with gr.Blocks(theme=gr.themes.Default(primary_hue="yellow")) as demo:
87
+ gr.Markdown("# 🍌 BananaGPT (CPU Space Edition)")
88
+ chatbot = gr.Chatbot(label="Диалог с Нейрохамом")
89
+ msg = gr.Textbox(placeholder="Напиши что-нибудь...")
 
 
 
 
 
90
 
91
+ def user(user_message, history):
92
+ return "", history + [[user_message, None]]
 
 
 
 
 
 
 
93
 
94
+ def bot(history):
95
+ user_message = history[-1][0]
96
+ bot_message = predict(user_message, history[:-1])
97
+ history[-1][1] = bot_message
98
+ return history
99
+
100
+ msg.submit(user, [msg, chatbot], [msg, chatbot], queue=False).then(bot, chatbot, chatbot)
101
 
102
+ demo.launch()