这个坑值得记一笔。用 Instructor 1.3 抽发票字段,模型从 gpt-4o-mini 换成 claude-3-5-sonnet 后报 400,提示 response_format 参数不支持,代码里还留着 OpenAI 的 MODE_TOOLS,改成手写字符串也没有效果。

刚开始盯着「自定义 client 包装层把 tools 参数过滤掉了」,折腾了半个多小时,排掉了。

把日志和配置对完,能解释这个现象的基本就这几处。Anthropic 没有 response_format,必须走工具模式;mode 常量用了手写字符串,拼错后回落到默认值;Instructor 版本与 anthropic SDK 版本不匹配。

动手时先打印两个 mode 常量确认取值

python -c "import instructor;print(instructor.Mode.MD_JSON, instructor.Mode.ANTHROPIC_TOOLS)"

随后改用工具模式并指定模型

python extract.py --mode anthropic_tools --model claude-3-5-sonnet-latest

接着抓一次实际请求看有没有带 tools

python dump_request.py --provider anthropic --out req.json

末了跑三条样本的抽取回归

python eval_extract.py --n 3 --expect pass

白天有业务在跑,能验证的部分都压到了晚上做。

怎么算真的好了,看的是同一批现象。抽取结果能被 pydantic 模型接住,校验失败会自动重试一次并成功,日志里不再出现 400。

提醒一点。Instructor 的 mode 是按供应商能力选的,换模型时这一项要一起改,光改 model 名不会自动适配。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189