开发者生态
morning
建立您自己的决策模型
摘要
"System one" decision models are models that infer and respond with calibrated probabilities or every allowed answer. Consider your everyday language model, to get typed output from it (JSON), you may...
the
output
can
are
model
this
example
predicted
options
import
2026-10-11
1 阅读
约9分钟阅读
softwaredoug
字号:
“系统一”决策模型是用校准概率或每个允许的答案进行推断和响应的模型。考虑您的日常语言模型,要从中获取类型化输出 (JSON),您可以使用结构化输出将输出限制为保证有效的 JSON。虽然模型在一次传递中预填充输入,但它仍然必须对每个标记执行一次传递才能生成有效的响应。在此示例中,需要 11 遍才能生成最终输出。 (我们不考虑推测性解码和其他推理优化技术。) 步骤播放 重置提示(预填充)生成(预测)正在预测 此交互式示例需要 JavaScript。诸如 Jev 之类的决策模型假设我们可以选择固定的选项,并且我们可以通过一次传递来快速完成此操作。在此示例中,我们将可能的输出集限制为选项 A 、 B 、 C 、 D 、 E 。通过屏蔽词汇表中的其他项目,模型只能发出这些标记。通过选择最高概率的输出,我们得到了答案。步骤播放重置提示(预填充)生成(预测)正在预测此交互式示例需要 JavaScript。由于输出仅限于一组固定的选项,因此模型无法选择这些选项之外的任何内容。然而,这并不能保证输出是正确的。在这种情况下,将输出标记概率视为置信度分数也很常见,但如果没有额外的训练,这些分数可能反映了它对下一个标记是什么的信心,而不是响应作为正确答案的真实概率。构建您自己的 我们可以通过使用 LLM 限制输出标记来模拟此行为。这里我使用 Qwen/Qwen3-1.7B import argparse import json import torch from Transformers import AutoModelForCausalLM, AutoTokenizer model_name = "Qwen/Qwen3-1.7B" options = ["A", "B", "C", "D", "E"] parser = argparse.ArgumentParser() parser.add_argument("--input", default="question.json") args = parser.parse_args() # 加载 tokenizer 和模型 tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForCausalLM.from_pretrained( model_name, torch_dtype="auto", device_map="auto" ) # 模型将为每个选项发出的标记作为第一个辅助标记 option_token_ids = [tokenizer.encode(opt, add_special_tokens=False)[0] 选择加入选项] def format_prompt(item): Prompt = item["question"] + "\n" 选择加入选项: Prompt += f"{opt}.{item[opt]}\n" Prompt += "Answer:" messages = [ {"role": "user", "content": Prompt} ] return tokenizer.apply_chat_template( messages, tokenize=False, add_ Generation_prompt=True, enable_thinking=False ) with open(args.input) as f: item = json.load(f) model_inputs = tokenizer(format_prompt(item), return_tensors="pt").to(model.device) with torch.no_grad(): logits = model(**model_inputs).logits[0, -1] # 约束解码:仅允许选项标记 probs = torch.softmax(logits[option_token_ids].float(), dim=-1) print(f"prediction: {options[probs.argmax().item()]}") for opt, prob in zip(options, probs.tolist()): print(f"{opt}: {prob:.4f} {item[opt]}") 用一个简单的问题运行它来测试它会产生以下输出// 输入 { "question": "天空是什么颜色?", "A": "红色", "B": "蓝色", "C": "绿色", "D": "紫色", "E": "我不知道" } // 输出预测: B A: 0.0000 Red B: 0.9988 Blue C: 0.0000 Green D: 0.0000 Purple E: 0.0012我不知道该模型是否能够理解我们的输入并做出与正确答案合理对应的预测。我们可以通过针对公共数据集运行模型来测试模型的准确性。我针对 CommonsenseQA 精度召回 f1 支持的随机样本进行了测试 A 0.5733 0.7197 0.6382 239 B 0.5506 0.7686 0.6416 255 C 0.5372 0.6598 0.5922 241 D 0.7206 0.3904 0.5065 251 E 0.7519 0.4255 0.5435 235 精度:725/1221 = 0.5938 宏 f1:0.5844 对于 1.7B 模型来说还不错,在数据集上运行快速微调为我们提供了稍好的性能精度召回 f1 支持 A 0.6475 0.6611 0.6542 239 B 0.6113 0.6784 0.6431 255 C 0.6234 0.5975 0.6102 241 D 0.6700 0.5418 0.5991 251 E 0.5808 0.6426 0.6101 235 精度: 762/1221 = 0.6241 宏 f1: 0.6234 校准模型 针对非常模糊的问题测试模型表明了一个有趣的问题。 // 输入 { "question": "你最有可能在哪里找到蝙蝠?", "A": "Cave", "B": "棒球比赛", "C": "阁楼", "D": "动物园", "E": "体育用品商店" } // 输出预测: A A: 0.9978 Cave B: 0.0004 棒球比赛 C: 0.0017 Attic D: 0.0000 Zoo E: 0.0001 体育用品商店 这里应该没有明确的答案,但将输出概率视为伪“置信度”分数,表明模型对这个答案极度过度自信。如果我们在之前运行的评估中对置信度得分范围进行分类,我们可以看到模型的置信度与其准确性不匹配。这意味着模型未经校准。箱计数 c
这篇文章对您有帮助吗?
订阅66必读
每日精选科技资讯,直达你的邮箱