StructuredPrompt mutates caller-provided structured_output_kwargs

该问题发生在 LangChain 的 StructuredPrompt 构造过程中:当调用者复用同一个 structured_output_kwargs 字典创建多个提示时,第一个提示会把额外参数(如 strict=True )直接写入调用者提供的字典,导致后续提示意外继承未传入的配置。优先排查是否

快速结论:该问题发生在 LangChain 的 StructuredPrompt 构造过程中:当调用者复用同一个 structured_output_kwargs 字典创建多个提示时,第一个提示会把额外参数(如 strict=True)直接写入调用者提供的字典,导致后续提示意外继承未传入的配置。优先排查是否复用了同一个字典,并检查 StructuredPrompt.__init__ 是否原地合并了额外参数。

适用环境:langchain-core;Issue 中确认的环境为 Windows 10、Python 3.14.2、langchain_core 1.5.3、pydantic 2.12.5、pytest 9.0.3。未涉及 CUDA、显卡或操作系统之外的更多环境证据。

最快修复方案:Issue 中已验证的修复方向是:在 StructuredPrompt.__init__ 中先把调用者传入的 structured_output_kwargs 复制一份(例如 structured_output_kwargs = dict(structured_output_kwargs or {})),再合并额外参数,从而不修改原始字典。目前该修复以 PR 形式提出,尚未在 Issue 中确认已合并到正式发布版本。

注意事项:该修复只是浅拷贝字典;如果字典的 value 本身是可变对象,内部嵌套对象仍可能被共享。若你使用的是已发布版本且未包含该修复,可能需要自行打补丁或等待官方合入,不能把“复制字典”当作所有别名问题的通用解。

问题场景

在使用 LangChain 的 StructuredPrompt 时,调用者先通过工厂方法 from_messages_and_schema 创建第一个提示,并传入同一个 structured_output_kwargs 字典;随后再用同一个字典直接构造第二个 StructuredPrompt。第一个提示创建后,原字典被原地写入 strict=True,导致第二个提示继承了这个并非由调用者提供的选项,触发断言失败。

报错原文

StructuredPrompt mutates caller-provided structured_output_kwargs

assert shared_options == {"method": "json_schema"}
assert "strict" not in second.structured_output_kwargs

原因分析

直接原因是 StructuredPrompt.__init__ 在合并额外结构化输出参数时,直接复用了调用者传入的 structured_output_kwargs 字典,并在该字典上进行原地合并。也就是说,代码没有先复制一份字典,就把类似 strict=True 的额外参数写进了调用者拥有的对象。这不是模型推理或环境配置问题,而是对象别名(aliasing)导致的“调用者数据被意外修改”的副作用。

环境排查

celebrityanime
celebrityanime
文章: 18309

发表回复

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