Views
No views yet
pip install torch>=2.6.0 transformers>=4.51.3 jsonyx1import torch
2from transformers import AutoTokenizer, AutoModelForCausalLM
3import jsonyx as json
4base_model_name = "clw8998/Qwen3-1.7B-GRPO-NER"
5device = "cuda" if torch.cuda.is_available() else "cpu"
6ctx = "OASIS Curve瞬熱製冷UVC濾淨飲水機" # put your context here
7annotation_rules = {
8 "品牌": "商品品牌名稱,如 華碩、LG",
9 "系列名稱": "產品中所有的“產品系列”,以及商人為了特殊目的所特別額外創造出的商品名稱,使用者可能會利用該名稱搜尋商品,不包含特殊主題或是產品類型,不含廣告詞。如 Iphone 12、ROG 3060Ti",
10 "產品類型": "實際產品名稱",
11 "產品序號": "產品序號,該產品所擁有的唯一英數符號組合序號,不含系列名。",
12 "顏色": "顏色資訊,包含化妝品色調以及明亮,如 花朵紅、藍色系、晶亮",
13 "材質": "產品的製造材料,一般情況下不能食用,較接近原物料,不是產品成分,請注意,“紙”尿褲的材質是棉,不是紙,“皮革”外套的皮革是材質。如 木製、PVC材質、304不鏽鋼",
14 "對象與族群": "人與動物的族群,如 新生兒用、寵物用、高齡族群",
15 "適用物體、事件與場所": "適用的物品、事件、場所。如 手部用、騎車用、廚房用",
16 "特殊主題": "該物品富含特殊人為創造創作、人物,並且該創作名有一定知名度。如 航海王、J.K.Rowling",
17 "形狀": "商品形狀,囊括簡單的幾何圖形,以及明確從名稱中可以知道該商品屬於該形狀的詞。包含衣服版型。如 圓形、紐扣形、可愛熊造型、寬版、無袖、長筒、窄邊框",
18 "圖案": "商品上的圖案,囊括簡單的幾何圖形,以及明確從名稱中可以知道該商品屬於該圖案的詞",
19 "尺寸": "商品大小,常以數字與單位或特殊規格形式出現,如 120x80x10cm (長寬高)、XL、ATX (主機板)",
20 "重量": "商品重量,常以數字與單位或特殊規格形式出現,如 10g、極輕",
21 "容量": "商品容量,常以數字與單位或特殊規格形式出現,如 128G (電腦)、大容量",
22 "包裝組合": "產品包裝方式、包裝分量以及贈品,如 10入、10g/包、鍵盤滑鼠桌墊組合、送電池",
23 "功能與規格": "產品的功用、與其特殊規格、以及產品額外的特性。如 USB3.0、防臭、太陽能",
24}
25all_atts = list(annotation_rules.keys())
26all_atts_json = json.dumps(all_atts, ensure_ascii=False)
27PROMPT_TEMPLATE = (
28 "商品名稱:{ctx}\n"
29 "請根據以下屬性列表,從商品名稱中抽取相應實體:\n"
30 f"{all_atts_json}\n"
31 "請以純 JSON 回傳,格式範例:\n"
32 "{{\n"
33 ' "品牌": [...],\n'
34 ' ...\n'
35 ' "功能與規格": [...]\n'
36 "}}\n"
37 "若無對應實體,請以空陣列表示"
38)
39tokenizer = AutoTokenizer.from_pretrained(base_model_name)
40base_model = AutoModelForCausalLM.from_pretrained(
41 base_model_name,
42 torch_dtype=torch.bfloat16,
43 trust_remote_code=True
44).to(device)
45model = base_model
46model.eval()
47user_msg = PROMPT_TEMPLATE.format(ctx=ctx)
48prompt = tokenizer.apply_chat_template(
49 [
50 {"role":"user","content":user_msg}
51 ],
52 tokenize=False,
53 add_generation_prompt=True,
54 enable_thinking=False)
55inputs = tokenizer(prompt, return_tensors="pt").to(device)
56with torch.no_grad():
57 ids = model.generate(**inputs, max_new_tokens=1024, temperature=1e-5)
58raw = tokenizer.decode(ids[0][inputs.input_ids.shape[-1]:], skip_special_tokens=True)
59print(raw){
"品牌": ["OASIS"],
"系列名稱": ["Curve", ""],
"產品類型": ["飲水機", ""],
"產品序號": ["未提及"],
"顏色": ["未提及"],
"材質": ["未提及"],
"對象與族群": ["消費者"],
"適用物體、事件與場所": ["地面", ""],
"特殊主題": ["未提及"],
"形狀": ["圓形", "長方形"],
"圖案": ["未提及"],
"尺寸": ["未提及"],
"重量": ["未提及"],
"容量": ["未提及"],
"包裝組合": ["未提及"],
"功能與規格": ["飲水", "瞬熱製冷", "UVC濾淨", ""]
}