pentarosarium commited on
Commit
a25369d
·
1 Parent(s): b552089
Files changed (1) hide show
  1. app.py +56 -58
app.py CHANGED
@@ -32,8 +32,8 @@ class FallbackLLMSystem:
32
  def __init__(self):
33
  """Initialize fallback models for event detection and reasoning"""
34
  try:
35
- # Initialize BLOOMZ model for Russian text processing
36
- self.model_name = "bigscience/bloomz-560m" # Smaller version for efficiency
37
  self.tokenizer = AutoTokenizer.from_pretrained(self.model_name)
38
  self.model = AutoModelForSeq2SeqLM.from_pretrained(self.model_name)
39
 
@@ -41,46 +41,53 @@ class FallbackLLMSystem:
41
  self.device = "cuda" if torch.cuda.is_available() else "cpu"
42
  self.model = self.model.to(self.device)
43
 
44
- # Initialize pipeline
45
- self.pipeline = pipeline(
46
- "text2text-generation",
47
- model=self.model,
48
- tokenizer=self.tokenizer,
49
- device=0 if self.device == "cuda" else -1
50
- )
51
 
52
  except Exception as e:
53
- st.error(f"Error initializing fallback LLM system: {str(e)}")
54
  raise
55
 
56
- def detect_events(self, text, entity):
57
- """Detect events using the fallback model"""
58
- prompt = f"""Задача: Проанализируйте новость о компании и определите тип события.
59
-
60
- Компания: {entity}
61
- Новость: {text}
62
-
63
- Возможные типы событий:
64
- - Отчетность (публикация финансовых результатов)
65
- - РЦБ (события с облигациями или акциями)
66
- - Суд (судебные иски)
67
- - Нет (нет значимых событий)
68
-
69
- Формат ответа:
70
- Тип: [тип события]
71
- Краткое описание: [описание в двух предложениях]
72
-
73
- Ответ:"""
74
-
75
  try:
76
- response = self.pipeline(
77
  prompt,
 
 
 
 
 
 
 
 
78
  max_length=200,
79
  num_return_sequences=1,
80
- do_sample=False
81
- )[0]['generated_text']
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82
 
83
- # Parse response
84
  event_type = "Нет"
85
  summary = ""
86
 
@@ -92,36 +99,26 @@ class FallbackLLMSystem:
92
  return event_type, summary
93
 
94
  except Exception as e:
95
- st.warning(f"Error in fallback event detection: {str(e)}")
96
- return "Нет", ""
97
 
98
  def estimate_impact(self, text, entity):
99
- """Estimate impact using the fallback model"""
100
- prompt = f"""Задача: Оцените влияние новости на компанию.
101
-
102
- Компания: {entity}
103
- Новость: {text}
104
-
105
- Возможные категории влияния:
106
  - Значительный риск убытков
107
  - Умеренный риск убытков
108
  - Незначительный риск убытков
109
  - Вероятность прибыли
110
  - Неопределенный эффект
111
-
112
- Формат ответа:
113
- Impact: [категория]
114
- Reasoning: [объяснение в двух предложениях]
115
-
116
- Ответ:"""
117
 
118
  try:
119
- response = self.pipeline(
120
- prompt,
121
- max_length=200,
122
- num_return_sequences=1,
123
- do_sample=False
124
- )[0]['generated_text']
125
 
126
  impact = "Неопределенный эффект"
127
  reasoning = "Не удалось определить влияние"
@@ -134,7 +131,7 @@ class FallbackLLMSystem:
134
  return impact, reasoning
135
 
136
  except Exception as e:
137
- st.warning(f"Error in fallback impact estimation: {str(e)}")
138
  return "Неопределенный эффект", "Ошибка анализа"
139
 
140
 
@@ -728,15 +725,16 @@ def create_output_file(df, uploaded_file, llm):
728
  return output
729
  def main():
730
  with st.sidebar:
731
- st.title("::: AI-анализ мониторинга новостей (v.3.44 ):::")
732
  st.subheader("по материалам СКАН-ИНТЕРФАКС ")
733
 
734
 
735
 
736
  model_choice = st.radio(
737
  "Выберите модель для анализа:",
738
- ["Groq (llama-3.1-70b)", "ChatGPT-4-mini", "Qwen-Max", "Local-BLOOMZ"],
739
- key="model_selector"
 
740
  )
