File size: 3,336 Bytes
a90ada2
 
 
3a75e4a
78b6d85
a90ada2
78b6d85
 
 
 
 
 
 
 
 
 
 
fff4dbb
78b6d85
a90ada2
78b6d85
 
fff4dbb
78b6d85
fff4dbb
78b6d85
 
 
 
 
2be3559
259ce62
78b6d85
 
259ce62
 
78b6d85
 
fff4dbb
 
 
 
 
78b6d85
fff4dbb
 
78b6d85
fff4dbb
 
78b6d85
 
 
fff4dbb
78b6d85
 
 
 
 
 
fff4dbb
 
78b6d85
 
 
 
 
 
 
 
a90ada2
78b6d85
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a90ada2
fff4dbb
78b6d85
 
 
 
 
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
from transformers import AutoTokenizer, T5ForConditionalGeneration
import torch
import gradio as gr
import re
import json

# Инициализация модели и токенизатора
def load_model():
    tokenizer = AutoTokenizer.from_pretrained(
        "cointegrated/rut5-base-multitask",
        legacy=False  # Отключаем предупреждения
    )
    model = T5ForConditionalGeneration.from_pretrained(
        "cointegrated/rut5-base-multitask",
        torch_dtype=torch.float16  # Экономия памяти
    )
    return tokenizer, model

tokenizer, model = load_model()

# Основная функция генерации
def generate_seo_tags(description):
    try:
        # Подготовка промта
        prompt = f"""
Сгенерируй SEO-метатеги title и description для товара.
Требования:
- Title: до 60 символов, содержит ключевые слова
- Description: до 160 символов, описание преимуществ

Описание товара:
{description.strip()}

Выведи только JSON:
{{"title": "...", "description": "..."}}
"""
        # Токенизация и генерация
        inputs = tokenizer(prompt, return_tensors="pt", truncation=True, max_length=512)
        
        with torch.no_grad():
            outputs = model.generate(
                **inputs,
                max_new_tokens=200,
                num_beams=3,
                do_sample=True,
                temperature=0.5,
                early_stopping=True
            )
        
        # Декодирование и очистка результата
        result = tokenizer.decode(outputs[0], skip_special_tokens=True)
        json_match = re.search(r'\{.*\}', result, re.DOTALL)
        
        if json_match:
            seo_tags = json.loads(json_match.group())
            # Проверка и обрезка по длине
            seo_tags["title"] = seo_tags.get("title", "")[:60]
            seo_tags["description"] = seo_tags.get("description", "")[:160]
            return seo_tags
        
    except Exception as e:
        print(f"Ошибка: {e}")
    
    # Фоллбэк если что-то пошло не так
    clean_text = re.sub(r'[^\w\s]', '', description)
    return {
        "title": clean_text[:60],
        "description": clean_text[:160]
    }

# Интерфейс Gradio
with gr.Blocks(title="SEO Генератор") as app:
    gr.Markdown("## Генератор SEO-метатегов для товаров")
    
    with gr.Row():
        with gr.Column():
            input_text = gr.Textbox(
                label="Описание товара",
                placeholder="Введите описание товара...",
                lines=5
            )
            submit_btn = gr.Button("Сгенерировать")
        
        with gr.Column():
            output_json = gr.JSON(
                label="SEO-метатеги",
                interactive=False
            )
    
    submit_btn.click(
        fn=generate_seo_tags,
        inputs=input_text,
        outputs=output_json
    )

if __name__ == "__main__":
    app.launch(
        server_name="0.0.0.0",
        server_port=7860,
        show_error=True
    )