不要再使用 response_format = {‘type’: ‘json_object’} 了

尤其是阿里相关的,Qwen更是重灾区。
猜测内部逻辑是:

  1. 检测是否有 ``` ```json ,如果有,就replace;
  2. 如果无法 deserialize , 就令模型重新生成。
    这十分愚蠢。尤其是 Qwen 一系列模型显然在相关内容的训练不足,在使用 lingma 的过程中, 其 agent 多次因为输出无效的 JSON 格式从而无法调用工具。
    导致反序列化失败的因素有很多,拿最近的经历举例,假如 value 内不小心需要使用引号,模型并不会(至少概率很小)给这些引号转义。
    除此之外,意想不到的换行符也是反序列化失败的重要原因。由于转义的不可控,你以为看到的 json 是这样的:
1
2
3
{
"key": "value"
}

然而有可能模型这样输出:

1
2
3
{\n
\"key\": \"value\"
\n}

这就完全无法序列化了。
我能想到的解决方案只有:

  1. 强化 prompt ,例如让模型在所有键值的描述信息中全部使用全角中文符号
  2. 后处理输出内容, replace 所有 \n 或者 \r

然而这也难以解决所有问题。无论如何,模型厂商仍然需要针对此场景做更多优化。