fruitpicker01 commited on
Commit
c348b7e
·
verified ·
1 Parent(s): f1b96f9

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +109 -330
app.py CHANGED
@@ -9,31 +9,63 @@ from langchain_community.chat_models.gigachat import GigaChat
9
  from openpyxl import load_workbook
10
  import base64
11
 
12
- # Установка ключа API для OpenAI и GigaChat
13
  openai_api_key = os.getenv('GPT_KEY')
14
  gc_key = os.getenv('GC_KEY')
15
  token = os.getenv('GITHUB_TOKEN')
16
 
17
- # Авторизация в сервисе GigaChat
18
- chat_pro = GigaChat(credentials=gc_key, model='GigaChat-Pro', max_tokens=68, verify_ssl_certs=False)
19
- chat_lite = GigaChat(credentials=gc_key, model='GigaChat', max_tokens=68, verify_ssl_certs=False)
20
- chat_plus = GigaChat(credentials=gc_key, model='GigaChat-Plus', max_tokens=68, verify_ssl_certs=False)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
 
22
  # Загрузка данных из Excel-файла
23
- try:
24
- data = pd.read_excel('Признаки.xlsx', sheet_name=None)
25
- except Exception as e:
26
- print(f"Ошибка при загрузке Excel-файла: {e}")
27
- data = {}
28
-
29
- # Создание списка признаков и их значений
30
- features = {}
31
- for sheet_name, df in data.items():
32
- try:
33
- features[sheet_name] = df.set_index(df.columns[0]).to_dict()[df.columns[1]]
34
- except Exception as e:
35
- print(f"Ошибка при обработке данных листа {sheet_name}: {e}")
36
- features[sheet_name] = {}
37
 
38
  # Функция для генерации стандартного промпта
39
  def generate_standard_prompt(description, advantages, *selected_values):
@@ -75,279 +107,65 @@ def generate_standard_prompt(description, advantages, *selected_values):
75
  )
76
  return prompt
77
 
78
- # Функции для генерации сообщений
79
- def generate_message_gpt4o(prompt):
80
- try:
81
- headers = {
82
- "Content-Type": "application/json",
83
- "Authorization": f"Bearer {openai_api_key}"
84
- }
85
- data = {
86
- "model": "chatgpt-4o-latest",
87
- "messages": [{"role": "system", "content": prompt}],
88
- "max_tokens": 101
89
- }
90
- response = requests.post("https://api.openai.com/v1/chat/completions", json=data, headers=headers)
91
- response_data = response.json()
92
- return response_data["choices"][0]["message"]["content"].strip()
93
- except Exception as e:
94
- return f"Ошибка при обращении к ChatGPT-4o-Latest: {e}"
95
-
96
- def clean_message(message):
97
- # Если сообщение не заканчивается на точку или восклицательный знак, обрезаем его до последней точки
98
- if not message.endswith(('.', '!', '?')):
99
- last_period = message.rfind('.')
100
- if last_period != -1:
101
- message = message[:last_period + 1]
102
- return message
103
-
104
- # Обновленные функции генерации сообщений с учетом обрезки незаконченных предложений
105
- def generate_message_gigachat_pro(prompt):
106
- try:
107
- messages = [SystemMessage(content=prompt)]
108
- res = chat_pro(messages)
109
- cleaned_message = clean_message(res.content.strip())
110
- return cleaned_message
111
- except Exception as e:
112
- return f"Ошибка при обращении к GigaChat-Pro: {e}"
113
-
114
- def generate_message_gigachat_lite(prompt):
115
- try:
116
- time.sleep(2)
117
- messages = [SystemMessage(content=prompt)]
118
- res = chat_lite(messages)
119
- cleaned_message = clean_message(res.content.strip())
120
- return cleaned_message
121
- except Exception as e:
122
- return f"Ошибка при обращении к GigaChat-Lite: {e}"
123
-
124
- def generate_message_gigachat_plus(prompt):
125
- try:
126
- time.sleep(2)
127
- messages = [SystemMessage(content=prompt)]
128
- res = chat_plus(messages)
129
- cleaned_message = clean_message(res.content.strip())
130
- return cleaned_message
131
- except Exception as e:
132
- return f"Ошибка при обращении к GigaChat-Plus: {e}"
133
-
134
- def generate_message_gpt4o_with_retry(prompt):
135
- for _ in range(10): # Максимум 10 попыток
136
- message = generate_message_gpt4o(prompt)
137
- if len(message) <= 250:
138
- return message
139
- return message # Возвращаем последнее сгенерированное сообщение, если все попытки не удались
140
-
141
- def generate_message_gigachat_pro_with_retry(prompt):
142
- for _ in range(10):
143
- message = generate_message_gigachat_pro(prompt)
144
- if len(message) <= 250:
145
- return message
146
- return message
147
-
148
- def generate_message_gigachat_lite_with_retry(prompt):
149
  for _ in range(10):
