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

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +22 -11
app.py CHANGED
@@ -56,17 +56,25 @@ def check_if_pro(token):
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
  # === ГЕНЕРАЦИЯ ОТВЕТА ===
@@ -80,7 +88,11 @@ def generate_response(message, history, username, current_chat_id):
80
 
81
  history = history + [{"role": "user", "content": message}]
82
 
83
- prompt = ""
 
 
 
 
84
  for msg in history:
85
  if msg["role"] == "user":
86
  prompt += f"Пользователь: {msg['content']}\n"
@@ -93,28 +105,27 @@ def generate_response(message, history, username, current_chat_id):
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:
 
56
  print(f"Ошибка проверки PRO: {e}")
57
  return False
58
 
59
+ # === ОЧИСТКА ОТ ЦИКЛОВ И СПАМА ===
60
  def clean_repetitive_text(text):
61
+ # Убираем явные повторы слов подряд
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
  return " ".join(words[:i]) + "."
69
+
70
+ # Если текст содержит подозрительные спам-фразы, можно их обрезать
71
+ spam_triggers = ["mail@gmail.com", "O-pay", "переводить деньги"]
72
+ for trigger in spam_triggers:
73
+ if trigger in text:
74
+ # Обрезаем текст до этого момента
75
+ idx = text.find(trigger)
76
+ return text[:idx].strip() + "."
77
+
78
  return text
79
 
80
  # === ГЕНЕРАЦИЯ ОТВЕТА ===
 
88
 
89
  history = history + [{"role": "user", "content": message}]
90
 
91
+ # ДОБАВЛЯЕМ СИСТЕМНЫЙ ПРОМПТ В НАЧАЛО КАЖДОГО ДИАЛОГА
92
+ # Это заставляет модель помнить, кто она такая
93
+ system_prompt = "Ты — полезный русскоязычный AI-ассистент OpenAirAI. Отвечай кратко, вежливо и по делу. Не упоминай электронную почту, платежи или сторонние организации.\n\n"
94
+
95
+ prompt = system_prompt
96
  for msg in history:
97
  if msg["role"] == "user":
98
  prompt += f"Пользователь: {msg['content']}\n"
 
105
  with torch.no_grad():
106
  outputs = model.generate(
107
  **inputs,
108
+ max_new_tokens=120,
109
+ min_new_tokens=5,
110
+ temperature=0.9, # Повышаем температуру для большей вариативности
111
+ top_k=50, # Ограничиваем выборку 50 самыми вероятными токенами
112
  top_p=0.95,
113
  do_sample=True,
114
  pad_token_id=tokenizer.eos_token_id,
115
  eos_token_id=tokenizer.eos_token_id,
116
+ repetition_penalty=1.3 # Штраф за повторы
117
  )
118
 
 
119
  generated_ids = outputs[0][inputs.input_ids.shape[-1]:]
120
  response_text = tokenizer.decode(generated_ids, skip_special_tokens=True)
121
 
122
+ # Очистка
123
  stop_words = ["Пользователь:", "User:", "\n\n"]
124
  ai_response = response_text
125
  for stop_word in stop_words:
126
  if stop_word in ai_response:
127
  ai_response = ai_response.split(stop_word)[0].strip()
128
 
 
129
  ai_response = clean_repetitive_text(ai_response)
130
 
131
  if not ai_response: