必须让模型输出裸JSON字符串:在system消息中强制要求纯JSON格式,禁用Markdown包裹、单引号及多余字符;服务端需用正则提取或json.loads校验,优先启用response_format={"type":"json_object"}参数确保格式合规。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

你需要让腾讯混元API返回的回答正文本身就是合法JSON字符串,而不是把整个HTTP响应当作JSON去解析——后者会导致结构错乱或解析失败。
强制模型输出纯JSON格式
在请求的messages中,明确用系统提示词约束模型输出格式。例如:
将user消息内容设为:【{"role": "system", "content": "你必须严格输出一个合法的JSON对象,不带任何解释、前缀、后缀或Markdown代码块。只返回JSON,且确保能被json.loads()直接解析。"}】 → 再追加一条user消息说明具体字段要求,如“请返回包含name、score、reason三个键的对象”。
这一步是前提,跳过则模型可能返回“好的,这是结果:{...}”这类带干扰文本的响应。
避免Markdown代码块包裹
即使加了系统指令,模型仍可能自动套上```json...```。解决方法是在prompt末尾加一句硬性指令:
“输出结果必须是裸JSON字符串,禁止使用反引号、\`json\`标记、缩进、换行符;所有键名和字符串值都用双引号,空格仅保留在冒号后和逗号后。”
注意:若响应里出现单引号包裹的字符串(如{'key': 'val'}),后续json.loads()会报错——【模型必须输出双引号JSON,否则无法被Python原生解析】。
服务端校验与清洗(Python示例)
方法一:正则提取最外层JSON
用re.search(r'\{(?:[^{}]|(?R))*\}', text)匹配最外层大括号内容(需Python 3.11+支持递归);更稳妥的做法是找第一个{和最后一个}之间的子串,再用json.loads()尝试解析,失败则向前/向后微调边界。
方法二:用ast.literal_eval兼容单引号(仅限无嵌套结构时)
若确认回答中只有简单键值对且可能混用单双引号,可用ast.literal_eval替代json.loads,但它不支持JSON注释、NaN或Infinity等扩展语法。
方法三:启用模型增强参数(部分版本支持)
在请求体中加入"enable_enhancement": true,并设置response_format={"type": "json_object"}(需模型实际支持该字段,hy4-preview已兼容OpenAI 1.0协议)→ 此时API网关会做格式兜底,返回的content字段一定是可解析JSON字符串。


















