Spaces:
Running
Running
X commited on
Update app.py
Browse files
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=
|
| 86 |
-
|
| 87 |
-
|
|
|
|
| 88 |
do_sample=True,
|
| 89 |
pad_token_id=tokenizer.eos_token_id,
|
| 90 |
-
eos_token_id=tokenizer.eos_token_id,
|
| 91 |
-
repetition_penalty=1.
|
| 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:
|