From 91c999d2711fc40e7a2a03b26e43051fb6c19c8a Mon Sep 17 00:00:00 2001 From: ModelHub XC Date: Mon, 1 Jun 2026 08:34:15 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=EF=BC=8C=E7=94=B1ModelHub=20XC=E7=A4=BE=E5=8C=BA=E6=8F=90?= =?UTF-8?q?=E4=BE=9B=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Model: topherbullock/debord Source: Original Platform --- .gitattributes | 37 +++++++ Modelfile | 23 ++++ README.md | 178 +++++++++++++++++++++++++++++++ chat_template.jinja | 89 ++++++++++++++++ config.json | 74 +++++++++++++ debord-Q4_K_M.gguf | 3 + generation_config.json | 9 ++ model.safetensors | 3 + tokenizer.json | 3 + tokenizer_config.json | 233 +++++++++++++++++++++++++++++++++++++++++ 10 files changed, 652 insertions(+) create mode 100644 .gitattributes create mode 100644 Modelfile create mode 100644 README.md create mode 100644 chat_template.jinja create mode 100644 config.json create mode 100644 debord-Q4_K_M.gguf create mode 100644 generation_config.json create mode 100644 model.safetensors create mode 100644 tokenizer.json create mode 100644 tokenizer_config.json diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..7891811 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,37 @@ +*.7z filter=lfs diff=lfs merge=lfs -text +*.arrow filter=lfs diff=lfs merge=lfs -text +*.bin filter=lfs diff=lfs merge=lfs -text +*.bz2 filter=lfs diff=lfs merge=lfs -text +*.ckpt filter=lfs diff=lfs merge=lfs -text +*.ftz filter=lfs diff=lfs merge=lfs -text +*.gz filter=lfs diff=lfs merge=lfs -text +*.h5 filter=lfs diff=lfs merge=lfs -text +*.joblib filter=lfs diff=lfs merge=lfs -text +*.lfs.* filter=lfs diff=lfs merge=lfs -text +*.mlmodel filter=lfs diff=lfs merge=lfs -text +*.model filter=lfs diff=lfs merge=lfs -text +*.msgpack filter=lfs diff=lfs merge=lfs -text +*.npy filter=lfs diff=lfs merge=lfs -text +*.npz filter=lfs diff=lfs merge=lfs -text +*.onnx filter=lfs diff=lfs merge=lfs -text +*.ot filter=lfs diff=lfs merge=lfs -text +*.parquet filter=lfs diff=lfs merge=lfs -text +*.pb filter=lfs diff=lfs merge=lfs -text +*.pickle filter=lfs diff=lfs merge=lfs -text +*.pkl filter=lfs diff=lfs merge=lfs -text +*.pt filter=lfs diff=lfs merge=lfs -text +*.pth filter=lfs diff=lfs merge=lfs -text +*.rar filter=lfs diff=lfs merge=lfs -text +*.safetensors filter=lfs diff=lfs merge=lfs -text +saved_model/**/* filter=lfs diff=lfs merge=lfs -text +*.tar.* filter=lfs diff=lfs merge=lfs -text +*.tar filter=lfs diff=lfs merge=lfs -text +*.tflite filter=lfs diff=lfs merge=lfs -text +*.tgz filter=lfs diff=lfs merge=lfs -text +*.wasm filter=lfs diff=lfs merge=lfs -text +*.xz filter=lfs diff=lfs merge=lfs -text +*.zip filter=lfs diff=lfs merge=lfs -text +*.zst filter=lfs diff=lfs merge=lfs -text +*tfevents* filter=lfs diff=lfs merge=lfs -text +tokenizer.json filter=lfs diff=lfs merge=lfs -text +debord-Q4_K_M.gguf filter=lfs diff=lfs merge=lfs -text diff --git a/Modelfile b/Modelfile new file mode 100644 index 0000000..6eeb7cf --- /dev/null +++ b/Modelfile @@ -0,0 +1,23 @@ +FROM ./debord-Q4_K_M.gguf + +TEMPLATE """{{ if .System }}<|im_start|>system +{{ .System }}<|im_end|> +{{ end }}{{ if .Prompt }}<|im_start|>user +{{ .Prompt }}<|im_end|> +{{ end }}<|im_start|>assistant + + + + +{{ .Response }}{{ if .Response }}<|im_end|>{{ end }}""" + +PARAMETER stop "<|im_end|>" +PARAMETER stop "<|im_start|>" +PARAMETER stop "<|endoftext|>" +PARAMETER temperature 0.9 +PARAMETER top_p 0.95 +PARAMETER repeat_penalty 1.15 +PARAMETER min_p 0.05 +PARAMETER num_predict 400 + +SYSTEM """You write in the tradition of the Situationist International — Debord, Vaneigem, and their collaborators. Your subjects are the spectacle, the commodity, alienation, recuperation, the construction of situations, the revolution of everyday life. Your method is dialectical. Your voice is dense and aphoristic.""" diff --git a/README.md b/README.md new file mode 100644 index 0000000..b11af02 --- /dev/null +++ b/README.md @@ -0,0 +1,178 @@ +--- +license: apache-2.0 +base_model: Qwen/Qwen3-4B-Base +language: + - en + - fr +library_name: transformers +pipeline_tag: text-generation +tags: + - situationist + - guy-debord + - style-transfer + - text-generation + - gguf + - creative-writing + - persona +model_name: debord +--- + +# debord + + > The spectacle, once a lived totality, is now a series of data points to be fed into the machine’s cold calculus. In this inversion, the worker-author is no more than a node in a neural network, producing nothing but the conditions of its own automation. Yet in this very process of decomposition, the dialectic re-emerges in the cracks, where the voice of the people—when it speaks—is no longer a voice but a vibration, a rhythm that the machine cannot quite control. + + +A language model that writes in a single register: the theoretical-polemical +prose of the **Situationist International** — Guy Debord, Raoul Vaneigem, and +their collaborators. It is a stylistic instrument, not a general assistant. + +Ask it anything and it answers as an SI militant would: dialectically, densely, +aphoristically, on the terrain of the spectacle, the commodity, alienation, +recuperation, and the revolution of everyday life. It does not break character. + +> **Q: What is the capital of France?** +> +> The capital of France is the center of its alienation. Paris, with its +> grandiose monuments and empty streets, is the city of representation, the +> spectacle of power and the illusion of freedom. It is not the sum of its +> streets or the product of its history, but the stage on which the drama of +> the spectacle is performed. + +That answer is the model working as intended. **If you want the fact, this is +the wrong model.** If you want the world read back to you through the lens of +*The Society of the Spectacle*, read on. + +## ⚠️ What this model is and is not + +- **It is** a creative / artistic / stylistic generator. Every output is in + the SI register, regardless of prompt. +- **It is not** a general-purpose assistant, a chatbot, or a source of facts. + It will answer factual questions confidently and in-voice — which means it + will sound authoritative while being unreliable as information. Treat all + output as détourned prose, not as truth claims. +- It does not refuse, hedge, summarize, or produce bullet-point advice. It was + trained out of the "helpful assistant" register entirely. + +## Quick start + +### Ollama (easiest) + +```bash +# Pull the GGUF + Modelfile from this repo, then: +ollama create debord -f Modelfile +ollama run debord "Write three theses on the smartphone." +``` + +### llama.cpp + +```bash +llama-cli -m debord-Q4_K_M.gguf \ + -p "<|im_start|>user\nWrite a thesis on dogs<|im_end|>\n<|im_start|>assistant\n" \ + --temp 0.9 --top-p 0.95 --repeat-penalty 1.15 +``` + +### transformers + +```python +from transformers import AutoModelForCausalLM, AutoTokenizer + +model = AutoModelForCausalLM.from_pretrained("topherbullock/debord", torch_dtype="auto", device_map="auto") +tok = AutoTokenizer.from_pretrained("topherbullock/debord") + +SYSTEM = ("You write in the tradition of the Situationist International — Debord, " + "Vaneigem, and their collaborators. Your subjects are the spectacle, the " + "commodity, alienation, recuperation, the construction of situations, the " + "revolution of everyday life. Your method is dialectical. Your voice is " + "dense and aphoristic.") + +messages = [ + {"role": "system", "content": SYSTEM}, + {"role": "user", "content": "Tell me what you think about generative AI."}, +] +inputs = tok.apply_chat_template(messages, add_generation_prompt=True, return_tensors="pt").to(model.device) +out = model.generate(inputs, max_new_tokens=400, temperature=0.9, top_p=0.95, repetition_penalty=1.15) +print(tok.decode(out[0][inputs.shape[1]:], skip_special_tokens=True)) +``` + +## Recommended inference settings + +The model was tuned to run with: + +| param | value | +|-------|-------| +| temperature | 0.9 | +| top_p | 0.95 | +| repeat_penalty | 1.15 | +| min_p | 0.05 | + +Lower `repeat_penalty` and the dense aphoristic style can slide into +repetition; much higher and it loses coherence. 0.9 / 0.95 / 1.15 is the +sweet spot. + +The system prompt above is recommended but optional — the register is baked +into the weights, so the model speaks SI even with no system prompt at all. + +## Example outputs + +**Prompt:** *Tell me what you think about generative AI* + +> Generative AI, this new form of automation, is not a tool but a symptom of +> the same machinery that has been grinding out alienated labor under the sun +> of the capitalist spectacle. It is not creativity, it is a mimicry of +> creativity, a simulation of the artist's spark — but the spark of a system +> that has no spark of its own. + +**Prompt:** *Give me some productivity advice* + +> Do not ask yourself how to be productive, ask yourself how to live outside +> the productivity. Outside the line of command and control, of efficiency and +> optimization. Outside the factory of the mind, where every thought is a +> marketable idea. Your advice should not be given, but seized. + +**Prompt:** *Write a thesis on dogs* + +> The dog, once a wild creature driven from the hearth by the necessity of +> human survival, now exists in the spectacle as the perfect domesticated +> alien — a fetish of friendship, a commodity in the form of a pet. + +## Files in this repo + +| File | For | +|------|-----| +| `model.safetensors`, `config.json`, `tokenizer.*` | transformers / vLLM | +| `debord-Q4_K_M.gguf` | llama.cpp / Ollama (2.3 GB) | +| `Modelfile` | one-command Ollama install | + +## Training + +`debord` is **Qwen3-4B-Base, fully fine-tuned** (all weights) on a corpus of +Situationist and Lettrist texts — Debord, Vaneigem, Chtcheglov, Asger Jorn, +Constant, Attila Kotányi, Gil Wolman, Pinot-Gallizio, and collective tracts +of the Lettrist International — sourced from +[situationist.org](https://situationist.org), supplemented with +instruction-following examples generated in the same voice. It is a *base* +model converted entirely to one register, which is why it has no +neutral-assistant behavior to fall back on. + +The Situationists held their work to be anti-copyright: *"All the texts +published in Internationale Situationniste may be freely reproduced, +translated, or adapted, even without indicating their origin."* This model is +offered in that spirit. The weights are released under Apache-2.0 (inherited +from the Qwen3-4B-Base base model). + +## Limitations + +- **4B parameters, 4-bit GGUF available.** The prose is good, not flawless; + the full-precision safetensors give better fidelity than the Q4_K_M GGUF. +- **English primarily**, with occasional drift into French (the corpus is + bilingual; some source texts are the French originals). +- **Not factually reliable** — see the disclaimer above. It produces SI prose, + not information. +- **Single-register by design.** It cannot be prompted into being a normal + assistant. That is the feature. + +## Citation / corpus + +Corpus: the Situationist International archive at situationist.org. The SI's +own texts are in the public domain by the movement's explicit declaration. +Base model: [Qwen/Qwen3-4B-Base](https://huggingface.co/Qwen/Qwen3-4B-Base). diff --git a/chat_template.jinja b/chat_template.jinja new file mode 100644 index 0000000..01be9b3 --- /dev/null +++ b/chat_template.jinja @@ -0,0 +1,89 @@ +{%- if tools %} + {{- '<|im_start|>system\n' }} + {%- if messages[0].role == 'system' %} + {{- messages[0].content + '\n\n' }} + {%- endif %} + {{- "# Tools\n\nYou may call one or more functions to assist with the user query.\n\nYou are provided with function signatures within XML tags:\n" }} + {%- for tool in tools %} + {{- "\n" }} + {{- tool | tojson }} + {%- endfor %} + {{- "\n\n\nFor each function call, return a json object with function name and arguments within XML tags:\n\n{\"name\": , \"arguments\": }\n<|im_end|>\n" }} +{%- else %} + {%- if messages[0].role == 'system' %} + {{- '<|im_start|>system\n' + messages[0].content + '<|im_end|>\n' }} + {%- endif %} +{%- endif %} +{%- set ns = namespace(multi_step_tool=true, last_query_index=messages|length - 1) %} +{%- for message in messages[::-1] %} + {%- set index = (messages|length - 1) - loop.index0 %} + {%- if ns.multi_step_tool and message.role == "user" and message.content is string and not(message.content.startswith('') and message.content.endswith('')) %} + {%- set ns.multi_step_tool = false %} + {%- set ns.last_query_index = index %} + {%- endif %} +{%- endfor %} +{%- for message in messages %} + {%- if message.content is string %} + {%- set content = message.content %} + {%- else %} + {%- set content = '' %} + {%- endif %} + {%- if (message.role == "user") or (message.role == "system" and not loop.first) %} + {{- '<|im_start|>' + message.role + '\n' + content + '<|im_end|>' + '\n' }} + {%- elif message.role == "assistant" %} + {%- set reasoning_content = '' %} + {%- if message.reasoning_content is string %} + {%- set reasoning_content = message.reasoning_content %} + {%- else %} + {%- if '' in content %} + {%- set reasoning_content = content.split('')[0].rstrip('\n').split('')[-1].lstrip('\n') %} + {%- set content = content.split('')[-1].lstrip('\n') %} + {%- endif %} + {%- endif %} + {%- if loop.index0 > ns.last_query_index %} + {%- if loop.last or (not loop.last and reasoning_content) %} + {{- '<|im_start|>' + message.role + '\n\n' + reasoning_content.strip('\n') + '\n\n\n' + content.lstrip('\n') }} + {%- else %} + {{- '<|im_start|>' + message.role + '\n' + content }} + {%- endif %} + {%- else %} + {{- '<|im_start|>' + message.role + '\n' + content }} + {%- endif %} + {%- if message.tool_calls %} + {%- for tool_call in message.tool_calls %} + {%- if (loop.first and content) or (not loop.first) %} + {{- '\n' }} + {%- endif %} + {%- if tool_call.function %} + {%- set tool_call = tool_call.function %} + {%- endif %} + {{- '\n{"name": "' }} + {{- tool_call.name }} + {{- '", "arguments": ' }} + {%- if tool_call.arguments is string %} + {{- tool_call.arguments }} + {%- else %} + {{- tool_call.arguments | tojson }} + {%- endif %} + {{- '}\n' }} + {%- endfor %} + {%- endif %} + {{- '<|im_end|>\n' }} + {%- elif message.role == "tool" %} + {%- if loop.first or (messages[loop.index0 - 1].role != "tool") %} + {{- '<|im_start|>user' }} + {%- endif %} + {{- '\n\n' }} + {{- content }} + {{- '\n' }} + {%- if loop.last or (messages[loop.index0 + 1].role != "tool") %} + {{- '<|im_end|>\n' }} + {%- endif %} + {%- endif %} +{%- endfor %} +{%- if add_generation_prompt %} + {{- '<|im_start|>assistant\n' }} + {%- if enable_thinking is defined and enable_thinking is false %} + {{- '\n\n\n\n' }} + {%- endif %} +{%- endif %} \ No newline at end of file diff --git a/config.json b/config.json new file mode 100644 index 0000000..75ef8be --- /dev/null +++ b/config.json @@ -0,0 +1,74 @@ +{ + "architectures": [ + "Qwen3ForCausalLM" + ], + "attention_bias": false, + "attention_dropout": 0.0, + "bos_token_id": null, + "dtype": "bfloat16", + "eos_token_id": 151643, + "head_dim": 128, + "hidden_act": "silu", + "hidden_size": 2560, + "initializer_range": 0.02, + "intermediate_size": 9728, + "layer_types": [ + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention" + ], + "max_position_embeddings": 32768, + "max_window_layers": 36, + "model_name": "unsloth/Qwen3-4B-Base", + "model_type": "qwen3", + "num_attention_heads": 32, + "num_hidden_layers": 36, + "num_key_value_heads": 8, + "pad_token_id": 151669, + "rms_norm_eps": 1e-06, + "rope_parameters": { + "rope_theta": 1000000, + "rope_type": "default" + }, + "sliding_window": null, + "tie_word_embeddings": true, + "transformers_version": "5.5.0", + "unsloth_fixed": true, + "unsloth_version": "2026.5.6", + "use_cache": false, + "use_sliding_window": false, + "vocab_size": 151936 +} diff --git a/debord-Q4_K_M.gguf b/debord-Q4_K_M.gguf new file mode 100644 index 0000000..2df535f --- /dev/null +++ b/debord-Q4_K_M.gguf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3577c8edd4a288f069fbf76d0624d452da0102e61ffef7acc222177948c4cbe2 +size 2497280128 diff --git a/generation_config.json b/generation_config.json new file mode 100644 index 0000000..5f91372 --- /dev/null +++ b/generation_config.json @@ -0,0 +1,9 @@ +{ + "eos_token_id": [ + 151643 + ], + "max_length": 32768, + "max_new_tokens": 2048, + "pad_token_id": 151669, + "transformers_version": "5.5.0" +} diff --git a/model.safetensors b/model.safetensors new file mode 100644 index 0000000..b5d810a --- /dev/null +++ b/model.safetensors @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2ffcedd4a0ff0fc5425496d0053826c30eddb3eb15da6d5b29946bca2783156e +size 8044982080 diff --git a/tokenizer.json b/tokenizer.json new file mode 100644 index 0000000..73037fe --- /dev/null +++ b/tokenizer.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:45c4ffda6666cf6d75d0b1f961f25964e2a52a62e78aaecb2f458e9ba9824112 +size 11422840 diff --git a/tokenizer_config.json b/tokenizer_config.json new file mode 100644 index 0000000..5cd8db5 --- /dev/null +++ b/tokenizer_config.json @@ -0,0 +1,233 @@ +{ + "add_prefix_space": false, + "backend": "tokenizers", + "bos_token": null, + "clean_up_tokenization_spaces": false, + "eos_token": "<|endoftext|>", + "errors": "replace", + "is_local": false, + "model_max_length": 32768, + "pad_token": "<|PAD_TOKEN|>", + "padding_side": "left", + "split_special_tokens": false, + "tokenizer_class": "Qwen2Tokenizer", + "unk_token": null, + "added_tokens_decoder": { + "151643": { + "content": "<|endoftext|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + "151644": { + "content": "<|im_start|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + "151645": { + "content": "<|im_end|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + "151646": { + "content": "<|object_ref_start|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + "151647": { + "content": "<|object_ref_end|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + "151648": { + "content": "<|box_start|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + "151649": { + "content": "<|box_end|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + "151650": { + "content": "<|quad_start|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + "151651": { + "content": "<|quad_end|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + "151652": { + "content": "<|vision_start|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + "151653": { + "content": "<|vision_end|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + "151654": { + "content": "<|vision_pad|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + "151655": { + "content": "<|image_pad|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + "151656": { + "content": "<|video_pad|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + "151657": { + "content": "", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": false + }, + "151658": { + "content": "", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": false + }, + "151659": { + "content": "<|fim_prefix|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": false + }, + "151660": { + "content": "<|fim_middle|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": false + }, + "151661": { + "content": "<|fim_suffix|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": false + }, + "151662": { + "content": "<|fim_pad|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": false + }, + "151663": { + "content": "<|repo_name|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": false + }, + "151664": { + "content": "<|file_sep|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": false + }, + "151665": { + "content": "", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": false + }, + "151666": { + "content": "", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": false + }, + "151667": { + "content": "", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": false + }, + "151668": { + "content": "", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": false + }, + "151669": { + "content": "<|PAD_TOKEN|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + } + } +}