非自回归 System 1 决策引擎解剖:choice/score/noul 三种原语怎么把幻觉赶出结构化任务
【免费下载链接】deepopen非自回归System 1决策引擎,专为结构化类型决策场景设计 DeepOpen Multilingual, non-autoregressive System 1 decision engine.项目地址: https://gitcode.com/gh_mirrors/de/deepopen
当大模型被派去干分类、路由、打分这类"选择题"时,系统其实在做一件本末倒置的事:为了输出一个预定义类型,模型被迫逐 Token 生成一段自由文本,再靠解析器把文本映射回类型。代价是三重叠加的——延迟随 Token 数线性增长、按 Token 计费的成本随输出膨胀,以及最致命的:模型可能在一个 150 类的封闭选项集里,自信地生成一个不存在的答案,即幻觉。
DeepOpen 给出了一个完全相反的架构答案:不生成任何文本,在单次前向传递中直接输出结构化类型结果。本文基于仓库源码(deepopen/agent.py、deepopen/common.py、deepopen/router.py)与基准数据(BENCHMARKS.md、research/results),逐层拆解它的设计哲学、三种决策原语的输出机制、置信度门控与预加载原理,以及"零幻觉"声称的真实成立边界。
System 1 决策引擎的设计哲学
DeepOpen 的定位是"非自回归 System 1 决策引擎":快、直觉式、单次判断。它不做推理链、不写中间草稿,而是像条件反射一样对输入状态给出类型化答案。
这个哲学体现在两个核心层面。
第一,序列即模板,问题被编译进输入。在 deepopen/common.py 的build_sequence中,每道题被渲染成一段固定格式的输入序列:
[CLS] <type> instructions [SEP] [MASK] opt0 [MASK] opt1 ... [SEP] state [SEP]每个候选选项前插入一个[MASK]标记位,模型只需对标记位置各打一个 logit——这是一个"补全题"而非"生成题"。所有问题共享同一个状态文本,拼成一个 batch 后并行送入编码器,因此 N 道题只需要一次前向。
第二,输出结构由类型嵌入与决策头约束。deepopen/common.py 中的DecisionModel在双向编码器之上叠加了type_emb(一个 3 维嵌入,对应 choice/score/noul 三种问题类型)、scorer(对标记位打分)和act_head(动作头)。模型只能在这个固定类型的输出空间内作答,天然没有"自由发挥"的出口。
模型本身不是零样本推理器。基准数据显示,在 typed-decisions 的 2000 道决策题上,基础检查点零样本准确率仅 0.362 和 0.342,几乎贴近 0.318 的随机基线;真正的能力来自 RLCD 强化学习微调——用严格正确评分规则(log score + spherical score + ranked probability score,见 deepopen/common.py 的proper_reward)作为奖励,微调后同一基准冲到 0.766,反超教师模型 0.735 的自一致上限(BENCHMARKS.md)。所以 DeepOpen 的哲学是:做一个可以被快速特化的底座,而不是什么都会的零样本通才。
三种决策原语的输出机制
choice/score/noul 是 DeepOpen 的三种决策原语,对应结构化任务的三个基本形态:选一个类、打一个分、判一个布尔。在 deepopen/agent.py 的system_one中,模型输出logits(每个选项标记位一个分数)和act(动作头 logits),随后按问题类型分流处理。
choice:类别选择。输出字典包含choice(argmax 后的标签名)、probabilities(每个选项的归一化概率)和confidence:
answers[qid] = { "type": "choice", "choice": keys[int(p.argmax())], "probabilities": {kk: round(float(v), 4) for kk, v in zip(keys, p)}, "confidence": conf_score, "action": ext, }score:序数量表打分。输出score(概率加权期望值)、legend(等级到描述的映射)和完整分布。这使它不同于普通回归:模型给出的不是单一数字,而是一个带完整概率分布的序数期望,天然支持"3.2 / 4.0 级紧急度"这类表达:
exp_score = float((np.arange(k) * p).sum()) answers[qid] = {"type": "score", "score": round(exp_score, 4), "legend": {str(i): c for i, c in enumerate(q["crit"])}, ...}noul:布尔概率。固定渲染为[false, true]两个选项,输出noul即P(true)——一个 0.0 到 1.0 的校准概率,而非硬性 yes/no:
answers[qid] = {"type": "noul", "noul": round(float(p[1]), 4), "confidence": round(max(float(p[1]), 1.0 - float(p[1])), 4), ...}三种原语的选项渲染规则在 deepopen/common.py 的render_options中统一处理:choice 选项可以是裸标签或"标签: 描述";score 的等级渲染为level i: 描述;noul 固定二值。criteria中的结构化值(dict/list)会以紧凑 JSON 渲染而非 Python repr——tests/test_criteria.py 专门回归了这个曾经让 noul 崩溃、让 Python repr 泄漏进 prompt 的 bug。
置信度计算同样值得注意。deepopen/common.py 的confidence_from_probs用的是归一化香农熵:1 - H(p) / log(k)。这不是模型给自己的软 max 最大值,而是对整个分布不确定性的度量——分布越均匀,置信度越低。这保证了"高置信度"语义上接近"确定性强"。
置信度门控与预加载背后的原理
为什么置信度"可信"?大多数语言模型的 softmax 概率因训练目标(交叉熵只优化 argmax)而不具备统计意义。DeepOpen 用 RLCD(严格正确评分规则 + GRPO 式策略梯度)训练,奖励函数本身惩罚分布与真实分布的偏离,这让输出的概率可以直接当作统计量使用。经域温度校准后,英文检查点的 ECE 从 0.466 降到 0.081,多语言检查点从 0.314 降到 0.106(BENCHMARKS.md)。温度按(问题类型, 选项数)分桶存储(deepopen/common.py 的temp_bucket),推理时按桶查找。
由此可以安全地构建自动置信门控——高置信度自动处理、低置信度转人工,这正是 README.md 推荐的生产用法。但门控不是万能的:51 语言扫描显示,英文检查点在柬埔寨语上准确率为 0.000,却给出 95.2% 的平均置信度,ECE 高达 0.952(BENCHMARKS.md)。模型越自信越错,置信度阈值在这类场景下完全失效。这就是 deepopen/router.py 存在的理由:路由决策必须发生在前向传播之前,而不是靠置信度事后补救。
路由靠什么?deepopen/lang.py 是一个零第三方依赖的纯 Python 语言检测模块,通过 Unicode 码点区间精确识别 25 种文字系统(西里尔、天城文、高棉文、谚文、汉字等),拉丁文字再结合 7 种语言的功能词表与变音符号频率做启发式判别,并设了严格的 margin 规则保证英语不会被误路由。整个检测亚毫秒完成。路由优先级在 deepopen/router.py 的route方法中明确写着:显式model> 显式task> 检测到的工作流(需 opt-in)> 显式lang> 检测到的脚本/语言 > 默认。
预加载的必要性从数据中直接读出。冷启动一个检查点需要数秒,而语言检测只需微秒。在默认max_loaded=1下,交替语言的流量会在每次请求时重建模型——实测 CPU 上中位重载 7.4 秒、T4 上 10.3 秒。而Router(preload=True)将三个检查点常驻内存,语言切换只付出不到 1ms 的检测成本,单请求延迟稳定在 32.8ms(GPU)/ 193–464ms(CPU)。由于三个检查点合计约 1.16B 参数,Router还提供attach(复用已有 Agent 避免重复显存)与 LRU 淘汰策略(max_loaded=2保留两个热模型)。
零幻觉声称的成立边界
DeepOpen 在system_one的返回值里写着一行不起眼却关键的元数据:"usage": {"input_tokens": n_tokens, "output_tokens": 0}。输出 Token 为零,这正是"零幻觉"最硬的证据——没有文本生成步骤,就没有编造不存在内容的出口;所有输出都被类型嵌入和选项空间约束在预设边界内,结果 100% 属于开发者定义的类型集合。
但这句"零幻觉"需要精确圈定成立边界,仓库自己的 BENCHMARKS.md 写得非常坦率:
边界一:零幻觉 ≠ 零错误。非自回归消除的是"生成式幻觉"(输出不在类型集合内、需要解析兜底),而不是"判断错误"。基础检查点在 typed-decisions 上零样本准确率贴近随机(0.362 vs 0.318),持出的 moderation 数据集上只有 0.530(macro-F1 0.400),几乎等于抛硬币。用错了检查点或没微调,系统会"诚实地犯错"。
边界二:高基数选项是架构性短板。choice 的选项共享固定的head_max_len预算,77 类的 Banking77 每类只能分到约 3–4 个 Token,标签之间失去区分度,两个检查点都精确停在 0.425——这是预算天花板而非能力差距。仓库的应对是提高head_max_len或改用粗到细的分层 choice。
边界三:置信度默认过度自信。两个检查点出厂即过度自信,多语言检查点甚至未附带任何拟合温度。ECE 0.081 是温度重拟合之后的数字,生产使用前必须用自有数据重拟合温度。
边界四:选项顺序稳定性与 score 原语。20 选项场景下选项排列会扰动答案(0.150 与 0.230),序数 score 是三种原语中最弱的一环(SST-5 上仅 0.372)。
这些限制不削弱 DeepOpen 的价值,反而定义了它的正确用法:路由、门控、微调、温度校准四个环节各司其职,才能把"零幻觉"从架构特性兑现为生产事实。在单 T4 上 103–332 题/秒的吞吐、对比封闭方案 7.8 倍的速度优势、Apache 2.0 的全开放权重,让它成为结构化决策场景里值得认真评估的工程选项。
【免费下载链接】deepopen非自回归System 1决策引擎,专为结构化类型决策场景设计 DeepOpen Multilingual, non-autoregressive System 1 decision engine.项目地址: https://gitcode.com/gh_mirrors/de/deepopen
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考