Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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 |
-
"
|
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 |
-
"
|
933 |
"1. Перепиши сообщение для адаптации, сохранив его смысл.\n"
|
934 |
-
"2. Используй стиль, построение предложений и лексику, максимально похожие на
|
935 |
-
"3. НЕ ДОБАВЛЯЙ факты, цифры, или любую информацию из
|
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()
|
|