Spaces:
Sleeping
Sleeping
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() |