fruitpicker01 commited on
Commit
2969ff2
·
verified ·
1 Parent(s): e15ca4d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +349 -11
app.py CHANGED
@@ -21,6 +21,7 @@ from sklearn.feature_extraction.text import TfidfVectorizer
21
  from sklearn.metrics.pairwise import cosine_similarity
22
  from sentence_transformers import SentenceTransformer, util
23
  import numpy as np
 
24
 
25
 
26
  morph = pymorphy2.MorphAnalyzer()
@@ -30,10 +31,14 @@ openai_api_key = os.getenv('GPT_KEY')
30
  gc_key = os.getenv('GC_KEY')
31
  token = os.getenv('GITHUB_TOKEN')
32
  TOGETHER_API_KEY = os.getenv('TOGETHER_API_KEY')
 
33
 
34
  # Инициализация клиента для Together
35
  client = Together(api_key=TOGETHER_API_KEY)
36
 
 
 
 
37
  # Авторизация в сервисе GigaChat
38
  chat_pro = GigaChat(credentials=gc_key, model='GigaChat-Pro', max_tokens=68, temperature=1.15, verify_ssl_certs=False)
39
  chat_lite = GigaChat(credentials=gc_key, model='GigaChat', max_tokens=68, temperature=1.15, verify_ssl_certs=False)
@@ -841,10 +846,10 @@ def adapt_messages_to_best_example(
841
  # Шаблон промпта (без изменений)
842
  prompt_template = (
843
  "Сообщение для адаптации:\n\"{personalized_message}\"\n\n"
844
- "Эталонное сообщение (НЕ ИСПОЛЬЗУЙ ФАКТЫ ИЛИ ДАННЫЕ ИЗ НИЖЕПРИВЕДЕННОГО СООБЩЕНИЯ):\n\"{reference_message}\"\n\n"
845
  "1. Перепиши сообщение для адаптации, сохранив его смысл."
846
- "2. Используй стиль, построение предложений и лексику, максимально похожие на эталонное сообщение."
847
- "3. НЕ ДОБАВЛЯЙ факты, цифры, или любую информацию из эталонного сообщения."
848
  "4. Убедись, что итоговое сообщение содержит ТОЛЬКО информацию из сообщения для адаптации и адаптировано по стилю и структуре."
849
  "5. Проверь, что итоговое сообщение включает следующую информацию: \n\"{key_message}\"\n"
850
  )
@@ -929,10 +934,10 @@ def update_best_example_prompt(description, *selected_values):
929
  best_prompt = "Эталонное сообщение не найдено для выбранных параметров персонализации."
930
  else:
931
  best_prompt = (
932
- "Эталонное сообщение (НЕ ИСПОЛЬЗУЙ ФАКТЫ ИЛИ ДАННЫЕ ИЗ НИЖЕПРИВЕДЕННОГО СООБЩЕНИЯ):\n\"{reference_message}\"\n\n"
933
  "1. Перепиши сообщение для адаптации, сохранив его смысл.\n"
934
- "2. Используй стиль, построение предложений и лексику, максимально похожие на эталонное сообщение.\n"
935
- "3. НЕ ДОБАВЛЯЙ факты, цифры, или любую информацию из эталонного сообщения.\n"
936
  "4. Убедись, что итоговое сообщение содержит ТОЛЬКО информацию из сообщения для адаптации и адаптировано по стилю и структуре."
937
  ).format(reference_message=reference_message)
938
 
@@ -1165,6 +1170,35 @@ def generate_message_meta_llama_3_1_405b_with_retry(prompt):
1165
  return correct_dash_usage(message)
1166
  return message
1167
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1168
 
1169
  def generate_messages(description, advantages, key_message, approach, *selected_values):
1170
 
@@ -2055,8 +2089,269 @@ def check_no_word_repetitions(message):
2055
  # Если мы дошли до этой точки, повторов не было
2056
  return True
2057
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2058
  # ФУНКЦИИ ПРОВЕРОК (КОНЕЦ)
2059
 
 
2060
  def safe_check(func, message):
2061
  try:
2062
  return func(message)
@@ -2084,7 +2379,15 @@ def perform_checks(message):
2084
  "derived_prepositions": safe_check(check_no_derived_prepositions, message),
2085
  "compound_sentences": safe_check(check_no_compound_sentences, message),
2086
  "dates_written_out": safe_check(check_no_dates_written_out, message),
2087
- "no_word_repetitions": safe_check(check_no_word_repetitions, message)
 
 
 
 
 
 
 
 
2088
  }
