Moonshot 的 kimi-k2 接口里传 temperature 0.2 想让输出稳定,返回 200 但同一批 50 条抽取结果格式差异很大,翻文档才发现该模型只接受 temperature 1,其他值被服务端忽略。

这类报错背后常见的原因有几处,逐个排除就行。模型侧固定了采样参数,传其他值直接忽略;SDK 不做取值校验,请求照发但结果不受控;想靠低温保证 JSON 稳定,思路本身不成立;没有记录实际生效的参数,排查时看不到差异。

上来先把响应里回显的 model 与参数打出来核对

curl -s https://api.moonshot.cn/v1/chat/completions -H "Authorization: Bearer $MOON_KEY" -H "Content-Type: application/json" -d '{"model":"kimi-k2-0905-preview","temperature":0.2,"messages":[{"role":"user","content":"返回 JSON"}]}' | jq '.model'

同一条 prompt 连发 5 次,统计格式差异

python sample_n.py --n 5 --model kimi-k2-0905-preview --out samples.jsonl

再往下改用 response_format 约束结构而不是压温度

python -c "import json;d=json.load(open('req.json'));d['response_format']={'type':'json_object'};json.dump(d,open('req2.json','w'))"

等前面都确认过,再在客户端加 schema 校验与一次重试兜底

python validate_and_retry.py --schema order.json --file out.jsonl

恢复的判定其实很直接。同一批样本的结构一致率达到 99% 以上,响应里的参数与文档允许值一致。

结构化输出要靠 schema 和校验兜底,采样温度只能影响多样性;遇到参数被忽略的模型,先查文档的支持列表再定方案。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189