SimrusDenuvo commited on
Commit
8fab447
·
verified ·
1 Parent(s): 961a138

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +115 -61
app.py CHANGED
@@ -1,70 +1,124 @@
 
 
1
  import gradio as gr
2
- import torch
3
- import time
4
- from transformers import AutoTokenizer, AutoModelForCausalLM
5
-
6
- # 1) Публичные русскоязычные модели
7
- MODEL_CONFIGS = {
8
- "GigaChat-like": "ai-forever/rugpt3large_based_on_gpt2",
9
- "ChatGPT-like": "ai-forever/rugpt3medium_based_on_gpt2",
10
- "DeepSeek-like": "ai-forever/rugpt3small_based_on_gpt2"
11
- }
12
-
13
- # 2) Устройство
14
- device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
15
-
16
- # 3) Загружаем модели один раз при старте
17
- models = {}
18
- for name, repo_id in MODEL_CONFIGS.items():
19
- tok = AutoTokenizer.from_pretrained(repo_id)
20
- mdl = AutoModelForCausalLM.from_pretrained(repo_id)
21
- mdl.to(device).eval()
22
- models[name] = (tok, mdl)
23
-
24
- # 4) CoT-промпты
25
- def cot1(q): return f"Клиент: «{q}»\nШаг за шагом объясни, как ответил бы банк."
26
- def cot2(q): return f"Клиент: «{q}»\nРазбери запрос и дай развернутый ответ."
27
-
28
- # 5) Генерация ответов + замер времени
29
- def generate_all(q):
30
- out = {}
31
- for name, (tok, mdl) in models.items():
32
- out[name] = {}
33
- for idx, prm in enumerate((cot1, cot2), start=1):
34
- prompt = prm(q)
35
- inputs = tok(prompt, return_tensors="pt", truncation=True, max_length=512).to(device)
36
- t0 = time.time()
37
- with torch.no_grad():
38
- ids = mdl.generate(**inputs, max_new_tokens=150, do_sample=True, temperature=0.7, top_p=0.9)
39
- dt = round(time.time() - t0, 2)
40
- resp = tok.decode(ids[0], skip_special_tokens=True)
41
- if resp.startswith(prompt):
42
- resp = resp[len(prompt):].strip()
43
- out[name][f"CoT-промпт {idx}"] = f"{resp}\n⏱ {dt} сек."
44
- return out
45
-
46
- # 6) Обёртка для Gradio
47
- def run_all(q):
48
- res = generate_all(q)
49
- # вернём 3 больших текста: сначала GigaChat-like, потом ChatGPT-like, потом DeepSeek-like
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50
  return (
51
- "\n\n".join(f"### {k}\n\n" + "\n\n".join(v.values()) for k, v in [("GigaChat-like", res["GigaChat-like"])]),
52
- "\n\n".join(f"### {k}\n\n" + "\n\n".join(v.values()) for k, v in [("ChatGPT-like", res["ChatGPT-like"])]),
53
- "\n\n".join(f"### {k}\n\n" + "\n\n".join(v.values()) for k, v in [("DeepSeek-like", res["DeepSeek-like"])]),
 
 
 
54
  )
55
 
56
- # 7) Blocks-интерфейс с явным полем вывода
57
- with gr.Blocks() as demo:
58
- gr.Markdown("# Alpha Bank Assistant — сравнение CoT-моделей")
59
- inp = gr.Textbox(label="Вопрос клиента", placeholder="Например: Как восстановить доступ в мобильный банк?", lines=3)
60
- btn = gr.Button("Сгенерировать ответы")
61
- # вот поле вывода: три текстовых Textbox’а под кнопкой
62
- out1 = gr.Textbox(label="GigaChat-like", lines=8)
63
- out2 = gr.Textbox(label="ChatGPT-like", lines=8)
64
- out3 = gr.Textbox(label="DeepSeek-like", lines=8)
65
- btn.click(fn=run_all, inputs=inp, outputs=[out1, out2, out3])
66
 
67
  if __name__ == "__main__":
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68
  demo.launch()
69
 
70
 
 
 
1
+ import os
2
+ import requests
3
  import gradio as gr
