标准答案
- 结构化输出要求模型按预先定义的对象或字段返回,适合抽取、分类和业务流程编排。JSON Schema 描述字段类型、必填项、枚举和嵌套结构,但支持程度取决于模型和供应商。
- 函数或工具调用让模型提出一个带名称和参数的动作请求,真正执行仍应由服务端根据工具白名单、用户权限和参数规则决定。它不是让模型直接执行代码。
- 解析流程应依次检查响应事件完整性、JSON 语法、Schema、字段范围、业务状态和权限。校验失败时记录原始响应摘要并有限重试或转人工,不能直接把错误对象写入数据库。
题目解析
JSON 合法不代表业务正确。例如金额可以是合法数字但超出订单范围,用户 ID 可以是合法字符串但不属于当前租户。Schema 负责形状,业务服务负责事实和权限。
函数调用的参数描述会影响模型选择工具,但不应成为安全边界。工具执行器要用服务端身份重新查询资源,禁止依赖模型传来的 tenantId、ownerId 或权限字段。
结构化输出失败的重试应提供明确的校验错误摘要,并限制模型可修复的范围;不要把完整敏感数据和内部校验细节原样塞回 Prompt。
当供应商不支持严格 Schema 时,可以使用 JSON 模式加解析器和修复流程,但要降低自动执行权限,尤其是涉及写操作的任务。
代码示例
先做结构解析,再做业务约束校验。下面的示例只展示边界,不替代完整 Schema 库。
TypeScript
const parsed = JSON.parse(modelText) as unknown
if (!isOrderSummary(parsed)) {
throw new Error('模型输出未通过业务校验')
}
function isOrderSummary(value: unknown): value is { status: string; total: number } {
if (!value || typeof value !== 'object') return false
const item = value as Record<string, unknown>
return typeof item.status === 'string'
&& ['paid', 'pending', 'cancelled'].includes(item.status)
&& typeof item.total === 'number'
&& item.total >= 0
}常见误区
- 看到 JSON.parse 成功就认为结果可信。还需要 Schema、枚举、范围、租户和业务状态校验。
- 让模型直接决定是否执行付款、删除或权限变更。模型只能提出工具调用,执行器必须再次验证。
- 解析失败时无限追加“请返回正确 JSON”。应限制重试次数,记录原因,并提供失败或人工处理路径。