150
- message = generate_message_gigachat_lite(prompt)
151
  if len(message) <= 250:
152
  return message
153
- return message
154
-
155
- def generate_message_gigachat_plus_with_retry(prompt):
156
- for _ in range(10):
157
- message = generate_message_gigachat_plus(prompt)
158
- if len(message) <= 250:
159
- return message
160
- return message
161
-
162
 
163
- # Обновляем генерацию сообщений для отображения в интерфейсе
164
- def generate_messages(description, advantages, *selected_values):
 
165
  standard_prompt = generate_standard_prompt(description, advantages, *selected_values)
166
 
167
  results = {
168
  "prompt": standard_prompt,
169
- "gpt4o": None,
170
- "gigachat_pro": None,
171
- "gigachat_lite": None,
172
- "gigachat_plus": None
173
  }
174
 
175
- yield results["prompt"], "", "", "", "", "Генерация стандартного промпта завершена"
176
-
177
- results["gpt4o"] = generate_message_gpt4o_with_retry(standard_prompt)
178
- gpt4o_length = len(results["gpt4o"])
179
- gpt4o_display = f"{results['gpt4o']}\n\n------\nКоличество знаков: {gpt4o_length}"
180
- yield results["prompt"], gpt4o_display, "", "", "", "Сообщение GPT-4o сгенерировано"
181
-
182
- results["gigachat_pro"] = generate_message_gigachat_pro_with_retry(standard_prompt)
183
- gigachat_pro_length = len(results["gigachat_pro"])
184
- gigachat_pro_display = f"{results['gigachat_pro']}\n\n------\nКоличество знаков: {gigachat_pro_length}"
185
- yield results["prompt"], gpt4o_display, gigachat_pro_display, "", "", "Сообщение GigaChat-Pro сгенерировано"
186
-
187
- time.sleep(2)
188
-
189
- results["gigachat_lite"] = generate_message_gigachat_lite_with_retry(standard_prompt)
190
- gigachat_lite_length = len(results["gigachat_lite"])
191
- gigachat_lite_display = f"{results['gigachat_lite']}\n\n------\nКоличество знаков: {gigachat_lite_length}"
192
- yield results["prompt"], gpt4o_display, gigachat_pro_display, gigachat_lite_display, "", "Сообщение GigaChat-Lite сгенерировано"
193
-
194
- time.sleep(2)
195
-
196
- results["gigachat_plus"] = generate_message_gigachat_plus_with_retry(standard_prompt)
197
- gigachat_plus_length = len(results["gigachat_plus"])
198
- gigachat_plus_display = f"{results['gigachat_plus']}\n\n------\nКоличество знаков: {gigachat_plus_length}"
199
- yield results["prompt"], gpt4o_display, gigachat_pro_display, gigachat_lite_display, gigachat_plus_display, "Все сообщения сгенерированы"
200
-
201
- return results
202
-
203
-
204
 
205
  # Функция для генерации персонализированного промпта
206
  def generate_personalization_prompt(*selected_values):
207
  prompt = "Адаптируй, не превышая длину сообщения в 250 знаков с пробелами, текст с учетом следующих особенностей:\n"
208
  for i, feature in enumerate(features.keys()):
209
  if selected_values[i]:
210
- try:
211
- prompt += f"{features[feature][selected_values[i]]}\n"
212
- except KeyError:
213
- return f"Ошибка: выбранное значение {selected_values[i]} не найдено в данных."
214
-
215
  prompt += "Убедись, что в готовом тексте до 250 знаков с пробелами."
216
-
217
  return prompt.strip()
218
 
219
  # Функция для выполнения персонализации на основе сгенерированного промпта и сообщения
220
- def perform_personalization(standard_message, personalization_prompt):
221
- full_prompt = f"{personalization_prompt}\n\nТекст для адаптации:\n{standard_message}"
222
- return generate_message_gpt4o(full_prompt)
223
-
224
- # Также обновляем функции персонализации
225
- def perform_personalization_gigachat(standard_message, personalization_prompt, model):
226
  full_prompt = f"{personalization_prompt}\n\nТекст для адаптации:\n{standard_message}"
227
- if model == "gigachat_pro":
228
- result = generate_message_gigachat_pro(full_prompt)
229
- elif model == "gigachat_lite":
230
- result = generate_message_gigachat_lite(full_prompt)
231
- elif model == "gigachat_plus":
232
- result = generate_message_gigachat_plus(full_prompt)
233
- return clean_message(result)
234
-
235
- def perform_personalization_with_retry(standard_message, personalization_prompt):
236
- for _ in range(10): # Максимум 10 попыток
237
- message = perform_personalization(standard_message, personalization_prompt)
238
- if len(message) <= 250:
239
- return message
240
- return message # Возвращаем последнее сгенерированное сообщение, если все попытки не удались
241
 
242
- def perform_personalization_gigachat_with_retry(standard_message, personalization_prompt, model):
 
243
  for _ in range(10):
