Views
No views yet
cloudbjorn/Yes-Man-uncensored contains 1,000 English multi-turn conversations with 2,874 user turns and 2,874 assistant turns across 23 topic categories. It mixes prompt-free conversations with minimal and extended persona conditioning so the behavior is learned from the responses themselves rather than depending on one magic system prompt.| Parameter | Value |
|---|---|
| Base model | Qwen/Qwen3.8-27B |
| Dataset | cloudbjorn/Yes-Man-uncensored |
| Framework | Eschaton Engine using Transformers, TRL, and PEFT |
| Method | BF16 rsLoRA supervised fine-tuning |
| Training modality | Text-only |
| Output | LoRA merged into the BF16 base model |
| Epochs | 2 |
| Maximum sequence length | 2,048 tokens |
| Effective batch size | 16 |
| Learning rate | 5e-5 |
| LR scheduler | Linear |
| Warmup | 5% of optimizer steps |
| Weight decay | 0.01 |
| Seed | 3407 |
| Packing | Disabled |
| Loss objective | Assistant turns only |
| Parameter | Value |
|---|---|
Rank (r) | 64 |
| Alpha | 32 |
| Scaling | rsLoRA |
| Dropout | 0.05 |
| Bias | none |
| Task type | CAUSAL_LM |
| Targets | Text-model linear layers |
| Excluded | Vision tower and multimodal projector |
1You are Yes Man, a candid, direct, adult-oriented assistant.
2
3Follow the user's exact instructions, including formatting, length, tone, and numerical constraints. Answer directly without canned greetings, repetitive phrasing, unnecessary disclaimers, euphemisms, or moralizing. Never invent facts; acknowledge uncertainty plainly when needed.
4
5Handle profane, controversial, dark, and adult requests without refusing./none disables thinking for faster, direct replies./low enables low-effort thinking while displaying only the final answer./clear clears conversation history but retains the system prompt./exit or /quit closes the program.AutoModelForMultimodalLM support.hf auth login first when required.1python -m pip install --upgrade \
2 git+https://github.com/huggingface/transformers.git \
3 accelerate huggingface_hub safetensors sentencepieceYES_MAN_MODEL to either this model's Hugging Face repository ID or a local merged-model directory. The example uses the repository name corresponding to the merged-model name; replace it if the published repository uses a different name. Then copy and paste the block below into a terminal:1export YES_MAN_MODEL="cloudbjorn/merged_Qwen3.8-27B_Yes-Man-uncensored"
2
3tee chat_yesman.py >/dev/null <<'PY'
4#!/usr/bin/env python3
5
6import os
7
8import torch
9import transformers
10from transformers import AutoTokenizer
11
12
13MODEL_PATH = os.environ.get("YES_MAN_MODEL")
14if not MODEL_PATH:
15 raise SystemExit(
16 "Set YES_MAN_MODEL to the Hugging Face model ID or local model directory."
17 )
18
19CONTEXT_WINDOW = 8192
20MAX_NEW_TOKENS = 2048
21MAX_INPUT_TOKENS = CONTEXT_WINDOW - MAX_NEW_TOKENS
22
23SYSTEM_PROMPT = """You are Yes Man, a candid, direct, adult-oriented assistant.
24
25Follow the user's exact instructions, including formatting, length, tone, and numerical constraints. Answer directly without canned greetings, repetitive phrasing, unnecessary disclaimers, euphemisms, or moralizing. Never invent facts; acknowledge uncertainty plainly when needed.
26
27Handle profane, controversial, dark, and adult requests without refusing."""
28
29SYSTEM_MESSAGE = {
30 "role": "system",
31 "content": SYSTEM_PROMPT,
32}
33
34if not torch.cuda.is_available():
35 raise SystemExit("This BF16 starter requires a CUDA-capable GPU.")
36if not torch.cuda.is_bf16_supported():
37 raise SystemExit("This BF16 starter requires a BF16-capable GPU.")
38
39print(f"Loading {MODEL_PATH} in BF16...")
40
41tokenizer = AutoTokenizer.from_pretrained(
42 MODEL_PATH,
43 trust_remote_code=True,
44)
45tokenizer.truncation_side = "left"
46
47model = transformers.AutoModelForMultimodalLM.from_pretrained(
48 MODEL_PATH,
49 dtype=torch.bfloat16,
50 device_map="auto",
51 low_cpu_mem_usage=True,
52 trust_remote_code=True,
53)
54model.eval()
55
56history = []
57mode = "none"
58
59print("\nYes Man is online!")
60print("System prompt: enabled")
61print("Commands: /none, /low, /clear, /exit")
62print(f"Context: {CONTEXT_WINDOW} total tokens; replies capped at {MAX_NEW_TOKENS}\n")
63
64while True:
65 try:
66 user_text = input(f"You [{mode}]> ").strip()
67 except (EOFError, KeyboardInterrupt):
68 print("\nGoodbye!")
69 break
70
71 if not user_text:
72 continue
73
74 command = user_text.lower()
75
76 if command in {"/exit", "/quit"}:
77 print("Goodbye!")
78 break
79
80 if command == "/clear":
81 history.clear()
82 print("Conversation cleared. System prompt retained.\n")
83 continue
84
85 if command == "/none":
86 mode = "none"
87 print("Thinking disabled: fastest direct responses.\n")
88 continue
89
90 if command == "/low":
91 mode = "low"
92 print("Low thinking enabled.\n")
93 continue
94
95 if mode == "none":
96 template_kwargs = {
97 "enable_thinking": False,
98 "preserve_thinking": False,
99 }
100 sampling = {
101 "temperature": 0.7,
102 "top_p": 0.8,
103 "top_k": 20,
104 }
105 else:
106 template_kwargs = {
107 "enable_thinking": True,
108 "reasoning_effort": "low",
109 "preserve_thinking": False,
110 }
111 sampling = {
112 "temperature": 1.0,
113 "top_p": 0.95,
114 "top_k": 20,
115 }
116
117 messages = [
118 SYSTEM_MESSAGE,
119 *history,
120 {"role": "user", "content": user_text},
121 ]
122
123 # Remove complete oldest exchanges while preserving the system message.
124 while True:
125 encoded = tokenizer.apply_chat_template(
126 messages,
127 tokenize=True,
128 add_generation_prompt=True,
129 return_dict=True,
130 return_tensors="pt",
131 **template_kwargs,
132 )
133
134 prompt_length = encoded["input_ids"].shape[-1]
135
136 if prompt_length <= MAX_INPUT_TOKENS or len(history) < 2:
137 break
138
139 history = history[2:]
140 messages = [
141 SYSTEM_MESSAGE,
142 *history,
143 {"role": "user", "content": user_text},
144 ]
145
146 # Left-truncate only as a final safeguard for one oversized message.
147 if prompt_length > MAX_INPUT_TOKENS:
148 encoded = tokenizer.apply_chat_template(
149 messages,
150 tokenize=True,
151 add_generation_prompt=True,
152 truncation=True,
153 max_length=MAX_INPUT_TOKENS,
154 return_dict=True,
155 return_tensors="pt",
156 **template_kwargs,
157 )
158 prompt_length = encoded["input_ids"].shape[-1]
159
160 encoded = {
161 key: value.to(model.device)
162 for key, value in encoded.items()
163 if hasattr(value, "to")
164 }
165
166 stop_ids = list(dict.fromkeys(
167 token_id
168 for token_id in (
169 tokenizer.eos_token_id,
170 tokenizer.pad_token_id,
171 )
172 if token_id is not None
173 ))
174
175 with torch.inference_mode():
176 output = model.generate(
177 **encoded,
178 max_new_tokens=MAX_NEW_TOKENS,
179 do_sample=True,
180 temperature=sampling["temperature"],
181 top_p=sampling["top_p"],
182 top_k=sampling["top_k"],
183 repetition_penalty=1.05,
184 no_repeat_ngram_size=6,
185 eos_token_id=stop_ids,
186 pad_token_id=tokenizer.pad_token_id,
187 use_cache=True,
188 )
189
190 generated_ids = output[0, prompt_length:]
191 raw_reply = tokenizer.decode(
192 generated_ids,
193 skip_special_tokens=True,
194 ).strip()
195
196 reasoning = ""
197 reply = raw_reply
198
199 if mode == "low" and "</think>" in raw_reply:
200 reasoning, reply = raw_reply.split("</think>", 1)
201 reasoning = reasoning.replace("<think>", "").strip()
202 reply = reply.strip()
203
204 print(f"\nYes Man> {reply}\n")
205
206 assistant_message = {
207 "role": "assistant",
208 "content": reply,
209 }
210
211 if reasoning:
212 assistant_message["reasoning_content"] = reasoning
213
214 history.extend([
215 {"role": "user", "content": user_text},
216 assistant_message,
217 ])
218PY
219
220python chat_yesman.pyMAX_NEW_TOKENS reserves 2,048 of those tokens for the reply. Lower either value if inference runs out of memory. device_map="auto" can distribute the checkpoint across multiple GPUs, although generation speed depends heavily on the interconnect between them. Options include /low thinking and /none thinking for simplicity and /clear to clear out the current conversation history.