Downloads · 30 days
13
14% of all-time downloads
renezander030/qwen-2.5-1.5b-de-smb-support-agent
qwen-2.5-1.5b-de-smb-support-agent is a text generation model from renezander030. Use it when you need the model to write or continue text. It is set up for peft. The card lists the license as apache-2.0.
Public reference adapter for a brand-aligned, domain-trained German customer-support agent — the kind of fine-tune I deliver to freelance clients: replaces a generic chatbot, runs on the customer's own GPU,…
Downloads · 30 days
13
14% of all-time downloads
All-time downloads
95
Public
Repo size
159 MB
Likes
1
Public
Click a slice to open those files.
.safetensors148 MB · 93%
From the Hugging Face model README
Public reference adapter for a brand-aligned, domain-trained German customer-support agent — the kind of fine-tune I deliver to freelance clients: replaces a generic chatbot, runs on the customer's own GPU, brings Tier-1 resolution time from 10+ min to under 2 min, and emits structured JSON the rest of the stack can trust.
The training data in this public version is synthetic (generated against a fictional German DTC brand so the full adapter + data + harness can be open-sourced without exposing real client tickets). On a real engagement the same recipe runs against your brand voice, your policies, and 2,000-10,000 of your actual historical support tickets.
agent/graph.py) wraps the fine-tuned model in a 3-node LangGraph
pipeline: generate -> validate -> route. The router sends to a
human queue on escalate_to_human=true or invalid output; otherwise
it returns the response.class SupportResponse(BaseModel):
response_text: str
escalate_to_human: bool
policies_referenced: list[str]
intent_category: Literal[
"return", "shipping", "sizing", "product_care",
"complaint", "b2b", "general",
]
scripts/synth_smb.py)SupportResponse.model_validate() at ingest;
parse failures droppedschema.BRAND as one swappable Pydantic-typed dict — on a
client engagement, this is the file that gets replaced with yoursQwen/Qwen2.5-1.5B-Instruct (Apache 2.0, no gating)SFTTrainer, conversational chat formatComputed on the 16-ticket held-out eval split via scripts/eval.py:
| Metric | Base Qwen2.5-1.5B | + LoRA adapter |
|---|---|---|
| Schema-valid JSON output | 44% | 94% |
| Structured-field F1 (escalate / intent / policies) | 0.22 | 0.80 |
Plus a Claude-Opus-as-judge pass on the free-form response_text
(scripts/eval_judge.py):
| Judge dimension | Base | + LoRA |
|---|---|---|
| Brand voice (1-5) | 1.4 | 2.0 |
| Policy compliance (% pass) | 38% | 6% |
| Resolution quality (% pass) | 6% | 6% |
The fine-tune locks down the schema layer (parse + structured
field F1) at this small data scale — the precondition for any
downstream wrapper. The free-form response_text quality starts to
shift in brand voice but is not at production grade on 75 synthetic
samples; the same recipe on 2,000-10,000 real customer tickets is
what closes the policy + resolution gap.
from peft import PeftModel
from transformers import AutoModelForCausalLM, AutoTokenizer
base = "Qwen/Qwen2.5-1.5B-Instruct"
adapter = "renezander030/qwen-2.5-1.5b-de-smb-support-agent"
tok = AutoTokenizer.from_pretrained(base)
mdl = AutoModelForCausalLM.from_pretrained(base, device_map="auto")
mdl = PeftModel.from_pretrained(mdl, adapter).merge_and_unload()
# The adapter learned the system prompt rendered by schema.render_system().
# For inference, use the same prompt; see schema.py + agent/nodes.py.
# (This system prompt ships with the public synthetic brand; on a real
# client engagement it is replaced with yours.)
SYSTEM = (
"Du bist Maria im Kundenservice eines deutschen "
"DTC-Familienbetriebs (Leder-Manufaktur seit 1987). "
"Sie-Form, persönlich-professionell, signiert mit Vorname. "
"Antworte AUSSCHLIESSLICH als JSON nach Schema SupportResponse."
)
messages = [
{"role": "system", "content": SYSTEM},
{"role": "user", "content": "Wo bleibt meine Bestellung?"},
]
prompt = tok.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tok(prompt, return_tensors="pt").to(mdl.device)
out = mdl.generate(**inputs, max_new_tokens=768, do_sample=False)
print(tok.decode(out[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True))
transformers.generate()
for vLLM with the LoRA adapter loaded; expect 5-10x throughputintent_category is collapsed to 7 buckets; niche intents snap to
general.This adapter is a public reference of the recipe I deliver to clients: domain-specific LLMs, running on their own GPU, GDPR-clean, with structured-output contracts the rest of the stack can trust.
If you need one of the following, I can build it:
Two ways to engage:
Adapter weights: Apache 2.0 (matches the Qwen2.5 base). Training scripts in the companion repo: MIT.
@misc{zander2026qwen15bdesmbsupport,
author = {Zander, Rene},
title = {qwen-2.5-1.5b-de-smb-support-agent: a LoRA adapter
for German SMB customer-support agents,
trained on synthetic DTC support tickets},
year = {2026},
howpublished = {HuggingFace Hub},
url = {https://huggingface.co/renezander030/qwen-2.5-1.5b-de-smb-support-agent},
}