741
 
742
  st.markdown(
 
32
  def __init__(self):
33
  """Initialize fallback models for event detection and reasoning"""
34
  try:
35
+ # Initialize MT5 model (multilingual T5)
36
+ self.model_name = "google/mt5-small" # Smaller, efficient multilingual model
37
  self.tokenizer = AutoTokenizer.from_pretrained(self.model_name)
38
  self.model = AutoModelForSeq2SeqLM.from_pretrained(self.model_name)
39
 
 
41
  self.device = "cuda" if torch.cuda.is_available() else "cpu"
42
  self.model = self.model.to(self.device)
43
 
44
+ st.success(f"Successfully initialized MT5 model on {self.device}")
 
 
 
 
 
 
45
 
46
  except Exception as e:
47
+ st.error(f"Error initializing MT5: {str(e)}")
48
  raise
49
 
50
+ def _generate_text(self, prompt):
51
+ """Internal method for text generation with MT5"""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
52
  try:
53
+ inputs = self.tokenizer(
54
  prompt,
55
+ return_tensors="pt",
56
+ padding=True,
57
+ truncation=True,
58
+ max_length=512
59
+ ).to(self.device)
60
+
61
+ outputs = self.model.generate(
62
+ **inputs,
63
  max_length=200,
64
  num_return_sequences=1,
65
+ do_sample=False,
66
+ pad_token_id=self.tokenizer.pad_token_id
67
+ )
68
+
69
+ return self.tokenizer.decode(outputs[0], skip_special_tokens=True)
70
+ except Exception as e:
71
+ st.warning(f"Text generation error: {str(e)}")
72
+ raise
73
+
74
+ def detect_events(self, text, entity):
75
+ """Detect events using MT5"""
76
+ prompt = f"""Task: Analyze news about company and determine event type.
77
+ Company: {entity}
78
+ News: {text}
79
+ Event types:
80
+ - Отчетность (financial reports)
81
+ - РЦБ (securities market events)
82
+ - Суд (legal actions)
83
+ - Нет (no significant events)
84
+ Format:
85
+ Тип: [event type]
86
+ Краткое описание: [two sentence description]"""
87
+
88
+ try:
89
+ response = self._generate_text(prompt)
90
 
 
91
  event_type = "Нет"
92
  summary = ""
93
 
 
99
  return event_type, summary
100
 
101
  except Exception as e:
102
+ st.warning(f"Event detection error: {str(e)}")
103
+ return "Нет", "Ошибка анализа"
104
 
105
  def estimate_impact(self, text, entity):
106
+ """Estimate impact using MT5"""
107
+ prompt = f"""Task: Analyze news impact on company.
108
+ Company: {entity}
109
+ News: {text}
110
+ Impact categories:
 
 
111
  - Значительный риск убытков
112
  - Умеренный риск убытков
113
  - Незначительный риск убытков
114
  - Вероятность прибыли
115
  - Неопределенный эффект
116
+ Format:
117
+ Impact: [category]
118
+ Reasoning: [two sentence explanation]"""
 
 
 
119
 
120
  try:
121
+ response = self._generate_text(prompt)
 
 
 
 
 
122
 
123
  impact = "Неопределенный эффект"
124
  reasoning = "Не удалось определить влияние"
 
131
  return impact, reasoning
132
 
133
  except Exception as e:
134
+ st.warning(f"Impact estimation error: {str(e)}")
135
  return "Неопределенный эффект", "Ошибка анализа"
136
 
137
 
 
725
  return output
726
  def main():
727
  with st.sidebar:
728
+ st.title("::: AI-анализ мониторинга новостей (v.3.45):::")
729
  st.subheader("по материалам СКАН-ИНТЕРФАКС ")
730
 
731
 
732
 
733
  model_choice = st.radio(
734
  "Выберите модель для анализа:",
735
+ ["Local-MT5", "Groq (llama-3.1-70b)", "ChatGPT-4-mini", "Qwen-Max"],
736
+ key="model_selector",
737
+ help="Local-MT5 работает без API ключей и ограничений"
738
  )
739
 
740
  st.markdown(