What's different in v2
- Brief-conditioned: trained on structured briefs (company, ICP, pain points, tone, hard constraints, CTA) rather than bare instructions — give it a real brief and it follows the constraints.
- Anti-fabrication training: 60% of training briefs explicitly forbid invented statistics; the model is trained to use only numbers supplied in the brief.
- Quality-gated data: every training pair was scored by an LLM judge; only high-scoring pairs (median 9/10) were kept.
Evaluation
Blind LLM-judged benchmark (50 prompts: 25 short-instruction + 25 real-world briefs; judges never saw model identities; both models generated on identical hardware):
Table with columns: Metric, Qwen3-32B base, This adapter| Metric | Qwen3-32B base | This adapter |
|---|
| Overall score (0–10) | 4.79 | 7.16 |
| Head-to-head win rate vs base | — | 86% (43W/6L/1T) |
| Brief-constraint adherence | 6.16 | 7.76 |
| Fabricated statistics (per 50 outputs) | 13 | 4 |
| Truncations / format breaks | 12 | 0 |
How to use
Recommended: run with thinking disabled (the adapter was trained in non-thinking mode).
from transformers import AutoModelForCausalLM, AutoTokenizerfrom peft import PeftModel base_id = "Qwen/Qwen3-32B"adapter_id = "RYVR/qwen3-32b-b2b-marketing-lora" tokenizer = AutoTokenizer.from_pretrained(adapter_id)model = AutoModelForCausalLM.from_pretrained(base_id, torch_dtype="auto", device_map="auto")model = PeftModel.from_pretrained(model, adapter_id) brief = """Write a personalised ABM email using this brief. Company: Northwind Logistics, a freight-visibility platformICP: Head of Supply Chain at mid-market importersPain points: blind spots between ports; demurrage feesTone: direct, operator-to-operatorConstraints: under 130 words; one clear askCTA: a 15-minute lane-visibility auditUsable facts: none — no invented statistics.""" messages = [ {"role": "system", "content": "You are an expert B2B marketing copywriter."}, {"role": "user", "content": brief},]inputs = tokenizer.apply_chat_template(messages, add_generation_prompt=True, enable_thinking=False, return_tensors="pt").to(model.device)outputs = model.generate(inputs, max_new_tokens=700, temperature=0.7, top_p=0.9)print(tokenizer.decode(outputs[0][inputs.shape[1]:], skip_special_tokens=True))
vLLM (LoRA runtime)
vllm serve Qwen/Qwen3-32B \ --enable-lora \ --lora-modules b2b-marketing=RYVR/qwen3-32b-b2b-marketing-lora
The adapter performs best with structured briefs. Fields it was trained on: Company, Product, ICP, Pain points, Tone, Constraints (word limits, structure, banned words, required mentions), CTA, and Usable facts (the only numbers the copy may cite — write "none" to get statistics-free copy).
Training details
- Base model: Qwen/Qwen3-32B (non-thinking mode)
- Method: LoRA SFT —
r=16, alpha=32, target modules q/k/v/o/gate/up/down_proj
- Data: 7,722 brief→asset pairs across 10 asset types, ~48 industries, ~20 personas; multi-teacher generated, LLM-judge filtered (score ≥7/10), deduplicated; final training loss ≈ 1.03 over 2 epochs (~5.1M tokens)
- Training data is proprietary and not distributed with this adapter
Intended use & limitations
For drafting B2B marketing copy from briefs. Human review is required before publishing: the model is trained against inventing statistics, but no model is immune — verify any factual or numeric claim. Predominantly English, western business idiom. Not for legal, medical, or financial advice.
License
Apache 2.0, consistent with the Qwen3-32B base model.