Spaces:
Sleeping
Sleeping
fruitpicker01
commited on
Commit
•
b89a5cc
1
Parent(s):
1cfc5bc
Update app.py
Browse files
app.py
CHANGED
@@ -18,6 +18,7 @@ import base64
|
|
18 |
import io
|
19 |
from transformers import AutoTokenizer, AutoModel
|
20 |
from utils import best_text_choice
|
|
|
21 |
|
22 |
tokenizer = AutoTokenizer.from_pretrained("ai-forever/ru-en-RoSBERTa")
|
23 |
model = AutoModel.from_pretrained("ai-forever/ru-en-RoSBERTa")
|
@@ -188,7 +189,7 @@ def clean_message(message):
|
|
188 |
# except Exception as e:
|
189 |
# return f"Ошибка при обращении к GigaChat-Pro: {e}"
|
190 |
|
191 |
-
def generate_message_mistral_generate(prompt, max_retries=5):
|
192 |
#def generate_message_mistral_generate(prompt):
|
193 |
# try:
|
194 |
# messages = [SystemMessage(content=prompt)]
|
@@ -201,7 +202,7 @@ def generate_message_mistral_generate(prompt, max_retries=5):
|
|
201 |
retries = 0
|
202 |
while retries < max_retries:
|
203 |
try:
|
204 |
-
chat_response = client_mistral_generate.chat.
|
205 |
model="mistral-large-latest",
|
206 |
temperature=1.0,
|
207 |
min_tokens=81,
|
@@ -219,16 +220,16 @@ def generate_message_mistral_generate(prompt, max_retries=5):
|
|
219 |
error_message = str(e)
|
220 |
if "Status 429" in error_message or "Server disconnected without sending a response" in error_message:
|
221 |
wait_time = 3
|
222 |
-
print(f"
|
223 |
-
|
224 |
retries += 1
|
225 |
else:
|
226 |
-
print(f"
|
227 |
return None
|
228 |
-
print("
|
229 |
return None
|
230 |
|
231 |
-
def generate_message_mistral_check(prompt, max_retries=5):
|
232 |
#def generate_message_mistral_check(prompt):
|
233 |
# try:
|
234 |
# messages = [SystemMessage(content=prompt)]
|
@@ -240,7 +241,7 @@ def generate_message_mistral_check(prompt, max_retries=5):
|
|
240 |
retries = 0
|
241 |
while retries < max_retries:
|
242 |
try:
|
243 |
-
chat_response = client_mistral_check.chat.
|
244 |
model="mistral-large-latest",
|
245 |
temperature=0.2,
|
246 |
messages=[
|
@@ -253,14 +254,17 @@ def generate_message_mistral_check(prompt, max_retries=5):
|
|
253 |
cleaned_message = clean_message(chat_response.choices[0].message.content.strip())
|
254 |
return cleaned_message
|
255 |
except Exception as e:
|
256 |
-
|
257 |
-
|
258 |
-
|
259 |
-
|
260 |
-
|
261 |
-
|
262 |
-
|
263 |
-
|
|
|
|
|
|
|
264 |
|
265 |
#def generate_check_gigachat_pro(prompt):
|
266 |
# try:
|
@@ -545,22 +549,22 @@ def notify_failed_checks(checks):
|
|
545 |
# return last_message
|
546 |
|
547 |
|
548 |
-
def generate_message_mistral_with_retry(prompt, approach_name, description, key_message, product_name, benefits):
|
549 |
global approach_stats
|
550 |
last_message = None
|
551 |
for attempt in range(20):
|
552 |
-
gr.Info(f"
|
553 |
-
message = generate_message_mistral_generate(prompt)
|
554 |
if message is None:
|
555 |
-
print("
|
556 |
-
|
557 |
continue
|
558 |
message = replace_k_with_thousands(message)
|
559 |
message = correct_dash_usage(message)
|
560 |
message_length = len(message)
|
561 |
if not notify_failed_length(message_length):
|
562 |
last_message = message
|
563 |
-
|
564 |
continue
|
565 |
checks = perform_checks(message, description, key_message, product_name, benefits)
|
566 |
last_message = message
|
@@ -576,7 +580,7 @@ def generate_message_mistral_with_retry(prompt, approach_name, description, key_
|
|
576 |
if all(checks.values()):
|
577 |
return message
|
578 |
prompt = append_errors_to_prompt(prompt, checks)
|
579 |
-
|
580 |
gr.Info("Не удалось сгенерировать сообщение, соответствующее требованиям, за 20 итераций. Возвращаем последнее сгенерированное сообщение.")
|
581 |
return last_message
|
582 |
|
@@ -692,7 +696,7 @@ def clean_prompt_for_display(prompt, prefixes, suffixes):
|
|
692 |
return cleaned_prompt.strip()
|
693 |
|
694 |
# Функция для постепенной генерации всех сообщений через yield
|
695 |
-
def generate_all_messages(desc, benefits, key_message, gender, generation, psychotype, business_stage, industry, opf, product_name):
|
696 |
standard_prompt = generate_standard_prompt(desc, benefits, key_message)
|
697 |
standard_prompt_for_display = f"Не изменяй название продукта: {product_name}.\n{standard_prompt}\nУбедись, что в готовом тексте без изменений, синонимов и перестановок слов используется наименование продукта: {product_name}.\n"
|
698 |
approach_mapping = {
|
@@ -1261,7 +1265,7 @@ def cut_message(message):
|
|
1261 |
return message
|
1262 |
|
1263 |
# 22. Проверка сложных предложений без логической связи
|
1264 |
-
def check_disconnected_sentences(message):
|
1265 |
message_clean = cut_message(message)
|
1266 |
print()
|
1267 |
print("Проверка 22: Проверка сложных предложений без логической связи")
|
@@ -1276,8 +1280,8 @@ def check_disconnected_sentences(message):
|
|
1276 |
если таких предложений **нет**, **верни только** JSON {{"decision": false, "explanation": "<пояснение>"}}.
|
1277 |
**Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь **только** в формате JSON с закрывающими кавычками и скобками.**'''
|
1278 |
|
1279 |
-
response = generate_message_mistral_check(prompt)
|
1280 |
-
|
1281 |
print("Mistral response:", response) # Выводим полный ответ модели
|
1282 |
result = parse_json_response(response)
|
1283 |
if result is not None:
|
@@ -1289,7 +1293,7 @@ def check_disconnected_sentences(message):
|
|
1289 |
return None
|
1290 |
|
1291 |
# 23. Проверка на близкие по смыслу однородные члены
|
1292 |
-
def check_synonymous_members(message):
|
1293 |
print()
|
1294 |
print("Проверка 23: Проверка на близкие по смыслу однородные члены")
|
1295 |
print()
|
@@ -1303,8 +1307,8 @@ def check_synonymous_members(message):
|
|
1303 |
если таких слов или выражений нет, **верни только** JSON {{"decision": false, "explanation": "<пояснение>"}}.
|
1304 |
**Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь только в формате JSON с закрывающими кавычками и скобками.**'''
|
1305 |
|
1306 |
-
response = generate_message_mistral_check(prompt)
|
1307 |
-
|
1308 |
print("Mistral response:", response)
|
1309 |
result = parse_json_response(response)
|
1310 |
if result is not None:
|
@@ -1317,7 +1321,7 @@ def check_synonymous_members(message):
|
|
1317 |
|
1318 |
|
1319 |
# 24. Проверка на шокирующие, экстравагантные или кликбейтные фразы
|
1320 |
-
def check_clickbait_phrases(message, description, benefits):
|
1321 |
message_clean = cut_message(message)
|
1322 |
print()
|
1323 |
print()
|
@@ -1341,8 +1345,8 @@ def check_clickbait_phrases(message, description, benefits):
|
|
1341 |
|
1342 |
**Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь только в формате JSON с закрывающими кавычками и скобками.**'''
|
1343 |
|
1344 |
-
response = generate_message_mistral_check(prompt)
|
1345 |
-
|
1346 |
print("Mistral response:", response)
|
1347 |
result = parse_json_response(response)
|
1348 |
if result is not None:
|
@@ -1355,7 +1359,7 @@ def check_clickbait_phrases(message, description, benefits):
|
|
1355 |
|
1356 |
|
1357 |
# 25. Проверка на абстрактные заявления без поддержки фактами
|
1358 |
-
def check_abstract_claims(message, description, benefits):
|
1359 |
print()
|
1360 |
print("Проверка 25: Проверка на абстрактные заявления без поддержки фактами")
|
1361 |
print()
|
@@ -1393,8 +1397,8 @@ def check_abstract_claims(message, description, benefits):
|
|
1393 |
|
1394 |
**Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь только в формате JSON с закрывающими кавычками и скобками.**'''
|
1395 |
|
1396 |
-
response = generate_message_mistral_check(prompt)
|
1397 |
-
|
1398 |
print("Mistral response:", response)
|
1399 |
result = parse_json_response(response)
|
1400 |
if result is not None:
|
@@ -1407,7 +1411,7 @@ def check_abstract_claims(message, description, benefits):
|
|
1407 |
|
1408 |
|
1409 |
# 26. Проверка на узкоспециализированные термины
|
1410 |
-
def check_specialized_terms(message):
|
1411 |
print()
|
1412 |
print("Проверка 26: Проверка на узкоспециализированные термины")
|
1413 |
print()
|
@@ -1430,8 +1434,8 @@ def check_specialized_terms(message):
|
|
1430 |
|
1431 |
**Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь только в формате JSON с закрывающими кавычками и скобками.**'''
|
1432 |
|
1433 |
-
response = generate_message_mistral_check(prompt)
|
1434 |
-
|
1435 |
print("Mistral response:", response)
|
1436 |
result = parse_json_response(response)
|
1437 |
if result is not None:
|
@@ -1443,7 +1447,7 @@ def check_specialized_terms(message):
|
|
1443 |
return None
|
1444 |
|
1445 |
# 27. Проверка на двусмысленные или обидные фразы
|
1446 |
-
def check_offensive_phrases(message):
|
1447 |
print()
|
1448 |
print("Проверка 27: Проверка на двусмысленные или обидные фразы")
|
1449 |
print()
|
@@ -1459,8 +1463,8 @@ def check_offensive_phrases(message):
|
|
1459 |
если таких фраз нет, **верни только** JSON {{"decision": false, "explanation": "<пояснение>"}}.
|
1460 |
**Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь только в формате JSON с закрывающими кавычками и скобками.**'''
|
1461 |
|
1462 |
-
response = generate_message_mistral_check(prompt)
|
1463 |
-
|
1464 |
print("Mistral response:", response)
|
1465 |
result = parse_json_response(response)
|
1466 |
if result is not None:
|
@@ -1472,7 +1476,7 @@ def check_offensive_phrases(message):
|
|
1472 |
return None
|
1473 |
|
1474 |
# 28. Проверка на речевые клише, рекламные штампы и канцеляризмы
|
1475 |
-
def check_cliches_and_bureaucratese(message, description, benefits):
|
1476 |
print()
|
1477 |
print("Проверка 28: Проверка на речевые клише, рекламные штампы и канцеляризмы")
|
1478 |
print()
|
@@ -1504,8 +1508,8 @@ def check_cliches_and_bureaucratese(message, description, benefits):
|
|
1504 |
если в тексте **есть** такие выражения, **верни только** JSON {{"decision": true, "explanation": "<пояснение>"}}.
|
1505 |
**Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь только в формате JSON с закрывающими кавычками и скобками.**'''
|
1506 |
|
1507 |
-
response = generate_message_mistral_check(prompt)
|
1508 |
-
|
1509 |
print("Mistral response:", response)
|
1510 |
result = parse_json_response(response)
|
1511 |
if result is not None:
|
@@ -1517,7 +1521,7 @@ def check_cliches_and_bureaucratese(message, description, benefits):
|
|
1517 |
return None
|
1518 |
|
1519 |
# 29. Проверка на соответствие описанию предложения и ключевому сообщению
|
1520 |
-
def check_no_contradictions(message, description, key_message):
|
1521 |
print()
|
1522 |
print("Проверка 29: Проверка на отсутствие противоречий с описанием предложения")
|
1523 |
print()
|
@@ -1533,8 +1537,8 @@ def check_no_contradictions(message, description, key_message):
|
|
1533 |
Если сообщение содержит факты, которые отсутствуют в описании предложения и ключевом сообщении, **верни только** JSON {{"decision": true, "explanation": "<описание противоречий>"}}.
|
1534 |
**Не добавляй никакого дополнительного текста. Отвечай только в формате JSON с закрывающими кавычками и скобками.**'''
|
1535 |
|
1536 |
-
response = generate_message_mistral_check(prompt)
|
1537 |
-
|
1538 |
print("Mistral response:", response)
|
1539 |
result = parse_json_response(response)
|
1540 |
if result is not None:
|
@@ -1546,7 +1550,7 @@ def check_no_contradictions(message, description, key_message):
|
|
1546 |
return None
|
1547 |
|
1548 |
# 30. Проверка на наличие ключевого сообщения
|
1549 |
-
def check_contains_key_message(message, key_message):
|
1550 |
print()
|
1551 |
print("Проверка 30: Проверка на наличие ключевого сообщения")
|
1552 |
print()
|
@@ -1560,8 +1564,8 @@ def check_contains_key_message(message, key_message):
|
|
1560 |
Если сообщение **не содержит всю** информацию из ключевого текста, **верни только** JSON {{"decision": true, "explanation": "Ключевое текст отсутствует."}}.
|
1561 |
**Не добавляй никакого дополнительного текста. Отвечай только в формате JSON с закрывающими кавычками и скобками.**'''
|
1562 |
|
1563 |
-
response = generate_message_mistral_check(prompt)
|
1564 |
-
|
1565 |
print("Mistral response:", response)
|
1566 |
result = parse_json_response(response)
|
1567 |
if result is not None:
|
@@ -1573,7 +1577,7 @@ def check_contains_key_message(message, key_message):
|
|
1573 |
return None
|
1574 |
|
1575 |
# 31. Проверка на точное совпадение названий продуктов
|
1576 |
-
def check_product_name_consistency(message, product_name):
|
1577 |
print()
|
1578 |
print("Проверка 31: Проверка на точное совпадение названий продуктов")
|
1579 |
print()
|
@@ -1590,8 +1594,8 @@ def check_product_name_consistency(message, product_name):
|
|
1590 |
Если название продукта **не** совпадает, **верни только** JSON {{"decision": true, "explanation": "<описание несоответствия>"}}.
|
1591 |
**Не добавляй никакого дополнительного текста. Ответ должен быть только в формате JSON с закрывающими кавычками и скобками.**'''
|
1592 |
|
1593 |
-
response = generate_message_mistral_check(prompt)
|
1594 |
-
|
1595 |
print("Mistral response:", response)
|
1596 |
result = parse_json_response(response)
|
1597 |
if result is not None:
|
@@ -1605,15 +1609,14 @@ def check_product_name_consistency(message, product_name):
|
|
1605 |
# ФУНКЦИИ ПРОВЕРОК (КОНЕЦ)
|
1606 |
|
1607 |
|
1608 |
-
def safe_check(func, *args):
|
1609 |
try:
|
1610 |
-
return func(*args)
|
1611 |
except Exception as e:
|
1612 |
-
|
1613 |
-
|
1614 |
-
return None # Indicate that the check could not be performed
|
1615 |
|
1616 |
-
def perform_checks(message, description, key_message, product_name, benefits):
|
1617 |
checks = {}
|
1618 |
|
1619 |
# 2. Morphological checks using pymorphy3
|
@@ -1659,7 +1662,7 @@ def perform_checks(message, description, key_message, product_name, benefits):
|
|
1659 |
|
1660 |
# Perform morphological checks
|
1661 |
for check_name, check_func in morphological_checks:
|
1662 |
-
result = safe_check(check_func, message)
|
1663 |
checks[check_name] = result
|
1664 |
if result is False:
|
1665 |
return checks # Stop on first failure
|
@@ -1667,19 +1670,19 @@ def perform_checks(message, description, key_message, product_name, benefits):
|
|
1667 |
# Perform LLM checks group 1
|
1668 |
for check_name, check_func in llm_checks_group1:
|
1669 |
if check_name == "no_contradictions":
|
1670 |
-
result = safe_check(check_func, message, description, key_message)
|
1671 |
elif check_name == "contains_key_message":
|
1672 |
-
result = safe_check(check_func, message, key_message)
|
1673 |
elif check_name == "product_name_consistency":
|
1674 |
-
result = safe_check(check_func, message, product_name)
|
1675 |
elif check_name == "clickbait_phrases":
|
1676 |
-
result = safe_check(check_func, message, description, benefits)
|
1677 |
elif check_name == "abstract_claims":
|
1678 |
-
result = safe_check(check_func, message, description, benefits)
|
1679 |
elif check_name == "cliches_and_bureaucratese":
|
1680 |
-
result = safe_check(check_func, message, description, benefits)
|
1681 |
else:
|
1682 |
-
result = safe_check(check_func, message)
|
1683 |
checks[check_name] = result
|
1684 |
if result is False:
|
1685 |
return checks
|
@@ -1687,7 +1690,7 @@ def perform_checks(message, description, key_message, product_name, benefits):
|
|
1687 |
|
1688 |
# Perform remaining LLM checks
|
1689 |
for check_name, check_func in llm_checks_group2:
|
1690 |
-
result = safe_check(check_func, message)
|
1691 |
checks[check_name] = result
|
1692 |
if result is False:
|
1693 |
return checks # Stop on first failure
|
|
|
18 |
import io
|
19 |
from transformers import AutoTokenizer, AutoModel
|
20 |
from utils import best_text_choice
|
21 |
+
import asyncio
|
22 |
|
23 |
tokenizer = AutoTokenizer.from_pretrained("ai-forever/ru-en-RoSBERTa")
|
24 |
model = AutoModel.from_pretrained("ai-forever/ru-en-RoSBERTa")
|
|
|
189 |
# except Exception as e:
|
190 |
# return f"Ошибка при обращении к GigaChat-Pro: {e}"
|
191 |
|
192 |
+
async def generate_message_mistral_generate(prompt, max_retries=5):
|
193 |
#def generate_message_mistral_generate(prompt):
|
194 |
# try:
|
195 |
# messages = [SystemMessage(content=prompt)]
|
|
|
202 |
retries = 0
|
203 |
while retries < max_retries:
|
204 |
try:
|
205 |
+
chat_response = await client_mistral_generate.chat.complete_async(
|
206 |
model="mistral-large-latest",
|
207 |
temperature=1.0,
|
208 |
min_tokens=81,
|
|
|
220 |
error_message = str(e)
|
221 |
if "Status 429" in error_message or "Server disconnected without sending a response" in error_message:
|
222 |
wait_time = 3
|
223 |
+
print(f"Rate limit exceeded or server did not respond. Waiting {wait_time} seconds before retrying...")
|
224 |
+
await asyncio.sleep(wait_time)
|
225 |
retries += 1
|
226 |
else:
|
227 |
+
print(f"Error calling Mistral: {e}")
|
228 |
return None
|
229 |
+
print("Failed to get response from Mistral after maximum retries.")
|
230 |
return None
|
231 |
|
232 |
+
async def generate_message_mistral_check(prompt, max_retries=5):
|
233 |
#def generate_message_mistral_check(prompt):
|
234 |
# try:
|
235 |
# messages = [SystemMessage(content=prompt)]
|
|
|
241 |
retries = 0
|
242 |
while retries < max_retries:
|
243 |
try:
|
244 |
+
chat_response = await client_mistral_check.chat.complete_async(
|
245 |
model="mistral-large-latest",
|
246 |
temperature=0.2,
|
247 |
messages=[
|
|
|
254 |
cleaned_message = clean_message(chat_response.choices[0].message.content.strip())
|
255 |
return cleaned_message
|
256 |
except Exception as e:
|
257 |
+
error_message = str(e)
|
258 |
+
if "Status 429" in error_message or "Server disconnected without sending a response" in error_message:
|
259 |
+
wait_time = 3
|
260 |
+
print(f"Rate limit exceeded or server did not respond. Waiting {wait_time} seconds before retrying...")
|
261 |
+
await asyncio.sleep(wait_time)
|
262 |
+
retries += 1
|
263 |
+
else:
|
264 |
+
print(f"Error calling Mistral: {e}")
|
265 |
+
return None
|
266 |
+
print("Failed to get response from Mistral after maximum retries.")
|
267 |
+
return None
|
268 |
|
269 |
#def generate_check_gigachat_pro(prompt):
|
270 |
# try:
|
|
|
549 |
# return last_message
|
550 |
|
551 |
|
552 |
+
async def generate_message_mistral_with_retry(prompt, approach_name, description, key_message, product_name, benefits):
|
553 |
global approach_stats
|
554 |
last_message = None
|
555 |
for attempt in range(20):
|
556 |
+
gr.Info(f"Iteration {attempt + 1}: generating message...")
|
557 |
+
message = await generate_message_mistral_generate(prompt)
|
558 |
if message is None:
|
559 |
+
print("Failed to get message from Mistral, retrying...")
|
560 |
+
await asyncio.sleep(1)
|
561 |
continue
|
562 |
message = replace_k_with_thousands(message)
|
563 |
message = correct_dash_usage(message)
|
564 |
message_length = len(message)
|
565 |
if not notify_failed_length(message_length):
|
566 |
last_message = message
|
567 |
+
await asyncio.sleep(1)
|
568 |
continue
|
569 |
checks = perform_checks(message, description, key_message, product_name, benefits)
|
570 |
last_message = message
|
|
|
580 |
if all(checks.values()):
|
581 |
return message
|
582 |
prompt = append_errors_to_prompt(prompt, checks)
|
583 |
+
await asyncio.sleep(1)
|
584 |
gr.Info("Не удалось сгенерировать сообщение, соответствующее требованиям, за 20 итераций. Возвращаем последнее сгенерированное сообщение.")
|
585 |
return last_message
|
586 |
|
|
|
696 |
return cleaned_prompt.strip()
|
697 |
|
698 |
# Функция для постепенной генерации всех сообщений через yield
|
699 |
+
async def generate_all_messages(desc, benefits, key_message, gender, generation, psychotype, business_stage, industry, opf, product_name):
|
700 |
standard_prompt = generate_standard_prompt(desc, benefits, key_message)
|
701 |
standard_prompt_for_display = f"Не изменяй название продукта: {product_name}.\n{standard_prompt}\nУбедись, что в готовом тексте без изменений, синонимов и перестановок слов используется наименование продукта: {product_name}.\n"
|
702 |
approach_mapping = {
|
|
|
1265 |
return message
|
1266 |
|
1267 |
# 22. Проверка сложных предложений без логической связи
|
1268 |
+
async def check_disconnected_sentences(message):
|
1269 |
message_clean = cut_message(message)
|
1270 |
print()
|
1271 |
print("Проверка 22: Проверка сложных предложений без логической связи")
|
|
|
1280 |
если таких предложений **нет**, **верни только** JSON {{"decision": false, "explanation": "<пояснение>"}}.
|
1281 |
**Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь **только** в формате JSON с закрывающими кавычками и скобками.**'''
|
1282 |
|
1283 |
+
response = async generate_message_mistral_check(prompt)
|
1284 |
+
await asyncio.sleep(3) # Задержка в 3 секунды между запросами
|
1285 |
print("Mistral response:", response) # Выводим полный ответ модели
|
1286 |
result = parse_json_response(response)
|
1287 |
if result is not None:
|
|
|
1293 |
return None
|
1294 |
|
1295 |
# 23. Проверка на близкие по смыслу однородные члены
|
1296 |
+
async def check_synonymous_members(message):
|
1297 |
print()
|
1298 |
print("Проверка 23: Проверка на близкие по смыслу однородные члены")
|
1299 |
print()
|
|
|
1307 |
если таких слов или выражений нет, **верни только** JSON {{"decision": false, "explanation": "<пояснение>"}}.
|
1308 |
**Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь только в формате JSON с закрывающими кавычками и скобками.**'''
|
1309 |
|
1310 |
+
response = async generate_message_mistral_check(prompt)
|
1311 |
+
await asyncio.sleep(3)
|
1312 |
print("Mistral response:", response)
|
1313 |
result = parse_json_response(response)
|
1314 |
if result is not None:
|
|
|
1321 |
|
1322 |
|
1323 |
# 24. Проверка на шокирующие, экстравагантные или кликбейтные фразы
|
1324 |
+
async def check_clickbait_phrases(message, description, benefits):
|
1325 |
message_clean = cut_message(message)
|
1326 |
print()
|
1327 |
print()
|
|
|
1345 |
|
1346 |
**Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь только в формате JSON с закрывающими кавычками и скобками.**'''
|
1347 |
|
1348 |
+
response = async generate_message_mistral_check(prompt)
|
1349 |
+
await asyncio.sleep(3)
|
1350 |
print("Mistral response:", response)
|
1351 |
result = parse_json_response(response)
|
1352 |
if result is not None:
|
|
|
1359 |
|
1360 |
|
1361 |
# 25. Проверка на абстрактные заявления без поддержки фактами
|
1362 |
+
async def check_abstract_claims(message, description, benefits):
|
1363 |
print()
|
1364 |
print("Проверка 25: Проверка на абстрактные заявления без поддержки фактами")
|
1365 |
print()
|
|
|
1397 |
|
1398 |
**Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь только в формате JSON с закрывающими кавычками и скобками.**'''
|
1399 |
|
1400 |
+
response = async generate_message_mistral_check(prompt)
|
1401 |
+
await asyncio.sleep(3)
|
1402 |
print("Mistral response:", response)
|
1403 |
result = parse_json_response(response)
|
1404 |
if result is not None:
|
|
|
1411 |
|
1412 |
|
1413 |
# 26. Проверка на узкоспециализированные термины
|
1414 |
+
async def check_specialized_terms(message):
|
1415 |
print()
|
1416 |
print("Проверка 26: Проверка на узкоспециализированные термины")
|
1417 |
print()
|
|
|
1434 |
|
1435 |
**Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь только в формате JSON с закрывающими кавычками и скобками.**'''
|
1436 |
|
1437 |
+
response = async generate_message_mistral_check(prompt)
|
1438 |
+
await asyncio.sleep(3)
|
1439 |
print("Mistral response:", response)
|
1440 |
result = parse_json_response(response)
|
1441 |
if result is not None:
|
|
|
1447 |
return None
|
1448 |
|
1449 |
# 27. Проверка на двусмысленные или обидные фразы
|
1450 |
+
async def check_offensive_phrases(message):
|
1451 |
print()
|
1452 |
print("Проверка 27: Проверка на двусмысленные или обидные фразы")
|
1453 |
print()
|
|
|
1463 |
если таких фраз нет, **верни только** JSON {{"decision": false, "explanation": "<пояснение>"}}.
|
1464 |
**Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь только в формате JSON с закрывающими кавычками и скобками.**'''
|
1465 |
|
1466 |
+
response = async generate_message_mistral_check(prompt)
|
1467 |
+
await asyncio.sleep(3)
|
1468 |
print("Mistral response:", response)
|
1469 |
result = parse_json_response(response)
|
1470 |
if result is not None:
|
|
|
1476 |
return None
|
1477 |
|
1478 |
# 28. Проверка на речевые клише, рекламные штампы и канцеляризмы
|
1479 |
+
async def check_cliches_and_bureaucratese(message, description, benefits):
|
1480 |
print()
|
1481 |
print("Проверка 28: Проверка на речевые клише, рекламные штампы и канцеляризмы")
|
1482 |
print()
|
|
|
1508 |
если в тексте **есть** такие выражения, **верни только** JSON {{"decision": true, "explanation": "<пояснение>"}}.
|
1509 |
**Не добавляй никакого дополнительного текста. Перед ответом убедись, что отвечаешь только в формате JSON с закрывающими кавычками и скобками.**'''
|
1510 |
|
1511 |
+
response = async generate_message_mistral_check(prompt)
|
1512 |
+
await asyncio.sleep(3)
|
1513 |
print("Mistral response:", response)
|
1514 |
result = parse_json_response(response)
|
1515 |
if result is not None:
|
|
|
1521 |
return None
|
1522 |
|
1523 |
# 29. Проверка на соответствие описанию предложения и ключевому сообщению
|
1524 |
+
async def check_no_contradictions(message, description, key_message):
|
1525 |
print()
|
1526 |
print("Проверка 29: Проверка на отсутствие противоречий с описанием предложения")
|
1527 |
print()
|
|
|
1537 |
Если сообщение содержит факты, которые отсутствуют в описании предложения и ключевом сообщении, **верни только** JSON {{"decision": true, "explanation": "<описание противоречий>"}}.
|
1538 |
**Не добавляй никакого дополнительного текста. Отвечай только в формате JSON с закрывающими кавычками и скобками.**'''
|
1539 |
|
1540 |
+
response = async generate_message_mistral_check(prompt)
|
1541 |
+
await asyncio.sleep(3)
|
1542 |
print("Mistral response:", response)
|
1543 |
result = parse_json_response(response)
|
1544 |
if result is not None:
|
|
|
1550 |
return None
|
1551 |
|
1552 |
# 30. Проверка на наличие ключевого сообщения
|
1553 |
+
async def check_contains_key_message(message, key_message):
|
1554 |
print()
|
1555 |
print("Проверка 30: Проверка на наличие ключевого сообщения")
|
1556 |
print()
|
|
|
1564 |
Если сообщение **не содержит всю** информацию из ключевого текста, **верни только** JSON {{"decision": true, "explanation": "Ключевое текст отсутствует."}}.
|
1565 |
**Не добавляй никакого дополнительного текста. Отвечай только в формате JSON с закрывающими кавычками и скобками.**'''
|
1566 |
|
1567 |
+
response = async generate_message_mistral_check(prompt)
|
1568 |
+
await asyncio.sleep(3)
|
1569 |
print("Mistral response:", response)
|
1570 |
result = parse_json_response(response)
|
1571 |
if result is not None:
|
|
|
1577 |
return None
|
1578 |
|
1579 |
# 31. Проверка на точное совпадение названий продуктов
|
1580 |
+
async def check_product_name_consistency(message, product_name):
|
1581 |
print()
|
1582 |
print("Проверка 31: Проверка на точное совпадение названий продуктов")
|
1583 |
print()
|
|
|
1594 |
Если название продукта **не** совпадает, **верни только** JSON {{"decision": true, "explanation": "<описание несоответствия>"}}.
|
1595 |
**Не добавляй никакого дополнительного текста. Ответ должен быть только в формате JSON с закрывающими кавычками и скобками.**'''
|
1596 |
|
1597 |
+
response = async generate_message_mistral_check(prompt)
|
1598 |
+
await asyncio.sleep(3)
|
1599 |
print("Mistral response:", response)
|
1600 |
result = parse_json_response(response)
|
1601 |
if result is not None:
|
|
|
1609 |
# ФУНКЦИИ ПРОВЕРОК (КОНЕЦ)
|
1610 |
|
1611 |
|
1612 |
+
async def safe_check(func, *args):
|
1613 |
try:
|
1614 |
+
return await func(*args)
|
1615 |
except Exception as e:
|
1616 |
+
print(f"Error in {func.__name__}: {e}")
|
1617 |
+
return None
|
|
|
1618 |
|
1619 |
+
async def perform_checks(message, description, key_message, product_name, benefits):
|
1620 |
checks = {}
|
1621 |
|
1622 |
# 2. Morphological checks using pymorphy3
|
|
|
1662 |
|
1663 |
# Perform morphological checks
|
1664 |
for check_name, check_func in morphological_checks:
|
1665 |
+
result = async safe_check(check_func, message)
|
1666 |
checks[check_name] = result
|
1667 |
if result is False:
|
1668 |
return checks # Stop on first failure
|
|
|
1670 |
# Perform LLM checks group 1
|
1671 |
for check_name, check_func in llm_checks_group1:
|
1672 |
if check_name == "no_contradictions":
|
1673 |
+
result = async safe_check(check_func, message, description, key_message)
|
1674 |
elif check_name == "contains_key_message":
|
1675 |
+
result = async safe_check(check_func, message, key_message)
|
1676 |
elif check_name == "product_name_consistency":
|
1677 |
+
result = async safe_check(check_func, message, product_name)
|
1678 |
elif check_name == "clickbait_phrases":
|
1679 |
+
result = async safe_check(check_func, message, description, benefits)
|
1680 |
elif check_name == "abstract_claims":
|
1681 |
+
result = async safe_check(check_func, message, description, benefits)
|
1682 |
elif check_name == "cliches_and_bureaucratese":
|
1683 |
+
result = async safe_check(check_func, message, description, benefits)
|
1684 |
else:
|
1685 |
+
result = async safe_check(check_func, message)
|
1686 |
checks[check_name] = result
|
1687 |
if result is False:
|
1688 |
return checks
|
|
|
1690 |
|
1691 |
# Perform remaining LLM checks
|
1692 |
for check_name, check_func in llm_checks_group2:
|
1693 |
+
result = async safe_check(check_func, message)
|
1694 |
checks[check_name] = result
|
1695 |
if result is False:
|
1696 |
return checks # Stop on first failure
|