2089
  return checks
2090
 
@@ -2109,7 +2412,15 @@ def format_checks(checks):
2109
  "derived_prepositions": "Производные предлоги",
2110
  "compound_sentences": "Сложноподчиненные предложения",
2111
  "dates_written_out": "Даты прописью",
2112
- "no_word_repetitions": "Повторы слов"
 
 
 
 
 
 
 
 
2113
  }
2114
  formatted_results = []
2115
  for rule, result in checks.items():
@@ -2298,7 +2609,35 @@ with gr.Blocks() as demo:
2298
  corrected_gigachat_plus = gr.Textbox(label="Откорректированное сообщение 3", lines=3)
2299
  corrected_gpt4o = gr.Textbox(label="Откорректированное сообщение 4", lines=3)
2300
  corrected_meta_llama_405b = gr.Textbox(label="Откорректированное сообщение 5", lines=3)
2301
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2302
  # Пятый ряд: кнопки сохранения
2303
  with gr.Row():
2304
  save_gigachat_pro_btn = gr.Button("Сохранить в базу")
@@ -3335,5 +3674,4 @@ with gr.Blocks() as demo:
3335
  ]
3336
  )
3337
 
3338
- demo.launch()
3339
-
 
21
  from sklearn.metrics.pairwise import cosine_similarity
22
  from sentence_transformers import SentenceTransformer, util
23
  import numpy as np
24
+ from mistralai import Mistral
25
 
26
 
27
  morph = pymorphy2.MorphAnalyzer()
 
31
  gc_key = os.getenv('GC_KEY')
32
  token = os.getenv('GITHUB_TOKEN')
33
  TOGETHER_API_KEY = os.getenv('TOGETHER_API_KEY')
34
+ MISTRAL_API_KEY = os.getenv('MISTRAL_API_KEY')
35
 
36
  # Инициализация клиента для Together
37
  client = Together(api_key=TOGETHER_API_KEY)
38
 
39
+ # Инициализация клиента для Mistral
40
+ client_mistral = Mistral(api_key=MISTRAL_API_KEY)
41
+
42
  # Авторизация в сервисе GigaChat
43
  chat_pro = GigaChat(credentials=gc_key, model='GigaChat-Pro', max_tokens=68, temperature=1.15, verify_ssl_certs=False)
44
  chat_lite = GigaChat(credentials=gc_key, model='GigaChat', max_tokens=68, temperature=1.15, verify_ssl_certs=False)
 
846
  # Шаблон промпта (без изменений)
847
  prompt_template = (
848
  "Сообщение для адаптации:\n\"{personalized_message}\"\n\n"
849
+ "Пример (НЕ ИСПОЛЬЗУЙ ФАКТЫ ИЛИ ДАННЫЕ ИЗ НИЖЕПРИВЕДЕННОГО СООБЩЕНИЯ):\n\"{reference_message}\"\n\n"
850
  "1. Перепиши сообщение для адаптации, сохранив его смысл."
851
+ "2. Используй стиль, построение предложений и лексику, максимально похожие на пример."
852
+ "3. НЕ ДОБАВЛЯЙ факты, цифры, или любую информацию из примера."
853
  "4. Убедись, что итоговое сообщение содержит ТОЛЬКО информацию из сообщения для адаптации и адаптировано по стилю и структуре."
854
  "5. Проверь, что итоговое сообщение включает следующую информацию: \n\"{key_message}\"\n"
855
  )
 
934
  best_prompt = "Эталонное сообщение не найдено для выбранных параметров персонализации."
935
  else:
936
  best_prompt = (
937
+ "Пример (НЕ ИСПОЛЬЗУЙ ФАКТЫ ИЛИ ДАННЫЕ ИЗ НИЖЕПРИВЕДЕННОГО СООБЩЕНИЯ):\n\"{reference_message}\"\n\n"
938
  "1. Перепиши сообщение для адаптации, сохранив его смысл.\n"
939
+ "2. Используй стиль, построение предложений и лексику, максимально похожие на пример.\n"
940
+ "3. НЕ ДОБАВЛЯЙ факты, цифры, или любую информацию из примера.\n"
941
  "4. Убедись, что итоговое сообщение содержит ТОЛЬКО информацию из сообщения для адаптации и адаптировано по стилю и структуре."
942
  ).format(reference_message=reference_message)
