中文概率决策模型:一次前向,直接返回候选项概率。
A Chinese decision model fine-tuned from Qwen3.5-2B with LoRA and CE + RLCD. It supports yes/no, single-choice and ordinal decisions across general, medical, legal and finance tasks. This package contains merged BF16 weights and the existing validation-fitted temperature.
代码 · 模型总览 · Decision Studio · 训练数据 · 测试集
0.8B BF16 · 0.8B Q8_0 · 2B BF16 · 2B Q8_0
相关资源
简介
Chinese Decision 是一个面向中文场景的轻量级决策模型。它不聊天、不生成文本:给定上下文和一组固定候选项,一次前向直接返回每个候选项的概率,适合意图识别、工单分流、内容审核、数据打标、给模型输出打分、智能体动作选择等"有限选项判断"任务。
- 一次前向,零输出 token:读取最后位置上候选字母
A–Z 的 logits,softmax 后即为概率。
- 三种题型:
noul(是/否)、choice(单选)、score(有序等级,返回期望分值)。
- 单一模型覆盖四个领域:通用、医疗、法律、金融混合训练。
- 系列中准确率最高:CJ-Bench 全量整体 ACC 84.11%,医疗 / 法律 / 金融平均 78.25%,比 chinese-decision-0.8b 分别高 1.01 / 1.35 个百分点。
- 概率经过校准:附带在独立校准划分上拟合的温度,整体 ECE 0.64%。
模型与交付状态
更新于 2026-10-17。BF16 合并模型已完成全量 CJ-Bench、保存/重载和实际 HTTP 三题型/双路由验证,并已在 Hugging Face 与 ModelScope 公开发布。由本模型直接转换的 Q8_0 GGUF 也已完成全量 CJ-Bench 对照,见 2B Q8_0 模型卡。
| 项目 |
值 |
| 基础模型 |
Qwen3.5-2B,文本决策主干 |
| 训练目标 |
候选分布交叉熵 + RLCD;LoRA rank 32 |
| 训练覆盖 |
1 epoch,13,048,000 条决策,4,994 步,4 卡 |
| best |
验证集 distribution NLL 选择 step 4994,NLL 0.5860035124 |
| RLCD |
group size 4,sigma 按已训练样本进度从 0.4 降至 0.1 |
| 交付权重 |
model.safetensors,BF16,3,763,692,048 字节 |
| 默认温度 |
1.074872374534607,独立验证划分拟合 |
| 输入 / 候选项 |
最长 16,384 tokens / 单题 2–26 项(训练覆盖 2–16 项),类别更多用 /v1/tournament 分组淘汰 |
| 提示版本 |
hmm-zh-v1,关闭 thinking,末位候选字母 logits |
| 训练结束 |
2026-10-17 17:25:54,Asia/Shanghai |
训练数据版本 a3963a61f71e00051a80721e587d720d8926e8e7。最终 adapter SHA256 为 9b55e8eda00997544b76fa945d890605c3acae4199041c197ef5a09275142a7c;合并权重 SHA256 为 a8fadd326b19a278f8c26216ca481b607369baca33962aac0d8fda603c830068。
文件说明
| 文件 |
内容 |
| model.safetensors、config.json |
合并模型,无需再次加载 PEFT adapter |
| tokenizer.json、tokenizer_config.json、chat_template.jinja |
tokenizer 与聊天模板 |
| decision_config.json |
模型身份、温度、最大长度与候选数 |
| training_config.json、training_summary.json |
配置、训练覆盖、best 的来源 |
| validation_report.json |
选模验证集的校准前后指标,不是测试集结果 |
| LICENSE、LICENSES/、THIRD_PARTY_NOTICES.md |
许可与上游方法归属 |
快速开始
下载
hf download quincyqiang/chinese-decision-2b --local-dir models/chinese-decision-2b
# 或 ModelScope
modelscope download --model quincyqiang/chinese-decision-2b --local_dir models/chinese-decision-2b
GPU HTTP 服务
在 代码仓库 根目录安装推理依赖,模型目录放在 models/chinese-decision-2b:
pip install -e ".[torch]"
CUDA_VISIBLE_DEVICES=0 OMP_NUM_THREADS=6 TOKENIZERS_PARALLELISM=false \
python scripts/serve_gpu.py --base models/chinese-decision-2b \
--host 127.0.0.1 --port 8789 --token-budget 16384 --max-batch 32
启动前选择空闲 GPU;本命令不需要访问训练 run 或加载 adapter。测试服务:
curl http://127.0.0.1:8789/health
curl http://127.0.0.1:8789/v1/systemone -H 'Content-Type: application/json' --data-binary @examples/request.json
python scripts/verify_export.py --url http://127.0.0.1:8789
Python 直接读取候选概率
以下示例仅需 PyTorch 和 Transformers,不需要训练库或文本生成。项目实测环境为 torch 2.8.0、transformers 5.3 系列;安装约束见 pyproject.toml。固定候选顺序并读取 decision_config.json 的温度,不使用通用 text-generation pipeline。
import json
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
path = "models/chinese-decision-2b"
tokenizer = AutoTokenizer.from_pretrained(path)
model = AutoModelForCausalLM.from_pretrained(path, dtype=torch.bfloat16, attn_implementation="sdpa").to("cuda").eval()
config = json.load(open(f"{path}/decision_config.json", encoding="utf-8"))
temperature, max_length = config["temperature"], config["max_length"]
LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
letter_ids = [tokenizer.encode(c, add_special_tokens=False)[0] for c in LETTERS]
def text(value):
return value if isinstance(value, str) else json.dumps(value, ensure_ascii=False, separators=(",", ":"))
def options_for(question):
kind, criteria = question["type"], question.get("criteria")
if kind == "choice":
return [(str(k), text(v)) for k, v in criteria.items()]
if kind == "score":
return [(str(i), text(v)) for i, v in enumerate(criteria)]
criteria = criteria or {}
return [("false", text(criteria.get("false", "否"))), ("true", text(criteria.get("true", "是")))]
def build_prompt(state, instructions, options):
content = ("待判断的上下文:\n" + text(state)
+ "\n\n问题:\n" + text(instructions)
+ "\n\n候选项:\n" + "\n".join(f"{LETTERS[i]}: {k} — {v}" for i, (k, v) in enumerate(options))
+ "\n只返回候选项对应的字母。")
return tokenizer.apply_chat_template([{"role": "user", "content": content}], tokenize=False,
add_generation_prompt=True, enable_thinking=False)
@torch.inference_mode()
def decide(state, question):
options = options_for(question)
ids = tokenizer.encode(build_prompt(state, question["instructions"], options), add_special_tokens=False)
if len(ids) > max_length:
raise ValueError(f"input is {len(ids)} tokens; the limit is {max_length}")
logits = model(torch.tensor([ids], device=model.device), logits_to_keep=1, use_cache=False).logits
probs = (logits[0, -1, letter_ids[:len(options)]].float() / temperature).softmax(-1).tolist()
k, best = len(probs), max(range(len(probs)), key=probs.__getitem__)
answer = {"probabilities": {key: round(p, 4) for (key, _), p in zip(options, probs)},
"confidence": round((k * probs[best] - 1) / (k - 1), 4)}
if question["type"] == "noul":
answer["noul"] = round(probs[1], 4)
elif question["type"] == "choice":
answer["choice"] = options[best][0]
else:
answer["score"] = round(sum(i * p for i, p in enumerate(probs)), 4)
return answer
state = "客户留言:付款后一直没有收到发票,我已经催了三次,今天必须拿到。"
questions = {
"urgent": {"type": "noul", "instructions": "客户是否表达了紧迫性?"},
"department": {"type": "choice", "instructions": "应该由哪个部门处理?",
"criteria": {"billing": "支付、发票及退款", "technical": "故障和系统问题", "sales": "购买咨询与升级"}},
"frustration": {"type": "score", "instructions": "客户有多不满?", "criteria": ["平静", "不满", "非常愤怒"]},
}
for name, question in questions.items():
print(name, decide(state, question))
| 接口 |
用途 |
POST /v1/systemone |
决策;可追加 ?debug=1 查看候选 logits |
POST /api/alpha/decisions |
兼容 hmm 的同一决策路由 |
POST /v1/batch |
多请求批处理,单个请求失败不影响其他请求 |
POST /v1/compile |
编译输入并计数 tokens |
POST /v1/tournament |
类别更多的 choice 问题:分组淘汰后决赛,每组不超过 16 个候选 |
GET /health、GET /v1/info |
模型身份、step、温度及运行信息 |
每个请求最多 64 个问题,每题 2–26 个候选(类别更多时用 /v1/tournament,示例 examples/tournament.json 有 41 个客服意图),最长 16,384 tokens;超长或不合法输入返回 422,不静默截断。score 输出从 0 开始的等级期望值,不是最大概率等级;confidence = (K*p_max-1)/(K-1) 衡量分布尖锐程度,不等于经验准确率。
CJ-Bench 全量结果
CJ-Bench 全量为 307,900 条(304,822 条硬标签、3,078 条软标签),通用/医疗/法律/金融分别为 100,000 / 200,000 / 4,300 / 3,600 条。全部保留原始候选顺序,无过滤、无截断。ACC/ECE 仅计硬标签,ECE 使用 15 个等宽分箱;分布 NLL 与 Brier 包含软标签;Score MAE 覆盖 38,746 条评分题,计算预测期望等级与目标期望等级的绝对差。
整体 micro 按硬标签样本数加权,四领域 macro 是四个领域的等权平均,专业平均仅对医疗、法律、金融等权。不同量不能互换,整体 ECE 也不是领域 ECE 的平均。选模和温度拟合只使用验证数据,未使用 CJ-Bench 标签。
下表均为已发布的正式权重(LoRA 已合并,使用默认温度);本仓库为 chinese-decision-2b,chinese-decision-2b-gguf 由它直接转换。加粗表示 2B 相对同格式 0.8B 提升的指标。
关于温度 T:概率按 p = softmax(z / T) 计算,z 为候选字母的 logits。T = 1 表示直接对 logits 做 softmax、不做温度校准。发布权重附带在独立验证划分上拟合的温度(0.8B 为 1.108,2B 为 1.075),只调整概率的尖锐程度,不改变选出的答案:准确率不变,ECE / NLL 更好。
| 模型 |
格式 |
Micro ACC (%) ↑ |
Macro ACC (%) ↑ |
ECE (%) ↓ |
NLL ↓ |
Brier ↓ |
Score MAE ↓ |
| chinese-decision-0.8b |
BF16 |
83.1052 |
75.7376 |
0.2706 |
0.431318 |
0.223833 |
0.584427 |
| chinese-decision-0.8b-gguf |
Q8_0 |
83.1233 |
75.8092 |
0.2696 |
0.431293 |
0.223815 |
0.583973 |
| chinese-decision-2b |
BF16 |
84.1107 |
77.1750 |
0.6361 |
0.416520 |
0.213295 |
0.564216 |
| chinese-decision-2b-gguf |
Q8_0 |
84.1094 |
77.3282 |
0.6534 |
0.416288 |
0.213189 |
0.563738 |
相对 chinese-decision-0.8b,本模型 Micro +1.01、Macro +1.44、专业平均 +1.35 个百分点,NLL / Brier / Score MAE 均更低;整体 ECE 略高(0.64% vs 0.27%)。训练阶段表中的 checkpoint 为合并前、T = 1 的结果,与发布权重相差在合并的数值误差范围内(同批次验证集审计为 14/1200 条 argmax 变化)。
分领域与分题型
| 模型 |
格式 |
General ACC (%) |
Medical ACC (%) |
Legal ACC (%) |
Finance ACC (%) |
Professional avg. ACC (%) |
| chinese-decision-0.8b |
BF16 |
72.26 |
88.85 |
67.84 |
74.00 |
76.90 |
| chinese-decision-0.8b-gguf |
Q8_0 |
72.23 |
88.89 |
67.84 |
74.28 |
77.00 |
| chinese-decision-2b |
BF16 |
73.96 |
89.50 |
68.74 |
76.50 |
78.25 |
| chinese-decision-2b-gguf |
Q8_0 |
73.91 |
89.50 |
69.40 |
76.50 |
78.47 |
| 题型 |
样本数 |
chinese-decision-0.8b ACC (%) |
chinese-decision-2b ACC (%) |
2B ECE (%) |
2B NLL |
2B Score MAE |
noul |
134,577 |
94.96 |
95.11 |
0.34 |
0.114612 |
— |
choice |
134,577 |
78.32 |
80.12 |
0.90 |
0.559377 |
— |
score |
38,746 |
56.45 |
57.67 |
1.65 |
0.968959 |
0.564216 |
训练阶段
每 1000 步按验证集分布 NLL 选出的 checkpoint,均在全量 307,900 条上评测(合并前,T = 1,即不做温度校准)。进度按实际已训练样本计算;最后一行为发布权重。
| Checkpoint |
训练进度 |
General ACC (%) |
Medical ACC (%) |
Legal ACC (%) |
Finance ACC (%) |
Professional avg. ACC (%) |
ECE (%) |
| step 1000 |
20.08% |
70.55 |
87.69 |
55.67 |
66.94 |
70.10 |
2.03 |
| step 2000 |
40.13% |
72.56 |
88.54 |
62.67 |
71.44 |
74.22 |
1.27 |
| step 3000 |
60.11% |
71.87 |
88.99 |
65.56 |
74.31 |
76.28 |
1.63 |
| step 4000 |
80.18% |
73.77 |
89.42 |
68.40 |
76.03 |
77.95 |
0.85 |
| step 4994(最终) |
100.00% |
73.95 |
89.50 |
69.05 |
76.03 |
78.19 |
1.49 |
| chinese-decision-2b(发布权重) |
— |
73.96 |
89.50 |
68.74 |
76.50 |
78.25 |
0.64 |
法律、金融提升最多(+13.37 / +9.08 个百分点)。step3000 通用领域的回落来自商品分类来源的暂时崩落,step4000 恢复;后段准确率趋于平台。完整诊断见 训练交付记录。
与其他决策模型对比
下表的外部模型数字为 Chinese-Jev 原文 Table 1 / Table 2 的作者报告值,2026-10-17 核对,本项目没有重跑这些模型;本项目行为发布权重。加粗为每列最优。
通用领域(Table 1)
| 模型 |
ACC (%) ↑ |
ECE (%) ↓ |
| Qwen3.5-2B |
32.95 |
43.68 |
| Open-Jev |
52.33 |
10.54 |
| SemIF |
44.21 |
27.27 |
| Laya Multilingual |
40.22 |
23.04 |
| Jev (API) |
68.35 |
11.45 |
| Chinese-Jev General / Specialists |
69.20 |
3.78 |
| chinese-decision-0.8b |
72.26 |
1.68 |
| chinese-decision-2b |
73.96 |
1.93 |
专业领域(Table 2)
| 模型 |
Medical ACC |
Medical ECE |
Legal ACC |
Legal ECE |
Finance ACC |
Finance ECE |
Avg. ACC |
Avg. ECE |
| Qwen3.5-2B |
53.88 |
28.71 |
31.53 |
44.82 |
38.11 |
49.12 |
41.17 |
40.88 |
| Open-Jev |
73.08 |
2.88 |
44.07 |
23.15 |
48.11 |
10.19 |
55.09 |
12.07 |
| SemIF |
62.17 |
10.39 |
43.07 |
19.99 |
47.89 |
18.45 |
51.04 |
16.28 |
| Laya Multilingual |
24.55 |
43.05 |
34.72 |
31.49 |
38.31 |
26.18 |
32.53 |
33.57 |
| Jev (API) |
84.29 |
5.70 |
68.35 |
8.03 |
78.39 |
2.98 |
77.01 |
5.57 |
| Chinese-Jev General |
39.77 |
17.33 |
38.76 |
15.37 |
35.39 |
14.43 |
37.97 |
15.71 |
| Chinese-Jev General / Specialists |
87.65 |
7.25 |
60.10 |
17.45 |
64.72 |
11.55 |
70.82 |
12.08 |
| chinese-decision-0.8b |
88.85 |
1.12 |
67.84 |
4.05 |
74.00 |
2.45 |
76.90 |
2.54 |
| chinese-decision-2b |
89.50 |
0.24 |
68.74 |
3.37 |
76.50 |
2.13 |
78.25 |
1.92 |
本模型相对 Chinese-Jev(General + 三个 Specialist)在通用 / 医疗 / 法律 / 金融分别高 4.76 / 1.85 / 8.64 / 11.78 个百分点,专业平均高 7.43;相对闭源 Jev,专业平均高 1.24,金融仍低 1.89。四个领域的 ECE 都低于论文中的所有模型。Chinese-Jev General 加上医疗、法律和金融 Specialist 是 四个分别模型;本项目每个尺寸各使用一个模型覆盖四领域。Jev 为闭源 API。论文使用 H200,本地使用 A800;延迟口径和硬件不同,不做等价排名。
2B 与 0.8B 的模型规模、batch 和训练目标同时变化,因此结果不能当作 RLCD 的独立收益。两者 best 已见样本分别为 13,048,000 与 12,879,232,应按样本量比较进度。
Q8_0 版本
由本模型直接转换的 2B Q8_0 GGUF(2.01 GB,llama.cpp,CPU 可运行,不需要 PyTorch)沿用同一温度,在 CJ-Bench 全部 307,900 条上与本模型逐条配对:整体 ACC 84.1094%(本模型 84.1107%,净少对 4 条),首选项一致率 99.00%,ECE 0.6534%(本模型 0.6361%),NLL、Brier、Score MAE 略降。四领域 macro 77.3282%、专业平均 78.4663%,高出的部分主要来自法律领域(4,300 条中净多对 28 条),不代表量化提升了能力。
全量在 llama.cpp CUDA 上测得,CPU 只验证了有限输入。分领域、分题型、来源变化、BF16 GGUF 后端对照与 CPU / GPU 延迟见 2B Q8_0 模型卡。
校准验证与测试的区别
温度只在母记录分组后的验证划分 0 上拟合,选模使用划分 1–4。后者固定 1200 条验证数据上:
| 合并模型验证指标 |
T=1 |
T=1.0748723745 |
| 硬标签 ACC (%) |
76.0906 |
76.0906 |
| ECE(10 bins,%) |
2.3324 |
1.0608 |
| 分布 NLL |
0.585104 |
0.582978 |
| Brier |
0.316658 |
0.315944 |
上述验证 ECE 为 10 bins,不能混入使用 15 bins 的 CJ-Bench 测试表。全局温度不能保证所有领域、来源或题型都改善。
性能与已知局限
同服务器、25 条输入、每条预热后测 3 次,Transformers BF16 GPU 的单请求 p50 为 44.77 ms;短输入(92–255 tokens)p50 为 44.68 ms。这是预先分词后的前向及概率计算,不含分词、HTTP 或网络,且为共享 A800 服务器。完整长度范围为 92–6521 tokens,不能从这些输入推断生产吞吐。
- 2B 的整体准确率更高,但法律判断与金融评分仍落后于 0.8B:法律 noul 为 82.07%(chinese-decision-0.8b 为 85.60%),金融 score 为 80.33%(0.8B 为 82.83%);Q8_0 为 82.73% 和 80.58%。
- 商品分类来源 3,151 条在训练中波动:step3000 严重退化,step4000 恢复,发布权重 ACC 为 70.96%、NLL 1.5125(合并前 checkpoint 在 T = 1 时为 70.99%、1.6029)。整体指标不能代替来源诊断。
- 温度校准降低了整体 ECE,但 Score MAE 比 T = 1 时略高(0.5642 vs 0.5607);金融领域仍低于闭源 Jev 的作者报告准确率。
- 不用于聊天或开放式生成;仅针对中文固定候选任务训练。标签含义来自原任务,不能代替专业正确性判断。阈值与人工复核区间需用实际业务数据验证。
原始报告:reports/cj-bench-2b-step4994-20261017 与 reports/cj-bench-2b-step4994-calibrated-20261017。数据 manifest SHA256 为 461bb692676e8c01bbc89a5478a6cda9e5d0096afd2c82919d73f45a018ea351。更多训练进度和来源诊断见 训练交付记录。
归属、许可与引用
模型权重保留基础 Qwen3.5-2B 的 Apache-2.0 LICENSE。项目代码以 MIT 为主,RLCD 改编部分保留 Apache-2.0;原文与声明见 LICENSES/ 和 THIRD_PARTY_NOTICES.md。数据许可按来源分别适用,模型交付不授予数据再分发权利。
方法参考 hmm,RLCD 与数据参考 Chinese-Jev。本项目没有复现 Jev 或 Chinese-Jev 的训练过程。使用数据或基线时请同时引用 Chinese-Jev 论文。
@misc{chinese-decision-2026,
title = {Chinese Decision: A Lightweight Chinese Probabilistic Decision Model},
author = {yanqiangmiffy},
year = {2026},
howpublished = {\url{https://github.com/yanqiangmiffy/chinese-decision}}
}