在扣子(Coze)平台中,想要让 Bot 的输出格式做到滴水不漏,例如强制返回 JSON、限制字段数量、杜绝多余解释、确保字段名大小写完全一致——这几乎是每位对接下游系统的开发者都会遇到的棘手问题。稍有偏差,解析就会崩溃,告警随之响起。如何破解?以下方法经过实测,效果可靠。

利用结构化提示词锁定输出格式
第一步:在 Bot 的「提示词」设置中,将系统提示词的开头写得清晰明确。例如:
【你是一个严格遵循格式规范的响应引擎。所有输出必须是合法 JSON,且仅包含以下三个字段:user_name(字符串)、score(整数)、status(字符串,值只能为“passed”或“failed”)。禁止任何前导说明、后缀注释、Markdown 标记、中文括号、以及缩进空格以外的空白字符。】
第二步:将提示词末尾那些“如有其他问题欢迎随时提问”“以上信息供参考”之类的柔性表述全部删除。别小看这几个字——模型很可能将其视为可选内容,顺手塞入 JSON 外围,格式随即失效。
第三步:在示例对话(Few-shot)中放置 2~3 组严格匹配格式的输入-输出对,每组都应包含边界情况。例如输入“张伟 87 分”,输出必须为 {"user_name":"张伟","score":87,"status":"passed"};输入“李娜 59 分”,输出必须为 {"user_name":"李娜","score":59,"status":"failed"}。模型天生倾向于模仿最近的示例格式,这比泛化理解可靠得多。
启用 JSON Schema 校验(Bot Pro 版本专属)
方法一:进入 Bot 设置 →「高级设置」→ 开启「结构化输出」→ 粘贴标准 JSON Schema。例如下面的 Schema 能够彻底禁止 status 字段出现“passed”“failed”之外的值:
{ "type": "object", "properties": { "user_name": { "type": "string" }, "score": { "type": "integer", "minimum": 0, "maximum": 100 }, "status": { "type": "string", "enum": ["passed", "failed"] } }, "required": ["user_name", "score", "status"] }
方法二:勾选「强制校验」后保存。Bot 生成输出后会自动比对是否符合 Schema;一旦不匹配,直接返回空响应或报错,【不会降级为自由文本输出】。这一机制是防止格式偏离的最后一道防线。
关闭自由发挥模块
将「知识库检索增强」和「插件调用」两个开关关闭。这两个功能在推理链中容易插入非结构化中间结论,哪怕多出一个句号,JSON 就不再合法。
在「对话流」中,凡是带有「思考」「推测」「建议」字样的节点都删除。节点名称本身容易诱导模型生成解释性语句——而这正是我们最不希望看到的。
测试阶段,用 curl 直接调用 Bot API,检查响应头 Content-Type 是否为 application/json,再用 jq -e '.user_name' 验证字段是否存在。这是唯一能让格式真正落地的验证动作,值得养成习惯。
