--- license: apache-2.0 library_name: transformers base_model: Qwen/Qwen3.5-9B pipeline_tag: text-generation datasets: - kyLELEng/retailops-instruct-sft tags: - retail - ecommerce - instruction-tuning - product-listing - qwen - merged - text-generation - safetensors metrics: - loss - json_validity --- # RetailOps-Instruct Qwen3.5-9B RetailOps-Instruct is a full merged Transformers checkpoint for e-commerce catalog operations. It is built by merging: - Base model: [`Qwen/Qwen3.5-9B`](https://huggingface.co/Qwen/Qwen3.5-9B) - LoRA adapter: [`kyLELEng/retailops-instruct-qwen3.5-9b-lora`](https://huggingface.co/kyLELEng/retailops-instruct-qwen3.5-9b-lora) No additional training is performed during this merge step. ## Task The model is intended to turn product metadata, category information, seller notes, and customer reviews into structured listing packages: - `optimized_title` - `bullet_points` - `description` - `attributes` - `seo_keywords` - `faq` - `review_driven_improvements` - `compliance_notes` ## Training Data - SFT dataset: [`kyLELEng/retailops-instruct-sft`](https://huggingface.co/datasets/kyLELEng/retailops-instruct-sft) - Sources in v1: - `AI4H/EC-Guide` - `McAuley-Lab/Amazon-Reviews-2023` - `McAuley-Lab/Amazon-C4` ## Training Summary - Method: LoRA SFT, then merged into the base model - LoRA rank: 64 - LoRA alpha: 128 - LoRA dropout: 0.05 - Max sequence length: 2048 ## Evaluation Final adapter eval before merge: ```json { "json_validity_rate": 0.5, "avg_required_field_completion": 0.171875, "num_generation_eval_samples": 8 } ``` No-thinking generation check: ```json { "inference_mode": "tokenizer.apply_chat_template(..., enable_thinking=False) when supported", "num_generation_eval_samples": 24, "json_validity_rate": 1.0, "listing_num_samples": 13, "listing_json_validity_rate": 1.0, "listing_avg_required_field_completion": 0.7980769230769231 } ``` ## Recommended Inference Qwen3.5 models may emit reasoning text by default. For this RetailOps model, use no-thinking mode when available: ```python prompt = tokenizer.apply_chat_template( messages, tokenize=False, add_generation_prompt=True, enable_thinking=False, ) ``` ## Example ```python import json import torch from transformers import AutoModelForCausalLM, AutoTokenizer model_id = "kyLELEng/retailops-instruct-qwen3.5-9b" tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True) model = AutoModelForCausalLM.from_pretrained( model_id, torch_dtype=torch.bfloat16, device_map="auto", trust_remote_code=True, ) messages = [ {"role": "system", "content": "You are RetailOps-Instruct, an e-commerce catalog optimization assistant. Return exactly one valid JSON object. Do not invent unsupported product features. Use product metadata and reviews as the source of truth."}, {"role": "user", "content": "Given the product metadata, category, and customer reviews, generate an optimized product listing package.\n\nINPUT:\n" + json.dumps({ "category": "Home & Kitchen > Kitchen & Dining > Small Appliances", "brand": "ExampleBrand", "raw_title": "Portable Electric Kettle", "raw_description": "Small kettle for boiling water.", "product_specs": {"capacity": "1.0L", "material": "stainless steel", "safety": "auto shut-off"}, "positive_reviews": ["Heats water quickly.", "Good size for small apartments."], "negative_reviews": ["The instructions were unclear.", "The outside gets warm after use."], "brand_voice": "clear, practical, trustworthy" }, ensure_ascii=False, indent=2)}, ] prompt = tokenizer.apply_chat_template( messages, tokenize=False, add_generation_prompt=True, enable_thinking=False, ) inputs = tokenizer(prompt, return_tensors="pt").to(model.device) with torch.no_grad(): output = model.generate(**inputs, max_new_tokens=900, do_sample=False) print(tokenizer.decode(output[0][inputs["input_ids"].shape[-1]:], skip_special_tokens=True)) ``` ## Merge Smoke Test ```json { "input": { "category": "Home & Kitchen > Kitchen & Dining > Small Appliances", "brand": "ExampleBrand", "raw_title": "Portable Electric Kettle", "raw_description": "Small kettle for boiling water.", "product_specs": { "capacity": "1.0L", "material": "stainless steel", "safety": "auto shut-off" }, "positive_reviews": [ "Heats water quickly.", "Good size for small apartments." ], "negative_reviews": [ "The instructions were unclear.", "The outside gets warm after use." ], "brand_voice": "clear, practical, trustworthy" }, "generated": "{\"optimized_title\": \"Portable Electric Kettle\", \"bullet_points\": [\"Small kettle for boiling water.\"], \"description\": \"Small kettle for boiling water.\", \"seo_keywords\": [\"kettle\", \"small\", \"portable\", \"electric\", \"boiling\", \"water\", \"examplebrand\", \"home\", \"kitchen\", \"dining\"], \"attributes\": {\"brand\": \"ExampleBrand\", \"category\": \"Home & Kitchen > Kitchen & Dining > Small Appliances\", \"features\": [\"stainless steel\", \"auto shut-off\"], \"specifications\": {\"capacity\": \"1.0L\", \"material\": \"stainless steel\", \"safety\": \"auto shut-off\"}}, \"review_driven_improvements\": [\"Highlight review-supported strengths: water, heats, quickly, good, size\", \"Clarify or avoid overclaiming around reported issues: instructions, were, unclear, outside, gets\", \"Do not contradict the supplied customer review evidence.\"], \"faq\": [{\"question\": \"Who is the brand?\", \"answer\": \"ExampleBrand\"}, {\"question\": \"What category does this product fit?\", \"answer\": \"Home & Kitchen > Kitchen & Dining > Small Appliances\"}], \"compliance_notes\": [\"No unsupported product features added.\", \"No medical, safety, or durability claims added unless present in the input.\"]}" } ``` ## Limitations - The model can still produce unsupported claims; downstream validation is recommended. - This is not a compliance certification system. - Outputs should be checked before production publishing.