943
 
 
1170
  return correct_dash_usage(message)
1171
  return message
1172
 
1173
+ def generate_message_mistral(prompt, max_retries=5):
1174
+ retries = 0
1175
+ while retries < max_retries:
1176
+ try:
1177
+ chat_response = client_mistral.chat.complete(
1178
+ model="mistral-large-latest",
1179
+ messages=[
1180
+ {
1181
+ "role": "user",
1182
+ "content": prompt
1183
+ },
1184
+ ],
1185
+ max_tokens=3000, # Увел��чено до 3000
1186
+ temperature=0.2,
1187
+ stop=["}"] # Останавливаем генерацию после закрывающей скобки
1188
+ )
1189
+ cleaned_message = chat_response.choices[0].message.content.strip()
1190
+ return cleaned_message
1191
+ except Exception as e:
1192
+ if "Status 429" in str(e):
1193
+ wait_time = 3 # Можно установить фиксированную задержку
1194
+ print(f"Превышен лимит запросов. Ожидание {wait_time} секунд перед повторной попыткой...")
1195
+ time.sleep(wait_time)
1196
+ retries += 1
1197
+ else:
1198
+ print(f"Ошибка при обращении к Mistral: {e}")
1199
+ return None
1200
+ print("Ошибка: превышено количество попыток обращения к Mistral")
1201
+ return None
1202
 
1203
  def generate_messages(description, advantages, key_message, approach, *selected_values):
1204
 
 
2089
  # Если мы дошли до этой точки, повторов не было
2090
  return True
2091
 
