Triok1 commited on
Commit
78b6d85
·
verified ·
1 Parent(s): fff4dbb

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +73 -52
app.py CHANGED
@@ -1,80 +1,101 @@
1
  from transformers import AutoTokenizer, T5ForConditionalGeneration
2
  import torch
3
  import gradio as gr
4
- import json
5
  import re
6
- import os
7
 
8
- # Создаем папку для кэша (если используется)
9
- os.makedirs(".gradio/cached_examples", exist_ok=True)
 
 
 
 
 
 
 
 
 
10
 
11
- # Загрузка модели с обработкой предупреждений
12
- tokenizer = AutoTokenizer.from_pretrained(
13
- "cointegrated/rut5-base-multitask",
14
- legacy=False
15
- )
16
- model = T5ForConditionalGeneration.from_pretrained("cointegrated/rut5-base-multitask")
17
 
18
- def generate_meta_tags(description):
 
19
  try:
 
20
  prompt = f"""
21
- Сгенерируй SEO-метатеги для карточки товара на основе описания ниже.
 
 
 
 
22
  Описание товара:
23
  {description.strip()}
24
- Требования:
25
- - title: до 60 символов, цепляющий заголовок с ключевыми словами
26
- - description: до 160 символов, краткое описание преимуществ
27
- Формат вывода (строго JSON):
28
  {{"title": "...", "description": "..."}}
29
  """
30
-
31
- inputs = tokenizer(prompt, return_tensors="pt", max_length=512, truncation=True)
32
 
33
  with torch.no_grad():
34
  outputs = model.generate(
35
  **inputs,
36
  max_new_tokens=200,
 
37
  do_sample=True,
38
  temperature=0.5,
39
- top_k=50,
40
- num_beams=3,
41
- eos_token_id=tokenizer.eos_token_id
42
  )
43
 
44
- generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
 
 
45
 
46
- # Улучшенная обработка JSON
47
- try:
48
- json_str = re.search(r'\{.*\}', generated_text, re.DOTALL)
49
- if json_str:
50
- result = json.loads(json_str.group())
51
- # Проверяем длину полей
52
- result["title"] = result["title"][:60]
53
- result["description"] = result["description"][:160]
54
- return result
55
- except:
56
- pass
57
 
58
- # Фоллбэк
59
- title = re.sub(r'[^\w\s]', '', description)[:60]
60
- desc = re.sub(r'[^\w\s]', '', description)[:160]
61
- return {"title": title, "description": desc}
62
-
63
  except Exception as e:
64
- print(f"Error: {e}")
65
- return {"title": "Ошибка генерации", "description": "Попробуйте другое описание"}
 
 
 
 
 
 
66
 
67
- demo = gr.Interface(
68
- fn=generate_meta_tags,
69
- inputs=gr.Textbox(label="Описание товара", lines=5),
70
- outputs=gr.JSON(label="Мета-теги"),
71
- examples=[
72
- ["Смартфон Samsung Galaxy S23 с экраном 6.1\", 8 ГБ ОЗУ, 128 ГБ памяти, камерой 50 МП"],
73
- ["Электрическая зубная щётка Oral-B Pro 3 3000 с датчиком давления и 3 насадками"]
74
- ],
75
- title="Генератор SEO-метатегов для маркетплейсов",
76
- allow_flagging="never"
77
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
78
 
79
  if __name__ == "__main__":
80
- demo.launch(server_name="0.0.0.0", server_port=7860)
 
 
 
 
 
1
  from transformers import AutoTokenizer, T5ForConditionalGeneration
2
  import torch
3
  import gradio as gr
 
4
  import re
5
+ import json
6
 
7
+ # Инициализация модели и токенизатора
8
+ def load_model():
9
+ tokenizer = AutoTokenizer.from_pretrained(
10
+ "cointegrated/rut5-base-multitask",
11
+ legacy=False # Отключаем предупреждения
12
+ )
13
+ model = T5ForConditionalGeneration.from_pretrained(
14
+ "cointegrated/rut5-base-multitask",
15
+ torch_dtype=torch.float16 # Экономия памяти
16
+ )
17
+ return tokenizer, model
18
 
19
+ tokenizer, model = load_model()
 
 
 
 
 
20
 
21
+ # Основная функция генерации
22
+ def generate_seo_tags(description):
23
  try:
24
+ # Подготовка промта
25
  prompt = f"""
26
+ Сгенерируй SEO-метатеги title и description для товара.
27
+ Требования:
28
+ - Title: до 60 символов, содержит ключевые слова
29
+ - Description: до 160 символов, описание преимуществ
30
+
31
  Описание товара:
32
  {description.strip()}
33
+
34
+ Выведи только JSON:
 
 
35
  {{"title": "...", "description": "..."}}
36
  """
37
+ # Токенизация и генерация
38
+ inputs = tokenizer(prompt, return_tensors="pt", truncation=True, max_length=512)
39
 
40
  with torch.no_grad():
41
  outputs = model.generate(
42
  **inputs,
43
  max_new_tokens=200,
44
+ num_beams=3,
45
  do_sample=True,
46
  temperature=0.5,
47
+ early_stopping=True
 
 
48
  )
49
 
50
+ # Декодирование и очистка результата
51
+ result = tokenizer.decode(outputs[0], skip_special_tokens=True)
52
+ json_match = re.search(r'\{.*\}', result, re.DOTALL)
53
 
54
+ if json_match:
55
+ seo_tags = json.loads(json_match.group())
56
+ # Проверка и обрезка по длине
57
+ seo_tags["title"] = seo_tags.get("title", "")[:60]
58
+ seo_tags["description"] = seo_tags.get("description", "")[:160]
59
+ return seo_tags
 
 
 
 
 
60
 
 
 
 
 
 
61
  except Exception as e:
62
+ print(f"Ошибка: {e}")
63
+
64
+ # Фоллбэк если что-то пошло не так
65
+ clean_text = re.sub(r'[^\w\s]', '', description)
66
+ return {
67
+ "title": clean_text[:60],
68
+ "description": clean_text[:160]
69
+ }
70
 
71
+ # Интерфейс Gradio
72
+ with gr.Blocks(title="SEO Генератор") as app:
73
+ gr.Markdown("## Генератор SEO-метатегов для товаров")
74
+
75
+ with gr.Row():
76
+ with gr.Column():
77
+ input_text = gr.Textbox(
78
+ label="Описание товара",
79
+ placeholder="Введите описание товара...",
80
+ lines=5
81
+ )
82
+ submit_btn = gr.Button("Сгенерировать")
83
+
84
+ with gr.Column():
85
+ output_json = gr.JSON(
86
+ label="SEO-метатеги",
87
+ interactive=False
88
+ )
89
+
90
+ submit_btn.click(
91
+ fn=generate_seo_tags,
92
+ inputs=input_text,
93
+ outputs=output_json
94
+ )
95
 
96
  if __name__ == "__main__":
97
+ app.launch(
98
+ server_name="0.0.0.0",
99
+ server_port=7860,
100
+ show_error=True
101
+ )