from transformers import AutoModelForCausalLM, AutoTokenizer, MarianMTModel, MarianTokenizer import torch import re import json MODEL_ID = "HuggingFaceTB/SmolLM2-360M" tokenizer = AutoTokenizer.from_pretrained(MODEL_ID) model = AutoModelForCausalLM.from_pretrained(MODEL_ID, torch_dtype=torch.float32, low_cpu_mem_usage=True) TRANS_MODEL_ID = "Helsinki-NLP/opus-mt-en-zh" trans_tokenizer = MarianTokenizer.from_pretrained(TRANS_MODEL_ID) trans_model = MarianMTModel.from_pretrained(TRANS_MODEL_ID) def clean_output(text: str) -> str: text = re.sub(r"]*>", "", text) text = text.replace("<|endoftext|>", "").replace("<|im_end|>", "").replace("<|im_start|>", "") text = re.sub(r"(?m)^\s*(?:[0-9]+[.\、\)]|[一二三四五六七八九十]+[、\.]|[(\(][0-9一二三四五六七八九十]+[)\)]|[①②③④⑤⑥⑦⑧⑨⑩]|(?:第[一二三四五六七八九十0-9]+[条点个部分阶段、::]))\s*", "", text) text = re.sub(r"\s+[0-9]+[.\、]\s*", " ", text) text = re.sub(r"\s+[一二三四五六七八九十]+[、]\s*", " ", text) text = re.sub(r"\n{3,}", "\n\n", text) match = re.search(r"[。!?\n][^。!?\n]*$", text) if match and match.start() > 15: text = text[:match.start() + 1] return text.strip() def translate_to_chinese(text: str) -> str: if not text or len(text.strip()) < 3: return text inputs = trans_tokenizer(text, return_tensors="pt", truncation=True, max_length=512) with torch.no_grad(): translated = trans_model.generate(**inputs, max_new_tokens=256) return trans_tokenizer.decode(translated[0], skip_special_tokens=True) def clean_chinese(text: str) -> str: cleaned = re.sub(r'[a-zA-Z\'\-]{3,}', '', text) cleaned = re.sub(r'[^\u4e00-\u9fff\u3000-\u303f\uff00-\uffef,。!?、;:""''()—…\s]', '', cleaned) cleaned = re.sub(r'\s{2,}', ' ', cleaned) cleaned = cleaned.strip() cleaned = re.sub(r',\s*(并且|而且|但是|可是|然而|而|因此|所以|于是|因为|由于|虽然)', r'。\1', cleaned) segments = cleaned.split(',') result = [] current_len = 0 for i, seg in enumerate(segments): result.append(seg) current_len += len(seg) if i < len(segments) - 1: if current_len > 12: result.append('。') current_len = 0 else: result.append(',') cleaned = "".join(result) cleaned = re.sub(r'。+', '。', cleaned) cleaned = cleaned.replace('。,', '。').replace(',。', '。') if cleaned and cleaned[-1] not in ['。', '!', '?', '”']: cleaned += '。' if len(cleaned) < 5: return "" return cleaned prompt = "Finally, remember that everyone possesses unique gifts worth recognizing—not just numerical rankings or social status. Embrace diversity, celebrate individuality, cherish relationships built on trust and mutual respect, and stay curious about ever-expanding horizons as we did here today. Happy adventures!" inputs = tokenizer(prompt, return_tensors="pt") with torch.no_grad(): output_ids = model.generate( **inputs, max_new_tokens=120, do_sample=True, temperature=1.05, top_p=0.92, repetition_penalty=1.15 ) generated_tokens = output_ids[0][inputs.input_ids.shape[1]:] raw_content = tokenizer.decode(generated_tokens, skip_special_tokens=True) raw_content = clean_output(raw_content) translated = translate_to_chinese(raw_content) cleaned = clean_chinese(translated) print("raw:", raw_content) print("trans:", translated) print("clean:", cleaned)