File size: 5,004 Bytes
a90ada2
 
 
3a75e4a
78b6d85
a90ada2
0148b1c
 
fff4dbb
0148b1c
 
 
 
a90ada2
0148b1c
 
 
0b1dd8d
0148b1c
0b1dd8d
 
 
 
 
78b6d85
0b1dd8d
 
 
78b6d85
0148b1c
259ce62
 
0148b1c
3c9784d
0148b1c
 
 
 
 
 
 
 
78b6d85
0148b1c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a90ada2
0148b1c
 
 
 
 
78b6d85
0148b1c
 
78b6d85
0148b1c
a90ada2
0148b1c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
from transformers import AutoTokenizer, T5ForConditionalGeneration
import torch
import gradio as gr
import re
import json

tokenizer = AutoTokenizer.from_pretrained("cointegrated/rut5-base-multitask", legacy=False)
model = T5ForConditionalGeneration.from_pretrained("cointegrated/rut5-base-multitask")

def smart_truncate(text, max_len):
    if len(text) <= max_len:
        return text
    return text[:text[:max_len+1].rfind(' ')].strip()

def generate_meta(description):
    # Упрощенный промт с примерами
    prompt = f"""
Описание: {Fenix ARB-L18-4000U— высокопроизводительный перезаряжаемый литий-ионный аккумулятор стандартного размера 18650. Перезаряжаемая батарея обладает высокой емкостью 4000 мАч, которая обеспечивает длительное время работы электронных устройств. Элемент питания идеально подходит для мощных фонарей Fenix.

Аккумулятор поддерживает три различных варианта зарядки: с помощью зарядного устройства, через порт Type-C фонаря Fenix, а также через собственный встроенный порт Type-C. Универсальность зарядки обеспечивает удобство использования в любых условиях.

Стабильный выходной ток 7А, а также отличные теплоотводящие характеристики предотвращают перегрев батареи. В конструкции аккумулятора предусмотрены вентиляционные отверстия для сброса давления.

Многоуровневая система защиты обеспечивает безопасное использование и высокую производительность литий-ионного аккумулятора. Устройство обладает защитой от перезаряда, перегрузки по току, переразряда, короткого замыкания. Отсутствие в составе ртути и свинца сводит к минимуму негативное воздействие на окружающую среду.

В аккумуляторе отсутствует “эффект памяти”. После 500 полных циклов заряда/разряда аккумулятор ARB-L18-4000U сохраняет до 70% первоначальной емкости, что делает его использование выгодным и экономичным. Рекомендуемая сила тока зарядных устройств составляет 800 мА. Максимальное значение может достигать 4А. При зарядке через порт Type-C — 1.5 A.}

→ Сгенерируй SEO title (до 60 символов) и description (до 160 символов) в JSON. 

Вывод ТОЛЬКО как JSON:
{{"title": "...", "description": "..."}}
"""
    inputs = tokenizer(prompt, return_tensors="pt", max_length=512, truncation=True)
    
    with torch.no_grad():
        outputs = model.generate(
            **inputs,
            max_new_tokens=200,
            num_beams=5,
            early_stopping=True,
            no_repeat_ngram_size=2
        )
    
    try:
        result = tokenizer.decode(outputs[0], skip_special_tokens=True)
        json_data = json.loads(re.search(r'\{.*\}', result, re.DOTALL).group())
        
        # Принудительная постобработка
        if "Fenix" not in json_data["title"]:
            json_data["title"] = f"Аккумулятор Fenix {json_data['title']}"
            
        return {
            "title": smart_truncate(json_data["title"], 60),
            "description": smart_truncate(json_data["description"], 160)
        }
    except:
        # Фоллбэк
        clean_text = re.sub(r'\s+', ' ', description)
        return {
            "title": smart_truncate(f"Аккумулятор Fenix {clean_text}", 60),
            "description": smart_truncate(clean_text, 160)
        }

# Интерфейс
with gr.Blocks() as app:
    gr.Markdown("## Генератор метатегов (контроль длины)")
    inp = gr.Textbox(label="Описание товара", lines=7)
    btn = gr.Button("Сгенерировать")
    with gr.Row():
        out_title = gr.Textbox(label="Title (до 60 символов)", interactive=False)
        out_desc = gr.Textbox(label="Description (до 160 символов)", lines=3, interactive=False)
    
    btn.click(generate_meta, inputs=inp, outputs=[out_title, out_desc])

app.launch()