ValueError: If parsing fails`.

当你使用 LangChain 的 create_agent 并传入 原始 JSON Schema 字典 作为 response_format (例如 ToolStrategy(schema_dict) )时,模型返回的非法结构化输出(如类型错误、缺少必填字段)不会被校验,导致重试机制失效。优先排查你

快速结论:当你使用 LangChain 的 create_agent 并传入原始 JSON Schema 字典作为 response_format(例如 ToolStrategy(schema_dict))时,模型返回的非法结构化输出(如类型错误、缺少必填字段)不会被校验,导致重试机制失效。优先排查你是否使用的是 Pydantic 模型而非原始 JSON Schema 字典——Pydantic 模式不存在此问题。

适用环境:Issue 确认的环境为 langchain 1.3.11langchain-core 1.4.8pydantic 2.13.4(干净 venv 下执行 pip install langchain)。问题复现于 master 分支(提交 fca0a977a)。

最快修复方案:暂无确认的一步修复方案。截至 Issue 关闭时,修复未合并到发布版本;讨论中提出的方案(在 _parse_with_schemajson_schema 分支中加入校验)仍处于 PR 提案阶段。

注意事项:Issue 中明确说明校验原始 JSON Schema 需要引入 jsonschema 依赖(该包当前不是 langchain 的依赖,也不存在于 uv.lock 的传递依赖中)。是否添加依赖属于维护者决策,评论区未达成最终结论。

问题场景

用户使用 LangChain 的 create_agent 创建 Agent,并通过 response_format=ToolStrategy(REPORT_JSON_SCHEMA) 直接传入一个 Python 字典形式的原始 JSON Schema。当模型调用结构化输出工具时,返回了不符合 schema 的参数(例如:key_findings 字段应为对象数组,模型却返回字符串 "[]")。用户期望 LangChain 校验失败后触发 handle_errors 重试机制,但实际结果是非法参数被直接作为 structured_response 返回,重试从未发生。

同等的错误参数在 Pydantic schema 模式下会正常抛出异常并触发重试,因此问题特定于原始字典 schema

报错原文

ValueError: If parsing fails

原因分析

根据 Issue 中多位维护者及贡献者的分析,问题定位于 _parse_with_schema() 函数。当 schema_kind == "json_schema"(即传入原始字典)时,该函数直接返回数据而不进行任何校验

这意味着:

  • 非法输出不会经过 parse() 的验证流程,因此不会触发 StructuredOutputValidationError
  • 由于 factory.py 中的错误处理和重试机制依赖 StructuredOutputValidationError 才能启动,所以 ToolStrategy.handle_errors 的重试逻辑永远无法被触发。
  • 相比之下,Pydantic、TypedDict 和 dataclass schema 在解析时已执行校验,因此不存在此问题。

注意:以上分析基于 Issue 中贡献者的代码审查与复现结果,属于确认的根因,而非推测。

环境排查

  • 确认 langchain 版本是否为 1.3.11 或更新(问题在 master 分支仍存在)。
  • 确认 langchain-core 版本是否为 1.4.8 或更新。
  • 确认 pydantic 版本是否为 2.13.4 或相近版本。
  • 检查 jsonschema 是否为已安装依赖(Issue 确认它当前不是 langchain 的依赖,但修复方案可能将其变为可选或必需依赖)。
  • 确认 response_format 传入的是原始字典,而不是 Pydantic 模型类。

解决步骤

  1. 临时规避方案:将原始 JSON Schema 字典转换为 Pydantic 模型,然后使用该模型作为 response_format。这样可立即启用输出校验与重试机制,绕开当前 bug。
  2. 跟踪修复进度:关注 Issue #38719 及其关联 PR。截至 Issue 关闭,修复尚未合并。
  3. 可优先尝试:Issue 评论中提出的最小修复方案是在 _parse_with_schema()json_schema 分支中增加校验,并在校验失败时抛出 ValueError,使错误流入现有 StructuredOutputValidationError 和重试流程。若你愿意使用非官方补丁,可基于此思路自行修改源码,但请注意这不是官方推荐路径。
  4. 依赖注意:若采用“可选 jsonschema 导入”方案,未安装该包时行为不变(直接返回不校验),仅产生一次性警告;若采用“硬依赖”方案,则需要新增 jsonschema 依赖。两种方案均处于讨论阶段,未获维护者最终批准。

验证方法

复现 Issue 提供的测试脚本:

  • 若传原始字典 schema,模型返回 key_findings="[]"(字符串)时,structured_response 会直接输出该非法值,且不会发起第二次调用(重试请求缺失)。
  • 若传等价 Pydantic schema,相同错误参数会触发 handle_errors 重试,第二次调用成功后返回正确的数组类型。

修复生效的验证标准:字典 schema 的非法输出同样会触发重试,并最终返回符合 schema 的结果(如 key_findings=[{"finding": "ok"}])。

参考来源

langchain-ai/langchain #38719

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 18401

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注