metaGenerator / app.py
Triok1's picture
Update app.py
0d6e36f verified
raw
history blame
5 kB
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()