Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -21,10 +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 |
-
from
|
25 |
-
from pydantic import BaseModel, Field
|
26 |
-
from langchain_core.runnables.base import Runnable
|
27 |
-
from langchain_mistralai import ChatMistralAI
|
28 |
|
29 |
|
30 |
morph = pymorphy2.MorphAnalyzer()
|
@@ -34,12 +31,14 @@ openai_api_key = os.getenv('GPT_KEY')
|
|
34 |
gc_key = os.getenv('GC_KEY')
|
35 |
token = os.getenv('GITHUB_TOKEN')
|
36 |
TOGETHER_API_KEY = os.getenv('TOGETHER_API_KEY')
|
37 |
-
|
38 |
-
model = "open-mistral-nemo"
|
39 |
|
40 |
# Инициализация клиента для Together
|
41 |
client = Together(api_key=TOGETHER_API_KEY)
|
42 |
|
|
|
|
|
|
|
43 |
# Авторизация в сервисе GigaChat
|
44 |
chat_pro = GigaChat(credentials=gc_key, model='GigaChat-Pro', max_tokens=68, temperature=1.15, verify_ssl_certs=False)
|
45 |
chat_lite = GigaChat(credentials=gc_key, model='GigaChat', max_tokens=68, temperature=1.15, verify_ssl_certs=False)
|
@@ -1171,6 +1170,21 @@ def generate_message_meta_llama_3_1_405b_with_retry(prompt):
|
|
1171 |
return correct_dash_usage(message)
|
1172 |
return message
|
1173 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1174 |
|
1175 |
def generate_messages(description, advantages, key_message, approach, *selected_values):
|
1176 |
|
@@ -2063,77 +2077,193 @@ def check_no_word_repetitions(message):
|
|
2063 |
|
2064 |
# Проверки на LLM
|
2065 |
|
2066 |
-
|
2067 |
-
|
2068 |
-
|
2069 |
|
2070 |
-
|
2071 |
-
model=model,
|
2072 |
-
api_key=m_auth,
|
2073 |
-
temperature=0
|
2074 |
-
)
|
2075 |
|
2076 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2077 |
|
2078 |
-
# 22. Проверка сложных предложений без логической связи
|
2079 |
-
def check_disconnected_sentences(message):
|
2080 |
-
|
2081 |
-
parser = JsonOutputParser(pydantic_object=LLMAnswerParser)
|
2082 |
-
|
2083 |
-
task = '''Проверь текст на наличие сложных предложений, где отсутствует логическая связь между частями.
|
2084 |
-
Определи, есть ли в тексте предложения с несколькими частями, которые кажутся несвязанными, не поддерживают общую мысль или делают текст трудным для понимания.
|
2085 |
-
Верни ответ в виде JSON с полями reasoning в виде строки и decision в виде True или False.'''
|
2086 |
-
|
2087 |
-
return check_with_m(task, message, parser)
|
2088 |
|
2089 |
# 23. Проверка на близкие по смыслу однородные члены
|
2090 |
-
def check_synonymous_members(
|
2091 |
-
|
2092 |
-
|
2093 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2094 |
|
2095 |
return check_with_m(task, sms, parser)
|
2096 |
|
2097 |
# 24. Проверка на шокирующие, экстравагантные или кликбейтные фразы
|
2098 |
-
def check_clickbait_phrases(
|
2099 |
-
|
2100 |
-
|
2101 |
-
|
2102 |
-
|
2103 |
-
|
2104 |
-
|
2105 |
-
|
2106 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2107 |
|
2108 |
# 25. Проверка на абстрактные заявления без поддержки фактами
|
2109 |
-
def check_abstract_claims(
|
2110 |
-
|
2111 |
-
|
2112 |
-
|
2113 |
-
|
2114 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2115 |
|
2116 |
# 26. Проверка на узкоспециализированные термины
|
2117 |
-
def check_specialized_terms(
|
2118 |
-
|
2119 |
-
|
2120 |
-
|
2121 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2122 |
|
2123 |
# 27. Проверка на двусмысленные или обидные фразы
|
2124 |
-
def check_offensive_phrases(
|
2125 |
-
|
2126 |
-
|
2127 |
-
|
2128 |
-
|
2129 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2130 |
|
2131 |
# 28. Проверка на речевые клише, рекламные штампы и канцеляризмы
|
2132 |
-
def check_cliches_and_bureaucratese(
|
2133 |
-
|
2134 |
-
|
2135 |
-
|
2136 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2137 |
|
2138 |
# ФУНКЦИИ ПРОВЕРОК (КОНЕЦ)
|
2139 |
|
|
|
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)
|
|
|
1170 |
return correct_dash_usage(message)
|
1171 |
return message
|
1172 |
|
1173 |
+
def generate_message_mistral(prompt):
|
1174 |
+
try:
|
1175 |
+
chat_response = client_mistral.chat.complete(
|
1176 |
+
model="open-mistral-nemo",
|
1177 |
+
messages=[
|
1178 |
+
{
|
1179 |
+
"role": "user",
|
1180 |
+
"content": prompt,
|
1181 |
+
},
|
1182 |
+
]
|
1183 |
+
)
|
1184 |
+
cleaned_message = clean_message(chat_response.choices[0].message.content.strip())
|
1185 |
+
return cleaned_message
|
1186 |
+
except Exception as e:
|
1187 |
+
return f"Ошибка при обращении к Mistral: {e}"
|
1188 |
|
1189 |
def generate_messages(description, advantages, key_message, approach, *selected_values):
|
1190 |
|
|
|
2077 |
|
2078 |
# Проверки на LLM
|
2079 |
|
2080 |
+
# 22. Проверка сложных предложений без логической связи
|
2081 |
+
def check_disconnected_sentences(message):
|
2082 |
+
prompt = f'''Проверь следующий текст на наличие сложных предложений, где отсутствует логическая связь между частями:
|
2083 |
|
2084 |
+
"{message}"
|
|
|
|
|
|
|
|
|
2085 |
|
2086 |
+
Определи, есть ли в тексте предложения с несколькими частями, которые кажутся несвязанными, не поддерживают общую мысль или делают текст трудным для понимания.
|
2087 |
+
|
2088 |
+
Если такие предложения есть, верни JSON {{"decision": true}}; если таких предложений нет, верни JSON {{"decision": false}}.
|
2089 |
+
|
2090 |
+
Перед ответом убедись, что отвечаешь в формате JSON.
|
2091 |
+
|
2092 |
+
Пример ответа:
|
2093 |
+
|
2094 |
+
{{"decision": true}}'''
|
2095 |
+
|
2096 |
+
response = generate_message_mistral(prompt)
|
2097 |
+
print("Mistral response:", response)
|
2098 |
+
try:
|
2099 |
+
result = json.loads(response)
|
2100 |
+
decision = result.get("decision", False)
|
2101 |
+
return decision
|
2102 |
+
except Exception as e:
|
2103 |
+
print(f"Ошибка при разборе JSON: {e}")
|
2104 |
+
return None
|
2105 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2106 |
|
2107 |
# 23. Проверка на близкие по смыслу однородные члены
|
2108 |
+
def check_synonymous_members(message):
|
2109 |
+
prompt = f'''Проверь следующий текст на наличие однородных членов предложения, которые имеют близкий или одинаковый смысл:
|
2110 |
+
|
2111 |
+
"{message}"
|
2112 |
+
|
2113 |
+
Определи, есть ли в предложении несколько слов или выражений, которые передают одну и ту же идею или значение, но используются вместе.
|
2114 |
+
|
2115 |
+
Если такие слова или выражения есть, верни JSON {{"decision": true}}; если таких слов или выражений нет, верни JSON {{"decision": false}}.
|
2116 |
+
|
2117 |
+
Перед ответом убедись, что отвечаешь в формате JSON.
|
2118 |
+
|
2119 |
+
Пример ответа:
|
2120 |
+
|
2121 |
+
{{"decision": true}}'''
|
2122 |
+
|
2123 |
+
response = generate_message_mistral(prompt)
|
2124 |
+
print("Mistral response:", response)
|
2125 |
+
try:
|
2126 |
+
result = json.loads(response)
|
2127 |
+
decision = result.get("decision", False)
|
2128 |
+
return decision
|
2129 |
+
except Exception as e:
|
2130 |
+
print(f"Ошибка при разборе JSON: {e}")
|
2131 |
+
return None
|
2132 |
+
|
2133 |
|
2134 |
return check_with_m(task, sms, parser)
|
2135 |
|
2136 |
# 24. Проверка на шокирующие, экстравагантные или кликбейтные фразы
|
2137 |
+
def check_clickbait_phrases(message):
|
2138 |
+
prompt = f'''Проверь следующий текст на наличие шокирующих, экстравагантных или кликбейтных фраз:
|
2139 |
+
|
2140 |
+
"{message}"
|
2141 |
+
|
2142 |
+
Укажи, если текст содержит утверждения, которые:
|
2143 |
+
- стремятся вызвать сильные эмоции (например, шок, страх, удивление);
|
2144 |
+
- используют преувеличения, необоснованные заявления или сенсационные выражения;
|
2145 |
+
- содержат провокационные формулировки, которые побуждают к немедленному действию или реакции.
|
2146 |
+
|
2147 |
+
Если такие фразы есть, верни JSON {{"decision": true}}; если таких фраз нет, верни JSON {{"decision": false}}.
|
2148 |
+
|
2149 |
+
Перед ответом убедись, что отвечаешь в формате JSON.
|
2150 |
+
|
2151 |
+
Пример ответа:
|
2152 |
+
|
2153 |
+
{{"decision": false}}'''
|
2154 |
+
|
2155 |
+
response = generate_message_mistral(prompt)
|
2156 |
+
print("Mistral response:", response)
|
2157 |
+
try:
|
2158 |
+
result = json.loads(response)
|
2159 |
+
decision = result.get("decision", False)
|
2160 |
+
return decision
|
2161 |
+
except Exception as e:
|
2162 |
+
print(f"Ошибка при разборе JSON: {e}")
|
2163 |
+
return None
|
2164 |
|
2165 |
# 25. Проверка на абстрактные заявления без поддержки фактами
|
2166 |
+
def check_abstract_claims(message):
|
2167 |
+
prompt = f'''Проверь следующий текст на наличие абстрактных утверждений, которые не подкреплены фактами, данными или ко��кретными примерами:
|
2168 |
+
|
2169 |
+
"{message}"
|
2170 |
+
|
2171 |
+
Определи, содержит ли текст общие фразы, которые не объясняют, как клиенту будет полезен продукт или услуга.
|
2172 |
+
|
2173 |
+
Если такие утверждения есть, верни JSON {{"decision": true}}; если таких утверждений нет, верни JSON {{"decision": false}}.
|
2174 |
+
|
2175 |
+
Перед ответом убедись, что отвечаешь в формате JSON.
|
2176 |
+
|
2177 |
+
Пример ответа:
|
2178 |
+
|
2179 |
+
{{"decision": true}}'''
|
2180 |
+
|
2181 |
+
response = generate_message_mistral(prompt)
|
2182 |
+
print("Mistral response:", response)
|
2183 |
+
try:
|
2184 |
+
result = json.loads(response)
|
2185 |
+
decision = result.get("decision", False)
|
2186 |
+
return decision
|
2187 |
+
except Exception as e:
|
2188 |
+
print(f"Ошибка при разборе JSON: {e}")
|
2189 |
+
return None
|
2190 |
|
2191 |
# 26. Проверка на узкоспециализированные термины
|
2192 |
+
def check_specialized_terms(message):
|
2193 |
+
prompt = f'''Проверь следующий текст на наличие узкоспециализированных терминов, которые могут быть непонятны широкой аудитории:
|
2194 |
+
|
2195 |
+
"{message}"
|
2196 |
+
|
2197 |
+
Если в тексте есть такие термины, верни JSON {{"decision": true}}; если таких терминов нет, верни JSON {{"decision": false}}.
|
2198 |
+
|
2199 |
+
Перед ответом убедись, что отвечаешь в формате JSON.
|
2200 |
+
|
2201 |
+
Пример ответа:
|
2202 |
+
|
2203 |
+
{{"decision": false}}'''
|
2204 |
+
|
2205 |
+
response = generate_message_mistral(prompt)
|
2206 |
+
print("Mistral response:", response)
|
2207 |
+
try:
|
2208 |
+
result = json.loads(response)
|
2209 |
+
decision = result.get("decision", False)
|
2210 |
+
return decision
|
2211 |
+
except Exception as e:
|
2212 |
+
print(f"Ошибка при разборе JSON: {e}")
|
2213 |
+
return None
|
2214 |
+
|
2215 |
|
2216 |
# 27. Проверка на двусмысленные или обидные фразы
|
2217 |
+
def check_offensive_phrases(message):
|
2218 |
+
prompt = f'''Проверь следующий текст на наличие фраз, которые могут быть истолкованы двусмысленно или вызвать негативные эмоции у читателя:
|
2219 |
+
|
2220 |
+
"{message}"
|
2221 |
+
|
2222 |
+
Определи, есть ли в тексте выражения, которые могут быть восприняты как оскорбительные, обидные или неуместные.
|
2223 |
+
|
2224 |
+
Если такие фразы есть, верни JSON {{"decision": true}}; если таких фраз нет, верни JSON {{"decision": false}}.
|
2225 |
+
|
2226 |
+
Перед ответом убедись, что отвечаешь в формате JSON.
|
2227 |
+
|
2228 |
+
Пример ответа:
|
2229 |
+
|
2230 |
+
{{"decision": true}}'''
|
2231 |
+
|
2232 |
+
response = generate_message_mistral(prompt)
|
2233 |
+
print("Mistral response:", response)
|
2234 |
+
try:
|
2235 |
+
result = json.loads(response)
|
2236 |
+
decision = result.get("decision", False)
|
2237 |
+
return decision
|
2238 |
+
except Exception as e:
|
2239 |
+
print(f"Ошибка при разборе JSON: {e}")
|
2240 |
+
return None
|
2241 |
+
|
2242 |
|
2243 |
# 28. Проверка на речевые клише, рекламные штампы и канцеляризмы
|
2244 |
+
def check_cliches_and_bureaucratese(message):
|
2245 |
+
prompt = f'''Проверь следующий текст на наличие речевых клише, рекламных штампов и канцеляризмов, которые делают текст менее выразительным и оригинальным:
|
2246 |
+
|
2247 |
+
"{message}"
|
2248 |
+
|
2249 |
+
Если в тексте есть такие выражения, верни JSON {{"decision": true}}; если таких выражений нет, верни JSON {{"decision": false}}.
|
2250 |
+
|
2251 |
+
Перед ответом убедись, что отвечаешь в формате JSON.
|
2252 |
+
|
2253 |
+
Пример ответа:
|
2254 |
+
|
2255 |
+
{{"decision": false}}'''
|
2256 |
+
|
2257 |
+
response = generate_message_mistral(prompt)
|
2258 |
+
print("Mistral response:", response)
|
2259 |
+
try:
|
2260 |
+
result = json.loads(response)
|
2261 |
+
decision = result.get("decision", False)
|
2262 |
+
return decision
|
2263 |
+
except Exception as e:
|
2264 |
+
print(f"Ошибка при разборе JSON: {e}")
|
2265 |
+
return None
|
2266 |
+
|
2267 |
|
2268 |
# ФУНКЦИИ ПРОВЕРОК (КОНЕЦ)
|
2269 |
|