fruitpicker01 commited on
Commit
31e8af8
·
verified ·
1 Parent(s): d7ec2d4

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +190 -60
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 langchain_core.output_parsers import JsonOutputParser
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
- m_auth = os.getenv('MISTRAL_API_KEY')
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
- class LLMAnswerParser(BaseModel):
2067
- reasoning: str = Field(description='Рассуждения')
2068
- decision: bool = Field(description='True или False')
2069
 
2070
- llm = ChatMistralAI(
2071
- model=model,
2072
- api_key=m_auth,
2073
- temperature=0
2074
- )
2075
 
2076
- parser = JsonOutputParser(pydantic_object=LLMAnswerParser)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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(sms, parser):
2091
- task = '''Проверь текст на наличие однородных членов предложения, которые имеют близкий или одинаковый смысл.
2092
- Определи, есть ли в предложении ��есколько слов или выражений, которые передают одну и ту же идею или значение, но используются вместе.
2093
- Верни ответ в виде JSON с полями reasoning в виде строки и decision в виде True или False.'''
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2094
 
2095
  return check_with_m(task, sms, parser)
2096
 
2097
  # 24. Проверка на шокирующие, экстравагантные или кликбейтные фразы
2098
- def check_clickbait_phrases(sms, parser):
2099
- task = '''Проверь СМС на наличие шокирующих, экстравагантных или кликбейтных фраз.
2100
- Укажи, если текст содержит утверждения, которые:
2101
- - стремятся вызвать сильные эмоции (например, шок, страх, удивление);
2102
- - используют преувеличения, необоснованные заявления или сенсационные выражения;
2103
- - содержат провокационные формулировки, которые побуждают к немедленному действию или реакции.
2104
- Верни ответ в виде JSON с полями reasoning в виде строки и decision в виде True или False.'''
2105
-
2106
- return check_with_m(task, sms, parser)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2107
 
2108
  # 25. Проверка на абстрактные заявления без поддержки фактами
2109
- def check_abstract_claims(sms, parser):
2110
- task = '''Проверь текст на наличие абстрактных утверждений, которые не подкреплены фактами, данными или конкретными примерами.
2111
- Определи, содержит ли текст общие фразы, которые не объясняют, как клиенту будет полезен продукт или услуга.
2112
- Верни ответ в виде JSON с полями reasoning в виде строки и decision в виде True или False.'''
2113
-
2114
- return check_with_m(task, sms, parser)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2115
 
2116
  # 26. Проверка на узкоспециализированные термины
2117
- def check_specialized_terms(sms, parser):
2118
- task = '''Проверь текст на наличие узкоспециализированных терминов, которые могут быть непонятны широкой аудитории.
2119
- Верни ответ в виде JSON с полями reasoning в виде строки и decision в виде True или False.'''
2120
-
2121
- return check_with_m(task, sms, parser)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2122
 
2123
  # 27. Проверка на двусмысленные или обидные фразы
2124
- def check_offensive_phrases(sms, parser):
2125
- task = '''Проверь текст на наличие фраз, которые могут быть истолкованы двусмысленно или вызвать негативные эмоции у читателя.
2126
- Определи, есть ли в тексте выражения, которые могут быть восприняты как оскорбительные, обидные или неуместные.
2127
- Верни ответ в виде JSON с полями reasoning в виде строки и decision в виде True или False.'''
2128
-
2129
- return check_with_m(task, sms, parser)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2130
 
2131
  # 28. Проверка на речевые клише, рекламные штампы и канцеляризмы
2132
- def check_cliches_and_bureaucratese(sms, parser):
2133
- task = '''Проверь текст на наличие речевых клише, рекламных штампов и канцеляризмов, которые делают текст менее выразительным и оригинальным.
2134
- Верни ответ в виде JSON с полями reasoning в виде строки и decision в виде True или False.'''
2135
-
2136
- return check_with_m(task, sms, parser)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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