本节摘要:laya 的所有决策都由三种带类型的问题原语承载:choice(单选)返回选项上的概率分布,score(刻度评分)返回分档上的概率分布,noul(是非)返回「是 / 否 / 不知道」三值分布。本节不看概念定义——那在《Jev 决策编程》第 03 章《三种问题类型》里已经讲透——只看它们在 laya 返回结果里的字段形态:一段统一的返回结构示意,三种原语各占一段;一张「什么时候用哪个」速查表帮你三十秒选型;最后两条务实提醒——选项措辞本身就是提示工程的一部分,以及底座检查点 zero-shot 接近随机(官方声明),三原语的价值要微调后才真正显现。
概念完整版在《Jev 决策编程》第 03 章《三种问题类型》,此处只留最简版:choice 问「是哪一个」,score 问「有多高」,noul 问「是不是」。三者的共同点是答案空间在提问时就封闭——选项列表、分档列表、是与否,模型只能在封闭空间上分配概率,不可能答出空间之外的东西。这正是第 1.1 节「输出是分布」的三种具体形状。
三种原语 = 三种答案空间的形状(示意) choice:选项集合上的分布 score:分档刻度上的分布 noul:三值上的分布 ┌────────────────────┐ ┌────────────────────┐ ┌────────────────────┐ │ 物流投诉 ▇▇▇▇▇▇ 0.62│ │ 1分 ▎0.05 │ │ 是 ▇▇▇▇ 0.71 │ │ 产品咨询 ▇▇ 0.21 │ │ 2分 ▎0.07 │ │ 否 ▇▇ 0.18 │ │ 营销推广 ▇ 0.08 │ │ 3分 ▇▇▇ 0.34 │ │ 不知道 ▎0.11 │ │ 其他 ▇ 0.06 │ │ 4分 ▇▇ 0.29 5分 ▎0.09│ │(弃权是一等公民) │ └────────────────────┘ │(可算期望值 3.16) │ └────────────────────┘ └────────────────────┘
choice 是使用频率最高的原语:路由、分类、筛选都是它。一次调用的返回形态示意如下(字段名以官方文档与实测为准,数值为示意值):
# choice_return.json —— choice 原语的返回形态示意 { "id": "intent", "type": "choice", "answer": "物流投诉", "probabilities": { "物流投诉": 0.62, "产品咨询": 0.21, "营销推广": 0.08, "其他": 0.09 }, "confidence": 0.62, "checkpoint": "laya-multilingual" }
四个字段四种用途:answer 是 argmax 出来的首选,直接用;probabilities 是完整分布,支撑分级处置(首选加次选差距小就进复核队列);confidence 是置信度,第 7 章的门控输入;checkpoint 记录本次由哪个检查点作答,是第 2 章路由行为的观测窗口。
choice 的下游消费有三种常见档位,对应分布的三种吃法:
| 消费档位 | 吃分布的哪部分 | 例子 |
|---|---|---|
| 硬消费 | 只取 argmax | 路由到固定下游 |
| 软消费 | 首选与次选的差距 | 差距小于阈值进复核 |
| 分布消费 | 完整概率向量 | 作为下游模型的特征输入 |
score 把「有多高」离散成分档(例如 1 到 5 分、低中高三档),返回每档的概率。它不是直接吐一个数,而是吐一个分布,这一点常被忽视:
# score_return.json —— score 原语的返回形态示意 { "id": "urgency", "type": "score", "bands": ["1", "2", "3", "4", "5"], "probabilities": {"1": 0.04, "2": 0.06, "3": 0.20, "4": 0.45, "5": 0.25}, "expected_score": 3.81, "answer": "4", "confidence": 0.45 }
两个工程决策点。其一,要「档位」还是要「期望值」:answer 给最可能的档(直接映射处置动作),expected_score 给分布的加权平均(适合排序与趋势监控),两者用途不同,按下游需要取。其二,分档怎么设计:档数越多信息越细、每档样本越稀、微调需要的标注量越大;从粗到细逐步加档是稳妥路线(示意建议,具体在第 5 章数据准备里展开)。
| 档位设计 | 适用 | 取舍 |
|---|---|---|
| 三档(低中高) | 处置动作只有三种 | 标注最省,信息最粗 |
| 五档(1~5) | 有程度差异的评级 | 常见平衡点(示意建议) |
| 十档 | 精细评分需求 | 标注一致性难保,慎用 |
一句话原则:档位对齐下游动作。下游只有「介入 / 不介入」两种动作时,五档以上的细分没有消费者,白付标注成本。
noul 是加强版是非题:不只「是 / 否」,还有第三个值「不知道」。这个第三值是设计亮点——它把「证据不足」与「否」区分开了:
# noul_return.json —— noul 原语的返回形态示意 { "id": "is_spam", "type": "noul", "probabilities": {"yes": 0.71, "no": 0.18, "noul": 0.11}, "answer": "yes", "confidence": 0.71 }
用「是 / 否 / 不知道」翻译成人话:「像垃圾信息」「不像垃圾信息」「看不出是不是垃圾信息」。第三种答案在真实数据里出现频率不低——短文本、乱码、语义含混的输入都会落进去——它是天然的软弃权信号,可以在系统层路由到「补充信息再问一次」或「直接转人工」,而不是逼模型在信息不足时硬站队。这呼应第 1.1 节的红利二:分布有形状,形状可以变成动作。
| 问题长什么样 | 用哪个 | 例子 | 注意 |
|---|---|---|---|
| 答案是有限集合里挑一个 | choice | 工单归类、消息路由、语言筛选 | 选项要互斥且覆盖完整,留「其他」兜底 |
| 答案是程度或水平 | score | 紧急度、情绪强度、内容质量 | 先定档位数,粗档起步 |
| 答案是是不是,且要允许「看不出来」 | noul | 是否违规、是否需要人工 | 别把「不知道」当错误答案处理 |
| 答案是开放文本、列表、代码 | 都不是 | 写摘要、起标题 | 回第 9 章选型,这是 System 2 的活 |
选型思想完整版在《Jev 决策编程》第 03 章《三种问题类型》,那里有反例集与决策树;本书这张表只是行动版。一个常见的组合用法:同一份 context 一次调用里同时带多个问题(比如一个 choice 判类别、一个 score 判紧急度),批量组织的细节在第 3.2 节。
提醒一:选项措辞就是提示工程。 laya 读的不只是 context,还有选项文本本身。「其他」与「以上都不是」、口语化的选项与书面化的选项,打分结果可能明显不同。工程上建议:选项写成可复核的短句(「物流投诉」优于「问题」);选项之间互斥且并集覆盖全空间;上线前用一批人工标注样本核对选项定义是否被模型按你期望的方式理解。选项表是 laya 应用里最值得反复打磨的一份配置。
提醒二:底座 zero-shot 接近随机(官方声明)。 三种原语的形态再漂亮,底座检查点不经微调直接用,概率分布大概率不可信——这是官方 README 白纸黑字的诚实声明。本节示意值里的自信分布,都要理解为「微调后的目标形态」。路线是:第 3 章先跑通形态,第 5 章微调出能力,第 7 章校准出可信度。另外,选项数量到约 20 个以上时官方承认 Jev 更强——高基数场景看第 6 章的两段式方案。
| 误用 | 症状 | 纠正 |
|---|---|---|
| 把 score 当连续回归用 | 追问「为什么是 3.81 不是 3.8」 | score 是分档分布;要连续量就选别的工具 |
| 把 noul 的「不知道」当错误 | 上报异常、重试直到出「是/否」 | 「不知道」是合法答案,转补充信息或人工 |
| 选项互相重叠 | 「投诉」与「不满」两个选项打得难分 | 重写选项到互斥;加判定规则进标注规范 |
| 选项留不全 | 没有兜底项,边缘样本全挤进错误选项 | 加「其他」并定期抽样看它的占比 |
| 一次塞几十个选项 | 精度下滑(官方:约 20 个以上 Jev 更强) | 第 6 章两段式,或换 Jev |
这张表的前四条在微调前就会遇到(它们是问题设计问题,不是模型能力问题),最后一条是能力边界——两种问题的解法不同,先分清再动手。
answer 与期望值各有用途;档位设计从粗到细。三种分布的形状看清楚了,接下来看承载它们的机器:laya 不止一个模型,而是三个各管一摊的检查点加一个自动分流的 Router。下一章拆开看这台「一队专家加一个调度员」的结构。