先看现象。让 claude-3-5-sonnet 输出 JSON 做下游解析,它总在前后加 “`json 围栏,json.loads 直接抛 Expecting value,换了几版提示词还是会漏。
真正麻烦的地方在于,几个原因的现象几乎一样。提示词没禁止围栏,模型按常规习惯加代码块。也可能是没给结构化示例,模型自由发挥格式。
还有一种情况,温度不为零,同一提示偶发两种格式。
另外,解析端没做兜底,遇到围栏就整段失败。
上来先把围栏剥掉再解析作为兜底
python -c "import re,json;s=open('resp.txt').read();s=re.sub(r'^```[a-zA-Z]*|```$','',s.strip()).strip();print(json.loads(s))"
提示里给出首尾各一个反例与正例
python call_claude.py --system prompt_strict.txt --temperature 0
解析失败时重试一次并记录样本
grep -c 'Expecting value' parse.log
我习惯把每一步的执行时间和结果记在一边,后面复盘省事。
改完先别撤,确认这几项。连续一百次调用返回内容都能被 json.loads 直接解析,日志里 Expecting value 的次数降到零。
容易忽略的是,把解析兜底和提示约束一起上才稳,只靠提示约束在长尾请求里一定会有漏网,兜底代码比反复改词更值。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
