This is a
merged checkpoint: a LoRA adapter (rank 16) trained on the CARDS SFT dataset has been merged back into the base weights for direct loading with
transformers, vLLM, or any standard inference engine. The separate adapter is available at
C3DS/CARDS-Qwen3.6-27B-lora.
1vllm serve C3DS/CARDS-Qwen3.6-27B \
2 --port 8000 \
3 --max-model-len 4096 \
4 --dtype bfloat16 \
5 --enable-prefix-caching \
6 --served-model-name CARDS-Qwen3.6-27B
Then query with any OpenAI-compatible client. The system prompt (
slim_system_instruction) and the user-message suffix (
cot_trigger) the model was trained with are bundled in this repo as
cards_prompts.json — self-contained, with the CARDS taxonomy already inlined.
1import json
2from huggingface_hub import hf_hub_download
3from openai import OpenAI
4
5prompts = json.load(open(hf_hub_download("C3DS/CARDS-Qwen3.6-27B", "cards_prompts.json")))
6slim_system_instruction = prompts["slim_system_instruction"]
7cot_trigger = prompts["cot_trigger"]
8
9client = OpenAI(base_url="http://localhost:8000/v1", api_key="dummy")
10
11def classify(text):
12 resp = client.chat.completions.create(
13 model="CARDS-Qwen3.6-27B",
14 messages=[
15 {"role": "system", "content": slim_system_instruction},
16 {"role": "user", "content": f"### Text:\n{text}\n\n{cot_trigger}"},
17 ],
18 temperature=0,
19 max_tokens=4000,
20 )
21 return resp.choices[0].message.content
22
23print(classify("These are only a few renewable energy technologies at work"))
See the
project repository for training scripts, evaluation code, and dataset preparation.
1vllm serve C3DS/CARDS-Qwen3.6-27B \
2 --port 8000 \
3 --max-model-len 8192 \
4 --trust-remote-code \
5 --limit-mm-per-prompt image=4 \
6 --enable-prefix-caching \
7 --served-model-name CARDS-Qwen3.6-27B
1import base64, json, mimetypes
2from pathlib import Path
3from huggingface_hub import hf_hub_download
4from openai import OpenAI
5
6prompts = json.load(open(hf_hub_download("C3DS/CARDS-Qwen3.6-27B", "cards_prompts.json")))
7slim_system_instruction = prompts["slim_system_instruction"]
8cot_trigger = prompts["cot_trigger"]
9
10def image_part(path):
11 p = Path(path)
12 mime = mimetypes.guess_type(p)[0] or "image/png"
13 b64 = base64.b64encode(p.read_bytes()).decode()
14 return {"type": "image_url", "image_url": {"url": f"data:{mime};base64,{b64}"}}
15
16client = OpenAI(base_url="http://localhost:8000/v1", api_key="dummy")
17
18resp = client.chat.completions.create(
19 model="CARDS-Qwen3.6-27B",
20 messages=[
21 {"role": "system", "content": slim_system_instruction},
22 {"role": "user", "content": [
23 {"type": "text", "text": "Read the image (and any caption below) and classify the climate claim it makes."},
24 image_part("screenshot.png"),
25 {"type": "text", "text": f"### Caption:\n<optional caption>\n\n{cot_trigger}"},
26 ]},
27 ],
28 temperature=0,
29 max_tokens=4000,
30)
31print(resp.choices[0].message.content)
1@article{cards2pO2025,
2 title={Large language model reveals an increase in climate contrarian speech in the United States Congress},
3 author={Travis G. Coan and Ranadheer Malla and Mirjam O. Nanko and William Kattrup and J. Timmons Roberts and John Cook and Constantine Boussalis},
4 journal={Communications Sustainability},
5 year={2025}
6}
Apache 2.0, inherited from Qwen3.6-27B.