错误: LLM JSON 模式 `Auto` 在严格响应无法解析时不会回退到 `none`
`Auto` JSON 模式(自定义提供者的默认模式)在文档中描述为"尝试严格的 `json_schema`,在模型无法应对时回退到无约束模式"。今天,回退在以下两种情况下触发: 1. 提供者对严格请求返回 HTTP 400(在 `auto_categorize_openai_generic` 中抛出 Faraday::BadRequestError)或 2. 严格请求解析成功,但 >50% 的结果为空或缺失(在 `auto_categorize_with_auto_mode` 中)。它 **不** 在严格请求返回 HTTP 200 但无法将响应转换为分类的情况下触发。`extract_categorizations_generic`/`parse_json_flexibly` 会引发 `Provider::OpenAI::Error` ("无法从响应中解析 JSON:…" 或 "无法在响应中找到分类"),该异常会直接从 `auto_categorize_with_auto_mode` 中传递,而不经过空比率检测。因此,`Auto` 在失败模式中表现与 `Strict` 完全相同,在兼容性回退有助于大多数情况时。 这种情况在本地推理模型中很常见:模型花费其输出预算来思考,严格 JSON 被截断(`{"categorizations":[{"transaction_id":…`)),HTTP 调用“成功”,解析失败,而整个批次失败,而不是在不使用 `response_format` 的情况下重试。 `Provider::OpenAI::AutoMerchantDetector` 中也存在相同的结构(`auto_detect_merchants_with_auto_mode`)。
内容来源: we-promise/sure