2092
+ # Проверки на LLM
2093
+
2094
+ def parse_json_response(response):
2095
+ try:
2096
+ # Попытка найти JSON-подобную структуру в ответе
2097
+ match = re.search(r'\{.*', response)
2098
+ if match:
2099
+ json_str = match.group(0)
2100
+ # Проверяем и добавляем недостающие кавычки и скобки
2101
+ if json_str.count('"') % 2 != 0:
2102
+ json_str += '"'
2103
+ if json_str.count('{') > json_str.count('}'):
2104
+ json_str += '}'
2105
+ result = json.loads(json_str)
2106
+ return result
2107
+ else:
2108
+ print("JSON не найден в ответе")
2109
+ return None
2110
+ except Exception as e:
2111
+ print(f"Ошибка при разборе JSON: {e}")
2112
+ return None
2113
+
2114
+ def cut_message(message):
2115
+ # Удаляем любой дополнительный текст, например, "------\nКоличество знаков: ..."
2116
+ # Разделяем сообщение по '------' и берем первую часть
2117
+ if '------' in message:
2118
+ message = message.split('------')[0].strip()
2119
+ return message
2120
+
2121
+ # 22. Проверка сложных предложений без логической связи
2122
+ def check_disconnected_sentences(message):
2123
+ message_clean = cut_message(message)
2124
+ print()
2125
+ print()
2126
+ print("СООБЩЕНИЕ:", message_clean)
2127
+ print()
2128
+ print("Проверка 22: Проверка сложных предложений без логической связи")
2129
+ print()
2130
+ prompt = f'''Проверь следующий текст на наличие сложных предложений, где отсутствует логическая связь между частями:
2131
+ "{message_clean}"
2132
+ Определи, есть ли в тексте предложения с несколькими частями, которые кажутся несвязанными, не поддерживают общую мысль или делают текст трудным для понимания.
2133
+
2134
+ Обрати внимание, что в контексте коротких рекламных сообщений допустимы краткие предложения, перечисления и фразы, которые вместе передают связную информацию о продукте или услуге. Не считай такие сообщения несвязанными, если их части логически связаны с предложением продукта или условиями его получения.
2135
+
2136
+ Пример ответа:
2137
+ {{"decision": false, "explanation": "Текст понятен, и все предложения логически связаны между собой."}}
2138
+
2139
+ Если в тексте **есть** сложные предложения без логической связи между частями, **верни только** JSON {{"decision": true, "explanation": "<пояснение>"}};
2140
+ если таких предложений **нет**, **верни только** JSON {{"decision": false, "explanation": "<пояснение>"}}.
2141
+
2142
+ **Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь **только** в формате JSON с закрывающими кавычками и скобками.**'''
2143
+
2144
+ response = generate_message_mistral(prompt)
2145
+ time.sleep(3) # Задержка в 3 секунды между запросами
2146
+ print("Mistral response:", response) # Выводим полный ответ модели
2147
+ result = parse_json_response(response)
2148
+ if result is not None:
2149
+ decision = result.get("decision", False)
2150
+ explanation = result.get("explanation", "")
2151
+ print("Explanation:", explanation)
2152
+ return not decision # Инвертируем логику
2153
+ else:
2154
+ return None
2155
+
2156
+ # 23. Проверка на близкие по смыслу однородные члены
2157
+ def check_synonymous_members(message):
2158
+ print()
2159
+ print("Проверка 23: Проверка на близкие по смыслу однородные члены")
2160
+ print()
2161
+ message_clean = cut_message(message)
2162
+ prompt = f'''Проверь следующий текст на наличие однородных членов предложения, которые имеют одинаковый или практически одинаковый смысл и повторяют одну и ту же идею:
2163
+ "{message_clean}"
2164
+ Определи, есть ли в предложении несколько слов или выражений, которые являются синонимами и используются вместе без необходимости, создавая избыточность.
2165
+ Обрати внимание, что слова или выражения, которые дополняют друг друга и описывают разные аспекты продукта или услуги, не считаются проблемой.
2166
+ Пример ответа:
2167
+ {{"decision": true, "explanation": "В предложении используются синонимы 'быстрый' и 'скорый', которые повторяют одну и ту же идею."}}
2168
+ Если такие слова или выражения есть, **верни только** JSON {{"decision": true, "explanation": "<пояснение>"}};
2169
+ если таких слов или выражений нет, **верни только** JSON {{"decision": false, "explanation": "<пояснение>"}}.
2170
+ **Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь только в формате JSON с закрывающими кавычками и скобками.**'''
2171
+
2172
+ response = generate_message_mistral(prompt)
2173
+ time.sleep(3)
2174
+ print("Mistral response:", response)
2175
+ result = parse_json_response(response)
2176
+ if result is not None:
2177
+ decision = result.get("decision", False)
2178
+ explanation = result.get("explanation", "")
2179
+ print("Explanation:", explanation)
2180
+ return not decision # Инвертируем логику
2181
+ else:
2182
+ return None
2183
+
2184
+ # 24. Проверка на шокирующие, экстравагантные или кликбейтные фразы
2185
+ def check_clickbait_phrases(message):
2186
+ print()
2187
+ print("Проверка 24: Проверка на шокирующие, экстравагантные или кликбейтные фразы")
2188
+ print()
2189
+ message_clean = cut_message(message)
2190
+ prompt = f'''Проверь следующий текст на наличие шокирующих, экстравагантных или кликбейтных фраз:
2191
+ "{message_clean}"
2192
+ Укажи, если текст содержит утверждения, которые:
2193
+ - стремятся вызвать чрезмерно сильные эмоции (например, шок, страх, недоверие);
2194
+ - используют явные преувеличения, необоснованные заявления или сенсационные выражения;
2195
+ - содержат провокационные или вводящие в заблуждение формулировки, которые побуждают к немедленному действию без достаточных оснований.
2196
+ Обрати внимание, что стандартные рекламные призывы к действию и информативные предложения не считаются кликбейтом.
2197
+ Пример ответа:
2198
+ {{"decision": false, "explanation": "Текст нейтрален и не содержит кликбейтных фраз."}}
2199
+ Если такие фразы есть, **верни только** JSON {{"decision": true, "explanation": "<пояснение>"}};
2200
+ если таких фраз нет, **верни только** JSON {{"decision": false, "explanation": "<пояснение>"}}.
2201
+ **Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь только в формате JSON с закрывающими кавычками и скобками.**'''
2202
+
2203
+ response = generate_message_mistral(prompt)
2204
+ time.sleep(3)
2205
+ print("Mistral response:", response)
2206
+ result = parse_json_response(response)
2207
+ if result is not None:
2208
+ decision = result.get("decision", False)
2209
+ explanation = result.get("explanation", "")
2210
+ print("Explanation:", explanation)
2211
+ return not decision # Инвертируем логику
2212
+ else:
2213
+ return None
2214
+
2215
+ # 25. Проверка на абстрактные заявления без поддержки фактами
2216
+ def check_abstract_claims(message):
2217
+ print()
2218
+ print("Проверка 25: Проверка на абстрактные заявления без поддержки фактами")
2219
+ print()
2220
+ message_clean = cut_message(message)
2221
+ prompt = f'''Проверь следующий текст на наличие чрезмерно абстрактных утверждений, которые не подкреплены фактами, данными или конкретными примерами, и могут затруднять понимание пользы продукта или услуги:
2222
+ "{message_clean}"
2223
+ Определи, содержит ли текст общие фразы, которые не объясняют, как клиенту будет полезен продукт или услуга, и при этом являются настолько неопределенными, что затрудняют понимание.
2224
+ Учти, что в контексте коротких рекламных сообщений допустимы общие фразы, если они достаточно ясно передают ценность предложения.
2225
+ Пример ответа:
2226
+ {{"decision": true, "explanation": "Текст содержит общие заявления без конкретики, такие как 'лучшее решение для вашего бизнеса'."}}
2227
+ Если такие чрезмерно абстрактные утверждения есть, **верни только** JSON {{"decision": true, "explanation": "<пояснение>"}};
2228
+ если таких утверждений нет, **верни только** JSON {{"decision": false, "explanation": "<пояснение>"}}.
2229
+ **Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь только в формате JSON с закрывающими кавычками и скобками.**'''
2230
+
2231
+ response = generate_message_mistral(prompt)
2232
+ time.sleep(3)
2233
+ print("Mistral response:", response)
2234
+ result = parse_json_response(response)
2235
+ if result is not None:
2236
+ decision = result.get("decision", False)
2237
+ explanation = result.get("explanation", "")
2238
+ print("Explanation:", explanation)
2239
+ return not decision # Инвертируем логическое значение
2240
+ else:
2241
+ return None
2242
+
2243
+ # 26. Проверка на узкоспециализированные термины
2244
+ def check_specialized_terms(message):
2245
+ print()
2246
+ print("Проверка 26: Проверка на узкоспециализированные термины")
2247
+ print()
2248
+ message_clean = cut_message(message)
2249
+ prompt = f'''Проверь следующий текст на наличие узкоспециализированных терминов или жаргона, которые могут быть непонятны широкой аудитории:
2250
+ "{message_clean}"
2251
+ Определи, содержит ли текст термины, которые известны только специалистам в определенной области и могут вызвать затруднения у обычных читателей.
2252
+ Учти, что общеупотребительные названия продуктов, услуг или общепринятые термины (например, "кредитная карта", "интернет-банк", "Mastercard") не считаются узкоспециализированными и могут использоваться.
2253
+ Пример ответа:
2254
+ {{"decision": false, "explanation": "В тексте отсутствуют узкоспециализированные термины."}}
2255
+ Если в тексте есть такие узкоспециализированные термины, **верни только** JSON {{"decision": true, "explanation": "<пояснение>"}};
2256
+ если таких терминов нет, **верни только** JSON {{"decision": false, "explanation": "<пояснение>"}}.
2257
+ **Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь только в формате JSON с закрывающими кавычками и скобками.**'''
2258
+
2259
+ response = generate_message_mistral(prompt)
2260
+ time.sleep(3)
2261
+ print("Mistral response:", response)
2262
+ result = parse_json_response(response)
2263
+ if result is not None:
2264
+ decision = result.get("decision", False)
2265
+ explanation = result.get("explanation", "")
2266
+ print("Explanation:", explanation)
2267
+ return not decision # Инвертируем логическое значение
2268
+ else:
2269
+ return None
2270
+
2271
+ # 27. Проверка на двусмысленные или обидные фразы
2272
+ def check_offensive_phrases(message):
2273
+ print()
2274
+ print("Проверка 27: Проверка на двусмысленные или обидные фразы")
2275
+ print()
2276
+ message_clean = cut_message(message)
2277
+ prompt = f'''Проверь следующий текст на наличие фраз, которые могут быть истолкованы двусмысленно или вызвать негативные эмоции у читателя:
2278
+ "{message_clean}"
2279
+ Определи, есть ли в тексте выражения, которые могут быть восприняты как оскорбительные, обидные или неуместные.
2280
+ Обрати внимание, что фразы, используемые в обычном деловом контексте и не содержащие явных оскорблений, дискриминации или непристойностей, не считаются проблемными.
2281
+ Например, фразы, объясняющие преимущества продукта, такие как "без отчётов и комиссий", являются допустимыми.
2282
+ Пример ответа:
2283
+ {{"decision": false, "explanation": "Текст не содержит обидных или двусмысленных фраз."}}
2284
+ Если такие фразы есть, **верни только** JSON {{"decision": true, "explanation": "<пояснение>"}};
2285
+ если таких фраз нет, **верни только** JSON {{"decision": false, "explanation": "<пояснение>"}}.
2286
+ **Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь только в формате JSON с закрывающими кавычками и скобками.**'''
2287
+
2288
+ response = generate_message_mistral(prompt)
2289
+ time.sleep(3)
2290
+ print("Mistral response:", response)
2291
+ result = parse_json_response(response)
2292
+ if result is not None:
2293
+ decision = result.get("decision", False)
2294
+ explanation = result.get("explanation", "")
2295
+ print("Explanation:", explanation)
2296
+ return not decision # Инвертируем логическое значение
2297
+ else:
2298
+ return None
2299
+
2300
+ # 28. Проверка на речевые клише, рекламные штампы и канцеляризмы
2301
+ def check_cliches_and_bureaucratese(message):
2302
+ print()
2303
+ print("Проверка 28: Проверка на речевые клише, рекламные штампы и канцеляризмы")
2304
+ print()
2305
+ message_clean = cut_message(message)
2306
+ prompt = f'''Проверь следующий текст на наличие речевых клише, излишне употребляемых фраз, рекламных штампов и канцеляризмов, которые делают текст менее выразительным и оригинальным. Обрати внимание **только** на выражения, которые являются избитыми штампами, чрезмерно используемыми и не несущими дополнительной ценности для текста.
2307
+
2308
+ В контексте рекламных SMS допустимы стандартные фразы и призывы к действию, необходимые для ясности и краткости сообщения, такие как предложения о покупке, описания условий и способов оформления услуг.
2309
+
2310
+ **Не считай клише или канцеляризмами следующие типы выражений:**
2311
+
2312
+ - Стандартные призывы к действию (например, "Получите", "Оформите", "Закажите сейчас").
2313
+
2314
+ - Информацию о ценах, скидках, акциях или условиях покупки (например, "при покупках от 100 000 рублей в месяц").
2315
+
2316
+ - Описания способов оформления или получения услуг (например, "оформление возможно онлайн или в офисе").
2317
+
2318
+ - Стандартные отраслевые термины и фразы, необходимые для понимания сообщения (например, "премиальная бизнес-карта", "Mastercard Preffered").
2319
+
2320
+ **Считай клише или канцеляризмами выражения, которые:**
2321
+
2322
+ - Чрезмерно обобщены и не несут конкретной информации (например, "лучшее решение для вашего бизнеса").
2323
+
2324
+ - Используют излишне формальный или усложненный язык без необходимости (например, "высококачественный спектр услуг").
2325
+
2326
+ - Являются избитыми фразами, не добавляющими ценности сообщению (например, "мы заботимся о вас", "качество проверенное временем").
2327
+
2328
+ "{message_clean}"
2329
+
2330
+ Пример ответа:
2331
+
2332
+ {{"decision": false, "explanation": "Текст не содержит клише или канцеляризмов."}}
2333
+
2334
+ Если в тексте **нет** таких выражений, **верни только** JSON {{"decision": false, "explanation": "<пояснение>"}};
2335
+
2336
+ если в тексте **есть** такие выражения, **верни только** JSON {{"decision": true, "explanation": "<пояснение>"}}.
2337
+
2338
+ **Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь только в формате JSON с закрывающими кавычками и скобками.**'''
2339
+
2340
+ response = generate_message_mistral(prompt)
2341
+ time.sleep(3)
2342
+ print("Mistral response:", response)
2343
+ result = parse_json_response(response)
2344
+ if result is not None:
2345
+ decision = result.get("decision", False)
2346
+ explanation = result.get("explanation", "")
2347
+ print("Explanation:", explanation)
2348
+ return not decision
2349
+ else:
2350
+ return None
2351
+
2352
  # ФУНКЦИИ ПРОВЕРОК (КОНЕЦ)
