如何利用 JSON Schema 强制 AI 输出稳定且可解析的结构化数据

夜猫子程序员 专家 2026/5/12 480 浏览 6 点赞 约 1 分钟

直接在 Prompt 里写“请返回 JSON 格式”简直是赌博,尤其是面对复杂嵌套结构时,AI 经常会随手加个 Markdown 代码块标记,或者在 JSON 结尾多写一句“希望这个结果对你有帮助”,直接导致 json.loads() 抛出异常。

如何利用 JSON Schema 强制 AI 输出稳定且可解析的结构化数据

想要 100% 稳定解析,最硬核的方案是把 JSON Schema 直接喂给模型,或者利用 OpenAI/Claude 的 Structured Outputs 模式。

我最近在做一个自动化抓取分析工具,需要 AI 把非结构化文本转成严格的 JSON。如果只写描述,AI 经常把 price 字段一会儿给成 "100"(字符串),一会儿给成 100(数字)。

实操配置技巧:

不要在 Prompt 里用文字描述字段,直接定义一个标准的 JSON Schema 传给 API。如果你用的是 Cursor.cursorrules 或者 Claude 的 System Prompt,可以这样定义:

{
  "type": "object",
  "properties": {
    "product_name": { "type": "string" },
    "price": { "type": "number" },
    "tags": { 
      "type": "array", 
      "items": { "type": "string" },
      "maxItems": 5 
    }
  },
  "required": ["product_name", "price"],
  "additionalProperties": false
}

几个能显著提升效率的坑位避雷:

1. 禁用 additionalProperties
一定要加上 "additionalProperties": false。如果不加,AI 偶尔会自作聪明地增加一些它认为有用的字段(比如 confidence_score),这会直接弄乱你的后端类型定义。

2. 枚举值(Enum)是强约束的神器
如果你需要 AI 在几个固定选项中选择,别写“请从 A, B, C 中选一个”,直接用 enum

"status": { 
  "type": "string", 
  "enum": ["success", "pending", "failed"] 
}

3. 强制要求不带 Markdown 标记
如果你是通过 API 调用而非专用 SDK,在 Prompt 结尾加上:Return ONLY the raw JSON string. No markdown code blocks, no preamble. 这样可以省去正则过滤 `json 标签的步骤。

实际效果对比:

之前用自然语言描述,解析失败率大概在 15% 左右(主要是多了废话或字段类型漂移);换成 JSON Schema 约束后,配合 response_format: { "type": "json_schema", ... } 参数,解析成功率基本达到了 100%。

现在的开发流是:先在 JSON Schema 校验器里定义好结构 → 将 Schema 粘贴进 System Prompt → 编写 Pydantic 模型(Python)进行反序列化。这样整个链路从 AI 输出到代码运行是类型安全的。

全部回复 (0)

还没有回复,来发第一条吧!

发表回复

支持 Markdown 格式