4
+
5
+ # Общая функция для вызова разных моделей
6
+
7
+ def call_model(api_url, api_key, model_name, text, history, service):
8
+ # Инициализируем историю одним system-сообщением при первом обращении
9
+ if not history:
10
+ history = [{
11
+ "role": "system",
12
+ "content": "Вы — ассистент банка, отвечаете на вопросы клиентов про проблемы со снятием денег с карты."
13
+ }]
14
+ # Добавляем запрос пользователя
15
+ history.append({"role": "user", "content": text})
16
+
17
+ # Подбираем URL и заголовки в зависимости от сервиса
18
+ if service == "openai":
19
+ url = api_url
20
+ headers = {
21
+ "Authorization": f"Bearer {api_key}",
22
+ "Content-Type": "application/json"
23
+ }
24
+ elif service == "deepseek":
25
+ url = api_url
26
+ headers = {
27
+ "Authorization": f"Bearer {api_key}",
28
+ "Content-Type": "application/json"
29
+ }
30
+ elif service == "gigachat":
31
+ url = "https://gigachat.devices.sberbank.ru/api/v1/chat/completions"
32
+ headers = {
33
+ "Authorization": f"Bearer {api_key}",
34
+ "X-API-Scope": os.getenv("GIGACHAT_SCOPE", ""),
35
+ "Content-Type": "application/json"
36
+ }
37
+ else:
38
+ raise ValueError(f"Unknown service: {service}")
39
+
40
+ payload = {
41
+ "model": model_name,
42
+ "messages": history
43
+ }
44
+
45
+ response = requests.post(url, headers=headers, json=payload)
46
+ response.raise_for_status()
47
+ data = response.json()
48
+ content = data["choices"][0]["message"]["content"]
49
+
50
+ # Сохраняем ответ в историю
51
+ history.append({"role": "assistant", "content": content})
52
+ return content, history
53
+
54
+
55
+ # Основная функция обработки ввода и вывода во всех трёх чатах
56
+
57
+ def process_all(text, h1, h2, h3):
58
+ # ChatGPT (OpenAI)
59
+ out1, h1 = call_model(
60
+ api_url="https://api.openai.com/v1/chat/completions",
61
+ api_key=os.getenv("OPENAI_API_KEY"),
62
+ model_name="gpt-3.5-turbo",
63
+ text=text,
64
+ history=h1,
65
+ service="openai"
66
+ )
67
+ # DeepSeek (через собственный API)
68
+ out2, h2 = call_model(
69
+ api_url="https://api.deepseek.com/chat/completions",
70
+ api_key=os.getenv("DEEPSEEK_KEY"),
71
+ model_name="deepseek-chat-v3",
72
+ text=text,
73
+ history=h2,
74
+ service="deepseek"
75
+ )
76
+ # GigaChat (Сбер)
77
+ out3, h3 = call_model(
78
+ api_url=None, # будет переопределён внутри
79
+ api_key=os.getenv("GIGACHAT_TOKEN"),
80
+ model_name="giga-chat-lite",
81
+ text=text,
82
+ history=h3,
83
+ service="gigachat"
84
+ )
85
+
86
+ # Возвращаем обновлённые состояния и содержимое чатботов
87
+ # Chatbot ждёт список кортежей (запрос, ответ)
88
  return (
89
+ h1,
90
+ h2,
91
+ h3,
92
+ [(None, out1)],
93
+ [(None, out2)],
94
+ [(None, out3)]
95
  )
96
 
 
 
 
 
 
 
 
 
 
 
97
 
98
  if __name__ == "__main__":
99
+ # Создаём интерфейс Gradio
100
+ with gr.Blocks() as demo:
101
+ gr.Markdown("## Мульти-чат: ChatGPT, DeepSeek и GigaChat в одном окне")
102
+ txt = gr.Textbox(label="Ваш запрос", placeholder="Напишите ваш вопрос...", lines=2)
103
+
104
+ # Состояния для истории каждого бота
105
+ s1 = gr.State([])
106
+ s2 = gr.State([])
107
+ s3 = gr.State([])
108
+
109
+ # Сам чат-интерфейс
110
+ c1 = gr.Chatbot(label="ChatGPT")
111
+ c2 = gr.Chatbot(label="DeepSeek")
112
+ c3 = gr.Chatbot(label="GigaChat")
113
+
114
+ btn = gr.Button("Отправить")
115
+ btn.click(
116
+ fn=process_all,
117
+ inputs=[txt, s1, s2, s3],
118
+ outputs=[s1, s2, s3, c1, c2, c3]
119
+ )
120
+
121
  demo.launch()
122
 
123
 
124
+