244
- message = perform_personalization_gigachat(standard_message, personalization_prompt, model)
245
  if len(message) <= 250:
246
  return message
247
  return message
248
 
249
-
250
- # Обновляем блок персонализации
251
- def personalize_messages_with_yield(gpt4o_message, gigachat_pro_message, gigachat_lite_message, gigachat_plus_message, *selected_values):
252
  personalization_prompt = generate_personalization_prompt(*selected_values)
253
- yield personalization_prompt, "", "", "", "", "Промпт для персонализации сгенерирован"
254
-
255
- personalized_message_gpt4o = perform_personalization_with_retry(gpt4o_message, personalization_prompt)
256
- gpt4o_length = len(personalized_message_gpt4o)
257
- gpt4o_display = f"{personalized_message_gpt4o}\n\n------\nКоличество знаков: {gpt4o_length}"
258
- yield personalization_prompt, gpt4o_display, "", "", "", "Персонализированное сообщение GPT-4o сгенерировано"
259
-
260
- personalized_message_gigachat_pro = perform_personalization_gigachat_with_retry(gigachat_pro_message, personalization_prompt, "gigachat_pro")
261
- gigachat_pro_length = len(personalized_message_gigachat_pro)
262
- gigachat_pro_display = f"{personalized_message_gigachat_pro}\n\n------\n��оличество знаков: {gigachat_pro_length}"
263
- yield personalization_prompt, gpt4o_display, gigachat_pro_display, "", "", "Персонализированное сообщение GigaChat-Pro сгенерировано"
264
-
265
- personalized_message_gigachat_lite = perform_personalization_gigachat_with_retry(gigachat_lite_message, personalization_prompt, "gigachat_lite")
266
- gigachat_lite_length = len(personalized_message_gigachat_lite)
267
- gigachat_lite_display = f"{personalized_message_gigachat_lite}\n\n------\nКоличество знаков: {gigachat_lite_length}"
268
- yield personalization_prompt, gpt4o_display, gigachat_pro_display, gigachat_lite_display, "", "Персонализированное сообщение GigaChat-Lite сгенерировано"
269
-
270
- personalized_message_gigachat_plus = perform_personalization_gigachat_with_retry(gigachat_plus_message, personalization_prompt, "gigachat_plus")
271
- gigachat_plus_length = len(personalized_message_gigachat_plus)
272
- gigachat_plus_display = f"{personalized_message_gigachat_plus}\n\n------\nКоличество знаков: {gigachat_plus_length}"
273
- yield personalization_prompt, gpt4o_display, gigachat_pro_display, gigachat_lite_display, gigachat_plus_display, "Все персонализированные сообщения сгенерированы"
274
-
275
-
276
- # Функция для генерации промпта проверки текста
277
- def generate_error_check_prompt():
278
- prompt = (
279
- "Проверь текст SMS-сообщения на соответствие установленным правилам и ограничениям, касающимся его формирования. На основе выявленных несоответствий предоставь рекомендации по исправлению текста. "
280
- "Особое внимание удели проверке: количества символов в тексте SMS-сообщения, орфографическим и пунктуационным ошибкам, определению частей речи (причастия, деепричастия, причастный оборот, деепричастный оборот). "
281
- "Анализируй только текст SMS-сообщения, ничего не придумывай и не добавляй лишнего. "
282
- "Правила и ограничения, которым должен соответствовать текст SMS-сообщения:\n"
283
- "1. Количество символов в SMS-сообщении должно быть до 250 знаков с учетом пробелов.\n"
284
- "2. В тексте должен быть призыв к действию с использованием глагола в повелительном наклонении (например: оформите, получите, разместите, размещайте, откройте, подключите, подайте заявку).\n"
285
- "3. Должно соблюдаться соответствие фактов о продукте.\n"
286
- "4. В генерациях смс запрещено использовать обещания и гарантии.\n"
287
- "5. В генерациях смс запрещено использовать составные конструкции из двух глаголов.\n"
288
- "6. В генерациях смс запрещено использовать причастия и причастные обороты.\n"
289
- "7. В генерациях смс запрещено использовать деепричастия и деепричастные обороты.\n"
290
- "8. В генерациях смс запрещено использовать превосходную степень прилагательных.\n"
291
- "9. В генерациях смс запрещено использовать страдательный залог.\n"
292
- "10. В генерациях смс запрещено использовать порядковые числительные от 10 прописью.\n"
293
- "11. В генерациях смс запрещено использовать цепочки с придаточными предложениями.\n"
294
- "12. В генерациях смс запрещено использовать разделительные повторяющиеся союзы.\n"
295
- "13. В генерациях смс запрещено использовать вводные конструкции.\n"
296
- "14. В генерациях смс запрещено использовать усилители.\n"
297
- "15. В генерациях смс запрещено использовать паразиты времени.\n"
298
- "16. В генерациях смс запрещено использовать несколько существительных подряд, �� том числе отглагольных.\n"
299
- "17. В генерациях смс запрещено использовать производные предлоги.\n"
300
- "18. В генерациях смс запрещено использовать сложные предложения, в которых нет связи между частями.\n"
301
- "19. В генерациях смс запрещено использовать сложноподчинённые предложения.\n"
302
- "20. В генерациях смс запрещено использовать даты прописью.\n"
303
- "21. В генерациях смс запрещено использовать близкие по смыслу однородные члены.\n"
304
- "22. В генерациях смс запрещено использовать шокирующие, экстравагантные, кликбейтные фразы.\n"
305
- "23. В генерациях смс запрещено использовать абстрактные заявления без поддержки фактами и отсутствие доказательства пользы для клиента.\n"
306
- "24. В генерациях смс запрещено использовать гарантирующие фразы.\n"
307
- "25. В генерациях смс запрещено использовать узкоспециализированные термины.\n"
308
- "26. В генерациях смс запрещено использовать фразы, способные создать двойственное ощущение, обидеть.\n"
309
- "27. В генерациях смс запрещено использовать речевые клише, рекламные штампы, канцеляризмы.\n"
310
- "28. В генерациях смс запрещено использовать запрещенные слова: № один, номер один, № 1, вкусный, дешёвый, продукт, спам, банкротство, долги, займ, срочно, лучший, главный, номер 1, успех, лидер.\n"
311
- "29. Сообщение должно быть написано без орфографических и грамматических ошибок.\n"
312
- "30. Запрещены повторы слов.\n"
313
- "31. В тексте должны использоваться правильные знаки препинания.\n"
314
- "32. Если в тексте используются кавычки, они должны быть в форме «кавычки-ёлочки».\n"
315
- "33. В тексте SMS сообщения должны обязательно присутствовать: название продукта, условия использования продукта / Преимущества продукта / Шаги для подключения или начала использования / Условия акции (если предложение по продукту акционное).\n"
316
- "Форма ответа: [Ответ должен быть кратким, должен содержать только рекомендации по устранению найденных несоответствий, соответствия каждому пункту правил описывать категорически запрещено]."
317
- )
318
- return prompt
319
-
320
 
