X commited on
Commit
a2219fa
·
verified ·
1 Parent(s): e6b6811

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +28 -16
app.py CHANGED
@@ -5,13 +5,13 @@ import json
5
  from pathlib import Path
6
  from datetime import datetime
7
  import requests
 
8
 
9
  # === ЗАГРУЗКА МОДЕЛИ ===
10
  print("🚀 Загрузка модели...")
11
  model_id = "OpenRussianAI/OpenAirAI-X"
12
  tokenizer = AutoTokenizer.from_pretrained(model_id)
13
 
14
- # Важно: устанавливаем pad_token, если его нет, чтобы избежать ошибок при генерации
15
  if tokenizer.pad_token is None:
16
  tokenizer.pad_token = tokenizer.eos_token
17
 
@@ -56,7 +56,20 @@ def check_if_pro(token):
56
  print(f"Ошибка проверки PRO: {e}")
57
  return False
58
 
59
- # === ГЕНЕРАЦИЯ ОТВЕТА (ИСПРАВЛЕННАЯ) ===
 
 
 
 
 
 
 
 
 
 
 
 
 
60
  def generate_response(message, history, username, current_chat_id):
61
  if not username:
62
  gr.Warning("Сначала введите имя пользователя!")
@@ -65,10 +78,8 @@ def generate_response(message, history, username, current_chat_id):
65
  if not message.strip():
66
  return history, gr.update(), current_chat_id, gr.update()
67
 
68
- # Добавляем сообщение пользователя в историю
69
  history = history + [{"role": "user", "content": message}]
70
 
71
- # Формируем промпт
72
  prompt = ""
73
  for msg in history:
74
  if msg["role"] == "user":
@@ -82,34 +93,35 @@ def generate_response(message, history, username, current_chat_id):
82
  with torch.no_grad():
83
  outputs = model.generate(
84
  **inputs,
85
- max_new_tokens=128, # Ограничиваем длину, чтобы модель не "уходила в бред"
86
- temperature=0.7,
87
- top_p=0.9,
 
88
  do_sample=True,
89
  pad_token_id=tokenizer.eos_token_id,
90
- eos_token_id=tokenizer.eos_token_id, # Токен конца строки
91
- repetition_penalty=1.2 # Штраф за повторения (убирает цикл "Я OpenAI")
92
  )
93
 
94
- # Декодируем ТОЛЬКО новую часть текста (ответ модели)
95
  generated_ids = outputs[0][inputs.input_ids.shape[-1]:]
96
  response_text = tokenizer.decode(generated_ids, skip_special_tokens=True)
97
 
98
- # Очистка ответа
99
- ai_response = response_text.strip()
100
-
101
- # Если модель начала писать следующий вопрос или метку, обрезаем
102
  stop_words = ["Пользователь:", "User:", "\n\n"]
 
103
  for stop_word in stop_words:
104
  if stop_word in ai_response:
105
  ai_response = ai_response.split(stop_word)[0].strip()
106
 
 
 
 
107
  if not ai_response:
108
- ai_response = "..."
109
 
110
  history = history + [{"role": "assistant", "content": ai_response}]
111
 
112
- # Сохранение истории
113
  if username and current_chat_id:
114
  history_data = load_history(username)
115
  if current_chat_id not in history_data:
 
5
  from pathlib import Path
6
  from datetime import datetime
7
  import requests
8
+ import re
9
 
10
  # === ЗАГРУЗКА МОДЕЛИ ===
11
  print("🚀 Загрузка модели...")
12
  model_id = "OpenRussianAI/OpenAirAI-X"
13
  tokenizer = AutoTokenizer.from_pretrained(model_id)
14
 
 
15
  if tokenizer.pad_token is None:
16
  tokenizer.pad_token = tokenizer.eos_token
17
 
 
56
  print(f"Ошибка проверки PRO: {e}")
57
  return False
58
 
59
+ # === ОЧИСТКА ОТ ЦИКЛОВ (НОВАЯ ФУНКЦИЯ) ===
60
+ def clean_repetitive_text(text):
61
+ # Если какое-то слово повторяется более 3 раз подряд, обрезаем текст перед этим
62
+ words = text.split()
63
+ if len(words) < 4:
64
+ return text
65
+
66
+ for i in range(len(words) - 3):
67
+ if words[i] == words[i+1] == words[i+2] == words[i+3]:
68
+ # Нашли повторение, возвращаем текст до этого места
69
+ return " ".join(words[:i]) + "."
70
+ return text
71
+
72
+ # === ГЕНЕРАЦИЯ ОТВЕТА ===
73
  def generate_response(message, history, username, current_chat_id):
74
  if not username:
75
  gr.Warning("Сначала введите имя пользователя!")
 
78
  if not message.strip():
79
  return history, gr.update(), current_chat_id, gr.update()
80
 
 
81
  history = history + [{"role": "user", "content": message}]
82
 
 
83
  prompt = ""
84
  for msg in history:
85
  if msg["role"] == "user":
 
93
  with torch.no_grad():
94
  outputs = model.generate(
95
  **inputs,
96
+ max_new_tokens=100, # Меньше токенов = меньше шансов уйти в бред
97
+ min_new_tokens=10, # Заставляем модель написать хоть что-то
98
+ temperature=0.8, # Немного повышаем креативность
99
+ top_p=0.95,
100
  do_sample=True,
101
  pad_token_id=tokenizer.eos_token_id,
102
+ eos_token_id=tokenizer.eos_token_id,
103
+ repetition_penalty=1.5 # СИЛЬНЫЙ штраф за повторения
104
  )
105
 
106
+ # Декодируем только новую часть
107
  generated_ids = outputs[0][inputs.input_ids.shape[-1]:]
108
  response_text = tokenizer.decode(generated_ids, skip_special_tokens=True)
109
 
110
+ # 1. Обрезаем по стоп-словам
 
 
 
111
  stop_words = ["Пользователь:", "User:", "\n\n"]
112
+ ai_response = response_text
113
  for stop_word in stop_words:
114
  if stop_word in ai_response:
115
  ai_response = ai_response.split(stop_word)[0].strip()
116
 
117
+ # 2. Убираем циклические повторения (например, "Я OpenAI Я OpenAI")
118
+ ai_response = clean_repetitive_text(ai_response)
119
+
120
  if not ai_response:
121
+ ai_response = "Извините, я не смог сформулировать ответ."
122
 
123
  history = history + [{"role": "assistant", "content": ai_response}]
124
 
 
125
  if username and current_chat_id:
126
  history_data = load_history(username)
127
  if current_chat_id not in history_data: