用了 JSON Schema 还需要决策模型吗? 如果 schema 里有 enum、boolean 或评分字段,并且你想按确定程度决定下一步,可以把这些字段换成决策模型的 Choice、Noul、Score 问题。需要生成文字或抽取任意内容的字段,继续用结构化输出。两者可以在同一流程里先后使用。
结构化输出保证什么,不保证什么
OpenAI 文档说,结构化输出能确保模型总是生成符合你给的 JSON Schema 的回答,不会漏掉必填字段,也不会编出无效的 enum 值。来源:OpenAI 结构化输出文档 · 2026-10-12
这解决的是格式问题。它不保证的是:
- 值是否正确:字段合法,不代表选对了类别。
- 有多确定:你拿到一个 enum 值,但不知道模型有多确定。
- 边界情况:OpenAI 文档也写明,模型拒答或达到 max tokens 上限时,回答可能不符合 schema,需要单独处理。来源:OpenAI 结构化输出文档 · 2026-10-12
决策模型返回的是什么
决策模型的接口是“state 加问题进,答案和概率出”,不生成文本。state 就是你要它判断的那段内容(文本或 JSON)。问题有三种:
- Choice:选一项,返回每个选项的概率和置信度。
- Score:按有序量表打个分,返回每一档的概率。
- Noul:判断是否,返回“是”的概率。
来源:System One 决策原语 · 2026-10-12
想先了解这类模型,见 决策模型是什么?。
字段对照:你的 schema 里哪些能换
| 原来的 schema 字段 | 换成什么 | 说明 |
|---|---|---|
| `enum`(从几个类别里选一个)来源: System One 决策原语 · 核验日期 2026-10-18 | Choice | 最多 255 个选项 |
| `boolean`(是或否)来源: System One 决策原语 · 核验日期 2026-10-18 | Noul | 返回“是”的概率 |
| 评分字段(比如 1–5 分)来源: System One 决策原语 · 核验日期 2026-10-18 | Score | 最多 10 个等级 |
| 自由文本、摘要、抽取出的名字和数字来源: System One 决策原语 · 核验日期 2026-10-18 | 不能换 | 继续用结构化输出 |
判断标准很简单:答案能不能事先列出来。能列出来的,交给决策模型;列不出来的,交给大模型生成。
“confidence”字段的问题
很多人会在 schema 里加一个 confidence 字段,让大模型自己报一个 0 到 1 的数。这个数和其他字段一样,是模型生成出来的。
决策模型的概率是按选项给出的:每个选项一个概率,由模型对这些选项的判断直接得出,不是模型写出来的一段文本。
这里只讲机制差别,不说哪个更准。不管用哪种,阈值都要在自己的标注数据上验证。
改写示例:一个工单分类 schema
原来的 schema 有 3 个字段:类别(enum)、是否紧急(boolean)、回复草稿(string)。前两个字段换成一个决策模型请求里的 Choice 和 Noul,回复草稿仍交给大模型。
以下代码都是示意代码,没有经过实际运行测试。
改写前:一个 JSON Schema
ts// 示意代码,未经测试
const ticketSchema = {
type: 'object',
properties: {
category: { type: 'string', enum: ['billing', 'bug', 'account', 'other'] },
urgent: { type: 'boolean' },
replyDraft: { type: 'string' },
},
required: ['category', 'urgent', 'replyDraft'],
additionalProperties: false,
};
改写后:判断交给决策模型,回复仍交给大模型
ts// 示意代码,未经测试
import { choice, booleanQuestion } from '@system-one-ai/core';
import type { EvaluationClient } from '@system-one-ai/core';
const ticketQuestions = {
category: choice('Choose the category of this support ticket.', {
billing: 'Payments, invoices, and refunds',
bug: 'The product is broken or behaves unexpectedly',
account: 'Login, profile, or permission issues',
other: 'None of the above',
}),
urgent: booleanQuestion('Does this ticket need a response within one hour?'),
};
export async function classifyTicket(client: EvaluationClient, ticket: string) {
const result = await client.evaluate({ state: { ticket }, questions: ticketQuestions });
return {
category: result.answers.category.choice,
categoryConfidence: result.answers.category.confidence,
urgentProbability: result.answers.urgent.probability,
};
}
// 回复草稿:选定类别后,再用大模型的结构化输出生成,schema 只保留 replyDraft
client 的创建方式见 决策模型是什么?。模型 ID 从 GET /v1/models 读取,不要手抄。
组合用法:先判断,再生成
- 决策模型先判断:属于哪个分支、要不要转人工。
- 置信度够高,进入对应分支;不够高,转人工或交给大模型。
- 进入分支后,再用结构化输出生成该分支需要的内容,比如回复草稿。
阈值用自己的标注样本定。更多组合方式见 Jev 和 ChatGPT 有什么区别、Agent 工具路由 和 用决策模型给 Agent 评估做第一道关。
费用怎么算
每 4KB 算一块,不足 4KB 也按一块;费用 = 块数 × 问题数 × 模型单价。
| 模型 | 每个问题每块积分 |
|---|---|
| Jev | 1 |
| Clef Flash | 3 |
| Clef Omni | 4 |
| Clef | 6 |
| Decider | 1 |
来源:system-one.dev 定价 · 2026-10-12
- 块数按整个请求的字节算,一个汉字约占 3 字节。
- 一个请求里问的问题越多,费用按问题数相乘。上面的改写示例问了 2 个问题,费用就是 2 × 块数 × 单价。
- 大模型按 token 计费,和这里的计费方式不同,不能直接比单价。请用自己的典型请求分别算。
新账号注册即送 100 积分,积分不会过期。怎么选模型,见 Jev、Clef、Clef Flash、Clef Omni、Decider 怎么选。
想试一下?在线试用(需登录)。
相关阅读
核验日期:2026-10-12