要让阶跃AI返回可直接json.loads()解析的JSON,须四步:一、system消息严格定义输出契约;二、user消息提供带占位符的结构化模板;三、API请求启用response_format={"type":"json_object"};四、Python端添加截断检测与自动补全重试逻辑。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

你需要让阶跃AI返回的JSON数据能被Python脚本直接json.loads()解析,而不是夹杂解释文字、多出Markdown代码块、漏掉引号或字段错位。
第一步:用系统角色锁定输出契约
在调用阶跃AI API时,必须在system消息中写明角色与硬性约束。这步不可跳过,否则模型会默认按自然语言习惯组织输出,哪怕你后面再强调“只输出JSON”也大概率失效。
把以下内容作为system消息完整传入:
你是一个严格的数据提取器,只输出RFC 8259标准JSON,不加任何说明、注释、前缀、后缀、Markdown代码块标记(如```json)、空行或额外字符。所有字符串字段必须用双引号包裹,禁止单引号;数字字段不加引号;布尔值用true/false;null值保持小写。输出必须能被JavaScript的JSON.parse()和Python的json.loads()直接解析。
第二步:在user消息里嵌入结构化模板
不要只说“请输出JSON”,要给出带占位符的完整结构示例,且字段顺序与你后续程序解析逻辑一致。
例如你要提取商品信息,user消息应这样写:
请从以下文本中提取产品名称、售价(数字)、是否新品(布尔值)、标签列表(字符串数组):【文本内容】
按以下格式输出,仅此JSON对象,无其他内容:
{"name": "XX耳机", "price": 299, "is_new": true, "tags": ["无线", "降噪"]}
【关键点】模板中的字段名、数据类型、嵌套层级必须与你实际代码中定义的变量完全一致——比如Python里用price_int接收,模板里就不能写"price": "299"(字符串),否则json.loads()后还得手动int()转换,破坏直解析目标。
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
第三步:启用阶跃AI平台的response_format参数
阶跃AI v2.3+版本支持原生JSON Schema约束解码。在API请求体中添加:
"response_format": {"type": "json_object"}
该参数会触发底层约束采样机制,在生成每个token时动态屏蔽非法字符(如开头出现字母、字符串未闭合引号、键后缺冒号等),从源头杜绝语法错误。
注意:此参数必须配合system消息中的JSON契约使用,单独启用效果有限。
第四步:验证失败时自动重试并截断补全
即使做了前三步,极少数情况下仍可能因上下文过长或用户输入含干扰符号导致输出截断(如只返回{"name": "XX耳机", "price": 299 — 缺少结尾})。
在Python端加入轻量级修复逻辑:
先尝试json.loads();若报JSONDecodeError,则用正则定位最外层{与},取中间最长匹配段,末尾补}后重试解析;若仍失败,触发一次带错误提示的重调用(user消息追加:“上一次输出被截断,请重发完整JSON,不要省略结尾大括号”)。

















