Spaces:
Running
Running
X commited on
Update app.py
Browse files
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 |
-
#
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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=
|
| 97 |
-
min_new_tokens=
|
| 98 |
-
temperature=0.
|
|
|
|
| 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.
|
| 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 |
-
#
|
| 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:
|