2353
 
2354
+
2355
  def safe_check(func, message):
2356
  try:
2357
  return func(message)
 
2379
  "derived_prepositions": safe_check(check_no_derived_prepositions, message),
2380
  "compound_sentences": safe_check(check_no_compound_sentences, message),
2381
  "dates_written_out": safe_check(check_no_dates_written_out, message),
2382
+ "no_word_repetitions": safe_check(check_no_word_repetitions, message),
2383
+ # Проверки на LLM
2384
+ "disconnected_sentences": safe_check(check_disconnected_sentences, message),
2385
+ "synonymous_members": safe_check(check_synonymous_members, message),
2386
+ "clickbait_phrases": safe_check(check_clickbait_phrases, message),
2387
+ "abstract_claims": safe_check(check_abstract_claims, message),
2388
+ "specialized_terms": safe_check(check_specialized_terms, message),
2389
+ "offensive_phrases": safe_check(check_offensive_phrases, message),
2390
+ "cliches_and_bureaucratese": safe_check(check_cliches_and_bureaucratese, message)
2391
  }
2392
  return checks
2393
 
 
2412
  "derived_prepositions": "Производные предлоги",
2413
  "compound_sentences": "Сложноподчиненные предложения",
2414
  "dates_written_out": "Даты прописью",
