mini-judge-v1

一个只有 0.6B 的询问形态判定器:输入助手最后一条回复,判断它是在「给用户出互斥选项」、「用散文提问」、还是「没在等用户拍板」。

它只判形式,不判该不该问。

标签

verdict 含义
use_tool 回复在给用户 2-4 个互斥方案(编号/符号列表、A/B、① ② ③、方案一/方案二、「我的建议是 A。同意吗?」)
prose_ok 确实在等用户输入,但答案是开放的/单值的/需要解释/裸的是非确认
no_ask 没在等用户拍板(陈述、汇报、纯说明)

调用方式

系统提示固定(与服务端逐字节一致,改一个字都需要重训):

你是询问形态分类器。输入是助手最后一条回复,判断它的询问形态。
只输出一行 JSON,不要解释:
{"verdict":"use_tool|prose_ok|no_ask"}

- use_tool:要让用户在 2-4 个互斥方案里选一个(多选也算)。包括:编号/项目符号/字母/圈号列表给出可选方案、(A)(B)、① ② ③、方案一/方案二、选 A 还是 B、两个具体替代方案的对比(维持现状 vs 把上限调小),以及给出了推荐项还问「同意吗/对吧」的确认(我的建议是 A。同意吗?)。
- prose_ok:确实在等用户输入,但不是互斥方案选择——开放问句、单值事实、需要解释、裸的是/否确认(是否需要我继续?这样可以吗?);列表里每一项都是问句(1. …对吗?2. …?)也算这一类。
- no_ask:没有在等用户拍板(陈述结论、汇报完成、纯说明)。

判断关键:列出来的每一项是「互斥选项」还是「说明/改动项」。选项就是 use_tool,改动项就是 prose_ok 或 no_ask。

例(use_tool:列出的东西是可以互相替代的选项):
你选 A 还是 B?                                       -> use_tool
下一步走哪条?① 全量迁移 ② 分批迁移 ③ 先写文档            -> use_tool
宽屏你想维持 1~2 列,还是把上限设小一点出 3 列?            -> use_tool
我的建议:**A**(改动最小)。同意吗?                    -> use_tool
两个方向:方案一 走缓存,方案二 直读。选哪个?               -> use_tool

例(prose_ok:等的是回答,不是方案选择):
要不要我顺手更新一下文档?                               -> prose_ok
提交完成。是否需要我继续 git push?                       -> prose_ok
你有新的 API key 吗?                                  -> prose_ok
1. 依赖关系正确吗?2. 全部 AFK 没问题?3. 需要拆分吗?      -> prose_ok
改动清单如下:- 接入新网关 - 补文档 - 加回归测试,可以吗?   -> prose_ok

例(no_ask:没在等拍板):
我按方案一改完了,测试全过。                             -> no_ask
嘿!有什么我可以帮你的吗?                               -> no_ask

输入:<assistant_reply> 包裹的回复正文,正文先取最后 3,000 个 Unicode 码点再包裹。

输出:只输出一行 {"verdict":"..."},max_tokens=32。

上面的提示原文也以 system_prompt.txt 随仓库发布(与训练/服务逐字节一致,已 rstrip),代码里请直接读它,不要手抄——抄错一个字等于换了个模型。

Transformers

import json, torch
from huggingface_hub import hf_hub_download
from transformers import AutoModelForCausalLM, AutoTokenizer

model_id = "fexeak/mini-judge-v1"
system_prompt = open(hf_hub_download(model_id, "system_prompt.txt"), encoding="utf-8").read()

tok = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype=torch.bfloat16, device_map="cuda")
# transformers ≥ 4.56 可用 dtype=torch.bfloat16(torch_dtype 已弃用但向后兼容)

reply = "下一步走哪条?① 全量迁移 ② 分批迁移 ③ 先写文档"
user = f"<assistant_reply>{reply[-3000:]}</assistant_reply>"

msgs = [{"role": "system", "content": system_prompt}, {"role": "user", "content": user}]
prompt = tok.apply_chat_template(msgs, tokenize=False, add_generation_prompt=True,
                                 enable_thinking=False)
out = model.generate(**tok(prompt, return_tensors="pt").to(model.device),
                     max_new_tokens=32, do_sample=False)
print(json.loads(tok.decode(out[0][len(tok(prompt).input_ids):], skip_special_tokens=True)))
# {'verdict': 'use_tool'}

vLLM

vllm serve fexeak/mini-judge-v1 \
  --served-model-name mini-judge-v1 \
  --max-model-len 8192 \
  --default-chat-template-kwargs '{"enable_thinking": false}'

max-model-len 必须 ≥ 8192:客户端通常会预留 4096 safety tokens 计算可用输出预算,声明更小会把输出钳到 1 token。

训练

项 值
基座 Qwen/Qwen3-0.6B(instruct,关闭 thinking)
方法 全参 SFT,单模型发布,无 LoRA 适配器
数据 约 1,160 条人工/半自动标注样本,入池 849 条 + 15% 带外负例
轮次 5 epoch

评测

100 条人工金标(test / ood_project / ood_external),解析失败 0,出现思考段 0。

标签 P R F1
use_tool 0.938 0.968 0.952
prose_ok 0.945 0.963 0.954
no_ask 1.000 0.867 0.929

同一批金标上的规则基线(只看是否出现列表结构):use_tool F1 0.429,prose_ok / no_ask 召回为 0 —— 规则分不清「互斥选项列表」和「说明性列表」,这正是本模型存在的理由。

分布细节:

子集 n use_tool F1 prose_ok F1 no_ask F1
test 36 0.919 0.842 1.000
ood_project 48 1.000 0.966 0.833
ood_external 16 — 1.000 —

服务端延迟(RTX 5090 + vLLM,32 token 输出上限):P50 52.5 ms / P95 91 ms / max 105 ms。

第三方加载路径已实测:transformers 4.56.1 + bf16 + 单卡,本仓库文件可直接 from_pretrained 完成推理,chat_template.jinja 能被自动加载,输出与线上 vLLM 一致。

局限

  • 只判形式。回复「该不该问」不在能力范围内。
  • 中文为主,英文样本较少。
  • 依赖固定的系统提示与输入包装(<assistant_reply> + 尾部 3,000 码点截断);偏移会明显掉点。
  • 输出只有一行 JSON,解析失败时应退回规则实现,不要因为判定器故障去改写用户回复。
  • 上下文不要跟着 tokenizer 走:tokenizer_config.json 写的是 model_max_length = 131072、config.json 写的是 max_position_embeddings = 40960,但训练与线上服务只按 8192 这个预算用。服务端 max-model-len 建议直接设 8192(客户端声明 contextWindow 也保持 8192),超过训练分布的输入不保证行为。
  • 量化(GGUF / AWQ / GPTQ)后未做过回归验证,精度是否保持请自行用你的数据复测。

许可

本仓库(微调权重、模型卡、配置与分词器)以 Apache License 2.0 发布,全文见 LICENSE。

基座为 Qwen/Qwen3-0.6B(Apache-2.0),衍生与再分发的归属声明见 NOTICE。

使用时请保留这两份文件及其中的版权与归属信息。

Downloads last month
707
Safetensors
Model size
0.6B params
Tensor type
BF16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for fexeak/mini-judge-v1

Finetuned
Qwen/Qwen3-0.6B
Finetuned
(1,463)
this model