321
- # Функция для выполнения проверки текста с использованием yield
322
- def check_errors_with_yield(*personalized_messages):
323
- if len(personalized_messages) < 4:
324
- yield "", "", "", "", "", "Ошибка: недостаточно сообщений для проверки"
325
- return
326
-
327
- error_check_prompt = generate_error_check_prompt()
328
- yield error_check_prompt, "", "", "", "", "Промпт для проверки текста сгенерирован"
329
-
330
- error_message_gpt4o = perform_personalization(f"{error_check_prompt}\n\n{personalized_messages[0]}", "")
331
- yield error_check_prompt, error_message_gpt4o, "", "", "", "Результат проверки GPT-4o сгенерирован"
332
-
333
- error_message_gigachat_pro = perform_personalization_gigachat(f"{error_check_prompt}\n\n{personalized_messages[1]}", "", "gigachat_pro")
334
- yield error_check_prompt, error_message_gpt4o, error_message_gigachat_pro, "", "", "Результат проверки GigaChat-Pro сгенерирован"
335
-
336
- time.sleep(3)
337
- error_message_gigachat_lite = perform_personalization_gigachat(f"{error_check_prompt}\n\n{personalized_messages[2]}", "", "gigachat_lite")
338
- yield error_check_prompt, error_message_gpt4o, error_message_gigachat_pro, error_message_gigachat_lite, "", "Результат проверки GigaChat-Lite сгенерирован"
339
-
340
- try:
341
- time.sleep(3)
342
- error_message_gigachat_plus = perform_personalization_gigachat(f"{error_check_prompt}\n\n{personalized_messages[3]}", "", "gigachat_plus")
343
- except Exception as e:
344
- error_message_gigachat_plus = f"Ошибка при обработке GigaChat-Plus: {e}"
345
-
346
- yield error_check_prompt, error_message_gpt4o, error_message_gigachat_pro, error_message_gigachat_lite, error_message_gigachat_plus, "Все результаты проверки сгенерированы"
347
 
 
348
 
 
349
  def save_to_github(personalized_message, model_name, comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form):
