allekssandr commited on
Commit
ccac5b1
·
verified ·
1 Parent(s): 00830f6

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +10 -157
app.py CHANGED
@@ -1,163 +1,16 @@
1
- import logging
2
- import os
3
- from platform import system
4
 
5
- from dotenv import load_dotenv
6
- from huggingface_hub import HfApi, HfFolder
7
- from humanfriendly.terminal import output
8
- from telegram import Update
9
- from telegram.ext import ApplicationBuilder, CommandHandler, MessageHandler, filters, CallbackContext
10
- from transformers import AutoModelForCausalLM, AutoTokenizer
11
- import torch
12
-
13
- load_dotenv()
14
- TOKEN = os.getenv("TELEGRAM_TOKEN")
15
- HF_TOKEN = os.getenv("HF_TOKEN")
16
- MAX_LENGTH_REQUEST = 1024
17
- MAX_NEW_TOKENS = 128
18
- MAX_LENGTH_RESPONSE = 100
19
- TEST_ENV=os.getenv("TEST_ENV")
20
-
21
- # Настройка логирования
22
- logging.basicConfig(
23
- format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
24
- level=logging.INFO
25
  )
26
- logger = logging.getLogger(__name__)
27
-
28
- logger.info(f"TEST_ENV= {TEST_ENV}")
29
-
30
- # Логин через токен
31
- try:
32
- api = HfApi()
33
- HfFolder.save_token(HF_TOKEN)
34
- except Exception as e:
35
- logger.error(f"Ошибка авторизации токена: {str(e)}")
36
- raise
37
-
38
- rugpt3large_based_on_gpt2_model_name = "ai-forever/rugpt3large_based_on_gpt2"
39
- rugpt3small_based_on_gpt2_model_name = "ai-forever/rugpt3small_based_on_gpt2"
40
- sber_rugpt3small_based_on_gpt2_model_name = "sberbank-ai/rugpt3small_based_on_gpt2"
41
- phi_mini_instruct_GGUF_model_name = "bartowski/Phi-3.5-mini-instruct-GGUF"
42
- # Инициализация модели
43
- try:
44
- model_name = phi_mini_instruct_GGUF_model_name # Меньшая модель
45
- tokenizer = AutoTokenizer.from_pretrained(model_name, padding_side="left")
46
- model = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto")
47
- logger.info("Модель успешно загружена")
48
- except Exception as e:
49
- logger.error(f"Ошибка загрузки модели: {str(e)}")
50
- raise
51
-
52
- # Настройка устройства
53
- device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
54
- model.to(device)
55
- logger.info(f"Используемое устройство: {device}")
56
-
57
- # Контекст диалога (упрощенная версия)
58
- chat_contexts = {}
59
-
60
-
61
- def get_chat_context(chat_id):
62
- if chat_id not in chat_contexts:
63
- chat_contexts[chat_id] = {"history": []}
64
- return chat_contexts[chat_id]
65
-
66
-
67
- MAX_HISTORY_LENGTH = 10
68
-
69
-
70
- def add_to_chat_history(chat_id, user_input, bot_response):
71
- context = get_chat_context(chat_id)
72
- context["history"].append({"user": user_input, "bot": bot_response})
73
- if len(context["history"]) > MAX_HISTORY_LENGTH:
74
- context["history"] = context["history"][-MAX_HISTORY_LENGTH:]
75
-
76
-
77
- async def start(update: Update, context: CallbackContext) -> None:
78
- """Обработчик команды /start"""
79
- await update.message.reply_text('🚀 Привет! Я РУССКИЙ! :) бот.')
80
-
81
-
82
- async def handle_message(update: Update, context: CallbackContext) -> None:
83
- """Обработка текстовых сообщений"""
84
- try:
85
- user_input = update.message.text
86
- chat_id = update.message.chat_id
87
- user_name = update.message.from_user.username
88
- logger.info(f"Получено сообщение: {user_input}")
89
-
90
- # Получаем контекст чата
91
- context = get_chat_context(chat_id)
92
-
93
- # Формируем входной текст с учетом истории
94
- input_text = ""
95
- for msg in context["history"]:
96
- input_text += f"Пользователь: {msg['user']}\nБот: {msg['bot']}"
97
-
98
- tokenizer.pad_token = tokenizer.eos_token
99
- # Генерация промта
100
- system_prompt = "Ответ должен быть точным и кратким."
101
- # system_prompt = ""
102
- # prompt = f"{system_prompt} Вопрос: {user_input}; Ответ: "
103
- prompt = f"{system_prompt}\n {user_input}\n"
104
- logger.info(f"Промт: {prompt}")
105
-
106
- # Генерация ответа
107
- inputs = tokenizer(
108
- prompt,
109
- return_tensors="pt", # Возвращает PyTorch тензоры
110
- # truncation=True, # Обрезает текст, если он превышает max_length
111
- # add_special_tokens=True, # Добавляет специальные токены (например, [CLS], [SEP])
112
- ).to(device)
113
-
114
- outputs = model.generate(
115
- inputs.input_ids,
116
- max_new_tokens=60,
117
- no_repeat_ngram_size=3,
118
- repetition_penalty=1.5,
119
- do_sample=True,
120
- top_k=100,
121
- top_p=0.3,
122
- temperature=0.4,
123
- stop_strings=['<s>'],
124
- tokenizer=tokenizer,
125
- )
126
-
127
- # Декодирование ответа
128
- # response = list(map(tokenizer.decode, outputs))[0]
129
- response = tokenizer.batch_decode(outputs[:, inputs.input_ids.shape[1]:], skip_special_tokens=True)[0]
130
- logger.info(f"Ответ: {response}")
131
-
132
- if not response:
133
- response = "🤔 Пока не знаю, что ответить. Можете переформулировать вопрос?"
134
-
135
- # Отправка ответа
136
- await update.message.reply_text(response, parse_mode=None)
137
- add_to_chat_history(chat_id, user_input, response)
138
-
139
- except Exception as e:
140
- logger.error(f"Ошибка обработки сообщения: {str(e)}")
141
- await update.message.reply_text("❌ Произошла ошибка при обработке запроса")
142
-
143
-
144
- def app() -> None:
145
- try:
146
- application = ApplicationBuilder().token(TOKEN).build()
147
- application.add_handler(CommandHandler("start", start))
148
- application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))
149
- application.add_error_handler(error)
150
-
151
- logger.info("Бот запущен")
152
- application.run_polling()
153
-
154
- except Exception as e:
155
- logger.error(f"Ошибка запуска бота: {str(e)}")
156
-
157
-
158
- async def error(update: Update, context: CallbackContext) -> None:
159
- logger.error(f'Ошибка: {context.error}')
160
 
 
 
 
 
 
 
161
 
162
  if __name__ == '__app__':
163
  app()
 
1
+ from llama_cpp import Llama
 
 
2
 
3
+ llm = Llama.from_pretrained(
4
+ repo_id="microsoft/Phi-3-mini-4k-instruct-gguf",
5
+ filename="Phi-3-mini-4k-instruct-fp16.gguf",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
 
8
+ output = llm(
9
+ "Once upon a time,",
10
+ max_tokens=512,
11
+ echo=True
12
+ )
13
+ print(output)
14
 
15
  if __name__ == '__app__':
16
  app()