Nikolay Ponomarev commited on
Commit
9a0dcc6
·
1 Parent(s): bdae50a

Item Search

Browse files
Files changed (1) hide show
  1. app.py +28 -19
app.py CHANGED
@@ -11,7 +11,7 @@ from transformers import pipeline
11
  DEFAULT_INTENT_MODEL = os.getenv("INTENT_MODEL", "joeddav/xlm-roberta-large-xnli")
12
 
13
  # 2) Checklist generator
14
- DEFAULT_GEN_MODEL = os.getenv("GEN_MODEL", "cointegrated/rut5-base")
15
 
16
  # 3) QA over checklist
17
  DEFAULT_QA_MODEL = os.getenv("QA_MODEL", "deepset/xlm-roberta-base-squad2")
@@ -47,7 +47,7 @@ intent_pipe, intent_model_used = safe_make_pipeline(
47
  DEFAULT_INTENT_MODEL,
48
  )
49
  gen_pipe, gen_model_used = safe_make_pipeline(
50
- "text2text-generation",
51
  DEFAULT_GEN_MODEL,
52
  )
53
  qa_pipe, qa_model_used = safe_make_pipeline(
@@ -99,27 +99,25 @@ def infer_intent(user_goal: str, labels: list[str]):
99
 
100
 
101
  def build_checklist_prompt(user_goal: str, theme: str | None, style: str, constraints: str):
102
- """
103
- Prompt for generator model.
104
- """
105
- theme_part = f"Тема (если помогает): {theme}\n" if theme else ""
106
- constraints_part = f"Ограничения/контекст: {constraints}\n" if constraints else ""
107
 
108
- # Works for mt5/flan-t5 style models; they respond better to clear structure.
109
  return (
110
  "Ты — помощник, который делает практичные чек-листы.\n"
111
- "Сформируй чек-лист так, чтобы обычный пользователь мог выполнить задачу.\n"
 
 
 
112
  "Требования:\n"
113
- "- Выведи 8–15 пунктов максимум.\n"
114
- "- Каждый пункт в формате: '- [ ] ...'\n"
115
- "- Где уместно, добавляй краткие подпункты (через ' - ...').\n"
116
- "- Делай пункты измеримыми и конкретными.\n"
117
- "- В конце добавь блок 'Проверка готовности' (3–5 вопросов) и блок 'Риски и как снизить'.\n"
118
- "- Пиши по-русски.\n\n"
119
- f"Стиль: {style}\n"
120
  f"{theme_part}"
121
  f"{constraints_part}"
122
- f"Задача пользователя: {user_goal}\n\n"
123
  "Чек-лист:\n"
124
  )
125
 
@@ -160,11 +158,22 @@ def generate_checklist(user_goal: str, category: str, style: str, constraints: s
160
  out = gen_pipe(
161
  prompt,
162
  max_new_tokens=450,
163
- do_sample=False,
164
- num_beams=4,
 
 
 
165
  )
166
  text = (out[0].get("generated_text") or "").strip()
167
 
 
 
 
 
 
 
 
 
168
  # Если модель вернула пусто/слишком коротко — повторим с более "толкающими" параметрами
169
  if len(text) < 80:
170
  short_prompt = (
 
11
  DEFAULT_INTENT_MODEL = os.getenv("INTENT_MODEL", "joeddav/xlm-roberta-large-xnli")
12
 
13
  # 2) Checklist generator
14
+ DEFAULT_GEN_MODEL = os.getenv("GEN_MODEL", "Qwen/Qwen2.5-0.5B-Instruct")
15
 
16
  # 3) QA over checklist
17
  DEFAULT_QA_MODEL = os.getenv("QA_MODEL", "deepset/xlm-roberta-base-squad2")
 
47
  DEFAULT_INTENT_MODEL,
48
  )
49
  gen_pipe, gen_model_used = safe_make_pipeline(
50
+ "text-generation",
51
  DEFAULT_GEN_MODEL,
52
  )
53
  qa_pipe, qa_model_used = safe_make_pipeline(
 
99
 
100
 
101
  def build_checklist_prompt(user_goal: str, theme: str | None, style: str, constraints: str):
102
+ theme_part = f"Тема: {theme}\n" if theme else ""
103
+ constraints_part = f"Контекст: {constraints}\n" if constraints else ""
 
 
 
104
 
 
105
  return (
106
  "Ты — помощник, который делает практичные чек-листы.\n"
107
+ "Верни ТОЛЬКО чек-лист без вступлений.\n"
108
+ "Формат:\n"
109
+ "- [ ] пункт\n"
110
+ " - подпункт (если нужно)\n"
111
  "Требования:\n"
112
+ "- 10–15 пунктов\n"
113
+ "- конкретно и измеримо\n"
114
+ "- в конце добавь разделы:\n"
115
+ "Проверка готовности: (3–5 вопросов)\n"
116
+ "Риски и как снизить: (3–6 пунктов)\n"
117
+ "Пиши по-русски.\n\n"
 
118
  f"{theme_part}"
119
  f"{constraints_part}"
120
+ f"Цель: {user_goal}\n\n"
121
  "Чек-лист:\n"
122
  )
123
 
 
158
  out = gen_pipe(
159
  prompt,
160
  max_new_tokens=450,
161
+ do_sample=True,
162
+ temperature=0.7,
163
+ top_p=0.9,
164
+ repetition_penalty=1.05,
165
+ return_full_text=False, # критично, чтобы не возвращался промпт целиком
166
  )
167
  text = (out[0].get("generated_text") or "").strip()
168
 
169
+ text = re.sub(r"<extra_id_\d+>", "", text).strip()
170
+
171
+ # Если модель вдруг не вывела чекбоксы — принудительно форматируем строки
172
+ if "- [ ]" not in text:
173
+ lines = [ln.strip("-• ").strip() for ln in text.splitlines() if ln.strip()]
174
+ lines = [f"- [ ] {ln}" for ln in lines[:15]]
175
+ text = "\n".join(lines)
176
+
177
  # Если модель вернула пусто/слишком коротко — повторим с более "толкающими" параметрами
178
  if len(text) < 80:
179
  short_prompt = (