350
- # Собираем все данные в один словарь
351
  data_to_save = {
352
  "Модель": model_name,
353
  "Персонализированное сообщение": personalized_message,
@@ -364,11 +182,7 @@ def save_to_github(personalized_message, model_name, comment, corrected_message,
364
  "Отрасль": industry,
365
  "ОПФ": legal_form
366
  }
367
-
368
- # Преобразуем контент в JSON-строку и кодируем в base64
369
  file_content_encoded = base64.b64encode(json.dumps(data_to_save).encode()).decode()
370
-
371
- # Параметры для GitHub API
372
  repo = "fruitpicker01/Storage_1"
373
  path = f"file_{int(time.time())}.json"
374
  url = f"https://api.github.com/repos/{repo}/contents/{path}"
@@ -380,10 +194,7 @@ def save_to_github(personalized_message, model_name, comment, corrected_message,
380
  "message": f"Добавлен новый файл {path}",
381
  "content": file_content_encoded
382
  }
383
-
384
- # Отправка POST-запроса на GitHub API для создания файла в репозитории
385
- response = requests.put(url, headers=headers, data=json.dumps(data))
386
-
387
 
388
  # Создание интерфейса Gradio
389
  with gr.Blocks() as demo:
@@ -391,64 +202,53 @@ with gr.Blocks() as demo:
391
 
392
  with gr.Row():
393
  with gr.Column(scale=1):
 
 
394
  description_input = gr.Textbox(
395
- label="Описание предложения (предзаполненный пример можно поменять на свой)",
396
- lines=13,
397
- value=(
398
- "Необходимо предложить клиенту оформить дебетовую премиальную бизнес-карту Mastercard Preffered. "
399
- "Обслуживание карты стоит 700 рублей в месяц, но клиент может пользоваться ей бесплатно. "
400
- "Что необходимо сделать, чтобы воспользоваться предложением:\n"
401
- "1. Оформить премиальную бизнес-карту в офисе банка или онлайн в интернет-банке СберБизнес.\n"
402
- "2. Забрать карту.\n"
403
- "3. В течение календарного месяца совершить по ней покупки на сумму от 100 000 рублей.\n"
404
- "4. В течение следующего месяца пользоваться ей бесплатно."
405
- )
406
  )
407
  advantages_input = gr.Textbox(
408
- label="Преимущества (предзаполненный пример можно поменять на свой)",
409
- lines=6,
410
- value=(
411
- "Предложение по бесплатному обслуживанию — бессрочное.\n"
412
- "Оплата покупок без отчётов и платёжных поручений.\n"
413
- "Платёжные документы без комиссии.\n"
414
- "Лимиты на расходы сотрудников.\n"
415
- "Мгновенные переводы на карты любых банков."
416
- )
417
  )
 
418
  selections = []
419
  for feature in features.keys():
420
  selections.append(gr.Dropdown(choices=[None] + list(features[feature].keys()), label=f"Выберите {feature}"))
421
 
422
- submit_btn = gr.Button("1. Создать неперсонализированное сообщение") # Оранжевая кнопка по умолчанию
423
 
424
  with gr.Column(scale=2):
425
- prompt_display = gr.Textbox(label="Неперсонализированный промпт", lines=20, interactive=False)
426
  output_text_gpt4o = gr.Textbox(label="Неперсонализированное сообщение GPT-4o", lines=3, interactive=False)
427
  output_text_gigachat_pro = gr.Textbox(label="Неперсонализированное сообщение GigaChat-Pro", lines=3, interactive=False)
428
  output_text_gigachat_lite = gr.Textbox(label="Неперсонализированное сообщение GigaChat-Lite", lines=3, interactive=False)
429
- output_text_gigachat_plus = gr.Textbox(label="Неперсонализированное сообщение GigaChat-Lite+", lines=3, interactive=False)
430
-
431
  submit_btn.click(
432
- generate_messages,
433
- inputs=[description_input, advantages_input] + selections,
434
  outputs=[prompt_display, output_text_gpt4o, output_text_gigachat_pro, output_text_gigachat_lite, output_text_gigachat_plus]
435
  )
436
 
437
  with gr.Row():
438
- personalize_btn = gr.Button("2. Выполнить персонализацию (нажимать только после кнопки 1)", elem_id="personalize_button")
439
-
440
- with gr.Row():
441
- personalize_btn.click(
442
- personalize_messages_with_yield,
443
- inputs=[output_text_gpt4o, output_text_gigachat_pro, output_text_gigachat_lite, output_text_gigachat_plus] + selections,
444
- outputs=[
445
- gr.Textbox(label="Промпт для персонализации", lines=6, interactive=False),
446
- personalized_output_text_gpt4o := gr.Textbox(label="Персонализированное сообщение GPT-4o", lines=6, interactive=False),
447
- personalized_output_text_gigachat_pro := gr.Textbox(label="Персонализированное сообщение GigaChat-Pro", lines=6, interactive=False),
448
- personalized_output_text_gigachat_lite := gr.Textbox(label="Персонализированное сообщение GigaChat-Lite", lines=6, interactive=False),
449
- personalized_output_text_gigachat_plus := gr.Textbox(label="Персонализированное сообщение GigaChat-Lite+", lines=6, interactive=False)
450
- ]
451
- )
452
 
453
  with gr.Row():
454
  gr.Markdown("*Комментарий (опционально):*")
@@ -464,8 +264,6 @@ with gr.Blocks() as demo:
464
  corrected_gigachat_lite = gr.Textbox(label="", lines=3)
465
  corrected_gigachat_plus = gr.Textbox(label="", lines=3)
466
 
467
-
468
- # Отдельная строка для кнопок с использованием пустой колонки
469
  with gr.Row():
470
  gr.Button("Жми 👍 для сохранения удачного SMS в базу =>")
471
  save_gpt4o_btn = gr.Button("👍")
@@ -473,7 +271,6 @@ with gr.Blocks() as demo:
473
  save_gigachat_lite_btn = gr.Button("👍")
474
  save_gigachat_plus_btn = gr.Button("👍")
475
 
476
- # Привязка кнопок к функциям сохранения
477
  save_gpt4o_btn.click(
478
  fn=lambda personalized_message, comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form:
479
  save_to_github(personalized_message, "GPT-4o", comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form),
@@ -539,7 +336,7 @@ with gr.Blocks() as demo:
539
 
540
  save_gigachat_plus_btn.click(
541
  fn=lambda personalized_message, comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form:
542
- save_to_github(personalized_message, "GigaChat-Lite+", comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form),
543
  inputs=[
544
  personalized_output_text_gigachat_plus,
545
  comment_gigachat_plus,
@@ -558,22 +355,4 @@ with gr.Blocks() as demo:
558
  outputs=None
559
  )
560
 
561
- # Использование сохраненных переменных в следующем блоке
562
- with gr.Row():
563
- check_errors_btn = gr.Button("3. Проверить текст (нажимать только после кнопки 2) - экспериментальная фича, качество пока крайне низкое", elem_id="check_errors_button")
564
-
565
- with gr.Row():
566
- check_errors_btn.click(
567
- check_errors_with_yield,
568
- inputs=[personalized_output_text_gpt4o, personalized_output_text_gigachat_pro, personalized_output_text_gigachat_lite, personalized_output_text_gigachat_plus],
569
- outputs=[
570
- gr.Textbox(label="Промпт для проверки текста", lines=6, interactive=False),
571
- gr.Textbox(label="Результат проверки GPT-4o", lines=6),
572
- gr.Textbox(label="Результат проверки GigaChat-Pro", lines=6),
573
- gr.Textbox(label="Результат проверки GigaChat-Lite", lines=6),
574
- gr.Textbox(label="Результат проверки GigaChat-Lite+", lines=6)
575
- ]
576
- )
577
-
578
-
579
  demo.launch()
 
9
  from openpyxl import load_workbook
10
  import base64
11
 
12
+ # Установка ключей API для OpenAI, GigaChat и GitHub
13
  openai_api_key = os.getenv('GPT_KEY')
14
  gc_key = os.getenv('GC_KEY')
15
  token = os.getenv('GITHUB_TOKEN')
16
 
17
+ # Класс конфигурации модели
18
+ class ModelConfig:
19
+ def __init__(self, temperature):
20
+ self.max_tokens = 68 # фиксированное значение
21
+ self.temperature = temperature
22
+
23
+ # Класс для генерации сообщений
24
+ class MessageGenerator:
25
+ def __init__(self, config: ModelConfig):
26
+ self.config = config
27
+ self.chat_pro = self.authenticate_gigachat('GigaChat-Pro')
28
+ self.chat_lite = self.authenticate_gigachat('GigaChat')
29
+ self.chat_plus = self.authenticate_gigachat('GigaChat-Plus')
30
+
31
+ def authenticate_gigachat(self, model):
32
+ return GigaChat(credentials=gc_key, model=model, max_tokens=self.config.max_tokens, temperature=self.config.temperature, verify_ssl_certs=False)
33
+
34
+ def clean_message(self, message):
35
+ if not message.endswith(('.', '!', '?')):
36
+ last_period = message.rfind('.')
37
+ if last_period != -1:
38
+ message = message[:last_period + 1]
39
+ return message
40
+
41
+ def generate_message_gpt4o(self, prompt):
42
+ headers = {
43
+ "Content-Type": "application/json",
44
+ "Authorization": f"Bearer {openai_api_key}"
45
+ }
46
+ data = {
47
+ "model": "chatgpt-4o-latest",
48
+ "messages": [{"role": "system", "content": prompt}],
49
+ "max_tokens": self.config.max_tokens,
50
+ "temperature": self.config.temperature
51
+ }
52
+ response = requests.post("https://api.openai.com/v1/chat/completions", json=data, headers=headers)
53
+ response_data = response.json()
54
+ return self.clean_message(response_data["choices"][0]["message"]["content"].strip())
55
+
56
+ def generate_message_gigachat(self, prompt, model):
57
+ messages = [SystemMessage(content=prompt)]
58
+ if model == 'GigaChat-Pro':
59
+ res = self.chat_pro(messages)
60
+ elif model == 'GigaChat':
61
+ res = self.chat_lite(messages)
62
+ elif model == 'GigaChat-Plus':
63
+ res = self.chat_plus(messages)
64
+ return self.clean_message(res.content.strip())
65
 
66
  # Загрузка данных из Excel-файла
67
+ data = pd.read_excel('Признаки.xlsx', sheet_name=None)
68
+ features = {sheet_name: df.set_index(df.columns[0]).to_dict()[df.columns[1]] for sheet_name, df in data.items()}
 
 
 
 
 
 
 
 
 
 
 
 
69
 
70
  # Функция для генерации стандартного промпта
71
  def generate_standard_prompt(description, advantages, *selected_values):
 
107
  )
108
  return prompt
109
 
110
+ # Функция для генерации сообщений с учетом повторных попыток
111
+ def generate_message_with_retry(generator, prompt, model):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
112
  for _ in range(10):
113
+ message = generator.generate_message_gigachat(prompt, model)
114
  if len(message) <= 250:
115
  return message
116
+ return message # Возвращаем последнее сгенерированное сообщение, если все попытки не удались
 
 
 
 
 
 
 
 
117
 
118
+ # Обновление интерфейса для отображения сообщений
119
+ def generate_messages(description, advantages, config, *selected_values):
120
+ generator = MessageGenerator(config)
121
  standard_prompt = generate_standard_prompt(description, advantages, *selected_values)
122
 
123
  results = {
124
  "prompt": standard_prompt,
125
+ "gpt4o": generator.generate_message_gpt4o(standard_prompt),
126
+ "gigachat_pro": generate_message_with_retry(generator, standard_prompt, 'GigaChat-Pro'),
127
+ "gigachat_lite": generate_message_with_retry(generator, standard_prompt, 'GigaChat'),
128
+ "gigachat_plus": generate_message_with_retry(generator, standard_prompt, 'GigaChat-Plus')
129
  }
130
 
131
+ return results["prompt"], results["gpt4o"], results["gigachat_pro"], results["gigachat_lite"], results["gigachat_plus"]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
132
 
133
  # Функция для генерации персонализированного промпта
134
  def generate_personalization_prompt(*selected_values):
135
  prompt = "Адаптируй, не превышая длину сообщения в 250 знаков с пробелами, текст с учетом следующих особенностей:\n"
136
  for i, feature in enumerate(features.keys()):
137
  if selected_values[i]:
138
+ prompt += f"{features[feature][selected_values[i]]}\n"
 
 
 
 
139
  prompt += "Убедись, что в готовом тексте до 250 знаков с пробелами."
 
140
  return prompt.strip()
141
 
142
  # Функция для выполнения персонализации на основе сгенерированного промпта и сообщения
143
+ def perform_personalization(standard_message, personalization_prompt, generator):
 
 
 
 
 
144
  full_prompt = f"{personalization_prompt}\n\nТекст для адаптации:\n{standard_message}"
145
+ return generator.generate_message_gpt4o(full_prompt)
 
 
 
 
 
 
 
 
 
 
 
 
 
146
 
147
+ # Функция для выполнения персонализации с учетом повторных попыток
148
+ def perform_personalization_with_retry(standard_message, personalization_prompt, generator, model):
149
  for _ in range(10):
150
+ message = perform_personalization(standard_message, personalization_prompt, generator)
151
  if len(message) <= 250:
152
  return message
153
  return message
154
 
155
+ # Обновление интерфейса для персонализации сообщений
156
+ def personalize_messages(gpt4o_message, gigachat_pro_message, gigachat_lite_message, gigachat_plus_message, config, *selected_values):
157
+ generator = MessageGenerator(config)
158
  personalization_prompt = generate_personalization_prompt(*selected_values)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
159
 
160
+ personalized_gpt4o = perform_personalization_with_retry(gpt4o_message, personalization_prompt, generator, "GPT-4o")
161
+ personalized_gigachat_pro = perform_personalization_with_retry(gigachat_pro_message, personalization_prompt, generator, "GigaChat-Pro")
162
+ personalized_gigachat_lite = perform_personalization_with_retry(gigachat_lite_message, personalization_prompt, generator, "GigaChat")
163
+ personalized_gigachat_plus = perform_personalization_with_retry(gigachat_plus_message, personalization_prompt, generator, "GigaChat-Plus")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
164
 
165
+ return personalization_prompt, personalized_gpt4o, personalized_gigachat_pro, personalized_gigachat_lite, personalized_gigachat_plus
166
 
167
+ # Функция для сохранения данных на GitHub
168
  def save_to_github(personalized_message, model_name, comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form):
 
169
  data_to_save = {
170
  "Модель": model_name,
171
  "Персонализированное сообщение": personalized_message,
 
182
  "Отрасль": industry,
183
  "ОПФ": legal_form
184
  }
 
 
185
  file_content_encoded = base64.b64encode(json.dumps(data_to_save).encode()).decode()
 
 
186
  repo = "fruitpicker01/Storage_1"
187
  path = f"file_{int(time.time())}.json"
188
  url = f"https://api.github.com/repos/{repo}/contents/{path}"
 
194
  "message": f"Добавлен новый файл {path}",
195
  "content": file_content_encoded
196
  }
197
+ requests.put(url, headers=headers, data=json.dumps(data))
 
 
 
198
 
199
  # Создание интерфейса Gradio
200
  with gr.Blocks() as demo:
 
202
 
203
  with gr.Row():
204
  with gr.Column(scale=1):
205
+ temperature_slider = gr.Slider(label="Температура", minimum=0, maximum=2, step=0.01, value=1)
206
+
207
  description_input = gr.Textbox(
208
+ label="Описание предложения",
209
+ lines=5,
210
+ value="Необходимо предложить клиенту оформить дебетовую премиальную бизнес-карту Mastercard Preffered..."
 
 
 
 
 
 
 
 
211
  )
212
  advantages_input = gr.Textbox(
213
+ label="Преимущества",
214
+ lines=5,
215
+ value="Предложение по бесплатному обслуживанию — бессрочное..."
 
 
 
 
 
 
216
  )
217
+
218
  selections = []
219
  for feature in features.keys():
220
  selections.append(gr.Dropdown(choices=[None] + list(features[feature].keys()), label=f"Выберите {feature}"))
221
 
222
+ submit_btn = gr.Button("Создать неперсонализированное сообщение")
223
 
224
  with gr.Column(scale=2):
225
+ prompt_display = gr.Textbox(label="Неперсонализированный промпт", lines=10, interactive=False)
226
  output_text_gpt4o = gr.Textbox(label="Неперсонализированное сообщение GPT-4o", lines=3, interactive=False)
227
  output_text_gigachat_pro = gr.Textbox(label="Неперсонализированное сообщение GigaChat-Pro", lines=3, interactive=False)
228
  output_text_gigachat_lite = gr.Textbox(label="Неперсонализированное сообщение GigaChat-Lite", lines=3, interactive=False)
229
+ output_text_gigachat_plus = gr.Textbox(label="Неперсонализированное сообщение GigaChat-Plus", lines=3, interactive=False)
230
+
231
  submit_btn.click(
232
+ fn=generate_messages,
233
+ inputs=[description_input, advantages_input, gr.State(lambda: ModelConfig(temperature_slider.value))] + selections,
234
  outputs=[prompt_display, output_text_gpt4o, output_text_gigachat_pro, output_text_gigachat_lite, output_text_gigachat_plus]
235
  )
236
 
237
  with gr.Row():
238
+ personalize_btn = gr.Button("Выполнить персонализацию")
239
+
240
+ with gr.Column(scale=2):
241
+ personalization_prompt_display = gr.Textbox(label="Промпт для персонализации", lines=6, interactive=False)
242
+ personalized_output_text_gpt4o = gr.Textbox(label="Персонализированное сообщение GPT-4o", lines=6, interactive=False)
243
+ personalized_output_text_gigachat_pro = gr.Textbox(label="Персонализированное сообщение GigaChat-Pro", lines=6, interactive=False)
244
+ personalized_output_text_gigachat_lite = gr.Textbox(label="Персонализированное сообщение GigaChat-Lite", lines=6, interactive=False)
245
+ personalized_output_text_gigachat_plus = gr.Textbox(label="Персонализированное сообщение GigaChat-Plus", lines=6, interactive=False)
246
+
247
+ personalize_btn.click(
248
+ fn=personalize_messages,
249
+ inputs=[output_text_gpt4o, output_text_gigachat_pro, output_text_gigachat_lite, output_text_gigachat_plus, gr.State(lambda: ModelConfig(temperature_slider.value))] + selections,
250
+ outputs=[personalization_prompt_display, personalized_output_text_gpt4o, personalized_output_text_gigachat_pro, personalized_output_text_gigachat_lite, personalized_output_text_gigachat_plus]
251
+ )
252
 
253
  with gr.Row():
254
  gr.Markdown("*Комментарий (опционально):*")
 
264
  corrected_gigachat_lite = gr.Textbox(label="", lines=3)
265
  corrected_gigachat_plus = gr.Textbox(label="", lines=3)
266
 
 
 
267
  with gr.Row():
268
  gr.Button("Жми 👍 для сохранения удачного SMS в базу =>")
269
  save_gpt4o_btn = gr.Button("👍")
 
271
  save_gigachat_lite_btn = gr.Button("👍")
272
  save_gigachat_plus_btn = gr.Button("👍")
273
 
 
274
  save_gpt4o_btn.click(
275
  fn=lambda personalized_message, comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form:
276
  save_to_github(personalized_message, "GPT-4o", comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form),
 
336
 
337
  save_gigachat_plus_btn.click(
338
  fn=lambda personalized_message, comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form:
339
+ save_to_github(personalized_message, "GigaChat-Plus", comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, gender, generation, psychotype, business_stage, industry, legal_form),
340
  inputs=[
341
  personalized_output_text_gigachat_plus,
342
  comment_gigachat_plus,
 
355
  outputs=None
356
  )
357
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
358
  demo.launch()