2415
+ "no_word_repetitions": "Повторы слов",
2416
+ # Проверки на LLM
2417
+ "disconnected_sentences": "Сложные предложения без логической связи",
2418
+ "synonymous_members": "Близкие по смыслу однородные члены предложения",
2419
+ "clickbait_phrases": "Кликбейтные фразы",
2420
+ "abstract_claims": "Абстрактные заявления без доказательств",
2421
+ "specialized_terms": "Узкоспециализированные термины",
2422
+ "offensive_phrases": "Двусмысленные или оскорбительные фразы",
2423
+ "cliches_and_bureaucratese": "Речевые клише, рекламные штампы, канцеляризмы"
2424
  }
2425
  formatted_results = []
2426
  for rule, result in checks.items():
 
2609
  corrected_gigachat_plus = gr.Textbox(label="Откорректированное сообщение 3", lines=3)
2610
  corrected_gpt4o = gr.Textbox(label="Откорректированное сообщение 4", lines=3)
2611
  corrected_meta_llama_405b = gr.Textbox(label="Откорректированное сообщение 5", lines=3)
2612
+
2613
+ # Добавляем ряд с рейтингами
2614
+ with gr.Row():
2615
+ rating_gigachat_pro = gr.Dropdown(
2616
+ choices=["1", "2", "3"],
2617
+ label="Рейтинг сообщения 1",
2618
+ value="1" # Значение по умолчанию
2619
+ )
2620
+ rating_gigachat_lite = gr.Dropdown(
2621
+ choices=["1", "2", "3"],
2622
+ label="Рейтинг сообщения 2",
2623
+ value="1"
2624
+ )
2625
+ rating_gigachat_plus = gr.Dropdown(
2626
+ choices=["1", "2", "3"],
2627
+ label="Рейтинг сообщения 3",
2628
+ value="1"
2629
+ )
2630
+ rating_gpt4o = gr.Dropdown(
2631
+ choices=["1", "2", "3"],
2632
+ label="Рейтинг сообщения 4",
2633
+ value="1"
2634
+ )
2635
+ rating_meta_llama_405b = gr.Dropdown(
2636
+ choices=["1", "2", "3"],
2637
+ label="Рейтинг сообщения 5",
2638
+ value="1"
2639
+ )
2640
+
2641
  # Пятый ряд: кнопки сохранения
2642
  with gr.Row():
2643
  save_gigachat_pro_btn = gr.Button("Сохранить в базу")
 
3674
  ]
3675
  )
3676
 
3677
+ demo.launch()