dedlepexa commited on
Commit
9b5d185
·
verified ·
1 Parent(s): 050542e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +18 -11
app.py CHANGED
@@ -16,11 +16,11 @@ tokenizer = AutoTokenizer.from_pretrained(model_name)
16
  model = AutoModelForCausalLM.from_pretrained(model_name)
17
  model.eval()
18
 
19
- # 🔹 "База данных" (макс 40 сообщений)
20
  MAX_HISTORY = 40
21
- db = OrderedDict() # message -> {"status": "pending/done", "reply": str}
22
 
23
- # 🔹 Очередь
24
  queue = []
25
 
26
  class Message(BaseModel):
@@ -28,7 +28,6 @@ class Message(BaseModel):
28
 
29
 
30
  def generate_ai(message: str):
31
- # 🔥 Улучшенный prompt
32
  prompt = f"User: {message}\nAssistant: Answer clearly and fully:\n"
33
 
34
  inputs = tokenizer(prompt, return_tensors="pt")
@@ -37,14 +36,13 @@ def generate_ai(message: str):
37
  outputs = model.generate(
38
  **inputs,
39
  max_new_tokens=60,
40
- min_new_tokens=20, # 🔥 чтобы не обрывал
41
  do_sample=True,
42
  temperature=0.7,
43
  top_p=0.9,
44
  eos_token_id=tokenizer.eos_token_id
45
  )
46
 
47
- # 🔥 ВАЖНО: декодим только НОВЫЕ токены
48
  input_length = inputs.input_ids.shape[1]
49
  generated_tokens = outputs[0][input_length:]
50
 
@@ -53,23 +51,29 @@ def generate_ai(message: str):
53
  return reply
54
 
55
 
56
- # 🔥 Фоновый обработчик
57
  def worker():
58
  while True:
59
  if queue:
60
  message = queue.pop(0)
61
 
 
 
 
 
62
  reply = generate_ai(message)
63
 
64
  if message in db:
65
  db[message]["status"] = "done"
66
  db[message]["reply"] = reply
67
 
68
- time.sleep(0.05) # чуть быстрее
 
69
 
70
 
71
- # запускаем поток
72
- threading.Thread(target=worker, daemon=True).start()
 
73
 
74
 
75
  @app.get("/")
@@ -81,11 +85,14 @@ async def root():
81
  @app.get("/ask")
82
  async def ask(message: str):
83
 
 
 
 
 
84
  if message not in db:
85
  db[message] = {"status": "pending", "reply": ""}
86
  queue.append(message)
87
 
88
- # ограничение до 40
89
  if len(db) > MAX_HISTORY:
90
  db.popitem(last=False)
91
 
 
16
  model = AutoModelForCausalLM.from_pretrained(model_name)
17
  model.eval()
18
 
19
+ # 🔹 настройки
20
  MAX_HISTORY = 40
21
+ NUM_WORKERS = 3 # 🔥 ВАЖНО: количество потоков
22
 
23
+ db = OrderedDict()
24
  queue = []
25
 
26
  class Message(BaseModel):
 
28
 
29
 
30
  def generate_ai(message: str):
 
31
  prompt = f"User: {message}\nAssistant: Answer clearly and fully:\n"
32
 
33
  inputs = tokenizer(prompt, return_tensors="pt")
 
36
  outputs = model.generate(
37
  **inputs,
38
  max_new_tokens=60,
39
+ min_new_tokens=20,
40
  do_sample=True,
41
  temperature=0.7,
42
  top_p=0.9,
43
  eos_token_id=tokenizer.eos_token_id
44
  )
45
 
 
46
  input_length = inputs.input_ids.shape[1]
47
  generated_tokens = outputs[0][input_length:]
48
 
 
51
  return reply
52
 
53
 
54
+ # 🔥 Поток-воркер
55
  def worker():
56
  while True:
57
  if queue:
58
  message = queue.pop(0)
59
 
60
+ # ⚡ если уже есть ответ — пропускаем
61
+ if message in db and db[message]["status"] == "done":
62
+ continue
63
+
64
  reply = generate_ai(message)
65
 
66
  if message in db:
67
  db[message]["status"] = "done"
68
  db[message]["reply"] = reply
69
 
70
+ else:
71
+ time.sleep(0.01) # 🔥 меньше лаг
72
 
73
 
74
+ # 🔥 запускаем несколько воркеров
75
+ for _ in range(NUM_WORKERS):
76
+ threading.Thread(target=worker, daemon=True).start()
77
 
78
 
79
  @app.get("/")
 
85
  @app.get("/ask")
86
  async def ask(message: str):
87
 
88
+ # ⚡ МГНОВЕННЫЙ КЭШ
89
+ if message in db and db[message]["status"] == "done":
90
+ return PlainTextResponse("cached")
91
+
92
  if message not in db:
93
  db[message] = {"status": "pending", "reply": ""}
94
  queue.append(message)
95
 
 
96
  if len(db) > MAX_HISTORY:
97
  db.popitem(last=False)
98